diff options
37 files changed, 483 insertions, 498 deletions
diff --git a/Documentation/devicetree/bindings/i2c/mux.txt b/Documentation/devicetree/bindings/i2c/mux.txt new file mode 100644 index 000000000000..af84cce5cd7b --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/mux.txt | |||
| @@ -0,0 +1,60 @@ | |||
| 1 | Common i2c bus multiplexer/switch properties. | ||
| 2 | |||
| 3 | An i2c bus multiplexer/switch will have several child busses that are | ||
| 4 | numbered uniquely in a device dependent manner. The nodes for an i2c bus | ||
| 5 | multiplexer/switch will have one child node for each child | ||
| 6 | bus. | ||
| 7 | |||
| 8 | Required properties: | ||
| 9 | - #address-cells = <1>; | ||
| 10 | - #size-cells = <0>; | ||
| 11 | |||
| 12 | Required properties for child nodes: | ||
| 13 | - #address-cells = <1>; | ||
| 14 | - #size-cells = <0>; | ||
| 15 | - reg : The sub-bus number. | ||
| 16 | |||
| 17 | Optional properties for child nodes: | ||
| 18 | - Other properties specific to the multiplexer/switch hardware. | ||
| 19 | - Child nodes conforming to i2c bus binding | ||
| 20 | |||
| 21 | |||
| 22 | Example : | ||
| 23 | |||
| 24 | /* | ||
| 25 | An NXP pca9548 8 channel I2C multiplexer at address 0x70 | ||
| 26 | with two NXP pca8574 GPIO expanders attached, one each to | ||
| 27 | ports 3 and 4. | ||
| 28 | */ | ||
| 29 | |||
| 30 | mux@70 { | ||
| 31 | compatible = "nxp,pca9548"; | ||
| 32 | reg = <0x70>; | ||
| 33 | #address-cells = <1>; | ||
| 34 | #size-cells = <0>; | ||
| 35 | |||
| 36 | i2c@3 { | ||
| 37 | #address-cells = <1>; | ||
| 38 | #size-cells = <0>; | ||
| 39 | reg = <3>; | ||
| 40 | |||
| 41 | gpio1: gpio@38 { | ||
| 42 | compatible = "nxp,pca8574"; | ||
| 43 | reg = <0x38>; | ||
| 44 | #gpio-cells = <2>; | ||
| 45 | gpio-controller; | ||
| 46 | }; | ||
| 47 | }; | ||
| 48 | i2c@4 { | ||
| 49 | #address-cells = <1>; | ||
| 50 | #size-cells = <0>; | ||
| 51 | reg = <4>; | ||
| 52 | |||
| 53 | gpio2: gpio@38 { | ||
| 54 | compatible = "nxp,pca8574"; | ||
| 55 | reg = <0x38>; | ||
| 56 | #gpio-cells = <2>; | ||
| 57 | gpio-controller; | ||
| 58 | }; | ||
| 59 | }; | ||
| 60 | }; | ||
diff --git a/Documentation/devicetree/bindings/i2c/samsung-i2c.txt b/Documentation/devicetree/bindings/i2c/samsung-i2c.txt index 38832c712919..b6cb5a12c672 100644 --- a/Documentation/devicetree/bindings/i2c/samsung-i2c.txt +++ b/Documentation/devicetree/bindings/i2c/samsung-i2c.txt | |||
| @@ -6,14 +6,18 @@ Required properties: | |||
| 6 | - compatible: value should be either of the following. | 6 | - compatible: value should be either of the following. |
| 7 | (a) "samsung, s3c2410-i2c", for i2c compatible with s3c2410 i2c. | 7 | (a) "samsung, s3c2410-i2c", for i2c compatible with s3c2410 i2c. |
| 8 | (b) "samsung, s3c2440-i2c", for i2c compatible with s3c2440 i2c. | 8 | (b) "samsung, s3c2440-i2c", for i2c compatible with s3c2440 i2c. |
| 9 | (c) "samsung, s3c2440-hdmiphy-i2c", for s3c2440-like i2c used | ||
| 10 | inside HDMIPHY block found on several samsung SoCs | ||
| 9 | - reg: physical base address of the controller and length of memory mapped | 11 | - reg: physical base address of the controller and length of memory mapped |
| 10 | region. | 12 | region. |
| 11 | - interrupts: interrupt number to the cpu. | 13 | - interrupts: interrupt number to the cpu. |
| 12 | - samsung,i2c-sda-delay: Delay (in ns) applied to data line (SDA) edges. | 14 | - samsung,i2c-sda-delay: Delay (in ns) applied to data line (SDA) edges. |
| 13 | - gpios: The order of the gpios should be the following: <SDA, SCL>. | ||
| 14 | The gpio specifier depends on the gpio controller. | ||
| 15 | 15 | ||
| 16 | Optional properties: | 16 | Optional properties: |
| 17 | - gpios: The order of the gpios should be the following: <SDA, SCL>. | ||
| 18 | The gpio specifier depends on the gpio controller. Required in all | ||
| 19 | cases except for "samsung,s3c2440-hdmiphy-i2c" whose input/output | ||
| 20 | lines are permanently wired to the respective client | ||
| 17 | - samsung,i2c-slave-addr: Slave address in multi-master enviroment. If not | 21 | - samsung,i2c-slave-addr: Slave address in multi-master enviroment. If not |
| 18 | specified, default value is 0. | 22 | specified, default value is 0. |
| 19 | - samsung,i2c-max-bus-freq: Desired frequency in Hz of the bus. If not | 23 | - samsung,i2c-max-bus-freq: Desired frequency in Hz of the bus. If not |
diff --git a/Documentation/devicetree/bindings/i2c/xiic.txt b/Documentation/devicetree/bindings/i2c/xiic.txt new file mode 100644 index 000000000000..ceabbe91ae44 --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/xiic.txt | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | Xilinx IIC controller: | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible : Must be "xlnx,xps-iic-2.00.a" | ||
| 5 | - reg : IIC register location and length | ||
| 6 | - interrupts : IIC controller unterrupt | ||
| 7 | - #address-cells = <1> | ||
| 8 | - #size-cells = <0> | ||
| 9 | |||
| 10 | Optional properties: | ||
| 11 | - Child nodes conforming to i2c bus binding | ||
| 12 | |||
| 13 | Example: | ||
| 14 | |||
| 15 | axi_iic_0: i2c@40800000 { | ||
| 16 | compatible = "xlnx,xps-iic-2.00.a"; | ||
| 17 | interrupts = < 1 2 >; | ||
| 18 | reg = < 0x40800000 0x10000 >; | ||
| 19 | |||
| 20 | #size-cells = <0>; | ||
| 21 | #address-cells = <1>; | ||
| 22 | }; | ||
diff --git a/Documentation/i2c/muxes/gpio-i2cmux b/Documentation/i2c/muxes/i2c-mux-gpio index 811cd78d4cdc..bd9b2299b739 100644 --- a/Documentation/i2c/muxes/gpio-i2cmux +++ b/Documentation/i2c/muxes/i2c-mux-gpio | |||
| @@ -1,11 +1,11 @@ | |||
| 1 | Kernel driver gpio-i2cmux | 1 | Kernel driver i2c-gpio-mux |
| 2 | 2 | ||
| 3 | Author: Peter Korsgaard <peter.korsgaard@barco.com> | 3 | Author: Peter Korsgaard <peter.korsgaard@barco.com> |
| 4 | 4 | ||
| 5 | Description | 5 | Description |
| 6 | ----------- | 6 | ----------- |
| 7 | 7 | ||
| 8 | gpio-i2cmux is an i2c mux driver providing access to I2C bus segments | 8 | i2c-gpio-mux is an i2c mux driver providing access to I2C bus segments |
| 9 | from a master I2C bus and a hardware MUX controlled through GPIO pins. | 9 | from a master I2C bus and a hardware MUX controlled through GPIO pins. |
| 10 | 10 | ||
| 11 | E.G.: | 11 | E.G.: |
| @@ -26,16 +26,16 @@ according to the settings of the GPIO pins 1..N. | |||
| 26 | Usage | 26 | Usage |
| 27 | ----- | 27 | ----- |
| 28 | 28 | ||
| 29 | gpio-i2cmux uses the platform bus, so you need to provide a struct | 29 | i2c-gpio-mux uses the platform bus, so you need to provide a struct |
| 30 | platform_device with the platform_data pointing to a struct | 30 | platform_device with the platform_data pointing to a struct |
| 31 | gpio_i2cmux_platform_data with the I2C adapter number of the master | 31 | gpio_i2cmux_platform_data with the I2C adapter number of the master |
| 32 | bus, the number of bus segments to create and the GPIO pins used | 32 | bus, the number of bus segments to create and the GPIO pins used |
| 33 | to control it. See include/linux/gpio-i2cmux.h for details. | 33 | to control it. See include/linux/i2c-gpio-mux.h for details. |
| 34 | 34 | ||
| 35 | E.G. something like this for a MUX providing 4 bus segments | 35 | E.G. something like this for a MUX providing 4 bus segments |
| 36 | controlled through 3 GPIO pins: | 36 | controlled through 3 GPIO pins: |
| 37 | 37 | ||
| 38 | #include <linux/gpio-i2cmux.h> | 38 | #include <linux/i2c-gpio-mux.h> |
| 39 | #include <linux/platform_device.h> | 39 | #include <linux/platform_device.h> |
| 40 | 40 | ||
| 41 | static const unsigned myboard_gpiomux_gpios[] = { | 41 | static const unsigned myboard_gpiomux_gpios[] = { |
| @@ -57,7 +57,7 @@ static struct gpio_i2cmux_platform_data myboard_i2cmux_data = { | |||
| 57 | }; | 57 | }; |
| 58 | 58 | ||
| 59 | static struct platform_device myboard_i2cmux = { | 59 | static struct platform_device myboard_i2cmux = { |
| 60 | .name = "gpio-i2cmux", | 60 | .name = "i2c-gpio-mux", |
| 61 | .id = 0, | 61 | .id = 0, |
| 62 | .dev = { | 62 | .dev = { |
| 63 | .platform_data = &myboard_i2cmux_data, | 63 | .platform_data = &myboard_i2cmux_data, |
diff --git a/MAINTAINERS b/MAINTAINERS index daa31999b2a1..6f90c64a2539 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -2988,9 +2988,9 @@ GENERIC GPIO I2C MULTIPLEXER DRIVER | |||
| 2988 | M: Peter Korsgaard <peter.korsgaard@barco.com> | 2988 | M: Peter Korsgaard <peter.korsgaard@barco.com> |
| 2989 | L: linux-i2c@vger.kernel.org | 2989 | L: linux-i2c@vger.kernel.org |
| 2990 | S: Supported | 2990 | S: Supported |
| 2991 | F: drivers/i2c/muxes/gpio-i2cmux.c | 2991 | F: drivers/i2c/muxes/i2c-mux-gpio.c |
| 2992 | F: include/linux/gpio-i2cmux.h | 2992 | F: include/linux/i2c-mux-gpio.h |
| 2993 | F: Documentation/i2c/muxes/gpio-i2cmux | 2993 | F: Documentation/i2c/muxes/i2c-mux-gpio |
| 2994 | 2994 | ||
| 2995 | GENERIC HDLC (WAN) DRIVERS | 2995 | GENERIC HDLC (WAN) DRIVERS |
| 2996 | M: Krzysztof Halasa <khc@pm.waw.pl> | 2996 | M: Krzysztof Halasa <khc@pm.waw.pl> |
| @@ -5148,7 +5148,7 @@ PCA9541 I2C BUS MASTER SELECTOR DRIVER | |||
| 5148 | M: Guenter Roeck <guenter.roeck@ericsson.com> | 5148 | M: Guenter Roeck <guenter.roeck@ericsson.com> |
| 5149 | L: linux-i2c@vger.kernel.org | 5149 | L: linux-i2c@vger.kernel.org |
| 5150 | S: Maintained | 5150 | S: Maintained |
| 5151 | F: drivers/i2c/muxes/pca9541.c | 5151 | F: drivers/i2c/muxes/i2c-mux-pca9541.c |
| 5152 | 5152 | ||
| 5153 | PCA9564/PCA9665 I2C BUS DRIVER | 5153 | PCA9564/PCA9665 I2C BUS DRIVER |
| 5154 | M: Wolfram Sang <w.sang@pengutronix.de> | 5154 | M: Wolfram Sang <w.sang@pengutronix.de> |
diff --git a/drivers/i2c/Kconfig b/drivers/i2c/Kconfig index 5f13c62e64b4..5a3bb3d738d8 100644 --- a/drivers/i2c/Kconfig +++ b/drivers/i2c/Kconfig | |||
| @@ -49,7 +49,6 @@ config I2C_CHARDEV | |||
| 49 | 49 | ||
| 50 | config I2C_MUX | 50 | config I2C_MUX |
| 51 | tristate "I2C bus multiplexing support" | 51 | tristate "I2C bus multiplexing support" |
| 52 | depends on EXPERIMENTAL | ||
| 53 | help | 52 | help |
| 54 | Say Y here if you want the I2C core to support the ability to | 53 | Say Y here if you want the I2C core to support the ability to |
| 55 | handle multiplexed I2C bus topologies, by presenting each | 54 | handle multiplexed I2C bus topologies, by presenting each |
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index eec2cf57539a..7244c8be6063 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -445,20 +445,6 @@ config I2C_IOP3XX | |||
| 445 | This driver can also be built as a module. If so, the module | 445 | This driver can also be built as a module. If so, the module |
| 446 | will be called i2c-iop3xx. | 446 | will be called i2c-iop3xx. |
| 447 | 447 | ||
| 448 | config I2C_IXP2000 | ||
| 449 | tristate "IXP2000 GPIO-Based I2C Interface (DEPRECATED)" | ||
| 450 | depends on ARCH_IXP2000 | ||
| 451 | select I2C_ALGOBIT | ||
| 452 | help | ||
| 453 | Say Y here if you have an Intel IXP2000 (2400, 2800, 2850) based | ||
| 454 | system and are using GPIO lines for an I2C bus. | ||
| 455 | |||
| 456 | This support is also available as a module. If so, the module | ||
| 457 | will be called i2c-ixp2000. | ||
| 458 | |||
| 459 | This driver is deprecated and will be dropped soon. Use i2c-gpio | ||
| 460 | instead. | ||
| 461 | |||
| 462 | config I2C_MPC | 448 | config I2C_MPC |
| 463 | tristate "MPC107/824x/85xx/512x/52xx/83xx/86xx" | 449 | tristate "MPC107/824x/85xx/512x/52xx/83xx/86xx" |
| 464 | depends on PPC | 450 | depends on PPC |
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile index 569567b0d027..ce3c2be7fb40 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile | |||
| @@ -44,7 +44,6 @@ obj-$(CONFIG_I2C_IBM_IIC) += i2c-ibm_iic.o | |||
| 44 | obj-$(CONFIG_I2C_IMX) += i2c-imx.o | 44 | obj-$(CONFIG_I2C_IMX) += i2c-imx.o |
| 45 | obj-$(CONFIG_I2C_INTEL_MID) += i2c-intel-mid.o | 45 | obj-$(CONFIG_I2C_INTEL_MID) += i2c-intel-mid.o |
| 46 | obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o | 46 | obj-$(CONFIG_I2C_IOP3XX) += i2c-iop3xx.o |
| 47 | obj-$(CONFIG_I2C_IXP2000) += i2c-ixp2000.o | ||
| 48 | obj-$(CONFIG_I2C_MPC) += i2c-mpc.o | 47 | obj-$(CONFIG_I2C_MPC) += i2c-mpc.o |
| 49 | obj-$(CONFIG_I2C_MV64XXX) += i2c-mv64xxx.o | 48 | obj-$(CONFIG_I2C_MV64XXX) += i2c-mv64xxx.o |
| 50 | obj-$(CONFIG_I2C_MXS) += i2c-mxs.o | 49 | obj-$(CONFIG_I2C_MXS) += i2c-mxs.o |
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index a76d85fa3ad7..79b4bcb3b85c 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c | |||
| @@ -755,7 +755,7 @@ static int davinci_i2c_remove(struct platform_device *pdev) | |||
| 755 | dev->clk = NULL; | 755 | dev->clk = NULL; |
| 756 | 756 | ||
| 757 | davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, 0); | 757 | davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, 0); |
| 758 | free_irq(IRQ_I2C, dev); | 758 | free_irq(dev->irq, dev); |
| 759 | iounmap(dev->base); | 759 | iounmap(dev->base); |
| 760 | kfree(dev); | 760 | kfree(dev); |
| 761 | 761 | ||
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index df8799241009..1e48bec80edf 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
| @@ -164,9 +164,15 @@ static char *abort_sources[] = { | |||
| 164 | 164 | ||
| 165 | u32 dw_readl(struct dw_i2c_dev *dev, int offset) | 165 | u32 dw_readl(struct dw_i2c_dev *dev, int offset) |
| 166 | { | 166 | { |
| 167 | u32 value = readl(dev->base + offset); | 167 | u32 value; |
| 168 | 168 | ||
| 169 | if (dev->swab) | 169 | if (dev->accessor_flags & ACCESS_16BIT) |
| 170 | value = readw(dev->base + offset) | | ||
| 171 | (readw(dev->base + offset + 2) << 16); | ||
| 172 | else | ||
| 173 | value = readl(dev->base + offset); | ||
| 174 | |||
| 175 | if (dev->accessor_flags & ACCESS_SWAP) | ||
| 170 | return swab32(value); | 176 | return swab32(value); |
| 171 | else | 177 | else |
| 172 | return value; | 178 | return value; |
| @@ -174,10 +180,15 @@ u32 dw_readl(struct dw_i2c_dev *dev, int offset) | |||
| 174 | 180 | ||
| 175 | void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset) | 181 | void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset) |
| 176 | { | 182 | { |
| 177 | if (dev->swab) | 183 | if (dev->accessor_flags & ACCESS_SWAP) |
| 178 | b = swab32(b); | 184 | b = swab32(b); |
| 179 | 185 | ||
| 180 | writel(b, dev->base + offset); | 186 | if (dev->accessor_flags & ACCESS_16BIT) { |
| 187 | writew((u16)b, dev->base + offset); | ||
| 188 | writew((u16)(b >> 16), dev->base + offset + 2); | ||
| 189 | } else { | ||
| 190 | writel(b, dev->base + offset); | ||
| 191 | } | ||
| 181 | } | 192 | } |
| 182 | 193 | ||
| 183 | static u32 | 194 | static u32 |
| @@ -251,14 +262,14 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
| 251 | 262 | ||
| 252 | input_clock_khz = dev->get_clk_rate_khz(dev); | 263 | input_clock_khz = dev->get_clk_rate_khz(dev); |
| 253 | 264 | ||
| 254 | /* Configure register endianess access */ | ||
| 255 | reg = dw_readl(dev, DW_IC_COMP_TYPE); | 265 | reg = dw_readl(dev, DW_IC_COMP_TYPE); |
| 256 | if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) { | 266 | if (reg == ___constant_swab32(DW_IC_COMP_TYPE_VALUE)) { |
| 257 | dev->swab = 1; | 267 | /* Configure register endianess access */ |
| 258 | reg = DW_IC_COMP_TYPE_VALUE; | 268 | dev->accessor_flags |= ACCESS_SWAP; |
| 259 | } | 269 | } else if (reg == (DW_IC_COMP_TYPE_VALUE & 0x0000ffff)) { |
| 260 | 270 | /* Configure register access mode 16bit */ | |
| 261 | if (reg != DW_IC_COMP_TYPE_VALUE) { | 271 | dev->accessor_flags |= ACCESS_16BIT; |
| 272 | } else if (reg != DW_IC_COMP_TYPE_VALUE) { | ||
| 262 | dev_err(dev->dev, "Unknown Synopsys component type: " | 273 | dev_err(dev->dev, "Unknown Synopsys component type: " |
| 263 | "0x%08x\n", reg); | 274 | "0x%08x\n", reg); |
| 264 | return -ENODEV; | 275 | return -ENODEV; |
diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index 02d1a2ddd853..9c1840ee09c7 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h | |||
| @@ -82,7 +82,7 @@ struct dw_i2c_dev { | |||
| 82 | unsigned int status; | 82 | unsigned int status; |
| 83 | u32 abort_source; | 83 | u32 abort_source; |
| 84 | int irq; | 84 | int irq; |
| 85 | int swab; | 85 | u32 accessor_flags; |
| 86 | struct i2c_adapter adapter; | 86 | struct i2c_adapter adapter; |
| 87 | u32 functionality; | 87 | u32 functionality; |
| 88 | u32 master_cfg; | 88 | u32 master_cfg; |
| @@ -90,6 +90,9 @@ struct dw_i2c_dev { | |||
| 90 | unsigned int rx_fifo_depth; | 90 | unsigned int rx_fifo_depth; |
| 91 | }; | 91 | }; |
| 92 | 92 | ||
| 93 | #define ACCESS_SWAP 0x00000001 | ||
| 94 | #define ACCESS_16BIT 0x00000002 | ||
| 95 | |||
| 93 | extern u32 dw_readl(struct dw_i2c_dev *dev, int offset); | 96 | extern u32 dw_readl(struct dw_i2c_dev *dev, int offset); |
| 94 | extern void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset); | 97 | extern void dw_writel(struct dw_i2c_dev *dev, u32 b, int offset); |
| 95 | extern int i2c_dw_init(struct dw_i2c_dev *dev); | 98 | extern int i2c_dw_init(struct dw_i2c_dev *dev); |
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index 4ba589ab8614..0506fef8dc00 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c | |||
| @@ -36,6 +36,7 @@ | |||
| 36 | #include <linux/interrupt.h> | 36 | #include <linux/interrupt.h> |
| 37 | #include <linux/of_i2c.h> | 37 | #include <linux/of_i2c.h> |
| 38 | #include <linux/platform_device.h> | 38 | #include <linux/platform_device.h> |
| 39 | #include <linux/pm.h> | ||
| 39 | #include <linux/io.h> | 40 | #include <linux/io.h> |
| 40 | #include <linux/slab.h> | 41 | #include <linux/slab.h> |
| 41 | #include "i2c-designware-core.h" | 42 | #include "i2c-designware-core.h" |
| @@ -95,7 +96,7 @@ static int __devinit dw_i2c_probe(struct platform_device *pdev) | |||
| 95 | r = -ENODEV; | 96 | r = -ENODEV; |
| 96 | goto err_free_mem; | 97 | goto err_free_mem; |
| 97 | } | 98 | } |
| 98 | clk_enable(dev->clk); | 99 | clk_prepare_enable(dev->clk); |
| 99 | 100 | ||
| 100 | dev->functionality = | 101 | dev->functionality = |
| 101 | I2C_FUNC_I2C | | 102 | I2C_FUNC_I2C | |
| @@ -155,7 +156,7 @@ err_free_irq: | |||
| 155 | err_iounmap: | 156 | err_iounmap: |
| 156 | iounmap(dev->base); | 157 | iounmap(dev->base); |
| 157 | err_unuse_clocks: | 158 | err_unuse_clocks: |
| 158 | clk_disable(dev->clk); | 159 | clk_disable_unprepare(dev->clk); |
| 159 | clk_put(dev->clk); | 160 | clk_put(dev->clk); |
| 160 | dev->clk = NULL; | 161 | dev->clk = NULL; |
| 161 | err_free_mem: | 162 | err_free_mem: |
| @@ -177,7 +178,7 @@ static int __devexit dw_i2c_remove(struct platform_device *pdev) | |||
| 177 | i2c_del_adapter(&dev->adapter); | 178 | i2c_del_adapter(&dev->adapter); |
| 178 | put_device(&pdev->dev); | 179 | put_device(&pdev->dev); |
| 179 | 180 | ||
| 180 | clk_disable(dev->clk); | 181 | clk_disable_unprepare(dev->clk); |
| 181 | clk_put(dev->clk); | 182 | clk_put(dev->clk); |
| 182 | dev->clk = NULL; | 183 | dev->clk = NULL; |
| 183 | 184 | ||
| @@ -198,6 +199,31 @@ static const struct of_device_id dw_i2c_of_match[] = { | |||
| 198 | MODULE_DEVICE_TABLE(of, dw_i2c_of_match); | 199 | MODULE_DEVICE_TABLE(of, dw_i2c_of_match); |
| 199 | #endif | 200 | #endif |
| 200 | 201 | ||
| 202 | #ifdef CONFIG_PM | ||
| 203 | static int dw_i2c_suspend(struct device *dev) | ||
| 204 | { | ||
| 205 | struct platform_device *pdev = to_platform_device(dev); | ||
| 206 | struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev); | ||
| 207 | |||
| 208 | clk_disable_unprepare(i_dev->clk); | ||
| 209 | |||
| 210 | return 0; | ||
| 211 | } | ||
| 212 | |||
| 213 | static int dw_i2c_resume(struct device *dev) | ||
| 214 | { | ||
| 215 | struct platform_device *pdev = to_platform_device(dev); | ||
| 216 | struct dw_i2c_dev *i_dev = platform_get_drvdata(pdev); | ||
| 217 | |||
| 218 | clk_prepare_enable(i_dev->clk); | ||
| 219 | i2c_dw_init(i_dev); | ||
| 220 | |||
| 221 | return 0; | ||
| 222 | } | ||
| 223 | #endif | ||
| 224 | |||
| 225 | static SIMPLE_DEV_PM_OPS(dw_i2c_dev_pm_ops, dw_i2c_suspend, dw_i2c_resume); | ||
| 226 | |||
| 201 | /* work with hotplug and coldplug */ | 227 | /* work with hotplug and coldplug */ |
| 202 | MODULE_ALIAS("platform:i2c_designware"); | 228 | MODULE_ALIAS("platform:i2c_designware"); |
| 203 | 229 | ||
| @@ -207,6 +233,7 @@ static struct platform_driver dw_i2c_driver = { | |||
| 207 | .name = "i2c_designware", | 233 | .name = "i2c_designware", |
| 208 | .owner = THIS_MODULE, | 234 | .owner = THIS_MODULE, |
| 209 | .of_match_table = of_match_ptr(dw_i2c_of_match), | 235 | .of_match_table = of_match_ptr(dw_i2c_of_match), |
| 236 | .pm = &dw_i2c_dev_pm_ops, | ||
| 210 | }, | 237 | }, |
| 211 | }; | 238 | }; |
| 212 | 239 | ||
diff --git a/drivers/i2c/busses/i2c-eg20t.c b/drivers/i2c/busses/i2c-eg20t.c index c811289b61e2..2f74ae872e1e 100644 --- a/drivers/i2c/busses/i2c-eg20t.c +++ b/drivers/i2c/busses/i2c-eg20t.c | |||
| @@ -263,11 +263,6 @@ static void pch_i2c_init(struct i2c_algo_pch_data *adap) | |||
| 263 | init_waitqueue_head(&pch_event); | 263 | init_waitqueue_head(&pch_event); |
| 264 | } | 264 | } |
| 265 | 265 | ||
| 266 | static inline bool ktime_lt(const ktime_t cmp1, const ktime_t cmp2) | ||
| 267 | { | ||
| 268 | return cmp1.tv64 < cmp2.tv64; | ||
| 269 | } | ||
| 270 | |||
| 271 | /** | 266 | /** |
| 272 | * pch_i2c_wait_for_bus_idle() - check the status of bus. | 267 | * pch_i2c_wait_for_bus_idle() - check the status of bus. |
| 273 | * @adap: Pointer to struct i2c_algo_pch_data. | 268 | * @adap: Pointer to struct i2c_algo_pch_data. |
| @@ -317,33 +312,6 @@ static void pch_i2c_start(struct i2c_algo_pch_data *adap) | |||
| 317 | } | 312 | } |
| 318 | 313 | ||
| 319 | /** | 314 | /** |
| 320 | * pch_i2c_wait_for_xfer_complete() - initiates a wait for the tx complete event | ||
| 321 | * @adap: Pointer to struct i2c_algo_pch_data. | ||
| 322 | */ | ||
| 323 | static s32 pch_i2c_wait_for_xfer_complete(struct i2c_algo_pch_data *adap) | ||
| 324 | { | ||
| 325 | long ret; | ||
| 326 | ret = wait_event_timeout(pch_event, | ||
| 327 | (adap->pch_event_flag != 0), msecs_to_jiffies(1000)); | ||
| 328 | |||
| 329 | if (ret == 0) { | ||
| 330 | pch_err(adap, "timeout: %x\n", adap->pch_event_flag); | ||
| 331 | adap->pch_event_flag = 0; | ||
| 332 | return -ETIMEDOUT; | ||
| 333 | } | ||
| 334 | |||
| 335 | if (adap->pch_event_flag & I2C_ERROR_MASK) { | ||
| 336 | pch_err(adap, "error bits set: %x\n", adap->pch_event_flag); | ||
| 337 | adap->pch_event_flag = 0; | ||
| 338 | return -EIO; | ||
| 339 | } | ||
| 340 | |||
| 341 | adap->pch_event_flag = 0; | ||
| 342 | |||
| 343 | return 0; | ||
| 344 | } | ||
| 345 | |||
| 346 | /** | ||
| 347 | * pch_i2c_getack() - to confirm ACK/NACK | 315 | * pch_i2c_getack() - to confirm ACK/NACK |
| 348 | * @adap: Pointer to struct i2c_algo_pch_data. | 316 | * @adap: Pointer to struct i2c_algo_pch_data. |
| 349 | */ | 317 | */ |
| @@ -373,6 +341,40 @@ static void pch_i2c_stop(struct i2c_algo_pch_data *adap) | |||
| 373 | pch_clrbit(adap->pch_base_address, PCH_I2CCTL, PCH_START); | 341 | pch_clrbit(adap->pch_base_address, PCH_I2CCTL, PCH_START); |
| 374 | } | 342 | } |
| 375 | 343 | ||
| 344 | static int pch_i2c_wait_for_check_xfer(struct i2c_algo_pch_data *adap) | ||
| 345 | { | ||
| 346 | long ret; | ||
| 347 | |||
| 348 | ret = wait_event_timeout(pch_event, | ||
| 349 | (adap->pch_event_flag != 0), msecs_to_jiffies(1000)); | ||
| 350 | if (!ret) { | ||
| 351 | pch_err(adap, "%s:wait-event timeout\n", __func__); | ||
| 352 | adap->pch_event_flag = 0; | ||
| 353 | pch_i2c_stop(adap); | ||
| 354 | pch_i2c_init(adap); | ||
| 355 | return -ETIMEDOUT; | ||
| 356 | } | ||
| 357 | |||
| 358 | if (adap->pch_event_flag & I2C_ERROR_MASK) { | ||
| 359 | pch_err(adap, "Lost Arbitration\n"); | ||
| 360 | adap->pch_event_flag = 0; | ||
| 361 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMAL_BIT); | ||
| 362 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMIF_BIT); | ||
| 363 | pch_i2c_init(adap); | ||
| 364 | return -EAGAIN; | ||
| 365 | } | ||
| 366 | |||
| 367 | adap->pch_event_flag = 0; | ||
| 368 | |||
| 369 | if (pch_i2c_getack(adap)) { | ||
| 370 | pch_dbg(adap, "Receive NACK for slave address" | ||
| 371 | "setting\n"); | ||
| 372 | return -EIO; | ||
| 373 | } | ||
| 374 | |||
| 375 | return 0; | ||
| 376 | } | ||
| 377 | |||
| 376 | /** | 378 | /** |
| 377 | * pch_i2c_repstart() - generate repeated start condition in normal mode | 379 | * pch_i2c_repstart() - generate repeated start condition in normal mode |
| 378 | * @adap: Pointer to struct i2c_algo_pch_data. | 380 | * @adap: Pointer to struct i2c_algo_pch_data. |
| @@ -427,27 +429,12 @@ static s32 pch_i2c_writebytes(struct i2c_adapter *i2c_adap, | |||
| 427 | if (first) | 429 | if (first) |
| 428 | pch_i2c_start(adap); | 430 | pch_i2c_start(adap); |
| 429 | 431 | ||
| 430 | rtn = pch_i2c_wait_for_xfer_complete(adap); | 432 | rtn = pch_i2c_wait_for_check_xfer(adap); |
| 431 | if (rtn == 0) { | 433 | if (rtn) |
| 432 | if (pch_i2c_getack(adap)) { | 434 | return rtn; |
| 433 | pch_dbg(adap, "Receive NACK for slave address" | 435 | |
| 434 | "setting\n"); | 436 | addr_8_lsb = (addr & I2C_ADDR_MSK); |
| 435 | return -EIO; | 437 | iowrite32(addr_8_lsb, p + PCH_I2CDR); |
| 436 | } | ||
| 437 | addr_8_lsb = (addr & I2C_ADDR_MSK); | ||
| 438 | iowrite32(addr_8_lsb, p + PCH_I2CDR); | ||
| 439 | } else if (rtn == -EIO) { /* Arbitration Lost */ | ||
| 440 | pch_err(adap, "Lost Arbitration\n"); | ||
| 441 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, | ||
| 442 | I2CMAL_BIT); | ||
| 443 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, | ||
| 444 | I2CMIF_BIT); | ||
| 445 | pch_i2c_init(adap); | ||
| 446 | return -EAGAIN; | ||
| 447 | } else { /* wait-event timeout */ | ||
| 448 | pch_i2c_stop(adap); | ||
| 449 | return -ETIME; | ||
| 450 | } | ||
| 451 | } else { | 438 | } else { |
| 452 | /* set 7 bit slave address and R/W bit as 0 */ | 439 | /* set 7 bit slave address and R/W bit as 0 */ |
| 453 | iowrite32(addr << 1, p + PCH_I2CDR); | 440 | iowrite32(addr << 1, p + PCH_I2CDR); |
| @@ -455,44 +442,21 @@ static s32 pch_i2c_writebytes(struct i2c_adapter *i2c_adap, | |||
| 455 | pch_i2c_start(adap); | 442 | pch_i2c_start(adap); |
| 456 | } | 443 | } |
| 457 | 444 | ||
| 458 | rtn = pch_i2c_wait_for_xfer_complete(adap); | 445 | rtn = pch_i2c_wait_for_check_xfer(adap); |
| 459 | if (rtn == 0) { | 446 | if (rtn) |
| 460 | if (pch_i2c_getack(adap)) { | 447 | return rtn; |
| 461 | pch_dbg(adap, "Receive NACK for slave address" | ||
| 462 | "setting\n"); | ||
| 463 | return -EIO; | ||
| 464 | } | ||
| 465 | } else if (rtn == -EIO) { /* Arbitration Lost */ | ||
| 466 | pch_err(adap, "Lost Arbitration\n"); | ||
| 467 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMAL_BIT); | ||
| 468 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMIF_BIT); | ||
| 469 | pch_i2c_init(adap); | ||
| 470 | return -EAGAIN; | ||
| 471 | } else { /* wait-event timeout */ | ||
| 472 | pch_i2c_stop(adap); | ||
| 473 | return -ETIME; | ||
| 474 | } | ||
| 475 | 448 | ||
| 476 | for (wrcount = 0; wrcount < length; ++wrcount) { | 449 | for (wrcount = 0; wrcount < length; ++wrcount) { |
| 477 | /* write buffer value to I2C data register */ | 450 | /* write buffer value to I2C data register */ |
| 478 | iowrite32(buf[wrcount], p + PCH_I2CDR); | 451 | iowrite32(buf[wrcount], p + PCH_I2CDR); |
| 479 | pch_dbg(adap, "writing %x to Data register\n", buf[wrcount]); | 452 | pch_dbg(adap, "writing %x to Data register\n", buf[wrcount]); |
| 480 | 453 | ||
| 481 | rtn = pch_i2c_wait_for_xfer_complete(adap); | 454 | rtn = pch_i2c_wait_for_check_xfer(adap); |
| 482 | if (rtn == 0) { | 455 | if (rtn) |
| 483 | if (pch_i2c_getack(adap)) { | 456 | return rtn; |
| 484 | pch_dbg(adap, "Receive NACK for slave address" | 457 | |
| 485 | "setting\n"); | 458 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMCF_BIT); |
| 486 | return -EIO; | 459 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMIF_BIT); |
| 487 | } | ||
| 488 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, | ||
| 489 | I2CMCF_BIT); | ||
| 490 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, | ||
| 491 | I2CMIF_BIT); | ||
| 492 | } else { /* wait-event timeout */ | ||
| 493 | pch_i2c_stop(adap); | ||
| 494 | return -ETIME; | ||
| 495 | } | ||
| 496 | } | 460 | } |
| 497 | 461 | ||
| 498 | /* check if this is the last message */ | 462 | /* check if this is the last message */ |
| @@ -580,50 +544,21 @@ static s32 pch_i2c_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, | |||
| 580 | if (first) | 544 | if (first) |
| 581 | pch_i2c_start(adap); | 545 | pch_i2c_start(adap); |
| 582 | 546 | ||
| 583 | rtn = pch_i2c_wait_for_xfer_complete(adap); | 547 | rtn = pch_i2c_wait_for_check_xfer(adap); |
| 584 | if (rtn == 0) { | 548 | if (rtn) |
| 585 | if (pch_i2c_getack(adap)) { | 549 | return rtn; |
| 586 | pch_dbg(adap, "Receive NACK for slave address" | 550 | |
| 587 | "setting\n"); | 551 | addr_8_lsb = (addr & I2C_ADDR_MSK); |
| 588 | return -EIO; | 552 | iowrite32(addr_8_lsb, p + PCH_I2CDR); |
| 589 | } | 553 | |
| 590 | addr_8_lsb = (addr & I2C_ADDR_MSK); | ||
| 591 | iowrite32(addr_8_lsb, p + PCH_I2CDR); | ||
| 592 | } else if (rtn == -EIO) { /* Arbitration Lost */ | ||
| 593 | pch_err(adap, "Lost Arbitration\n"); | ||
| 594 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, | ||
| 595 | I2CMAL_BIT); | ||
| 596 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, | ||
| 597 | I2CMIF_BIT); | ||
| 598 | pch_i2c_init(adap); | ||
| 599 | return -EAGAIN; | ||
| 600 | } else { /* wait-event timeout */ | ||
| 601 | pch_i2c_stop(adap); | ||
| 602 | return -ETIME; | ||
| 603 | } | ||
| 604 | pch_i2c_restart(adap); | 554 | pch_i2c_restart(adap); |
| 605 | rtn = pch_i2c_wait_for_xfer_complete(adap); | 555 | |
| 606 | if (rtn == 0) { | 556 | rtn = pch_i2c_wait_for_check_xfer(adap); |
| 607 | if (pch_i2c_getack(adap)) { | 557 | if (rtn) |
| 608 | pch_dbg(adap, "Receive NACK for slave address" | 558 | return rtn; |
| 609 | "setting\n"); | 559 | |
| 610 | return -EIO; | 560 | addr_2_msb |= I2C_RD; |
| 611 | } | 561 | iowrite32(addr_2_msb | TEN_BIT_ADDR_MASK, p + PCH_I2CDR); |
| 612 | addr_2_msb |= I2C_RD; | ||
| 613 | iowrite32(addr_2_msb | TEN_BIT_ADDR_MASK, | ||
| 614 | p + PCH_I2CDR); | ||
| 615 | } else if (rtn == -EIO) { /* Arbitration Lost */ | ||
| 616 | pch_err(adap, "Lost Arbitration\n"); | ||
| 617 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, | ||
| 618 | I2CMAL_BIT); | ||
| 619 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, | ||
| 620 | I2CMIF_BIT); | ||
| 621 | pch_i2c_init(adap); | ||
| 622 | return -EAGAIN; | ||
| 623 | } else { /* wait-event timeout */ | ||
| 624 | pch_i2c_stop(adap); | ||
| 625 | return -ETIME; | ||
| 626 | } | ||
| 627 | } else { | 562 | } else { |
| 628 | /* 7 address bits + R/W bit */ | 563 | /* 7 address bits + R/W bit */ |
| 629 | addr = (((addr) << 1) | (I2C_RD)); | 564 | addr = (((addr) << 1) | (I2C_RD)); |
| @@ -634,23 +569,9 @@ static s32 pch_i2c_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, | |||
| 634 | if (first) | 569 | if (first) |
| 635 | pch_i2c_start(adap); | 570 | pch_i2c_start(adap); |
| 636 | 571 | ||
| 637 | rtn = pch_i2c_wait_for_xfer_complete(adap); | 572 | rtn = pch_i2c_wait_for_check_xfer(adap); |
| 638 | if (rtn == 0) { | 573 | if (rtn) |
| 639 | if (pch_i2c_getack(adap)) { | 574 | return rtn; |
| 640 | pch_dbg(adap, "Receive NACK for slave address" | ||
| 641 | "setting\n"); | ||
| 642 | return -EIO; | ||
| 643 | } | ||
| 644 | } else if (rtn == -EIO) { /* Arbitration Lost */ | ||
| 645 | pch_err(adap, "Lost Arbitration\n"); | ||
| 646 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMAL_BIT); | ||
| 647 | pch_clrbit(adap->pch_base_address, PCH_I2CSR, I2CMIF_BIT); | ||
| 648 | pch_i2c_init(adap); | ||
| 649 | return -EAGAIN; | ||
| 650 | } else { /* wait-event timeout */ | ||
| 651 | pch_i2c_stop(adap); | ||
| 652 | return -ETIME; | ||
| 653 | } | ||
| 654 | 575 | ||
| 655 | if (length == 0) { | 576 | if (length == 0) { |
| 656 | pch_i2c_stop(adap); | 577 | pch_i2c_stop(adap); |
| @@ -669,18 +590,9 @@ static s32 pch_i2c_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, | |||
| 669 | if (loop != 1) | 590 | if (loop != 1) |
| 670 | read_index++; | 591 | read_index++; |
| 671 | 592 | ||
| 672 | rtn = pch_i2c_wait_for_xfer_complete(adap); | 593 | rtn = pch_i2c_wait_for_check_xfer(adap); |
| 673 | if (rtn == 0) { | 594 | if (rtn) |
| 674 | if (pch_i2c_getack(adap)) { | 595 | return rtn; |
| 675 | pch_dbg(adap, "Receive NACK for slave" | ||
| 676 | "address setting\n"); | ||
| 677 | return -EIO; | ||
| 678 | } | ||
| 679 | } else { /* wait-event timeout */ | ||
| 680 | pch_i2c_stop(adap); | ||
| 681 | return -ETIME; | ||
| 682 | } | ||
| 683 | |||
| 684 | } /* end for */ | 596 | } /* end for */ |
| 685 | 597 | ||
| 686 | pch_i2c_sendnack(adap); | 598 | pch_i2c_sendnack(adap); |
| @@ -690,17 +602,9 @@ static s32 pch_i2c_readbytes(struct i2c_adapter *i2c_adap, struct i2c_msg *msgs, | |||
| 690 | if (length != 1) | 602 | if (length != 1) |
| 691 | read_index++; | 603 | read_index++; |
| 692 | 604 | ||
| 693 | rtn = pch_i2c_wait_for_xfer_complete(adap); | 605 | rtn = pch_i2c_wait_for_check_xfer(adap); |
| 694 | if (rtn == 0) { | 606 | if (rtn) |
| 695 | if (pch_i2c_getack(adap)) { | 607 | return rtn; |
| 696 | pch_dbg(adap, "Receive NACK for slave" | ||
| 697 | "address setting\n"); | ||
| 698 | return -EIO; | ||
| 699 | } | ||
| 700 | } else { /* wait-event timeout */ | ||
| 701 | pch_i2c_stop(adap); | ||
| 702 | return -ETIME; | ||
| 703 | } | ||
| 704 | 608 | ||
| 705 | if (last) | 609 | if (last) |
| 706 | pch_i2c_stop(adap); | 610 | pch_i2c_stop(adap); |
| @@ -790,7 +694,7 @@ static s32 pch_i2c_xfer(struct i2c_adapter *i2c_adap, | |||
| 790 | 694 | ||
| 791 | ret = mutex_lock_interruptible(&pch_mutex); | 695 | ret = mutex_lock_interruptible(&pch_mutex); |
| 792 | if (ret) | 696 | if (ret) |
| 793 | return -ERESTARTSYS; | 697 | return ret; |
| 794 | 698 | ||
| 795 | if (adap->p_adapter_info->pch_i2c_suspended) { | 699 | if (adap->p_adapter_info->pch_i2c_suspended) { |
| 796 | mutex_unlock(&pch_mutex); | 700 | mutex_unlock(&pch_mutex); |
| @@ -909,7 +813,7 @@ static int __devinit pch_i2c_probe(struct pci_dev *pdev, | |||
| 909 | 813 | ||
| 910 | pch_adap->owner = THIS_MODULE; | 814 | pch_adap->owner = THIS_MODULE; |
| 911 | pch_adap->class = I2C_CLASS_HWMON; | 815 | pch_adap->class = I2C_CLASS_HWMON; |
| 912 | strcpy(pch_adap->name, KBUILD_MODNAME); | 816 | strlcpy(pch_adap->name, KBUILD_MODNAME, sizeof(pch_adap->name)); |
| 913 | pch_adap->algo = &pch_algorithm; | 817 | pch_adap->algo = &pch_algorithm; |
| 914 | pch_adap->algo_data = &adap_info->pch_data[i]; | 818 | pch_adap->algo_data = &adap_info->pch_data[i]; |
| 915 | 819 | ||
| @@ -963,7 +867,7 @@ static void __devexit pch_i2c_remove(struct pci_dev *pdev) | |||
| 963 | pci_iounmap(pdev, adap_info->pch_data[0].pch_base_address); | 867 | pci_iounmap(pdev, adap_info->pch_data[0].pch_base_address); |
| 964 | 868 | ||
| 965 | for (i = 0; i < adap_info->ch_num; i++) | 869 | for (i = 0; i < adap_info->ch_num; i++) |
| 966 | adap_info->pch_data[i].pch_base_address = 0; | 870 | adap_info->pch_data[i].pch_base_address = NULL; |
| 967 | 871 | ||
| 968 | pci_set_drvdata(pdev, NULL); | 872 | pci_set_drvdata(pdev, NULL); |
| 969 | 873 | ||
diff --git a/drivers/i2c/busses/i2c-gpio.c b/drivers/i2c/busses/i2c-gpio.c index c0330a41db03..e62d2d938628 100644 --- a/drivers/i2c/busses/i2c-gpio.c +++ b/drivers/i2c/busses/i2c-gpio.c | |||
| @@ -190,12 +190,7 @@ static int __devinit i2c_gpio_probe(struct platform_device *pdev) | |||
| 190 | adap->dev.parent = &pdev->dev; | 190 | adap->dev.parent = &pdev->dev; |
| 191 | adap->dev.of_node = pdev->dev.of_node; | 191 | adap->dev.of_node = pdev->dev.of_node; |
| 192 | 192 | ||
| 193 | /* | 193 | adap->nr = pdev->id; |
| 194 | * If "dev->id" is negative we consider it as zero. | ||
| 195 | * The reason to do so is to avoid sysfs names that only make | ||
| 196 | * sense when there are multiple adapters. | ||
| 197 | */ | ||
| 198 | adap->nr = (pdev->id != -1) ? pdev->id : 0; | ||
| 199 | ret = i2c_bit_add_numbered_bus(adap); | 194 | ret = i2c_bit_add_numbered_bus(adap); |
| 200 | if (ret) | 195 | if (ret) |
| 201 | goto err_add_bus; | 196 | goto err_add_bus; |
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index 56bce9a8bcbb..8d6b504d65c4 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c | |||
| @@ -512,7 +512,7 @@ static int __init i2c_imx_probe(struct platform_device *pdev) | |||
| 512 | } | 512 | } |
| 513 | 513 | ||
| 514 | /* Setup i2c_imx driver structure */ | 514 | /* Setup i2c_imx driver structure */ |
| 515 | strcpy(i2c_imx->adapter.name, pdev->name); | 515 | strlcpy(i2c_imx->adapter.name, pdev->name, sizeof(i2c_imx->adapter.name)); |
| 516 | i2c_imx->adapter.owner = THIS_MODULE; | 516 | i2c_imx->adapter.owner = THIS_MODULE; |
| 517 | i2c_imx->adapter.algo = &i2c_imx_algo; | 517 | i2c_imx->adapter.algo = &i2c_imx_algo; |
| 518 | i2c_imx->adapter.dev.parent = &pdev->dev; | 518 | i2c_imx->adapter.dev.parent = &pdev->dev; |
diff --git a/drivers/i2c/busses/i2c-ixp2000.c b/drivers/i2c/busses/i2c-ixp2000.c deleted file mode 100644 index 5d263f9014d6..000000000000 --- a/drivers/i2c/busses/i2c-ixp2000.c +++ /dev/null | |||
| @@ -1,157 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * drivers/i2c/busses/i2c-ixp2000.c | ||
| 3 | * | ||
| 4 | * I2C adapter for IXP2000 systems using GPIOs for I2C bus | ||
| 5 | * | ||
| 6 | * Author: Deepak Saxena <dsaxena@plexity.net> | ||
| 7 | * Based on IXDP2400 code by: Naeem M. Afzal <naeem.m.afzal@intel.com> | ||
| 8 | * Made generic by: Jeff Daly <jeffrey.daly@intel.com> | ||
| 9 | * | ||
| 10 | * Copyright (c) 2003-2004 MontaVista Software Inc. | ||
| 11 | * | ||
| 12 | * This file is licensed under the terms of the GNU General Public | ||
| 13 | * License version 2. This program is licensed "as is" without any | ||
| 14 | * warranty of any kind, whether express or implied. | ||
| 15 | * | ||
| 16 | * From Jeff Daly: | ||
| 17 | * | ||
| 18 | * I2C adapter driver for Intel IXDP2xxx platforms. This should work for any | ||
| 19 | * IXP2000 platform if it uses the HW GPIO in the same manner. Basically, | ||
| 20 | * SDA and SCL GPIOs have external pullups. Setting the respective GPIO to | ||
| 21 | * an input will make the signal a '1' via the pullup. Setting them to | ||
| 22 | * outputs will pull them down. | ||
| 23 | * | ||
| 24 | * The GPIOs are open drain signals and are used as configuration strap inputs | ||
| 25 | * during power-up so there's generally a buffer on the board that needs to be | ||
| 26 | * 'enabled' to drive the GPIOs. | ||
| 27 | */ | ||
| 28 | |||
| 29 | #include <linux/kernel.h> | ||
| 30 | #include <linux/init.h> | ||
| 31 | #include <linux/platform_device.h> | ||
| 32 | #include <linux/module.h> | ||
| 33 | #include <linux/i2c.h> | ||
| 34 | #include <linux/i2c-algo-bit.h> | ||
| 35 | #include <linux/slab.h> | ||
| 36 | |||
| 37 | #include <mach/hardware.h> /* Pick up IXP2000-specific bits */ | ||
| 38 | #include <mach/gpio-ixp2000.h> | ||
| 39 | |||
| 40 | static inline int ixp2000_scl_pin(void *data) | ||
| 41 | { | ||
| 42 | return ((struct ixp2000_i2c_pins*)data)->scl_pin; | ||
| 43 | } | ||
| 44 | |||
| 45 | static inline int ixp2000_sda_pin(void *data) | ||
| 46 | { | ||
| 47 | return ((struct ixp2000_i2c_pins*)data)->sda_pin; | ||
| 48 | } | ||
| 49 | |||
| 50 | |||
| 51 | static void ixp2000_bit_setscl(void *data, int val) | ||
| 52 | { | ||
| 53 | int i = 5000; | ||
| 54 | |||
| 55 | if (val) { | ||
| 56 | gpio_line_config(ixp2000_scl_pin(data), GPIO_IN); | ||
| 57 | while(!gpio_line_get(ixp2000_scl_pin(data)) && i--); | ||
| 58 | } else { | ||
| 59 | gpio_line_config(ixp2000_scl_pin(data), GPIO_OUT); | ||
| 60 | } | ||
| 61 | } | ||
| 62 | |||
| 63 | static void ixp2000_bit_setsda(void *data, int val) | ||
| 64 | { | ||
| 65 | if (val) { | ||
| 66 | gpio_line_config(ixp2000_sda_pin(data), GPIO_IN); | ||
| 67 | } else { | ||
| 68 | gpio_line_config(ixp2000_sda_pin(data), GPIO_OUT); | ||
| 69 | } | ||
| 70 | } | ||
| 71 | |||
| 72 | static int ixp2000_bit_getscl(void *data) | ||
| 73 | { | ||
| 74 | return gpio_line_get(ixp2000_scl_pin(data)); | ||
| 75 | } | ||
| 76 | |||
| 77 | static int ixp2000_bit_getsda(void *data) | ||
| 78 | { | ||
| 79 | return gpio_line_get(ixp2000_sda_pin(data)); | ||
| 80 | } | ||
| 81 | |||
| 82 | struct ixp2000_i2c_data { | ||
| 83 | struct ixp2000_i2c_pins *gpio_pins; | ||
| 84 | struct i2c_adapter adapter; | ||
| 85 | struct i2c_algo_bit_data algo_data; | ||
| 86 | }; | ||
| 87 | |||
| 88 | static int ixp2000_i2c_remove(struct platform_device *plat_dev) | ||
| 89 | { | ||
| 90 | struct ixp2000_i2c_data *drv_data = platform_get_drvdata(plat_dev); | ||
| 91 | |||
| 92 | platform_set_drvdata(plat_dev, NULL); | ||
| 93 | |||
| 94 | i2c_del_adapter(&drv_data->adapter); | ||
| 95 | |||
| 96 | kfree(drv_data); | ||
| 97 | |||
| 98 | return 0; | ||
| 99 | } | ||
| 100 | |||
| 101 | static int ixp2000_i2c_probe(struct platform_device *plat_dev) | ||
| 102 | { | ||
| 103 | int err; | ||
| 104 | struct ixp2000_i2c_pins *gpio = plat_dev->dev.platform_data; | ||
| 105 | struct ixp2000_i2c_data *drv_data = | ||
| 106 | kzalloc(sizeof(struct ixp2000_i2c_data), GFP_KERNEL); | ||
| 107 | |||
| 108 | if (!drv_data) | ||
| 109 | return -ENOMEM; | ||
| 110 | drv_data->gpio_pins = gpio; | ||
| 111 | |||
| 112 | drv_data->algo_data.data = gpio; | ||
| 113 | drv_data->algo_data.setsda = ixp2000_bit_setsda; | ||
| 114 | drv_data->algo_data.setscl = ixp2000_bit_setscl; | ||
| 115 | drv_data->algo_data.getsda = ixp2000_bit_getsda; | ||
| 116 | drv_data->algo_data.getscl = ixp2000_bit_getscl; | ||
| 117 | drv_data->algo_data.udelay = 6; | ||
| 118 | drv_data->algo_data.timeout = HZ; | ||
| 119 | |||
| 120 | strlcpy(drv_data->adapter.name, plat_dev->dev.driver->name, | ||
| 121 | sizeof(drv_data->adapter.name)); | ||
| 122 | drv_data->adapter.algo_data = &drv_data->algo_data, | ||
| 123 | |||
| 124 | drv_data->adapter.dev.parent = &plat_dev->dev; | ||
| 125 | |||
| 126 | gpio_line_config(gpio->sda_pin, GPIO_IN); | ||
| 127 | gpio_line_config(gpio->scl_pin, GPIO_IN); | ||
| 128 | gpio_line_set(gpio->scl_pin, 0); | ||
| 129 | gpio_line_set(gpio->sda_pin, 0); | ||
| 130 | |||
| 131 | if ((err = i2c_bit_add_bus(&drv_data->adapter)) != 0) { | ||
| 132 | dev_err(&plat_dev->dev, "Could not install, error %d\n", err); | ||
| 133 | kfree(drv_data); | ||
| 134 | return err; | ||
| 135 | } | ||
| 136 | |||
| 137 | platform_set_drvdata(plat_dev, drv_data); | ||
| 138 | |||
| 139 | return 0; | ||
| 140 | } | ||
| 141 | |||
| 142 | static struct platform_driver ixp2000_i2c_driver = { | ||
| 143 | .probe = ixp2000_i2c_probe, | ||
| 144 | .remove = ixp2000_i2c_remove, | ||
| 145 | .driver = { | ||
| 146 | .name = "IXP2000-I2C", | ||
| 147 | .owner = THIS_MODULE, | ||
| 148 | }, | ||
| 149 | }; | ||
| 150 | |||
| 151 | module_platform_driver(ixp2000_i2c_driver); | ||
| 152 | |||
| 153 | MODULE_AUTHOR ("Deepak Saxena <dsaxena@plexity.net>"); | ||
| 154 | MODULE_DESCRIPTION("IXP2000 GPIO-based I2C bus driver"); | ||
| 155 | MODULE_LICENSE("GPL"); | ||
| 156 | MODULE_ALIAS("platform:IXP2000-I2C"); | ||
| 157 | |||
diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index 206caacd30d7..b76731edbf10 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c | |||
| @@ -64,6 +64,9 @@ struct mpc_i2c { | |||
| 64 | struct i2c_adapter adap; | 64 | struct i2c_adapter adap; |
| 65 | int irq; | 65 | int irq; |
| 66 | u32 real_clk; | 66 | u32 real_clk; |
| 67 | #ifdef CONFIG_PM | ||
| 68 | u8 fdr, dfsrr; | ||
| 69 | #endif | ||
| 67 | }; | 70 | }; |
| 68 | 71 | ||
| 69 | struct mpc_i2c_divider { | 72 | struct mpc_i2c_divider { |
| @@ -703,6 +706,30 @@ static int __devexit fsl_i2c_remove(struct platform_device *op) | |||
| 703 | return 0; | 706 | return 0; |
| 704 | }; | 707 | }; |
| 705 | 708 | ||
| 709 | #ifdef CONFIG_PM | ||
| 710 | static int mpc_i2c_suspend(struct device *dev) | ||
| 711 | { | ||
| 712 | struct mpc_i2c *i2c = dev_get_drvdata(dev); | ||
| 713 | |||
| 714 | i2c->fdr = readb(i2c->base + MPC_I2C_FDR); | ||
| 715 | i2c->dfsrr = readb(i2c->base + MPC_I2C_DFSRR); | ||
| 716 | |||
| 717 | return 0; | ||
| 718 | } | ||
| 719 | |||
| 720 | static int mpc_i2c_resume(struct device *dev) | ||
| 721 | { | ||
| 722 | struct mpc_i2c *i2c = dev_get_drvdata(dev); | ||
| 723 | |||
| 724 | writeb(i2c->fdr, i2c->base + MPC_I2C_FDR); | ||
| 725 | writeb(i2c->dfsrr, i2c->base + MPC_I2C_DFSRR); | ||
| 726 | |||
| 727 | return 0; | ||
| 728 | } | ||
| 729 | |||
| 730 | SIMPLE_DEV_PM_OPS(mpc_i2c_pm_ops, mpc_i2c_suspend, mpc_i2c_resume); | ||
| 731 | #endif | ||
| 732 | |||
| 706 | static struct mpc_i2c_data mpc_i2c_data_512x __devinitdata = { | 733 | static struct mpc_i2c_data mpc_i2c_data_512x __devinitdata = { |
| 707 | .setup = mpc_i2c_setup_512x, | 734 | .setup = mpc_i2c_setup_512x, |
| 708 | }; | 735 | }; |
| @@ -747,6 +774,9 @@ static struct platform_driver mpc_i2c_driver = { | |||
| 747 | .owner = THIS_MODULE, | 774 | .owner = THIS_MODULE, |
| 748 | .name = DRV_NAME, | 775 | .name = DRV_NAME, |
| 749 | .of_match_table = mpc_i2c_of_match, | 776 | .of_match_table = mpc_i2c_of_match, |
| 777 | #ifdef CONFIG_PM | ||
| 778 | .pm = &mpc_i2c_pm_ops, | ||
| 779 | #endif | ||
| 750 | }, | 780 | }, |
| 751 | }; | 781 | }; |
| 752 | 782 | ||
diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index 18068dee48f1..75194c579b6d 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c | |||
| @@ -55,6 +55,7 @@ | |||
| 55 | #include <linux/i2c-ocores.h> | 55 | #include <linux/i2c-ocores.h> |
| 56 | #include <linux/slab.h> | 56 | #include <linux/slab.h> |
| 57 | #include <linux/io.h> | 57 | #include <linux/io.h> |
| 58 | #include <linux/of_i2c.h> | ||
| 58 | 59 | ||
| 59 | struct ocores_i2c { | 60 | struct ocores_i2c { |
| 60 | void __iomem *base; | 61 | void __iomem *base; |
| @@ -343,6 +344,8 @@ static int __devinit ocores_i2c_probe(struct platform_device *pdev) | |||
| 343 | if (pdata) { | 344 | if (pdata) { |
| 344 | for (i = 0; i < pdata->num_devices; i++) | 345 | for (i = 0; i < pdata->num_devices; i++) |
| 345 | i2c_new_device(&i2c->adap, pdata->devices + i); | 346 | i2c_new_device(&i2c->adap, pdata->devices + i); |
| 347 | } else { | ||
| 348 | of_i2c_register_devices(&i2c->adap); | ||
| 346 | } | 349 | } |
| 347 | 350 | ||
| 348 | return 0; | 351 | return 0; |
diff --git a/drivers/i2c/busses/i2c-pca-platform.c b/drivers/i2c/busses/i2c-pca-platform.c index 2adbf1a8fdea..675878f49f76 100644 --- a/drivers/i2c/busses/i2c-pca-platform.c +++ b/drivers/i2c/busses/i2c-pca-platform.c | |||
| @@ -171,7 +171,7 @@ static int __devinit i2c_pca_pf_probe(struct platform_device *pdev) | |||
| 171 | i2c->io_size = resource_size(res); | 171 | i2c->io_size = resource_size(res); |
| 172 | i2c->irq = irq; | 172 | i2c->irq = irq; |
| 173 | 173 | ||
| 174 | i2c->adap.nr = pdev->id >= 0 ? pdev->id : 0; | 174 | i2c->adap.nr = pdev->id; |
| 175 | i2c->adap.owner = THIS_MODULE; | 175 | i2c->adap.owner = THIS_MODULE; |
| 176 | snprintf(i2c->adap.name, sizeof(i2c->adap.name), | 176 | snprintf(i2c->adap.name, sizeof(i2c->adap.name), |
| 177 | "PCA9564/PCA9665 at 0x%08lx", | 177 | "PCA9564/PCA9665 at 0x%08lx", |
diff --git a/drivers/i2c/busses/i2c-pxa.c b/drivers/i2c/busses/i2c-pxa.c index f6733267fa9c..a997c7d3f95d 100644 --- a/drivers/i2c/busses/i2c-pxa.c +++ b/drivers/i2c/busses/i2c-pxa.c | |||
| @@ -1131,11 +1131,6 @@ static int i2c_pxa_probe(struct platform_device *dev) | |||
| 1131 | spin_lock_init(&i2c->lock); | 1131 | spin_lock_init(&i2c->lock); |
| 1132 | init_waitqueue_head(&i2c->wait); | 1132 | init_waitqueue_head(&i2c->wait); |
| 1133 | 1133 | ||
| 1134 | /* | ||
| 1135 | * If "dev->id" is negative we consider it as zero. | ||
| 1136 | * The reason to do so is to avoid sysfs names that only make | ||
| 1137 | * sense when there are multiple adapters. | ||
| 1138 | */ | ||
| 1139 | i2c->adap.nr = dev->id; | 1134 | i2c->adap.nr = dev->id; |
| 1140 | snprintf(i2c->adap.name, sizeof(i2c->adap.name), "pxa_i2c-i2c.%u", | 1135 | snprintf(i2c->adap.name, sizeof(i2c->adap.name), "pxa_i2c-i2c.%u", |
| 1141 | i2c->adap.nr); | 1136 | i2c->adap.nr); |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 737f7218a32c..fa0b13490873 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
| @@ -44,8 +44,12 @@ | |||
| 44 | #include <plat/regs-iic.h> | 44 | #include <plat/regs-iic.h> |
| 45 | #include <plat/iic.h> | 45 | #include <plat/iic.h> |
| 46 | 46 | ||
| 47 | /* i2c controller state */ | 47 | /* Treat S3C2410 as baseline hardware, anything else is supported via quirks */ |
| 48 | #define QUIRK_S3C2440 (1 << 0) | ||
| 49 | #define QUIRK_HDMIPHY (1 << 1) | ||
| 50 | #define QUIRK_NO_GPIO (1 << 2) | ||
| 48 | 51 | ||
| 52 | /* i2c controller state */ | ||
| 49 | enum s3c24xx_i2c_state { | 53 | enum s3c24xx_i2c_state { |
| 50 | STATE_IDLE, | 54 | STATE_IDLE, |
| 51 | STATE_START, | 55 | STATE_START, |
| @@ -54,14 +58,10 @@ enum s3c24xx_i2c_state { | |||
| 54 | STATE_STOP | 58 | STATE_STOP |
| 55 | }; | 59 | }; |
| 56 | 60 | ||
| 57 | enum s3c24xx_i2c_type { | ||
| 58 | TYPE_S3C2410, | ||
| 59 | TYPE_S3C2440, | ||
| 60 | }; | ||
| 61 | |||
| 62 | struct s3c24xx_i2c { | 61 | struct s3c24xx_i2c { |
| 63 | spinlock_t lock; | 62 | spinlock_t lock; |
| 64 | wait_queue_head_t wait; | 63 | wait_queue_head_t wait; |
| 64 | unsigned int quirks; | ||
| 65 | unsigned int suspended:1; | 65 | unsigned int suspended:1; |
| 66 | 66 | ||
| 67 | struct i2c_msg *msg; | 67 | struct i2c_msg *msg; |
| @@ -88,26 +88,45 @@ struct s3c24xx_i2c { | |||
| 88 | #endif | 88 | #endif |
| 89 | }; | 89 | }; |
| 90 | 90 | ||
| 91 | /* default platform data removed, dev should always carry data. */ | 91 | static struct platform_device_id s3c24xx_driver_ids[] = { |
| 92 | { | ||
| 93 | .name = "s3c2410-i2c", | ||
| 94 | .driver_data = 0, | ||
| 95 | }, { | ||
| 96 | .name = "s3c2440-i2c", | ||
| 97 | .driver_data = QUIRK_S3C2440, | ||
| 98 | }, { | ||
| 99 | .name = "s3c2440-hdmiphy-i2c", | ||
| 100 | .driver_data = QUIRK_S3C2440 | QUIRK_HDMIPHY | QUIRK_NO_GPIO, | ||
| 101 | }, { }, | ||
| 102 | }; | ||
| 103 | MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); | ||
| 104 | |||
| 105 | #ifdef CONFIG_OF | ||
| 106 | static const struct of_device_id s3c24xx_i2c_match[] = { | ||
| 107 | { .compatible = "samsung,s3c2410-i2c", .data = (void *)0 }, | ||
| 108 | { .compatible = "samsung,s3c2440-i2c", .data = (void *)QUIRK_S3C2440 }, | ||
| 109 | { .compatible = "samsung,s3c2440-hdmiphy-i2c", | ||
| 110 | .data = (void *)(QUIRK_S3C2440 | QUIRK_HDMIPHY | QUIRK_NO_GPIO) }, | ||
| 111 | {}, | ||
| 112 | }; | ||
| 113 | MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match); | ||
| 114 | #endif | ||
| 92 | 115 | ||
| 93 | /* s3c24xx_i2c_is2440() | 116 | /* s3c24xx_get_device_quirks |
| 94 | * | 117 | * |
| 95 | * return true is this is an s3c2440 | 118 | * Get controller type either from device tree or platform device variant. |
| 96 | */ | 119 | */ |
| 97 | 120 | ||
| 98 | static inline int s3c24xx_i2c_is2440(struct s3c24xx_i2c *i2c) | 121 | static inline unsigned int s3c24xx_get_device_quirks(struct platform_device *pdev) |
| 99 | { | 122 | { |
| 100 | struct platform_device *pdev = to_platform_device(i2c->dev); | 123 | if (pdev->dev.of_node) { |
| 101 | enum s3c24xx_i2c_type type; | 124 | const struct of_device_id *match; |
| 102 | 125 | match = of_match_node(&s3c24xx_i2c_match, pdev->dev.of_node); | |
| 103 | #ifdef CONFIG_OF | 126 | return (unsigned int)match->data; |
| 104 | if (i2c->dev->of_node) | 127 | } |
| 105 | return of_device_is_compatible(i2c->dev->of_node, | ||
| 106 | "samsung,s3c2440-i2c"); | ||
| 107 | #endif | ||
| 108 | 128 | ||
| 109 | type = platform_get_device_id(pdev)->driver_data; | 129 | return platform_get_device_id(pdev)->driver_data; |
| 110 | return type == TYPE_S3C2440; | ||
| 111 | } | 130 | } |
| 112 | 131 | ||
| 113 | /* s3c24xx_i2c_master_complete | 132 | /* s3c24xx_i2c_master_complete |
| @@ -471,6 +490,13 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c) | |||
| 471 | unsigned long iicstat; | 490 | unsigned long iicstat; |
| 472 | int timeout = 400; | 491 | int timeout = 400; |
| 473 | 492 | ||
| 493 | /* the timeout for HDMIPHY is reduced to 10 ms because | ||
| 494 | * the hangup is expected to happen, so waiting 400 ms | ||
| 495 | * causes only unnecessary system hangup | ||
| 496 | */ | ||
| 497 | if (i2c->quirks & QUIRK_HDMIPHY) | ||
| 498 | timeout = 10; | ||
| 499 | |||
| 474 | while (timeout-- > 0) { | 500 | while (timeout-- > 0) { |
| 475 | iicstat = readl(i2c->regs + S3C2410_IICSTAT); | 501 | iicstat = readl(i2c->regs + S3C2410_IICSTAT); |
| 476 | 502 | ||
| @@ -480,6 +506,15 @@ static int s3c24xx_i2c_set_master(struct s3c24xx_i2c *i2c) | |||
| 480 | msleep(1); | 506 | msleep(1); |
| 481 | } | 507 | } |
| 482 | 508 | ||
| 509 | /* hang-up of bus dedicated for HDMIPHY occurred, resetting */ | ||
| 510 | if (i2c->quirks & QUIRK_HDMIPHY) { | ||
| 511 | writel(0, i2c->regs + S3C2410_IICCON); | ||
| 512 | writel(0, i2c->regs + S3C2410_IICSTAT); | ||
| 513 | writel(0, i2c->regs + S3C2410_IICDS); | ||
| 514 | |||
| 515 | return 0; | ||
| 516 | } | ||
| 517 | |||
| 483 | return -ETIMEDOUT; | 518 | return -ETIMEDOUT; |
| 484 | } | 519 | } |
| 485 | 520 | ||
| @@ -676,7 +711,7 @@ static int s3c24xx_i2c_clockrate(struct s3c24xx_i2c *i2c, unsigned int *got) | |||
| 676 | 711 | ||
| 677 | writel(iiccon, i2c->regs + S3C2410_IICCON); | 712 | writel(iiccon, i2c->regs + S3C2410_IICCON); |
| 678 | 713 | ||
| 679 | if (s3c24xx_i2c_is2440(i2c)) { | 714 | if (i2c->quirks & QUIRK_S3C2440) { |
| 680 | unsigned long sda_delay; | 715 | unsigned long sda_delay; |
| 681 | 716 | ||
| 682 | if (pdata->sda_delay) { | 717 | if (pdata->sda_delay) { |
| @@ -761,6 +796,9 @@ static int s3c24xx_i2c_parse_dt_gpio(struct s3c24xx_i2c *i2c) | |||
| 761 | { | 796 | { |
| 762 | int idx, gpio, ret; | 797 | int idx, gpio, ret; |
| 763 | 798 | ||
| 799 | if (i2c->quirks & QUIRK_NO_GPIO) | ||
| 800 | return 0; | ||
| 801 | |||
| 764 | for (idx = 0; idx < 2; idx++) { | 802 | for (idx = 0; idx < 2; idx++) { |
| 765 | gpio = of_get_gpio(i2c->dev->of_node, idx); | 803 | gpio = of_get_gpio(i2c->dev->of_node, idx); |
| 766 | if (!gpio_is_valid(gpio)) { | 804 | if (!gpio_is_valid(gpio)) { |
| @@ -785,6 +823,10 @@ free_gpio: | |||
| 785 | static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c) | 823 | static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c) |
| 786 | { | 824 | { |
| 787 | unsigned int idx; | 825 | unsigned int idx; |
| 826 | |||
| 827 | if (i2c->quirks & QUIRK_NO_GPIO) | ||
| 828 | return; | ||
| 829 | |||
| 788 | for (idx = 0; idx < 2; idx++) | 830 | for (idx = 0; idx < 2; idx++) |
| 789 | gpio_free(i2c->gpios[idx]); | 831 | gpio_free(i2c->gpios[idx]); |
| 790 | } | 832 | } |
| @@ -906,6 +948,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 906 | goto err_noclk; | 948 | goto err_noclk; |
| 907 | } | 949 | } |
| 908 | 950 | ||
| 951 | i2c->quirks = s3c24xx_get_device_quirks(pdev); | ||
| 909 | if (pdata) | 952 | if (pdata) |
| 910 | memcpy(i2c->pdata, pdata, sizeof(*pdata)); | 953 | memcpy(i2c->pdata, pdata, sizeof(*pdata)); |
| 911 | else | 954 | else |
| @@ -1110,28 +1153,6 @@ static const struct dev_pm_ops s3c24xx_i2c_dev_pm_ops = { | |||
| 1110 | 1153 | ||
| 1111 | /* device driver for platform bus bits */ | 1154 | /* device driver for platform bus bits */ |
| 1112 | 1155 | ||
| 1113 | static struct platform_device_id s3c24xx_driver_ids[] = { | ||
| 1114 | { | ||
| 1115 | .name = "s3c2410-i2c", | ||
| 1116 | .driver_data = TYPE_S3C2410, | ||
| 1117 | }, { | ||
| 1118 | .name = "s3c2440-i2c", | ||
| 1119 | .driver_data = TYPE_S3C2440, | ||
| 1120 | }, { }, | ||
| 1121 | }; | ||
| 1122 | MODULE_DEVICE_TABLE(platform, s3c24xx_driver_ids); | ||
| 1123 | |||
| 1124 | #ifdef CONFIG_OF | ||
| 1125 | static const struct of_device_id s3c24xx_i2c_match[] = { | ||
| 1126 | { .compatible = "samsung,s3c2410-i2c" }, | ||
| 1127 | { .compatible = "samsung,s3c2440-i2c" }, | ||
| 1128 | {}, | ||
| 1129 | }; | ||
| 1130 | MODULE_DEVICE_TABLE(of, s3c24xx_i2c_match); | ||
| 1131 | #else | ||
| 1132 | #define s3c24xx_i2c_match NULL | ||
| 1133 | #endif | ||
| 1134 | |||
| 1135 | static struct platform_driver s3c24xx_i2c_driver = { | 1156 | static struct platform_driver s3c24xx_i2c_driver = { |
| 1136 | .probe = s3c24xx_i2c_probe, | 1157 | .probe = s3c24xx_i2c_probe, |
| 1137 | .remove = s3c24xx_i2c_remove, | 1158 | .remove = s3c24xx_i2c_remove, |
| @@ -1140,7 +1161,7 @@ static struct platform_driver s3c24xx_i2c_driver = { | |||
| 1140 | .owner = THIS_MODULE, | 1161 | .owner = THIS_MODULE, |
| 1141 | .name = "s3c-i2c", | 1162 | .name = "s3c-i2c", |
| 1142 | .pm = S3C24XX_DEV_PM_OPS, | 1163 | .pm = S3C24XX_DEV_PM_OPS, |
| 1143 | .of_match_table = s3c24xx_i2c_match, | 1164 | .of_match_table = of_match_ptr(s3c24xx_i2c_match), |
| 1144 | }, | 1165 | }, |
| 1145 | }; | 1166 | }; |
| 1146 | 1167 | ||
diff --git a/drivers/i2c/busses/i2c-sh_mobile.c b/drivers/i2c/busses/i2c-sh_mobile.c index 675c9692d148..8110ca45f342 100644 --- a/drivers/i2c/busses/i2c-sh_mobile.c +++ b/drivers/i2c/busses/i2c-sh_mobile.c | |||
| @@ -27,6 +27,7 @@ | |||
| 27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
| 28 | #include <linux/interrupt.h> | 28 | #include <linux/interrupt.h> |
| 29 | #include <linux/i2c.h> | 29 | #include <linux/i2c.h> |
| 30 | #include <linux/of_i2c.h> | ||
| 30 | #include <linux/err.h> | 31 | #include <linux/err.h> |
| 31 | #include <linux/pm_runtime.h> | 32 | #include <linux/pm_runtime.h> |
| 32 | #include <linux/clk.h> | 33 | #include <linux/clk.h> |
| @@ -653,6 +654,7 @@ static int sh_mobile_i2c_probe(struct platform_device *dev) | |||
| 653 | adap->dev.parent = &dev->dev; | 654 | adap->dev.parent = &dev->dev; |
| 654 | adap->retries = 5; | 655 | adap->retries = 5; |
| 655 | adap->nr = dev->id; | 656 | adap->nr = dev->id; |
| 657 | adap->dev.of_node = dev->dev.of_node; | ||
| 656 | 658 | ||
| 657 | strlcpy(adap->name, dev->name, sizeof(adap->name)); | 659 | strlcpy(adap->name, dev->name, sizeof(adap->name)); |
| 658 | 660 | ||
| @@ -667,6 +669,8 @@ static int sh_mobile_i2c_probe(struct platform_device *dev) | |||
| 667 | 669 | ||
| 668 | dev_info(&dev->dev, "I2C adapter %d with bus speed %lu Hz\n", | 670 | dev_info(&dev->dev, "I2C adapter %d with bus speed %lu Hz\n", |
| 669 | adap->nr, pd->bus_speed); | 671 | adap->nr, pd->bus_speed); |
| 672 | |||
| 673 | of_i2c_register_devices(adap); | ||
| 670 | return 0; | 674 | return 0; |
| 671 | 675 | ||
| 672 | err_all: | 676 | err_all: |
| @@ -710,11 +714,18 @@ static const struct dev_pm_ops sh_mobile_i2c_dev_pm_ops = { | |||
| 710 | .runtime_resume = sh_mobile_i2c_runtime_nop, | 714 | .runtime_resume = sh_mobile_i2c_runtime_nop, |
| 711 | }; | 715 | }; |
| 712 | 716 | ||
| 717 | static const struct of_device_id sh_mobile_i2c_dt_ids[] __devinitconst = { | ||
| 718 | { .compatible = "renesas,rmobile-iic", }, | ||
| 719 | {}, | ||
| 720 | }; | ||
| 721 | MODULE_DEVICE_TABLE(of, sh_mobile_i2c_dt_ids); | ||
| 722 | |||
| 713 | static struct platform_driver sh_mobile_i2c_driver = { | 723 | static struct platform_driver sh_mobile_i2c_driver = { |
| 714 | .driver = { | 724 | .driver = { |
| 715 | .name = "i2c-sh_mobile", | 725 | .name = "i2c-sh_mobile", |
| 716 | .owner = THIS_MODULE, | 726 | .owner = THIS_MODULE, |
| 717 | .pm = &sh_mobile_i2c_dev_pm_ops, | 727 | .pm = &sh_mobile_i2c_dev_pm_ops, |
| 728 | .of_match_table = sh_mobile_i2c_dt_ids, | ||
| 718 | }, | 729 | }, |
| 719 | .probe = sh_mobile_i2c_probe, | 730 | .probe = sh_mobile_i2c_probe, |
| 720 | .remove = sh_mobile_i2c_remove, | 731 | .remove = sh_mobile_i2c_remove, |
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 55e5ea62ccee..8b2e555a9563 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c | |||
| @@ -401,8 +401,6 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id) | |||
| 401 | disable_irq_nosync(i2c_dev->irq); | 401 | disable_irq_nosync(i2c_dev->irq); |
| 402 | i2c_dev->irq_disabled = 1; | 402 | i2c_dev->irq_disabled = 1; |
| 403 | } | 403 | } |
| 404 | |||
| 405 | complete(&i2c_dev->msg_complete); | ||
| 406 | goto err; | 404 | goto err; |
| 407 | } | 405 | } |
| 408 | 406 | ||
| @@ -411,7 +409,6 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id) | |||
| 411 | i2c_dev->msg_err |= I2C_ERR_NO_ACK; | 409 | i2c_dev->msg_err |= I2C_ERR_NO_ACK; |
| 412 | if (status & I2C_INT_ARBITRATION_LOST) | 410 | if (status & I2C_INT_ARBITRATION_LOST) |
| 413 | i2c_dev->msg_err |= I2C_ERR_ARBITRATION_LOST; | 411 | i2c_dev->msg_err |= I2C_ERR_ARBITRATION_LOST; |
| 414 | complete(&i2c_dev->msg_complete); | ||
| 415 | goto err; | 412 | goto err; |
| 416 | } | 413 | } |
| 417 | 414 | ||
| @@ -429,14 +426,14 @@ static irqreturn_t tegra_i2c_isr(int irq, void *dev_id) | |||
| 429 | tegra_i2c_mask_irq(i2c_dev, I2C_INT_TX_FIFO_DATA_REQ); | 426 | tegra_i2c_mask_irq(i2c_dev, I2C_INT_TX_FIFO_DATA_REQ); |
| 430 | } | 427 | } |
| 431 | 428 | ||
| 429 | i2c_writel(i2c_dev, status, I2C_INT_STATUS); | ||
| 430 | if (i2c_dev->is_dvc) | ||
| 431 | dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS); | ||
| 432 | |||
| 432 | if (status & I2C_INT_PACKET_XFER_COMPLETE) { | 433 | if (status & I2C_INT_PACKET_XFER_COMPLETE) { |
| 433 | BUG_ON(i2c_dev->msg_buf_remaining); | 434 | BUG_ON(i2c_dev->msg_buf_remaining); |
| 434 | complete(&i2c_dev->msg_complete); | 435 | complete(&i2c_dev->msg_complete); |
| 435 | } | 436 | } |
| 436 | |||
| 437 | i2c_writel(i2c_dev, status, I2C_INT_STATUS); | ||
| 438 | if (i2c_dev->is_dvc) | ||
| 439 | dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS); | ||
| 440 | return IRQ_HANDLED; | 437 | return IRQ_HANDLED; |
| 441 | err: | 438 | err: |
| 442 | /* An error occurred, mask all interrupts */ | 439 | /* An error occurred, mask all interrupts */ |
| @@ -446,6 +443,8 @@ err: | |||
| 446 | i2c_writel(i2c_dev, status, I2C_INT_STATUS); | 443 | i2c_writel(i2c_dev, status, I2C_INT_STATUS); |
| 447 | if (i2c_dev->is_dvc) | 444 | if (i2c_dev->is_dvc) |
| 448 | dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS); | 445 | dvc_writel(i2c_dev, DVC_STATUS_I2C_DONE_INTR, DVC_STATUS); |
| 446 | |||
| 447 | complete(&i2c_dev->msg_complete); | ||
| 449 | return IRQ_HANDLED; | 448 | return IRQ_HANDLED; |
| 450 | } | 449 | } |
| 451 | 450 | ||
| @@ -476,12 +475,15 @@ static int tegra_i2c_xfer_msg(struct tegra_i2c_dev *i2c_dev, | |||
| 476 | packet_header = msg->len - 1; | 475 | packet_header = msg->len - 1; |
| 477 | i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO); | 476 | i2c_writel(i2c_dev, packet_header, I2C_TX_FIFO); |
| 478 | 477 | ||
| 479 | packet_header = msg->addr << I2C_HEADER_SLAVE_ADDR_SHIFT; | 478 | packet_header = I2C_HEADER_IE_ENABLE; |
| 480 | packet_header |= I2C_HEADER_IE_ENABLE; | ||
| 481 | if (!stop) | 479 | if (!stop) |
| 482 | packet_header |= I2C_HEADER_REPEAT_START; | 480 | packet_header |= I2C_HEADER_REPEAT_START; |
| 483 | if (msg->flags & I2C_M_TEN) | 481 | if (msg->flags & I2C_M_TEN) { |
| 482 | packet_header |= msg->addr; | ||
| 484 | packet_header |= I2C_HEADER_10BIT_ADDR; | 483 | packet_header |= I2C_HEADER_10BIT_ADDR; |
| 484 | } else { | ||
| 485 | packet_header |= msg->addr << I2C_HEADER_SLAVE_ADDR_SHIFT; | ||
| 486 | } | ||
| 485 | if (msg->flags & I2C_M_IGNORE_NAK) | 487 | if (msg->flags & I2C_M_IGNORE_NAK) |
| 486 | packet_header |= I2C_HEADER_CONT_ON_NAK; | 488 | packet_header |= I2C_HEADER_CONT_ON_NAK; |
| 487 | if (msg->flags & I2C_M_RD) | 489 | if (msg->flags & I2C_M_RD) |
| @@ -557,7 +559,7 @@ static int tegra_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], | |||
| 557 | 559 | ||
| 558 | static u32 tegra_i2c_func(struct i2c_adapter *adap) | 560 | static u32 tegra_i2c_func(struct i2c_adapter *adap) |
| 559 | { | 561 | { |
| 560 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | 562 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL | I2C_FUNC_10BIT_ADDR; |
| 561 | } | 563 | } |
| 562 | 564 | ||
| 563 | static const struct i2c_algorithm tegra_i2c_algo = { | 565 | static const struct i2c_algorithm tegra_i2c_algo = { |
diff --git a/drivers/i2c/busses/i2c-versatile.c b/drivers/i2c/busses/i2c-versatile.c index f585aead50cc..eec20db6246f 100644 --- a/drivers/i2c/busses/i2c-versatile.c +++ b/drivers/i2c/busses/i2c-versatile.c | |||
| @@ -104,13 +104,8 @@ static int i2c_versatile_probe(struct platform_device *dev) | |||
| 104 | i2c->algo = i2c_versatile_algo; | 104 | i2c->algo = i2c_versatile_algo; |
| 105 | i2c->algo.data = i2c; | 105 | i2c->algo.data = i2c; |
| 106 | 106 | ||
| 107 | if (dev->id >= 0) { | 107 | i2c->adap.nr = dev->id; |
| 108 | /* static bus numbering */ | 108 | ret = i2c_bit_add_numbered_bus(&i2c->adap); |
| 109 | i2c->adap.nr = dev->id; | ||
| 110 | ret = i2c_bit_add_numbered_bus(&i2c->adap); | ||
| 111 | } else | ||
| 112 | /* dynamic bus numbering */ | ||
| 113 | ret = i2c_bit_add_bus(&i2c->adap); | ||
| 114 | if (ret >= 0) { | 109 | if (ret >= 0) { |
| 115 | platform_set_drvdata(dev, i2c); | 110 | platform_set_drvdata(dev, i2c); |
| 116 | of_i2c_register_devices(&i2c->adap); | 111 | of_i2c_register_devices(&i2c->adap); |
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c index 2bded7647ef2..641d0e5e3303 100644 --- a/drivers/i2c/busses/i2c-xiic.c +++ b/drivers/i2c/busses/i2c-xiic.c | |||
| @@ -40,6 +40,7 @@ | |||
| 40 | #include <linux/i2c-xiic.h> | 40 | #include <linux/i2c-xiic.h> |
| 41 | #include <linux/io.h> | 41 | #include <linux/io.h> |
| 42 | #include <linux/slab.h> | 42 | #include <linux/slab.h> |
| 43 | #include <linux/of_i2c.h> | ||
| 43 | 44 | ||
| 44 | #define DRIVER_NAME "xiic-i2c" | 45 | #define DRIVER_NAME "xiic-i2c" |
| 45 | 46 | ||
| @@ -705,8 +706,6 @@ static int __devinit xiic_i2c_probe(struct platform_device *pdev) | |||
| 705 | goto resource_missing; | 706 | goto resource_missing; |
| 706 | 707 | ||
| 707 | pdata = (struct xiic_i2c_platform_data *) pdev->dev.platform_data; | 708 | pdata = (struct xiic_i2c_platform_data *) pdev->dev.platform_data; |
| 708 | if (!pdata) | ||
| 709 | return -EINVAL; | ||
| 710 | 709 | ||
| 711 | i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); | 710 | i2c = kzalloc(sizeof(*i2c), GFP_KERNEL); |
| 712 | if (!i2c) | 711 | if (!i2c) |
| @@ -730,6 +729,7 @@ static int __devinit xiic_i2c_probe(struct platform_device *pdev) | |||
| 730 | i2c->adap = xiic_adapter; | 729 | i2c->adap = xiic_adapter; |
| 731 | i2c_set_adapdata(&i2c->adap, i2c); | 730 | i2c_set_adapdata(&i2c->adap, i2c); |
| 732 | i2c->adap.dev.parent = &pdev->dev; | 731 | i2c->adap.dev.parent = &pdev->dev; |
| 732 | i2c->adap.dev.of_node = pdev->dev.of_node; | ||
| 733 | 733 | ||
| 734 | xiic_reinit(i2c); | 734 | xiic_reinit(i2c); |
| 735 | 735 | ||
| @@ -748,9 +748,13 @@ static int __devinit xiic_i2c_probe(struct platform_device *pdev) | |||
| 748 | goto add_adapter_failed; | 748 | goto add_adapter_failed; |
| 749 | } | 749 | } |
| 750 | 750 | ||
| 751 | /* add in known devices to the bus */ | 751 | if (pdata) { |
| 752 | for (i = 0; i < pdata->num_devices; i++) | 752 | /* add in known devices to the bus */ |
| 753 | i2c_new_device(&i2c->adap, pdata->devices + i); | 753 | for (i = 0; i < pdata->num_devices; i++) |
| 754 | i2c_new_device(&i2c->adap, pdata->devices + i); | ||
| 755 | } | ||
| 756 | |||
| 757 | of_i2c_register_devices(&i2c->adap); | ||
| 754 | 758 | ||
| 755 | return 0; | 759 | return 0; |
| 756 | 760 | ||
| @@ -795,12 +799,21 @@ static int __devexit xiic_i2c_remove(struct platform_device* pdev) | |||
| 795 | return 0; | 799 | return 0; |
| 796 | } | 800 | } |
| 797 | 801 | ||
| 802 | #if defined(CONFIG_OF) | ||
| 803 | static const struct of_device_id xiic_of_match[] __devinitconst = { | ||
| 804 | { .compatible = "xlnx,xps-iic-2.00.a", }, | ||
| 805 | {}, | ||
| 806 | }; | ||
| 807 | MODULE_DEVICE_TABLE(of, xiic_of_match); | ||
| 808 | #endif | ||
| 809 | |||
| 798 | static struct platform_driver xiic_i2c_driver = { | 810 | static struct platform_driver xiic_i2c_driver = { |
| 799 | .probe = xiic_i2c_probe, | 811 | .probe = xiic_i2c_probe, |
| 800 | .remove = __devexit_p(xiic_i2c_remove), | 812 | .remove = __devexit_p(xiic_i2c_remove), |
| 801 | .driver = { | 813 | .driver = { |
| 802 | .owner = THIS_MODULE, | 814 | .owner = THIS_MODULE, |
| 803 | .name = DRIVER_NAME, | 815 | .name = DRIVER_NAME, |
| 816 | .of_match_table = of_match_ptr(xiic_of_match), | ||
| 804 | }, | 817 | }, |
| 805 | }; | 818 | }; |
| 806 | 819 | ||
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index feb7dc359186..a6ad32bc0a96 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -772,6 +772,23 @@ struct device_type i2c_adapter_type = { | |||
| 772 | }; | 772 | }; |
| 773 | EXPORT_SYMBOL_GPL(i2c_adapter_type); | 773 | EXPORT_SYMBOL_GPL(i2c_adapter_type); |
| 774 | 774 | ||
| 775 | /** | ||
| 776 | * i2c_verify_adapter - return parameter as i2c_adapter or NULL | ||
| 777 | * @dev: device, probably from some driver model iterator | ||
| 778 | * | ||
| 779 | * When traversing the driver model tree, perhaps using driver model | ||
| 780 | * iterators like @device_for_each_child(), you can't assume very much | ||
| 781 | * about the nodes you find. Use this function to avoid oopses caused | ||
| 782 | * by wrongly treating some non-I2C device as an i2c_adapter. | ||
| 783 | */ | ||
| 784 | struct i2c_adapter *i2c_verify_adapter(struct device *dev) | ||
| 785 | { | ||
| 786 | return (dev->type == &i2c_adapter_type) | ||
| 787 | ? to_i2c_adapter(dev) | ||
| 788 | : NULL; | ||
| 789 | } | ||
| 790 | EXPORT_SYMBOL(i2c_verify_adapter); | ||
| 791 | |||
| 775 | #ifdef CONFIG_I2C_COMPAT | 792 | #ifdef CONFIG_I2C_COMPAT |
| 776 | static struct class_compat *i2c_adapter_compat_class; | 793 | static struct class_compat *i2c_adapter_compat_class; |
| 777 | #endif | 794 | #endif |
diff --git a/drivers/i2c/i2c-mux.c b/drivers/i2c/i2c-mux.c index d7a4833be416..1038c381aea5 100644 --- a/drivers/i2c/i2c-mux.c +++ b/drivers/i2c/i2c-mux.c | |||
| @@ -24,6 +24,8 @@ | |||
| 24 | #include <linux/slab.h> | 24 | #include <linux/slab.h> |
| 25 | #include <linux/i2c.h> | 25 | #include <linux/i2c.h> |
| 26 | #include <linux/i2c-mux.h> | 26 | #include <linux/i2c-mux.h> |
| 27 | #include <linux/of.h> | ||
| 28 | #include <linux/of_i2c.h> | ||
| 27 | 29 | ||
| 28 | /* multiplexer per channel data */ | 30 | /* multiplexer per channel data */ |
| 29 | struct i2c_mux_priv { | 31 | struct i2c_mux_priv { |
| @@ -31,11 +33,11 @@ struct i2c_mux_priv { | |||
| 31 | struct i2c_algorithm algo; | 33 | struct i2c_algorithm algo; |
| 32 | 34 | ||
| 33 | struct i2c_adapter *parent; | 35 | struct i2c_adapter *parent; |
| 34 | void *mux_dev; /* the mux chip/device */ | 36 | void *mux_priv; /* the mux chip/device */ |
| 35 | u32 chan_id; /* the channel id */ | 37 | u32 chan_id; /* the channel id */ |
| 36 | 38 | ||
| 37 | int (*select)(struct i2c_adapter *, void *mux_dev, u32 chan_id); | 39 | int (*select)(struct i2c_adapter *, void *mux_priv, u32 chan_id); |
| 38 | int (*deselect)(struct i2c_adapter *, void *mux_dev, u32 chan_id); | 40 | int (*deselect)(struct i2c_adapter *, void *mux_priv, u32 chan_id); |
| 39 | }; | 41 | }; |
| 40 | 42 | ||
| 41 | static int i2c_mux_master_xfer(struct i2c_adapter *adap, | 43 | static int i2c_mux_master_xfer(struct i2c_adapter *adap, |
| @@ -47,11 +49,11 @@ static int i2c_mux_master_xfer(struct i2c_adapter *adap, | |||
| 47 | 49 | ||
| 48 | /* Switch to the right mux port and perform the transfer. */ | 50 | /* Switch to the right mux port and perform the transfer. */ |
| 49 | 51 | ||
| 50 | ret = priv->select(parent, priv->mux_dev, priv->chan_id); | 52 | ret = priv->select(parent, priv->mux_priv, priv->chan_id); |
| 51 | if (ret >= 0) | 53 | if (ret >= 0) |
| 52 | ret = parent->algo->master_xfer(parent, msgs, num); | 54 | ret = parent->algo->master_xfer(parent, msgs, num); |
| 53 | if (priv->deselect) | 55 | if (priv->deselect) |
| 54 | priv->deselect(parent, priv->mux_dev, priv->chan_id); | 56 | priv->deselect(parent, priv->mux_priv, priv->chan_id); |
| 55 | 57 | ||
| 56 | return ret; | 58 | return ret; |
| 57 | } | 59 | } |
| @@ -67,12 +69,12 @@ static int i2c_mux_smbus_xfer(struct i2c_adapter *adap, | |||
| 67 | 69 | ||
| 68 | /* Select the right mux port and perform the transfer. */ | 70 | /* Select the right mux port and perform the transfer. */ |
| 69 | 71 | ||
| 70 | ret = priv->select(parent, priv->mux_dev, priv->chan_id); | 72 | ret = priv->select(parent, priv->mux_priv, priv->chan_id); |
| 71 | if (ret >= 0) | 73 | if (ret >= 0) |
| 72 | ret = parent->algo->smbus_xfer(parent, addr, flags, | 74 | ret = parent->algo->smbus_xfer(parent, addr, flags, |
| 73 | read_write, command, size, data); | 75 | read_write, command, size, data); |
| 74 | if (priv->deselect) | 76 | if (priv->deselect) |
| 75 | priv->deselect(parent, priv->mux_dev, priv->chan_id); | 77 | priv->deselect(parent, priv->mux_priv, priv->chan_id); |
| 76 | 78 | ||
| 77 | return ret; | 79 | return ret; |
| 78 | } | 80 | } |
| @@ -87,7 +89,8 @@ static u32 i2c_mux_functionality(struct i2c_adapter *adap) | |||
| 87 | } | 89 | } |
| 88 | 90 | ||
| 89 | struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, | 91 | struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, |
| 90 | void *mux_dev, u32 force_nr, u32 chan_id, | 92 | struct device *mux_dev, |
| 93 | void *mux_priv, u32 force_nr, u32 chan_id, | ||
| 91 | int (*select) (struct i2c_adapter *, | 94 | int (*select) (struct i2c_adapter *, |
| 92 | void *, u32), | 95 | void *, u32), |
| 93 | int (*deselect) (struct i2c_adapter *, | 96 | int (*deselect) (struct i2c_adapter *, |
| @@ -102,7 +105,7 @@ struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, | |||
| 102 | 105 | ||
| 103 | /* Set up private adapter data */ | 106 | /* Set up private adapter data */ |
| 104 | priv->parent = parent; | 107 | priv->parent = parent; |
| 105 | priv->mux_dev = mux_dev; | 108 | priv->mux_priv = mux_priv; |
| 106 | priv->chan_id = chan_id; | 109 | priv->chan_id = chan_id; |
| 107 | priv->select = select; | 110 | priv->select = select; |
| 108 | priv->deselect = deselect; | 111 | priv->deselect = deselect; |
| @@ -124,6 +127,25 @@ struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, | |||
| 124 | priv->adap.algo_data = priv; | 127 | priv->adap.algo_data = priv; |
| 125 | priv->adap.dev.parent = &parent->dev; | 128 | priv->adap.dev.parent = &parent->dev; |
| 126 | 129 | ||
| 130 | /* | ||
| 131 | * Try to populate the mux adapter's of_node, expands to | ||
| 132 | * nothing if !CONFIG_OF. | ||
| 133 | */ | ||
| 134 | if (mux_dev->of_node) { | ||
| 135 | struct device_node *child; | ||
| 136 | u32 reg; | ||
| 137 | |||
| 138 | for_each_child_of_node(mux_dev->of_node, child) { | ||
| 139 | ret = of_property_read_u32(child, "reg", ®); | ||
| 140 | if (ret) | ||
| 141 | continue; | ||
| 142 | if (chan_id == reg) { | ||
| 143 | priv->adap.dev.of_node = child; | ||
| 144 | break; | ||
| 145 | } | ||
| 146 | } | ||
| 147 | } | ||
| 148 | |||
| 127 | if (force_nr) { | 149 | if (force_nr) { |
| 128 | priv->adap.nr = force_nr; | 150 | priv->adap.nr = force_nr; |
| 129 | ret = i2c_add_numbered_adapter(&priv->adap); | 151 | ret = i2c_add_numbered_adapter(&priv->adap); |
| @@ -141,6 +163,8 @@ struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, | |||
| 141 | dev_info(&parent->dev, "Added multiplexed i2c bus %d\n", | 163 | dev_info(&parent->dev, "Added multiplexed i2c bus %d\n", |
| 142 | i2c_adapter_id(&priv->adap)); | 164 | i2c_adapter_id(&priv->adap)); |
| 143 | 165 | ||
| 166 | of_i2c_register_devices(&priv->adap); | ||
| 167 | |||
| 144 | return &priv->adap; | 168 | return &priv->adap; |
| 145 | } | 169 | } |
| 146 | EXPORT_SYMBOL_GPL(i2c_add_mux_adapter); | 170 | EXPORT_SYMBOL_GPL(i2c_add_mux_adapter); |
diff --git a/drivers/i2c/muxes/Kconfig b/drivers/i2c/muxes/Kconfig index 90b7a0163899..beb2491db274 100644 --- a/drivers/i2c/muxes/Kconfig +++ b/drivers/i2c/muxes/Kconfig | |||
| @@ -15,7 +15,7 @@ config I2C_MUX_GPIO | |||
| 15 | through GPIO pins. | 15 | through GPIO pins. |
| 16 | 16 | ||
| 17 | This driver can also be built as a module. If so, the module | 17 | This driver can also be built as a module. If so, the module |
| 18 | will be called gpio-i2cmux. | 18 | will be called i2c-mux-gpio. |
| 19 | 19 | ||
| 20 | config I2C_MUX_PCA9541 | 20 | config I2C_MUX_PCA9541 |
| 21 | tristate "NXP PCA9541 I2C Master Selector" | 21 | tristate "NXP PCA9541 I2C Master Selector" |
| @@ -25,7 +25,7 @@ config I2C_MUX_PCA9541 | |||
| 25 | I2C Master Selector. | 25 | I2C Master Selector. |
| 26 | 26 | ||
| 27 | This driver can also be built as a module. If so, the module | 27 | This driver can also be built as a module. If so, the module |
| 28 | will be called pca9541. | 28 | will be called i2c-mux-pca9541. |
| 29 | 29 | ||
| 30 | config I2C_MUX_PCA954x | 30 | config I2C_MUX_PCA954x |
| 31 | tristate "Philips PCA954x I2C Mux/switches" | 31 | tristate "Philips PCA954x I2C Mux/switches" |
| @@ -35,6 +35,6 @@ config I2C_MUX_PCA954x | |||
| 35 | I2C mux/switch devices. | 35 | I2C mux/switch devices. |
| 36 | 36 | ||
| 37 | This driver can also be built as a module. If so, the module | 37 | This driver can also be built as a module. If so, the module |
| 38 | will be called pca954x. | 38 | will be called i2c-mux-pca954x. |
| 39 | 39 | ||
| 40 | endmenu | 40 | endmenu |
diff --git a/drivers/i2c/muxes/Makefile b/drivers/i2c/muxes/Makefile index 4640436ea61f..5826249b29ca 100644 --- a/drivers/i2c/muxes/Makefile +++ b/drivers/i2c/muxes/Makefile | |||
| @@ -1,8 +1,8 @@ | |||
| 1 | # | 1 | # |
| 2 | # Makefile for multiplexer I2C chip drivers. | 2 | # Makefile for multiplexer I2C chip drivers. |
| 3 | 3 | ||
| 4 | obj-$(CONFIG_I2C_MUX_GPIO) += gpio-i2cmux.o | 4 | obj-$(CONFIG_I2C_MUX_GPIO) += i2c-mux-gpio.o |
| 5 | obj-$(CONFIG_I2C_MUX_PCA9541) += pca9541.o | 5 | obj-$(CONFIG_I2C_MUX_PCA9541) += i2c-mux-pca9541.o |
| 6 | obj-$(CONFIG_I2C_MUX_PCA954x) += pca954x.o | 6 | obj-$(CONFIG_I2C_MUX_PCA954x) += i2c-mux-pca954x.o |
| 7 | 7 | ||
| 8 | ccflags-$(CONFIG_I2C_DEBUG_BUS) := -DDEBUG | 8 | ccflags-$(CONFIG_I2C_DEBUG_BUS) := -DDEBUG |
diff --git a/drivers/i2c/muxes/gpio-i2cmux.c b/drivers/i2c/muxes/i2c-mux-gpio.c index e5fa695eb0fa..68b1f8ec3436 100644 --- a/drivers/i2c/muxes/gpio-i2cmux.c +++ b/drivers/i2c/muxes/i2c-mux-gpio.c | |||
| @@ -10,7 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #include <linux/i2c.h> | 11 | #include <linux/i2c.h> |
| 12 | #include <linux/i2c-mux.h> | 12 | #include <linux/i2c-mux.h> |
| 13 | #include <linux/gpio-i2cmux.h> | 13 | #include <linux/i2c-mux-gpio.h> |
| 14 | #include <linux/platform_device.h> | 14 | #include <linux/platform_device.h> |
| 15 | #include <linux/init.h> | 15 | #include <linux/init.h> |
| 16 | #include <linux/module.h> | 16 | #include <linux/module.h> |
| @@ -20,10 +20,10 @@ | |||
| 20 | struct gpiomux { | 20 | struct gpiomux { |
| 21 | struct i2c_adapter *parent; | 21 | struct i2c_adapter *parent; |
| 22 | struct i2c_adapter **adap; /* child busses */ | 22 | struct i2c_adapter **adap; /* child busses */ |
| 23 | struct gpio_i2cmux_platform_data data; | 23 | struct i2c_mux_gpio_platform_data data; |
| 24 | }; | 24 | }; |
| 25 | 25 | ||
| 26 | static void gpiomux_set(const struct gpiomux *mux, unsigned val) | 26 | static void i2c_mux_gpio_set(const struct gpiomux *mux, unsigned val) |
| 27 | { | 27 | { |
| 28 | int i; | 28 | int i; |
| 29 | 29 | ||
| @@ -31,28 +31,28 @@ static void gpiomux_set(const struct gpiomux *mux, unsigned val) | |||
| 31 | gpio_set_value(mux->data.gpios[i], val & (1 << i)); | 31 | gpio_set_value(mux->data.gpios[i], val & (1 << i)); |
| 32 | } | 32 | } |
| 33 | 33 | ||
| 34 | static int gpiomux_select(struct i2c_adapter *adap, void *data, u32 chan) | 34 | static int i2c_mux_gpio_select(struct i2c_adapter *adap, void *data, u32 chan) |
| 35 | { | 35 | { |
| 36 | struct gpiomux *mux = data; | 36 | struct gpiomux *mux = data; |
| 37 | 37 | ||
| 38 | gpiomux_set(mux, mux->data.values[chan]); | 38 | i2c_mux_gpio_set(mux, mux->data.values[chan]); |
| 39 | 39 | ||
| 40 | return 0; | 40 | return 0; |
| 41 | } | 41 | } |
| 42 | 42 | ||
| 43 | static int gpiomux_deselect(struct i2c_adapter *adap, void *data, u32 chan) | 43 | static int i2c_mux_gpio_deselect(struct i2c_adapter *adap, void *data, u32 chan) |
| 44 | { | 44 | { |
| 45 | struct gpiomux *mux = data; | 45 | struct gpiomux *mux = data; |
| 46 | 46 | ||
| 47 | gpiomux_set(mux, mux->data.idle); | 47 | i2c_mux_gpio_set(mux, mux->data.idle); |
| 48 | 48 | ||
| 49 | return 0; | 49 | return 0; |
| 50 | } | 50 | } |
| 51 | 51 | ||
| 52 | static int __devinit gpiomux_probe(struct platform_device *pdev) | 52 | static int __devinit i2c_mux_gpio_probe(struct platform_device *pdev) |
| 53 | { | 53 | { |
| 54 | struct gpiomux *mux; | 54 | struct gpiomux *mux; |
| 55 | struct gpio_i2cmux_platform_data *pdata; | 55 | struct i2c_mux_gpio_platform_data *pdata; |
| 56 | struct i2c_adapter *parent; | 56 | struct i2c_adapter *parent; |
| 57 | int (*deselect) (struct i2c_adapter *, void *, u32); | 57 | int (*deselect) (struct i2c_adapter *, void *, u32); |
| 58 | unsigned initial_state; | 58 | unsigned initial_state; |
| @@ -86,16 +86,16 @@ static int __devinit gpiomux_probe(struct platform_device *pdev) | |||
| 86 | goto alloc_failed2; | 86 | goto alloc_failed2; |
| 87 | } | 87 | } |
| 88 | 88 | ||
| 89 | if (pdata->idle != GPIO_I2CMUX_NO_IDLE) { | 89 | if (pdata->idle != I2C_MUX_GPIO_NO_IDLE) { |
| 90 | initial_state = pdata->idle; | 90 | initial_state = pdata->idle; |
| 91 | deselect = gpiomux_deselect; | 91 | deselect = i2c_mux_gpio_deselect; |
| 92 | } else { | 92 | } else { |
| 93 | initial_state = pdata->values[0]; | 93 | initial_state = pdata->values[0]; |
| 94 | deselect = NULL; | 94 | deselect = NULL; |
| 95 | } | 95 | } |
| 96 | 96 | ||
| 97 | for (i = 0; i < pdata->n_gpios; i++) { | 97 | for (i = 0; i < pdata->n_gpios; i++) { |
| 98 | ret = gpio_request(pdata->gpios[i], "gpio-i2cmux"); | 98 | ret = gpio_request(pdata->gpios[i], "i2c-mux-gpio"); |
| 99 | if (ret) | 99 | if (ret) |
| 100 | goto err_request_gpio; | 100 | goto err_request_gpio; |
| 101 | gpio_direction_output(pdata->gpios[i], | 101 | gpio_direction_output(pdata->gpios[i], |
| @@ -105,8 +105,8 @@ static int __devinit gpiomux_probe(struct platform_device *pdev) | |||
| 105 | for (i = 0; i < pdata->n_values; i++) { | 105 | for (i = 0; i < pdata->n_values; i++) { |
| 106 | u32 nr = pdata->base_nr ? (pdata->base_nr + i) : 0; | 106 | u32 nr = pdata->base_nr ? (pdata->base_nr + i) : 0; |
| 107 | 107 | ||
| 108 | mux->adap[i] = i2c_add_mux_adapter(parent, mux, nr, i, | 108 | mux->adap[i] = i2c_add_mux_adapter(parent, &pdev->dev, mux, nr, i, |
| 109 | gpiomux_select, deselect); | 109 | i2c_mux_gpio_select, deselect); |
| 110 | if (!mux->adap[i]) { | 110 | if (!mux->adap[i]) { |
| 111 | ret = -ENODEV; | 111 | ret = -ENODEV; |
| 112 | dev_err(&pdev->dev, "Failed to add adapter %d\n", i); | 112 | dev_err(&pdev->dev, "Failed to add adapter %d\n", i); |
| @@ -137,7 +137,7 @@ alloc_failed: | |||
| 137 | return ret; | 137 | return ret; |
| 138 | } | 138 | } |
| 139 | 139 | ||
| 140 | static int __devexit gpiomux_remove(struct platform_device *pdev) | 140 | static int __devexit i2c_mux_gpio_remove(struct platform_device *pdev) |
| 141 | { | 141 | { |
| 142 | struct gpiomux *mux = platform_get_drvdata(pdev); | 142 | struct gpiomux *mux = platform_get_drvdata(pdev); |
| 143 | int i; | 143 | int i; |
| @@ -156,18 +156,18 @@ static int __devexit gpiomux_remove(struct platform_device *pdev) | |||
| 156 | return 0; | 156 | return 0; |
| 157 | } | 157 | } |
| 158 | 158 | ||
| 159 | static struct platform_driver gpiomux_driver = { | 159 | static struct platform_driver i2c_mux_gpio_driver = { |
| 160 | .probe = gpiomux_probe, | 160 | .probe = i2c_mux_gpio_probe, |
| 161 | .remove = __devexit_p(gpiomux_remove), | 161 | .remove = __devexit_p(i2c_mux_gpio_remove), |
| 162 | .driver = { | 162 | .driver = { |
| 163 | .owner = THIS_MODULE, | 163 | .owner = THIS_MODULE, |
| 164 | .name = "gpio-i2cmux", | 164 | .name = "i2c-mux-gpio", |
| 165 | }, | 165 | }, |
| 166 | }; | 166 | }; |
| 167 | 167 | ||
| 168 | module_platform_driver(gpiomux_driver); | 168 | module_platform_driver(i2c_mux_gpio_driver); |
| 169 | 169 | ||
| 170 | MODULE_DESCRIPTION("GPIO-based I2C multiplexer driver"); | 170 | MODULE_DESCRIPTION("GPIO-based I2C multiplexer driver"); |
| 171 | MODULE_AUTHOR("Peter Korsgaard <peter.korsgaard@barco.com>"); | 171 | MODULE_AUTHOR("Peter Korsgaard <peter.korsgaard@barco.com>"); |
| 172 | MODULE_LICENSE("GPL"); | 172 | MODULE_LICENSE("GPL"); |
| 173 | MODULE_ALIAS("platform:gpio-i2cmux"); | 173 | MODULE_ALIAS("platform:i2c-mux-gpio"); |
diff --git a/drivers/i2c/muxes/pca9541.c b/drivers/i2c/muxes/i2c-mux-pca9541.c index e0df9b6c66b3..8aacde1516ac 100644 --- a/drivers/i2c/muxes/pca9541.c +++ b/drivers/i2c/muxes/i2c-mux-pca9541.c | |||
| @@ -353,7 +353,8 @@ static int pca9541_probe(struct i2c_client *client, | |||
| 353 | force = 0; | 353 | force = 0; |
| 354 | if (pdata) | 354 | if (pdata) |
| 355 | force = pdata->modes[0].adap_id; | 355 | force = pdata->modes[0].adap_id; |
| 356 | data->mux_adap = i2c_add_mux_adapter(adap, client, force, 0, | 356 | data->mux_adap = i2c_add_mux_adapter(adap, &client->dev, client, |
| 357 | force, 0, | ||
| 357 | pca9541_select_chan, | 358 | pca9541_select_chan, |
| 358 | pca9541_release_chan); | 359 | pca9541_release_chan); |
| 359 | 360 | ||
diff --git a/drivers/i2c/muxes/pca954x.c b/drivers/i2c/muxes/i2c-mux-pca954x.c index 0e37ef27aa12..f2dfe0d8fcce 100644 --- a/drivers/i2c/muxes/pca954x.c +++ b/drivers/i2c/muxes/i2c-mux-pca954x.c | |||
| @@ -226,7 +226,7 @@ static int pca954x_probe(struct i2c_client *client, | |||
| 226 | } | 226 | } |
| 227 | 227 | ||
| 228 | data->virt_adaps[num] = | 228 | data->virt_adaps[num] = |
| 229 | i2c_add_mux_adapter(adap, client, | 229 | i2c_add_mux_adapter(adap, &client->dev, client, |
| 230 | force, num, pca954x_select_chan, | 230 | force, num, pca954x_select_chan, |
| 231 | (pdata && pdata->modes[num].deselect_on_exit) | 231 | (pdata && pdata->modes[num].deselect_on_exit) |
| 232 | ? pca954x_deselect_mux : NULL); | 232 | ? pca954x_deselect_mux : NULL); |
diff --git a/drivers/of/of_i2c.c b/drivers/of/of_i2c.c index f37fbeb66a44..1e173f357674 100644 --- a/drivers/of/of_i2c.c +++ b/drivers/of/of_i2c.c | |||
| @@ -90,8 +90,22 @@ struct i2c_client *of_find_i2c_device_by_node(struct device_node *node) | |||
| 90 | if (!dev) | 90 | if (!dev) |
| 91 | return NULL; | 91 | return NULL; |
| 92 | 92 | ||
| 93 | return to_i2c_client(dev); | 93 | return i2c_verify_client(dev); |
| 94 | } | 94 | } |
| 95 | EXPORT_SYMBOL(of_find_i2c_device_by_node); | 95 | EXPORT_SYMBOL(of_find_i2c_device_by_node); |
| 96 | 96 | ||
| 97 | /* must call put_device() when done with returned i2c_adapter device */ | ||
| 98 | struct i2c_adapter *of_find_i2c_adapter_by_node(struct device_node *node) | ||
| 99 | { | ||
| 100 | struct device *dev; | ||
| 101 | |||
| 102 | dev = bus_find_device(&i2c_bus_type, NULL, node, | ||
| 103 | of_dev_node_match); | ||
| 104 | if (!dev) | ||
| 105 | return NULL; | ||
| 106 | |||
| 107 | return i2c_verify_adapter(dev); | ||
| 108 | } | ||
| 109 | EXPORT_SYMBOL(of_find_i2c_adapter_by_node); | ||
| 110 | |||
| 97 | MODULE_LICENSE("GPL"); | 111 | MODULE_LICENSE("GPL"); |
diff --git a/include/linux/gpio-i2cmux.h b/include/linux/i2c-mux-gpio.h index 4a333bb0bd0d..a36343a37ebc 100644 --- a/include/linux/gpio-i2cmux.h +++ b/include/linux/i2c-mux-gpio.h | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * gpio-i2cmux interface to platform code | 2 | * i2c-mux-gpio interface to platform code |
| 3 | * | 3 | * |
| 4 | * Peter Korsgaard <peter.korsgaard@barco.com> | 4 | * Peter Korsgaard <peter.korsgaard@barco.com> |
| 5 | * | 5 | * |
| @@ -8,14 +8,14 @@ | |||
| 8 | * published by the Free Software Foundation. | 8 | * published by the Free Software Foundation. |
| 9 | */ | 9 | */ |
| 10 | 10 | ||
| 11 | #ifndef _LINUX_GPIO_I2CMUX_H | 11 | #ifndef _LINUX_I2C_MUX_GPIO_H |
| 12 | #define _LINUX_GPIO_I2CMUX_H | 12 | #define _LINUX_I2C_MUX_GPIO_H |
| 13 | 13 | ||
| 14 | /* MUX has no specific idle mode */ | 14 | /* MUX has no specific idle mode */ |
| 15 | #define GPIO_I2CMUX_NO_IDLE ((unsigned)-1) | 15 | #define I2C_MUX_GPIO_NO_IDLE ((unsigned)-1) |
| 16 | 16 | ||
| 17 | /** | 17 | /** |
| 18 | * struct gpio_i2cmux_platform_data - Platform-dependent data for gpio-i2cmux | 18 | * struct i2c_mux_gpio_platform_data - Platform-dependent data for i2c-mux-gpio |
| 19 | * @parent: Parent I2C bus adapter number | 19 | * @parent: Parent I2C bus adapter number |
| 20 | * @base_nr: Base I2C bus number to number adapters from or zero for dynamic | 20 | * @base_nr: Base I2C bus number to number adapters from or zero for dynamic |
| 21 | * @values: Array of bitmasks of GPIO settings (low/high) for each | 21 | * @values: Array of bitmasks of GPIO settings (low/high) for each |
| @@ -25,7 +25,7 @@ | |||
| 25 | * @n_gpios: Number of GPIOs used to control MUX | 25 | * @n_gpios: Number of GPIOs used to control MUX |
| 26 | * @idle: Bitmask to write to MUX when idle or GPIO_I2CMUX_NO_IDLE if not used | 26 | * @idle: Bitmask to write to MUX when idle or GPIO_I2CMUX_NO_IDLE if not used |
| 27 | */ | 27 | */ |
| 28 | struct gpio_i2cmux_platform_data { | 28 | struct i2c_mux_gpio_platform_data { |
| 29 | int parent; | 29 | int parent; |
| 30 | int base_nr; | 30 | int base_nr; |
| 31 | const unsigned *values; | 31 | const unsigned *values; |
| @@ -35,4 +35,4 @@ struct gpio_i2cmux_platform_data { | |||
| 35 | unsigned idle; | 35 | unsigned idle; |
| 36 | }; | 36 | }; |
| 37 | 37 | ||
| 38 | #endif /* _LINUX_GPIO_I2CMUX_H */ | 38 | #endif /* _LINUX_I2C_MUX_GPIO_H */ |
diff --git a/include/linux/i2c-mux.h b/include/linux/i2c-mux.h index 747f0cde4164..c79083830014 100644 --- a/include/linux/i2c-mux.h +++ b/include/linux/i2c-mux.h | |||
| @@ -34,7 +34,8 @@ | |||
| 34 | * mux control. | 34 | * mux control. |
| 35 | */ | 35 | */ |
| 36 | struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, | 36 | struct i2c_adapter *i2c_add_mux_adapter(struct i2c_adapter *parent, |
| 37 | void *mux_dev, u32 force_nr, u32 chan_id, | 37 | struct device *mux_dev, |
| 38 | void *mux_priv, u32 force_nr, u32 chan_id, | ||
| 38 | int (*select) (struct i2c_adapter *, | 39 | int (*select) (struct i2c_adapter *, |
| 39 | void *mux_dev, u32 chan_id), | 40 | void *mux_dev, u32 chan_id), |
| 40 | int (*deselect) (struct i2c_adapter *, | 41 | int (*deselect) (struct i2c_adapter *, |
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index 195d8b3d9cfb..b66cb601435f 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
| @@ -232,6 +232,7 @@ struct i2c_client { | |||
| 232 | #define to_i2c_client(d) container_of(d, struct i2c_client, dev) | 232 | #define to_i2c_client(d) container_of(d, struct i2c_client, dev) |
| 233 | 233 | ||
| 234 | extern struct i2c_client *i2c_verify_client(struct device *dev); | 234 | extern struct i2c_client *i2c_verify_client(struct device *dev); |
| 235 | extern struct i2c_adapter *i2c_verify_adapter(struct device *dev); | ||
| 235 | 236 | ||
| 236 | static inline struct i2c_client *kobj_to_i2c_client(struct kobject *kobj) | 237 | static inline struct i2c_client *kobj_to_i2c_client(struct kobject *kobj) |
| 237 | { | 238 | { |
diff --git a/include/linux/of_i2c.h b/include/linux/of_i2c.h index 0efe8d465f55..1cb775f8e663 100644 --- a/include/linux/of_i2c.h +++ b/include/linux/of_i2c.h | |||
| @@ -20,6 +20,10 @@ extern void of_i2c_register_devices(struct i2c_adapter *adap); | |||
| 20 | /* must call put_device() when done with returned i2c_client device */ | 20 | /* must call put_device() when done with returned i2c_client device */ |
| 21 | extern struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); | 21 | extern struct i2c_client *of_find_i2c_device_by_node(struct device_node *node); |
| 22 | 22 | ||
| 23 | /* must call put_device() when done with returned i2c_adapter device */ | ||
| 24 | extern struct i2c_adapter *of_find_i2c_adapter_by_node( | ||
| 25 | struct device_node *node); | ||
| 26 | |||
| 23 | #else | 27 | #else |
| 24 | static inline void of_i2c_register_devices(struct i2c_adapter *adap) | 28 | static inline void of_i2c_register_devices(struct i2c_adapter *adap) |
| 25 | { | 29 | { |
