mirror of
				git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
				synced 2025-09-18 22:14:16 +00:00 
			
		
		
		
	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:
		
						commit
						3e5b787ac3
					
				
					 25 changed files with 180 additions and 80 deletions
				
			
		|  | @ -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. | ||||
|  * | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 Linus Torvalds
						Linus Torvalds