V4L/DVB (9734): sms1xxx: add functions to configure and set gpio
authorMichael Krufky <mkrufky@linuxtv.org>
Sun, 16 Nov 2008 21:01:58 +0000 (18:01 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 29 Dec 2008 19:53:40 +0000 (17:53 -0200)
Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/siano/smscoreapi.c
drivers/media/dvb/siano/smscoreapi.h

index 6576fbb40fc67eb8fcfce1205873f0051ce68fd7..b0e8bcb1238daa97b9bf6f351e131cf1441cbea5 100644 (file)
@@ -1187,6 +1187,76 @@ int smsclient_sendrequest(struct smscore_client_t *client,
 }
 
 
+int smscore_configure_gpio(struct smscore_device_t *coredev, u32 pin,
+                          struct smscore_gpio_config *pinconfig)
+{
+       struct {
+               struct SmsMsgHdr_ST hdr;
+               u32 data[6];
+       } msg;
+
+       if (coredev->device_flags & SMS_DEVICE_FAMILY2) {
+               msg.hdr.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
+               msg.hdr.msgDstId = HIF_TASK;
+               msg.hdr.msgFlags = 0;
+               msg.hdr.msgType  = MSG_SMS_GPIO_CONFIG_EX_REQ;
+               msg.hdr.msgLength = sizeof(msg);
+
+               msg.data[0] = pin;
+               msg.data[1] = pinconfig->pullupdown;
+
+               /* Convert slew rate for Nova: Fast(0) = 3 / Slow(1) = 0; */
+               msg.data[2] = pinconfig->outputslewrate == 0 ? 3 : 0;
+
+               switch (pinconfig->outputdriving) {
+               case SMS_GPIO_OUTPUTDRIVING_16mA:
+                       msg.data[3] = 7; /* Nova - 16mA */
+                       break;
+               case SMS_GPIO_OUTPUTDRIVING_12mA:
+                       msg.data[3] = 5; /* Nova - 11mA */
+                       break;
+               case SMS_GPIO_OUTPUTDRIVING_8mA:
+                       msg.data[3] = 3; /* Nova - 7mA */
+                       break;
+               case SMS_GPIO_OUTPUTDRIVING_4mA:
+               default:
+                       msg.data[3] = 2; /* Nova - 4mA */
+                       break;
+               }
+
+               msg.data[4] = pinconfig->direction;
+               msg.data[5] = 0;
+       } else /* TODO: SMS_DEVICE_FAMILY1 */
+               return -EINVAL;
+
+       return coredev->sendrequest_handler(coredev->context,
+                                           &msg, sizeof(msg));
+}
+
+int smscore_set_gpio(struct smscore_device_t *coredev, u32 pin, int level)
+{
+       struct {
+               struct SmsMsgHdr_ST hdr;
+               u32 data[3];
+       } msg;
+
+       if (pin > MAX_GPIO_PIN_NUMBER)
+               return -EINVAL;
+
+       msg.hdr.msgSrcId = DVBT_BDA_CONTROL_MSG_ID;
+       msg.hdr.msgDstId = HIF_TASK;
+       msg.hdr.msgFlags = 0;
+       msg.hdr.msgType  = MSG_SMS_GPIO_SET_LEVEL_REQ;
+       msg.hdr.msgLength = sizeof(msg);
+
+       msg.data[0] = pin;
+       msg.data[1] = level ? 1 : 0;
+       msg.data[2] = 0;
+
+       return coredev->sendrequest_handler(coredev->context,
+                                           &msg, sizeof(msg));
+}
+
 static int __init smscore_module_init(void)
 {
        int rc = 0;
index 8d973f726fb835c565b30a827828372d8e4eeedc..27b0c4139dc0908a978169da4753d4f18b0d9682 100644 (file)
@@ -186,6 +186,8 @@ struct smsclient_params_t {
 #define MSG_SW_RELOAD_EXEC_REQ                         704
 #define MSG_SW_RELOAD_EXEC_RES                         705
 #define MSG_SMS_SPI_INT_LINE_SET_REQ           710
+#define MSG_SMS_GPIO_CONFIG_EX_REQ                     712
+#define MSG_SMS_GPIO_CONFIG_EX_RES                     713
 #define MSG_SMS_ISDBT_TUNE_REQ                         776
 #define MSG_SMS_ISDBT_TUNE_RES                         777
 
@@ -341,6 +343,32 @@ struct SmsMsgStatisticsInfo_ST {
 };
 
 
+struct smscore_gpio_config {
+#define SMS_GPIO_DIRECTION_INPUT  0
+#define SMS_GPIO_DIRECTION_OUTPUT 1
+       u8 direction;
+
+#define SMS_GPIO_PULLUPDOWN_NONE     0
+#define SMS_GPIO_PULLUPDOWN_PULLDOWN 1
+#define SMS_GPIO_PULLUPDOWN_PULLUP   2
+#define SMS_GPIO_PULLUPDOWN_KEEPER   3
+       u8 pullupdown;
+
+#define SMS_GPIO_INPUTCHARACTERISTICS_NORMAL  0
+#define SMS_GPIO_INPUTCHARACTERISTICS_SCHMITT 1
+       u8 inputcharacteristics;
+
+#define SMS_GPIO_OUTPUTSLEWRATE_FAST 0
+#define SMS_GPIO_OUTPUTSLEWRATE_SLOW 1
+       u8 outputslewrate;
+
+#define SMS_GPIO_OUTPUTDRIVING_4mA  0
+#define SMS_GPIO_OUTPUTDRIVING_8mA  1
+#define SMS_GPIO_OUTPUTDRIVING_12mA 2
+#define SMS_GPIO_OUTPUTDRIVING_16mA 3
+       u8 outputdriving;
+};
+
 struct smsdvb_client_t {
        struct list_head entry;
 
@@ -396,6 +424,10 @@ struct smscore_buffer_t *smscore_getbuffer(struct smscore_device_t *coredev);
 extern void smscore_putbuffer(struct smscore_device_t *coredev,
                              struct smscore_buffer_t *cb);
 
+int smscore_configure_gpio(struct smscore_device_t *coredev, u32 pin,
+                          struct smscore_gpio_config *pinconfig);
+int smscore_set_gpio(struct smscore_device_t *coredev, u32 pin, int level);
+
 void smscore_set_board_id(struct smscore_device_t *core, int id);
 int smscore_get_board_id(struct smscore_device_t *core);