Commit 6a1acc3b authored by Devin Heitmueller's avatar Devin Heitmueller Committed by Mauro Carvalho Chehab

V4L/DVB (9584): Support different GPIO/GPO registers for newer devices

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: default avatarDevin Heitmueller <devin.heitmueller@gmail.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@redhat.com>
parent 600bd7f0
...@@ -1312,11 +1312,13 @@ void em28xx_pre_card_setup(struct em28xx *dev) ...@@ -1312,11 +1312,13 @@ void em28xx_pre_card_setup(struct em28xx *dev)
{ {
int rc; int rc;
rc = em28xx_read_reg(dev, EM2880_R04_GPO); /* Set the default GPO/GPIO for legacy devices */
if (rc >= 0) dev->reg_gpo_num = EM2880_R04_GPO;
dev->reg_gpo = rc; dev->reg_gpio_num = EM28XX_R08_GPIO;
dev->wait_after_write = 5; dev->wait_after_write = 5;
/* Based on the Chip ID, set the device configuration */
rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID); rc = em28xx_read_reg(dev, EM28XX_R0A_CHIPID);
if (rc > 0) { if (rc > 0) {
dev->chip_id = rc; dev->chip_id = rc;
...@@ -1326,6 +1328,7 @@ void em28xx_pre_card_setup(struct em28xx *dev) ...@@ -1326,6 +1328,7 @@ void em28xx_pre_card_setup(struct em28xx *dev)
break; break;
case CHIP_ID_EM2874: case CHIP_ID_EM2874:
em28xx_info("chip ID is em2874\n"); em28xx_info("chip ID is em2874\n");
dev->reg_gpio_num = EM2874_R80_GPIO;
dev->wait_after_write = 0; dev->wait_after_write = 0;
break; break;
case CHIP_ID_EM2883: case CHIP_ID_EM2883:
...@@ -1336,6 +1339,12 @@ void em28xx_pre_card_setup(struct em28xx *dev) ...@@ -1336,6 +1339,12 @@ void em28xx_pre_card_setup(struct em28xx *dev)
em28xx_info("em28xx chip ID = %d\n", rc); 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); em28xx_set_model(dev);
/* request some modules */ /* request some modules */
......
...@@ -187,9 +187,9 @@ int em28xx_write_regs(struct em28xx *dev, u16 reg, char *buf, int len) ...@@ -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. Not sure what happens on reading GPO register.
*/ */
if (rc >= 0) { if (rc >= 0) {
if (reg == EM2880_R04_GPO) if (reg == dev->reg_gpo_num)
dev->reg_gpo = buf[0]; dev->reg_gpo = buf[0];
else if (reg == EM28XX_R08_GPIO) else if (reg == dev->reg_gpio_num)
dev->reg_gpio = buf[0]; dev->reg_gpio = buf[0];
} }
...@@ -208,9 +208,9 @@ static int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val, ...@@ -208,9 +208,9 @@ static int em28xx_write_reg_bits(struct em28xx *dev, u16 reg, u8 val,
u8 newval; u8 newval;
/* Uses cache for gpo/gpio registers */ /* Uses cache for gpo/gpio registers */
if (reg == EM2880_R04_GPO) if (reg == dev->reg_gpo_num)
oldval = dev->reg_gpo; oldval = dev->reg_gpo;
else if (reg == EM28XX_R08_GPIO) else if (reg == dev->reg_gpio_num)
oldval = dev->reg_gpio; oldval = dev->reg_gpio;
else else
oldval = em28xx_read_reg(dev, reg); oldval = em28xx_read_reg(dev, reg);
......
...@@ -76,6 +76,9 @@ ...@@ -76,6 +76,9 @@
#define EM28XX_R10_LINE_IN_AC97 0x10 #define EM28XX_R10_LINE_IN_AC97 0x10
#define EM28XX_R14_VIDEO_AC97 0x14 #define EM28XX_R14_VIDEO_AC97 0x14
/* em2874 registers */
#define EM2874_R80_GPIO 0x80
/* register settings */ /* register settings */
#define EM2800_AUDIO_SRC_TUNER 0x0d #define EM2800_AUDIO_SRC_TUNER 0x0d
#define EM2800_AUDIO_SRC_LINE 0x0c #define EM2800_AUDIO_SRC_LINE 0x0c
......
...@@ -471,6 +471,9 @@ struct em28xx { ...@@ -471,6 +471,9 @@ struct em28xx {
enum em28xx_mode mode; enum em28xx_mode mode;
/* register numbers for GPO/GPIO registers */
u16 reg_gpo_num, reg_gpio_num;
/* Caches GPO and GPIO registers */ /* Caches GPO and GPIO registers */
unsigned char reg_gpo, reg_gpio; unsigned char reg_gpo, reg_gpio;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment