V4L/DVB (7934): cx18: move gpio_dir/val statics to the cx18 struct.
authorHans Verkuil <hverkuil@xs4all.nl>
Sun, 25 May 2008 17:34:36 +0000 (14:34 -0300)
committerMauro Carvalho Chehab <mchehab@infradead.org>
Thu, 5 Jun 2008 09:35:46 +0000 (06:35 -0300)
The gpio_dir/val statics cannot be global, they are card-specific.

Thanks to Andy Walls for pointing this out.

Signed-off-by: Hans Verkuil <hverkuil@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab@infradead.org>
drivers/media/video/cx18/cx18-driver.h
drivers/media/video/cx18/cx18-gpio.c

index 9c6a534..b943aea 100644 (file)
@@ -424,6 +424,10 @@ struct cx18 {
        struct mutex i2c_bus_lock[2];
        struct i2c_client *i2c_clients[I2C_CLIENTS_MAX];
 
+       /* gpio */
+       u32 gpio_dir;
+       u32 gpio_val;
+
        /* v4l2 and User settings */
 
        /* codec settings */
index 1e0d32b..2f324b8 100644 (file)
@@ -35,9 +35,6 @@
 #define CX18_REG_GPIO_OUT2   0xc78104
 #define CX18_REG_GPIO_DIR2   0xc7810c
 
-static u32 gpio_dir;
-static u32 gpio_val;
-
 /*
  * HVR-1600 GPIO pins, courtesy of Hauppauge:
  *
@@ -49,25 +46,28 @@ static u32 gpio_val;
 
 static void gpio_write(struct cx18 *cx)
 {
-       write_reg((gpio_dir & 0xffff) << 16, CX18_REG_GPIO_DIR1);
-       write_reg(((gpio_dir & 0xffff) << 16) | (gpio_val & 0xffff),
+       u32 dir = cx->gpio_dir;
+       u32 val = cx->gpio_val;
+
+       write_reg((dir & 0xffff) << 16, CX18_REG_GPIO_DIR1);
+       write_reg(((dir & 0xffff) << 16) | (val & 0xffff),
                        CX18_REG_GPIO_OUT1);
-       write_reg(gpio_dir & 0xffff0000, CX18_REG_GPIO_DIR2);
-       write_reg((gpio_dir & 0xffff0000) | ((gpio_val & 0xffff0000) >> 16),
+       write_reg(dir & 0xffff0000, CX18_REG_GPIO_DIR2);
+       write_reg((dir & 0xffff0000) | ((val & 0xffff0000) >> 16),
                        CX18_REG_GPIO_OUT2);
 }
 
 void cx18_gpio_init(struct cx18 *cx)
 {
-       gpio_dir = cx->card->gpio_init.direction;
-       gpio_val = cx->card->gpio_init.initial_value;
+       cx->gpio_dir = cx->card->gpio_init.direction;
+       cx->gpio_val = cx->card->gpio_init.initial_value;
 
        if (cx->card->xceive_pin) {
-               gpio_dir |= 1 << cx->card->xceive_pin;
-               gpio_val |= 1 << cx->card->xceive_pin;
+               cx->gpio_dir |= 1 << cx->card->xceive_pin;
+               cx->gpio_val |= 1 << cx->card->xceive_pin;
        }
 
-       if (gpio_dir == 0)
+       if (cx->gpio_dir == 0)
                return;
 
        CX18_DEBUG_INFO("GPIO initial dir: %08x/%08x out: %08x/%08x\n",
@@ -88,13 +88,12 @@ int cx18_reset_tuner_gpio(void *dev, int cmd, int value)
                return 0;
        CX18_DEBUG_INFO("Resetting tuner\n");
 
-       gpio_dir |= 1 << cx->card->xceive_pin;
-       gpio_val &= ~(1 << cx->card->xceive_pin);
+       cx->gpio_val &= ~(1 << cx->card->xceive_pin);
 
        gpio_write(cx);
        schedule_timeout_interruptible(msecs_to_jiffies(1));
 
-       gpio_val |= 1 << cx->card->xceive_pin;
+       cx->gpio_val |= 1 << cx->card->xceive_pin;
        gpio_write(cx);
        schedule_timeout_interruptible(msecs_to_jiffies(1));
        return 0;