[media] em28xx: improve em2820-em2873/83 GPIO port register definitions and descriptions
authorFrank Schaefer <fschaefer.oss@googlemail.com>
Mon, 3 Jun 2013 17:12:03 +0000 (14:12 -0300)
committerMauro Carvalho Chehab <mchehab@redhat.com>
Wed, 19 Jun 2013 14:41:52 +0000 (11:41 -0300)
- add definition for GPIO register 0x09 (reading/input)
- extend the information the chip variants that support GPIO registers 0x08/0x09
- rename EM28XX_R08_GPIO to EM2820_R08_GPIO_CTRL

Signed-off-by: Frank Schäfer <fschaefer.oss@googlemail.com>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
drivers/media/usb/em28xx/em28xx-cards.c
drivers/media/usb/em28xx/em28xx-dvb.c
drivers/media/usb/em28xx/em28xx-reg.h

index c0b853541f09a122aad41c4ee162bd4a52db3e3a..6ee4bed730dd19c5e5ed6a223f5422f0d6540e9b 100644 (file)
@@ -82,26 +82,26 @@ static void em28xx_pre_card_setup(struct em28xx *dev);
 
 /* Reset for the most [analog] boards */
 static struct em28xx_reg_seq default_analog[] = {
-       {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4,     10},
        {       -1,             -1,     -1,             -1},
 };
 
 /* Reset for the most [digital] boards */
 static struct em28xx_reg_seq default_digital[] = {
-       {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
        {       -1,             -1,     -1,             -1},
 };
 
 /* Board Hauppauge WinTV HVR 900 analog */
 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_analog[] = {
-       {EM28XX_R08_GPIO,       0x2d,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x2d,   ~EM_GPIO_4,     10},
        {0x05,                  0xff,   0x10,           10},
        {  -1,                  -1,     -1,             -1},
 };
 
 /* Board Hauppauge WinTV HVR 900 digital */
 static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
-       {EM28XX_R08_GPIO,       0x2e,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x2e,   ~EM_GPIO_4,     10},
        {EM2880_R04_GPO,        0x04,   0x0f,           10},
        {EM2880_R04_GPO,        0x0c,   0x0f,           10},
        { -1,                   -1,     -1,             -1},
@@ -109,14 +109,14 @@ static struct em28xx_reg_seq hauppauge_wintv_hvr_900_digital[] = {
 
 /* Board Hauppauge WinTV HVR 900 (R2) digital */
 static struct em28xx_reg_seq hauppauge_wintv_hvr_900R2_digital[] = {
-       {EM28XX_R08_GPIO,       0x2e,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x2e,   ~EM_GPIO_4,     10},
        {EM2880_R04_GPO,        0x0c,   0x0f,           10},
        { -1,                   -1,     -1,             -1},
 };
 
 /* Boards - EM2880 MSI DIGIVOX AD and EM2880_BOARD_MSI_DIGIVOX_AD_II */
 static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
-       {EM28XX_R08_GPIO,       0x69,   ~EM_GPIO_4,      10},
+       {EM2820_R08_GPIO_CTRL,       0x69,   ~EM_GPIO_4,         10},
        {       -1,             -1,     -1,              -1},
 };
 
@@ -127,11 +127,11 @@ static struct em28xx_reg_seq em2880_msi_digivox_ad_analog[] = {
 
 /* Board - EM2882 Kworld 315U digital */
 static struct em28xx_reg_seq em2882_kworld_315u_digital[] = {
-       {EM28XX_R08_GPIO,       0xff,   0xff,           10},
-       {EM28XX_R08_GPIO,       0xfe,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0xfe,   0xff,           10},
        {EM2880_R04_GPO,        0x04,   0xff,           10},
        {EM2880_R04_GPO,        0x0c,   0xff,           10},
-       {EM28XX_R08_GPIO,       0x7e,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0x7e,   0xff,           10},
        {  -1,                  -1,     -1,             -1},
 };
 
@@ -144,13 +144,13 @@ static struct em28xx_reg_seq em2882_kworld_315u_tuner_gpio[] = {
 };
 
 static struct em28xx_reg_seq kworld_330u_analog[] = {
-       {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4,     10},
        {EM2880_R04_GPO,        0x00,   0xff,           10},
        { -1,                   -1,     -1,             -1},
 };
 
 static struct em28xx_reg_seq kworld_330u_digital[] = {
-       {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
        {EM2880_R04_GPO,        0x08,   0xff,           10},
        { -1,                   -1,     -1,             -1},
 };
@@ -162,12 +162,12 @@ static struct em28xx_reg_seq kworld_330u_digital[] = {
    GOP3  - s5h1409 reset
  */
 static struct em28xx_reg_seq evga_indtube_analog[] = {
-       {EM28XX_R08_GPIO,       0x79,   0xff,           60},
+       {EM2820_R08_GPIO_CTRL,  0x79,   0xff,           60},
        {       -1,             -1,     -1,             -1},
 };
 
 static struct em28xx_reg_seq evga_indtube_digital[] = {
-       {EM28XX_R08_GPIO,       0x7a,   0xff,            1},
+       {EM2820_R08_GPIO_CTRL,  0x7a,   0xff,            1},
        {EM2880_R04_GPO,        0x04,   0xff,           10},
        {EM2880_R04_GPO,        0x0c,   0xff,            1},
        { -1,                   -1,     -1,             -1},
@@ -185,31 +185,31 @@ static struct em28xx_reg_seq evga_indtube_digital[] = {
  * EM_GPIO_7 - currently unknown
  */
 static struct em28xx_reg_seq kworld_a340_digital[] = {
-       {EM28XX_R08_GPIO,       0x6d,           ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x6d,           ~EM_GPIO_4,     10},
        { -1,                   -1,             -1,             -1},
 };
 
 /* Pinnacle Hybrid Pro eb1a:2881 */
 static struct em28xx_reg_seq pinnacle_hybrid_pro_analog[] = {
-       {EM28XX_R08_GPIO,       0xfd,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0xfd,   ~EM_GPIO_4,     10},
        {       -1,             -1,     -1,             -1},
 };
 
 static struct em28xx_reg_seq pinnacle_hybrid_pro_digital[] = {
-       {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
        {EM2880_R04_GPO,        0x04,   0xff,          100},/* zl10353 reset */
        {EM2880_R04_GPO,        0x0c,   0xff,            1},
        {       -1,             -1,     -1,             -1},
 };
 
 static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_analog[] = {
-       {EM28XX_R08_GPIO,       0x6d,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x6d,   ~EM_GPIO_4,     10},
        {EM2880_R04_GPO,        0x00,   0xff,           10},
        { -1,                   -1,     -1,             -1},
 };
 
 static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
-       {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
        {EM2880_R04_GPO,        0x08,   0xff,           10},
        { -1,                   -1,     -1,             -1},
 };
@@ -218,66 +218,66 @@ static struct em28xx_reg_seq terratec_cinergy_USB_XS_FR_digital[] = {
    GPIO4 - CU1216L NIM
    Other GPIOs seems to be don't care. */
 static struct em28xx_reg_seq reddo_dvb_c_usb_box[] = {
-       {EM28XX_R08_GPIO,       0xfe,   0xff,           10},
-       {EM28XX_R08_GPIO,       0xde,   0xff,           10},
-       {EM28XX_R08_GPIO,       0xfe,   0xff,           10},
-       {EM28XX_R08_GPIO,       0xff,   0xff,           10},
-       {EM28XX_R08_GPIO,       0x7f,   0xff,           10},
-       {EM28XX_R08_GPIO,       0x6f,   0xff,           10},
-       {EM28XX_R08_GPIO,       0xff,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0xfe,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0xde,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0xfe,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0x7f,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0x6f,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
        {-1,                    -1,     -1,             -1},
 };
 
 /* Callback for the most boards */
 static struct em28xx_reg_seq default_tuner_gpio[] = {
-       {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
-       {EM28XX_R08_GPIO,       0,              EM_GPIO_4,      10},
-       {EM28XX_R08_GPIO,       EM_GPIO_4,      EM_GPIO_4,      10},
+       {EM2820_R08_GPIO_CTRL,  EM_GPIO_4,      EM_GPIO_4,      10},
+       {EM2820_R08_GPIO_CTRL,  0,              EM_GPIO_4,      10},
+       {EM2820_R08_GPIO_CTRL,  EM_GPIO_4,      EM_GPIO_4,      10},
        {  -1,                  -1,             -1,             -1},
 };
 
 /* Mute/unmute */
 static struct em28xx_reg_seq compro_unmute_tv_gpio[] = {
-       {EM28XX_R08_GPIO,       5,              7,              10},
+       {EM2820_R08_GPIO_CTRL,  5,              7,              10},
        {  -1,                  -1,             -1,             -1},
 };
 
 static struct em28xx_reg_seq compro_unmute_svid_gpio[] = {
-       {EM28XX_R08_GPIO,       4,              7,              10},
+       {EM2820_R08_GPIO_CTRL,  4,              7,              10},
        {  -1,                  -1,             -1,             -1},
 };
 
 static struct em28xx_reg_seq compro_mute_gpio[] = {
-       {EM28XX_R08_GPIO,       6,              7,              10},
+       {EM2820_R08_GPIO_CTRL,  6,              7,              10},
        {  -1,                  -1,             -1,             -1},
 };
 
 /* Terratec AV350 */
 static struct em28xx_reg_seq terratec_av350_mute_gpio[] = {
-       {EM28XX_R08_GPIO,       0xff,   0x7f,           10},
+       {EM2820_R08_GPIO_CTRL,  0xff,   0x7f,           10},
        {       -1,             -1,     -1,             -1},
 };
 
 static struct em28xx_reg_seq terratec_av350_unmute_gpio[] = {
-       {EM28XX_R08_GPIO,       0xff,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
        {       -1,             -1,     -1,             -1},
 };
 
 static struct em28xx_reg_seq silvercrest_reg_seq[] = {
-       {EM28XX_R08_GPIO,       0xff,   0xff,           10},
-       {EM28XX_R08_GPIO,       0x01,   0xf7,           10},
+       {EM2820_R08_GPIO_CTRL,  0xff,   0xff,           10},
+       {EM2820_R08_GPIO_CTRL,  0x01,   0xf7,           10},
        {       -1,             -1,     -1,             -1},
 };
 
 static struct em28xx_reg_seq vc211a_enable[] = {
-       {EM28XX_R08_GPIO,       0xff,   0x07,           10},
-       {EM28XX_R08_GPIO,       0xff,   0x0f,           10},
-       {EM28XX_R08_GPIO,       0xff,   0x0b,           10},
+       {EM2820_R08_GPIO_CTRL,  0xff,   0x07,           10},
+       {EM2820_R08_GPIO_CTRL,  0xff,   0x0f,           10},
+       {EM2820_R08_GPIO_CTRL,  0xff,   0x0b,           10},
        {       -1,             -1,     -1,             -1},
 };
 
 static struct em28xx_reg_seq dikom_dk300_digital[] = {
-       {EM28XX_R08_GPIO,       0x6e,   ~EM_GPIO_4,     10},
+       {EM2820_R08_GPIO_CTRL,  0x6e,   ~EM_GPIO_4,     10},
        {EM2880_R04_GPO,        0x08,   0xff,           10},
        { -1,                   -1,     -1,             -1},
 };
@@ -309,7 +309,7 @@ static struct em28xx_reg_seq pctv_290e[] = {
 
 #if 0
 static struct em28xx_reg_seq terratec_h5_gpio[] = {
-       {EM28XX_R08_GPIO,       0xff,   0xff,   10},
+       {EM2820_R08_GPIO_CTRL,          0xff,   0xff,   10},
        {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   100},
        {EM2874_R80_GPIO_P0_CTRL,       0xf2,   0xff,   50},
        {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   50},
@@ -2299,9 +2299,9 @@ static void em28xx_pre_card_setup(struct em28xx *dev)
                break;
        case EM2861_BOARD_KWORLD_PVRTV_300U:
        case EM2880_BOARD_KWORLD_DVB_305U:
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x6d);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x6d);
                msleep(10);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0x7d);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0x7d);
                msleep(10);
                break;
        case EM2870_BOARD_COMPRO_VIDEOMATE:
@@ -2311,45 +2311,45 @@ static void em28xx_pre_card_setup(struct em28xx *dev)
                msleep(10);
                em28xx_write_reg(dev, EM2880_R04_GPO, 0x01);
                msleep(10);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
                mdelay(70);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
                mdelay(70);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xdc);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xdc);
                mdelay(70);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfc);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfc);
                mdelay(70);
                break;
        case EM2870_BOARD_TERRATEC_XS_MT2060:
                /* this device needs some gpio writes to get the DVB-T
                   demod work */
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
                mdelay(70);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
                mdelay(70);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
                mdelay(70);
                break;
        case EM2870_BOARD_PINNACLE_PCTV_DVB:
                /* this device needs some gpio writes to get the
                   DVB-T demod work */
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
                mdelay(70);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xde);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xde);
                mdelay(70);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
                mdelay(70);
                break;
        case EM2820_BOARD_GADMEI_UTV310:
        case EM2820_BOARD_MSI_VOX_USB_2:
                /* enables audio for that devices */
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
                break;
 
        case EM2882_BOARD_KWORLD_ATSC_315U:
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
                msleep(10);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
                msleep(10);
                em28xx_write_reg(dev, EM2880_R04_GPO, 0x00);
                msleep(10);
@@ -2375,13 +2375,13 @@ static void em28xx_pre_card_setup(struct em28xx *dev)
                break;
 
        case EM2820_BOARD_IODATA_GVMVP_SZ:
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
                msleep(70);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
                msleep(10);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfe);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfe);
                msleep(70);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
                msleep(70);
                break;
        }
@@ -2677,12 +2677,12 @@ static void em28xx_card_setup(struct em28xx *dev)
        case EM2882_BOARD_KWORLD_ATSC_315U:
                em28xx_write_reg(dev, 0x0d, 0x42);
                msleep(10);
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xfd);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xfd);
                msleep(10);
                break;
        case EM2820_BOARD_KWORLD_PVRTV2800RF:
                /* GPIO enables sound on KWORLD PVR TV 2800RF */
-               em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf9);
+               em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf9);
                break;
        case EM2820_BOARD_UNKNOWN:
        case EM2800_BOARD_UNKNOWN:
@@ -2898,7 +2898,7 @@ static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
 
        /* Set the default GPO/GPIO for legacy devices */
        dev->reg_gpo_num = EM2880_R04_GPO;
-       dev->reg_gpio_num = EM28XX_R08_GPIO;
+       dev->reg_gpio_num = EM2820_R08_GPIO_CTRL;
 
        dev->wait_after_write = 5;
 
@@ -3086,7 +3086,7 @@ static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
 
        if (dev->board.has_msp34xx) {
                /* Send a reset to other chips via gpio */
-               retval = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xf7);
+               retval = em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xf7);
                if (retval < 0) {
                        em28xx_errdev("%s: em28xx_write_reg - "
                                      "msp34xx(1) failed! error [%d]\n",
@@ -3095,7 +3095,7 @@ static int em28xx_init_dev(struct em28xx *dev, struct usb_device *udev,
                }
                msleep(3);
 
-               retval = em28xx_write_reg(dev, EM28XX_R08_GPIO, 0xff);
+               retval = em28xx_write_reg(dev, EM2820_R08_GPIO_CTRL, 0xff);
                if (retval < 0) {
                        em28xx_errdev("%s: em28xx_write_reg - "
                                      "msp34xx(2) failed! error [%d]\n",
index 69aed825f583926c2e75d0d296a7ebc4e98ae135..bb1e8dca80cdfc88dff7919b70da410aa617d1c0 100644 (file)
@@ -487,7 +487,7 @@ static void terratec_h5_init(struct em28xx *dev)
 {
        int i;
        struct em28xx_reg_seq terratec_h5_init[] = {
-               {EM28XX_R08_GPIO,       0xff,   0xff,   10},
+               {EM2820_R08_GPIO_CTRL,          0xff,   0xff,   10},
                {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   100},
                {EM2874_R80_GPIO_P0_CTRL,       0xf2,   0xff,   50},
                {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   100},
@@ -543,7 +543,7 @@ static void terratec_htc_stick_init(struct em28xx *dev)
         * 0xb6: unknown (does not affect DVB-T).
         */
        struct em28xx_reg_seq terratec_htc_stick_init[] = {
-               {EM28XX_R08_GPIO,       0xff,   0xff,   10},
+               {EM2820_R08_GPIO_CTRL,          0xff,   0xff,   10},
                {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   100},
                {EM2874_R80_GPIO_P0_CTRL,       0xe6,   0xff,   50},
                {EM2874_R80_GPIO_P0_CTRL,       0xf6,   0xff,   100},
@@ -590,7 +590,7 @@ static void terratec_htc_usb_xs_init(struct em28xx *dev)
        int i;
 
        struct em28xx_reg_seq terratec_htc_usb_xs_init[] = {
-               {EM28XX_R08_GPIO,       0xff,   0xff,   10},
+               {EM2820_R08_GPIO_CTRL,          0xff,   0xff,   10},
                {EM2874_R80_GPIO_P0_CTRL,       0xb2,   0xff,   100},
                {EM2874_R80_GPIO_P0_CTRL,       0xb2,   0xff,   50},
                {EM2874_R80_GPIO_P0_CTRL,       0xb6,   0xff,   100},
index 0233c5bedc55118442b5ff22d0f29503741460a0..af39ddbe01e0f4cefe8cd5d4deb48945d74c4b26 100644 (file)
@@ -49,8 +49,9 @@
 
 
 /* GPIO/GPO registers */
-#define EM2880_R04_GPO 0x04    /* em2880-em2883 only */
-#define EM28XX_R08_GPIO        0x08    /* em2820 or upper */
+#define EM2880_R04_GPO         0x04    /* em2880-em2883 only */
+#define EM2820_R08_GPIO_CTRL   0x08    /* em2820-em2873/83 only */
+#define EM2820_R09_GPIO_STATE  0x09    /* em2820-em2873/83 only */
 
 #define EM28XX_R06_I2C_CLK     0x06