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:
Родитель
f412d36a8c
Коммит
bfbde8ee56
|
@ -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)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче