V4L/DVB (10167): sms1xxx: add support for inverted gpio
authorMichael Krufky <mkrufky@linuxtv.org>
Fri, 28 Nov 2008 04:02:56 +0000 (01:02 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Fri, 2 Jan 2009 19:15:11 +0000 (17:15 -0200)
negative gpio values signify inverted polarity

Signed-off-by: Michael Krufky <mkrufky@linuxtv.org>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/dvb/siano/sms-cards.c

index fd62e0b856213d15029262c293f05a63cb1a9ee7..5a9882ffeb42d320966442f1be17b624703d5185 100644 (file)
@@ -131,9 +131,10 @@ struct sms_board *sms_get_board(int id)
        return &sms_boards[id];
 }
 
-static int sms_set_gpio(struct smscore_device_t *coredev, u32 pin, int enable)
+static int sms_set_gpio(struct smscore_device_t *coredev, int pin, int enable)
 {
-       int ret;
+       int lvl, ret;
+       u32 gpio;
        struct smscore_gpio_config gpioconfig = {
                .direction            = SMS_GPIO_DIRECTION_OUTPUT,
                .pullupdown           = SMS_GPIO_PULLUPDOWN_NONE,
@@ -145,12 +146,20 @@ static int sms_set_gpio(struct smscore_device_t *coredev, u32 pin, int enable)
        if (pin == 0)
                return -EINVAL;
 
-       ret = smscore_configure_gpio(coredev, pin, &gpioconfig);
+       if (pin < 0) {
+               /* inverted gpio */
+               gpio = pin * -1;
+               lvl = enable ? 0 : 1;
+       } else {
+               gpio = pin;
+               lvl = enable ? 1 : 0;
+       }
 
+       ret = smscore_configure_gpio(coredev, gpio, &gpioconfig);
        if (ret < 0)
                return ret;
 
-       return smscore_set_gpio(coredev, pin, enable);
+       return smscore_set_gpio(coredev, gpio, lvl);
 }
 
 int sms_board_setup(struct smscore_device_t *coredev)