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: Devin Heitmueller <devin.heitmueller@gmail.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
parent
600bd7f0ed
commit
6a1acc3bc5
4 changed files with 22 additions and 7 deletions
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
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,
|
||||||
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 @@
|
||||||
#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 {
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue