diff options
Diffstat (limited to 'drivers/media/dvb-frontends/af9033.c')
| -rw-r--r-- | drivers/media/dvb-frontends/af9033.c | 757 |
1 files changed, 425 insertions, 332 deletions
diff --git a/drivers/media/dvb-frontends/af9033.c b/drivers/media/dvb-frontends/af9033.c index 5c90ea683a7e..63a89c1c59ff 100644 --- a/drivers/media/dvb-frontends/af9033.c +++ b/drivers/media/dvb-frontends/af9033.c | |||
| @@ -24,29 +24,35 @@ | |||
| 24 | /* Max transfer size done by I2C transfer functions */ | 24 | /* Max transfer size done by I2C transfer functions */ |
| 25 | #define MAX_XFER_SIZE 64 | 25 | #define MAX_XFER_SIZE 64 |
| 26 | 26 | ||
| 27 | struct af9033_state { | 27 | struct af9033_dev { |
| 28 | struct i2c_adapter *i2c; | 28 | struct i2c_client *client; |
| 29 | struct dvb_frontend fe; | 29 | struct dvb_frontend fe; |
| 30 | struct af9033_config cfg; | 30 | struct af9033_config cfg; |
| 31 | bool is_af9035; | ||
| 32 | bool is_it9135; | ||
| 31 | 33 | ||
| 32 | u32 bandwidth_hz; | 34 | u32 bandwidth_hz; |
| 33 | bool ts_mode_parallel; | 35 | bool ts_mode_parallel; |
| 34 | bool ts_mode_serial; | 36 | bool ts_mode_serial; |
| 35 | 37 | ||
| 36 | u32 ber; | 38 | fe_status_t fe_status; |
| 37 | u32 ucb; | 39 | u64 post_bit_error_prev; /* for old read_ber we return (curr - prev) */ |
| 38 | unsigned long last_stat_check; | 40 | u64 post_bit_error; |
| 41 | u64 post_bit_count; | ||
| 42 | u64 error_block_count; | ||
| 43 | u64 total_block_count; | ||
| 44 | struct delayed_work stat_work; | ||
| 39 | }; | 45 | }; |
| 40 | 46 | ||
| 41 | /* write multiple registers */ | 47 | /* write multiple registers */ |
| 42 | static int af9033_wr_regs(struct af9033_state *state, u32 reg, const u8 *val, | 48 | static int af9033_wr_regs(struct af9033_dev *dev, u32 reg, const u8 *val, |
| 43 | int len) | 49 | int len) |
| 44 | { | 50 | { |
| 45 | int ret; | 51 | int ret; |
| 46 | u8 buf[MAX_XFER_SIZE]; | 52 | u8 buf[MAX_XFER_SIZE]; |
| 47 | struct i2c_msg msg[1] = { | 53 | struct i2c_msg msg[1] = { |
| 48 | { | 54 | { |
| 49 | .addr = state->cfg.i2c_addr, | 55 | .addr = dev->client->addr, |
| 50 | .flags = 0, | 56 | .flags = 0, |
| 51 | .len = 3 + len, | 57 | .len = 3 + len, |
| 52 | .buf = buf, | 58 | .buf = buf, |
| @@ -54,9 +60,9 @@ static int af9033_wr_regs(struct af9033_state *state, u32 reg, const u8 *val, | |||
| 54 | }; | 60 | }; |
| 55 | 61 | ||
| 56 | if (3 + len > sizeof(buf)) { | 62 | if (3 + len > sizeof(buf)) { |
| 57 | dev_warn(&state->i2c->dev, | 63 | dev_warn(&dev->client->dev, |
| 58 | "%s: i2c wr reg=%04x: len=%d is too big!\n", | 64 | "i2c wr reg=%04x: len=%d is too big!\n", |
| 59 | KBUILD_MODNAME, reg, len); | 65 | reg, len); |
| 60 | return -EINVAL; | 66 | return -EINVAL; |
| 61 | } | 67 | } |
| 62 | 68 | ||
| @@ -65,12 +71,12 @@ static int af9033_wr_regs(struct af9033_state *state, u32 reg, const u8 *val, | |||
| 65 | buf[2] = (reg >> 0) & 0xff; | 71 | buf[2] = (reg >> 0) & 0xff; |
| 66 | memcpy(&buf[3], val, len); | 72 | memcpy(&buf[3], val, len); |
| 67 | 73 | ||
| 68 | ret = i2c_transfer(state->i2c, msg, 1); | 74 | ret = i2c_transfer(dev->client->adapter, msg, 1); |
| 69 | if (ret == 1) { | 75 | if (ret == 1) { |
| 70 | ret = 0; | 76 | ret = 0; |
| 71 | } else { | 77 | } else { |
| 72 | dev_warn(&state->i2c->dev, "%s: i2c wr failed=%d reg=%06x " \ | 78 | dev_warn(&dev->client->dev, "i2c wr failed=%d reg=%06x len=%d\n", |
| 73 | "len=%d\n", KBUILD_MODNAME, ret, reg, len); | 79 | ret, reg, len); |
| 74 | ret = -EREMOTEIO; | 80 | ret = -EREMOTEIO; |
| 75 | } | 81 | } |
| 76 | 82 | ||
| @@ -78,31 +84,31 @@ static int af9033_wr_regs(struct af9033_state *state, u32 reg, const u8 *val, | |||
| 78 | } | 84 | } |
| 79 | 85 | ||
| 80 | /* read multiple registers */ | 86 | /* read multiple registers */ |
| 81 | static int af9033_rd_regs(struct af9033_state *state, u32 reg, u8 *val, int len) | 87 | static int af9033_rd_regs(struct af9033_dev *dev, u32 reg, u8 *val, int len) |
| 82 | { | 88 | { |
| 83 | int ret; | 89 | int ret; |
| 84 | u8 buf[3] = { (reg >> 16) & 0xff, (reg >> 8) & 0xff, | 90 | u8 buf[3] = { (reg >> 16) & 0xff, (reg >> 8) & 0xff, |
| 85 | (reg >> 0) & 0xff }; | 91 | (reg >> 0) & 0xff }; |
| 86 | struct i2c_msg msg[2] = { | 92 | struct i2c_msg msg[2] = { |
| 87 | { | 93 | { |
| 88 | .addr = state->cfg.i2c_addr, | 94 | .addr = dev->client->addr, |
| 89 | .flags = 0, | 95 | .flags = 0, |
| 90 | .len = sizeof(buf), | 96 | .len = sizeof(buf), |
| 91 | .buf = buf | 97 | .buf = buf |
| 92 | }, { | 98 | }, { |
| 93 | .addr = state->cfg.i2c_addr, | 99 | .addr = dev->client->addr, |
| 94 | .flags = I2C_M_RD, | 100 | .flags = I2C_M_RD, |
| 95 | .len = len, | 101 | .len = len, |
| 96 | .buf = val | 102 | .buf = val |
| 97 | } | 103 | } |
| 98 | }; | 104 | }; |
| 99 | 105 | ||
| 100 | ret = i2c_transfer(state->i2c, msg, 2); | 106 | ret = i2c_transfer(dev->client->adapter, msg, 2); |
| 101 | if (ret == 2) { | 107 | if (ret == 2) { |
| 102 | ret = 0; | 108 | ret = 0; |
| 103 | } else { | 109 | } else { |
| 104 | dev_warn(&state->i2c->dev, "%s: i2c rd failed=%d reg=%06x " \ | 110 | dev_warn(&dev->client->dev, "i2c rd failed=%d reg=%06x len=%d\n", |
| 105 | "len=%d\n", KBUILD_MODNAME, ret, reg, len); | 111 | ret, reg, len); |
| 106 | ret = -EREMOTEIO; | 112 | ret = -EREMOTEIO; |
| 107 | } | 113 | } |
| 108 | 114 | ||
| @@ -111,19 +117,19 @@ static int af9033_rd_regs(struct af9033_state *state, u32 reg, u8 *val, int len) | |||
| 111 | 117 | ||
| 112 | 118 | ||
| 113 | /* write single register */ | 119 | /* write single register */ |
| 114 | static int af9033_wr_reg(struct af9033_state *state, u32 reg, u8 val) | 120 | static int af9033_wr_reg(struct af9033_dev *dev, u32 reg, u8 val) |
| 115 | { | 121 | { |
| 116 | return af9033_wr_regs(state, reg, &val, 1); | 122 | return af9033_wr_regs(dev, reg, &val, 1); |
| 117 | } | 123 | } |
| 118 | 124 | ||
| 119 | /* read single register */ | 125 | /* read single register */ |
| 120 | static int af9033_rd_reg(struct af9033_state *state, u32 reg, u8 *val) | 126 | static int af9033_rd_reg(struct af9033_dev *dev, u32 reg, u8 *val) |
| 121 | { | 127 | { |
| 122 | return af9033_rd_regs(state, reg, val, 1); | 128 | return af9033_rd_regs(dev, reg, val, 1); |
| 123 | } | 129 | } |
| 124 | 130 | ||
| 125 | /* write single register with mask */ | 131 | /* write single register with mask */ |
| 126 | static int af9033_wr_reg_mask(struct af9033_state *state, u32 reg, u8 val, | 132 | static int af9033_wr_reg_mask(struct af9033_dev *dev, u32 reg, u8 val, |
| 127 | u8 mask) | 133 | u8 mask) |
| 128 | { | 134 | { |
| 129 | int ret; | 135 | int ret; |
| @@ -131,7 +137,7 @@ static int af9033_wr_reg_mask(struct af9033_state *state, u32 reg, u8 val, | |||
| 131 | 137 | ||
| 132 | /* no need for read if whole reg is written */ | 138 | /* no need for read if whole reg is written */ |
| 133 | if (mask != 0xff) { | 139 | if (mask != 0xff) { |
| 134 | ret = af9033_rd_regs(state, reg, &tmp, 1); | 140 | ret = af9033_rd_regs(dev, reg, &tmp, 1); |
| 135 | if (ret) | 141 | if (ret) |
| 136 | return ret; | 142 | return ret; |
| 137 | 143 | ||
| @@ -140,17 +146,17 @@ static int af9033_wr_reg_mask(struct af9033_state *state, u32 reg, u8 val, | |||
| 140 | val |= tmp; | 146 | val |= tmp; |
| 141 | } | 147 | } |
| 142 | 148 | ||
| 143 | return af9033_wr_regs(state, reg, &val, 1); | 149 | return af9033_wr_regs(dev, reg, &val, 1); |
| 144 | } | 150 | } |
| 145 | 151 | ||
| 146 | /* read single register with mask */ | 152 | /* read single register with mask */ |
| 147 | static int af9033_rd_reg_mask(struct af9033_state *state, u32 reg, u8 *val, | 153 | static int af9033_rd_reg_mask(struct af9033_dev *dev, u32 reg, u8 *val, |
| 148 | u8 mask) | 154 | u8 mask) |
| 149 | { | 155 | { |
| 150 | int ret, i; | 156 | int ret, i; |
| 151 | u8 tmp; | 157 | u8 tmp; |
| 152 | 158 | ||
| 153 | ret = af9033_rd_regs(state, reg, &tmp, 1); | 159 | ret = af9033_rd_regs(dev, reg, &tmp, 1); |
| 154 | if (ret) | 160 | if (ret) |
| 155 | return ret; | 161 | return ret; |
| 156 | 162 | ||
| @@ -167,18 +173,17 @@ static int af9033_rd_reg_mask(struct af9033_state *state, u32 reg, u8 *val, | |||
| 167 | } | 173 | } |
| 168 | 174 | ||
| 169 | /* write reg val table using reg addr auto increment */ | 175 | /* write reg val table using reg addr auto increment */ |
| 170 | static int af9033_wr_reg_val_tab(struct af9033_state *state, | 176 | static int af9033_wr_reg_val_tab(struct af9033_dev *dev, |
| 171 | const struct reg_val *tab, int tab_len) | 177 | const struct reg_val *tab, int tab_len) |
| 172 | { | 178 | { |
| 173 | #define MAX_TAB_LEN 212 | 179 | #define MAX_TAB_LEN 212 |
| 174 | int ret, i, j; | 180 | int ret, i, j; |
| 175 | u8 buf[1 + MAX_TAB_LEN]; | 181 | u8 buf[1 + MAX_TAB_LEN]; |
| 176 | 182 | ||
| 177 | dev_dbg(&state->i2c->dev, "%s: tab_len=%d\n", __func__, tab_len); | 183 | dev_dbg(&dev->client->dev, "tab_len=%d\n", tab_len); |
| 178 | 184 | ||
| 179 | if (tab_len > sizeof(buf)) { | 185 | if (tab_len > sizeof(buf)) { |
| 180 | dev_warn(&state->i2c->dev, "%s: tab len %d is too big\n", | 186 | dev_warn(&dev->client->dev, "tab len %d is too big\n", tab_len); |
| 181 | KBUILD_MODNAME, tab_len); | ||
| 182 | return -EINVAL; | 187 | return -EINVAL; |
| 183 | } | 188 | } |
| 184 | 189 | ||
| @@ -186,7 +191,7 @@ static int af9033_wr_reg_val_tab(struct af9033_state *state, | |||
| 186 | buf[j] = tab[i].val; | 191 | buf[j] = tab[i].val; |
| 187 | 192 | ||
| 188 | if (i == tab_len - 1 || tab[i].reg != tab[i + 1].reg - 1) { | 193 | if (i == tab_len - 1 || tab[i].reg != tab[i + 1].reg - 1) { |
| 189 | ret = af9033_wr_regs(state, tab[i].reg - j, buf, j + 1); | 194 | ret = af9033_wr_regs(dev, tab[i].reg - j, buf, j + 1); |
| 190 | if (ret < 0) | 195 | if (ret < 0) |
| 191 | goto err; | 196 | goto err; |
| 192 | 197 | ||
| @@ -199,16 +204,16 @@ static int af9033_wr_reg_val_tab(struct af9033_state *state, | |||
| 199 | return 0; | 204 | return 0; |
| 200 | 205 | ||
| 201 | err: | 206 | err: |
| 202 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 207 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 203 | 208 | ||
| 204 | return ret; | 209 | return ret; |
| 205 | } | 210 | } |
| 206 | 211 | ||
| 207 | static u32 af9033_div(struct af9033_state *state, u32 a, u32 b, u32 x) | 212 | static u32 af9033_div(struct af9033_dev *dev, u32 a, u32 b, u32 x) |
| 208 | { | 213 | { |
| 209 | u32 r = 0, c = 0, i; | 214 | u32 r = 0, c = 0, i; |
| 210 | 215 | ||
| 211 | dev_dbg(&state->i2c->dev, "%s: a=%d b=%d x=%d\n", __func__, a, b, x); | 216 | dev_dbg(&dev->client->dev, "a=%d b=%d x=%d\n", a, b, x); |
| 212 | 217 | ||
| 213 | if (a > b) { | 218 | if (a > b) { |
| 214 | c = a / b; | 219 | c = a / b; |
| @@ -225,22 +230,15 @@ static u32 af9033_div(struct af9033_state *state, u32 a, u32 b, u32 x) | |||
| 225 | } | 230 | } |
| 226 | r = (c << (u32)x) + r; | 231 | r = (c << (u32)x) + r; |
| 227 | 232 | ||
| 228 | dev_dbg(&state->i2c->dev, "%s: a=%d b=%d x=%d r=%d r=%x\n", | 233 | dev_dbg(&dev->client->dev, "a=%d b=%d x=%d r=%d r=%x\n", a, b, x, r, r); |
| 229 | __func__, a, b, x, r, r); | ||
| 230 | 234 | ||
| 231 | return r; | 235 | return r; |
| 232 | } | 236 | } |
| 233 | 237 | ||
| 234 | static void af9033_release(struct dvb_frontend *fe) | ||
| 235 | { | ||
| 236 | struct af9033_state *state = fe->demodulator_priv; | ||
| 237 | |||
| 238 | kfree(state); | ||
| 239 | } | ||
| 240 | |||
| 241 | static int af9033_init(struct dvb_frontend *fe) | 238 | static int af9033_init(struct dvb_frontend *fe) |
| 242 | { | 239 | { |
| 243 | struct af9033_state *state = fe->demodulator_priv; | 240 | struct af9033_dev *dev = fe->demodulator_priv; |
| 241 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | ||
| 244 | int ret, i, len; | 242 | int ret, i, len; |
| 245 | const struct reg_val *init; | 243 | const struct reg_val *init; |
| 246 | u8 buf[4]; | 244 | u8 buf[4]; |
| @@ -248,7 +246,7 @@ static int af9033_init(struct dvb_frontend *fe) | |||
| 248 | struct reg_val_mask tab[] = { | 246 | struct reg_val_mask tab[] = { |
| 249 | { 0x80fb24, 0x00, 0x08 }, | 247 | { 0x80fb24, 0x00, 0x08 }, |
| 250 | { 0x80004c, 0x00, 0xff }, | 248 | { 0x80004c, 0x00, 0xff }, |
| 251 | { 0x00f641, state->cfg.tuner, 0xff }, | 249 | { 0x00f641, dev->cfg.tuner, 0xff }, |
| 252 | { 0x80f5ca, 0x01, 0x01 }, | 250 | { 0x80f5ca, 0x01, 0x01 }, |
| 253 | { 0x80f715, 0x01, 0x01 }, | 251 | { 0x80f715, 0x01, 0x01 }, |
| 254 | { 0x00f41f, 0x04, 0x04 }, | 252 | { 0x00f41f, 0x04, 0x04 }, |
| @@ -267,88 +265,82 @@ static int af9033_init(struct dvb_frontend *fe) | |||
| 267 | { 0x00d830, 0x01, 0xff }, | 265 | { 0x00d830, 0x01, 0xff }, |
| 268 | { 0x00d831, 0x00, 0xff }, | 266 | { 0x00d831, 0x00, 0xff }, |
| 269 | { 0x00d832, 0x00, 0xff }, | 267 | { 0x00d832, 0x00, 0xff }, |
| 270 | { 0x80f985, state->ts_mode_serial, 0x01 }, | 268 | { 0x80f985, dev->ts_mode_serial, 0x01 }, |
| 271 | { 0x80f986, state->ts_mode_parallel, 0x01 }, | 269 | { 0x80f986, dev->ts_mode_parallel, 0x01 }, |
| 272 | { 0x00d827, 0x00, 0xff }, | 270 | { 0x00d827, 0x00, 0xff }, |
| 273 | { 0x00d829, 0x00, 0xff }, | 271 | { 0x00d829, 0x00, 0xff }, |
| 274 | { 0x800045, state->cfg.adc_multiplier, 0xff }, | 272 | { 0x800045, dev->cfg.adc_multiplier, 0xff }, |
| 275 | }; | 273 | }; |
| 276 | 274 | ||
| 277 | /* program clock control */ | 275 | /* program clock control */ |
| 278 | clock_cw = af9033_div(state, state->cfg.clock, 1000000ul, 19ul); | 276 | clock_cw = af9033_div(dev, dev->cfg.clock, 1000000ul, 19ul); |
| 279 | buf[0] = (clock_cw >> 0) & 0xff; | 277 | buf[0] = (clock_cw >> 0) & 0xff; |
| 280 | buf[1] = (clock_cw >> 8) & 0xff; | 278 | buf[1] = (clock_cw >> 8) & 0xff; |
| 281 | buf[2] = (clock_cw >> 16) & 0xff; | 279 | buf[2] = (clock_cw >> 16) & 0xff; |
| 282 | buf[3] = (clock_cw >> 24) & 0xff; | 280 | buf[3] = (clock_cw >> 24) & 0xff; |
| 283 | 281 | ||
| 284 | dev_dbg(&state->i2c->dev, "%s: clock=%d clock_cw=%08x\n", | 282 | dev_dbg(&dev->client->dev, "clock=%d clock_cw=%08x\n", |
| 285 | __func__, state->cfg.clock, clock_cw); | 283 | dev->cfg.clock, clock_cw); |
| 286 | 284 | ||
| 287 | ret = af9033_wr_regs(state, 0x800025, buf, 4); | 285 | ret = af9033_wr_regs(dev, 0x800025, buf, 4); |
| 288 | if (ret < 0) | 286 | if (ret < 0) |
| 289 | goto err; | 287 | goto err; |
| 290 | 288 | ||
| 291 | /* program ADC control */ | 289 | /* program ADC control */ |
| 292 | for (i = 0; i < ARRAY_SIZE(clock_adc_lut); i++) { | 290 | for (i = 0; i < ARRAY_SIZE(clock_adc_lut); i++) { |
| 293 | if (clock_adc_lut[i].clock == state->cfg.clock) | 291 | if (clock_adc_lut[i].clock == dev->cfg.clock) |
| 294 | break; | 292 | break; |
| 295 | } | 293 | } |
| 296 | 294 | ||
| 297 | adc_cw = af9033_div(state, clock_adc_lut[i].adc, 1000000ul, 19ul); | 295 | adc_cw = af9033_div(dev, clock_adc_lut[i].adc, 1000000ul, 19ul); |
| 298 | buf[0] = (adc_cw >> 0) & 0xff; | 296 | buf[0] = (adc_cw >> 0) & 0xff; |
| 299 | buf[1] = (adc_cw >> 8) & 0xff; | 297 | buf[1] = (adc_cw >> 8) & 0xff; |
| 300 | buf[2] = (adc_cw >> 16) & 0xff; | 298 | buf[2] = (adc_cw >> 16) & 0xff; |
| 301 | 299 | ||
| 302 | dev_dbg(&state->i2c->dev, "%s: adc=%d adc_cw=%06x\n", | 300 | dev_dbg(&dev->client->dev, "adc=%d adc_cw=%06x\n", |
| 303 | __func__, clock_adc_lut[i].adc, adc_cw); | 301 | clock_adc_lut[i].adc, adc_cw); |
| 304 | 302 | ||
| 305 | ret = af9033_wr_regs(state, 0x80f1cd, buf, 3); | 303 | ret = af9033_wr_regs(dev, 0x80f1cd, buf, 3); |
| 306 | if (ret < 0) | 304 | if (ret < 0) |
| 307 | goto err; | 305 | goto err; |
| 308 | 306 | ||
| 309 | /* program register table */ | 307 | /* program register table */ |
| 310 | for (i = 0; i < ARRAY_SIZE(tab); i++) { | 308 | for (i = 0; i < ARRAY_SIZE(tab); i++) { |
| 311 | ret = af9033_wr_reg_mask(state, tab[i].reg, tab[i].val, | 309 | ret = af9033_wr_reg_mask(dev, tab[i].reg, tab[i].val, |
| 312 | tab[i].mask); | 310 | tab[i].mask); |
| 313 | if (ret < 0) | 311 | if (ret < 0) |
| 314 | goto err; | 312 | goto err; |
| 315 | } | 313 | } |
| 316 | 314 | ||
| 317 | /* feed clock to RF tuner */ | 315 | /* clock output */ |
| 318 | switch (state->cfg.tuner) { | 316 | if (dev->cfg.dyn0_clk) { |
| 319 | case AF9033_TUNER_IT9135_38: | 317 | ret = af9033_wr_reg(dev, 0x80fba8, 0x00); |
| 320 | case AF9033_TUNER_IT9135_51: | ||
| 321 | case AF9033_TUNER_IT9135_52: | ||
| 322 | case AF9033_TUNER_IT9135_60: | ||
| 323 | case AF9033_TUNER_IT9135_61: | ||
| 324 | case AF9033_TUNER_IT9135_62: | ||
| 325 | ret = af9033_wr_reg(state, 0x80fba8, 0x00); | ||
| 326 | if (ret < 0) | 318 | if (ret < 0) |
| 327 | goto err; | 319 | goto err; |
| 328 | } | 320 | } |
| 329 | 321 | ||
| 330 | /* settings for TS interface */ | 322 | /* settings for TS interface */ |
| 331 | if (state->cfg.ts_mode == AF9033_TS_MODE_USB) { | 323 | if (dev->cfg.ts_mode == AF9033_TS_MODE_USB) { |
| 332 | ret = af9033_wr_reg_mask(state, 0x80f9a5, 0x00, 0x01); | 324 | ret = af9033_wr_reg_mask(dev, 0x80f9a5, 0x00, 0x01); |
| 333 | if (ret < 0) | 325 | if (ret < 0) |
| 334 | goto err; | 326 | goto err; |
| 335 | 327 | ||
| 336 | ret = af9033_wr_reg_mask(state, 0x80f9b5, 0x01, 0x01); | 328 | ret = af9033_wr_reg_mask(dev, 0x80f9b5, 0x01, 0x01); |
| 337 | if (ret < 0) | 329 | if (ret < 0) |
| 338 | goto err; | 330 | goto err; |
| 339 | } else { | 331 | } else { |
| 340 | ret = af9033_wr_reg_mask(state, 0x80f990, 0x00, 0x01); | 332 | ret = af9033_wr_reg_mask(dev, 0x80f990, 0x00, 0x01); |
| 341 | if (ret < 0) | 333 | if (ret < 0) |
| 342 | goto err; | 334 | goto err; |
| 343 | 335 | ||
| 344 | ret = af9033_wr_reg_mask(state, 0x80f9b5, 0x00, 0x01); | 336 | ret = af9033_wr_reg_mask(dev, 0x80f9b5, 0x00, 0x01); |
| 345 | if (ret < 0) | 337 | if (ret < 0) |
| 346 | goto err; | 338 | goto err; |
| 347 | } | 339 | } |
| 348 | 340 | ||
| 349 | /* load OFSM settings */ | 341 | /* load OFSM settings */ |
| 350 | dev_dbg(&state->i2c->dev, "%s: load ofsm settings\n", __func__); | 342 | dev_dbg(&dev->client->dev, "load ofsm settings\n"); |
| 351 | switch (state->cfg.tuner) { | 343 | switch (dev->cfg.tuner) { |
| 352 | case AF9033_TUNER_IT9135_38: | 344 | case AF9033_TUNER_IT9135_38: |
| 353 | case AF9033_TUNER_IT9135_51: | 345 | case AF9033_TUNER_IT9135_51: |
| 354 | case AF9033_TUNER_IT9135_52: | 346 | case AF9033_TUNER_IT9135_52: |
| @@ -367,14 +359,13 @@ static int af9033_init(struct dvb_frontend *fe) | |||
| 367 | break; | 359 | break; |
| 368 | } | 360 | } |
| 369 | 361 | ||
| 370 | ret = af9033_wr_reg_val_tab(state, init, len); | 362 | ret = af9033_wr_reg_val_tab(dev, init, len); |
| 371 | if (ret < 0) | 363 | if (ret < 0) |
| 372 | goto err; | 364 | goto err; |
| 373 | 365 | ||
| 374 | /* load tuner specific settings */ | 366 | /* load tuner specific settings */ |
| 375 | dev_dbg(&state->i2c->dev, "%s: load tuner specific settings\n", | 367 | dev_dbg(&dev->client->dev, "load tuner specific settings\n"); |
| 376 | __func__); | 368 | switch (dev->cfg.tuner) { |
| 377 | switch (state->cfg.tuner) { | ||
| 378 | case AF9033_TUNER_TUA9001: | 369 | case AF9033_TUNER_TUA9001: |
| 379 | len = ARRAY_SIZE(tuner_init_tua9001); | 370 | len = ARRAY_SIZE(tuner_init_tua9001); |
| 380 | init = tuner_init_tua9001; | 371 | init = tuner_init_tua9001; |
| @@ -424,90 +415,108 @@ static int af9033_init(struct dvb_frontend *fe) | |||
| 424 | init = tuner_init_it9135_62; | 415 | init = tuner_init_it9135_62; |
| 425 | break; | 416 | break; |
| 426 | default: | 417 | default: |
| 427 | dev_dbg(&state->i2c->dev, "%s: unsupported tuner ID=%d\n", | 418 | dev_dbg(&dev->client->dev, "unsupported tuner ID=%d\n", |
| 428 | __func__, state->cfg.tuner); | 419 | dev->cfg.tuner); |
| 429 | ret = -ENODEV; | 420 | ret = -ENODEV; |
| 430 | goto err; | 421 | goto err; |
| 431 | } | 422 | } |
| 432 | 423 | ||
| 433 | ret = af9033_wr_reg_val_tab(state, init, len); | 424 | ret = af9033_wr_reg_val_tab(dev, init, len); |
| 434 | if (ret < 0) | 425 | if (ret < 0) |
| 435 | goto err; | 426 | goto err; |
| 436 | 427 | ||
| 437 | if (state->cfg.ts_mode == AF9033_TS_MODE_SERIAL) { | 428 | if (dev->cfg.ts_mode == AF9033_TS_MODE_SERIAL) { |
| 438 | ret = af9033_wr_reg_mask(state, 0x00d91c, 0x01, 0x01); | 429 | ret = af9033_wr_reg_mask(dev, 0x00d91c, 0x01, 0x01); |
| 439 | if (ret < 0) | 430 | if (ret < 0) |
| 440 | goto err; | 431 | goto err; |
| 441 | 432 | ||
| 442 | ret = af9033_wr_reg_mask(state, 0x00d917, 0x00, 0x01); | 433 | ret = af9033_wr_reg_mask(dev, 0x00d917, 0x00, 0x01); |
| 443 | if (ret < 0) | 434 | if (ret < 0) |
| 444 | goto err; | 435 | goto err; |
| 445 | 436 | ||
| 446 | ret = af9033_wr_reg_mask(state, 0x00d916, 0x00, 0x01); | 437 | ret = af9033_wr_reg_mask(dev, 0x00d916, 0x00, 0x01); |
| 447 | if (ret < 0) | 438 | if (ret < 0) |
| 448 | goto err; | 439 | goto err; |
| 449 | } | 440 | } |
| 450 | 441 | ||
| 451 | switch (state->cfg.tuner) { | 442 | switch (dev->cfg.tuner) { |
| 452 | case AF9033_TUNER_IT9135_60: | 443 | case AF9033_TUNER_IT9135_60: |
| 453 | case AF9033_TUNER_IT9135_61: | 444 | case AF9033_TUNER_IT9135_61: |
| 454 | case AF9033_TUNER_IT9135_62: | 445 | case AF9033_TUNER_IT9135_62: |
| 455 | ret = af9033_wr_reg(state, 0x800000, 0x01); | 446 | ret = af9033_wr_reg(dev, 0x800000, 0x01); |
| 456 | if (ret < 0) | 447 | if (ret < 0) |
| 457 | goto err; | 448 | goto err; |
| 458 | } | 449 | } |
| 459 | 450 | ||
| 460 | state->bandwidth_hz = 0; /* force to program all parameters */ | 451 | dev->bandwidth_hz = 0; /* force to program all parameters */ |
| 452 | /* init stats here in order signal app which stats are supported */ | ||
| 453 | c->strength.len = 1; | ||
| 454 | c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
| 455 | c->cnr.len = 1; | ||
| 456 | c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
| 457 | c->block_count.len = 1; | ||
| 458 | c->block_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
| 459 | c->block_error.len = 1; | ||
| 460 | c->block_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
| 461 | c->post_bit_count.len = 1; | ||
| 462 | c->post_bit_count.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
| 463 | c->post_bit_error.len = 1; | ||
| 464 | c->post_bit_error.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
| 465 | /* start statistics polling */ | ||
| 466 | schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000)); | ||
| 461 | 467 | ||
| 462 | return 0; | 468 | return 0; |
| 463 | 469 | ||
| 464 | err: | 470 | err: |
| 465 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 471 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 466 | 472 | ||
| 467 | return ret; | 473 | return ret; |
| 468 | } | 474 | } |
| 469 | 475 | ||
| 470 | static int af9033_sleep(struct dvb_frontend *fe) | 476 | static int af9033_sleep(struct dvb_frontend *fe) |
| 471 | { | 477 | { |
| 472 | struct af9033_state *state = fe->demodulator_priv; | 478 | struct af9033_dev *dev = fe->demodulator_priv; |
| 473 | int ret, i; | 479 | int ret, i; |
| 474 | u8 tmp; | 480 | u8 tmp; |
| 475 | 481 | ||
| 476 | ret = af9033_wr_reg(state, 0x80004c, 1); | 482 | /* stop statistics polling */ |
| 483 | cancel_delayed_work_sync(&dev->stat_work); | ||
| 484 | |||
| 485 | ret = af9033_wr_reg(dev, 0x80004c, 1); | ||
| 477 | if (ret < 0) | 486 | if (ret < 0) |
| 478 | goto err; | 487 | goto err; |
| 479 | 488 | ||
| 480 | ret = af9033_wr_reg(state, 0x800000, 0); | 489 | ret = af9033_wr_reg(dev, 0x800000, 0); |
| 481 | if (ret < 0) | 490 | if (ret < 0) |
| 482 | goto err; | 491 | goto err; |
| 483 | 492 | ||
| 484 | for (i = 100, tmp = 1; i && tmp; i--) { | 493 | for (i = 100, tmp = 1; i && tmp; i--) { |
| 485 | ret = af9033_rd_reg(state, 0x80004c, &tmp); | 494 | ret = af9033_rd_reg(dev, 0x80004c, &tmp); |
| 486 | if (ret < 0) | 495 | if (ret < 0) |
| 487 | goto err; | 496 | goto err; |
| 488 | 497 | ||
| 489 | usleep_range(200, 10000); | 498 | usleep_range(200, 10000); |
| 490 | } | 499 | } |
| 491 | 500 | ||
| 492 | dev_dbg(&state->i2c->dev, "%s: loop=%d\n", __func__, i); | 501 | dev_dbg(&dev->client->dev, "loop=%d\n", i); |
| 493 | 502 | ||
| 494 | if (i == 0) { | 503 | if (i == 0) { |
| 495 | ret = -ETIMEDOUT; | 504 | ret = -ETIMEDOUT; |
| 496 | goto err; | 505 | goto err; |
| 497 | } | 506 | } |
| 498 | 507 | ||
| 499 | ret = af9033_wr_reg_mask(state, 0x80fb24, 0x08, 0x08); | 508 | ret = af9033_wr_reg_mask(dev, 0x80fb24, 0x08, 0x08); |
| 500 | if (ret < 0) | 509 | if (ret < 0) |
| 501 | goto err; | 510 | goto err; |
| 502 | 511 | ||
| 503 | /* prevent current leak (?) */ | 512 | /* prevent current leak (?) */ |
| 504 | if (state->cfg.ts_mode == AF9033_TS_MODE_SERIAL) { | 513 | if (dev->cfg.ts_mode == AF9033_TS_MODE_SERIAL) { |
| 505 | /* enable parallel TS */ | 514 | /* enable parallel TS */ |
| 506 | ret = af9033_wr_reg_mask(state, 0x00d917, 0x00, 0x01); | 515 | ret = af9033_wr_reg_mask(dev, 0x00d917, 0x00, 0x01); |
| 507 | if (ret < 0) | 516 | if (ret < 0) |
| 508 | goto err; | 517 | goto err; |
| 509 | 518 | ||
| 510 | ret = af9033_wr_reg_mask(state, 0x00d916, 0x01, 0x01); | 519 | ret = af9033_wr_reg_mask(dev, 0x00d916, 0x01, 0x01); |
| 511 | if (ret < 0) | 520 | if (ret < 0) |
| 512 | goto err; | 521 | goto err; |
| 513 | } | 522 | } |
| @@ -515,7 +524,7 @@ static int af9033_sleep(struct dvb_frontend *fe) | |||
| 515 | return 0; | 524 | return 0; |
| 516 | 525 | ||
| 517 | err: | 526 | err: |
| 518 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 527 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 519 | 528 | ||
| 520 | return ret; | 529 | return ret; |
| 521 | } | 530 | } |
| @@ -533,14 +542,14 @@ static int af9033_get_tune_settings(struct dvb_frontend *fe, | |||
| 533 | 542 | ||
| 534 | static int af9033_set_frontend(struct dvb_frontend *fe) | 543 | static int af9033_set_frontend(struct dvb_frontend *fe) |
| 535 | { | 544 | { |
| 536 | struct af9033_state *state = fe->demodulator_priv; | 545 | struct af9033_dev *dev = fe->demodulator_priv; |
| 537 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | 546 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
| 538 | int ret, i, spec_inv, sampling_freq; | 547 | int ret, i, spec_inv, sampling_freq; |
| 539 | u8 tmp, buf[3], bandwidth_reg_val; | 548 | u8 tmp, buf[3], bandwidth_reg_val; |
| 540 | u32 if_frequency, freq_cw, adc_freq; | 549 | u32 if_frequency, freq_cw, adc_freq; |
| 541 | 550 | ||
| 542 | dev_dbg(&state->i2c->dev, "%s: frequency=%d bandwidth_hz=%d\n", | 551 | dev_dbg(&dev->client->dev, "frequency=%d bandwidth_hz=%d\n", |
| 543 | __func__, c->frequency, c->bandwidth_hz); | 552 | c->frequency, c->bandwidth_hz); |
| 544 | 553 | ||
| 545 | /* check bandwidth */ | 554 | /* check bandwidth */ |
| 546 | switch (c->bandwidth_hz) { | 555 | switch (c->bandwidth_hz) { |
| @@ -554,8 +563,7 @@ static int af9033_set_frontend(struct dvb_frontend *fe) | |||
| 554 | bandwidth_reg_val = 0x02; | 563 | bandwidth_reg_val = 0x02; |
| 555 | break; | 564 | break; |
| 556 | default: | 565 | default: |
| 557 | dev_dbg(&state->i2c->dev, "%s: invalid bandwidth_hz\n", | 566 | dev_dbg(&dev->client->dev, "invalid bandwidth_hz\n"); |
| 558 | __func__); | ||
| 559 | ret = -EINVAL; | 567 | ret = -EINVAL; |
| 560 | goto err; | 568 | goto err; |
| 561 | } | 569 | } |
| @@ -565,23 +573,23 @@ static int af9033_set_frontend(struct dvb_frontend *fe) | |||
| 565 | fe->ops.tuner_ops.set_params(fe); | 573 | fe->ops.tuner_ops.set_params(fe); |
| 566 | 574 | ||
| 567 | /* program CFOE coefficients */ | 575 | /* program CFOE coefficients */ |
| 568 | if (c->bandwidth_hz != state->bandwidth_hz) { | 576 | if (c->bandwidth_hz != dev->bandwidth_hz) { |
| 569 | for (i = 0; i < ARRAY_SIZE(coeff_lut); i++) { | 577 | for (i = 0; i < ARRAY_SIZE(coeff_lut); i++) { |
| 570 | if (coeff_lut[i].clock == state->cfg.clock && | 578 | if (coeff_lut[i].clock == dev->cfg.clock && |
| 571 | coeff_lut[i].bandwidth_hz == c->bandwidth_hz) { | 579 | coeff_lut[i].bandwidth_hz == c->bandwidth_hz) { |
| 572 | break; | 580 | break; |
| 573 | } | 581 | } |
| 574 | } | 582 | } |
| 575 | ret = af9033_wr_regs(state, 0x800001, | 583 | ret = af9033_wr_regs(dev, 0x800001, |
| 576 | coeff_lut[i].val, sizeof(coeff_lut[i].val)); | 584 | coeff_lut[i].val, sizeof(coeff_lut[i].val)); |
| 577 | } | 585 | } |
| 578 | 586 | ||
| 579 | /* program frequency control */ | 587 | /* program frequency control */ |
| 580 | if (c->bandwidth_hz != state->bandwidth_hz) { | 588 | if (c->bandwidth_hz != dev->bandwidth_hz) { |
| 581 | spec_inv = state->cfg.spec_inv ? -1 : 1; | 589 | spec_inv = dev->cfg.spec_inv ? -1 : 1; |
| 582 | 590 | ||
| 583 | for (i = 0; i < ARRAY_SIZE(clock_adc_lut); i++) { | 591 | for (i = 0; i < ARRAY_SIZE(clock_adc_lut); i++) { |
| 584 | if (clock_adc_lut[i].clock == state->cfg.clock) | 592 | if (clock_adc_lut[i].clock == dev->cfg.clock) |
| 585 | break; | 593 | break; |
| 586 | } | 594 | } |
| 587 | adc_freq = clock_adc_lut[i].adc; | 595 | adc_freq = clock_adc_lut[i].adc; |
| @@ -602,12 +610,12 @@ static int af9033_set_frontend(struct dvb_frontend *fe) | |||
| 602 | else | 610 | else |
| 603 | sampling_freq *= -1; | 611 | sampling_freq *= -1; |
| 604 | 612 | ||
| 605 | freq_cw = af9033_div(state, sampling_freq, adc_freq, 23ul); | 613 | freq_cw = af9033_div(dev, sampling_freq, adc_freq, 23ul); |
| 606 | 614 | ||
| 607 | if (spec_inv == -1) | 615 | if (spec_inv == -1) |
| 608 | freq_cw = 0x800000 - freq_cw; | 616 | freq_cw = 0x800000 - freq_cw; |
| 609 | 617 | ||
| 610 | if (state->cfg.adc_multiplier == AF9033_ADC_MULTIPLIER_2X) | 618 | if (dev->cfg.adc_multiplier == AF9033_ADC_MULTIPLIER_2X) |
| 611 | freq_cw /= 2; | 619 | freq_cw /= 2; |
| 612 | 620 | ||
| 613 | buf[0] = (freq_cw >> 0) & 0xff; | 621 | buf[0] = (freq_cw >> 0) & 0xff; |
| @@ -618,26 +626,26 @@ static int af9033_set_frontend(struct dvb_frontend *fe) | |||
| 618 | if (if_frequency == 0) | 626 | if (if_frequency == 0) |
| 619 | buf[2] = 0; | 627 | buf[2] = 0; |
| 620 | 628 | ||
| 621 | ret = af9033_wr_regs(state, 0x800029, buf, 3); | 629 | ret = af9033_wr_regs(dev, 0x800029, buf, 3); |
| 622 | if (ret < 0) | 630 | if (ret < 0) |
| 623 | goto err; | 631 | goto err; |
| 624 | 632 | ||
| 625 | state->bandwidth_hz = c->bandwidth_hz; | 633 | dev->bandwidth_hz = c->bandwidth_hz; |
| 626 | } | 634 | } |
| 627 | 635 | ||
| 628 | ret = af9033_wr_reg_mask(state, 0x80f904, bandwidth_reg_val, 0x03); | 636 | ret = af9033_wr_reg_mask(dev, 0x80f904, bandwidth_reg_val, 0x03); |
| 629 | if (ret < 0) | 637 | if (ret < 0) |
| 630 | goto err; | 638 | goto err; |
| 631 | 639 | ||
| 632 | ret = af9033_wr_reg(state, 0x800040, 0x00); | 640 | ret = af9033_wr_reg(dev, 0x800040, 0x00); |
| 633 | if (ret < 0) | 641 | if (ret < 0) |
| 634 | goto err; | 642 | goto err; |
| 635 | 643 | ||
| 636 | ret = af9033_wr_reg(state, 0x800047, 0x00); | 644 | ret = af9033_wr_reg(dev, 0x800047, 0x00); |
| 637 | if (ret < 0) | 645 | if (ret < 0) |
| 638 | goto err; | 646 | goto err; |
| 639 | 647 | ||
| 640 | ret = af9033_wr_reg_mask(state, 0x80f999, 0x00, 0x01); | 648 | ret = af9033_wr_reg_mask(dev, 0x80f999, 0x00, 0x01); |
| 641 | if (ret < 0) | 649 | if (ret < 0) |
| 642 | goto err; | 650 | goto err; |
| 643 | 651 | ||
| @@ -646,33 +654,33 @@ static int af9033_set_frontend(struct dvb_frontend *fe) | |||
| 646 | else | 654 | else |
| 647 | tmp = 0x01; /* UHF */ | 655 | tmp = 0x01; /* UHF */ |
| 648 | 656 | ||
| 649 | ret = af9033_wr_reg(state, 0x80004b, tmp); | 657 | ret = af9033_wr_reg(dev, 0x80004b, tmp); |
| 650 | if (ret < 0) | 658 | if (ret < 0) |
| 651 | goto err; | 659 | goto err; |
| 652 | 660 | ||
| 653 | ret = af9033_wr_reg(state, 0x800000, 0x00); | 661 | ret = af9033_wr_reg(dev, 0x800000, 0x00); |
| 654 | if (ret < 0) | 662 | if (ret < 0) |
| 655 | goto err; | 663 | goto err; |
| 656 | 664 | ||
| 657 | return 0; | 665 | return 0; |
| 658 | 666 | ||
| 659 | err: | 667 | err: |
| 660 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 668 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 661 | 669 | ||
| 662 | return ret; | 670 | return ret; |
| 663 | } | 671 | } |
| 664 | 672 | ||
| 665 | static int af9033_get_frontend(struct dvb_frontend *fe) | 673 | static int af9033_get_frontend(struct dvb_frontend *fe) |
| 666 | { | 674 | { |
| 667 | struct af9033_state *state = fe->demodulator_priv; | 675 | struct af9033_dev *dev = fe->demodulator_priv; |
| 668 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; | 676 | struct dtv_frontend_properties *c = &fe->dtv_property_cache; |
| 669 | int ret; | 677 | int ret; |
| 670 | u8 buf[8]; | 678 | u8 buf[8]; |
| 671 | 679 | ||
| 672 | dev_dbg(&state->i2c->dev, "%s:\n", __func__); | 680 | dev_dbg(&dev->client->dev, "\n"); |
| 673 | 681 | ||
| 674 | /* read all needed registers */ | 682 | /* read all needed registers */ |
| 675 | ret = af9033_rd_regs(state, 0x80f900, buf, sizeof(buf)); | 683 | ret = af9033_rd_regs(dev, 0x80f900, buf, sizeof(buf)); |
| 676 | if (ret < 0) | 684 | if (ret < 0) |
| 677 | goto err; | 685 | goto err; |
| 678 | 686 | ||
| @@ -784,21 +792,21 @@ static int af9033_get_frontend(struct dvb_frontend *fe) | |||
| 784 | return 0; | 792 | return 0; |
| 785 | 793 | ||
| 786 | err: | 794 | err: |
| 787 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 795 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 788 | 796 | ||
| 789 | return ret; | 797 | return ret; |
| 790 | } | 798 | } |
| 791 | 799 | ||
| 792 | static int af9033_read_status(struct dvb_frontend *fe, fe_status_t *status) | 800 | static int af9033_read_status(struct dvb_frontend *fe, fe_status_t *status) |
| 793 | { | 801 | { |
| 794 | struct af9033_state *state = fe->demodulator_priv; | 802 | struct af9033_dev *dev = fe->demodulator_priv; |
| 795 | int ret; | 803 | int ret; |
| 796 | u8 tmp; | 804 | u8 tmp; |
| 797 | 805 | ||
| 798 | *status = 0; | 806 | *status = 0; |
| 799 | 807 | ||
| 800 | /* radio channel status, 0=no result, 1=has signal, 2=no signal */ | 808 | /* radio channel status, 0=no result, 1=has signal, 2=no signal */ |
| 801 | ret = af9033_rd_reg(state, 0x800047, &tmp); | 809 | ret = af9033_rd_reg(dev, 0x800047, &tmp); |
| 802 | if (ret < 0) | 810 | if (ret < 0) |
| 803 | goto err; | 811 | goto err; |
| 804 | 812 | ||
| @@ -808,7 +816,7 @@ static int af9033_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
| 808 | 816 | ||
| 809 | if (tmp != 0x02) { | 817 | if (tmp != 0x02) { |
| 810 | /* TPS lock */ | 818 | /* TPS lock */ |
| 811 | ret = af9033_rd_reg_mask(state, 0x80f5a9, &tmp, 0x01); | 819 | ret = af9033_rd_reg_mask(dev, 0x80f5a9, &tmp, 0x01); |
| 812 | if (ret < 0) | 820 | if (ret < 0) |
| 813 | goto err; | 821 | goto err; |
| 814 | 822 | ||
| @@ -817,7 +825,7 @@ static int af9033_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
| 817 | FE_HAS_VITERBI; | 825 | FE_HAS_VITERBI; |
| 818 | 826 | ||
| 819 | /* full lock */ | 827 | /* full lock */ |
| 820 | ret = af9033_rd_reg_mask(state, 0x80f999, &tmp, 0x01); | 828 | ret = af9033_rd_reg_mask(dev, 0x80f999, &tmp, 0x01); |
| 821 | if (ret < 0) | 829 | if (ret < 0) |
| 822 | goto err; | 830 | goto err; |
| 823 | 831 | ||
| @@ -827,76 +835,38 @@ static int af9033_read_status(struct dvb_frontend *fe, fe_status_t *status) | |||
| 827 | FE_HAS_LOCK; | 835 | FE_HAS_LOCK; |
| 828 | } | 836 | } |
| 829 | 837 | ||
| 838 | dev->fe_status = *status; | ||
| 839 | |||
| 830 | return 0; | 840 | return 0; |
| 831 | 841 | ||
| 832 | err: | 842 | err: |
| 833 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 843 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 834 | 844 | ||
| 835 | return ret; | 845 | return ret; |
| 836 | } | 846 | } |
| 837 | 847 | ||
| 838 | static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr) | 848 | static int af9033_read_snr(struct dvb_frontend *fe, u16 *snr) |
| 839 | { | 849 | { |
| 840 | struct af9033_state *state = fe->demodulator_priv; | 850 | struct af9033_dev *dev = fe->demodulator_priv; |
| 841 | int ret, i, len; | 851 | struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache; |
| 842 | u8 buf[3], tmp; | ||
| 843 | u32 snr_val; | ||
| 844 | const struct val_snr *uninitialized_var(snr_lut); | ||
| 845 | |||
| 846 | /* read value */ | ||
| 847 | ret = af9033_rd_regs(state, 0x80002c, buf, 3); | ||
| 848 | if (ret < 0) | ||
| 849 | goto err; | ||
| 850 | 852 | ||
| 851 | snr_val = (buf[2] << 16) | (buf[1] << 8) | buf[0]; | 853 | /* use DVBv5 CNR */ |
| 852 | 854 | if (c->cnr.stat[0].scale == FE_SCALE_DECIBEL) | |
| 853 | /* read current modulation */ | 855 | *snr = div_s64(c->cnr.stat[0].svalue, 100); /* 1000x => 10x */ |
| 854 | ret = af9033_rd_reg(state, 0x80f903, &tmp); | 856 | else |
| 855 | if (ret < 0) | 857 | *snr = 0; |
| 856 | goto err; | ||
| 857 | |||
| 858 | switch ((tmp >> 0) & 3) { | ||
| 859 | case 0: | ||
| 860 | len = ARRAY_SIZE(qpsk_snr_lut); | ||
| 861 | snr_lut = qpsk_snr_lut; | ||
| 862 | break; | ||
| 863 | case 1: | ||
| 864 | len = ARRAY_SIZE(qam16_snr_lut); | ||
| 865 | snr_lut = qam16_snr_lut; | ||
| 866 | break; | ||
| 867 | case 2: | ||
| 868 | len = ARRAY_SIZE(qam64_snr_lut); | ||
| 869 | snr_lut = qam64_snr_lut; | ||
| 870 | break; | ||
| 871 | default: | ||
| 872 | goto err; | ||
| 873 | } | ||
| 874 | |||
| 875 | for (i = 0; i < len; i++) { | ||
| 876 | tmp = snr_lut[i].snr; | ||
| 877 | |||
| 878 | if (snr_val < snr_lut[i].val) | ||
| 879 | break; | ||
| 880 | } | ||
| 881 | |||
| 882 | *snr = tmp * 10; /* dB/10 */ | ||
| 883 | 858 | ||
| 884 | return 0; | 859 | return 0; |
| 885 | |||
| 886 | err: | ||
| 887 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | ||
| 888 | |||
| 889 | return ret; | ||
| 890 | } | 860 | } |
| 891 | 861 | ||
| 892 | static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | 862 | static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) |
| 893 | { | 863 | { |
| 894 | struct af9033_state *state = fe->demodulator_priv; | 864 | struct af9033_dev *dev = fe->demodulator_priv; |
| 895 | int ret; | 865 | int ret; |
| 896 | u8 strength2; | 866 | u8 strength2; |
| 897 | 867 | ||
| 898 | /* read signal strength of 0-100 scale */ | 868 | /* read signal strength of 0-100 scale */ |
| 899 | ret = af9033_rd_reg(state, 0x800048, &strength2); | 869 | ret = af9033_rd_reg(dev, 0x800048, &strength2); |
| 900 | if (ret < 0) | 870 | if (ret < 0) |
| 901 | goto err; | 871 | goto err; |
| 902 | 872 | ||
| @@ -906,244 +876,225 @@ static int af9033_read_signal_strength(struct dvb_frontend *fe, u16 *strength) | |||
| 906 | return 0; | 876 | return 0; |
| 907 | 877 | ||
| 908 | err: | 878 | err: |
| 909 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 879 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 910 | |||
| 911 | return ret; | ||
| 912 | } | ||
| 913 | |||
| 914 | static int af9033_update_ch_stat(struct af9033_state *state) | ||
| 915 | { | ||
| 916 | int ret = 0; | ||
| 917 | u32 err_cnt, bit_cnt; | ||
| 918 | u16 abort_cnt; | ||
| 919 | u8 buf[7]; | ||
| 920 | |||
| 921 | /* only update data every half second */ | ||
| 922 | if (time_after(jiffies, state->last_stat_check + msecs_to_jiffies(500))) { | ||
| 923 | ret = af9033_rd_regs(state, 0x800032, buf, sizeof(buf)); | ||
| 924 | if (ret < 0) | ||
| 925 | goto err; | ||
| 926 | /* in 8 byte packets? */ | ||
| 927 | abort_cnt = (buf[1] << 8) + buf[0]; | ||
| 928 | /* in bits */ | ||
| 929 | err_cnt = (buf[4] << 16) + (buf[3] << 8) + buf[2]; | ||
| 930 | /* in 8 byte packets? always(?) 0x2710 = 10000 */ | ||
| 931 | bit_cnt = (buf[6] << 8) + buf[5]; | ||
| 932 | |||
| 933 | if (bit_cnt < abort_cnt) { | ||
| 934 | abort_cnt = 1000; | ||
| 935 | state->ber = 0xffffffff; | ||
| 936 | } else { | ||
| 937 | /* 8 byte packets, that have not been rejected already */ | ||
| 938 | bit_cnt -= (u32)abort_cnt; | ||
| 939 | if (bit_cnt == 0) { | ||
| 940 | state->ber = 0xffffffff; | ||
| 941 | } else { | ||
| 942 | err_cnt -= (u32)abort_cnt * 8 * 8; | ||
| 943 | bit_cnt *= 8 * 8; | ||
| 944 | state->ber = err_cnt * (0xffffffff / bit_cnt); | ||
| 945 | } | ||
| 946 | } | ||
| 947 | state->ucb += abort_cnt; | ||
| 948 | state->last_stat_check = jiffies; | ||
| 949 | } | ||
| 950 | |||
| 951 | return 0; | ||
| 952 | err: | ||
| 953 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | ||
| 954 | 880 | ||
| 955 | return ret; | 881 | return ret; |
| 956 | } | 882 | } |
| 957 | 883 | ||
| 958 | static int af9033_read_ber(struct dvb_frontend *fe, u32 *ber) | 884 | static int af9033_read_ber(struct dvb_frontend *fe, u32 *ber) |
| 959 | { | 885 | { |
| 960 | struct af9033_state *state = fe->demodulator_priv; | 886 | struct af9033_dev *dev = fe->demodulator_priv; |
| 961 | int ret; | ||
| 962 | |||
| 963 | ret = af9033_update_ch_stat(state); | ||
| 964 | if (ret < 0) | ||
| 965 | return ret; | ||
| 966 | 887 | ||
| 967 | *ber = state->ber; | 888 | *ber = (dev->post_bit_error - dev->post_bit_error_prev); |
| 889 | dev->post_bit_error_prev = dev->post_bit_error; | ||
| 968 | 890 | ||
| 969 | return 0; | 891 | return 0; |
| 970 | } | 892 | } |
| 971 | 893 | ||
| 972 | static int af9033_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) | 894 | static int af9033_read_ucblocks(struct dvb_frontend *fe, u32 *ucblocks) |
| 973 | { | 895 | { |
| 974 | struct af9033_state *state = fe->demodulator_priv; | 896 | struct af9033_dev *dev = fe->demodulator_priv; |
| 975 | int ret; | ||
| 976 | |||
| 977 | ret = af9033_update_ch_stat(state); | ||
| 978 | if (ret < 0) | ||
| 979 | return ret; | ||
| 980 | |||
| 981 | *ucblocks = state->ucb; | ||
| 982 | 897 | ||
| 898 | *ucblocks = dev->error_block_count; | ||
| 983 | return 0; | 899 | return 0; |
| 984 | } | 900 | } |
| 985 | 901 | ||
| 986 | static int af9033_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) | 902 | static int af9033_i2c_gate_ctrl(struct dvb_frontend *fe, int enable) |
| 987 | { | 903 | { |
| 988 | struct af9033_state *state = fe->demodulator_priv; | 904 | struct af9033_dev *dev = fe->demodulator_priv; |
| 989 | int ret; | 905 | int ret; |
| 990 | 906 | ||
| 991 | dev_dbg(&state->i2c->dev, "%s: enable=%d\n", __func__, enable); | 907 | dev_dbg(&dev->client->dev, "enable=%d\n", enable); |
| 992 | 908 | ||
| 993 | ret = af9033_wr_reg_mask(state, 0x00fa04, enable, 0x01); | 909 | ret = af9033_wr_reg_mask(dev, 0x00fa04, enable, 0x01); |
| 994 | if (ret < 0) | 910 | if (ret < 0) |
| 995 | goto err; | 911 | goto err; |
| 996 | 912 | ||
| 997 | return 0; | 913 | return 0; |
| 998 | 914 | ||
| 999 | err: | 915 | err: |
| 1000 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 916 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 1001 | 917 | ||
| 1002 | return ret; | 918 | return ret; |
| 1003 | } | 919 | } |
| 1004 | 920 | ||
| 1005 | static int af9033_pid_filter_ctrl(struct dvb_frontend *fe, int onoff) | 921 | static int af9033_pid_filter_ctrl(struct dvb_frontend *fe, int onoff) |
| 1006 | { | 922 | { |
| 1007 | struct af9033_state *state = fe->demodulator_priv; | 923 | struct af9033_dev *dev = fe->demodulator_priv; |
| 1008 | int ret; | 924 | int ret; |
| 1009 | 925 | ||
| 1010 | dev_dbg(&state->i2c->dev, "%s: onoff=%d\n", __func__, onoff); | 926 | dev_dbg(&dev->client->dev, "onoff=%d\n", onoff); |
| 1011 | 927 | ||
| 1012 | ret = af9033_wr_reg_mask(state, 0x80f993, onoff, 0x01); | 928 | ret = af9033_wr_reg_mask(dev, 0x80f993, onoff, 0x01); |
| 1013 | if (ret < 0) | 929 | if (ret < 0) |
| 1014 | goto err; | 930 | goto err; |
| 1015 | 931 | ||
| 1016 | return 0; | 932 | return 0; |
| 1017 | 933 | ||
| 1018 | err: | 934 | err: |
| 1019 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 935 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 1020 | 936 | ||
| 1021 | return ret; | 937 | return ret; |
| 1022 | } | 938 | } |
| 1023 | 939 | ||
| 1024 | static int af9033_pid_filter(struct dvb_frontend *fe, int index, u16 pid, int onoff) | 940 | static int af9033_pid_filter(struct dvb_frontend *fe, int index, u16 pid, |
| 941 | int onoff) | ||
| 1025 | { | 942 | { |
| 1026 | struct af9033_state *state = fe->demodulator_priv; | 943 | struct af9033_dev *dev = fe->demodulator_priv; |
| 1027 | int ret; | 944 | int ret; |
| 1028 | u8 wbuf[2] = {(pid >> 0) & 0xff, (pid >> 8) & 0xff}; | 945 | u8 wbuf[2] = {(pid >> 0) & 0xff, (pid >> 8) & 0xff}; |
| 1029 | 946 | ||
| 1030 | dev_dbg(&state->i2c->dev, "%s: index=%d pid=%04x onoff=%d\n", | 947 | dev_dbg(&dev->client->dev, "index=%d pid=%04x onoff=%d\n", |
| 1031 | __func__, index, pid, onoff); | 948 | index, pid, onoff); |
| 1032 | 949 | ||
| 1033 | if (pid > 0x1fff) | 950 | if (pid > 0x1fff) |
| 1034 | return 0; | 951 | return 0; |
| 1035 | 952 | ||
| 1036 | ret = af9033_wr_regs(state, 0x80f996, wbuf, 2); | 953 | ret = af9033_wr_regs(dev, 0x80f996, wbuf, 2); |
| 1037 | if (ret < 0) | 954 | if (ret < 0) |
| 1038 | goto err; | 955 | goto err; |
| 1039 | 956 | ||
| 1040 | ret = af9033_wr_reg(state, 0x80f994, onoff); | 957 | ret = af9033_wr_reg(dev, 0x80f994, onoff); |
| 1041 | if (ret < 0) | 958 | if (ret < 0) |
| 1042 | goto err; | 959 | goto err; |
| 1043 | 960 | ||
| 1044 | ret = af9033_wr_reg(state, 0x80f995, index); | 961 | ret = af9033_wr_reg(dev, 0x80f995, index); |
| 1045 | if (ret < 0) | 962 | if (ret < 0) |
| 1046 | goto err; | 963 | goto err; |
| 1047 | 964 | ||
| 1048 | return 0; | 965 | return 0; |
| 1049 | 966 | ||
| 1050 | err: | 967 | err: |
| 1051 | dev_dbg(&state->i2c->dev, "%s: failed=%d\n", __func__, ret); | 968 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 1052 | 969 | ||
| 1053 | return ret; | 970 | return ret; |
| 1054 | } | 971 | } |
| 1055 | 972 | ||
| 1056 | static struct dvb_frontend_ops af9033_ops; | 973 | static void af9033_stat_work(struct work_struct *work) |
| 1057 | |||
| 1058 | struct dvb_frontend *af9033_attach(const struct af9033_config *config, | ||
| 1059 | struct i2c_adapter *i2c, | ||
| 1060 | struct af9033_ops *ops) | ||
| 1061 | { | 974 | { |
| 1062 | int ret; | 975 | struct af9033_dev *dev = container_of(work, struct af9033_dev, stat_work.work); |
| 1063 | struct af9033_state *state; | 976 | struct dtv_frontend_properties *c = &dev->fe.dtv_property_cache; |
| 1064 | u8 buf[8]; | 977 | int ret, tmp, i, len; |
| 978 | u8 u8tmp, buf[7]; | ||
| 979 | |||
| 980 | dev_dbg(&dev->client->dev, "\n"); | ||
| 981 | |||
| 982 | /* signal strength */ | ||
| 983 | if (dev->fe_status & FE_HAS_SIGNAL) { | ||
| 984 | if (dev->is_af9035) { | ||
| 985 | ret = af9033_rd_reg(dev, 0x80004a, &u8tmp); | ||
| 986 | tmp = -u8tmp * 1000; | ||
| 987 | } else { | ||
| 988 | ret = af9033_rd_reg(dev, 0x8000f7, &u8tmp); | ||
| 989 | tmp = (u8tmp - 100) * 1000; | ||
| 990 | } | ||
| 991 | if (ret) | ||
| 992 | goto err; | ||
| 1065 | 993 | ||
| 1066 | dev_dbg(&i2c->dev, "%s:\n", __func__); | 994 | c->strength.len = 1; |
| 995 | c->strength.stat[0].scale = FE_SCALE_DECIBEL; | ||
| 996 | c->strength.stat[0].svalue = tmp; | ||
| 997 | } else { | ||
| 998 | c->strength.len = 1; | ||
| 999 | c->strength.stat[0].scale = FE_SCALE_NOT_AVAILABLE; | ||
| 1000 | } | ||
| 1067 | 1001 | ||
| 1068 | /* allocate memory for the internal state */ | 1002 | /* CNR */ |
| 1069 | state = kzalloc(sizeof(struct af9033_state), GFP_KERNEL); | 1003 | if (dev->fe_status & FE_HAS_VITERBI) { |
| 1070 | if (state == NULL) | 1004 | u32 snr_val; |
| 1071 | goto err; | 1005 | const struct val_snr *snr_lut; |
| 1072 | 1006 | ||
| 1073 | /* setup the state */ | 1007 | /* read value */ |
| 1074 | state->i2c = i2c; | 1008 | ret = af9033_rd_regs(dev, 0x80002c, buf, 3); |
| 1075 | memcpy(&state->cfg, config, sizeof(struct af9033_config)); | 1009 | if (ret) |
| 1010 | goto err; | ||
| 1076 | 1011 | ||
| 1077 | if (state->cfg.clock != 12000000) { | 1012 | snr_val = (buf[2] << 16) | (buf[1] << 8) | (buf[0] << 0); |
| 1078 | dev_err(&state->i2c->dev, "%s: af9033: unsupported clock=%d, " \ | ||
| 1079 | "only 12000000 Hz is supported currently\n", | ||
| 1080 | KBUILD_MODNAME, state->cfg.clock); | ||
| 1081 | goto err; | ||
| 1082 | } | ||
| 1083 | 1013 | ||
| 1084 | /* firmware version */ | 1014 | /* read current modulation */ |
| 1085 | ret = af9033_rd_regs(state, 0x0083e9, &buf[0], 4); | 1015 | ret = af9033_rd_reg(dev, 0x80f903, &u8tmp); |
| 1086 | if (ret < 0) | 1016 | if (ret) |
| 1087 | goto err; | 1017 | goto err; |
| 1088 | 1018 | ||
| 1089 | ret = af9033_rd_regs(state, 0x804191, &buf[4], 4); | 1019 | switch ((u8tmp >> 0) & 3) { |
| 1090 | if (ret < 0) | 1020 | case 0: |
| 1091 | goto err; | 1021 | len = ARRAY_SIZE(qpsk_snr_lut); |
| 1022 | snr_lut = qpsk_snr_lut; | ||
| 1023 | break; | ||
| 1024 | case 1: | ||
| 1025 | len = ARRAY_SIZE(qam16_snr_lut); | ||
| 1026 | snr_lut = qam16_snr_lut; | ||
| 1027 | break; | ||
| 1028 | case 2: | ||
| 1029 | len = ARRAY_SIZE(qam64_snr_lut); | ||
| 1030 | snr_lut = qam64_snr_lut; | ||
| 1031 | break; | ||
| 1032 | default: | ||
| 1033 | goto err_schedule_delayed_work; | ||
| 1034 | } | ||
| 1092 | 1035 | ||
| 1093 | dev_info(&state->i2c->dev, "%s: firmware version: LINK=%d.%d.%d.%d " \ | 1036 | for (i = 0; i < len; i++) { |
| 1094 | "OFDM=%d.%d.%d.%d\n", KBUILD_MODNAME, buf[0], buf[1], | 1037 | tmp = snr_lut[i].snr * 1000; |
| 1095 | buf[2], buf[3], buf[4], buf[5], buf[6], buf[7]); | 1038 | if (snr_val < snr_lut[i].val) |
| 1039 | break; | ||
| 1040 | } | ||
| 1096 | 1041 | ||
| 1097 | /* sleep */ | 1042 | c->cnr.len = 1; |
| 1098 | switch (state->cfg.tuner) { | 1043 | c->cnr.stat[0].scale = FE_SCALE_DECIBEL; |
| 1099 | case AF9033_TUNER_IT9135_38: | 1044 | c->cnr.stat[0].svalue = tmp; |
| 1100 | case AF9033_TUNER_IT9135_51: | 1045 | } else { |
| 1101 | case AF9033_TUNER_IT9135_52: | 1046 | c->cnr.len = 1; |
| 1102 | case AF9033_TUNER_IT9135_60: | 1047 | c->cnr.stat[0].scale = FE_SCALE_NOT_AVAILABLE; |
| 1103 | case AF9033_TUNER_IT9135_61: | 1048 | } |
| 1104 | case AF9033_TUNER_IT9135_62: | ||
| 1105 | /* IT9135 did not like to sleep at that early */ | ||
| 1106 | break; | ||
| 1107 | default: | ||
| 1108 | ret = af9033_wr_reg(state, 0x80004c, 1); | ||
| 1109 | if (ret < 0) | ||
| 1110 | goto err; | ||
| 1111 | 1049 | ||
| 1112 | ret = af9033_wr_reg(state, 0x800000, 0); | 1050 | /* UCB/PER/BER */ |
| 1113 | if (ret < 0) | 1051 | if (dev->fe_status & FE_HAS_LOCK) { |
| 1052 | /* outer FEC, 204 byte packets */ | ||
| 1053 | u16 abort_packet_count, rsd_packet_count; | ||
| 1054 | /* inner FEC, bits */ | ||
| 1055 | u32 rsd_bit_err_count; | ||
| 1056 | |||
| 1057 | /* | ||
| 1058 | * Packet count used for measurement is 10000 | ||
| 1059 | * (rsd_packet_count). Maybe it should be increased? | ||
| 1060 | */ | ||
| 1061 | |||
| 1062 | ret = af9033_rd_regs(dev, 0x800032, buf, 7); | ||
| 1063 | if (ret) | ||
| 1114 | goto err; | 1064 | goto err; |
| 1115 | } | ||
| 1116 | 1065 | ||
| 1117 | /* configure internal TS mode */ | 1066 | abort_packet_count = (buf[1] << 8) | (buf[0] << 0); |
| 1118 | switch (state->cfg.ts_mode) { | 1067 | rsd_bit_err_count = (buf[4] << 16) | (buf[3] << 8) | buf[2]; |
| 1119 | case AF9033_TS_MODE_PARALLEL: | 1068 | rsd_packet_count = (buf[6] << 8) | (buf[5] << 0); |
| 1120 | state->ts_mode_parallel = true; | ||
| 1121 | break; | ||
| 1122 | case AF9033_TS_MODE_SERIAL: | ||
| 1123 | state->ts_mode_serial = true; | ||
| 1124 | break; | ||
| 1125 | case AF9033_TS_MODE_USB: | ||
| 1126 | /* usb mode for AF9035 */ | ||
| 1127 | default: | ||
| 1128 | break; | ||
| 1129 | } | ||
| 1130 | 1069 | ||
| 1131 | /* create dvb_frontend */ | 1070 | dev->error_block_count += abort_packet_count; |
| 1132 | memcpy(&state->fe.ops, &af9033_ops, sizeof(struct dvb_frontend_ops)); | 1071 | dev->total_block_count += rsd_packet_count; |
| 1133 | state->fe.demodulator_priv = state; | 1072 | dev->post_bit_error += rsd_bit_err_count; |
| 1073 | dev->post_bit_count += rsd_packet_count * 204 * 8; | ||
| 1134 | 1074 | ||
| 1135 | if (ops) { | 1075 | c->block_count.len = 1; |
| 1136 | ops->pid_filter = af9033_pid_filter; | 1076 | c->block_count.stat[0].scale = FE_SCALE_COUNTER; |
| 1137 | ops->pid_filter_ctrl = af9033_pid_filter_ctrl; | 1077 | c->block_count.stat[0].uvalue = dev->total_block_count; |
| 1138 | } | 1078 | |
| 1079 | c->block_error.len = 1; | ||
| 1080 | c->block_error.stat[0].scale = FE_SCALE_COUNTER; | ||
| 1081 | c->block_error.stat[0].uvalue = dev->error_block_count; | ||
| 1082 | |||
| 1083 | c->post_bit_count.len = 1; | ||
| 1084 | c->post_bit_count.stat[0].scale = FE_SCALE_COUNTER; | ||
| 1085 | c->post_bit_count.stat[0].uvalue = dev->post_bit_count; | ||
| 1139 | 1086 | ||
| 1140 | return &state->fe; | 1087 | c->post_bit_error.len = 1; |
| 1088 | c->post_bit_error.stat[0].scale = FE_SCALE_COUNTER; | ||
| 1089 | c->post_bit_error.stat[0].uvalue = dev->post_bit_error; | ||
| 1090 | } | ||
| 1141 | 1091 | ||
| 1092 | err_schedule_delayed_work: | ||
| 1093 | schedule_delayed_work(&dev->stat_work, msecs_to_jiffies(2000)); | ||
| 1094 | return; | ||
| 1142 | err: | 1095 | err: |
| 1143 | kfree(state); | 1096 | dev_dbg(&dev->client->dev, "failed=%d\n", ret); |
| 1144 | return NULL; | ||
| 1145 | } | 1097 | } |
| 1146 | EXPORT_SYMBOL(af9033_attach); | ||
| 1147 | 1098 | ||
| 1148 | static struct dvb_frontend_ops af9033_ops = { | 1099 | static struct dvb_frontend_ops af9033_ops = { |
| 1149 | .delsys = { SYS_DVBT }, | 1100 | .delsys = { SYS_DVBT }, |
| @@ -1170,8 +1121,6 @@ static struct dvb_frontend_ops af9033_ops = { | |||
| 1170 | FE_CAN_MUTE_TS | 1121 | FE_CAN_MUTE_TS |
| 1171 | }, | 1122 | }, |
| 1172 | 1123 | ||
| 1173 | .release = af9033_release, | ||
| 1174 | |||
| 1175 | .init = af9033_init, | 1124 | .init = af9033_init, |
| 1176 | .sleep = af9033_sleep, | 1125 | .sleep = af9033_sleep, |
| 1177 | 1126 | ||
| @@ -1188,6 +1137,150 @@ static struct dvb_frontend_ops af9033_ops = { | |||
| 1188 | .i2c_gate_ctrl = af9033_i2c_gate_ctrl, | 1137 | .i2c_gate_ctrl = af9033_i2c_gate_ctrl, |
| 1189 | }; | 1138 | }; |
| 1190 | 1139 | ||
| 1140 | static int af9033_probe(struct i2c_client *client, | ||
| 1141 | const struct i2c_device_id *id) | ||
| 1142 | { | ||
| 1143 | struct af9033_config *cfg = client->dev.platform_data; | ||
| 1144 | struct af9033_dev *dev; | ||
| 1145 | int ret; | ||
| 1146 | u8 buf[8]; | ||
| 1147 | u32 reg; | ||
| 1148 | |||
| 1149 | /* allocate memory for the internal state */ | ||
| 1150 | dev = kzalloc(sizeof(struct af9033_dev), GFP_KERNEL); | ||
| 1151 | if (dev == NULL) { | ||
| 1152 | ret = -ENOMEM; | ||
| 1153 | dev_err(&client->dev, "Could not allocate memory for state\n"); | ||
| 1154 | goto err; | ||
| 1155 | } | ||
| 1156 | |||
| 1157 | /* setup the state */ | ||
| 1158 | dev->client = client; | ||
| 1159 | INIT_DELAYED_WORK(&dev->stat_work, af9033_stat_work); | ||
| 1160 | memcpy(&dev->cfg, cfg, sizeof(struct af9033_config)); | ||
| 1161 | |||
| 1162 | if (dev->cfg.clock != 12000000) { | ||
| 1163 | ret = -ENODEV; | ||
| 1164 | dev_err(&dev->client->dev, | ||
| 1165 | "unsupported clock %d Hz, only 12000000 Hz is supported currently\n", | ||
| 1166 | dev->cfg.clock); | ||
| 1167 | goto err_kfree; | ||
| 1168 | } | ||
| 1169 | |||
| 1170 | /* firmware version */ | ||
| 1171 | switch (dev->cfg.tuner) { | ||
| 1172 | case AF9033_TUNER_IT9135_38: | ||
| 1173 | case AF9033_TUNER_IT9135_51: | ||
| 1174 | case AF9033_TUNER_IT9135_52: | ||
| 1175 | case AF9033_TUNER_IT9135_60: | ||
| 1176 | case AF9033_TUNER_IT9135_61: | ||
| 1177 | case AF9033_TUNER_IT9135_62: | ||
| 1178 | dev->is_it9135 = true; | ||
| 1179 | reg = 0x004bfc; | ||
| 1180 | break; | ||
| 1181 | default: | ||
| 1182 | dev->is_af9035 = true; | ||
| 1183 | reg = 0x0083e9; | ||
| 1184 | break; | ||
| 1185 | } | ||
| 1186 | |||
| 1187 | ret = af9033_rd_regs(dev, reg, &buf[0], 4); | ||
| 1188 | if (ret < 0) | ||
| 1189 | goto err_kfree; | ||
| 1190 | |||
| 1191 | ret = af9033_rd_regs(dev, 0x804191, &buf[4], 4); | ||
| 1192 | if (ret < 0) | ||
| 1193 | goto err_kfree; | ||
| 1194 | |||
| 1195 | dev_info(&dev->client->dev, | ||
| 1196 | "firmware version: LINK %d.%d.%d.%d - OFDM %d.%d.%d.%d\n", | ||
| 1197 | buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6], | ||
| 1198 | buf[7]); | ||
| 1199 | |||
| 1200 | /* sleep */ | ||
| 1201 | switch (dev->cfg.tuner) { | ||
| 1202 | case AF9033_TUNER_IT9135_38: | ||
| 1203 | case AF9033_TUNER_IT9135_51: | ||
| 1204 | case AF9033_TUNER_IT9135_52: | ||
| 1205 | case AF9033_TUNER_IT9135_60: | ||
| 1206 | case AF9033_TUNER_IT9135_61: | ||
| 1207 | case AF9033_TUNER_IT9135_62: | ||
| 1208 | /* IT9135 did not like to sleep at that early */ | ||
| 1209 | break; | ||
| 1210 | default: | ||
| 1211 | ret = af9033_wr_reg(dev, 0x80004c, 1); | ||
| 1212 | if (ret < 0) | ||
| 1213 | goto err_kfree; | ||
| 1214 | |||
| 1215 | ret = af9033_wr_reg(dev, 0x800000, 0); | ||
| 1216 | if (ret < 0) | ||
| 1217 | goto err_kfree; | ||
| 1218 | } | ||
| 1219 | |||
| 1220 | /* configure internal TS mode */ | ||
| 1221 | switch (dev->cfg.ts_mode) { | ||
| 1222 | case AF9033_TS_MODE_PARALLEL: | ||
| 1223 | dev->ts_mode_parallel = true; | ||
| 1224 | break; | ||
| 1225 | case AF9033_TS_MODE_SERIAL: | ||
| 1226 | dev->ts_mode_serial = true; | ||
| 1227 | break; | ||
| 1228 | case AF9033_TS_MODE_USB: | ||
| 1229 | /* usb mode for AF9035 */ | ||
| 1230 | default: | ||
| 1231 | break; | ||
| 1232 | } | ||
| 1233 | |||
| 1234 | /* create dvb_frontend */ | ||
| 1235 | memcpy(&dev->fe.ops, &af9033_ops, sizeof(struct dvb_frontend_ops)); | ||
| 1236 | dev->fe.demodulator_priv = dev; | ||
| 1237 | *cfg->fe = &dev->fe; | ||
| 1238 | if (cfg->ops) { | ||
| 1239 | cfg->ops->pid_filter = af9033_pid_filter; | ||
| 1240 | cfg->ops->pid_filter_ctrl = af9033_pid_filter_ctrl; | ||
| 1241 | } | ||
| 1242 | i2c_set_clientdata(client, dev); | ||
| 1243 | |||
| 1244 | dev_info(&dev->client->dev, "Afatech AF9033 successfully attached\n"); | ||
| 1245 | return 0; | ||
| 1246 | err_kfree: | ||
| 1247 | kfree(dev); | ||
| 1248 | err: | ||
| 1249 | dev_dbg(&client->dev, "failed=%d\n", ret); | ||
| 1250 | return ret; | ||
| 1251 | } | ||
| 1252 | |||
| 1253 | static int af9033_remove(struct i2c_client *client) | ||
| 1254 | { | ||
| 1255 | struct af9033_dev *dev = i2c_get_clientdata(client); | ||
| 1256 | |||
| 1257 | dev_dbg(&dev->client->dev, "\n"); | ||
| 1258 | |||
| 1259 | dev->fe.ops.release = NULL; | ||
| 1260 | dev->fe.demodulator_priv = NULL; | ||
| 1261 | kfree(dev); | ||
| 1262 | |||
| 1263 | return 0; | ||
| 1264 | } | ||
| 1265 | |||
| 1266 | static const struct i2c_device_id af9033_id_table[] = { | ||
| 1267 | {"af9033", 0}, | ||
| 1268 | {} | ||
| 1269 | }; | ||
| 1270 | MODULE_DEVICE_TABLE(i2c, af9033_id_table); | ||
| 1271 | |||
| 1272 | static struct i2c_driver af9033_driver = { | ||
| 1273 | .driver = { | ||
| 1274 | .owner = THIS_MODULE, | ||
| 1275 | .name = "af9033", | ||
| 1276 | }, | ||
| 1277 | .probe = af9033_probe, | ||
| 1278 | .remove = af9033_remove, | ||
| 1279 | .id_table = af9033_id_table, | ||
| 1280 | }; | ||
| 1281 | |||
| 1282 | module_i2c_driver(af9033_driver); | ||
| 1283 | |||
| 1191 | MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); | 1284 | MODULE_AUTHOR("Antti Palosaari <crope@iki.fi>"); |
| 1192 | MODULE_DESCRIPTION("Afatech AF9033 DVB-T demodulator driver"); | 1285 | MODULE_DESCRIPTION("Afatech AF9033 DVB-T demodulator driver"); |
| 1193 | MODULE_LICENSE("GPL"); | 1286 | MODULE_LICENSE("GPL"); |
