V4L/DVB (13443): ivtv: Defer legacy I2C IR probing until after setup of known I2C devices

This avoids collisions of legacy IR controller probing with known I2C devices
in the card definitions in ivtv-cards.c.  I2C driver modules for device listed
explicitly in a card definition should always take precedence over a probe
guessing where and IR controller may be.

Reviewed-by: Jean Delvare <khali@linux-fr.org>
Signed-off-by: Andy Walls <awalls@radix.net>
Signed-off-by: Mauro Carvalho Chehab <mchehab@redhat.com>
This commit is contained in:
Andy Walls 2009-11-21 11:41:33 -03:00 committed by Mauro Carvalho Chehab
parent f412d36a8c
commit bfbde8ee56
3 changed files with 35 additions and 27 deletions

View file

@ -884,6 +884,9 @@ static void ivtv_load_and_init_modules(struct ivtv *itv)
itv->hw_flags |= device;
}
/* probe for legacy IR controllers that aren't in card definitions */
ivtv_i2c_new_ir_legacy(itv);
if (itv->card->hw_all & IVTV_HW_CX25840)
itv->sd_video = ivtv_find_hw(itv, IVTV_HW_CX25840);
else if (itv->card->hw_all & IVTV_HW_SAA717X)

View file

@ -149,6 +149,36 @@ static const char * const hw_devicenames[] = {
"gpio",
};
/* Instantiate the IR receiver device using probing -- undesirable */
struct i2c_client *ivtv_i2c_new_ir_legacy(struct ivtv *itv)
{
struct i2c_board_info info;
/*
* The external IR receiver is at i2c address 0x34.
* The internal IR receiver is at i2c address 0x30.
*
* In theory, both can be fitted, and Hauppauge suggests an external
* overrides an internal. That's why we probe 0x1a (~0x34) first. CB
*
* Some of these addresses we probe may collide with other i2c address
* allocations, so this function must be called after all other i2c
* devices we care about are registered.
*/
const unsigned short addr_list[] = {
0x1a, /* Hauppauge IR external - collides with WM8739 */
0x18, /* Hauppauge IR internal */
0x71, /* Hauppauge IR (PVR150) */
0x64, /* Pixelview IR */
0x30, /* KNC ONE IR */
0x6b, /* Adaptec IR */
I2C_CLIENT_END
};
memset(&info, 0, sizeof(struct i2c_board_info));
strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
return i2c_new_probed_device(&itv->i2c_adap, &info, addr_list);
}
int ivtv_i2c_register(struct ivtv *itv, unsigned idx)
{
struct v4l2_subdev *sd;
@ -579,7 +609,7 @@ static struct i2c_client ivtv_i2c_client_template = {
.name = "ivtv internal",
};
/* init + register i2c adapter + instantiate IR receiver */
/* init + register i2c adapter */
int init_ivtv_i2c(struct ivtv *itv)
{
int retval;
@ -626,32 +656,6 @@ int init_ivtv_i2c(struct ivtv *itv)
else
retval = i2c_bit_add_bus(&itv->i2c_adap);
/* Instantiate the IR receiver device, if present */
if (retval == 0) {
struct i2c_board_info info;
/* The external IR receiver is at i2c address 0x34 (0x35 for
reads). Future Hauppauge cards will have an internal
receiver at 0x30 (0x31 for reads). In theory, both can be
fitted, and Hauppauge suggest an external overrides an
internal.
That's why we probe 0x1a (~0x34) first. CB
*/
const unsigned short addr_list[] = {
0x1a, /* Hauppauge IR external */
0x18, /* Hauppauge IR internal */
0x71, /* Hauppauge IR (PVR150) */
0x64, /* Pixelview IR */
0x30, /* KNC ONE IR */
0x6b, /* Adaptec IR */
I2C_CLIENT_END
};
memset(&info, 0, sizeof(struct i2c_board_info));
strlcpy(info.type, "ir_video", I2C_NAME_SIZE);
i2c_new_probed_device(&itv->i2c_adap, &info, addr_list);
}
return retval;
}

View file

@ -21,6 +21,7 @@
#ifndef IVTV_I2C_H
#define IVTV_I2C_H
struct i2c_client *ivtv_i2c_new_ir_legacy(struct ivtv *itv);
int ivtv_i2c_register(struct ivtv *itv, unsigned idx);
struct v4l2_subdev *ivtv_find_hw(struct ivtv *itv, u32 hw);