[media] cx231xx: fix gpio big-endian problems
authorHans Verkuil <hans.verkuil@cisco.com>
Fri, 8 Feb 2013 16:13:12 +0000 (13:13 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Tue, 5 Mar 2013 17:26:07 +0000 (14:26 -0300)
Tested on my big-endian ppc-based test machine.

Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/usb/cx231xx/cx231xx-avcore.c
drivers/media/usb/cx231xx/cx231xx.h

index 3f26f64d7bf47dc673d94199394302e5b22d1838..2e51fb9fd21c87effd1f5cbaa418009a1759807d 100644 (file)
@@ -2638,20 +2638,23 @@ EXPORT_SYMBOL_GPL(cx231xx_capture_start);
 /*****************************************************************************
 *                   G P I O   B I T control functions                        *
 ******************************************************************************/
-int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val)
+static int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u32 gpio_val)
 {
        int status = 0;
 
-       status = cx231xx_send_gpio_cmd(dev, gpio_bit, gpio_val, 4, 0, 0);
+       gpio_val = cpu_to_le32(gpio_val);
+       status = cx231xx_send_gpio_cmd(dev, gpio_bit, (u8 *)&gpio_val, 4, 0, 0);
 
        return status;
 }
 
-int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val)
+static int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u32 *gpio_val)
 {
+       u32 tmp;
        int status = 0;
 
-       status = cx231xx_send_gpio_cmd(dev, gpio_bit, gpio_val, 4, 0, 1);
+       status = cx231xx_send_gpio_cmd(dev, gpio_bit, (u8 *)&tmp, 4, 0, 1);
+       *gpio_val = le32_to_cpu(tmp);
 
        return status;
 }
@@ -2683,7 +2686,7 @@ int cx231xx_set_gpio_direction(struct cx231xx *dev,
        else
                value = dev->gpio_dir | (1 << pin_number);
 
-       status = cx231xx_set_gpio_bit(dev, value, (u8 *) &dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, value, dev->gpio_val);
 
        /* cache the value for future */
        dev->gpio_dir = value;
@@ -2717,7 +2720,7 @@ int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value)
                value = dev->gpio_dir | (1 << pin_number);
                dev->gpio_dir = value;
                status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
-                                             (u8 *) &dev->gpio_val);
+                                             dev->gpio_val);
                value = 0;
        }
 
@@ -2730,7 +2733,7 @@ int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value)
        dev->gpio_val = value;
 
        /* toggle bit0 of GP_IO */
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        return status;
 }
@@ -2748,7 +2751,7 @@ int cx231xx_gpio_i2c_start(struct cx231xx *dev)
        dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
        dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;
 
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
        if (status < 0)
                return -EINVAL;
 
@@ -2756,7 +2759,7 @@ int cx231xx_gpio_i2c_start(struct cx231xx *dev)
        dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
        dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
 
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
        if (status < 0)
                return -EINVAL;
 
@@ -2764,7 +2767,7 @@ int cx231xx_gpio_i2c_start(struct cx231xx *dev)
        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
        dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
 
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
        if (status < 0)
                return -EINVAL;
 
@@ -2782,7 +2785,7 @@ int cx231xx_gpio_i2c_end(struct cx231xx *dev)
        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
        dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
 
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
        if (status < 0)
                return -EINVAL;
 
@@ -2790,7 +2793,7 @@ int cx231xx_gpio_i2c_end(struct cx231xx *dev)
        dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
        dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
 
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
        if (status < 0)
                return -EINVAL;
 
@@ -2800,7 +2803,7 @@ int cx231xx_gpio_i2c_end(struct cx231xx *dev)
        dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
 
        status =
-           cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+           cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
        if (status < 0)
                return -EINVAL;
 
@@ -2822,33 +2825,33 @@ int cx231xx_gpio_i2c_write_byte(struct cx231xx *dev, u8 data)
                        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
                        dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
                        status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
-                                                     (u8 *)&dev->gpio_val);
+                                                     dev->gpio_val);
 
                        /* set SCL to output 1; set SDA to output 0     */
                        dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
                        status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
-                                                     (u8 *)&dev->gpio_val);
+                                                     dev->gpio_val);
 
                        /* set SCL to output 0; set SDA to output 0     */
                        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
                        status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
-                                                     (u8 *)&dev->gpio_val);
+                                                     dev->gpio_val);
                } else {
                        /* set SCL to output 0; set SDA to output 1     */
                        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
                        dev->gpio_val |= 1 << dev->board.tuner_sda_gpio;
                        status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
-                                                     (u8 *)&dev->gpio_val);
+                                                     dev->gpio_val);
 
                        /* set SCL to output 1; set SDA to output 1     */
                        dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
                        status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
-                                                     (u8 *)&dev->gpio_val);
+                                                     dev->gpio_val);
 
                        /* set SCL to output 0; set SDA to output 1     */
                        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
                        status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
-                                                     (u8 *)&dev->gpio_val);
+                                                     dev->gpio_val);
                }
        }
        return status;
@@ -2867,17 +2870,17 @@ int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf)
                /* set SCL to output 0; set SDA to input */
                dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
                status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
-                                             (u8 *)&dev->gpio_val);
+                                             dev->gpio_val);
 
                /* set SCL to output 1; set SDA to input */
                dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
                status = cx231xx_set_gpio_bit(dev, dev->gpio_dir,
-                                             (u8 *)&dev->gpio_val);
+                                             dev->gpio_val);
 
                /* get SDA data bit */
                gpio_logic_value = dev->gpio_val;
                status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
-                                             (u8 *)&dev->gpio_val);
+                                             &dev->gpio_val);
                if ((dev->gpio_val & (1 << dev->board.tuner_sda_gpio)) != 0)
                        value |= (1 << (8 - i - 1));
 
@@ -2888,7 +2891,7 @@ int cx231xx_gpio_i2c_read_byte(struct cx231xx *dev, u8 *buf)
           !!!set SDA to input, never to modify SDA direction at
           the same times */
        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        /* store the value */
        *buf = value & 0xff;
@@ -2909,12 +2912,12 @@ int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev)
        dev->gpio_dir &= ~(1 << dev->board.tuner_scl_gpio);
 
        gpio_logic_value = dev->gpio_val;
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        do {
                msleep(2);
                status = cx231xx_get_gpio_bit(dev, dev->gpio_dir,
-                                             (u8 *)&dev->gpio_val);
+                                             &dev->gpio_val);
                nCnt--;
        } while (((dev->gpio_val &
                          (1 << dev->board.tuner_scl_gpio)) == 0) &&
@@ -2929,7 +2932,7 @@ int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev)
         * through clock stretch, slave has given a SCL signal,
         * so the SDA data can be directly read.
         */
-       status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_get_gpio_bit(dev, dev->gpio_dir, &dev->gpio_val);
 
        if ((dev->gpio_val & 1 << dev->board.tuner_sda_gpio) == 0) {
                dev->gpio_val = gpio_logic_value;
@@ -2945,7 +2948,7 @@ int cx231xx_gpio_i2c_read_ack(struct cx231xx *dev)
        dev->gpio_val = gpio_logic_value;
        dev->gpio_dir |= (1 << dev->board.tuner_scl_gpio);
        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        return status;
 }
@@ -2956,24 +2959,24 @@ int cx231xx_gpio_i2c_write_ack(struct cx231xx *dev)
 
        /* set SDA to ouput */
        dev->gpio_dir |= 1 << dev->board.tuner_sda_gpio;
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        /* set SCL = 0 (output); set SDA = 0 (output) */
        dev->gpio_val &= ~(1 << dev->board.tuner_sda_gpio);
        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        /* set SCL = 1 (output); set SDA = 0 (output) */
        dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        /* set SCL = 0 (output); set SDA = 0 (output) */
        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        /* set SDA to input,and then the slave will read data from SDA. */
        dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        return status;
 }
@@ -2985,15 +2988,15 @@ int cx231xx_gpio_i2c_write_nak(struct cx231xx *dev)
        /* set scl to output ; set sda to input */
        dev->gpio_dir |= 1 << dev->board.tuner_scl_gpio;
        dev->gpio_dir &= ~(1 << dev->board.tuner_sda_gpio);
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        /* set scl to output 0; set sda to input */
        dev->gpio_val &= ~(1 << dev->board.tuner_scl_gpio);
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        /* set scl to output 1; set sda to input */
        dev->gpio_val |= 1 << dev->board.tuner_scl_gpio;
-       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, (u8 *)&dev->gpio_val);
+       status = cx231xx_set_gpio_bit(dev, dev->gpio_dir, dev->gpio_val);
 
        return status;
 }
index 0f92fd1ea7947de5ed608b49ff2fe625a0076ae2..a8e50d2d491ca305f8f1c6d6e7027e732ffe094a 100644 (file)
@@ -845,8 +845,6 @@ int cx231xx_send_usb_command(struct cx231xx_i2c *i2c_bus,
 /* Gpio related functions */
 int cx231xx_send_gpio_cmd(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val,
                          u8 len, u8 request, u8 direction);
-int cx231xx_set_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val);
-int cx231xx_get_gpio_bit(struct cx231xx *dev, u32 gpio_bit, u8 *gpio_val);
 int cx231xx_set_gpio_value(struct cx231xx *dev, int pin_number, int pin_value);
 int cx231xx_set_gpio_direction(struct cx231xx *dev, int pin_number,
                               int pin_value);