diff options
Diffstat (limited to 'drivers/i2c')
| -rw-r--r-- | drivers/i2c/busses/Kconfig | 1 | ||||
| -rw-r--r-- | drivers/i2c/busses/i2c-piix4.c | 9 | ||||
| -rw-r--r-- | drivers/i2c/i2c-core-base.c | 4 | ||||
| -rw-r--r-- | drivers/i2c/i2c-smbus.c | 15 | ||||
| -rw-r--r-- | drivers/i2c/muxes/i2c-mux-gpio.c | 14 | 
5 files changed, 26 insertions, 17 deletions
| diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 3e32fb882101..a22f9125322a 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig @@ -196,6 +196,7 @@ config I2C_ISMT  config I2C_PIIX4  	tristate "Intel PIIX4 and compatible (ATI/AMD/Serverworks/Broadcom/SMSC)"  	depends on PCI && HAS_IOPORT +	select I2C_SMBUS  	help  	  If you say yes to this option, support will be included for the Intel  	  PIIX4 family of mainboard I2C interfaces.  Specifically, the following diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index 84aa18d1003b..4e32d57ae0bf 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c @@ -29,6 +29,7 @@  #include <linux/stddef.h>  #include <linux/ioport.h>  #include <linux/i2c.h> +#include <linux/i2c-smbus.h>  #include <linux/slab.h>  #include <linux/dmi.h>  #include <linux/acpi.h> @@ -982,6 +983,14 @@ static int piix4_add_adapter(struct pci_dev *dev, unsigned short smba,  		return retval;  	} +	/* +	 * The AUX bus can not be probed as on some platforms it reports all +	 * devices present and all reads return "0". +	 * This would allow the ee1004 to be probed incorrectly. +	 */ +	if (port == 0) +		i2c_register_spd(adap); +  	*padap = adap;  	return 0;  } diff --git a/drivers/i2c/i2c-core-base.c b/drivers/i2c/i2c-core-base.c index f76b7f4fafc1..b63f75e44296 100644 --- a/drivers/i2c/i2c-core-base.c +++ b/drivers/i2c/i2c-core-base.c @@ -136,10 +136,10 @@ const void *i2c_get_match_data(const struct i2c_client *client)  }  EXPORT_SYMBOL(i2c_get_match_data); -static int i2c_device_match(struct device *dev, struct device_driver *drv) +static int i2c_device_match(struct device *dev, const struct device_driver *drv)  {  	struct i2c_client	*client = i2c_verify_client(dev); -	struct i2c_driver	*driver; +	const struct i2c_driver	*driver;  	/* Attempt an OF style match */ diff --git a/drivers/i2c/i2c-smbus.c b/drivers/i2c/i2c-smbus.c index 1cb137b9181d..7e4203df83ed 100644 --- a/drivers/i2c/i2c-smbus.c +++ b/drivers/i2c/i2c-smbus.c @@ -352,18 +352,11 @@ void i2c_register_spd(struct i2c_adapter *adap)  		return;  	/* -	 * If we're a child adapter on a muxed segment, then limit slots to 8, -	 * as this is the max number of SPD EEPROMs that can be addressed per bus. +	 * The max number of SPD EEPROMs that can be addressed per bus is 8. +	 * If more slots are present either muxed or multiple busses are +	 * necessary or the additional slots are ignored.  	 */ -	if (i2c_parent_is_i2c_adapter(adap)) { -		slot_count = 8; -	} else { -		if (slot_count > 8) { -			dev_warn(&adap->dev, -				 "More than 8 memory slots on a single bus, contact i801 maintainer to add missing mux config\n"); -			return; -		} -	} +	slot_count = min(slot_count, 8);  	/*  	 * Memory types could be found at section 7.18.2 (Memory Device — Type), table 78 diff --git a/drivers/i2c/muxes/i2c-mux-gpio.c b/drivers/i2c/muxes/i2c-mux-gpio.c index d6bbb8b68333..944577bb09c1 100644 --- a/drivers/i2c/muxes/i2c-mux-gpio.c +++ b/drivers/i2c/muxes/i2c-mux-gpio.c @@ -5,16 +5,17 @@   * Peter Korsgaard <[email protected]>   */ +#include <linux/bits.h> +#include <linux/delay.h> +#include <linux/gpio/consumer.h> +#include <linux/gpio/driver.h>  #include <linux/i2c.h>  #include <linux/i2c-mux.h> +#include <linux/module.h>  #include <linux/overflow.h>  #include <linux/platform_data/i2c-mux-gpio.h>  #include <linux/platform_device.h> -#include <linux/module.h>  #include <linux/slab.h> -#include <linux/bits.h> -#include <linux/gpio/consumer.h> -#include <linux/gpio/driver.h>  struct gpiomux {  	struct i2c_mux_gpio_platform_data data; @@ -37,6 +38,9 @@ static int i2c_mux_gpio_select(struct i2c_mux_core *muxc, u32 chan)  	i2c_mux_gpio_set(mux, chan); +	if (mux->data.settle_time) +		fsleep(mux->data.settle_time); +  	return 0;  } @@ -116,6 +120,8 @@ static int i2c_mux_gpio_probe_fw(struct gpiomux *mux,  	if (device_property_read_u32(dev, "idle-state", &mux->data.idle))  		mux->data.idle = I2C_MUX_GPIO_NO_IDLE; +	device_property_read_u32(dev, "settle-time-us", &mux->data.settle_time); +  	return 0;  } |