Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

[media] mn88473: finalize driver

Finalize the driver.
It still lacks a lot of features, like all statistics and PLP
filtering, but basic functionality and sensitivity is pretty good
shape.

Signed-off-by: Antti Palosaari <crope@iki.fi>
Reviewed-by: Benjamin Larsson <benjamin@southpole.se>
Signed-off-by: Mauro Carvalho Chehab <mchehab@osg.samsung.com>

authored by

Antti Palosaari and committed by
Mauro Carvalho Chehab
7908fad9 877ba50b

+246 -163
+236 -152
drivers/media/dvb-frontends/mn88473.c
··· 29 29 struct mn88473_dev *dev = i2c_get_clientdata(client); 30 30 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 31 31 int ret, i; 32 + unsigned int uitmp; 32 33 u32 if_frequency; 33 - u64 tmp; 34 - u8 delivery_system_val, if_val[3], bw_val[7]; 34 + u8 delivery_system_val, if_val[3], *conf_val_ptr; 35 + u8 reg_bank2_2d_val, reg_bank0_d2_val; 35 36 36 37 dev_dbg(&client->dev, 37 38 "delivery_system=%u modulation=%u frequency=%u bandwidth_hz=%u symbol_rate=%u inversion=%d stream_id=%d\n", 38 - c->delivery_system, 39 - c->modulation, 40 - c->frequency, 41 - c->bandwidth_hz, 42 - c->symbol_rate, 43 - c->inversion, 44 - c->stream_id); 39 + c->delivery_system, c->modulation, c->frequency, 40 + c->bandwidth_hz, c->symbol_rate, c->inversion, c->stream_id); 45 41 46 - if (!dev->warm) { 42 + if (!dev->active) { 47 43 ret = -EAGAIN; 48 44 goto err; 49 45 } ··· 47 51 switch (c->delivery_system) { 48 52 case SYS_DVBT: 49 53 delivery_system_val = 0x02; 54 + reg_bank2_2d_val = 0x23; 55 + reg_bank0_d2_val = 0x2a; 50 56 break; 51 57 case SYS_DVBT2: 52 58 delivery_system_val = 0x03; 59 + reg_bank2_2d_val = 0x3b; 60 + reg_bank0_d2_val = 0x29; 53 61 break; 54 62 case SYS_DVBC_ANNEX_A: 55 63 delivery_system_val = 0x04; 64 + reg_bank2_2d_val = 0x3b; 65 + reg_bank0_d2_val = 0x29; 56 66 break; 57 67 default: 58 68 ret = -EINVAL; 59 69 goto err; 60 70 } 61 71 62 - if (c->bandwidth_hz <= 6000000) { 63 - memcpy(bw_val, "\xe9\x55\x55\x1c\x29\x1c\x29", 7); 64 - } else if (c->bandwidth_hz <= 7000000) { 65 - memcpy(bw_val, "\xc8\x00\x00\x17\x0a\x17\x0a", 7); 66 - } else if (c->bandwidth_hz <= 8000000) { 67 - memcpy(bw_val, "\xaf\x00\x00\x11\xec\x11\xec", 7); 68 - } else { 69 - ret = -EINVAL; 70 - goto err; 72 + switch (c->delivery_system) { 73 + case SYS_DVBT: 74 + case SYS_DVBT2: 75 + switch (c->bandwidth_hz) { 76 + case 6000000: 77 + conf_val_ptr = "\xe9\x55\x55\x1c\x29\x1c\x29"; 78 + break; 79 + case 7000000: 80 + conf_val_ptr = "\xc8\x00\x00\x17\x0a\x17\x0a"; 81 + break; 82 + case 8000000: 83 + conf_val_ptr = "\xaf\x00\x00\x11\xec\x11\xec"; 84 + break; 85 + default: 86 + ret = -EINVAL; 87 + goto err; 88 + } 89 + break; 90 + case SYS_DVBC_ANNEX_A: 91 + conf_val_ptr = "\x10\xab\x0d\xae\x1d\x9d"; 92 + break; 93 + default: 94 + break; 71 95 } 72 96 73 - /* program tuner */ 97 + /* Program tuner */ 74 98 if (fe->ops.tuner_ops.set_params) { 75 99 ret = fe->ops.tuner_ops.set_params(fe); 76 100 if (ret) ··· 102 86 if (ret) 103 87 goto err; 104 88 105 - dev_dbg(&client->dev, "get_if_frequency=%d\n", if_frequency); 89 + dev_dbg(&client->dev, "get_if_frequency=%u\n", if_frequency); 106 90 } else { 107 - if_frequency = 0; 91 + ret = -EINVAL; 92 + goto err; 108 93 } 109 94 110 - /* Calculate IF registers ( (1<<24)*IF / Xtal ) */ 111 - tmp = div_u64(if_frequency * (u64)(1<<24) + (dev->xtal / 2), 112 - dev->xtal); 113 - if_val[0] = ((tmp >> 16) & 0xff); 114 - if_val[1] = ((tmp >> 8) & 0xff); 115 - if_val[2] = ((tmp >> 0) & 0xff); 95 + /* Calculate IF registers */ 96 + uitmp = DIV_ROUND_CLOSEST_ULL((u64) if_frequency * 0x1000000, dev->clk); 97 + if_val[0] = (uitmp >> 16) & 0xff; 98 + if_val[1] = (uitmp >> 8) & 0xff; 99 + if_val[2] = (uitmp >> 0) & 0xff; 116 100 117 101 ret = regmap_write(dev->regmap[2], 0x05, 0x00); 102 + if (ret) 103 + goto err; 118 104 ret = regmap_write(dev->regmap[2], 0xfb, 0x13); 105 + if (ret) 106 + goto err; 119 107 ret = regmap_write(dev->regmap[2], 0xef, 0x13); 108 + if (ret) 109 + goto err; 120 110 ret = regmap_write(dev->regmap[2], 0xf9, 0x13); 111 + if (ret) 112 + goto err; 121 113 ret = regmap_write(dev->regmap[2], 0x00, 0x18); 114 + if (ret) 115 + goto err; 122 116 ret = regmap_write(dev->regmap[2], 0x01, 0x01); 117 + if (ret) 118 + goto err; 123 119 ret = regmap_write(dev->regmap[2], 0x02, 0x21); 120 + if (ret) 121 + goto err; 124 122 ret = regmap_write(dev->regmap[2], 0x03, delivery_system_val); 123 + if (ret) 124 + goto err; 125 125 ret = regmap_write(dev->regmap[2], 0x0b, 0x00); 126 + if (ret) 127 + goto err; 126 128 127 129 for (i = 0; i < sizeof(if_val); i++) { 128 130 ret = regmap_write(dev->regmap[2], 0x10 + i, if_val[i]); ··· 148 114 goto err; 149 115 } 150 116 151 - for (i = 0; i < sizeof(bw_val); i++) { 152 - ret = regmap_write(dev->regmap[2], 0x13 + i, bw_val[i]); 117 + switch (c->delivery_system) { 118 + case SYS_DVBT: 119 + case SYS_DVBT2: 120 + for (i = 0; i < 7; i++) { 121 + ret = regmap_write(dev->regmap[2], 0x13 + i, 122 + conf_val_ptr[i]); 123 + if (ret) 124 + goto err; 125 + } 126 + break; 127 + case SYS_DVBC_ANNEX_A: 128 + ret = regmap_bulk_write(dev->regmap[1], 0x10, conf_val_ptr, 6); 153 129 if (ret) 154 130 goto err; 131 + break; 132 + default: 133 + break; 155 134 } 156 135 157 - ret = regmap_write(dev->regmap[2], 0x2d, 0x3b); 136 + ret = regmap_write(dev->regmap[2], 0x2d, reg_bank2_2d_val); 137 + if (ret) 138 + goto err; 158 139 ret = regmap_write(dev->regmap[2], 0x2e, 0x00); 140 + if (ret) 141 + goto err; 159 142 ret = regmap_write(dev->regmap[2], 0x56, 0x0d); 160 - ret = regmap_write(dev->regmap[0], 0x01, 0xba); 161 - ret = regmap_write(dev->regmap[0], 0x02, 0x13); 162 - ret = regmap_write(dev->regmap[0], 0x03, 0x80); 163 - ret = regmap_write(dev->regmap[0], 0x04, 0xba); 164 - ret = regmap_write(dev->regmap[0], 0x05, 0x91); 165 - ret = regmap_write(dev->regmap[0], 0x07, 0xe7); 166 - ret = regmap_write(dev->regmap[0], 0x08, 0x28); 143 + if (ret) 144 + goto err; 145 + ret = regmap_bulk_write(dev->regmap[0], 0x01, 146 + "\xba\x13\x80\xba\x91\xdd\xe7\x28", 8); 147 + if (ret) 148 + goto err; 167 149 ret = regmap_write(dev->regmap[0], 0x0a, 0x1a); 150 + if (ret) 151 + goto err; 168 152 ret = regmap_write(dev->regmap[0], 0x13, 0x1f); 153 + if (ret) 154 + goto err; 169 155 ret = regmap_write(dev->regmap[0], 0x19, 0x03); 156 + if (ret) 157 + goto err; 170 158 ret = regmap_write(dev->regmap[0], 0x1d, 0xb0); 159 + if (ret) 160 + goto err; 171 161 ret = regmap_write(dev->regmap[0], 0x2a, 0x72); 162 + if (ret) 163 + goto err; 172 164 ret = regmap_write(dev->regmap[0], 0x2d, 0x00); 165 + if (ret) 166 + goto err; 173 167 ret = regmap_write(dev->regmap[0], 0x3c, 0x00); 168 + if (ret) 169 + goto err; 174 170 ret = regmap_write(dev->regmap[0], 0x3f, 0xf8); 175 - ret = regmap_write(dev->regmap[0], 0x40, 0xf4); 176 - ret = regmap_write(dev->regmap[0], 0x41, 0x08); 177 - ret = regmap_write(dev->regmap[0], 0xd2, 0x29); 171 + if (ret) 172 + goto err; 173 + ret = regmap_bulk_write(dev->regmap[0], 0x40, "\xf4\x08", 2); 174 + if (ret) 175 + goto err; 176 + ret = regmap_write(dev->regmap[0], 0xd2, reg_bank0_d2_val); 177 + if (ret) 178 + goto err; 178 179 ret = regmap_write(dev->regmap[0], 0xd4, 0x55); 179 - ret = regmap_write(dev->regmap[1], 0x10, 0x10); 180 - ret = regmap_write(dev->regmap[1], 0x11, 0xab); 181 - ret = regmap_write(dev->regmap[1], 0x12, 0x0d); 182 - ret = regmap_write(dev->regmap[1], 0x13, 0xae); 183 - ret = regmap_write(dev->regmap[1], 0x14, 0x1d); 184 - ret = regmap_write(dev->regmap[1], 0x15, 0x9d); 180 + if (ret) 181 + goto err; 185 182 ret = regmap_write(dev->regmap[1], 0xbe, 0x08); 186 - ret = regmap_write(dev->regmap[2], 0x09, 0x08); 187 - ret = regmap_write(dev->regmap[2], 0x08, 0x1d); 183 + if (ret) 184 + goto err; 188 185 ret = regmap_write(dev->regmap[0], 0xb2, 0x37); 186 + if (ret) 187 + goto err; 189 188 ret = regmap_write(dev->regmap[0], 0xd7, 0x04); 190 - ret = regmap_write(dev->regmap[2], 0x32, 0x80); 191 - ret = regmap_write(dev->regmap[2], 0x36, 0x00); 192 - ret = regmap_write(dev->regmap[2], 0xf8, 0x9f); 193 189 if (ret) 194 190 goto err; 195 191 196 - dev->delivery_system = c->delivery_system; 192 + /* Reset FSM */ 193 + ret = regmap_write(dev->regmap[2], 0xf8, 0x9f); 194 + if (ret) 195 + goto err; 197 196 198 197 return 0; 199 198 err: ··· 240 173 struct mn88473_dev *dev = i2c_get_clientdata(client); 241 174 struct dtv_frontend_properties *c = &fe->dtv_property_cache; 242 175 int ret; 243 - unsigned int utmp; 244 - int lock = 0; 176 + unsigned int uitmp; 245 177 246 - *status = 0; 247 - 248 - if (!dev->warm) { 178 + if (!dev->active) { 249 179 ret = -EAGAIN; 250 180 goto err; 251 181 } 252 182 183 + *status = 0; 184 + 253 185 switch (c->delivery_system) { 254 186 case SYS_DVBT: 255 - ret = regmap_read(dev->regmap[0], 0x62, &utmp); 187 + ret = regmap_read(dev->regmap[0], 0x62, &uitmp); 256 188 if (ret) 257 189 goto err; 258 - if (!(utmp & 0xA0)) { 259 - if ((utmp & 0xF) >= 0x03) 260 - *status |= FE_HAS_SIGNAL; 261 - if ((utmp & 0xF) >= 0x09) 262 - lock = 1; 190 + 191 + if (!(uitmp & 0xa0)) { 192 + if ((uitmp & 0x0f) >= 0x09) 193 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 194 + FE_HAS_VITERBI | FE_HAS_SYNC | 195 + FE_HAS_LOCK; 196 + else if ((uitmp & 0x0f) >= 0x03) 197 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER; 263 198 } 264 199 break; 265 200 case SYS_DVBT2: 266 - ret = regmap_read(dev->regmap[2], 0x8B, &utmp); 201 + ret = regmap_read(dev->regmap[2], 0x8b, &uitmp); 267 202 if (ret) 268 203 goto err; 269 - if (!(utmp & 0x40)) { 270 - if ((utmp & 0xF) >= 0x07) 271 - *status |= FE_HAS_SIGNAL; 272 - if ((utmp & 0xF) >= 0x0a) 273 - *status |= FE_HAS_CARRIER; 274 - if ((utmp & 0xF) >= 0x0d) 275 - *status |= FE_HAS_VITERBI | FE_HAS_SYNC | FE_HAS_LOCK; 204 + 205 + if (!(uitmp & 0x40)) { 206 + if ((uitmp & 0x0f) >= 0x0d) 207 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 208 + FE_HAS_VITERBI | FE_HAS_SYNC | 209 + FE_HAS_LOCK; 210 + else if ((uitmp & 0x0f) >= 0x0a) 211 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 212 + FE_HAS_VITERBI; 213 + else if ((uitmp & 0x0f) >= 0x07) 214 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER; 276 215 } 277 216 break; 278 217 case SYS_DVBC_ANNEX_A: 279 - ret = regmap_read(dev->regmap[1], 0x85, &utmp); 218 + ret = regmap_read(dev->regmap[1], 0x85, &uitmp); 280 219 if (ret) 281 220 goto err; 282 - if (!(utmp & 0x40)) { 283 - ret = regmap_read(dev->regmap[1], 0x89, &utmp); 221 + 222 + if (!(uitmp & 0x40)) { 223 + ret = regmap_read(dev->regmap[1], 0x89, &uitmp); 284 224 if (ret) 285 225 goto err; 286 - if (utmp & 0x01) 287 - lock = 1; 226 + 227 + if (uitmp & 0x01) 228 + *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | 229 + FE_HAS_VITERBI | FE_HAS_SYNC | 230 + FE_HAS_LOCK; 288 231 } 289 232 break; 290 233 default: 291 234 ret = -EINVAL; 292 235 goto err; 293 236 } 294 - 295 - if (lock) 296 - *status = FE_HAS_SIGNAL | FE_HAS_CARRIER | FE_HAS_VITERBI | 297 - FE_HAS_SYNC | FE_HAS_LOCK; 298 237 299 238 return 0; 300 239 err: ··· 312 239 { 313 240 struct i2c_client *client = fe->demodulator_priv; 314 241 struct mn88473_dev *dev = i2c_get_clientdata(client); 315 - int ret, len, remaining; 316 - const struct firmware *fw = NULL; 317 - u8 *fw_file = MN88473_FIRMWARE; 318 - unsigned int tmp; 242 + int ret, len, remain; 243 + unsigned int uitmp; 244 + const struct firmware *fw; 245 + const char *name = MN88473_FIRMWARE; 319 246 320 247 dev_dbg(&client->dev, "\n"); 321 248 322 - /* set cold state by default */ 323 - dev->warm = false; 324 - 325 - /* check if firmware is already running */ 326 - ret = regmap_read(dev->regmap[0], 0xf5, &tmp); 249 + /* Check if firmware is already running */ 250 + ret = regmap_read(dev->regmap[0], 0xf5, &uitmp); 327 251 if (ret) 328 252 goto err; 329 253 330 - if (!(tmp & 0x1)) { 331 - dev_info(&client->dev, "firmware already running\n"); 332 - dev->warm = true; 333 - return 0; 334 - } 254 + if (!(uitmp & 0x01)) 255 + goto warm; 335 256 336 - /* request the firmware, this will block and timeout */ 337 - ret = request_firmware(&fw, fw_file, &client->dev); 257 + /* Request the firmware, this will block and timeout */ 258 + ret = request_firmware(&fw, name, &client->dev); 338 259 if (ret) { 339 - dev_err(&client->dev, "firmare file '%s' not found\n", fw_file); 340 - goto err_request_firmware; 260 + dev_err(&client->dev, "firmare file '%s' not found\n", name); 261 + goto err; 341 262 } 342 263 343 - dev_info(&client->dev, "downloading firmware from file '%s'\n", 344 - fw_file); 264 + dev_info(&client->dev, "downloading firmware from file '%s'\n", name); 345 265 346 266 ret = regmap_write(dev->regmap[0], 0xf5, 0x03); 347 267 if (ret) 348 - goto err; 268 + goto err_release_firmware; 349 269 350 - for (remaining = fw->size; remaining > 0; 351 - remaining -= (dev->i2c_wr_max - 1)) { 352 - len = remaining; 353 - if (len > (dev->i2c_wr_max - 1)) 354 - len = dev->i2c_wr_max - 1; 355 - 270 + for (remain = fw->size; remain > 0; remain -= (dev->i2c_wr_max - 1)) { 271 + len = min(dev->i2c_wr_max - 1, remain); 356 272 ret = regmap_bulk_write(dev->regmap[0], 0xf6, 357 - &fw->data[fw->size - remaining], len); 273 + &fw->data[fw->size - remain], len); 358 274 if (ret) { 359 - dev_err(&client->dev, "firmware download failed=%d\n", 275 + dev_err(&client->dev, "firmware download failed %d\n", 360 276 ret); 361 - goto err; 277 + goto err_release_firmware; 362 278 } 363 279 } 364 280 365 - /* parity check of firmware */ 366 - ret = regmap_read(dev->regmap[0], 0xf8, &tmp); 367 - if (ret) { 368 - dev_err(&client->dev, 369 - "parity reg read failed=%d\n", ret); 281 + release_firmware(fw); 282 + 283 + /* Parity check of firmware */ 284 + ret = regmap_read(dev->regmap[0], 0xf8, &uitmp); 285 + if (ret) 286 + goto err; 287 + 288 + if (uitmp & 0x10) { 289 + dev_err(&client->dev, "firmware parity check failed\n"); 290 + ret = -EINVAL; 370 291 goto err; 371 292 } 372 - if (tmp & 0x10) { 373 - dev_err(&client->dev, 374 - "firmware parity check failed=0x%x\n", tmp); 375 - goto err; 376 - } 377 - dev_err(&client->dev, "firmware parity check succeeded=0x%x\n", tmp); 378 293 379 294 ret = regmap_write(dev->regmap[0], 0xf5, 0x00); 380 295 if (ret) 381 296 goto err; 297 + warm: 298 + /* TS config */ 299 + ret = regmap_write(dev->regmap[2], 0x09, 0x08); 300 + if (ret) 301 + goto err; 302 + ret = regmap_write(dev->regmap[2], 0x08, 0x1d); 303 + if (ret) 304 + goto err; 382 305 383 - release_firmware(fw); 384 - fw = NULL; 385 - 386 - /* warm state */ 387 - dev->warm = true; 306 + dev->active = true; 388 307 389 308 return 0; 390 - 391 - err: 309 + err_release_firmware: 392 310 release_firmware(fw); 393 - err_request_firmware: 311 + err: 394 312 dev_dbg(&client->dev, "failed=%d\n", ret); 395 313 return ret; 396 314 } ··· 394 330 395 331 dev_dbg(&client->dev, "\n"); 396 332 333 + dev->active = false; 334 + 397 335 ret = regmap_write(dev->regmap[2], 0x05, 0x3e); 398 336 if (ret) 399 337 goto err; 400 - 401 - dev->delivery_system = SYS_UNDEFINED; 402 338 403 339 return 0; 404 340 err: ··· 406 342 return ret; 407 343 } 408 344 409 - static struct dvb_frontend_ops mn88473_ops = { 410 - .delsys = {SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_AC}, 345 + static const struct dvb_frontend_ops mn88473_ops = { 346 + .delsys = {SYS_DVBT, SYS_DVBT2, SYS_DVBC_ANNEX_A}, 411 347 .info = { 412 348 .name = "Panasonic MN88473", 413 349 .symbol_rate_min = 1000000, ··· 429 365 FE_CAN_GUARD_INTERVAL_AUTO | 430 366 FE_CAN_HIERARCHY_AUTO | 431 367 FE_CAN_MUTE_TS | 432 - FE_CAN_2G_MODULATION | 433 - FE_CAN_MULTISTREAM 368 + FE_CAN_2G_MODULATION 434 369 }, 435 370 436 371 .get_tune_settings = mn88473_get_tune_settings, ··· 448 385 struct mn88473_config *config = client->dev.platform_data; 449 386 struct mn88473_dev *dev; 450 387 int ret; 451 - unsigned int utmp; 388 + unsigned int uitmp; 452 389 static const struct regmap_config regmap_config = { 453 390 .reg_bits = 8, 454 391 .val_bits = 8, ··· 456 393 457 394 dev_dbg(&client->dev, "\n"); 458 395 459 - /* Caller really need to provide pointer for frontend we create. */ 396 + /* Caller really need to provide pointer for frontend we create */ 460 397 if (config->fe == NULL) { 461 398 dev_err(&client->dev, "frontend pointer not defined\n"); 462 399 ret = -EINVAL; ··· 469 406 goto err; 470 407 } 471 408 472 - dev->i2c_wr_max = config->i2c_wr_max; 473 - if (!config->xtal) 474 - dev->xtal = 25000000; 409 + if (config->i2c_wr_max) 410 + dev->i2c_wr_max = config->i2c_wr_max; 475 411 else 476 - dev->xtal = config->xtal; 412 + dev->i2c_wr_max = ~0; 413 + 414 + if (config->xtal) 415 + dev->clk = config->xtal; 416 + else 417 + dev->clk = 25000000; 477 418 dev->client[0] = client; 478 419 dev->regmap[0] = regmap_init_i2c(dev->client[0], &regmap_config); 479 420 if (IS_ERR(dev->regmap[0])) { ··· 485 418 goto err_kfree; 486 419 } 487 420 488 - /* check demod answers to I2C */ 489 - ret = regmap_read(dev->regmap[0], 0x00, &utmp); 421 + /* Check demod answers with correct chip id */ 422 + ret = regmap_read(dev->regmap[0], 0xff, &uitmp); 490 423 if (ret) 491 424 goto err_regmap_0_regmap_exit; 492 425 426 + dev_dbg(&client->dev, "chip id=%02x\n", uitmp); 427 + 428 + if (uitmp != 0x03) { 429 + ret = -ENODEV; 430 + goto err_regmap_0_regmap_exit; 431 + } 432 + 493 433 /* 494 - * Chip has three I2C addresses for different register pages. Used 434 + * Chip has three I2C addresses for different register banks. Used 495 435 * addresses are 0x18, 0x1a and 0x1c. We register two dummy clients, 496 - * 0x1a and 0x1c, in order to get own I2C client for each register page. 436 + * 0x1a and 0x1c, in order to get own I2C client for each register bank. 437 + * 438 + * Also, register bank 2 do not support sequential I/O. Only single 439 + * register write or read is allowed to that bank. 497 440 */ 498 441 dev->client[1] = i2c_new_dummy(client->adapter, 0x1a); 499 442 if (dev->client[1] == NULL) { ··· 533 456 } 534 457 i2c_set_clientdata(dev->client[2], dev); 535 458 536 - /* create dvb_frontend */ 537 - memcpy(&dev->fe.ops, &mn88473_ops, sizeof(struct dvb_frontend_ops)); 538 - dev->fe.demodulator_priv = client; 539 - *config->fe = &dev->fe; 459 + /* Sleep because chip is active by default */ 460 + ret = regmap_write(dev->regmap[2], 0x05, 0x3e); 461 + if (ret) 462 + goto err_client_2_i2c_unregister_device; 463 + 464 + /* Create dvb frontend */ 465 + memcpy(&dev->frontend.ops, &mn88473_ops, sizeof(dev->frontend.ops)); 466 + dev->frontend.demodulator_priv = client; 467 + *config->fe = &dev->frontend; 540 468 i2c_set_clientdata(client, dev); 541 469 542 - dev_info(&dev->client[0]->dev, "Panasonic MN88473 successfully attached\n"); 470 + dev_info(&client->dev, "Panasonic MN88473 successfully identified\n"); 471 + 543 472 return 0; 544 473 545 474 err_client_2_i2c_unregister_device: ··· 590 507 591 508 static struct i2c_driver mn88473_driver = { 592 509 .driver = { 593 - .name = "mn88473", 510 + .name = "mn88473", 511 + .suppress_bind_attrs = true, 594 512 }, 595 513 .probe = mn88473_probe, 596 514 .remove = mn88473_remove,
+7 -7
drivers/media/dvb-frontends/mn88473.h
··· 22 22 struct mn88473_config { 23 23 /* 24 24 * Max num of bytes given I2C adapter could write at once. 25 - * Default: none 25 + * Default: unlimited 26 26 */ 27 27 u16 i2c_wr_max; 28 + 29 + /* 30 + * Xtal frequency Hz. 31 + * Default: 25000000 32 + */ 33 + u32 xtal; 28 34 29 35 30 36 /* Everything after that is returned by the driver. */ ··· 39 33 * DVB frontend. 40 34 */ 41 35 struct dvb_frontend **fe; 42 - 43 - /* 44 - * Xtal frequency. 45 - * Hz 46 - */ 47 - u32 xtal; 48 36 }; 49 37 50 38 #endif
+3 -4
drivers/media/dvb-frontends/mn88473_priv.h
··· 27 27 struct mn88473_dev { 28 28 struct i2c_client *client[3]; 29 29 struct regmap *regmap[3]; 30 - struct dvb_frontend fe; 30 + struct dvb_frontend frontend; 31 31 u16 i2c_wr_max; 32 - enum fe_delivery_system delivery_system; 33 - bool warm; /* FW running */ 34 - u32 xtal; 32 + bool active; 33 + u32 clk; 35 34 }; 36 35 37 36 #endif