]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
V4L/DVB (9584): Support different GPIO/GPO registers for newer devices
authorDevin Heitmueller <devin.heitmueller@gmail.com>
Wed, 12 Nov 2008 05:05:06 +0000 (02:05 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Mon, 29 Dec 2008 19:53:32 +0000 (17:53 -0200)
Empia moved the location of the GPIO/GPO registers in newer devices.  Add the
ability to specify the relocated registers (including caching of register
contents).

Thanks for Ray Lu from Empia for providing the em2874 datasheet.

Signed-off-by: Devin Heitmueller <devin.heitmueller@gmail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/video/em28xx/em28xx-cards.c
drivers/media/video/em28xx/em28xx-core.c
drivers/media/video/em28xx/em28xx-reg.h
drivers/media/video/em28xx/em28xx.h

index 90389270389b2655ba22c9c974e577f33f627b03..791ab2cc7d8fefb0dcdc3d86c13da6c901eb4020 100644 (file)
@@ -1312,11 +1312,13 @@ void em28xx_pre_card_setup(struct em28xx *dev)
 {
        int rc;
 
-       rc = em28xx_read_reg(dev, EM2880_R04_GPO);
-       if (rc >= 0)
-               dev->reg_gpo = rc;
+       /* Set the default GPO/GPIO for legacy devices */
+       dev->reg_gpo_num = EM2880_R04_GPO;
+       dev->reg_gpio_num = EM28XX_R08_GPIO;
 
        dev->wait_after_write = 5;
+
+       /* Based on the Chip ID, set the device configuration */
        rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
        if (rc > 0) {
                dev->chip_id = rc;
@@ -1326,6 +1328,7 @@ void em28xx_pre_card_setup(struct em28xx *dev)
                        break;
                case CHIP_ID_EM2874:
                        em28xx_info("chip ID is em2874\n");
+                       dev->reg_gpio_num = EM2874_R80_GPIO;
                        dev->wait_after_write = 0;
                        break;
                case CHIP_ID_EM2883:
@@ -1336,6 +1339,12 @@ void em28xx_pre_card_setup(struct em28xx *dev)
                        em28xx_info("em28xx chip ID = %d\n", rc);
                }
        }
+
+       /* Prepopulate cached GPO register content */
+       rc = em28xx_read_reg(dev, dev->reg_gpo_num);
+       if (rc >= 0)
+               dev->reg_gpo = rc;
+
        em28xx_set_model(dev);
 
        /* request some modules */
index 15e2b525310db9af34bf6377f573691ed04c1314..094548903cb9bd7916b3a4c7ed6db0e620d571a2 100644 (file)
@@ -187,9 +187,9 @@ int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len)
           Not sure what happens on reading GPO register.
         */
        if (rc >= 0) {
-               if (reg == EM2880_R04_GPO)
+               if (reg == dev->reg_gpo_num)
                        dev->reg_gpo = buf[0];
-               else if (reg == EM28XX_R08_GPIO)
+               else if (reg == dev->reg_gpio_num)
                        dev->reg_gpio = buf[0];
        }
 
@@ -208,9 +208,9 @@ static int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
        u8 newval;
 
        /* Uses cache for gpo/gpio registers */
-       if (reg == EM2880_R04_GPO)
+       if (reg == dev->reg_gpo_num)
                oldval = dev->reg_gpo;
-       else if (reg == EM28XX_R08_GPIO)
+       else if (reg == dev->reg_gpio_num)
                oldval = dev->reg_gpio;
        else
                oldval = em28xx_read_reg(dev, reg);
index 0892df17f1831a48be2f67a1e9d85b09c078ec91..1f0e8a34e8c9b1fa9f88b2343a07c8d68c7fa8bc 100644 (file)
@@ -76,6 +76,9 @@
 #define EM28XX_R10_LINE_IN_AC97    0x10
 #define EM28XX_R14_VIDEO_AC97  0x14
 
+/* em2874 registers */
+#define EM2874_R80_GPIO         0x80
+
 /* register settings */
 #define EM2800_AUDIO_SRC_TUNER  0x0d
 #define EM2800_AUDIO_SRC_LINE   0x0c
index fc2db0d60fcaf0675795c2d36f1383c0e44e7512..326208a9dd9ba216dab99ae66f6ee34d806df703 100644 (file)
@@ -471,6 +471,9 @@ struct em28xx {
 
        enum em28xx_mode mode;
 
+       /* register numbers for GPO/GPIO registers */
+       u16 reg_gpo_num, reg_gpio_num;
+
        /* Caches GPO and GPIO registers */
        unsigned char   reg_gpo, reg_gpio;