aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMauro Carvalho Chehab <mchehab@redhat.com>2013-03-09 08:24:38 -0500
committerMauro Carvalho Chehab <mchehab@redhat.com>2013-03-21 06:45:36 -0400
commitfe802fd92d6abd1fce2ae8d03a073807d25e9453 (patch)
tree0bc5f4d3c40113e6225e9a548908f9c634aa5113 /drivers
parentdfbf021c9e6c9de2296eae7b4e89148e7f68b28e (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>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/media/common/siano/smscoreapi.c43
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 */
1290int 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 }