From 6d8b53e3ca21adce1c5ed0aa502729e0ca5e8ac8 Mon Sep 17 00:00:00 2001 From: Antti Palosaari Date: Fri, 8 Mar 2013 16:54:09 -0300 Subject: [PATCH] --- yaml --- r: 366703 b: refs/heads/master c: 3bf5e55299ac5a389a4e6b9991f900579a765172 h: refs/heads/master i: 366701: a6a76849e49e52aedc0f7f99596b1371c130b8a0 366699: 0d238353892ea8c813e829c69dbe8427d4552207 366695: 6f43af316aa18ce84e7f7ada5e676f2732ead0c1 366687: 96dfe1bb65dc1baabcdd6ae04d36bb3077286f90 v: v3 --- [refs] | 2 +- trunk/drivers/media/dvb-frontends/af9033.c | 47 +++++++++++++++++----- 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/[refs] b/[refs] index 4faf0305bd6d..f422b4f480db 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0c13c54d8527df03decf7c522f35886fb721f282 +refs/heads/master: 3bf5e55299ac5a389a4e6b9991f900579a765172 diff --git a/trunk/drivers/media/dvb-frontends/af9033.c b/trunk/drivers/media/dvb-frontends/af9033.c index 2dba516d5680..a777b4b944eb 100644 --- a/trunk/drivers/media/dvb-frontends/af9033.c +++ b/trunk/drivers/media/dvb-frontends/af9033.c @@ -156,6 +156,37 @@ static int af9033_rd_reg_mask(struct af9033_state *state, u32 reg, u8 *val, return 0; } +/* write reg val table using reg addr auto increment */ +static int af9033_wr_reg_val_tab(struct af9033_state *state, + const struct reg_val *tab, int tab_len) +{ + int ret, i, j; + u8 buf[tab_len]; + + dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); + + for (i = 0, j = 0; i < tab_len; i++) { + buf[j] = tab[i].val; + + if (i == tab_len - 1 || tab[i].reg != tab[i + 1].reg - 1) { + ret = af9033_wr_regs(state, tab[i].reg - j, buf, j + 1); + if (ret < 0) + goto err; + + j = 0; + } else { + j++; + } + } + + return 0; + +err: + dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); + + return ret; +} + static u32 af9033_div(struct af9033_state *state, u32 a, u32 b, u32 x) { u32 r = 0, c = 0, i; @@ -306,11 +337,9 @@ static int af9033_init(struct dvb_frontend *fe) break; } - for (i = 0; i < len; i++) { - ret = af9033_wr_reg(state, init[i].reg, init[i].val); - if (ret < 0) - goto err; - } + ret = af9033_wr_reg_val_tab(state, init, len); + if (ret < 0) + goto err; /* load tuner specific settings */ dev_dbg(&state->i2c->dev, "%s: load tuner specific settings\n", @@ -371,11 +400,9 @@ static int af9033_init(struct dvb_frontend *fe) goto err; } - for (i = 0; i < len; i++) { - ret = af9033_wr_reg(state, init[i].reg, init[i].val); - if (ret < 0) - goto err; - } + ret = af9033_wr_reg_val_tab(state, init, len); + if (ret < 0) + goto err; if (state->cfg.ts_mode == AF9033_TS_MODE_SERIAL) { ret = af9033_wr_reg_mask(state, 0x00d91c, 0x01, 0x01);