[media] siano: Configure board's mtu and xtal
authorMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 8 Mar 2013 23:48:42 +0000 (20:48 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Thu, 21 Mar 2013 10:45:25 +0000 (07:45 -0300)
Backported from Doron Cohen's patch:
http://patchwork.linuxtv.org/patch/7889/

Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/common/siano/smscoreapi.c

index 67d0319..6b53367 100644 (file)
@@ -824,6 +824,57 @@ static int smscore_init_ir(struct smscore_device_t *coredev)
        return 0;
 }
 
+/**
+ * configures device features according to board configuration structure.
+ *
+ * @param coredev pointer to a coredev object returned by
+ *                smscore_register_device
+ *
+ * @return 0 on success, <0 on error.
+ */
+int smscore_configure_board(struct smscore_device_t *coredev)
+{
+       struct sms_board *board;
+
+       board = sms_get_board(coredev->board_id);
+       if (!board) {
+               sms_err("no board configuration exist.");
+               return -EINVAL;
+       }
+
+       if (board->mtu) {
+               struct SmsMsgData_ST MtuMsg;
+               sms_debug("set max transmit unit %d", board->mtu);
+
+               MtuMsg.xMsgHeader.msgSrcId = 0;
+               MtuMsg.xMsgHeader.msgDstId = HIF_TASK;
+               MtuMsg.xMsgHeader.msgFlags = 0;
+               MtuMsg.xMsgHeader.msgType = MSG_SMS_SET_MAX_TX_MSG_LEN_REQ;
+               MtuMsg.xMsgHeader.msgLength = sizeof(MtuMsg);
+               MtuMsg.msgData[0] = board->mtu;
+
+               smsendian_handle_tx_message((struct SmsMsgHdr_ST *)&MtuMsg);
+               coredev->sendrequest_handler(coredev->context, &MtuMsg,
+                                            sizeof(MtuMsg));
+       }
+
+       if (board->crystal) {
+               struct SmsMsgData_ST CrysMsg;
+               sms_debug("set crystal value %d", board->crystal);
+
+               SMS_INIT_MSG(&CrysMsg.xMsgHeader,
+                               MSG_SMS_NEW_CRYSTAL_REQ,
+                               sizeof(CrysMsg));
+               CrysMsg.msgData[0] = board->crystal;
+
+               smsendian_handle_tx_message((struct SmsMsgHdr_S *)&CrysMsg);
+               coredev->sendrequest_handler(coredev->context, &CrysMsg,
+                                            sizeof(CrysMsg));
+       }
+
+       return 0;
+}
+
 /**
  * sets initial device mode and notifies client hotplugs that device is ready
  *
@@ -840,6 +891,11 @@ int smscore_start_device(struct smscore_device_t *coredev)
                sms_info("set device mode faile , rc %d", rc);
                return rc;
        }
+       rc = smscore_configure_board(coredev);
+       if (rc < 0) {
+               sms_info("configure board failed , rc %d", rc);
+               return rc;
+       }
 
        kmutex_lock(&g_smscore_deviceslock);