diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/i2c-amd756-s4882.c | 5 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-piix4.c | 10 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-sis5595.c | 14 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-sis630.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-stub.c | 2 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-taos-evm.c | 3 | ||||
| -rw-r--r-- | drivers/i2c/chips/ds1682.c | 10 | ||||
| -rw-r--r-- | drivers/i2c/chips/menelaus.c | 10 | ||||
| -rw-r--r-- | drivers/i2c/chips/tps65010.c | 34 | ||||
| -rw-r--r-- | drivers/i2c/chips/tsl2550.c | 10 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core.c | 51 | 
11 files changed, 95 insertions, 56 deletions
| diff --git a/drivers/i2c/busses/i2c-amd756-s4882.c b/drivers/i2c/busses/i2c-amd756-s4882.c index e5e96c81756..c38a0a11220 100644 --- a/drivers/i2c/busses/i2c-amd756-s4882.c +++ b/drivers/i2c/busses/i2c-amd756-s4882.c @@ -1,7 +1,7 @@  /*   * i2c-amd756-s4882.c - i2c-amd756 extras for the Tyan S4882 motherboard   * - * Copyright (C) 2004 Jean Delvare <khali@linux-fr.org> + * Copyright (C) 2004, 2008 Jean Delvare <khali@linux-fr.org>   *   * This program is free software; you can redistribute it and/or modify   * it under the terms of the GNU General Public License as published by @@ -231,7 +231,8 @@ ERROR2:  	kfree(s4882_adapter);  	s4882_adapter = NULL;  ERROR1: -	i2c_del_adapter(&amd756_smbus); +	/* Restore physical bus */ +	i2c_add_adapter(&amd756_smbus);  ERROR0:  	return error;  } diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index 9bbe96cef71..fdc9ad805e3 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c @@ -38,7 +38,6 @@  #include <linux/ioport.h>  #include <linux/i2c.h>  #include <linux/init.h> -#include <linux/apm_bios.h>  #include <linux/dmi.h>  #include <asm/io.h> @@ -223,7 +222,7 @@ static int piix4_transaction(void)  			dev_err(&piix4_adapter.dev, "Failed! (%02x)\n", temp);  			return -1;  		} else { -			dev_dbg(&piix4_adapter.dev, "Successfull!\n"); +			dev_dbg(&piix4_adapter.dev, "Successful!\n");  		}  	} @@ -343,12 +342,7 @@ static s32 piix4_access(struct i2c_adapter * adap, u16 addr,  	switch (size) { -	case PIIX4_BYTE:	/* Where is the result put? I assume here it is in -				   SMBHSTDAT0 but it might just as well be in the -				   SMBHSTCMD. No clue in the docs */ - -		data->byte = inb_p(SMBHSTDAT0); -		break; +	case PIIX4_BYTE:  	case PIIX4_BYTE_DATA:  		data->byte = inb_p(SMBHSTDAT0);  		break; diff --git a/drivers/i2c/busses/i2c-sis5595.c b/drivers/i2c/busses/i2c-sis5595.c index 283769cecee..9ca8f9155f9 100644 --- a/drivers/i2c/busses/i2c-sis5595.c +++ b/drivers/i2c/busses/i2c-sis5595.c @@ -238,7 +238,7 @@ static int sis5595_transaction(struct i2c_adapter *adap)  			dev_dbg(&adap->dev, "Failed! (%02x)\n", temp);  			return -1;  		} else { -			dev_dbg(&adap->dev, "Successfull!\n"); +			dev_dbg(&adap->dev, "Successful!\n");  		}  	} @@ -316,14 +316,8 @@ static s32 sis5595_access(struct i2c_adapter *adap, u16 addr,  		}  		size = (size == I2C_SMBUS_PROC_CALL) ? SIS5595_PROC_CALL : SIS5595_WORD_DATA;  		break; -/* -	case I2C_SMBUS_BLOCK_DATA: -		printk(KERN_WARNING "sis5595.o: Block data not yet implemented!\n"); -		return -1; -		break; -*/  	default: -		printk(KERN_WARNING "sis5595.o: Unsupported transaction %d\n", size); +		dev_warn(&adap->dev, "Unsupported transaction %d\n", size);  		return -1;  	} @@ -338,9 +332,7 @@ static s32 sis5595_access(struct i2c_adapter *adap, u16 addr,  	switch (size) { -	case SIS5595_BYTE:	/* Where is the result put? I assume here it is in -				   SMB_DATA but it might just as well be in the -				   SMB_CMD. No clue in the docs */ +	case SIS5595_BYTE:  	case SIS5595_BYTE_DATA:  		data->byte = sis5595_read(SMB_BYTE);  		break; diff --git a/drivers/i2c/busses/i2c-sis630.c b/drivers/i2c/busses/i2c-sis630.c index 5fd734f99ee..3765dd7f450 100644 --- a/drivers/i2c/busses/i2c-sis630.c +++ b/drivers/i2c/busses/i2c-sis630.c @@ -136,7 +136,7 @@ static int sis630_transaction_start(struct i2c_adapter *adap, int size, u8 *oldc  			dev_dbg(&adap->dev, "Failed! (%02x)\n", temp);  			return -1;                  } else { -			dev_dbg(&adap->dev, "Successfull!\n"); +			dev_dbg(&adap->dev, "Successful!\n");  		}          } diff --git a/drivers/i2c/busses/i2c-stub.c b/drivers/i2c/busses/i2c-stub.c index c2a9f8c94f5..d08eeec5391 100644 --- a/drivers/i2c/busses/i2c-stub.c +++ b/drivers/i2c/busses/i2c-stub.c @@ -33,7 +33,7 @@  static unsigned short chip_addr[MAX_CHIPS];  module_param_array(chip_addr, ushort, NULL, S_IRUGO);  MODULE_PARM_DESC(chip_addr, -		 "Chip addresses (up to 10, between 0x03 and 0x77)\n"); +		 "Chip addresses (up to 10, between 0x03 and 0x77)");  struct stub_chip {  	u8 pointer; diff --git a/drivers/i2c/busses/i2c-taos-evm.c b/drivers/i2c/busses/i2c-taos-evm.c index 1b0cfd5472f..de9db49e54d 100644 --- a/drivers/i2c/busses/i2c-taos-evm.c +++ b/drivers/i2c/busses/i2c-taos-evm.c @@ -51,7 +51,6 @@ struct taos_data {  /* TAOS TSL2550 EVM */  static struct i2c_board_info tsl2550_info = {  	I2C_BOARD_INFO("tsl2550", 0x39), -	.type	= "tsl2550",  };  /* Instantiate i2c devices based on the adapter name */ @@ -59,7 +58,7 @@ static struct i2c_client *taos_instantiate_device(struct i2c_adapter *adapter)  {  	if (!strncmp(adapter->name, "TAOS TSL2550 EVM", 16)) {  		dev_info(&adapter->dev, "Instantiating device %s at 0x%02x\n", -			tsl2550_info.driver_name, tsl2550_info.addr); +			tsl2550_info.type, tsl2550_info.addr);  		return i2c_new_device(adapter, &tsl2550_info);  	} diff --git a/drivers/i2c/chips/ds1682.c b/drivers/i2c/chips/ds1682.c index 9e94542c18a..23be4d42cb0 100644 --- a/drivers/i2c/chips/ds1682.c +++ b/drivers/i2c/chips/ds1682.c @@ -200,7 +200,8 @@ static struct bin_attribute ds1682_eeprom_attr = {  /*   * Called when a ds1682 device is matched with this driver   */ -static int ds1682_probe(struct i2c_client *client) +static int ds1682_probe(struct i2c_client *client, +			const struct i2c_device_id *id)  {  	int rc; @@ -234,12 +235,19 @@ static int ds1682_remove(struct i2c_client *client)  	return 0;  } +static const struct i2c_device_id ds1682_id[] = { +	{ "ds1682", 0 }, +	{ } +}; +MODULE_DEVICE_TABLE(i2c, ds1682_id); +  static struct i2c_driver ds1682_driver = {  	.driver = {  		.name = "ds1682",  	},  	.probe = ds1682_probe,  	.remove = ds1682_remove, +	.id_table = ds1682_id,  };  static int __init ds1682_init(void) diff --git a/drivers/i2c/chips/menelaus.c b/drivers/i2c/chips/menelaus.c index 2dea0123a95..b36db1797c1 100644 --- a/drivers/i2c/chips/menelaus.c +++ b/drivers/i2c/chips/menelaus.c @@ -1149,7 +1149,8 @@ static inline void menelaus_rtc_init(struct menelaus_chip *m)  static struct i2c_driver menelaus_i2c_driver; -static int menelaus_probe(struct i2c_client *client) +static int menelaus_probe(struct i2c_client *client, +			  const struct i2c_device_id *id)  {  	struct menelaus_chip	*menelaus;  	int			rev = 0, val; @@ -1242,12 +1243,19 @@ static int __exit menelaus_remove(struct i2c_client *client)  	return 0;  } +static const struct i2c_device_id menelaus_id[] = { +	{ "menelaus", 0 }, +	{ } +}; +MODULE_DEVICE_TABLE(i2c, menelaus_id); +  static struct i2c_driver menelaus_i2c_driver = {  	.driver = {  		.name		= DRIVER_NAME,  	},  	.probe		= menelaus_probe,  	.remove		= __exit_p(menelaus_remove), +	.id_table	= menelaus_id,  };  static int __init menelaus_init(void) diff --git a/drivers/i2c/chips/tps65010.c b/drivers/i2c/chips/tps65010.c index b67f69c2e7f..85949685191 100644 --- a/drivers/i2c/chips/tps65010.c +++ b/drivers/i2c/chips/tps65010.c @@ -64,7 +64,6 @@ static struct i2c_driver tps65010_driver;   * as part of board setup by a bootloader.   */  enum tps_model { -	TPS_UNKNOWN = 0,  	TPS65010,  	TPS65011,  	TPS65012, @@ -527,11 +526,13 @@ static int __exit tps65010_remove(struct i2c_client *client)  	flush_scheduled_work();  	debugfs_remove(tps->file);  	kfree(tps); +	i2c_set_clientdata(client, NULL);  	the_tps = NULL;  	return 0;  } -static int tps65010_probe(struct i2c_client *client) +static int tps65010_probe(struct i2c_client *client, +			  const struct i2c_device_id *id)  {  	struct tps65010		*tps;  	int			status; @@ -552,20 +553,7 @@ static int tps65010_probe(struct i2c_client *client)  	mutex_init(&tps->lock);  	INIT_DELAYED_WORK(&tps->work, tps65010_work);  	tps->client = client; - -	if (strcmp(client->name, "tps65010") == 0) -		tps->model = TPS65010; -	else if (strcmp(client->name, "tps65011") == 0) -		tps->model = TPS65011; -	else if (strcmp(client->name, "tps65012") == 0) -		tps->model = TPS65012; -	else if (strcmp(client->name, "tps65013") == 0) -		tps->model = TPS65013; -	else { -		dev_warn(&client->dev, "unknown chip '%s'\n", client->name); -		status = -ENODEV; -		goto fail1; -	} +	tps->model = id->driver_data;  	/* the IRQ is active low, but many gpio lines can't support that  	 * so this driver uses falling-edge triggers instead. @@ -594,9 +582,6 @@ static int tps65010_probe(struct i2c_client *client)  	case TPS65012:  		tps->por = 1;  		break; -	case TPS_UNKNOWN: -		printk(KERN_WARNING "%s: unknown TPS chip\n", DRIVER_NAME); -		break;  	/* else CHGCONFIG.POR is replaced by AUA, enabling a WAIT mode */  	}  	tps->chgconf = i2c_smbus_read_byte_data(client, TPS_CHGCONFIG); @@ -615,6 +600,7 @@ static int tps65010_probe(struct i2c_client *client)  		i2c_smbus_read_byte_data(client, TPS_DEFGPIO),  		i2c_smbus_read_byte_data(client, TPS_MASK3)); +	i2c_set_clientdata(client, tps);  	the_tps = tps;  #if	defined(CONFIG_USB_GADGET) && !defined(CONFIG_USB_OTG) @@ -682,12 +668,22 @@ fail1:  	return status;  } +static const struct i2c_device_id tps65010_id[] = { +	{ "tps65010", TPS65010 }, +	{ "tps65011", TPS65011 }, +	{ "tps65012", TPS65012 }, +	{ "tps65013", TPS65013 }, +	{ } +}; +MODULE_DEVICE_TABLE(i2c, tps65010_id); +  static struct i2c_driver tps65010_driver = {  	.driver = {  		.name	= "tps65010",  	},  	.probe	= tps65010_probe,  	.remove	= __exit_p(tps65010_remove), +	.id_table = tps65010_id,  };  /*-------------------------------------------------------------------------*/ diff --git a/drivers/i2c/chips/tsl2550.c b/drivers/i2c/chips/tsl2550.c index a10fd2791a6..1a9cc135219 100644 --- a/drivers/i2c/chips/tsl2550.c +++ b/drivers/i2c/chips/tsl2550.c @@ -364,7 +364,8 @@ static int tsl2550_init_client(struct i2c_client *client)   */  static struct i2c_driver tsl2550_driver; -static int __devinit tsl2550_probe(struct i2c_client *client) +static int __devinit tsl2550_probe(struct i2c_client *client, +				   const struct i2c_device_id *id)  {  	struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent);  	struct tsl2550_data *data; @@ -451,6 +452,12 @@ static int tsl2550_resume(struct i2c_client *client)  #endif /* CONFIG_PM */ +static const struct i2c_device_id tsl2550_id[] = { +	{ "tsl2550", 0 }, +	{ } +}; +MODULE_DEVICE_TABLE(i2c, tsl2550_id); +  static struct i2c_driver tsl2550_driver = {  	.driver = {  		.name	= TSL2550_DRV_NAME, @@ -460,6 +467,7 @@ static struct i2c_driver tsl2550_driver = {  	.resume	= tsl2550_resume,  	.probe	= tsl2550_probe,  	.remove	= __devexit_p(tsl2550_remove), +	.id_table = tsl2550_id,  };  static int __init tsl2550_init(void) diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 6c7fa8d53c0..26384daccb9 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c @@ -48,6 +48,17 @@ static DEFINE_IDR(i2c_adapter_idr);  /* ------------------------------------------------------------------------- */ +static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id, +						const struct i2c_client *client) +{ +	while (id->name[0]) { +		if (strcmp(client->name, id->name) == 0) +			return id; +		id++; +	} +	return NULL; +} +  static int i2c_device_match(struct device *dev, struct device_driver *drv)  {  	struct i2c_client	*client = to_i2c_client(dev); @@ -59,6 +70,10 @@ static int i2c_device_match(struct device *dev, struct device_driver *drv)  	if (!is_newstyle_driver(driver))  		return 0; +	/* match on an id table if there is one */ +	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.  	 */ @@ -73,11 +88,17 @@ static int i2c_device_uevent(struct device *dev, struct kobj_uevent_env *env)  	struct i2c_client	*client = to_i2c_client(dev);  	/* by definition, legacy drivers can't hotplug */ -	if (dev->driver || !client->driver_name) +	if (dev->driver)  		return 0; -	if (add_uevent_var(env, "MODALIAS=%s", client->driver_name)) -		return -ENOMEM; +	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; +	}  	dev_dbg(dev, "uevent\n");  	return 0;  } @@ -90,13 +111,19 @@ static int i2c_device_probe(struct device *dev)  {  	struct i2c_client	*client = to_i2c_client(dev);  	struct i2c_driver	*driver = to_i2c_driver(dev->driver); +	const struct i2c_device_id *id;  	int status;  	if (!driver->probe)  		return -ENODEV;  	client->driver = driver;  	dev_dbg(dev, "probe\n"); -	status = driver->probe(client); + +	if (driver->id_table) +		id = i2c_match_id(driver->id_table, client); +	else +		id = NULL; +	status = driver->probe(client, id);  	if (status)  		client->driver = NULL;  	return status; @@ -179,9 +206,9 @@ 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 +	return client->driver_name[0]  		? sprintf(buf, "%s\n", client->driver_name) -		: 0; +		: sprintf(buf, "%s%s\n", I2C_MODULE_PREFIX, client->name);  }  static struct device_attribute i2c_dev_attrs[] = { @@ -300,15 +327,21 @@ void i2c_unregister_device(struct i2c_client *client)  EXPORT_SYMBOL_GPL(i2c_unregister_device); -static int dummy_nop(struct i2c_client *client) +static int dummy_probe(struct i2c_client *client, +		       const struct i2c_device_id *id) +{ +	return 0; +} + +static int dummy_remove(struct i2c_client *client)  {  	return 0;  }  static struct i2c_driver dummy_driver = {  	.driver.name	= "dummy", -	.probe		= dummy_nop, -	.remove		= dummy_nop, +	.probe		= dummy_probe, +	.remove		= dummy_remove,  };  /** | 
