diff options
author | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-09 08:24:38 -0500 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab@redhat.com> | 2013-03-21 06:45:36 -0400 |
commit | fe802fd92d6abd1fce2ae8d03a073807d25e9453 (patch) | |
tree | 0bc5f4d3c40113e6225e9a548908f9c634aa5113 | |
parent | dfbf021c9e6c9de2296eae7b4e89148e7f68b28e (diff) |
[media] siano: call MSG_SMS_INIT_DEVICE_REQ
Newer firmwares seem to require an init device message. Apply
such change from Doron Cohen's patch:
http://patchwork.linuxtv.org/patch/7889/
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
-rw-r--r-- | drivers/media/common/siano/smscoreapi.c | 43 |
1 files changed, 42 insertions, 1 deletions
diff --git a/drivers/media/common/siano/smscoreapi.c b/drivers/media/common/siano/smscoreapi.c index 6b53367f74dc..9379ea7f8152 100644 --- a/drivers/media/common/siano/smscoreapi.c +++ b/drivers/media/common/siano/smscoreapi.c | |||
@@ -1279,6 +1279,42 @@ static char *smscore_get_fw_filename(struct smscore_device_t *coredev, | |||
1279 | } | 1279 | } |
1280 | 1280 | ||
1281 | /** | 1281 | /** |
1282 | * send init device request and wait for response | ||
1283 | * | ||
1284 | * @param coredev pointer to a coredev object returned by | ||
1285 | * smscore_register_device | ||
1286 | * @param mode requested mode of operation | ||
1287 | * | ||
1288 | * @return 0 on success, <0 on error. | ||
1289 | */ | ||
1290 | int smscore_init_device(struct smscore_device_t *coredev, int mode) | ||
1291 | { | ||
1292 | void *buffer; | ||
1293 | struct SmsMsgData_ST *msg; | ||
1294 | int rc = 0; | ||
1295 | |||
1296 | buffer = kmalloc(sizeof(struct SmsMsgData_ST) + | ||
1297 | SMS_DMA_ALIGNMENT, GFP_KERNEL | GFP_DMA); | ||
1298 | if (!buffer) { | ||
1299 | sms_err("Could not allocate buffer for init device message."); | ||
1300 | return -ENOMEM; | ||
1301 | } | ||
1302 | |||
1303 | msg = (struct SmsMsgData_ST *)SMS_ALIGN_ADDRESS(buffer); | ||
1304 | SMS_INIT_MSG(&msg->xMsgHeader, MSG_SMS_INIT_DEVICE_REQ, | ||
1305 | sizeof(struct SmsMsgData_ST)); | ||
1306 | msg->msgData[0] = mode; | ||
1307 | |||
1308 | smsendian_handle_tx_message((struct SmsMsgHdr_ST *)msg); | ||
1309 | rc = smscore_sendrequest_and_wait(coredev, msg, | ||
1310 | msg->xMsgHeader. msgLength, | ||
1311 | &coredev->init_device_done); | ||
1312 | |||
1313 | kfree(buffer); | ||
1314 | return rc; | ||
1315 | } | ||
1316 | |||
1317 | /** | ||
1282 | * calls device handler to change mode of operation | 1318 | * calls device handler to change mode of operation |
1283 | * NOTE: stellar/usb may disconnect when changing mode | 1319 | * NOTE: stellar/usb may disconnect when changing mode |
1284 | * | 1320 | * |
@@ -1340,8 +1376,13 @@ int smscore_set_device_mode(struct smscore_device_t *coredev, int mode) | |||
1340 | sms_info("mode %d is already supported by running firmware", | 1376 | sms_info("mode %d is already supported by running firmware", |
1341 | mode); | 1377 | mode); |
1342 | } | 1378 | } |
1379 | if (coredev->fw_version >= 0x800) { | ||
1380 | rc = smscore_init_device(coredev, mode); | ||
1381 | if (rc < 0) | ||
1382 | sms_err("device init failed, rc %d.", rc); | ||
1383 | } | ||
1343 | } else { | 1384 | } else { |
1344 | if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_DVBT_BDA) { | 1385 | if (mode < DEVICE_MODE_DVBT || mode > DEVICE_MODE_MAX) { |
1345 | sms_err("invalid mode specified %d", mode); | 1386 | sms_err("invalid mode specified %d", mode); |
1346 | return -EINVAL; | 1387 | return -EINVAL; |
1347 | } | 1388 | } |