Merge branch 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6
* 'i2c-for-linus' of git://jdelvare.pck.nerim.net/jdelvare-2.6: i2c/max6875: Really prevent 24RF08 corruption i2c-amd756: Fix functionality flags i2c: Kill the old driver matching scheme i2c: Convert remaining new-style drivers to use module aliasing i2c: Switch pasemi to the new device/driver matching scheme i2c: Clean up Blackfin BF527 I2C device declarations i2c-nforce2: Disable the second SMBus channel on the DFI Lanparty NF4 Expert i2c: New co-maintainer
This commit is contained in:
Коммит
3e5b787ac3
|
@ -1940,8 +1940,10 @@ L: lm-sensors@lm-sensors.org
|
|||
S: Maintained
|
||||
|
||||
I2C SUBSYSTEM
|
||||
P: Jean Delvare
|
||||
P: Jean Delvare (PC drivers, core)
|
||||
M: khali@linux-fr.org
|
||||
P: Ben Dooks (embedded platforms)
|
||||
M: ben-linux@fluff.org
|
||||
L: i2c@lm-sensors.org
|
||||
T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/
|
||||
S: Maintained
|
||||
|
|
|
@ -799,13 +799,11 @@ static struct i2c_board_info __initdata bfin_i2c_board_info[] = {
|
|||
#if defined(CONFIG_TWI_LCD) || defined(CONFIG_TWI_LCD_MODULE)
|
||||
{
|
||||
I2C_BOARD_INFO("pcf8574_lcd", 0x22),
|
||||
.type = "pcf8574_lcd",
|
||||
},
|
||||
#endif
|
||||
#if defined(CONFIG_TWI_KEYPAD) || defined(CONFIG_TWI_KEYPAD_MODULE)
|
||||
{
|
||||
I2C_BOARD_INFO("pcf8574_keypad", 0x27),
|
||||
.type = "pcf8574_keypad",
|
||||
.irq = IRQ_PF8,
|
||||
},
|
||||
#endif
|
||||
|
|
|
@ -24,12 +24,11 @@
|
|||
*/
|
||||
struct i2c_driver_device {
|
||||
char *of_device;
|
||||
char *i2c_driver;
|
||||
char *i2c_type;
|
||||
};
|
||||
|
||||
static struct i2c_driver_device i2c_devices[] __initdata = {
|
||||
{"dallas,ds1338", "rtc-ds1307", "ds1338"},
|
||||
{"dallas,ds1338", "ds1338"},
|
||||
};
|
||||
|
||||
static int __init find_i2c_driver(struct device_node *node,
|
||||
|
@ -40,9 +39,7 @@ static int __init find_i2c_driver(struct device_node *node,
|
|||
for (i = 0; i < ARRAY_SIZE(i2c_devices); i++) {
|
||||
if (!of_device_is_compatible(node, i2c_devices[i].of_device))
|
||||
continue;
|
||||
if (strlcpy(info->driver_name, i2c_devices[i].i2c_driver,
|
||||
KOBJ_NAME_LEN) >= KOBJ_NAME_LEN ||
|
||||
strlcpy(info->type, i2c_devices[i].i2c_type,
|
||||
if (strlcpy(info->type, i2c_devices[i].i2c_type,
|
||||
I2C_NAME_SIZE) >= I2C_NAME_SIZE)
|
||||
return -ENOMEM;
|
||||
return 0;
|
||||
|
|
|
@ -290,7 +290,7 @@ static u32 amd756_func(struct i2c_adapter *adapter)
|
|||
{
|
||||
return I2C_FUNC_SMBUS_QUICK | I2C_FUNC_SMBUS_BYTE |
|
||||
I2C_FUNC_SMBUS_BYTE_DATA | I2C_FUNC_SMBUS_WORD_DATA |
|
||||
I2C_FUNC_SMBUS_BLOCK_DATA | I2C_FUNC_SMBUS_PROC_CALL;
|
||||
I2C_FUNC_SMBUS_BLOCK_DATA;
|
||||
}
|
||||
|
||||
static const struct i2c_algorithm smbus_algorithm = {
|
||||
|
|
|
@ -50,6 +50,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/i2c.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/dmi.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
MODULE_LICENSE("GPL");
|
||||
|
@ -109,6 +110,18 @@ struct nforce2_smbus {
|
|||
/* Misc definitions */
|
||||
#define MAX_TIMEOUT 100
|
||||
|
||||
/* We disable the second SMBus channel on these boards */
|
||||
static struct dmi_system_id __devinitdata nforce2_dmi_blacklist2[] = {
|
||||
{
|
||||
.ident = "DFI Lanparty NF4 Expert",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_BOARD_VENDOR, "DFI Corp,LTD"),
|
||||
DMI_MATCH(DMI_BOARD_NAME, "LP UT NF4 Expert"),
|
||||
},
|
||||
},
|
||||
{ }
|
||||
};
|
||||
|
||||
static struct pci_driver nforce2_driver;
|
||||
|
||||
static void nforce2_abort(struct i2c_adapter *adap)
|
||||
|
@ -367,10 +380,17 @@ static int __devinit nforce2_probe(struct pci_dev *dev, const struct pci_device_
|
|||
smbuses[0].base = 0; /* to have a check value */
|
||||
}
|
||||
/* SMBus adapter 2 */
|
||||
res2 = nforce2_probe_smb(dev, 5, NFORCE_PCI_SMB2, &smbuses[1], "SMB2");
|
||||
if (res2 < 0) {
|
||||
dev_err(&dev->dev, "Error probing SMB2.\n");
|
||||
smbuses[1].base = 0; /* to have a check value */
|
||||
if (dmi_check_system(nforce2_dmi_blacklist2)) {
|
||||
dev_err(&dev->dev, "Disabling SMB2 for safety reasons.\n");
|
||||
res2 = -EPERM;
|
||||
smbuses[1].base = 0;
|
||||
} else {
|
||||
res2 = nforce2_probe_smb(dev, 5, NFORCE_PCI_SMB2, &smbuses[1],
|
||||
"SMB2");
|
||||
if (res2 < 0) {
|
||||
dev_err(&dev->dev, "Error probing SMB2.\n");
|
||||
smbuses[1].base = 0; /* to have a check value */
|
||||
}
|
||||
}
|
||||
if ((res1 < 0) && (res2 < 0)) {
|
||||
/* we did not find even one of the SMBuses, so we give up */
|
||||
|
|
|
@ -207,9 +207,6 @@ static int max6875_detect(struct i2c_adapter *adapter, int address, int kind)
|
|||
fake_client->flags = 0;
|
||||
strlcpy(fake_client->name, "max6875 subclient", I2C_NAME_SIZE);
|
||||
|
||||
/* Prevent 24RF08 corruption (in case of user error) */
|
||||
i2c_smbus_write_quick(real_client, 0);
|
||||
|
||||
if ((err = i2c_attach_client(real_client)) != 0)
|
||||
goto exit_kfree2;
|
||||
|
||||
|
|
|
@ -74,10 +74,7 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv)
|
|||
if (driver->id_table)
|
||||
return i2c_match_id(driver->id_table, client) != NULL;
|
||||
|
||||
/* new style drivers use the same kind of driver matching policy
|
||||
* as platform devices or SPI: compare device and driver IDs.
|
||||
*/
|
||||
return strcmp(client->driver_name, drv->name) == 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG
|
||||
|
@ -91,14 +88,9 @@ static int i2c_device_uevent(struct device *dev, struct kobj_uevent_env *env)
|
|||
if (dev->driver)
|
||||
return 0;
|
||||
|
||||
if (client->driver_name[0]) {
|
||||
if (add_uevent_var(env, "MODALIAS=%s", client->driver_name))
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
if (add_uevent_var(env, "MODALIAS=%s%s",
|
||||
I2C_MODULE_PREFIX, client->name))
|
||||
return -ENOMEM;
|
||||
}
|
||||
if (add_uevent_var(env, "MODALIAS=%s%s",
|
||||
I2C_MODULE_PREFIX, client->name))
|
||||
return -ENOMEM;
|
||||
dev_dbg(dev, "uevent\n");
|
||||
return 0;
|
||||
}
|
||||
|
@ -206,9 +198,7 @@ static ssize_t show_client_name(struct device *dev, struct device_attribute *att
|
|||
static ssize_t show_modalias(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
struct i2c_client *client = to_i2c_client(dev);
|
||||
return client->driver_name[0]
|
||||
? sprintf(buf, "%s\n", client->driver_name)
|
||||
: sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name);
|
||||
return sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name);
|
||||
}
|
||||
|
||||
static struct device_attribute i2c_dev_attrs[] = {
|
||||
|
@ -282,8 +272,6 @@ i2c_new_device(struct i2c_adapter *adap, struct i2c_board_info const *info)
|
|||
client->addr = info->addr;
|
||||
client->irq = info->irq;
|
||||
|
||||
strlcpy(client->driver_name, info->driver_name,
|
||||
sizeof(client->driver_name));
|
||||
strlcpy(client->name, info->type, sizeof(client->name));
|
||||
|
||||
/* a new style driver may be bound to this device when we
|
||||
|
|
|
@ -160,10 +160,17 @@ static int cs5345_probe(struct i2c_client *client,
|
|||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static const struct i2c_device_id cs5345_id[] = {
|
||||
{ "cs5345", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, cs5345_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "cs5345",
|
||||
.driverid = I2C_DRIVERID_CS5345,
|
||||
.command = cs5345_command,
|
||||
.probe = cs5345_probe,
|
||||
.id_table = cs5345_id,
|
||||
};
|
||||
|
||||
|
|
|
@ -144,7 +144,8 @@ static int cs53l32a_probe(struct i2c_client *client,
|
|||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -EIO;
|
||||
|
||||
snprintf(client->name, sizeof(client->name) - 1, "cs53l32a");
|
||||
if (!id)
|
||||
strlcpy(client->name, "cs53l32a", sizeof(client->name));
|
||||
|
||||
v4l_info(client, "chip found @ 0x%x (%s)\n",
|
||||
client->addr << 1, client->adapter->name);
|
||||
|
@ -175,10 +176,17 @@ static int cs53l32a_probe(struct i2c_client *client,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id cs53l32a_id[] = {
|
||||
{ "cs53l32a", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, cs53l32a_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "cs53l32a",
|
||||
.driverid = I2C_DRIVERID_CS53L32A,
|
||||
.command = cs53l32a_command,
|
||||
.probe = cs53l32a_probe,
|
||||
.id_table = cs53l32a_id,
|
||||
};
|
||||
|
||||
|
|
|
@ -74,7 +74,7 @@ static const u8 hw_bus[] = {
|
|||
};
|
||||
|
||||
/* This array should match the CX18_HW_ defines */
|
||||
static const char * const hw_drivernames[] = {
|
||||
static const char * const hw_devicenames[] = {
|
||||
"tuner",
|
||||
"tveeprom",
|
||||
"cs5345",
|
||||
|
@ -95,8 +95,7 @@ int cx18_i2c_register(struct cx18 *cx, unsigned idx)
|
|||
id = hw_driverids[idx];
|
||||
bus = hw_bus[idx];
|
||||
memset(&info, 0, sizeof(info));
|
||||
strlcpy(info.driver_name, hw_drivernames[idx],
|
||||
sizeof(info.driver_name));
|
||||
strlcpy(info.type, hw_devicenames[idx], sizeof(info.type));
|
||||
info.addr = hw_addrs[idx];
|
||||
for (i = 0; i < I2C_CLIENTS_MAX; i++)
|
||||
if (cx->i2c_clients[i] == NULL)
|
||||
|
@ -279,7 +278,7 @@ static const char *cx18_i2c_id_name(u32 id)
|
|||
|
||||
for (i = 0; i < ARRAY_SIZE(hw_driverids); i++)
|
||||
if (hw_driverids[i] == id)
|
||||
return hw_drivernames[i];
|
||||
return hw_devicenames[i];
|
||||
return "unknown device";
|
||||
}
|
||||
|
||||
|
@ -290,7 +289,7 @@ static const char *cx18_i2c_hw_name(u32 hw)
|
|||
|
||||
for (i = 0; i < ARRAY_SIZE(hw_driverids); i++)
|
||||
if (1 << i == hw)
|
||||
return hw_drivernames[i];
|
||||
return hw_devicenames[i];
|
||||
return "unknown device";
|
||||
}
|
||||
|
||||
|
|
|
@ -1284,10 +1284,17 @@ static int cx25840_remove(struct i2c_client *client)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id cx25840_id[] = {
|
||||
{ "cx25840", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, cx25840_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "cx25840",
|
||||
.driverid = I2C_DRIVERID_CX25840,
|
||||
.command = cx25840_command,
|
||||
.probe = cx25840_probe,
|
||||
.remove = cx25840_remove,
|
||||
.id_table = cx25840_id,
|
||||
};
|
||||
|
|
|
@ -136,7 +136,7 @@ static const u8 hw_addrs[] = {
|
|||
};
|
||||
|
||||
/* This array should match the IVTV_HW_ defines */
|
||||
static const char * const hw_drivernames[] = {
|
||||
static const char * const hw_devicenames[] = {
|
||||
"cx25840",
|
||||
"saa7115",
|
||||
"saa7127",
|
||||
|
@ -145,7 +145,7 @@ static const char * const hw_drivernames[] = {
|
|||
"wm8775",
|
||||
"cs53l32a",
|
||||
"tveeprom",
|
||||
"saa7115",
|
||||
"saa7114",
|
||||
"upd64031a",
|
||||
"upd64083",
|
||||
"saa717x",
|
||||
|
@ -167,8 +167,7 @@ int ivtv_i2c_register(struct ivtv *itv, unsigned idx)
|
|||
return -1;
|
||||
id = hw_driverids[idx];
|
||||
memset(&info, 0, sizeof(info));
|
||||
strlcpy(info.driver_name, hw_drivernames[idx],
|
||||
sizeof(info.driver_name));
|
||||
strlcpy(info.type, hw_devicenames[idx], sizeof(info.type));
|
||||
info.addr = hw_addrs[idx];
|
||||
for (i = 0; itv->i2c_clients[i] && i < I2C_CLIENTS_MAX; i++) {}
|
||||
|
||||
|
@ -657,7 +656,7 @@ static const char *ivtv_i2c_id_name(u32 id)
|
|||
|
||||
for (i = 0; i < ARRAY_SIZE(hw_driverids); i++)
|
||||
if (hw_driverids[i] == id)
|
||||
return hw_drivernames[i];
|
||||
return hw_devicenames[i];
|
||||
return "unknown device";
|
||||
}
|
||||
|
||||
|
@ -668,7 +667,7 @@ static const char *ivtv_i2c_hw_name(u32 hw)
|
|||
|
||||
for (i = 0; i < ARRAY_SIZE(hw_driverids); i++)
|
||||
if (1 << i == hw)
|
||||
return hw_drivernames[i];
|
||||
return hw_devicenames[i];
|
||||
return "unknown device";
|
||||
}
|
||||
|
||||
|
@ -770,7 +769,7 @@ int init_ivtv_i2c(struct ivtv *itv)
|
|||
* same size and GPIO must be the last entry.
|
||||
*/
|
||||
if (ARRAY_SIZE(hw_driverids) != ARRAY_SIZE(hw_addrs) ||
|
||||
ARRAY_SIZE(hw_drivernames) != ARRAY_SIZE(hw_addrs) ||
|
||||
ARRAY_SIZE(hw_devicenames) != ARRAY_SIZE(hw_addrs) ||
|
||||
IVTV_HW_GPIO != (1 << (ARRAY_SIZE(hw_addrs) - 1)) ||
|
||||
hw_driverids[ARRAY_SIZE(hw_addrs) - 1]) {
|
||||
IVTV_ERR("Mismatched I2C hardware arrays\n");
|
||||
|
|
|
@ -135,8 +135,6 @@ static int m52790_probe(struct i2c_client *client,
|
|||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -EIO;
|
||||
|
||||
snprintf(client->name, sizeof(client->name) - 1, "m52790");
|
||||
|
||||
v4l_info(client, "chip found @ 0x%x (%s)\n",
|
||||
client->addr << 1, client->adapter->name);
|
||||
|
||||
|
@ -159,11 +157,18 @@ static int m52790_remove(struct i2c_client *client)
|
|||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static const struct i2c_device_id m52790_id[] = {
|
||||
{ "m52790", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, m52790_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "m52790",
|
||||
.driverid = I2C_DRIVERID_M52790,
|
||||
.command = m52790_command,
|
||||
.probe = m52790_probe,
|
||||
.remove = m52790_remove,
|
||||
.id_table = m52790_id,
|
||||
};
|
||||
|
||||
|
|
|
@ -815,7 +815,8 @@ static int msp_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||
int msp_product, msp_prod_hi, msp_prod_lo;
|
||||
int msp_rom;
|
||||
|
||||
snprintf(client->name, sizeof(client->name) - 1, "msp3400");
|
||||
if (!id)
|
||||
strlcpy(client->name, "msp3400", sizeof(client->name));
|
||||
|
||||
if (msp_reset(client) == -1) {
|
||||
v4l_dbg(1, msp_debug, client, "msp3400 not found\n");
|
||||
|
@ -864,9 +865,6 @@ static int msp_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||
msp_revision = (state->rev1 & 0x0f) + '@';
|
||||
msp_hard = ((state->rev1 >> 8) & 0xff) + '@';
|
||||
msp_rom = state->rev2 & 0x1f;
|
||||
snprintf(client->name, sizeof(client->name), "MSP%d4%02d%c-%c%d",
|
||||
msp_family, msp_product,
|
||||
msp_revision, msp_hard, msp_rom);
|
||||
/* Rev B=2, C=3, D=4, G=7 */
|
||||
state->ident = msp_family * 10000 + 4000 + msp_product * 10 +
|
||||
msp_revision - '@';
|
||||
|
@ -931,7 +929,9 @@ static int msp_probe(struct i2c_client *client, const struct i2c_device_id *id)
|
|||
}
|
||||
|
||||
/* hello world :-) */
|
||||
v4l_info(client, "%s found @ 0x%x (%s)\n", client->name,
|
||||
v4l_info(client, "MSP%d4%02d%c-%c%d found @ 0x%x (%s)\n",
|
||||
msp_family, msp_product,
|
||||
msp_revision, msp_hard, msp_rom,
|
||||
client->addr << 1, client->adapter->name);
|
||||
v4l_info(client, "%s ", client->name);
|
||||
if (state->has_nicam && state->has_radio)
|
||||
|
@ -987,6 +987,12 @@ static int msp_remove(struct i2c_client *client)
|
|||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static const struct i2c_device_id msp_id[] = {
|
||||
{ "msp3400", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, msp_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "msp3400",
|
||||
.driverid = I2C_DRIVERID_MSP3400,
|
||||
|
@ -995,6 +1001,7 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
|||
.remove = msp_remove,
|
||||
.suspend = msp_suspend,
|
||||
.resume = msp_resume,
|
||||
.id_table = msp_id,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -1456,14 +1456,13 @@ static int saa7115_probe(struct i2c_client *client,
|
|||
struct saa711x_state *state;
|
||||
int i;
|
||||
char name[17];
|
||||
u8 chip_id;
|
||||
char chip_id;
|
||||
int autodetect = !id || id->driver_data == 1;
|
||||
|
||||
/* Check if the adapter supports the needed features */
|
||||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -EIO;
|
||||
|
||||
snprintf(client->name, sizeof(client->name) - 1, "saa7115");
|
||||
|
||||
for (i = 0; i < 0x0f; i++) {
|
||||
saa711x_write(client, 0, i);
|
||||
name[i] = (saa711x_read(client, 0) & 0x0f) + '0';
|
||||
|
@ -1472,8 +1471,7 @@ static int saa7115_probe(struct i2c_client *client,
|
|||
}
|
||||
name[i] = '\0';
|
||||
|
||||
saa711x_write(client, 0, 5);
|
||||
chip_id = saa711x_read(client, 0) & 0x0f;
|
||||
chip_id = name[5];
|
||||
|
||||
/* Check whether this chip is part of the saa711x series */
|
||||
if (memcmp(name, "1f711", 5)) {
|
||||
|
@ -1482,8 +1480,14 @@ static int saa7115_probe(struct i2c_client *client,
|
|||
return -ENODEV;
|
||||
}
|
||||
|
||||
snprintf(client->name, sizeof(client->name) - 1, "saa711%d",chip_id);
|
||||
v4l_info(client, "saa711%d found (%s) @ 0x%x (%s)\n", chip_id, name, client->addr << 1, client->adapter->name);
|
||||
/* Safety check */
|
||||
if (!autodetect && id->name[6] != chip_id) {
|
||||
v4l_warn(client, "found saa711%c while %s was expected\n",
|
||||
chip_id, id->name);
|
||||
}
|
||||
snprintf(client->name, sizeof(client->name), "saa711%c", chip_id);
|
||||
v4l_info(client, "saa711%c found (%s) @ 0x%x (%s)\n", chip_id, name,
|
||||
client->addr << 1, client->adapter->name);
|
||||
|
||||
state = kzalloc(sizeof(struct saa711x_state), GFP_KERNEL);
|
||||
i2c_set_clientdata(client, state);
|
||||
|
@ -1499,19 +1503,19 @@ static int saa7115_probe(struct i2c_client *client,
|
|||
state->hue = 0;
|
||||
state->sat = 64;
|
||||
switch (chip_id) {
|
||||
case 1:
|
||||
case '1':
|
||||
state->ident = V4L2_IDENT_SAA7111;
|
||||
break;
|
||||
case 3:
|
||||
case '3':
|
||||
state->ident = V4L2_IDENT_SAA7113;
|
||||
break;
|
||||
case 4:
|
||||
case '4':
|
||||
state->ident = V4L2_IDENT_SAA7114;
|
||||
break;
|
||||
case 5:
|
||||
case '5':
|
||||
state->ident = V4L2_IDENT_SAA7115;
|
||||
break;
|
||||
case 8:
|
||||
case '8':
|
||||
state->ident = V4L2_IDENT_SAA7118;
|
||||
break;
|
||||
default:
|
||||
|
@ -1553,6 +1557,17 @@ static int saa7115_remove(struct i2c_client *client)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id saa7115_id[] = {
|
||||
{ "saa711x", 1 }, /* autodetect */
|
||||
{ "saa7111", 0 },
|
||||
{ "saa7113", 0 },
|
||||
{ "saa7114", 0 },
|
||||
{ "saa7115", 0 },
|
||||
{ "saa7118", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, saa7115_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "saa7115",
|
||||
.driverid = I2C_DRIVERID_SAA711X,
|
||||
|
@ -1560,5 +1575,6 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
|||
.probe = saa7115_probe,
|
||||
.remove = saa7115_remove,
|
||||
.legacy_class = I2C_CLASS_TV_ANALOG | I2C_CLASS_TV_DIGITAL,
|
||||
.id_table = saa7115_id,
|
||||
};
|
||||
|
||||
|
|
|
@ -672,8 +672,6 @@ static int saa7127_probe(struct i2c_client *client,
|
|||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -EIO;
|
||||
|
||||
snprintf(client->name, sizeof(client->name) - 1, "saa7127");
|
||||
|
||||
v4l_dbg(1, debug, client, "detecting saa7127 client on address 0x%x\n",
|
||||
client->addr << 1);
|
||||
|
||||
|
@ -741,11 +739,18 @@ static int saa7127_remove(struct i2c_client *client)
|
|||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static struct i2c_device_id saa7127_id[] = {
|
||||
{ "saa7127", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, saa7127_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "saa7127",
|
||||
.driverid = I2C_DRIVERID_SAA7127,
|
||||
.command = saa7127_command,
|
||||
.probe = saa7127_probe,
|
||||
.remove = saa7127_remove,
|
||||
.id_table = saa7127_id,
|
||||
};
|
||||
|
||||
|
|
|
@ -1429,8 +1429,6 @@ static int saa717x_probe(struct i2c_client *client,
|
|||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -EIO;
|
||||
|
||||
snprintf(client->name, sizeof(client->name) - 1, "saa717x");
|
||||
|
||||
if (saa717x_write(client, 0x5a4, 0xfe) &&
|
||||
saa717x_write(client, 0x5a5, 0x0f) &&
|
||||
saa717x_write(client, 0x5a6, 0x00) &&
|
||||
|
@ -1507,6 +1505,12 @@ static int saa717x_remove(struct i2c_client *client)
|
|||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static const struct i2c_device_id saa717x_id[] = {
|
||||
{ "saa717x", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, saa717x_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "saa717x",
|
||||
.driverid = I2C_DRIVERID_SAA717X,
|
||||
|
@ -1514,4 +1518,5 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
|||
.probe = saa717x_probe,
|
||||
.remove = saa717x_remove,
|
||||
.legacy_class = I2C_CLASS_TV_ANALOG | I2C_CLASS_TV_DIGITAL,
|
||||
.id_table = saa717x_id,
|
||||
};
|
||||
|
|
|
@ -1115,7 +1115,6 @@ static int tuner_probe(struct i2c_client *client,
|
|||
if (NULL == t)
|
||||
return -ENOMEM;
|
||||
t->i2c = client;
|
||||
strlcpy(client->name, "(tuner unset)", sizeof(client->name));
|
||||
i2c_set_clientdata(client, t);
|
||||
t->type = UNSET;
|
||||
t->audmode = V4L2_TUNER_MODE_STEREO;
|
||||
|
@ -1273,11 +1272,26 @@ static int tuner_remove(struct i2c_client *client)
|
|||
|
||||
list_del(&t->list);
|
||||
kfree(t);
|
||||
|
||||
/* The probing code has overwritten the device name, restore it so
|
||||
that reloading the driver will work. Ideally the device name
|
||||
should not be overwritten in the first place, but for now that
|
||||
will do. */
|
||||
strlcpy(client->name, "tuner", I2C_NAME_SIZE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
/* This driver supports many devices and the idea is to let the driver
|
||||
detect which device is present. So rather than listing all supported
|
||||
devices here, we pretend to support a single, fake device type. */
|
||||
static const struct i2c_device_id tuner_id[] = {
|
||||
{ "tuner", }, /* autodetect */
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, tuner_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "tuner",
|
||||
.driverid = I2C_DRIVERID_TUNER,
|
||||
|
@ -1287,6 +1301,7 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
|||
.suspend = tuner_suspend,
|
||||
.resume = tuner_resume,
|
||||
.legacy_probe = tuner_legacy_probe,
|
||||
.id_table = tuner_id,
|
||||
};
|
||||
|
||||
|
||||
|
|
|
@ -228,6 +228,11 @@ static int upd64031a_remove(struct i2c_client *client)
|
|||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static const struct i2c_device_id upd64031a_id[] = {
|
||||
{ "upd64031a", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, upd64031a_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "upd64031a",
|
||||
|
@ -235,4 +240,5 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
|||
.command = upd64031a_command,
|
||||
.probe = upd64031a_probe,
|
||||
.remove = upd64031a_remove,
|
||||
.id_table = upd64031a_id,
|
||||
};
|
||||
|
|
|
@ -205,6 +205,11 @@ static int upd64083_remove(struct i2c_client *client)
|
|||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static const struct i2c_device_id upd64083_id[] = {
|
||||
{ "upd64083", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, upd64083_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "upd64083",
|
||||
|
@ -212,4 +217,5 @@ static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
|||
.command = upd64083_command,
|
||||
.probe = upd64083_probe,
|
||||
.remove = upd64083_remove,
|
||||
.id_table = upd64083_id,
|
||||
};
|
||||
|
|
|
@ -130,8 +130,6 @@ static int vp27smpx_probe(struct i2c_client *client,
|
|||
if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA))
|
||||
return -EIO;
|
||||
|
||||
snprintf(client->name, sizeof(client->name) - 1, "vp27smpx");
|
||||
|
||||
v4l_info(client, "chip found @ 0x%x (%s)\n",
|
||||
client->addr << 1, client->adapter->name);
|
||||
|
||||
|
@ -154,11 +152,18 @@ static int vp27smpx_remove(struct i2c_client *client)
|
|||
|
||||
/* ----------------------------------------------------------------------- */
|
||||
|
||||
static const struct i2c_device_id vp27smpx_id[] = {
|
||||
{ "vp27smpx", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, vp27smpx_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "vp27smpx",
|
||||
.driverid = I2C_DRIVERID_VP27SMPX,
|
||||
.command = vp27smpx_command,
|
||||
.probe = vp27smpx_probe,
|
||||
.remove = vp27smpx_remove,
|
||||
.id_table = vp27smpx_id,
|
||||
};
|
||||
|
||||
|
|
|
@ -313,11 +313,18 @@ static int wm8739_remove(struct i2c_client *client)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id wm8739_id[] = {
|
||||
{ "wm8739", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wm8739_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "wm8739",
|
||||
.driverid = I2C_DRIVERID_WM8739,
|
||||
.command = wm8739_command,
|
||||
.probe = wm8739_probe,
|
||||
.remove = wm8739_remove,
|
||||
.id_table = wm8739_id,
|
||||
};
|
||||
|
||||
|
|
|
@ -216,11 +216,18 @@ static int wm8775_remove(struct i2c_client *client)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static const struct i2c_device_id wm8775_id[] = {
|
||||
{ "wm8775", 0 },
|
||||
{ }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(i2c, wm8775_id);
|
||||
|
||||
static struct v4l2_i2c_driver_data v4l2_i2c_data = {
|
||||
.name = "wm8775",
|
||||
.driverid = I2C_DRIVERID_WM8775,
|
||||
.command = wm8775_command,
|
||||
.probe = wm8775_probe,
|
||||
.remove = wm8775_remove,
|
||||
.id_table = wm8775_id,
|
||||
};
|
||||
|
||||
|
|
|
@ -155,8 +155,6 @@ struct i2c_driver {
|
|||
* @driver: device's driver, hence pointer to access routines
|
||||
* @dev: Driver model device node for the slave.
|
||||
* @irq: indicates the IRQ generated by this device (if any)
|
||||
* @driver_name: Identifies new-style driver used with this device; also
|
||||
* used as the module name for hotplug/coldplug modprobe support.
|
||||
* @list: list of active/busy clients (DEPRECATED)
|
||||
* @released: used to synchronize client releases & detaches and references
|
||||
*
|
||||
|
@ -174,7 +172,6 @@ struct i2c_client {
|
|||
struct i2c_driver *driver; /* and our access routines */
|
||||
struct device dev; /* the device structure */
|
||||
int irq; /* irq issued by device (or -1) */
|
||||
char driver_name[KOBJ_NAME_LEN];
|
||||
struct list_head list; /* DEPRECATED */
|
||||
struct completion released;
|
||||
};
|
||||
|
@ -200,8 +197,7 @@ static inline void i2c_set_clientdata (struct i2c_client *dev, void *data)
|
|||
|
||||
/**
|
||||
* struct i2c_board_info - template for device creation
|
||||
* @driver_name: identifies the driver to be bound to the device
|
||||
* @type: optional chip type information, to initialize i2c_client.name
|
||||
* @type: chip type, to initialize i2c_client.name
|
||||
* @flags: to initialize i2c_client.flags
|
||||
* @addr: stored in i2c_client.addr
|
||||
* @platform_data: stored in i2c_client.dev.platform_data
|
||||
|
@ -220,7 +216,6 @@ static inline void i2c_set_clientdata (struct i2c_client *dev, void *data)
|
|||
* with the adapter already known.
|
||||
*/
|
||||
struct i2c_board_info {
|
||||
char driver_name[KOBJ_NAME_LEN];
|
||||
char type[I2C_NAME_SIZE];
|
||||
unsigned short flags;
|
||||
unsigned short addr;
|
||||
|
|
|
@ -12,8 +12,7 @@
|
|||
* @context: optional parameter passed to setup() and teardown()
|
||||
*
|
||||
* In addition to the I2C_BOARD_INFO() state appropriate to each chip,
|
||||
* the i2c_board_info used with the pcf875x driver must provide the
|
||||
* chip "type" ("pcf8574", "pcf8574a", "pcf8575", "pcf8575c") and its
|
||||
* the i2c_board_info used with the pcf875x driver must provide its
|
||||
* platform_data (pointer to one of these structures) with at least
|
||||
* the gpio_base value initialized.
|
||||
*
|
||||
|
|
Загрузка…
Ссылка в новой задаче