diff options
Diffstat (limited to 'drivers/media/dvb/frontends/af9013.c')
-rw-r--r-- | drivers/media/dvb/frontends/af9013.c | 55 |
1 files changed, 25 insertions, 30 deletions
diff --git a/drivers/media/dvb/frontends/af9013.c b/drivers/media/dvb/frontends/af9013.c index ba25fa0b0fc2..345311c33383 100644 --- a/drivers/media/dvb/frontends/af9013.c +++ b/drivers/media/dvb/frontends/af9013.c | |||
@@ -1323,13 +1323,11 @@ static struct dvb_frontend_ops af9013_ops; | |||
1323 | 1323 | ||
1324 | static int af9013_download_firmware(struct af9013_state *state) | 1324 | static int af9013_download_firmware(struct af9013_state *state) |
1325 | { | 1325 | { |
1326 | int i, len, packets, remainder, ret; | 1326 | int i, len, remaining, ret; |
1327 | const struct firmware *fw; | 1327 | const struct firmware *fw; |
1328 | u16 addr = 0x5100; /* firmware start address */ | ||
1329 | u16 checksum = 0; | 1328 | u16 checksum = 0; |
1330 | u8 val; | 1329 | u8 val; |
1331 | u8 fw_params[4]; | 1330 | u8 fw_params[4]; |
1332 | u8 *data; | ||
1333 | u8 *fw_file = AF9013_DEFAULT_FIRMWARE; | 1331 | u8 *fw_file = AF9013_DEFAULT_FIRMWARE; |
1334 | 1332 | ||
1335 | msleep(100); | 1333 | msleep(100); |
@@ -1373,21 +1371,18 @@ static int af9013_download_firmware(struct af9013_state *state) | |||
1373 | if (ret) | 1371 | if (ret) |
1374 | goto error_release; | 1372 | goto error_release; |
1375 | 1373 | ||
1376 | #define FW_PACKET_MAX_DATA 16 | 1374 | #define FW_ADDR 0x5100 /* firmware start address */ |
1377 | 1375 | #define LEN_MAX 16 /* max packet size */ | |
1378 | packets = fw->size / FW_PACKET_MAX_DATA; | 1376 | for (remaining = fw->size; remaining > 0; remaining -= LEN_MAX) { |
1379 | remainder = fw->size % FW_PACKET_MAX_DATA; | 1377 | len = remaining; |
1380 | len = FW_PACKET_MAX_DATA; | 1378 | if (len > LEN_MAX) |
1381 | for (i = 0; i <= packets; i++) { | 1379 | len = LEN_MAX; |
1382 | if (i == packets) /* set size of the last packet */ | ||
1383 | len = remainder; | ||
1384 | |||
1385 | data = (u8 *)(fw->data + i * FW_PACKET_MAX_DATA); | ||
1386 | ret = af9013_write_ofsm_regs(state, addr, data, len); | ||
1387 | addr += FW_PACKET_MAX_DATA; | ||
1388 | 1380 | ||
1381 | ret = af9013_write_ofsm_regs(state, | ||
1382 | FW_ADDR + fw->size - remaining, | ||
1383 | (u8 *) &fw->data[fw->size - remaining], len); | ||
1389 | if (ret) { | 1384 | if (ret) { |
1390 | err("firmware download failed at %d with %d", i, ret); | 1385 | err("firmware download failed:%d", ret); |
1391 | goto error_release; | 1386 | goto error_release; |
1392 | } | 1387 | } |
1393 | } | 1388 | } |
@@ -1466,20 +1461,6 @@ struct dvb_frontend *af9013_attach(const struct af9013_config *config, | |||
1466 | state->i2c = i2c; | 1461 | state->i2c = i2c; |
1467 | memcpy(&state->config, config, sizeof(struct af9013_config)); | 1462 | memcpy(&state->config, config, sizeof(struct af9013_config)); |
1468 | 1463 | ||
1469 | /* chip version */ | ||
1470 | ret = af9013_read_reg_bits(state, 0xd733, 4, 4, &buf[2]); | ||
1471 | if (ret) | ||
1472 | goto error; | ||
1473 | |||
1474 | /* ROM version */ | ||
1475 | for (i = 0; i < 2; i++) { | ||
1476 | ret = af9013_read_reg(state, 0x116b + i, &buf[i]); | ||
1477 | if (ret) | ||
1478 | goto error; | ||
1479 | } | ||
1480 | deb_info("%s: chip version:%d ROM version:%d.%d\n", __func__, | ||
1481 | buf[2], buf[0], buf[1]); | ||
1482 | |||
1483 | /* download firmware */ | 1464 | /* download firmware */ |
1484 | if (state->config.output_mode != AF9013_OUTPUT_MODE_USB) { | 1465 | if (state->config.output_mode != AF9013_OUTPUT_MODE_USB) { |
1485 | ret = af9013_download_firmware(state); | 1466 | ret = af9013_download_firmware(state); |
@@ -1495,6 +1476,20 @@ struct dvb_frontend *af9013_attach(const struct af9013_config *config, | |||
1495 | } | 1476 | } |
1496 | info("firmware version:%d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3]); | 1477 | info("firmware version:%d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3]); |
1497 | 1478 | ||
1479 | /* chip version */ | ||
1480 | ret = af9013_read_reg_bits(state, 0xd733, 4, 4, &buf[2]); | ||
1481 | if (ret) | ||
1482 | goto error; | ||
1483 | |||
1484 | /* ROM version */ | ||
1485 | for (i = 0; i < 2; i++) { | ||
1486 | ret = af9013_read_reg(state, 0x116b + i, &buf[i]); | ||
1487 | if (ret) | ||
1488 | goto error; | ||
1489 | } | ||
1490 | deb_info("%s: chip version:%d ROM version:%d.%d\n", __func__, | ||
1491 | buf[2], buf[0], buf[1]); | ||
1492 | |||
1498 | /* settings for mp2if */ | 1493 | /* settings for mp2if */ |
1499 | if (state->config.output_mode == AF9013_OUTPUT_MODE_USB) { | 1494 | if (state->config.output_mode == AF9013_OUTPUT_MODE_USB) { |
1500 | /* AF9015 split PSB to 1.5k + 0.5k */ | 1495 | /* AF9015 split PSB to 1.5k + 0.5k */ |