diff options
46 files changed, 2096 insertions, 597 deletions
diff --git a/Documentation/devicetree/bindings/i2c/atmel-i2c.txt b/Documentation/devicetree/bindings/i2c/atmel-i2c.txt new file mode 100644 index 000000000000..b689a0d9441c --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/atmel-i2c.txt | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | I2C for Atmel platforms | ||
| 2 | |||
| 3 | Required properties : | ||
| 4 | - compatible : Must be "atmel,at91rm9200-i2c", "atmel,at91sam9261-i2c", | ||
| 5 | "atmel,at91sam9260-i2c", "atmel,at91sam9g20-i2c", "atmel,at91sam9g10-i2c" | ||
| 6 | or "atmel,at91sam9x5-i2c" | ||
| 7 | - reg: physical base address of the controller and length of memory mapped | ||
| 8 | region. | ||
| 9 | - interrupts: interrupt number to the cpu. | ||
| 10 | - #address-cells = <1>; | ||
| 11 | - #size-cells = <0>; | ||
| 12 | |||
| 13 | Optional properties: | ||
| 14 | - Child nodes conforming to i2c bus binding | ||
| 15 | |||
| 16 | Examples : | ||
| 17 | |||
| 18 | i2c0: i2c@fff84000 { | ||
| 19 | compatible = "atmel,at91sam9g20-i2c"; | ||
| 20 | reg = <0xfff84000 0x100>; | ||
| 21 | interrupts = <12 4 6>; | ||
| 22 | #address-cells = <1>; | ||
| 23 | #size-cells = <0>; | ||
| 24 | |||
| 25 | 24c512@50 { | ||
| 26 | compatible = "24c512"; | ||
| 27 | reg = <0x50>; | ||
| 28 | pagesize = <128>; | ||
| 29 | } | ||
| 30 | } | ||
diff --git a/Documentation/devicetree/bindings/i2c/davinci.txt b/Documentation/devicetree/bindings/i2c/davinci.txt new file mode 100644 index 000000000000..2dc935b4113d --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/davinci.txt | |||
| @@ -0,0 +1,28 @@ | |||
| 1 | * Texas Instruments Davinci I2C | ||
| 2 | |||
| 3 | This file provides information, what the device node for the | ||
| 4 | davinci i2c interface contain. | ||
| 5 | |||
| 6 | Required properties: | ||
| 7 | - compatible: "ti,davinci-i2c"; | ||
| 8 | - reg : Offset and length of the register set for the device | ||
| 9 | |||
| 10 | Recommended properties : | ||
| 11 | - interrupts : standard interrupt property. | ||
| 12 | - clock-frequency : desired I2C bus clock frequency in Hz. | ||
| 13 | |||
| 14 | Example (enbw_cmc board): | ||
| 15 | i2c@1c22000 { | ||
| 16 | compatible = "ti,davinci-i2c"; | ||
| 17 | reg = <0x22000 0x1000>; | ||
| 18 | clock-frequency = <100000>; | ||
| 19 | interrupts = <15>; | ||
| 20 | interrupt-parent = <&intc>; | ||
| 21 | #address-cells = <1>; | ||
| 22 | #size-cells = <0>; | ||
| 23 | |||
| 24 | dtt@48 { | ||
| 25 | compatible = "national,lm75"; | ||
| 26 | reg = <0x48>; | ||
| 27 | }; | ||
| 28 | }; | ||
diff --git a/Documentation/devicetree/bindings/i2c/i2c-mxs.txt b/Documentation/devicetree/bindings/i2c/i2c-mxs.txt index 30ac3a0557f7..7a3fe9e5f4cb 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-mxs.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-mxs.txt | |||
| @@ -6,6 +6,7 @@ Required properties: | |||
| 6 | - interrupts: Should contain ERROR and DMA interrupts | 6 | - interrupts: Should contain ERROR and DMA interrupts |
| 7 | - clock-frequency: Desired I2C bus clock frequency in Hz. | 7 | - clock-frequency: Desired I2C bus clock frequency in Hz. |
| 8 | Only 100000Hz and 400000Hz modes are supported. | 8 | Only 100000Hz and 400000Hz modes are supported. |
| 9 | - fsl,i2c-dma-channel: APBX DMA channel for the I2C | ||
| 9 | 10 | ||
| 10 | Examples: | 11 | Examples: |
| 11 | 12 | ||
| @@ -16,4 +17,5 @@ i2c0: i2c@80058000 { | |||
| 16 | reg = <0x80058000 2000>; | 17 | reg = <0x80058000 2000>; |
| 17 | interrupts = <111 68>; | 18 | interrupts = <111 68>; |
| 18 | clock-frequency = <100000>; | 19 | clock-frequency = <100000>; |
| 20 | fsl,i2c-dma-channel = <6>; | ||
| 19 | }; | 21 | }; |
diff --git a/Documentation/devicetree/bindings/i2c/nomadik.txt b/Documentation/devicetree/bindings/i2c/nomadik.txt new file mode 100644 index 000000000000..72065b0ff680 --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/nomadik.txt | |||
| @@ -0,0 +1,23 @@ | |||
| 1 | I2C for Nomadik based systems | ||
| 2 | |||
| 3 | Required (non-standard) properties: | ||
| 4 | - Nil | ||
| 5 | |||
| 6 | Recommended (non-standard) properties: | ||
| 7 | - clock-frequency : Maximum bus clock frequency for the device | ||
| 8 | |||
| 9 | Optional (non-standard) properties: | ||
| 10 | - Nil | ||
| 11 | |||
| 12 | Example : | ||
| 13 | |||
| 14 | i2c@80004000 { | ||
| 15 | compatible = "stericsson,db8500-i2c", "st,nomadik-i2c"; | ||
| 16 | reg = <0x80004000 0x1000>; | ||
| 17 | interrupts = <0 21 0x4>; | ||
| 18 | #address-cells = <1>; | ||
| 19 | #size-cells = <0>; | ||
| 20 | v-i2c-supply = <&db8500_vape_reg>; | ||
| 21 | |||
| 22 | clock-frequency = <400000>; | ||
| 23 | }; | ||
diff --git a/arch/arm/boot/dts/at91sam9260.dtsi b/arch/arm/boot/dts/at91sam9260.dtsi index 7c95f76398de..d410581a5a85 100644 --- a/arch/arm/boot/dts/at91sam9260.dtsi +++ b/arch/arm/boot/dts/at91sam9260.dtsi | |||
| @@ -28,6 +28,7 @@ | |||
| 28 | gpio2 = &pioC; | 28 | gpio2 = &pioC; |
| 29 | tcb0 = &tcb0; | 29 | tcb0 = &tcb0; |
| 30 | tcb1 = &tcb1; | 30 | tcb1 = &tcb1; |
| 31 | i2c0 = &i2c0; | ||
| 31 | }; | 32 | }; |
| 32 | cpus { | 33 | cpus { |
| 33 | cpu@0 { | 34 | cpu@0 { |
| @@ -202,6 +203,15 @@ | |||
| 202 | status = "disabled"; | 203 | status = "disabled"; |
| 203 | }; | 204 | }; |
| 204 | 205 | ||
| 206 | i2c0: i2c@fffac000 { | ||
| 207 | compatible = "atmel,at91sam9260-i2c"; | ||
| 208 | reg = <0xfffac000 0x100>; | ||
| 209 | interrupts = <11 4 6>; | ||
| 210 | #address-cells = <1>; | ||
| 211 | #size-cells = <0>; | ||
| 212 | status = "disabled"; | ||
| 213 | }; | ||
| 214 | |||
| 205 | adc0: adc@fffe0000 { | 215 | adc0: adc@fffe0000 { |
| 206 | compatible = "atmel,at91sam9260-adc"; | 216 | compatible = "atmel,at91sam9260-adc"; |
| 207 | reg = <0xfffe0000 0x100>; | 217 | reg = <0xfffe0000 0x100>; |
diff --git a/arch/arm/boot/dts/at91sam9263.dtsi b/arch/arm/boot/dts/at91sam9263.dtsi index 195019b7ca0e..3e6e5c1abbf3 100644 --- a/arch/arm/boot/dts/at91sam9263.dtsi +++ b/arch/arm/boot/dts/at91sam9263.dtsi | |||
| @@ -24,6 +24,7 @@ | |||
| 24 | gpio3 = &pioD; | 24 | gpio3 = &pioD; |
| 25 | gpio4 = &pioE; | 25 | gpio4 = &pioE; |
| 26 | tcb0 = &tcb0; | 26 | tcb0 = &tcb0; |
| 27 | i2c0 = &i2c0; | ||
| 27 | }; | 28 | }; |
| 28 | cpus { | 29 | cpus { |
| 29 | cpu@0 { | 30 | cpu@0 { |
| @@ -185,6 +186,15 @@ | |||
| 185 | interrupts = <24 4 2>; | 186 | interrupts = <24 4 2>; |
| 186 | status = "disabled"; | 187 | status = "disabled"; |
| 187 | }; | 188 | }; |
| 189 | |||
| 190 | i2c0: i2c@fff88000 { | ||
| 191 | compatible = "atmel,at91sam9263-i2c"; | ||
| 192 | reg = <0xfff88000 0x100>; | ||
| 193 | interrupts = <13 4 6>; | ||
| 194 | #address-cells = <1>; | ||
| 195 | #size-cells = <0>; | ||
| 196 | status = "disabled"; | ||
| 197 | }; | ||
| 188 | }; | 198 | }; |
| 189 | 199 | ||
| 190 | nand0: nand@40000000 { | 200 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9g20.dtsi b/arch/arm/boot/dts/at91sam9g20.dtsi index 2a1d1ca8bd86..75ce6e760016 100644 --- a/arch/arm/boot/dts/at91sam9g20.dtsi +++ b/arch/arm/boot/dts/at91sam9g20.dtsi | |||
| @@ -18,6 +18,10 @@ | |||
| 18 | 18 | ||
| 19 | ahb { | 19 | ahb { |
| 20 | apb { | 20 | apb { |
| 21 | i2c0: i2c@fffac000 { | ||
| 22 | compatible = "atmel,at91sam9g20-i2c"; | ||
| 23 | }; | ||
| 24 | |||
| 21 | adc0: adc@fffe0000 { | 25 | adc0: adc@fffe0000 { |
| 22 | atmel,adc-startup-time = <40>; | 26 | atmel,adc-startup-time = <40>; |
| 23 | }; | 27 | }; |
diff --git a/arch/arm/boot/dts/at91sam9g25ek.dts b/arch/arm/boot/dts/at91sam9g25ek.dts index 96514c134e54..877c08f06763 100644 --- a/arch/arm/boot/dts/at91sam9g25ek.dts +++ b/arch/arm/boot/dts/at91sam9g25ek.dts | |||
| @@ -32,6 +32,18 @@ | |||
| 32 | phy-mode = "rmii"; | 32 | phy-mode = "rmii"; |
| 33 | status = "okay"; | 33 | status = "okay"; |
| 34 | }; | 34 | }; |
| 35 | |||
| 36 | i2c0: i2c@f8010000 { | ||
| 37 | status = "okay"; | ||
| 38 | }; | ||
| 39 | |||
| 40 | i2c1: i2c@f8014000 { | ||
| 41 | status = "okay"; | ||
| 42 | }; | ||
| 43 | |||
| 44 | i2c2: i2c@f8018000 { | ||
| 45 | status = "okay"; | ||
| 46 | }; | ||
| 35 | }; | 47 | }; |
| 36 | 48 | ||
| 37 | usb0: ohci@00600000 { | 49 | usb0: ohci@00600000 { |
diff --git a/arch/arm/boot/dts/at91sam9g45.dtsi b/arch/arm/boot/dts/at91sam9g45.dtsi index 63751b1e744b..3add030d61f8 100644 --- a/arch/arm/boot/dts/at91sam9g45.dtsi +++ b/arch/arm/boot/dts/at91sam9g45.dtsi | |||
| @@ -29,6 +29,8 @@ | |||
| 29 | gpio4 = &pioE; | 29 | gpio4 = &pioE; |
| 30 | tcb0 = &tcb0; | 30 | tcb0 = &tcb0; |
| 31 | tcb1 = &tcb1; | 31 | tcb1 = &tcb1; |
| 32 | i2c0 = &i2c0; | ||
| 33 | i2c1 = &i2c1; | ||
| 32 | }; | 34 | }; |
| 33 | cpus { | 35 | cpus { |
| 34 | cpu@0 { | 36 | cpu@0 { |
| @@ -206,6 +208,24 @@ | |||
| 206 | status = "disabled"; | 208 | status = "disabled"; |
| 207 | }; | 209 | }; |
| 208 | 210 | ||
| 211 | i2c0: i2c@fff84000 { | ||
| 212 | compatible = "atmel,at91sam9g10-i2c"; | ||
| 213 | reg = <0xfff84000 0x100>; | ||
| 214 | interrupts = <12 4 6>; | ||
| 215 | #address-cells = <1>; | ||
| 216 | #size-cells = <0>; | ||
| 217 | status = "disabled"; | ||
| 218 | }; | ||
| 219 | |||
| 220 | i2c1: i2c@fff88000 { | ||
| 221 | compatible = "atmel,at91sam9g10-i2c"; | ||
| 222 | reg = <0xfff88000 0x100>; | ||
| 223 | interrupts = <13 4 6>; | ||
| 224 | #address-cells = <1>; | ||
| 225 | #size-cells = <0>; | ||
| 226 | status = "disabled"; | ||
| 227 | }; | ||
| 228 | |||
| 209 | adc0: adc@fffb0000 { | 229 | adc0: adc@fffb0000 { |
| 210 | compatible = "atmel,at91sam9260-adc"; | 230 | compatible = "atmel,at91sam9260-adc"; |
| 211 | reg = <0xfffb0000 0x100>; | 231 | reg = <0xfffb0000 0x100>; |
diff --git a/arch/arm/boot/dts/at91sam9m10g45ek.dts b/arch/arm/boot/dts/at91sam9m10g45ek.dts index a3633bd13111..15e1dd43f625 100644 --- a/arch/arm/boot/dts/at91sam9m10g45ek.dts +++ b/arch/arm/boot/dts/at91sam9m10g45ek.dts | |||
| @@ -46,6 +46,14 @@ | |||
| 46 | phy-mode = "rmii"; | 46 | phy-mode = "rmii"; |
| 47 | status = "okay"; | 47 | status = "okay"; |
| 48 | }; | 48 | }; |
| 49 | |||
| 50 | i2c0: i2c@fff84000 { | ||
| 51 | status = "okay"; | ||
| 52 | }; | ||
| 53 | |||
| 54 | i2c1: i2c@fff88000 { | ||
| 55 | status = "okay"; | ||
| 56 | }; | ||
| 49 | }; | 57 | }; |
| 50 | 58 | ||
| 51 | nand0: nand@40000000 { | 59 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9n12.dtsi b/arch/arm/boot/dts/at91sam9n12.dtsi index ef9336ae9614..82508d68aa7e 100644 --- a/arch/arm/boot/dts/at91sam9n12.dtsi +++ b/arch/arm/boot/dts/at91sam9n12.dtsi | |||
| @@ -26,6 +26,8 @@ | |||
| 26 | gpio3 = &pioD; | 26 | gpio3 = &pioD; |
| 27 | tcb0 = &tcb0; | 27 | tcb0 = &tcb0; |
| 28 | tcb1 = &tcb1; | 28 | tcb1 = &tcb1; |
| 29 | i2c0 = &i2c0; | ||
| 30 | i2c1 = &i2c1; | ||
| 29 | }; | 31 | }; |
| 30 | cpus { | 32 | cpus { |
| 31 | cpu@0 { | 33 | cpu@0 { |
| @@ -182,6 +184,24 @@ | |||
| 182 | atmel,use-dma-tx; | 184 | atmel,use-dma-tx; |
| 183 | status = "disabled"; | 185 | status = "disabled"; |
| 184 | }; | 186 | }; |
| 187 | |||
| 188 | i2c0: i2c@f8010000 { | ||
| 189 | compatible = "atmel,at91sam9x5-i2c"; | ||
| 190 | reg = <0xf8010000 0x100>; | ||
| 191 | interrupts = <9 4 6>; | ||
| 192 | #address-cells = <1>; | ||
| 193 | #size-cells = <0>; | ||
| 194 | status = "disabled"; | ||
| 195 | }; | ||
| 196 | |||
| 197 | i2c1: i2c@f8014000 { | ||
| 198 | compatible = "atmel,at91sam9x5-i2c"; | ||
| 199 | reg = <0xf8014000 0x100>; | ||
| 200 | interrupts = <10 4 6>; | ||
| 201 | #address-cells = <1>; | ||
| 202 | #size-cells = <0>; | ||
| 203 | status = "disabled"; | ||
| 204 | }; | ||
| 185 | }; | 205 | }; |
| 186 | 206 | ||
| 187 | nand0: nand@40000000 { | 207 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9n12ek.dts b/arch/arm/boot/dts/at91sam9n12ek.dts index f4e43e38f3a1..912b2c283d6f 100644 --- a/arch/arm/boot/dts/at91sam9n12ek.dts +++ b/arch/arm/boot/dts/at91sam9n12ek.dts | |||
| @@ -37,6 +37,14 @@ | |||
| 37 | dbgu: serial@fffff200 { | 37 | dbgu: serial@fffff200 { |
| 38 | status = "okay"; | 38 | status = "okay"; |
| 39 | }; | 39 | }; |
| 40 | |||
| 41 | i2c0: i2c@f8010000 { | ||
| 42 | status = "okay"; | ||
| 43 | }; | ||
| 44 | |||
| 45 | i2c1: i2c@f8014000 { | ||
| 46 | status = "okay"; | ||
| 47 | }; | ||
| 40 | }; | 48 | }; |
| 41 | 49 | ||
| 42 | nand0: nand@40000000 { | 50 | nand0: nand@40000000 { |
diff --git a/arch/arm/boot/dts/at91sam9x5.dtsi b/arch/arm/boot/dts/at91sam9x5.dtsi index 8a387a8d61b7..03fc136421c5 100644 --- a/arch/arm/boot/dts/at91sam9x5.dtsi +++ b/arch/arm/boot/dts/at91sam9x5.dtsi | |||
| @@ -27,6 +27,9 @@ | |||
| 27 | gpio3 = &pioD; | 27 | gpio3 = &pioD; |
| 28 | tcb0 = &tcb0; | 28 | tcb0 = &tcb0; |
| 29 | tcb1 = &tcb1; | 29 | tcb1 = &tcb1; |
| 30 | i2c0 = &i2c0; | ||
| 31 | i2c1 = &i2c1; | ||
| 32 | i2c2 = &i2c2; | ||
| 30 | }; | 33 | }; |
| 31 | cpus { | 34 | cpus { |
| 32 | cpu@0 { | 35 | cpu@0 { |
| @@ -196,6 +199,33 @@ | |||
| 196 | status = "disabled"; | 199 | status = "disabled"; |
| 197 | }; | 200 | }; |
| 198 | 201 | ||
| 202 | i2c0: i2c@f8010000 { | ||
| 203 | compatible = "atmel,at91sam9x5-i2c"; | ||
| 204 | reg = <0xf8010000 0x100>; | ||
| 205 | interrupts = <9 4 6>; | ||
| 206 | #address-cells = <1>; | ||
| 207 | #size-cells = <0>; | ||
| 208 | status = "disabled"; | ||
| 209 | }; | ||
| 210 | |||
| 211 | i2c1: i2c@f8014000 { | ||
| 212 | compatible = "atmel,at91sam9x5-i2c"; | ||
| 213 | reg = <0xf8014000 0x100>; | ||
| 214 | interrupts = <10 4 6>; | ||
| 215 | #address-cells = <1>; | ||
| 216 | #size-cells = <0>; | ||
| 217 | status = "disabled"; | ||
| 218 | }; | ||
| 219 | |||
| 220 | i2c2: i2c@f8018000 { | ||
| 221 | compatible = "atmel,at91sam9x5-i2c"; | ||
| 222 | reg = <0xf8018000 0x100>; | ||
| 223 | interrupts = <11 4 6>; | ||
| 224 | #address-cells = <1>; | ||
| 225 | #size-cells = <0>; | ||
| 226 | status = "disabled"; | ||
| 227 | }; | ||
| 228 | |||
| 199 | adc0: adc@f804c000 { | 229 | adc0: adc@f804c000 { |
| 200 | compatible = "atmel,at91sam9260-adc"; | 230 | compatible = "atmel,at91sam9260-adc"; |
| 201 | reg = <0xf804c000 0x100>; | 231 | reg = <0xf804c000 0x100>; |
diff --git a/arch/arm/boot/dts/imx28.dtsi b/arch/arm/boot/dts/imx28.dtsi index 59fbfba23df8..e16d63155480 100644 --- a/arch/arm/boot/dts/imx28.dtsi +++ b/arch/arm/boot/dts/imx28.dtsi | |||
| @@ -764,6 +764,7 @@ | |||
| 764 | reg = <0x80058000 0x2000>; | 764 | reg = <0x80058000 0x2000>; |
| 765 | interrupts = <111 68>; | 765 | interrupts = <111 68>; |
| 766 | clock-frequency = <100000>; | 766 | clock-frequency = <100000>; |
| 767 | fsl,i2c-dma-channel = <6>; | ||
| 767 | status = "disabled"; | 768 | status = "disabled"; |
| 768 | }; | 769 | }; |
| 769 | 770 | ||
| @@ -774,6 +775,7 @@ | |||
| 774 | reg = <0x8005a000 0x2000>; | 775 | reg = <0x8005a000 0x2000>; |
| 775 | interrupts = <110 69>; | 776 | interrupts = <110 69>; |
| 776 | clock-frequency = <100000>; | 777 | clock-frequency = <100000>; |
| 778 | fsl,i2c-dma-channel = <7>; | ||
| 777 | status = "disabled"; | 779 | status = "disabled"; |
| 778 | }; | 780 | }; |
| 779 | 781 | ||
diff --git a/arch/arm/mach-at91/at91rm9200.c b/arch/arm/mach-at91/at91rm9200.c index 6f50c6722276..b4f0565aff63 100644 --- a/arch/arm/mach-at91/at91rm9200.c +++ b/arch/arm/mach-at91/at91rm9200.c | |||
| @@ -187,6 +187,7 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 187 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | 187 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), |
| 188 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | 188 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), |
| 189 | CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk), | 189 | CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk), |
| 190 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91rm9200", &twi_clk), | ||
| 190 | /* fake hclk clock */ | 191 | /* fake hclk clock */ |
| 191 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), | 192 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), |
| 192 | CLKDEV_CON_ID("pioA", &pioA_clk), | 193 | CLKDEV_CON_ID("pioA", &pioA_clk), |
diff --git a/arch/arm/mach-at91/at91rm9200_devices.c b/arch/arm/mach-at91/at91rm9200_devices.c index 9ac427a702da..a563189cdfc3 100644 --- a/arch/arm/mach-at91/at91rm9200_devices.c +++ b/arch/arm/mach-at91/at91rm9200_devices.c | |||
| @@ -511,7 +511,7 @@ static struct resource twi_resources[] = { | |||
| 511 | }; | 511 | }; |
| 512 | 512 | ||
| 513 | static struct platform_device at91rm9200_twi_device = { | 513 | static struct platform_device at91rm9200_twi_device = { |
| 514 | .name = "at91_i2c", | 514 | .name = "i2c-at91rm9200", |
| 515 | .id = -1, | 515 | .id = -1, |
| 516 | .resource = twi_resources, | 516 | .resource = twi_resources, |
| 517 | .num_resources = ARRAY_SIZE(twi_resources), | 517 | .num_resources = ARRAY_SIZE(twi_resources), |
diff --git a/arch/arm/mach-at91/at91sam9260.c b/arch/arm/mach-at91/at91sam9260.c index 30c7f26a4668..ad29f93f20ca 100644 --- a/arch/arm/mach-at91/at91sam9260.c +++ b/arch/arm/mach-at91/at91sam9260.c | |||
| @@ -211,6 +211,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 211 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk), | 211 | CLKDEV_CON_DEV_ID("t1_clk", "atmel_tcb.1", &tc4_clk), |
| 212 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk), | 212 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.1", &tc5_clk), |
| 213 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc_clk), | 213 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc_clk), |
| 214 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9260", &twi_clk), | ||
| 215 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9g20", &twi_clk), | ||
| 214 | /* more usart lookup table for DT entries */ | 216 | /* more usart lookup table for DT entries */ |
| 215 | CLKDEV_CON_DEV_ID("usart", "fffff200.serial", &mck), | 217 | CLKDEV_CON_DEV_ID("usart", "fffff200.serial", &mck), |
| 216 | CLKDEV_CON_DEV_ID("usart", "fffb0000.serial", &usart0_clk), | 218 | CLKDEV_CON_DEV_ID("usart", "fffb0000.serial", &usart0_clk), |
| @@ -219,6 +221,7 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 219 | CLKDEV_CON_DEV_ID("usart", "fffd0000.serial", &usart3_clk), | 221 | CLKDEV_CON_DEV_ID("usart", "fffd0000.serial", &usart3_clk), |
| 220 | CLKDEV_CON_DEV_ID("usart", "fffd4000.serial", &usart4_clk), | 222 | CLKDEV_CON_DEV_ID("usart", "fffd4000.serial", &usart4_clk), |
| 221 | CLKDEV_CON_DEV_ID("usart", "fffd8000.serial", &usart5_clk), | 223 | CLKDEV_CON_DEV_ID("usart", "fffd8000.serial", &usart5_clk), |
| 224 | CLKDEV_CON_DEV_ID(NULL, "fffac000.i2c", &twi_clk), | ||
| 222 | /* more tc lookup table for DT entries */ | 225 | /* more tc lookup table for DT entries */ |
| 223 | CLKDEV_CON_DEV_ID("t0_clk", "fffa0000.timer", &tc0_clk), | 226 | CLKDEV_CON_DEV_ID("t0_clk", "fffa0000.timer", &tc0_clk), |
| 224 | CLKDEV_CON_DEV_ID("t1_clk", "fffa0000.timer", &tc1_clk), | 227 | CLKDEV_CON_DEV_ID("t1_clk", "fffa0000.timer", &tc1_clk), |
diff --git a/arch/arm/mach-at91/at91sam9260_devices.c b/arch/arm/mach-at91/at91sam9260_devices.c index af50ff3281c7..a76b8684f52d 100644 --- a/arch/arm/mach-at91/at91sam9260_devices.c +++ b/arch/arm/mach-at91/at91sam9260_devices.c | |||
| @@ -421,7 +421,6 @@ static struct resource twi_resources[] = { | |||
| 421 | }; | 421 | }; |
| 422 | 422 | ||
| 423 | static struct platform_device at91sam9260_twi_device = { | 423 | static struct platform_device at91sam9260_twi_device = { |
| 424 | .name = "at91_i2c", | ||
| 425 | .id = -1, | 424 | .id = -1, |
| 426 | .resource = twi_resources, | 425 | .resource = twi_resources, |
| 427 | .num_resources = ARRAY_SIZE(twi_resources), | 426 | .num_resources = ARRAY_SIZE(twi_resources), |
| @@ -429,6 +428,13 @@ static struct platform_device at91sam9260_twi_device = { | |||
| 429 | 428 | ||
| 430 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) | 429 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) |
| 431 | { | 430 | { |
| 431 | /* IP version is not the same on 9260 and g20 */ | ||
| 432 | if (cpu_is_at91sam9g20()) { | ||
| 433 | at91sam9260_twi_device.name = "i2c-at91sam9g20"; | ||
| 434 | } else { | ||
| 435 | at91sam9260_twi_device.name = "i2c-at91sam9260"; | ||
| 436 | } | ||
| 437 | |||
| 432 | /* pins used for TWI interface */ | 438 | /* pins used for TWI interface */ |
| 433 | at91_set_A_periph(AT91_PIN_PA23, 0); /* TWD */ | 439 | at91_set_A_periph(AT91_PIN_PA23, 0); /* TWD */ |
| 434 | at91_set_multi_drive(AT91_PIN_PA23, 1); | 440 | at91_set_multi_drive(AT91_PIN_PA23, 1); |
diff --git a/arch/arm/mach-at91/at91sam9261.c b/arch/arm/mach-at91/at91sam9261.c index f40762c5fede..8d999eb1a137 100644 --- a/arch/arm/mach-at91/at91sam9261.c +++ b/arch/arm/mach-at91/at91sam9261.c | |||
| @@ -178,6 +178,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 178 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | 178 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), |
| 179 | CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk), | 179 | CLKDEV_CON_DEV_ID("pclk", "ssc.2", &ssc2_clk), |
| 180 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &hck0), | 180 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &hck0), |
| 181 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9261", &twi_clk), | ||
| 182 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9g10", &twi_clk), | ||
| 181 | CLKDEV_CON_ID("pioA", &pioA_clk), | 183 | CLKDEV_CON_ID("pioA", &pioA_clk), |
| 182 | CLKDEV_CON_ID("pioB", &pioB_clk), | 184 | CLKDEV_CON_ID("pioB", &pioB_clk), |
| 183 | CLKDEV_CON_ID("pioC", &pioC_clk), | 185 | CLKDEV_CON_ID("pioC", &pioC_clk), |
diff --git a/arch/arm/mach-at91/at91sam9261_devices.c b/arch/arm/mach-at91/at91sam9261_devices.c index 11e9fa835cde..9752f17efba9 100644 --- a/arch/arm/mach-at91/at91sam9261_devices.c +++ b/arch/arm/mach-at91/at91sam9261_devices.c | |||
| @@ -317,7 +317,6 @@ static struct resource twi_resources[] = { | |||
| 317 | }; | 317 | }; |
| 318 | 318 | ||
| 319 | static struct platform_device at91sam9261_twi_device = { | 319 | static struct platform_device at91sam9261_twi_device = { |
| 320 | .name = "at91_i2c", | ||
| 321 | .id = -1, | 320 | .id = -1, |
| 322 | .resource = twi_resources, | 321 | .resource = twi_resources, |
| 323 | .num_resources = ARRAY_SIZE(twi_resources), | 322 | .num_resources = ARRAY_SIZE(twi_resources), |
| @@ -325,12 +324,19 @@ static struct platform_device at91sam9261_twi_device = { | |||
| 325 | 324 | ||
| 326 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) | 325 | void __init at91_add_device_i2c(struct i2c_board_info *devices, int nr_devices) |
| 327 | { | 326 | { |
| 327 | /* IP version is not the same on 9261 and g10 */ | ||
| 328 | if (cpu_is_at91sam9g10()) { | ||
| 329 | at91sam9261_twi_device.name = "i2c-at91sam9g10"; | ||
| 330 | /* I2C PIO must not be configured as open-drain on this chip */ | ||
| 331 | } else { | ||
| 332 | at91sam9261_twi_device.name = "i2c-at91sam9261"; | ||
| 333 | at91_set_multi_drive(AT91_PIN_PA7, 1); | ||
| 334 | at91_set_multi_drive(AT91_PIN_PA8, 1); | ||
| 335 | } | ||
| 336 | |||
| 328 | /* pins used for TWI interface */ | 337 | /* pins used for TWI interface */ |
| 329 | at91_set_A_periph(AT91_PIN_PA7, 0); /* TWD */ | 338 | at91_set_A_periph(AT91_PIN_PA7, 0); /* TWD */ |
| 330 | at91_set_multi_drive(AT91_PIN_PA7, 1); | ||
| 331 | |||
| 332 | at91_set_A_periph(AT91_PIN_PA8, 0); /* TWCK */ | 339 | at91_set_A_periph(AT91_PIN_PA8, 0); /* TWCK */ |
| 333 | at91_set_multi_drive(AT91_PIN_PA8, 1); | ||
| 334 | 340 | ||
| 335 | i2c_register_board_info(0, devices, nr_devices); | 341 | i2c_register_board_info(0, devices, nr_devices); |
| 336 | platform_device_register(&at91sam9261_twi_device); | 342 | platform_device_register(&at91sam9261_twi_device); |
diff --git a/arch/arm/mach-at91/at91sam9263.c b/arch/arm/mach-at91/at91sam9263.c index 144ef5de51b6..6a01d0360dfb 100644 --- a/arch/arm/mach-at91/at91sam9263.c +++ b/arch/arm/mach-at91/at91sam9263.c | |||
| @@ -193,6 +193,7 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 193 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), | 193 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.0", &spi0_clk), |
| 194 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | 194 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), |
| 195 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk), | 195 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb_clk), |
| 196 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9260", &twi_clk), | ||
| 196 | /* fake hclk clock */ | 197 | /* fake hclk clock */ |
| 197 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), | 198 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &ohci_clk), |
| 198 | CLKDEV_CON_ID("pioA", &pioA_clk), | 199 | CLKDEV_CON_ID("pioA", &pioA_clk), |
| @@ -210,6 +211,7 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 210 | CLKDEV_CON_DEV_ID("hclk", "a00000.ohci", &ohci_clk), | 211 | CLKDEV_CON_DEV_ID("hclk", "a00000.ohci", &ohci_clk), |
| 211 | CLKDEV_CON_DEV_ID("spi_clk", "fffa4000.spi", &spi0_clk), | 212 | CLKDEV_CON_DEV_ID("spi_clk", "fffa4000.spi", &spi0_clk), |
| 212 | CLKDEV_CON_DEV_ID("spi_clk", "fffa8000.spi", &spi1_clk), | 213 | CLKDEV_CON_DEV_ID("spi_clk", "fffa8000.spi", &spi1_clk), |
| 214 | CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi_clk), | ||
| 213 | }; | 215 | }; |
| 214 | 216 | ||
| 215 | static struct clk_lookup usart_clocks_lookups[] = { | 217 | static struct clk_lookup usart_clocks_lookups[] = { |
diff --git a/arch/arm/mach-at91/at91sam9263_devices.c b/arch/arm/mach-at91/at91sam9263_devices.c index 7c0898fe20fa..8dde220b42b6 100644 --- a/arch/arm/mach-at91/at91sam9263_devices.c +++ b/arch/arm/mach-at91/at91sam9263_devices.c | |||
| @@ -599,7 +599,7 @@ static struct resource twi_resources[] = { | |||
| 599 | }; | 599 | }; |
| 600 | 600 | ||
| 601 | static struct platform_device at91sam9263_twi_device = { | 601 | static struct platform_device at91sam9263_twi_device = { |
| 602 | .name = "at91_i2c", | 602 | .name = "i2c-at91sam9260", |
| 603 | .id = -1, | 603 | .id = -1, |
| 604 | .resource = twi_resources, | 604 | .resource = twi_resources, |
| 605 | .num_resources = ARRAY_SIZE(twi_resources), | 605 | .num_resources = ARRAY_SIZE(twi_resources), |
diff --git a/arch/arm/mach-at91/at91sam9g45.c b/arch/arm/mach-at91/at91sam9g45.c index ef6cedd52e3c..84af1b506d92 100644 --- a/arch/arm/mach-at91/at91sam9g45.c +++ b/arch/arm/mach-at91/at91sam9g45.c | |||
| @@ -237,6 +237,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 237 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), | 237 | CLKDEV_CON_DEV_ID("spi_clk", "atmel_spi.1", &spi1_clk), |
| 238 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk), | 238 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.0", &tcb0_clk), |
| 239 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tcb0_clk), | 239 | CLKDEV_CON_DEV_ID("t0_clk", "atmel_tcb.1", &tcb0_clk), |
| 240 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9g10.0", &twi0_clk), | ||
| 241 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9g10.1", &twi1_clk), | ||
| 240 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | 242 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), |
| 241 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | 243 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), |
| 242 | CLKDEV_CON_DEV_ID(NULL, "atmel-trng", &trng_clk), | 244 | CLKDEV_CON_DEV_ID(NULL, "atmel-trng", &trng_clk), |
| @@ -254,6 +256,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 254 | CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk), | 256 | CLKDEV_CON_DEV_ID("t0_clk", "fffd4000.timer", &tcb0_clk), |
| 255 | CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk), | 257 | CLKDEV_CON_DEV_ID("hclk", "700000.ohci", &uhphs_clk), |
| 256 | CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk), | 258 | CLKDEV_CON_DEV_ID("ehci_clk", "800000.ehci", &uhphs_clk), |
| 259 | CLKDEV_CON_DEV_ID(NULL, "fff84000.i2c", &twi0_clk), | ||
| 260 | CLKDEV_CON_DEV_ID(NULL, "fff88000.i2c", &twi1_clk), | ||
| 257 | /* fake hclk clock */ | 261 | /* fake hclk clock */ |
| 258 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), | 262 | CLKDEV_CON_DEV_ID("hclk", "at91_ohci", &uhphs_clk), |
| 259 | CLKDEV_CON_ID("pioA", &pioA_clk), | 263 | CLKDEV_CON_ID("pioA", &pioA_clk), |
diff --git a/arch/arm/mach-at91/at91sam9g45_devices.c b/arch/arm/mach-at91/at91sam9g45_devices.c index e4c3b3709204..b1596072dcc2 100644 --- a/arch/arm/mach-at91/at91sam9g45_devices.c +++ b/arch/arm/mach-at91/at91sam9g45_devices.c | |||
| @@ -653,7 +653,7 @@ static struct resource twi0_resources[] = { | |||
| 653 | }; | 653 | }; |
| 654 | 654 | ||
| 655 | static struct platform_device at91sam9g45_twi0_device = { | 655 | static struct platform_device at91sam9g45_twi0_device = { |
| 656 | .name = "at91_i2c", | 656 | .name = "i2c-at91sam9g10", |
| 657 | .id = 0, | 657 | .id = 0, |
| 658 | .resource = twi0_resources, | 658 | .resource = twi0_resources, |
| 659 | .num_resources = ARRAY_SIZE(twi0_resources), | 659 | .num_resources = ARRAY_SIZE(twi0_resources), |
| @@ -673,7 +673,7 @@ static struct resource twi1_resources[] = { | |||
| 673 | }; | 673 | }; |
| 674 | 674 | ||
| 675 | static struct platform_device at91sam9g45_twi1_device = { | 675 | static struct platform_device at91sam9g45_twi1_device = { |
| 676 | .name = "at91_i2c", | 676 | .name = "i2c-at91sam9g10", |
| 677 | .id = 1, | 677 | .id = 1, |
| 678 | .resource = twi1_resources, | 678 | .resource = twi1_resources, |
| 679 | .num_resources = ARRAY_SIZE(twi1_resources), | 679 | .num_resources = ARRAY_SIZE(twi1_resources), |
| @@ -686,18 +686,12 @@ void __init at91_add_device_i2c(short i2c_id, struct i2c_board_info *devices, in | |||
| 686 | /* pins used for TWI interface */ | 686 | /* pins used for TWI interface */ |
| 687 | if (i2c_id == 0) { | 687 | if (i2c_id == 0) { |
| 688 | at91_set_A_periph(AT91_PIN_PA20, 0); /* TWD */ | 688 | at91_set_A_periph(AT91_PIN_PA20, 0); /* TWD */ |
| 689 | at91_set_multi_drive(AT91_PIN_PA20, 1); | ||
| 690 | |||
| 691 | at91_set_A_periph(AT91_PIN_PA21, 0); /* TWCK */ | 689 | at91_set_A_periph(AT91_PIN_PA21, 0); /* TWCK */ |
| 692 | at91_set_multi_drive(AT91_PIN_PA21, 1); | ||
| 693 | 690 | ||
| 694 | platform_device_register(&at91sam9g45_twi0_device); | 691 | platform_device_register(&at91sam9g45_twi0_device); |
| 695 | } else { | 692 | } else { |
| 696 | at91_set_A_periph(AT91_PIN_PB10, 0); /* TWD */ | 693 | at91_set_A_periph(AT91_PIN_PB10, 0); /* TWD */ |
| 697 | at91_set_multi_drive(AT91_PIN_PB10, 1); | ||
| 698 | |||
| 699 | at91_set_A_periph(AT91_PIN_PB11, 0); /* TWCK */ | 694 | at91_set_A_periph(AT91_PIN_PB11, 0); /* TWCK */ |
| 700 | at91_set_multi_drive(AT91_PIN_PB11, 1); | ||
| 701 | 695 | ||
| 702 | platform_device_register(&at91sam9g45_twi1_device); | 696 | platform_device_register(&at91sam9g45_twi1_device); |
| 703 | } | 697 | } |
diff --git a/arch/arm/mach-at91/at91sam9n12.c b/arch/arm/mach-at91/at91sam9n12.c index 08494664ab78..732d3d3f4ec5 100644 --- a/arch/arm/mach-at91/at91sam9n12.c +++ b/arch/arm/mach-at91/at91sam9n12.c | |||
| @@ -169,6 +169,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 169 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb_clk), | 169 | CLKDEV_CON_DEV_ID("t0_clk", "f8008000.timer", &tcb_clk), |
| 170 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb_clk), | 170 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb_clk), |
| 171 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma_clk), | 171 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma_clk), |
| 172 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), | ||
| 173 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), | ||
| 172 | CLKDEV_CON_ID("pioA", &pioAB_clk), | 174 | CLKDEV_CON_ID("pioA", &pioAB_clk), |
| 173 | CLKDEV_CON_ID("pioB", &pioAB_clk), | 175 | CLKDEV_CON_ID("pioB", &pioAB_clk), |
| 174 | CLKDEV_CON_ID("pioC", &pioCD_clk), | 176 | CLKDEV_CON_ID("pioC", &pioCD_clk), |
diff --git a/arch/arm/mach-at91/at91sam9rl.c b/arch/arm/mach-at91/at91sam9rl.c index 72ce50a50de5..72e908412222 100644 --- a/arch/arm/mach-at91/at91sam9rl.c +++ b/arch/arm/mach-at91/at91sam9rl.c | |||
| @@ -186,6 +186,8 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 186 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), | 186 | CLKDEV_CON_DEV_ID("t2_clk", "atmel_tcb.0", &tc2_clk), |
| 187 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), | 187 | CLKDEV_CON_DEV_ID("pclk", "ssc.0", &ssc0_clk), |
| 188 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), | 188 | CLKDEV_CON_DEV_ID("pclk", "ssc.1", &ssc1_clk), |
| 189 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9g20.0", &twi0_clk), | ||
| 190 | CLKDEV_CON_DEV_ID(NULL, "i2c-at91sam9g20.1", &twi1_clk), | ||
| 189 | CLKDEV_CON_ID("pioA", &pioA_clk), | 191 | CLKDEV_CON_ID("pioA", &pioA_clk), |
| 190 | CLKDEV_CON_ID("pioB", &pioB_clk), | 192 | CLKDEV_CON_ID("pioB", &pioB_clk), |
| 191 | CLKDEV_CON_ID("pioC", &pioC_clk), | 193 | CLKDEV_CON_ID("pioC", &pioC_clk), |
diff --git a/arch/arm/mach-at91/at91sam9rl_devices.c b/arch/arm/mach-at91/at91sam9rl_devices.c index deafea0e493d..d6ca0543ce8d 100644 --- a/arch/arm/mach-at91/at91sam9rl_devices.c +++ b/arch/arm/mach-at91/at91sam9rl_devices.c | |||
| @@ -346,7 +346,7 @@ static struct resource twi_resources[] = { | |||
| 346 | }; | 346 | }; |
| 347 | 347 | ||
| 348 | static struct platform_device at91sam9rl_twi_device = { | 348 | static struct platform_device at91sam9rl_twi_device = { |
| 349 | .name = "at91_i2c", | 349 | .name = "i2c-at91sam9g20", |
| 350 | .id = -1, | 350 | .id = -1, |
| 351 | .resource = twi_resources, | 351 | .resource = twi_resources, |
| 352 | .num_resources = ARRAY_SIZE(twi_resources), | 352 | .num_resources = ARRAY_SIZE(twi_resources), |
diff --git a/arch/arm/mach-at91/at91sam9x5.c b/arch/arm/mach-at91/at91sam9x5.c index 477cf9d06672..e5035380dcbc 100644 --- a/arch/arm/mach-at91/at91sam9x5.c +++ b/arch/arm/mach-at91/at91sam9x5.c | |||
| @@ -231,6 +231,9 @@ static struct clk_lookup periph_clocks_lookups[] = { | |||
| 231 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), | 231 | CLKDEV_CON_DEV_ID("t0_clk", "f800c000.timer", &tcb0_clk), |
| 232 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk), | 232 | CLKDEV_CON_DEV_ID("dma_clk", "ffffec00.dma-controller", &dma0_clk), |
| 233 | CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk), | 233 | CLKDEV_CON_DEV_ID("dma_clk", "ffffee00.dma-controller", &dma1_clk), |
| 234 | CLKDEV_CON_DEV_ID(NULL, "f8010000.i2c", &twi0_clk), | ||
| 235 | CLKDEV_CON_DEV_ID(NULL, "f8014000.i2c", &twi1_clk), | ||
| 236 | CLKDEV_CON_DEV_ID(NULL, "f8018000.i2c", &twi2_clk), | ||
| 234 | CLKDEV_CON_ID("pioA", &pioAB_clk), | 237 | CLKDEV_CON_ID("pioA", &pioAB_clk), |
| 235 | CLKDEV_CON_ID("pioB", &pioAB_clk), | 238 | CLKDEV_CON_ID("pioB", &pioAB_clk), |
| 236 | CLKDEV_CON_ID("pioC", &pioCD_clk), | 239 | CLKDEV_CON_ID("pioC", &pioCD_clk), |
diff --git a/arch/arm/mach-at91/include/mach/at91_twi.h b/arch/arm/mach-at91/include/mach/at91_twi.h deleted file mode 100644 index bb2880f6ba37..000000000000 --- a/arch/arm/mach-at91/include/mach/at91_twi.h +++ /dev/null | |||
| @@ -1,68 +0,0 @@ | |||
| 1 | /* | ||
| 2 | * arch/arm/mach-at91/include/mach/at91_twi.h | ||
| 3 | * | ||
| 4 | * Copyright (C) 2005 Ivan Kokshaysky | ||
| 5 | * Copyright (C) SAN People | ||
| 6 | * | ||
| 7 | * Two-wire Interface (TWI) registers. | ||
| 8 | * Based on AT91RM9200 datasheet revision E. | ||
| 9 | * | ||
| 10 | * This program is free software; you can redistribute it and/or modify | ||
| 11 | * it under the terms of the GNU General Public License as published by | ||
| 12 | * the Free Software Foundation; either version 2 of the License, or | ||
| 13 | * (at your option) any later version. | ||
| 14 | */ | ||
| 15 | |||
| 16 | #ifndef AT91_TWI_H | ||
| 17 | #define AT91_TWI_H | ||
| 18 | |||
| 19 | #define AT91_TWI_CR 0x00 /* Control Register */ | ||
| 20 | #define AT91_TWI_START (1 << 0) /* Send a Start Condition */ | ||
| 21 | #define AT91_TWI_STOP (1 << 1) /* Send a Stop Condition */ | ||
| 22 | #define AT91_TWI_MSEN (1 << 2) /* Master Transfer Enable */ | ||
| 23 | #define AT91_TWI_MSDIS (1 << 3) /* Master Transfer Disable */ | ||
| 24 | #define AT91_TWI_SVEN (1 << 4) /* Slave Transfer Enable [SAM9260 only] */ | ||
| 25 | #define AT91_TWI_SVDIS (1 << 5) /* Slave Transfer Disable [SAM9260 only] */ | ||
| 26 | #define AT91_TWI_SWRST (1 << 7) /* Software Reset */ | ||
| 27 | |||
| 28 | #define AT91_TWI_MMR 0x04 /* Master Mode Register */ | ||
| 29 | #define AT91_TWI_IADRSZ (3 << 8) /* Internal Device Address Size */ | ||
| 30 | #define AT91_TWI_IADRSZ_NO (0 << 8) | ||
| 31 | #define AT91_TWI_IADRSZ_1 (1 << 8) | ||
| 32 | #define AT91_TWI_IADRSZ_2 (2 << 8) | ||
| 33 | #define AT91_TWI_IADRSZ_3 (3 << 8) | ||
| 34 | #define AT91_TWI_MREAD (1 << 12) /* Master Read Direction */ | ||
| 35 | #define AT91_TWI_DADR (0x7f << 16) /* Device Address */ | ||
| 36 | |||
| 37 | #define AT91_TWI_SMR 0x08 /* Slave Mode Register [SAM9260 only] */ | ||
| 38 | #define AT91_TWI_SADR (0x7f << 16) /* Slave Address */ | ||
| 39 | |||
| 40 | #define AT91_TWI_IADR 0x0c /* Internal Address Register */ | ||
| 41 | |||
| 42 | #define AT91_TWI_CWGR 0x10 /* Clock Waveform Generator Register */ | ||
| 43 | #define AT91_TWI_CLDIV (0xff << 0) /* Clock Low Divisor */ | ||
| 44 | #define AT91_TWI_CHDIV (0xff << 8) /* Clock High Divisor */ | ||
| 45 | #define AT91_TWI_CKDIV (7 << 16) /* Clock Divider */ | ||
| 46 | |||
| 47 | #define AT91_TWI_SR 0x20 /* Status Register */ | ||
| 48 | #define AT91_TWI_TXCOMP (1 << 0) /* Transmission Complete */ | ||
| 49 | #define AT91_TWI_RXRDY (1 << 1) /* Receive Holding Register Ready */ | ||
| 50 | #define AT91_TWI_TXRDY (1 << 2) /* Transmit Holding Register Ready */ | ||
| 51 | #define AT91_TWI_SVREAD (1 << 3) /* Slave Read [SAM9260 only] */ | ||
| 52 | #define AT91_TWI_SVACC (1 << 4) /* Slave Access [SAM9260 only] */ | ||
| 53 | #define AT91_TWI_GACC (1 << 5) /* General Call Access [SAM9260 only] */ | ||
| 54 | #define AT91_TWI_OVRE (1 << 6) /* Overrun Error [AT91RM9200 only] */ | ||
| 55 | #define AT91_TWI_UNRE (1 << 7) /* Underrun Error [AT91RM9200 only] */ | ||
| 56 | #define AT91_TWI_NACK (1 << 8) /* Not Acknowledged */ | ||
| 57 | #define AT91_TWI_ARBLST (1 << 9) /* Arbitration Lost [SAM9260 only] */ | ||
| 58 | #define AT91_TWI_SCLWS (1 << 10) /* Clock Wait State [SAM9260 only] */ | ||
| 59 | #define AT91_TWI_EOSACC (1 << 11) /* End of Slave Address [SAM9260 only] */ | ||
| 60 | |||
| 61 | #define AT91_TWI_IER 0x24 /* Interrupt Enable Register */ | ||
| 62 | #define AT91_TWI_IDR 0x28 /* Interrupt Disable Register */ | ||
| 63 | #define AT91_TWI_IMR 0x2c /* Interrupt Mask Register */ | ||
| 64 | #define AT91_TWI_RHR 0x30 /* Receive Holding Register */ | ||
| 65 | #define AT91_TWI_THR 0x34 /* Transmit Holding Register */ | ||
| 66 | |||
| 67 | #endif | ||
| 68 | |||
diff --git a/arch/arm/plat-omap/i2c.c b/arch/arm/plat-omap/i2c.c index 6013831a043e..a5683a84c6ee 100644 --- a/arch/arm/plat-omap/i2c.c +++ b/arch/arm/plat-omap/i2c.c | |||
| @@ -26,14 +26,12 @@ | |||
| 26 | #include <linux/kernel.h> | 26 | #include <linux/kernel.h> |
| 27 | #include <linux/platform_device.h> | 27 | #include <linux/platform_device.h> |
| 28 | #include <linux/i2c.h> | 28 | #include <linux/i2c.h> |
| 29 | #include <linux/i2c-omap.h> | ||
| 30 | #include <linux/slab.h> | 29 | #include <linux/slab.h> |
| 31 | #include <linux/err.h> | 30 | #include <linux/err.h> |
| 32 | #include <linux/clk.h> | 31 | #include <linux/clk.h> |
| 33 | 32 | ||
| 34 | #include <mach/irqs.h> | 33 | #include <mach/irqs.h> |
| 35 | #include <plat/i2c.h> | 34 | #include <plat/i2c.h> |
| 36 | #include <plat/omap-pm.h> | ||
| 37 | #include <plat/omap_device.h> | 35 | #include <plat/omap_device.h> |
| 38 | 36 | ||
| 39 | #define OMAP_I2C_SIZE 0x3f | 37 | #define OMAP_I2C_SIZE 0x3f |
| @@ -129,16 +127,6 @@ static inline int omap1_i2c_add_bus(int bus_id) | |||
| 129 | 127 | ||
| 130 | 128 | ||
| 131 | #ifdef CONFIG_ARCH_OMAP2PLUS | 129 | #ifdef CONFIG_ARCH_OMAP2PLUS |
| 132 | /* | ||
| 133 | * XXX This function is a temporary compatibility wrapper - only | ||
| 134 | * needed until the I2C driver can be converted to call | ||
| 135 | * omap_pm_set_max_dev_wakeup_lat() and handle a return code. | ||
| 136 | */ | ||
| 137 | static void omap_pm_set_max_mpu_wakeup_lat_compat(struct device *dev, long t) | ||
| 138 | { | ||
| 139 | omap_pm_set_max_mpu_wakeup_lat(dev, t); | ||
| 140 | } | ||
| 141 | |||
| 142 | static inline int omap2_i2c_add_bus(int bus_id) | 130 | static inline int omap2_i2c_add_bus(int bus_id) |
| 143 | { | 131 | { |
| 144 | int l; | 132 | int l; |
| @@ -170,15 +158,6 @@ static inline int omap2_i2c_add_bus(int bus_id) | |||
| 170 | dev_attr = (struct omap_i2c_dev_attr *)oh->dev_attr; | 158 | dev_attr = (struct omap_i2c_dev_attr *)oh->dev_attr; |
| 171 | pdata->flags = dev_attr->flags; | 159 | pdata->flags = dev_attr->flags; |
| 172 | 160 | ||
| 173 | /* | ||
| 174 | * When waiting for completion of a i2c transfer, we need to | ||
| 175 | * set a wake up latency constraint for the MPU. This is to | ||
| 176 | * ensure quick enough wakeup from idle, when transfer | ||
| 177 | * completes. | ||
| 178 | * Only omap3 has support for constraints | ||
| 179 | */ | ||
| 180 | if (cpu_is_omap34xx()) | ||
| 181 | pdata->set_mpu_wkup_lat = omap_pm_set_max_mpu_wakeup_lat_compat; | ||
| 182 | pdev = omap_device_build(name, bus_id, oh, pdata, | 161 | pdev = omap_device_build(name, bus_id, oh, pdata, |
| 183 | sizeof(struct omap_i2c_bus_platform_data), | 162 | sizeof(struct omap_i2c_bus_platform_data), |
| 184 | NULL, 0, 0); | 163 | NULL, 0, 0); |
diff --git a/drivers/i2c/algos/i2c-algo-pca.c b/drivers/i2c/algos/i2c-algo-pca.c index 6f5f98d69af7..f892a424009b 100644 --- a/drivers/i2c/algos/i2c-algo-pca.c +++ b/drivers/i2c/algos/i2c-algo-pca.c | |||
| @@ -46,14 +46,19 @@ static int i2c_debug; | |||
| 46 | #define pca_set_con(adap, val) pca_outw(adap, I2C_PCA_CON, val) | 46 | #define pca_set_con(adap, val) pca_outw(adap, I2C_PCA_CON, val) |
| 47 | #define pca_get_con(adap) pca_inw(adap, I2C_PCA_CON) | 47 | #define pca_get_con(adap) pca_inw(adap, I2C_PCA_CON) |
| 48 | #define pca_wait(adap) adap->wait_for_completion(adap->data) | 48 | #define pca_wait(adap) adap->wait_for_completion(adap->data) |
| 49 | #define pca_reset(adap) adap->reset_chip(adap->data) | ||
| 50 | 49 | ||
| 51 | static void pca9665_reset(void *pd) | 50 | static void pca_reset(struct i2c_algo_pca_data *adap) |
| 52 | { | 51 | { |
| 53 | struct i2c_algo_pca_data *adap = pd; | 52 | if (adap->chip == I2C_PCA_CHIP_9665) { |
| 54 | pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_IPRESET); | 53 | /* Ignore the reset function from the module, |
| 55 | pca_outw(adap, I2C_PCA_IND, 0xA5); | 54 | * we can use the parallel bus reset. |
| 56 | pca_outw(adap, I2C_PCA_IND, 0x5A); | 55 | */ |
| 56 | pca_outw(adap, I2C_PCA_INDPTR, I2C_PCA_IPRESET); | ||
| 57 | pca_outw(adap, I2C_PCA_IND, 0xA5); | ||
| 58 | pca_outw(adap, I2C_PCA_IND, 0x5A); | ||
| 59 | } else { | ||
| 60 | adap->reset_chip(adap->data); | ||
| 61 | } | ||
| 57 | } | 62 | } |
| 58 | 63 | ||
| 59 | /* | 64 | /* |
| @@ -378,11 +383,12 @@ static unsigned int pca_probe_chip(struct i2c_adapter *adap) | |||
| 378 | pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IADR); | 383 | pca_outw(pca_data, I2C_PCA_INDPTR, I2C_PCA_IADR); |
| 379 | if (pca_inw(pca_data, I2C_PCA_IND) == 0xAA) { | 384 | if (pca_inw(pca_data, I2C_PCA_IND) == 0xAA) { |
| 380 | printk(KERN_INFO "%s: PCA9665 detected.\n", adap->name); | 385 | printk(KERN_INFO "%s: PCA9665 detected.\n", adap->name); |
| 381 | return I2C_PCA_CHIP_9665; | 386 | pca_data->chip = I2C_PCA_CHIP_9665; |
| 382 | } else { | 387 | } else { |
| 383 | printk(KERN_INFO "%s: PCA9564 detected.\n", adap->name); | 388 | printk(KERN_INFO "%s: PCA9564 detected.\n", adap->name); |
| 384 | return I2C_PCA_CHIP_9564; | 389 | pca_data->chip = I2C_PCA_CHIP_9564; |
| 385 | } | 390 | } |
| 391 | return pca_data->chip; | ||
| 386 | } | 392 | } |
| 387 | 393 | ||
| 388 | static int pca_init(struct i2c_adapter *adap) | 394 | static int pca_init(struct i2c_adapter *adap) |
| @@ -456,11 +462,6 @@ static int pca_init(struct i2c_adapter *adap) | |||
| 456 | */ | 462 | */ |
| 457 | int raise_fall_time; | 463 | int raise_fall_time; |
| 458 | 464 | ||
| 459 | /* Ignore the reset function from the module, | ||
| 460 | * we can use the parallel bus reset | ||
| 461 | */ | ||
| 462 | pca_data->reset_chip = pca9665_reset; | ||
| 463 | |||
| 464 | if (pca_data->i2c_clock > 1265800) { | 465 | if (pca_data->i2c_clock > 1265800) { |
| 465 | printk(KERN_WARNING "%s: I2C clock speed too high." | 466 | printk(KERN_WARNING "%s: I2C clock speed too high." |
| 466 | " Using 1265.8kHz.\n", adap->name); | 467 | " Using 1265.8kHz.\n", adap->name); |
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index ff01c389e2da..65dd599a0262 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -294,18 +294,21 @@ comment "I2C system bus drivers (mostly embedded / system-on-chip)" | |||
| 294 | 294 | ||
| 295 | config I2C_AT91 | 295 | config I2C_AT91 |
| 296 | tristate "Atmel AT91 I2C Two-Wire interface (TWI)" | 296 | tristate "Atmel AT91 I2C Two-Wire interface (TWI)" |
| 297 | depends on ARCH_AT91 && EXPERIMENTAL && BROKEN | 297 | depends on ARCH_AT91 && EXPERIMENTAL |
| 298 | help | 298 | help |
| 299 | This supports the use of the I2C interface on Atmel AT91 | 299 | This supports the use of the I2C interface on Atmel AT91 |
| 300 | processors. | 300 | processors. |
| 301 | 301 | ||
| 302 | This driver is BROKEN because the controller which it uses | 302 | A serious problem is that there is no documented way to issue |
| 303 | will easily trigger RX overrun and TX underrun errors. Using | 303 | repeated START conditions for more than two messages, as needed |
| 304 | low I2C clock rates may partially work around those issues | ||
| 305 | on some systems. Another serious problem is that there is no | ||
| 306 | documented way to issue repeated START conditions, as needed | ||
| 307 | to support combined I2C messages. Use the i2c-gpio driver | 304 | to support combined I2C messages. Use the i2c-gpio driver |
| 308 | unless your system can cope with those limitations. | 305 | unless your system can cope with this limitation. |
| 306 | |||
| 307 | Caution! at91rm9200, at91sam9261, at91sam9260, at91sam9263 devices | ||
| 308 | don't have clock stretching in transmission mode. For that reason, | ||
| 309 | you can encounter underrun issues causing premature stop sendings if | ||
| 310 | the latency to fill the transmission register is too long. If you | ||
| 311 | are facing this situation, use the i2c-gpio driver. | ||
| 309 | 312 | ||
| 310 | config I2C_AU1550 | 313 | config I2C_AU1550 |
| 311 | tristate "Au1550/Au1200/Au1300 SMBus interface" | 314 | tristate "Au1550/Au1200/Au1300 SMBus interface" |
| @@ -718,6 +721,16 @@ config I2C_XLR | |||
| 718 | This driver can also be built as a module. If so, the module | 721 | This driver can also be built as a module. If so, the module |
| 719 | will be called i2c-xlr. | 722 | will be called i2c-xlr. |
| 720 | 723 | ||
| 724 | config I2C_RCAR | ||
| 725 | tristate "Renesas R-Car I2C Controller" | ||
| 726 | depends on ARCH_SHMOBILE && I2C | ||
| 727 | help | ||
| 728 | If you say yes to this option, support will be included for the | ||
| 729 | R-Car I2C controller. | ||
| 730 | |||
| 731 | This driver can also be built as a module. If so, the module | ||
| 732 | will be called i2c-rcar. | ||
| 733 | |||
| 721 | comment "External I2C/SMBus adapter drivers" | 734 | comment "External I2C/SMBus adapter drivers" |
| 722 | 735 | ||
| 723 | config I2C_DIOLAN_U2C | 736 | config I2C_DIOLAN_U2C |
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile index 37c4182cc98b..2d33d62952c1 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile | |||
| @@ -71,6 +71,7 @@ obj-$(CONFIG_I2C_VERSATILE) += i2c-versatile.o | |||
| 71 | obj-$(CONFIG_I2C_OCTEON) += i2c-octeon.o | 71 | obj-$(CONFIG_I2C_OCTEON) += i2c-octeon.o |
| 72 | obj-$(CONFIG_I2C_XILINX) += i2c-xiic.o | 72 | obj-$(CONFIG_I2C_XILINX) += i2c-xiic.o |
| 73 | obj-$(CONFIG_I2C_XLR) += i2c-xlr.o | 73 | obj-$(CONFIG_I2C_XLR) += i2c-xlr.o |
| 74 | obj-$(CONFIG_I2C_RCAR) += i2c-rcar.o | ||
| 74 | 75 | ||
| 75 | # External I2C/SMBus adapter drivers | 76 | # External I2C/SMBus adapter drivers |
| 76 | obj-$(CONFIG_I2C_DIOLAN_U2C) += i2c-diolan-u2c.o | 77 | obj-$(CONFIG_I2C_DIOLAN_U2C) += i2c-diolan-u2c.o |
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c index e24484beef07..aa59a254be2c 100644 --- a/drivers/i2c/busses/i2c-at91.c +++ b/drivers/i2c/busses/i2c-at91.c | |||
| @@ -1,315 +1,554 @@ | |||
| 1 | /* | 1 | /* |
| 2 | i2c Support for Atmel's AT91 Two-Wire Interface (TWI) | 2 | * i2c Support for Atmel's AT91 Two-Wire Interface (TWI) |
| 3 | 3 | * | |
| 4 | Copyright (C) 2004 Rick Bronson | 4 | * Copyright (C) 2011 Weinmann Medical GmbH |
| 5 | Converted to 2.6 by Andrew Victor <andrew@sanpeople.com> | 5 | * Author: Nikolaus Voss <n.voss@weinmann.de> |
| 6 | 6 | * | |
| 7 | Borrowed heavily from original work by: | 7 | * Evolved from original work by: |
| 8 | Copyright (C) 2000 Philip Edelbrock <phil@stimpy.netroedge.com> | 8 | * Copyright (C) 2004 Rick Bronson |
| 9 | 9 | * Converted to 2.6 by Andrew Victor <andrew@sanpeople.com> | |
| 10 | This program is free software; you can redistribute it and/or modify | 10 | * |
| 11 | it under the terms of the GNU General Public License as published by | 11 | * Borrowed heavily from original work by: |
| 12 | the Free Software Foundation; either version 2 of the License, or | 12 | * Copyright (C) 2000 Philip Edelbrock <phil@stimpy.netroedge.com> |
| 13 | (at your option) any later version. | 13 | * |
| 14 | */ | 14 | * This program is free software; you can redistribute it and/or modify |
| 15 | * it under the terms of the GNU General Public License as published by | ||
| 16 | * the Free Software Foundation; either version 2 of the License, or | ||
| 17 | * (at your option) any later version. | ||
| 18 | */ | ||
| 15 | 19 | ||
| 16 | #include <linux/module.h> | 20 | #include <linux/clk.h> |
| 17 | #include <linux/kernel.h> | 21 | #include <linux/completion.h> |
| 18 | #include <linux/err.h> | 22 | #include <linux/err.h> |
| 19 | #include <linux/slab.h> | ||
| 20 | #include <linux/types.h> | ||
| 21 | #include <linux/delay.h> | ||
| 22 | #include <linux/i2c.h> | 23 | #include <linux/i2c.h> |
| 23 | #include <linux/init.h> | 24 | #include <linux/interrupt.h> |
| 24 | #include <linux/clk.h> | ||
| 25 | #include <linux/platform_device.h> | ||
| 26 | #include <linux/io.h> | 25 | #include <linux/io.h> |
| 26 | #include <linux/module.h> | ||
| 27 | #include <linux/of.h> | ||
| 28 | #include <linux/of_device.h> | ||
| 29 | #include <linux/of_i2c.h> | ||
| 30 | #include <linux/platform_device.h> | ||
| 31 | #include <linux/slab.h> | ||
| 32 | |||
| 33 | #define TWI_CLK_HZ 100000 /* max 400 Kbits/s */ | ||
| 34 | #define AT91_I2C_TIMEOUT msecs_to_jiffies(100) /* transfer timeout */ | ||
| 35 | |||
| 36 | /* AT91 TWI register definitions */ | ||
| 37 | #define AT91_TWI_CR 0x0000 /* Control Register */ | ||
| 38 | #define AT91_TWI_START 0x0001 /* Send a Start Condition */ | ||
| 39 | #define AT91_TWI_STOP 0x0002 /* Send a Stop Condition */ | ||
| 40 | #define AT91_TWI_MSEN 0x0004 /* Master Transfer Enable */ | ||
| 41 | #define AT91_TWI_SVDIS 0x0020 /* Slave Transfer Disable */ | ||
| 42 | #define AT91_TWI_SWRST 0x0080 /* Software Reset */ | ||
| 43 | |||
| 44 | #define AT91_TWI_MMR 0x0004 /* Master Mode Register */ | ||
| 45 | #define AT91_TWI_IADRSZ_1 0x0100 /* Internal Device Address Size */ | ||
| 46 | #define AT91_TWI_MREAD 0x1000 /* Master Read Direction */ | ||
| 47 | |||
| 48 | #define AT91_TWI_IADR 0x000c /* Internal Address Register */ | ||
| 49 | |||
| 50 | #define AT91_TWI_CWGR 0x0010 /* Clock Waveform Generator Reg */ | ||
| 51 | |||
| 52 | #define AT91_TWI_SR 0x0020 /* Status Register */ | ||
| 53 | #define AT91_TWI_TXCOMP 0x0001 /* Transmission Complete */ | ||
| 54 | #define AT91_TWI_RXRDY 0x0002 /* Receive Holding Register Ready */ | ||
| 55 | #define AT91_TWI_TXRDY 0x0004 /* Transmit Holding Register Ready */ | ||
| 27 | 56 | ||
| 28 | #include <mach/at91_twi.h> | 57 | #define AT91_TWI_OVRE 0x0040 /* Overrun Error */ |
| 29 | #include <mach/board.h> | 58 | #define AT91_TWI_UNRE 0x0080 /* Underrun Error */ |
| 30 | #include <mach/cpu.h> | 59 | #define AT91_TWI_NACK 0x0100 /* Not Acknowledged */ |
| 31 | 60 | ||
| 32 | #define TWI_CLOCK 100000 /* Hz. max 400 Kbits/sec */ | 61 | #define AT91_TWI_IER 0x0024 /* Interrupt Enable Register */ |
| 62 | #define AT91_TWI_IDR 0x0028 /* Interrupt Disable Register */ | ||
| 63 | #define AT91_TWI_IMR 0x002c /* Interrupt Mask Register */ | ||
| 64 | #define AT91_TWI_RHR 0x0030 /* Receive Holding Register */ | ||
| 65 | #define AT91_TWI_THR 0x0034 /* Transmit Holding Register */ | ||
| 33 | 66 | ||
| 67 | struct at91_twi_pdata { | ||
| 68 | unsigned clk_max_div; | ||
| 69 | unsigned clk_offset; | ||
| 70 | bool has_unre_flag; | ||
| 71 | }; | ||
| 72 | |||
| 73 | struct at91_twi_dev { | ||
| 74 | struct device *dev; | ||
| 75 | void __iomem *base; | ||
| 76 | struct completion cmd_complete; | ||
| 77 | struct clk *clk; | ||
| 78 | u8 *buf; | ||
| 79 | size_t buf_len; | ||
| 80 | struct i2c_msg *msg; | ||
| 81 | int irq; | ||
| 82 | unsigned transfer_status; | ||
| 83 | struct i2c_adapter adapter; | ||
| 84 | unsigned twi_cwgr_reg; | ||
| 85 | struct at91_twi_pdata *pdata; | ||
| 86 | }; | ||
| 34 | 87 | ||
| 35 | static struct clk *twi_clk; | 88 | static unsigned at91_twi_read(struct at91_twi_dev *dev, unsigned reg) |
| 36 | static void __iomem *twi_base; | 89 | { |
| 90 | return readl_relaxed(dev->base + reg); | ||
| 91 | } | ||
| 92 | |||
| 93 | static void at91_twi_write(struct at91_twi_dev *dev, unsigned reg, unsigned val) | ||
| 94 | { | ||
| 95 | writel_relaxed(val, dev->base + reg); | ||
| 96 | } | ||
| 37 | 97 | ||
| 38 | #define at91_twi_read(reg) __raw_readl(twi_base + (reg)) | 98 | static void at91_disable_twi_interrupts(struct at91_twi_dev *dev) |
| 39 | #define at91_twi_write(reg, val) __raw_writel((val), twi_base + (reg)) | 99 | { |
| 100 | at91_twi_write(dev, AT91_TWI_IDR, | ||
| 101 | AT91_TWI_TXCOMP | AT91_TWI_RXRDY | AT91_TWI_TXRDY); | ||
| 102 | } | ||
| 40 | 103 | ||
| 104 | static void at91_init_twi_bus(struct at91_twi_dev *dev) | ||
| 105 | { | ||
| 106 | at91_disable_twi_interrupts(dev); | ||
| 107 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SWRST); | ||
| 108 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_MSEN); | ||
| 109 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_SVDIS); | ||
| 110 | at91_twi_write(dev, AT91_TWI_CWGR, dev->twi_cwgr_reg); | ||
| 111 | } | ||
| 41 | 112 | ||
| 42 | /* | 113 | /* |
| 43 | * Initialize the TWI hardware registers. | 114 | * Calculate symmetric clock as stated in datasheet: |
| 115 | * twi_clk = F_MAIN / (2 * (cdiv * (1 << ckdiv) + offset)) | ||
| 44 | */ | 116 | */ |
| 45 | static void __devinit at91_twi_hwinit(void) | 117 | static void __devinit at91_calc_twi_clock(struct at91_twi_dev *dev, int twi_clk) |
| 46 | { | 118 | { |
| 47 | unsigned long cdiv, ckdiv; | 119 | int ckdiv, cdiv, div; |
| 48 | 120 | struct at91_twi_pdata *pdata = dev->pdata; | |
| 49 | at91_twi_write(AT91_TWI_IDR, 0xffffffff); /* Disable all interrupts */ | 121 | int offset = pdata->clk_offset; |
| 50 | at91_twi_write(AT91_TWI_CR, AT91_TWI_SWRST); /* Reset peripheral */ | 122 | int max_ckdiv = pdata->clk_max_div; |
| 51 | at91_twi_write(AT91_TWI_CR, AT91_TWI_MSEN); /* Set Master mode */ | 123 | |
| 52 | 124 | div = max(0, (int)DIV_ROUND_UP(clk_get_rate(dev->clk), | |
| 53 | /* Calcuate clock dividers */ | 125 | 2 * twi_clk) - offset); |
| 54 | cdiv = (clk_get_rate(twi_clk) / (2 * TWI_CLOCK)) - 3; | 126 | ckdiv = fls(div >> 8); |
| 55 | cdiv = cdiv + 1; /* round up */ | 127 | cdiv = div >> ckdiv; |
| 56 | ckdiv = 0; | 128 | |
| 57 | while (cdiv > 255) { | 129 | if (ckdiv > max_ckdiv) { |
| 58 | ckdiv++; | 130 | dev_warn(dev->dev, "%d exceeds ckdiv max value which is %d.\n", |
| 59 | cdiv = cdiv >> 1; | 131 | ckdiv, max_ckdiv); |
| 132 | ckdiv = max_ckdiv; | ||
| 133 | cdiv = 255; | ||
| 60 | } | 134 | } |
| 61 | 135 | ||
| 62 | if (cpu_is_at91rm9200()) { /* AT91RM9200 Errata #22 */ | 136 | dev->twi_cwgr_reg = (ckdiv << 16) | (cdiv << 8) | cdiv; |
| 63 | if (ckdiv > 5) { | 137 | dev_dbg(dev->dev, "cdiv %d ckdiv %d\n", cdiv, ckdiv); |
| 64 | printk(KERN_ERR "AT91 I2C: Invalid TWI_CLOCK value!\n"); | 138 | } |
| 65 | ckdiv = 5; | ||
| 66 | } | ||
| 67 | } | ||
| 68 | 139 | ||
| 69 | at91_twi_write(AT91_TWI_CWGR, (ckdiv << 16) | (cdiv << 8) | cdiv); | 140 | static void at91_twi_write_next_byte(struct at91_twi_dev *dev) |
| 141 | { | ||
| 142 | if (dev->buf_len <= 0) | ||
| 143 | return; | ||
| 144 | |||
| 145 | at91_twi_write(dev, AT91_TWI_THR, *dev->buf); | ||
| 146 | |||
| 147 | /* send stop when last byte has been written */ | ||
| 148 | if (--dev->buf_len == 0) | ||
| 149 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); | ||
| 150 | |||
| 151 | dev_dbg(dev->dev, "wrote 0x%x, to go %d\n", *dev->buf, dev->buf_len); | ||
| 152 | |||
| 153 | ++dev->buf; | ||
| 70 | } | 154 | } |
| 71 | 155 | ||
| 72 | /* | 156 | static void at91_twi_read_next_byte(struct at91_twi_dev *dev) |
| 73 | * Poll the i2c status register until the specified bit is set. | ||
| 74 | * Returns 0 if timed out (100 msec). | ||
| 75 | */ | ||
| 76 | static short at91_poll_status(unsigned long bit) | ||
| 77 | { | 157 | { |
| 78 | int loop_cntr = 10000; | 158 | if (dev->buf_len <= 0) |
| 159 | return; | ||
| 160 | |||
| 161 | *dev->buf = at91_twi_read(dev, AT91_TWI_RHR) & 0xff; | ||
| 162 | --dev->buf_len; | ||
| 163 | |||
| 164 | /* handle I2C_SMBUS_BLOCK_DATA */ | ||
| 165 | if (unlikely(dev->msg->flags & I2C_M_RECV_LEN)) { | ||
| 166 | dev->msg->flags &= ~I2C_M_RECV_LEN; | ||
| 167 | dev->buf_len += *dev->buf; | ||
| 168 | dev->msg->len = dev->buf_len + 1; | ||
| 169 | dev_dbg(dev->dev, "received block length %d\n", dev->buf_len); | ||
| 170 | } | ||
| 171 | |||
| 172 | /* send stop if second but last byte has been read */ | ||
| 173 | if (dev->buf_len == 1) | ||
| 174 | at91_twi_write(dev, AT91_TWI_CR, AT91_TWI_STOP); | ||
| 79 | 175 | ||
| 80 | do { | 176 | dev_dbg(dev->dev, "read 0x%x, to go %d\n", *dev->buf, dev->buf_len); |
| 81 | udelay(10); | ||
| 82 | } while (!(at91_twi_read(AT91_TWI_SR) & bit) && (--loop_cntr > 0)); | ||
| 83 | 177 | ||
| 84 | return (loop_cntr > 0); | 178 | ++dev->buf; |
| 85 | } | 179 | } |
| 86 | 180 | ||
| 87 | static int xfer_read(struct i2c_adapter *adap, unsigned char *buf, int length) | 181 | static irqreturn_t atmel_twi_interrupt(int irq, void *dev_id) |
| 88 | { | 182 | { |
| 89 | /* Send Start */ | 183 | struct at91_twi_dev *dev = dev_id; |
| 90 | at91_twi_write(AT91_TWI_CR, AT91_TWI_START); | 184 | const unsigned status = at91_twi_read(dev, AT91_TWI_SR); |
| 91 | 185 | const unsigned irqstatus = status & at91_twi_read(dev, AT91_TWI_IMR); | |
| 92 | /* Read data */ | 186 | |
| 93 | while (length--) { | 187 | if (!irqstatus) |
| 94 | if (!length) /* need to send Stop before reading last byte */ | 188 | return IRQ_NONE; |
| 95 | at91_twi_write(AT91_TWI_CR, AT91_TWI_STOP); | 189 | else if (irqstatus & AT91_TWI_RXRDY) |
| 96 | if (!at91_poll_status(AT91_TWI_RXRDY)) { | 190 | at91_twi_read_next_byte(dev); |
| 97 | dev_dbg(&adap->dev, "RXRDY timeout\n"); | 191 | else if (irqstatus & AT91_TWI_TXRDY) |
| 98 | return -ETIMEDOUT; | 192 | at91_twi_write_next_byte(dev); |
| 99 | } | 193 | |
| 100 | *buf++ = (at91_twi_read(AT91_TWI_RHR) & 0xff); | 194 | /* catch error flags */ |
| 195 | dev->transfer_status |= status; | ||
| 196 | |||
| 197 | if (irqstatus & AT91_TWI_TXCOMP) { | ||
| 198 | at91_disable_twi_interrupts(dev); | ||
| 199 | complete(&dev->cmd_complete); | ||
| 101 | } | 200 | } |
| 102 | 201 | ||
| 103 | return 0; | 202 | return IRQ_HANDLED; |
| 104 | } | 203 | } |
| 105 | 204 | ||
| 106 | static int xfer_write(struct i2c_adapter *adap, unsigned char *buf, int length) | 205 | static int at91_do_twi_transfer(struct at91_twi_dev *dev) |
| 107 | { | 206 | { |
| 108 | /* Load first byte into transmitter */ | 207 | int ret; |
| 109 | at91_twi_write(AT91_TWI_THR, *buf++); | 208 | bool has_unre_flag = dev->pdata->has_unre_flag; |
| 110 | 209 | ||
| 111 | /* Send Start */ | 210 | dev_dbg(dev->dev, "transfer: %s %d bytes.\n", |
| 112 | at91_twi_write(AT91_TWI_CR, AT91_TWI_START); | 211 | (dev->msg->flags & I2C_M_RD) ? "read" : "write", dev->buf_len); |
| 113 | 212 | ||
| 114 | do { | 213 | INIT_COMPLETION(dev->cmd_complete); |
| 115 | if (!at91_poll_status(AT91_TWI_TXRDY)) { | 214 | dev->transfer_status = 0; |
| 116 | dev_dbg(&adap->dev, "TXRDY timeout\n"); | 215 | if (dev->msg->flags & I2C_M_RD) { |
| 117 | return -ETIMEDOUT; | 216 | unsigned start_flags = AT91_TWI_START; |
| 118 | } | ||
| 119 | 217 | ||
| 120 | length--; /* byte was transmitted */ | 218 | if (at91_twi_read(dev, AT91_TWI_SR) & AT91_TWI_RXRDY) { |
| 219 | dev_err(dev->dev, "RXRDY still set!"); | ||
| 220 | at91_twi_read(dev, AT91_TWI_RHR); | ||
| 221 | } | ||
| 121 | 222 | ||
| 122 | if (length > 0) /* more data to send? */ | 223 | /* if only one byte is to be read, immediately stop transfer */ |
| 123 | at91_twi_write(AT91_TWI_THR, *buf++); | 224 | if (dev->buf_len <= 1 && !(dev->msg->flags & I2C_M_RECV_LEN)) |
| 124 | } while (length); | 225 | start_flags |= AT91_TWI_STOP; |
| 226 | at91_twi_write(dev, AT91_TWI_CR, start_flags); | ||
| 227 | at91_twi_write(dev, AT91_TWI_IER, | ||
| 228 | AT91_TWI_TXCOMP | AT91_TWI_RXRDY); | ||
| 229 | } else { | ||
| 230 | at91_twi_write_next_byte(dev); | ||
| 231 | at91_twi_write(dev, AT91_TWI_IER, | ||
| 232 | AT91_TWI_TXCOMP | AT91_TWI_TXRDY); | ||
| 233 | } | ||
| 125 | 234 | ||
| 126 | /* Send Stop */ | 235 | ret = wait_for_completion_interruptible_timeout(&dev->cmd_complete, |
| 127 | at91_twi_write(AT91_TWI_CR, AT91_TWI_STOP); | 236 | dev->adapter.timeout); |
| 237 | if (ret == 0) { | ||
| 238 | dev_err(dev->dev, "controller timed out\n"); | ||
| 239 | at91_init_twi_bus(dev); | ||
| 240 | return -ETIMEDOUT; | ||
| 241 | } | ||
| 242 | if (dev->transfer_status & AT91_TWI_NACK) { | ||
| 243 | dev_dbg(dev->dev, "received nack\n"); | ||
| 244 | return -EREMOTEIO; | ||
| 245 | } | ||
| 246 | if (dev->transfer_status & AT91_TWI_OVRE) { | ||
| 247 | dev_err(dev->dev, "overrun while reading\n"); | ||
| 248 | return -EIO; | ||
| 249 | } | ||
| 250 | if (has_unre_flag && dev->transfer_status & AT91_TWI_UNRE) { | ||
| 251 | dev_err(dev->dev, "underrun while writing\n"); | ||
| 252 | return -EIO; | ||
| 253 | } | ||
| 254 | dev_dbg(dev->dev, "transfer complete\n"); | ||
| 128 | 255 | ||
| 129 | return 0; | 256 | return 0; |
| 130 | } | 257 | } |
| 131 | 258 | ||
| 132 | /* | 259 | static int at91_twi_xfer(struct i2c_adapter *adap, struct i2c_msg *msg, int num) |
| 133 | * Generic i2c master transfer entrypoint. | ||
| 134 | * | ||
| 135 | * Note: We do not use Atmel's feature of storing the "internal device address". | ||
| 136 | * Instead the "internal device address" has to be written using a separate | ||
| 137 | * i2c message. | ||
| 138 | * http://lists.arm.linux.org.uk/pipermail/linux-arm-kernel/2004-September/024411.html | ||
| 139 | */ | ||
| 140 | static int at91_xfer(struct i2c_adapter *adap, struct i2c_msg *pmsg, int num) | ||
| 141 | { | 260 | { |
| 142 | int i, ret; | 261 | struct at91_twi_dev *dev = i2c_get_adapdata(adap); |
| 262 | int ret; | ||
| 263 | unsigned int_addr_flag = 0; | ||
| 264 | struct i2c_msg *m_start = msg; | ||
| 143 | 265 | ||
| 144 | dev_dbg(&adap->dev, "at91_xfer: processing %d messages:\n", num); | 266 | dev_dbg(&adap->dev, "at91_xfer: processing %d messages:\n", num); |
| 145 | 267 | ||
| 146 | for (i = 0; i < num; i++) { | 268 | /* |
| 147 | dev_dbg(&adap->dev, " #%d: %sing %d byte%s %s 0x%02x\n", i, | 269 | * The hardware can handle at most two messages concatenated by a |
| 148 | pmsg->flags & I2C_M_RD ? "read" : "writ", | 270 | * repeated start via it's internal address feature. |
| 149 | pmsg->len, pmsg->len > 1 ? "s" : "", | 271 | */ |
| 150 | pmsg->flags & I2C_M_RD ? "from" : "to", pmsg->addr); | 272 | if (num > 2) { |
| 151 | 273 | dev_err(dev->dev, | |
| 152 | at91_twi_write(AT91_TWI_MMR, (pmsg->addr << 16) | 274 | "cannot handle more than two concatenated messages.\n"); |
| 153 | | ((pmsg->flags & I2C_M_RD) ? AT91_TWI_MREAD : 0)); | 275 | return 0; |
| 154 | 276 | } else if (num == 2) { | |
| 155 | if (pmsg->len && pmsg->buf) { /* sanity check */ | 277 | int internal_address = 0; |
| 156 | if (pmsg->flags & I2C_M_RD) | 278 | int i; |
| 157 | ret = xfer_read(adap, pmsg->buf, pmsg->len); | 279 | |
| 158 | else | 280 | if (msg->flags & I2C_M_RD) { |
| 159 | ret = xfer_write(adap, pmsg->buf, pmsg->len); | 281 | dev_err(dev->dev, "first transfer must be write.\n"); |
| 160 | 282 | return -EINVAL; | |
| 161 | if (ret) | ||
| 162 | return ret; | ||
| 163 | |||
| 164 | /* Wait until transfer is finished */ | ||
| 165 | if (!at91_poll_status(AT91_TWI_TXCOMP)) { | ||
| 166 | dev_dbg(&adap->dev, "TXCOMP timeout\n"); | ||
| 167 | return -ETIMEDOUT; | ||
| 168 | } | ||
| 169 | } | 283 | } |
| 170 | dev_dbg(&adap->dev, "transfer complete\n"); | 284 | if (msg->len > 3) { |
| 171 | pmsg++; /* next message */ | 285 | dev_err(dev->dev, "first message size must be <= 3.\n"); |
| 286 | return -EINVAL; | ||
| 287 | } | ||
| 288 | |||
| 289 | /* 1st msg is put into the internal address, start with 2nd */ | ||
| 290 | m_start = &msg[1]; | ||
| 291 | for (i = 0; i < msg->len; ++i) { | ||
| 292 | const unsigned addr = msg->buf[msg->len - 1 - i]; | ||
| 293 | |||
| 294 | internal_address |= addr << (8 * i); | ||
| 295 | int_addr_flag += AT91_TWI_IADRSZ_1; | ||
| 296 | } | ||
| 297 | at91_twi_write(dev, AT91_TWI_IADR, internal_address); | ||
| 172 | } | 298 | } |
| 173 | return i; | 299 | |
| 300 | at91_twi_write(dev, AT91_TWI_MMR, (m_start->addr << 16) | int_addr_flag | ||
| 301 | | ((m_start->flags & I2C_M_RD) ? AT91_TWI_MREAD : 0)); | ||
| 302 | |||
| 303 | dev->buf_len = m_start->len; | ||
| 304 | dev->buf = m_start->buf; | ||
| 305 | dev->msg = m_start; | ||
| 306 | |||
| 307 | ret = at91_do_twi_transfer(dev); | ||
| 308 | |||
| 309 | return (ret < 0) ? ret : num; | ||
| 174 | } | 310 | } |
| 175 | 311 | ||
| 176 | /* | 312 | static u32 at91_twi_func(struct i2c_adapter *adapter) |
| 177 | * Return list of supported functionality. | ||
| 178 | */ | ||
| 179 | static u32 at91_func(struct i2c_adapter *adapter) | ||
| 180 | { | 313 | { |
| 181 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | 314 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
| 315 | | I2C_FUNC_SMBUS_READ_BLOCK_DATA; | ||
| 182 | } | 316 | } |
| 183 | 317 | ||
| 184 | static struct i2c_algorithm at91_algorithm = { | 318 | static struct i2c_algorithm at91_twi_algorithm = { |
| 185 | .master_xfer = at91_xfer, | 319 | .master_xfer = at91_twi_xfer, |
| 186 | .functionality = at91_func, | 320 | .functionality = at91_twi_func, |
| 187 | }; | 321 | }; |
| 188 | 322 | ||
| 189 | /* | 323 | static struct at91_twi_pdata at91rm9200_config = { |
| 190 | * Main initialization routine. | 324 | .clk_max_div = 5, |
| 191 | */ | 325 | .clk_offset = 3, |
| 192 | static int __devinit at91_i2c_probe(struct platform_device *pdev) | 326 | .has_unre_flag = true, |
| 193 | { | 327 | }; |
| 194 | struct i2c_adapter *adapter; | ||
| 195 | struct resource *res; | ||
| 196 | int rc; | ||
| 197 | 328 | ||
| 198 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 329 | static struct at91_twi_pdata at91sam9261_config = { |
| 199 | if (!res) | 330 | .clk_max_div = 5, |
| 200 | return -ENXIO; | 331 | .clk_offset = 4, |
| 332 | .has_unre_flag = false, | ||
| 333 | }; | ||
| 201 | 334 | ||
| 202 | if (!request_mem_region(res->start, resource_size(res), "at91_i2c")) | 335 | static struct at91_twi_pdata at91sam9260_config = { |
| 203 | return -EBUSY; | 336 | .clk_max_div = 7, |
| 337 | .clk_offset = 4, | ||
| 338 | .has_unre_flag = false, | ||
| 339 | }; | ||
| 340 | |||
| 341 | static struct at91_twi_pdata at91sam9g20_config = { | ||
| 342 | .clk_max_div = 7, | ||
| 343 | .clk_offset = 4, | ||
| 344 | .has_unre_flag = false, | ||
| 345 | }; | ||
| 346 | |||
| 347 | static struct at91_twi_pdata at91sam9g10_config = { | ||
| 348 | .clk_max_div = 7, | ||
| 349 | .clk_offset = 4, | ||
| 350 | .has_unre_flag = false, | ||
| 351 | }; | ||
| 204 | 352 | ||
| 205 | twi_base = ioremap(res->start, resource_size(res)); | 353 | static struct at91_twi_pdata at91sam9x5_config = { |
| 206 | if (!twi_base) { | 354 | .clk_max_div = 7, |
| 207 | rc = -ENOMEM; | 355 | .clk_offset = 4, |
| 208 | goto fail0; | 356 | .has_unre_flag = false, |
| 357 | }; | ||
| 358 | |||
| 359 | static const struct platform_device_id at91_twi_devtypes[] = { | ||
| 360 | { | ||
| 361 | .name = "i2c-at91rm9200", | ||
| 362 | .driver_data = (unsigned long) &at91rm9200_config, | ||
| 363 | }, { | ||
| 364 | .name = "i2c-at91sam9261", | ||
| 365 | .driver_data = (unsigned long) &at91sam9261_config, | ||
| 366 | }, { | ||
| 367 | .name = "i2c-at91sam9260", | ||
| 368 | .driver_data = (unsigned long) &at91sam9260_config, | ||
| 369 | }, { | ||
| 370 | .name = "i2c-at91sam9g20", | ||
| 371 | .driver_data = (unsigned long) &at91sam9g20_config, | ||
| 372 | }, { | ||
| 373 | .name = "i2c-at91sam9g10", | ||
| 374 | .driver_data = (unsigned long) &at91sam9g10_config, | ||
| 375 | }, { | ||
| 376 | /* sentinel */ | ||
| 209 | } | 377 | } |
| 378 | }; | ||
| 210 | 379 | ||
| 211 | twi_clk = clk_get(NULL, "twi_clk"); | 380 | #if defined(CONFIG_OF) |
| 212 | if (IS_ERR(twi_clk)) { | 381 | static const struct of_device_id atmel_twi_dt_ids[] = { |
| 213 | dev_err(&pdev->dev, "no clock defined\n"); | 382 | { |
| 214 | rc = -ENODEV; | 383 | .compatible = "atmel,at91sam9260-i2c", |
| 215 | goto fail1; | 384 | .data = &at91sam9260_config, |
| 385 | } , { | ||
| 386 | .compatible = "atmel,at91sam9g20-i2c", | ||
| 387 | .data = &at91sam9g20_config, | ||
| 388 | } , { | ||
| 389 | .compatible = "atmel,at91sam9g10-i2c", | ||
| 390 | .data = &at91sam9g10_config, | ||
| 391 | }, { | ||
| 392 | .compatible = "atmel,at91sam9x5-i2c", | ||
| 393 | .data = &at91sam9x5_config, | ||
| 394 | }, { | ||
| 395 | /* sentinel */ | ||
| 216 | } | 396 | } |
| 397 | }; | ||
| 398 | MODULE_DEVICE_TABLE(of, atmel_twi_dt_ids); | ||
| 399 | #else | ||
| 400 | #define atmel_twi_dt_ids NULL | ||
| 401 | #endif | ||
| 217 | 402 | ||
| 218 | adapter = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL); | 403 | static struct at91_twi_pdata * __devinit at91_twi_get_driver_data( |
| 219 | if (adapter == NULL) { | 404 | struct platform_device *pdev) |
| 220 | dev_err(&pdev->dev, "can't allocate inteface!\n"); | 405 | { |
| 221 | rc = -ENOMEM; | 406 | if (pdev->dev.of_node) { |
| 222 | goto fail2; | 407 | const struct of_device_id *match; |
| 408 | match = of_match_node(atmel_twi_dt_ids, pdev->dev.of_node); | ||
| 409 | if (!match) | ||
| 410 | return NULL; | ||
| 411 | return match->data; | ||
| 223 | } | 412 | } |
| 224 | snprintf(adapter->name, sizeof(adapter->name), "AT91"); | 413 | return (struct at91_twi_pdata *) platform_get_device_id(pdev)->driver_data; |
| 225 | adapter->algo = &at91_algorithm; | 414 | } |
| 226 | adapter->class = I2C_CLASS_HWMON; | 415 | |
| 227 | adapter->dev.parent = &pdev->dev; | 416 | static int __devinit at91_twi_probe(struct platform_device *pdev) |
| 228 | /* adapter->id == 0 ... only one TWI controller for now */ | 417 | { |
| 418 | struct at91_twi_dev *dev; | ||
| 419 | struct resource *mem; | ||
| 420 | int rc; | ||
| 421 | |||
| 422 | dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); | ||
| 423 | if (!dev) | ||
| 424 | return -ENOMEM; | ||
| 425 | init_completion(&dev->cmd_complete); | ||
| 426 | dev->dev = &pdev->dev; | ||
| 427 | |||
| 428 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 429 | if (!mem) | ||
| 430 | return -ENODEV; | ||
| 431 | |||
| 432 | dev->pdata = at91_twi_get_driver_data(pdev); | ||
| 433 | if (!dev->pdata) | ||
| 434 | return -ENODEV; | ||
| 229 | 435 | ||
| 230 | platform_set_drvdata(pdev, adapter); | 436 | dev->base = devm_request_and_ioremap(&pdev->dev, mem); |
| 437 | if (!dev->base) | ||
| 438 | return -EBUSY; | ||
| 231 | 439 | ||
| 232 | clk_enable(twi_clk); /* enable peripheral clock */ | 440 | dev->irq = platform_get_irq(pdev, 0); |
| 233 | at91_twi_hwinit(); /* initialize TWI controller */ | 441 | if (dev->irq < 0) |
| 442 | return dev->irq; | ||
| 234 | 443 | ||
| 235 | rc = i2c_add_numbered_adapter(adapter); | 444 | rc = devm_request_irq(&pdev->dev, dev->irq, atmel_twi_interrupt, 0, |
| 445 | dev_name(dev->dev), dev); | ||
| 236 | if (rc) { | 446 | if (rc) { |
| 237 | dev_err(&pdev->dev, "Adapter %s registration failed\n", | 447 | dev_err(dev->dev, "Cannot get irq %d: %d\n", dev->irq, rc); |
| 238 | adapter->name); | 448 | return rc; |
| 239 | goto fail3; | ||
| 240 | } | 449 | } |
| 241 | 450 | ||
| 242 | dev_info(&pdev->dev, "AT91 i2c bus driver.\n"); | 451 | platform_set_drvdata(pdev, dev); |
| 243 | return 0; | ||
| 244 | 452 | ||
| 245 | fail3: | 453 | dev->clk = devm_clk_get(dev->dev, NULL); |
| 246 | platform_set_drvdata(pdev, NULL); | 454 | if (IS_ERR(dev->clk)) { |
| 247 | kfree(adapter); | 455 | dev_err(dev->dev, "no clock defined\n"); |
| 248 | clk_disable(twi_clk); | 456 | return -ENODEV; |
| 249 | fail2: | 457 | } |
| 250 | clk_put(twi_clk); | 458 | clk_prepare_enable(dev->clk); |
| 251 | fail1: | 459 | |
| 252 | iounmap(twi_base); | 460 | at91_calc_twi_clock(dev, TWI_CLK_HZ); |
| 253 | fail0: | 461 | at91_init_twi_bus(dev); |
| 254 | release_mem_region(res->start, resource_size(res)); | 462 | |
| 463 | snprintf(dev->adapter.name, sizeof(dev->adapter.name), "AT91"); | ||
| 464 | i2c_set_adapdata(&dev->adapter, dev); | ||
| 465 | dev->adapter.owner = THIS_MODULE; | ||
| 466 | dev->adapter.class = I2C_CLASS_HWMON; | ||
| 467 | dev->adapter.algo = &at91_twi_algorithm; | ||
| 468 | dev->adapter.dev.parent = dev->dev; | ||
| 469 | dev->adapter.nr = pdev->id; | ||
| 470 | dev->adapter.timeout = AT91_I2C_TIMEOUT; | ||
| 471 | dev->adapter.dev.of_node = pdev->dev.of_node; | ||
| 472 | |||
| 473 | rc = i2c_add_numbered_adapter(&dev->adapter); | ||
| 474 | if (rc) { | ||
| 475 | dev_err(dev->dev, "Adapter %s registration failed\n", | ||
| 476 | dev->adapter.name); | ||
| 477 | clk_disable_unprepare(dev->clk); | ||
| 478 | return rc; | ||
| 479 | } | ||
| 255 | 480 | ||
| 256 | return rc; | 481 | of_i2c_register_devices(&dev->adapter); |
| 482 | |||
| 483 | dev_info(dev->dev, "AT91 i2c bus driver.\n"); | ||
| 484 | return 0; | ||
| 257 | } | 485 | } |
| 258 | 486 | ||
| 259 | static int __devexit at91_i2c_remove(struct platform_device *pdev) | 487 | static int __devexit at91_twi_remove(struct platform_device *pdev) |
| 260 | { | 488 | { |
| 261 | struct i2c_adapter *adapter = platform_get_drvdata(pdev); | 489 | struct at91_twi_dev *dev = platform_get_drvdata(pdev); |
| 262 | struct resource *res; | ||
| 263 | int rc; | 490 | int rc; |
| 264 | 491 | ||
| 265 | rc = i2c_del_adapter(adapter); | 492 | rc = i2c_del_adapter(&dev->adapter); |
| 266 | platform_set_drvdata(pdev, NULL); | 493 | clk_disable_unprepare(dev->clk); |
| 267 | |||
| 268 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 269 | iounmap(twi_base); | ||
| 270 | release_mem_region(res->start, resource_size(res)); | ||
| 271 | |||
| 272 | clk_disable(twi_clk); /* disable peripheral clock */ | ||
| 273 | clk_put(twi_clk); | ||
| 274 | 494 | ||
| 275 | return rc; | 495 | return rc; |
| 276 | } | 496 | } |
| 277 | 497 | ||
| 278 | #ifdef CONFIG_PM | 498 | #ifdef CONFIG_PM |
| 279 | 499 | ||
| 280 | /* NOTE: could save a few mA by keeping clock off outside of at91_xfer... */ | 500 | static int at91_twi_runtime_suspend(struct device *dev) |
| 281 | |||
| 282 | static int at91_i2c_suspend(struct device *dev) | ||
| 283 | { | 501 | { |
| 284 | clk_disable(twi_clk); | 502 | struct at91_twi_dev *twi_dev = dev_get_drvdata(dev); |
| 503 | |||
| 504 | clk_disable(twi_dev->clk); | ||
| 505 | |||
| 285 | return 0; | 506 | return 0; |
| 286 | } | 507 | } |
| 287 | 508 | ||
| 288 | static int at91_i2c_resume(struct device *dev) | 509 | static int at91_twi_runtime_resume(struct device *dev) |
| 289 | { | 510 | { |
| 290 | return clk_enable(twi_clk); | 511 | struct at91_twi_dev *twi_dev = dev_get_drvdata(dev); |
| 512 | |||
| 513 | return clk_enable(twi_dev->clk); | ||
| 291 | } | 514 | } |
| 292 | 515 | ||
| 293 | static SIMPLE_DEV_PM_OPS(at91_i2c_pm, at91_i2c_suspend, at91_i2c_resume); | 516 | static const struct dev_pm_ops at91_twi_pm = { |
| 294 | #define AT91_I2C_PM (&at91_i2c_pm) | 517 | .runtime_suspend = at91_twi_runtime_suspend, |
| 518 | .runtime_resume = at91_twi_runtime_resume, | ||
| 519 | }; | ||
| 295 | 520 | ||
| 521 | #define at91_twi_pm_ops (&at91_twi_pm) | ||
| 296 | #else | 522 | #else |
| 297 | #define AT91_I2C_PM NULL | 523 | #define at91_twi_pm_ops NULL |
| 298 | #endif | 524 | #endif |
| 299 | 525 | ||
| 300 | static struct platform_driver at91_i2c_driver = { | 526 | static struct platform_driver at91_twi_driver = { |
| 301 | .probe = at91_i2c_probe, | 527 | .probe = at91_twi_probe, |
| 302 | .remove = __devexit_p(at91_i2c_remove), | 528 | .remove = __devexit_p(at91_twi_remove), |
| 529 | .id_table = at91_twi_devtypes, | ||
| 303 | .driver = { | 530 | .driver = { |
| 304 | .name = "at91_i2c", | 531 | .name = "at91_i2c", |
| 305 | .owner = THIS_MODULE, | 532 | .owner = THIS_MODULE, |
| 306 | .pm = AT91_I2C_PM, | 533 | .of_match_table = atmel_twi_dt_ids, |
| 534 | .pm = at91_twi_pm_ops, | ||
| 307 | }, | 535 | }, |
| 308 | }; | 536 | }; |
| 309 | 537 | ||
| 310 | module_platform_driver(at91_i2c_driver); | 538 | static int __init at91_twi_init(void) |
| 539 | { | ||
| 540 | return platform_driver_register(&at91_twi_driver); | ||
| 541 | } | ||
| 542 | |||
| 543 | static void __exit at91_twi_exit(void) | ||
| 544 | { | ||
| 545 | platform_driver_unregister(&at91_twi_driver); | ||
| 546 | } | ||
| 547 | |||
| 548 | subsys_initcall(at91_twi_init); | ||
| 549 | module_exit(at91_twi_exit); | ||
| 311 | 550 | ||
| 312 | MODULE_AUTHOR("Rick Bronson"); | 551 | MODULE_AUTHOR("Nikolaus Voss <n.voss@weinmann.de>"); |
| 313 | MODULE_DESCRIPTION("I2C (TWI) driver for Atmel AT91"); | 552 | MODULE_DESCRIPTION("I2C (TWI) driver for Atmel AT91"); |
| 314 | MODULE_LICENSE("GPL"); | 553 | MODULE_LICENSE("GPL"); |
| 315 | MODULE_ALIAS("platform:at91_i2c"); | 554 | MODULE_ALIAS("platform:at91_i2c"); |
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index 79a2542d8c41..6a0a55319449 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c | |||
| @@ -38,6 +38,8 @@ | |||
| 38 | #include <linux/slab.h> | 38 | #include <linux/slab.h> |
| 39 | #include <linux/cpufreq.h> | 39 | #include <linux/cpufreq.h> |
| 40 | #include <linux/gpio.h> | 40 | #include <linux/gpio.h> |
| 41 | #include <linux/of_i2c.h> | ||
| 42 | #include <linux/of_device.h> | ||
| 41 | 43 | ||
| 42 | #include <mach/hardware.h> | 44 | #include <mach/hardware.h> |
| 43 | #include <linux/platform_data/i2c-davinci.h> | 45 | #include <linux/platform_data/i2c-davinci.h> |
| @@ -114,6 +116,7 @@ struct davinci_i2c_dev { | |||
| 114 | struct completion xfr_complete; | 116 | struct completion xfr_complete; |
| 115 | struct notifier_block freq_transition; | 117 | struct notifier_block freq_transition; |
| 116 | #endif | 118 | #endif |
| 119 | struct davinci_i2c_platform_data *pdata; | ||
| 117 | }; | 120 | }; |
| 118 | 121 | ||
| 119 | /* default platform data to use if not supplied in the platform_device */ | 122 | /* default platform data to use if not supplied in the platform_device */ |
| @@ -155,7 +158,7 @@ static void generic_i2c_clock_pulse(unsigned int scl_pin) | |||
| 155 | static void i2c_recover_bus(struct davinci_i2c_dev *dev) | 158 | static void i2c_recover_bus(struct davinci_i2c_dev *dev) |
| 156 | { | 159 | { |
| 157 | u32 flag = 0; | 160 | u32 flag = 0; |
| 158 | struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; | 161 | struct davinci_i2c_platform_data *pdata = dev->pdata; |
| 159 | 162 | ||
| 160 | dev_err(dev->dev, "initiating i2c bus recovery\n"); | 163 | dev_err(dev->dev, "initiating i2c bus recovery\n"); |
| 161 | /* Send NACK to the slave */ | 164 | /* Send NACK to the slave */ |
| @@ -163,8 +166,7 @@ static void i2c_recover_bus(struct davinci_i2c_dev *dev) | |||
| 163 | flag |= DAVINCI_I2C_MDR_NACK; | 166 | flag |= DAVINCI_I2C_MDR_NACK; |
| 164 | /* write the data into mode register */ | 167 | /* write the data into mode register */ |
| 165 | davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); | 168 | davinci_i2c_write_reg(dev, DAVINCI_I2C_MDR_REG, flag); |
| 166 | if (pdata) | 169 | generic_i2c_clock_pulse(pdata->scl_pin); |
| 167 | generic_i2c_clock_pulse(pdata->scl_pin); | ||
| 168 | /* Send STOP */ | 170 | /* Send STOP */ |
| 169 | flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); | 171 | flag = davinci_i2c_read_reg(dev, DAVINCI_I2C_MDR_REG); |
| 170 | flag |= DAVINCI_I2C_MDR_STP; | 172 | flag |= DAVINCI_I2C_MDR_STP; |
| @@ -187,7 +189,7 @@ static inline void davinci_i2c_reset_ctrl(struct davinci_i2c_dev *i2c_dev, | |||
| 187 | 189 | ||
| 188 | static void i2c_davinci_calc_clk_dividers(struct davinci_i2c_dev *dev) | 190 | static void i2c_davinci_calc_clk_dividers(struct davinci_i2c_dev *dev) |
| 189 | { | 191 | { |
| 190 | struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; | 192 | struct davinci_i2c_platform_data *pdata = dev->pdata; |
| 191 | u16 psc; | 193 | u16 psc; |
| 192 | u32 clk; | 194 | u32 clk; |
| 193 | u32 d; | 195 | u32 d; |
| @@ -235,10 +237,7 @@ static void i2c_davinci_calc_clk_dividers(struct davinci_i2c_dev *dev) | |||
| 235 | */ | 237 | */ |
| 236 | static int i2c_davinci_init(struct davinci_i2c_dev *dev) | 238 | static int i2c_davinci_init(struct davinci_i2c_dev *dev) |
| 237 | { | 239 | { |
| 238 | struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; | 240 | struct davinci_i2c_platform_data *pdata = dev->pdata; |
| 239 | |||
| 240 | if (!pdata) | ||
| 241 | pdata = &davinci_i2c_platform_data_default; | ||
| 242 | 241 | ||
| 243 | /* put I2C into reset */ | 242 | /* put I2C into reset */ |
| 244 | davinci_i2c_reset_ctrl(dev, 0); | 243 | davinci_i2c_reset_ctrl(dev, 0); |
| @@ -260,6 +259,7 @@ static int i2c_davinci_init(struct davinci_i2c_dev *dev) | |||
| 260 | dev_dbg(dev->dev, "bus_freq = %dkHz, bus_delay = %d\n", | 259 | dev_dbg(dev->dev, "bus_freq = %dkHz, bus_delay = %d\n", |
| 261 | pdata->bus_freq, pdata->bus_delay); | 260 | pdata->bus_freq, pdata->bus_delay); |
| 262 | 261 | ||
| 262 | |||
| 263 | /* Take the I2C module out of reset: */ | 263 | /* Take the I2C module out of reset: */ |
| 264 | davinci_i2c_reset_ctrl(dev, 1); | 264 | davinci_i2c_reset_ctrl(dev, 1); |
| 265 | 265 | ||
| @@ -308,13 +308,11 @@ static int | |||
| 308 | i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) | 308 | i2c_davinci_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, int stop) |
| 309 | { | 309 | { |
| 310 | struct davinci_i2c_dev *dev = i2c_get_adapdata(adap); | 310 | struct davinci_i2c_dev *dev = i2c_get_adapdata(adap); |
| 311 | struct davinci_i2c_platform_data *pdata = dev->dev->platform_data; | 311 | struct davinci_i2c_platform_data *pdata = dev->pdata; |
| 312 | u32 flag; | 312 | u32 flag; |
| 313 | u16 w; | 313 | u16 w; |
| 314 | int r; | 314 | int r; |
| 315 | 315 | ||
| 316 | if (!pdata) | ||
| 317 | pdata = &davinci_i2c_platform_data_default; | ||
| 318 | /* Introduce a delay, required for some boards (e.g Davinci EVM) */ | 316 | /* Introduce a delay, required for some boards (e.g Davinci EVM) */ |
| 319 | if (pdata->bus_delay) | 317 | if (pdata->bus_delay) |
| 320 | udelay(pdata->bus_delay); | 318 | udelay(pdata->bus_delay); |
| @@ -635,6 +633,12 @@ static struct i2c_algorithm i2c_davinci_algo = { | |||
| 635 | .functionality = i2c_davinci_func, | 633 | .functionality = i2c_davinci_func, |
| 636 | }; | 634 | }; |
| 637 | 635 | ||
| 636 | static const struct of_device_id davinci_i2c_of_match[] = { | ||
| 637 | {.compatible = "ti,davinci-i2c", }, | ||
| 638 | {}, | ||
| 639 | }; | ||
| 640 | MODULE_DEVICE_TABLE(of, davinci_i2c_of_match); | ||
| 641 | |||
| 638 | static int davinci_i2c_probe(struct platform_device *pdev) | 642 | static int davinci_i2c_probe(struct platform_device *pdev) |
| 639 | { | 643 | { |
| 640 | struct davinci_i2c_dev *dev; | 644 | struct davinci_i2c_dev *dev; |
| @@ -674,14 +678,33 @@ static int davinci_i2c_probe(struct platform_device *pdev) | |||
| 674 | #endif | 678 | #endif |
| 675 | dev->dev = get_device(&pdev->dev); | 679 | dev->dev = get_device(&pdev->dev); |
| 676 | dev->irq = irq->start; | 680 | dev->irq = irq->start; |
| 681 | dev->pdata = dev->dev->platform_data; | ||
| 677 | platform_set_drvdata(pdev, dev); | 682 | platform_set_drvdata(pdev, dev); |
| 678 | 683 | ||
| 684 | if (!dev->pdata && pdev->dev.of_node) { | ||
| 685 | u32 prop; | ||
| 686 | |||
| 687 | dev->pdata = devm_kzalloc(&pdev->dev, | ||
| 688 | sizeof(struct davinci_i2c_platform_data), GFP_KERNEL); | ||
| 689 | if (!dev->pdata) { | ||
| 690 | r = -ENOMEM; | ||
| 691 | goto err_free_mem; | ||
| 692 | } | ||
| 693 | memcpy(dev->pdata, &davinci_i2c_platform_data_default, | ||
| 694 | sizeof(struct davinci_i2c_platform_data)); | ||
| 695 | if (!of_property_read_u32(pdev->dev.of_node, "clock-frequency", | ||
| 696 | &prop)) | ||
| 697 | dev->pdata->bus_freq = prop / 1000; | ||
| 698 | } else if (!dev->pdata) { | ||
| 699 | dev->pdata = &davinci_i2c_platform_data_default; | ||
| 700 | } | ||
| 701 | |||
| 679 | dev->clk = clk_get(&pdev->dev, NULL); | 702 | dev->clk = clk_get(&pdev->dev, NULL); |
| 680 | if (IS_ERR(dev->clk)) { | 703 | if (IS_ERR(dev->clk)) { |
| 681 | r = -ENODEV; | 704 | r = -ENODEV; |
| 682 | goto err_free_mem; | 705 | goto err_free_mem; |
| 683 | } | 706 | } |
| 684 | clk_enable(dev->clk); | 707 | clk_prepare_enable(dev->clk); |
| 685 | 708 | ||
| 686 | dev->base = ioremap(mem->start, resource_size(mem)); | 709 | dev->base = ioremap(mem->start, resource_size(mem)); |
| 687 | if (!dev->base) { | 710 | if (!dev->base) { |
| @@ -711,6 +734,7 @@ static int davinci_i2c_probe(struct platform_device *pdev) | |||
| 711 | adap->algo = &i2c_davinci_algo; | 734 | adap->algo = &i2c_davinci_algo; |
| 712 | adap->dev.parent = &pdev->dev; | 735 | adap->dev.parent = &pdev->dev; |
| 713 | adap->timeout = DAVINCI_I2C_TIMEOUT; | 736 | adap->timeout = DAVINCI_I2C_TIMEOUT; |
| 737 | adap->dev.of_node = pdev->dev.of_node; | ||
| 714 | 738 | ||
| 715 | adap->nr = pdev->id; | 739 | adap->nr = pdev->id; |
| 716 | r = i2c_add_numbered_adapter(adap); | 740 | r = i2c_add_numbered_adapter(adap); |
| @@ -718,6 +742,7 @@ static int davinci_i2c_probe(struct platform_device *pdev) | |||
| 718 | dev_err(&pdev->dev, "failure adding adapter\n"); | 742 | dev_err(&pdev->dev, "failure adding adapter\n"); |
| 719 | goto err_free_irq; | 743 | goto err_free_irq; |
| 720 | } | 744 | } |
| 745 | of_i2c_register_devices(adap); | ||
| 721 | 746 | ||
| 722 | return 0; | 747 | return 0; |
| 723 | 748 | ||
| @@ -726,7 +751,7 @@ err_free_irq: | |||
| 726 | err_unuse_clocks: | 751 | err_unuse_clocks: |
| 727 | iounmap(dev->base); | 752 | iounmap(dev->base); |
| 728 | err_mem_ioremap: | 753 | err_mem_ioremap: |
| 729 | clk_disable(dev->clk); | 754 | clk_disable_unprepare(dev->clk); |
| 730 | clk_put(dev->clk); | 755 | clk_put(dev->clk); |
| 731 | dev->clk = NULL; | 756 | dev->clk = NULL; |
| 732 | err_free_mem: | 757 | err_free_mem: |
| @@ -750,7 +775,7 @@ static int davinci_i2c_remove(struct platform_device *pdev) | |||
| 750 | i2c_del_adapter(&dev->adapter); | 775 | i2c_del_adapter(&dev->adapter); |
| 751 | put_device(&pdev->dev); | 776 | put_device(&pdev->dev); |
| 752 | 777 | ||
| 753 | clk_disable(dev->clk); | 778 | clk_disable_unprepare(dev->clk); |
| 754 | clk_put(dev->clk); | 779 | clk_put(dev->clk); |
| 755 | dev->clk = NULL; | 780 | dev->clk = NULL; |
| 756 | 781 | ||
| @@ -772,7 +797,7 @@ static int davinci_i2c_suspend(struct device *dev) | |||
| 772 | 797 | ||
| 773 | /* put I2C into reset */ | 798 | /* put I2C into reset */ |
| 774 | davinci_i2c_reset_ctrl(i2c_dev, 0); | 799 | davinci_i2c_reset_ctrl(i2c_dev, 0); |
| 775 | clk_disable(i2c_dev->clk); | 800 | clk_disable_unprepare(i2c_dev->clk); |
| 776 | 801 | ||
| 777 | return 0; | 802 | return 0; |
| 778 | } | 803 | } |
| @@ -782,7 +807,7 @@ static int davinci_i2c_resume(struct device *dev) | |||
| 782 | struct platform_device *pdev = to_platform_device(dev); | 807 | struct platform_device *pdev = to_platform_device(dev); |
| 783 | struct davinci_i2c_dev *i2c_dev = platform_get_drvdata(pdev); | 808 | struct davinci_i2c_dev *i2c_dev = platform_get_drvdata(pdev); |
| 784 | 809 | ||
| 785 | clk_enable(i2c_dev->clk); | 810 | clk_prepare_enable(i2c_dev->clk); |
| 786 | /* take I2C out of reset */ | 811 | /* take I2C out of reset */ |
| 787 | davinci_i2c_reset_ctrl(i2c_dev, 1); | 812 | davinci_i2c_reset_ctrl(i2c_dev, 1); |
| 788 | 813 | ||
| @@ -809,6 +834,7 @@ static struct platform_driver davinci_i2c_driver = { | |||
| 809 | .name = "i2c_davinci", | 834 | .name = "i2c_davinci", |
| 810 | .owner = THIS_MODULE, | 835 | .owner = THIS_MODULE, |
| 811 | .pm = davinci_i2c_pm_ops, | 836 | .pm = davinci_i2c_pm_ops, |
| 837 | .of_match_table = of_match_ptr(davinci_i2c_of_match), | ||
| 812 | }, | 838 | }, |
| 813 | }; | 839 | }; |
| 814 | 840 | ||
diff --git a/drivers/i2c/busses/i2c-imx.c b/drivers/i2c/busses/i2c-imx.c index b7907ba7448a..2ef162d148cb 100644 --- a/drivers/i2c/busses/i2c-imx.c +++ b/drivers/i2c/busses/i2c-imx.c | |||
| @@ -272,9 +272,9 @@ static void __init i2c_imx_set_clk(struct imx_i2c_struct *i2c_imx, | |||
| 272 | 272 | ||
| 273 | /* dev_dbg() can't be used, because adapter is not yet registered */ | 273 | /* dev_dbg() can't be used, because adapter is not yet registered */ |
| 274 | #ifdef CONFIG_I2C_DEBUG_BUS | 274 | #ifdef CONFIG_I2C_DEBUG_BUS |
| 275 | printk(KERN_DEBUG "I2C: <%s> I2C_CLK=%d, REQ DIV=%d\n", | 275 | dev_dbg(&i2c_imx->adapter.dev, "<%s> I2C_CLK=%d, REQ DIV=%d\n", |
| 276 | __func__, i2c_clk_rate, div); | 276 | __func__, i2c_clk_rate, div); |
| 277 | printk(KERN_DEBUG "I2C: <%s> IFDR[IC]=0x%x, REAL DIV=%d\n", | 277 | dev_dbg(&i2c_imx->adapter.dev, "<%s> IFDR[IC]=0x%x, REAL DIV=%d\n", |
| 278 | __func__, i2c_clk_div[i][1], i2c_clk_div[i][0]); | 278 | __func__, i2c_clk_div[i][1], i2c_clk_div[i][0]); |
| 279 | #endif | 279 | #endif |
| 280 | } | 280 | } |
| @@ -564,7 +564,7 @@ static int __init i2c_imx_probe(struct platform_device *pdev) | |||
| 564 | resource_size(res), res->start); | 564 | resource_size(res), res->start); |
| 565 | dev_dbg(&i2c_imx->adapter.dev, "adapter name: \"%s\"\n", | 565 | dev_dbg(&i2c_imx->adapter.dev, "adapter name: \"%s\"\n", |
| 566 | i2c_imx->adapter.name); | 566 | i2c_imx->adapter.name); |
| 567 | dev_dbg(&i2c_imx->adapter.dev, "IMX I2C adapter registered\n"); | 567 | dev_info(&i2c_imx->adapter.dev, "IMX I2C adapter registered\n"); |
| 568 | 568 | ||
| 569 | return 0; /* Return OK */ | 569 | return 0; /* Return OK */ |
| 570 | } | 570 | } |
diff --git a/drivers/i2c/busses/i2c-mpc.c b/drivers/i2c/busses/i2c-mpc.c index 57f7703ce2e8..ca86430cb4a2 100644 --- a/drivers/i2c/busses/i2c-mpc.c +++ b/drivers/i2c/busses/i2c-mpc.c | |||
| @@ -576,7 +576,23 @@ static int mpc_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
| 576 | mpc_write(i2c, pmsg->addr, pmsg->buf, pmsg->len, i); | 576 | mpc_write(i2c, pmsg->addr, pmsg->buf, pmsg->len, i); |
| 577 | } | 577 | } |
| 578 | } | 578 | } |
| 579 | mpc_i2c_stop(i2c); | 579 | mpc_i2c_stop(i2c); /* Initiate STOP */ |
| 580 | orig_jiffies = jiffies; | ||
| 581 | /* Wait until STOP is seen, allow up to 1 s */ | ||
| 582 | while (readb(i2c->base + MPC_I2C_SR) & CSR_MBB) { | ||
| 583 | if (time_after(jiffies, orig_jiffies + HZ)) { | ||
| 584 | u8 status = readb(i2c->base + MPC_I2C_SR); | ||
| 585 | |||
| 586 | dev_dbg(i2c->dev, "timeout\n"); | ||
| 587 | if ((status & (CSR_MCF | CSR_MBB | CSR_RXAK)) != 0) { | ||
| 588 | writeb(status & ~CSR_MAL, | ||
| 589 | i2c->base + MPC_I2C_SR); | ||
| 590 | mpc_i2c_fixup(i2c); | ||
| 591 | } | ||
| 592 | return -EIO; | ||
| 593 | } | ||
| 594 | cond_resched(); | ||
| 595 | } | ||
| 580 | return (ret < 0) ? ret : num; | 596 | return (ret < 0) ? ret : num; |
| 581 | } | 597 | } |
| 582 | 598 | ||
diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c index 51f05b8520ed..1f58197062cf 100644 --- a/drivers/i2c/busses/i2c-mxs.c +++ b/drivers/i2c/busses/i2c-mxs.c | |||
| @@ -7,8 +7,6 @@ | |||
| 7 | * | 7 | * |
| 8 | * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved. | 8 | * Copyright (C) 2009-2010 Freescale Semiconductor, Inc. All Rights Reserved. |
| 9 | * | 9 | * |
| 10 | * TODO: add dma-support if platform-support for it is available | ||
| 11 | * | ||
| 12 | * This program is free software; you can redistribute it and/or modify | 10 | * This program is free software; you can redistribute it and/or modify |
| 13 | * it under the terms of the GNU General Public License as published by | 11 | * it under the terms of the GNU General Public License as published by |
| 14 | * the Free Software Foundation; either version 2 of the License, or | 12 | * the Free Software Foundation; either version 2 of the License, or |
| @@ -31,9 +29,16 @@ | |||
| 31 | #include <linux/of.h> | 29 | #include <linux/of.h> |
| 32 | #include <linux/of_device.h> | 30 | #include <linux/of_device.h> |
| 33 | #include <linux/of_i2c.h> | 31 | #include <linux/of_i2c.h> |
| 32 | #include <linux/dma-mapping.h> | ||
| 33 | #include <linux/dmaengine.h> | ||
| 34 | #include <linux/fsl/mxs-dma.h> | ||
| 34 | 35 | ||
| 35 | #define DRIVER_NAME "mxs-i2c" | 36 | #define DRIVER_NAME "mxs-i2c" |
| 36 | 37 | ||
| 38 | static bool use_pioqueue; | ||
| 39 | module_param(use_pioqueue, bool, 0); | ||
| 40 | MODULE_PARM_DESC(use_pioqueue, "Use PIOQUEUE mode for transfer instead of DMA"); | ||
| 41 | |||
| 37 | #define MXS_I2C_CTRL0 (0x00) | 42 | #define MXS_I2C_CTRL0 (0x00) |
| 38 | #define MXS_I2C_CTRL0_SET (0x04) | 43 | #define MXS_I2C_CTRL0_SET (0x04) |
| 39 | 44 | ||
| @@ -146,6 +151,16 @@ struct mxs_i2c_dev { | |||
| 146 | u32 cmd_err; | 151 | u32 cmd_err; |
| 147 | struct i2c_adapter adapter; | 152 | struct i2c_adapter adapter; |
| 148 | const struct mxs_i2c_speed_config *speed; | 153 | const struct mxs_i2c_speed_config *speed; |
| 154 | |||
| 155 | /* DMA support components */ | ||
| 156 | bool dma_mode; | ||
| 157 | int dma_channel; | ||
| 158 | struct dma_chan *dmach; | ||
| 159 | struct mxs_dma_data dma_data; | ||
| 160 | uint32_t pio_data[2]; | ||
| 161 | uint32_t addr_data; | ||
| 162 | struct scatterlist sg_io[2]; | ||
| 163 | bool dma_read; | ||
| 149 | }; | 164 | }; |
| 150 | 165 | ||
| 151 | static void mxs_i2c_reset(struct mxs_i2c_dev *i2c) | 166 | static void mxs_i2c_reset(struct mxs_i2c_dev *i2c) |
| @@ -157,7 +172,11 @@ static void mxs_i2c_reset(struct mxs_i2c_dev *i2c) | |||
| 157 | writel(i2c->speed->timing2, i2c->regs + MXS_I2C_TIMING2); | 172 | writel(i2c->speed->timing2, i2c->regs + MXS_I2C_TIMING2); |
| 158 | 173 | ||
| 159 | writel(MXS_I2C_IRQ_MASK << 8, i2c->regs + MXS_I2C_CTRL1_SET); | 174 | writel(MXS_I2C_IRQ_MASK << 8, i2c->regs + MXS_I2C_CTRL1_SET); |
| 160 | writel(MXS_I2C_QUEUECTRL_PIO_QUEUE_MODE, | 175 | if (i2c->dma_mode) |
| 176 | writel(MXS_I2C_QUEUECTRL_PIO_QUEUE_MODE, | ||
| 177 | i2c->regs + MXS_I2C_QUEUECTRL_CLR); | ||
| 178 | else | ||
| 179 | writel(MXS_I2C_QUEUECTRL_PIO_QUEUE_MODE, | ||
| 161 | i2c->regs + MXS_I2C_QUEUECTRL_SET); | 180 | i2c->regs + MXS_I2C_QUEUECTRL_SET); |
| 162 | } | 181 | } |
| 163 | 182 | ||
| @@ -248,6 +267,150 @@ static int mxs_i2c_finish_read(struct mxs_i2c_dev *i2c, u8 *buf, int len) | |||
| 248 | return 0; | 267 | return 0; |
| 249 | } | 268 | } |
| 250 | 269 | ||
| 270 | static void mxs_i2c_dma_finish(struct mxs_i2c_dev *i2c) | ||
| 271 | { | ||
| 272 | if (i2c->dma_read) { | ||
| 273 | dma_unmap_sg(i2c->dev, &i2c->sg_io[0], 1, DMA_TO_DEVICE); | ||
| 274 | dma_unmap_sg(i2c->dev, &i2c->sg_io[1], 1, DMA_FROM_DEVICE); | ||
| 275 | } else { | ||
| 276 | dma_unmap_sg(i2c->dev, i2c->sg_io, 2, DMA_TO_DEVICE); | ||
| 277 | } | ||
| 278 | } | ||
| 279 | |||
| 280 | static void mxs_i2c_dma_irq_callback(void *param) | ||
| 281 | { | ||
| 282 | struct mxs_i2c_dev *i2c = param; | ||
| 283 | |||
| 284 | complete(&i2c->cmd_complete); | ||
| 285 | mxs_i2c_dma_finish(i2c); | ||
| 286 | } | ||
| 287 | |||
| 288 | static int mxs_i2c_dma_setup_xfer(struct i2c_adapter *adap, | ||
| 289 | struct i2c_msg *msg, uint32_t flags) | ||
| 290 | { | ||
| 291 | struct dma_async_tx_descriptor *desc; | ||
| 292 | struct mxs_i2c_dev *i2c = i2c_get_adapdata(adap); | ||
| 293 | |||
| 294 | if (msg->flags & I2C_M_RD) { | ||
| 295 | i2c->dma_read = 1; | ||
| 296 | i2c->addr_data = (msg->addr << 1) | I2C_SMBUS_READ; | ||
| 297 | |||
| 298 | /* | ||
| 299 | * SELECT command. | ||
| 300 | */ | ||
| 301 | |||
| 302 | /* Queue the PIO register write transfer. */ | ||
| 303 | i2c->pio_data[0] = MXS_CMD_I2C_SELECT; | ||
| 304 | desc = dmaengine_prep_slave_sg(i2c->dmach, | ||
| 305 | (struct scatterlist *)&i2c->pio_data[0], | ||
| 306 | 1, DMA_TRANS_NONE, 0); | ||
| 307 | if (!desc) { | ||
| 308 | dev_err(i2c->dev, | ||
| 309 | "Failed to get PIO reg. write descriptor.\n"); | ||
| 310 | goto select_init_pio_fail; | ||
| 311 | } | ||
| 312 | |||
| 313 | /* Queue the DMA data transfer. */ | ||
| 314 | sg_init_one(&i2c->sg_io[0], &i2c->addr_data, 1); | ||
| 315 | dma_map_sg(i2c->dev, &i2c->sg_io[0], 1, DMA_TO_DEVICE); | ||
| 316 | desc = dmaengine_prep_slave_sg(i2c->dmach, &i2c->sg_io[0], 1, | ||
| 317 | DMA_MEM_TO_DEV, | ||
| 318 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
| 319 | if (!desc) { | ||
| 320 | dev_err(i2c->dev, | ||
| 321 | "Failed to get DMA data write descriptor.\n"); | ||
| 322 | goto select_init_dma_fail; | ||
| 323 | } | ||
| 324 | |||
| 325 | /* | ||
| 326 | * READ command. | ||
| 327 | */ | ||
| 328 | |||
| 329 | /* Queue the PIO register write transfer. */ | ||
| 330 | i2c->pio_data[1] = flags | MXS_CMD_I2C_READ | | ||
| 331 | MXS_I2C_CTRL0_XFER_COUNT(msg->len); | ||
| 332 | desc = dmaengine_prep_slave_sg(i2c->dmach, | ||
| 333 | (struct scatterlist *)&i2c->pio_data[1], | ||
| 334 | 1, DMA_TRANS_NONE, DMA_PREP_INTERRUPT); | ||
| 335 | if (!desc) { | ||
| 336 | dev_err(i2c->dev, | ||
| 337 | "Failed to get PIO reg. write descriptor.\n"); | ||
| 338 | goto select_init_dma_fail; | ||
| 339 | } | ||
| 340 | |||
| 341 | /* Queue the DMA data transfer. */ | ||
| 342 | sg_init_one(&i2c->sg_io[1], msg->buf, msg->len); | ||
| 343 | dma_map_sg(i2c->dev, &i2c->sg_io[1], 1, DMA_FROM_DEVICE); | ||
| 344 | desc = dmaengine_prep_slave_sg(i2c->dmach, &i2c->sg_io[1], 1, | ||
| 345 | DMA_DEV_TO_MEM, | ||
| 346 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
| 347 | if (!desc) { | ||
| 348 | dev_err(i2c->dev, | ||
| 349 | "Failed to get DMA data write descriptor.\n"); | ||
| 350 | goto read_init_dma_fail; | ||
| 351 | } | ||
| 352 | } else { | ||
| 353 | i2c->dma_read = 0; | ||
| 354 | i2c->addr_data = (msg->addr << 1) | I2C_SMBUS_WRITE; | ||
| 355 | |||
| 356 | /* | ||
| 357 | * WRITE command. | ||
| 358 | */ | ||
| 359 | |||
| 360 | /* Queue the PIO register write transfer. */ | ||
| 361 | i2c->pio_data[0] = flags | MXS_CMD_I2C_WRITE | | ||
| 362 | MXS_I2C_CTRL0_XFER_COUNT(msg->len + 1); | ||
| 363 | desc = dmaengine_prep_slave_sg(i2c->dmach, | ||
| 364 | (struct scatterlist *)&i2c->pio_data[0], | ||
| 365 | 1, DMA_TRANS_NONE, 0); | ||
| 366 | if (!desc) { | ||
| 367 | dev_err(i2c->dev, | ||
| 368 | "Failed to get PIO reg. write descriptor.\n"); | ||
| 369 | goto write_init_pio_fail; | ||
| 370 | } | ||
| 371 | |||
| 372 | /* Queue the DMA data transfer. */ | ||
| 373 | sg_init_table(i2c->sg_io, 2); | ||
| 374 | sg_set_buf(&i2c->sg_io[0], &i2c->addr_data, 1); | ||
| 375 | sg_set_buf(&i2c->sg_io[1], msg->buf, msg->len); | ||
| 376 | dma_map_sg(i2c->dev, i2c->sg_io, 2, DMA_TO_DEVICE); | ||
| 377 | desc = dmaengine_prep_slave_sg(i2c->dmach, i2c->sg_io, 2, | ||
| 378 | DMA_MEM_TO_DEV, | ||
| 379 | DMA_PREP_INTERRUPT | DMA_CTRL_ACK); | ||
| 380 | if (!desc) { | ||
| 381 | dev_err(i2c->dev, | ||
| 382 | "Failed to get DMA data write descriptor.\n"); | ||
| 383 | goto write_init_dma_fail; | ||
| 384 | } | ||
| 385 | } | ||
| 386 | |||
| 387 | /* | ||
| 388 | * The last descriptor must have this callback, | ||
| 389 | * to finish the DMA transaction. | ||
| 390 | */ | ||
| 391 | desc->callback = mxs_i2c_dma_irq_callback; | ||
| 392 | desc->callback_param = i2c; | ||
| 393 | |||
| 394 | /* Start the transfer. */ | ||
| 395 | dmaengine_submit(desc); | ||
| 396 | dma_async_issue_pending(i2c->dmach); | ||
| 397 | return 0; | ||
| 398 | |||
| 399 | /* Read failpath. */ | ||
| 400 | read_init_dma_fail: | ||
| 401 | dma_unmap_sg(i2c->dev, &i2c->sg_io[1], 1, DMA_FROM_DEVICE); | ||
| 402 | select_init_dma_fail: | ||
| 403 | dma_unmap_sg(i2c->dev, &i2c->sg_io[0], 1, DMA_TO_DEVICE); | ||
| 404 | select_init_pio_fail: | ||
| 405 | return -EINVAL; | ||
| 406 | |||
| 407 | /* Write failpath. */ | ||
| 408 | write_init_dma_fail: | ||
| 409 | dma_unmap_sg(i2c->dev, i2c->sg_io, 2, DMA_TO_DEVICE); | ||
| 410 | write_init_pio_fail: | ||
| 411 | return -EINVAL; | ||
| 412 | } | ||
| 413 | |||
| 251 | /* | 414 | /* |
| 252 | * Low level master read/write transaction. | 415 | * Low level master read/write transaction. |
| 253 | */ | 416 | */ |
| @@ -258,6 +421,8 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, | |||
| 258 | int ret; | 421 | int ret; |
| 259 | int flags; | 422 | int flags; |
| 260 | 423 | ||
| 424 | flags = stop ? MXS_I2C_CTRL0_POST_SEND_STOP : 0; | ||
| 425 | |||
| 261 | dev_dbg(i2c->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n", | 426 | dev_dbg(i2c->dev, "addr: 0x%04x, len: %d, flags: 0x%x, stop: %d\n", |
| 262 | msg->addr, msg->len, msg->flags, stop); | 427 | msg->addr, msg->len, msg->flags, stop); |
| 263 | 428 | ||
| @@ -267,23 +432,29 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, | |||
| 267 | init_completion(&i2c->cmd_complete); | 432 | init_completion(&i2c->cmd_complete); |
| 268 | i2c->cmd_err = 0; | 433 | i2c->cmd_err = 0; |
| 269 | 434 | ||
| 270 | flags = stop ? MXS_I2C_CTRL0_POST_SEND_STOP : 0; | 435 | if (i2c->dma_mode) { |
| 271 | 436 | ret = mxs_i2c_dma_setup_xfer(adap, msg, flags); | |
| 272 | if (msg->flags & I2C_M_RD) | 437 | if (ret) |
| 273 | mxs_i2c_pioq_setup_read(i2c, msg->addr, msg->len, flags); | 438 | return ret; |
| 274 | else | 439 | } else { |
| 275 | mxs_i2c_pioq_setup_write(i2c, msg->addr, msg->buf, msg->len, | 440 | if (msg->flags & I2C_M_RD) { |
| 276 | flags); | 441 | mxs_i2c_pioq_setup_read(i2c, msg->addr, |
| 442 | msg->len, flags); | ||
| 443 | } else { | ||
| 444 | mxs_i2c_pioq_setup_write(i2c, msg->addr, msg->buf, | ||
| 445 | msg->len, flags); | ||
| 446 | } | ||
| 277 | 447 | ||
| 278 | writel(MXS_I2C_QUEUECTRL_QUEUE_RUN, | 448 | writel(MXS_I2C_QUEUECTRL_QUEUE_RUN, |
| 279 | i2c->regs + MXS_I2C_QUEUECTRL_SET); | 449 | i2c->regs + MXS_I2C_QUEUECTRL_SET); |
| 450 | } | ||
| 280 | 451 | ||
| 281 | ret = wait_for_completion_timeout(&i2c->cmd_complete, | 452 | ret = wait_for_completion_timeout(&i2c->cmd_complete, |
| 282 | msecs_to_jiffies(1000)); | 453 | msecs_to_jiffies(1000)); |
| 283 | if (ret == 0) | 454 | if (ret == 0) |
| 284 | goto timeout; | 455 | goto timeout; |
| 285 | 456 | ||
| 286 | if ((!i2c->cmd_err) && (msg->flags & I2C_M_RD)) { | 457 | if (!i2c->dma_mode && !i2c->cmd_err && (msg->flags & I2C_M_RD)) { |
| 287 | ret = mxs_i2c_finish_read(i2c, msg->buf, msg->len); | 458 | ret = mxs_i2c_finish_read(i2c, msg->buf, msg->len); |
| 288 | if (ret) | 459 | if (ret) |
| 289 | goto timeout; | 460 | goto timeout; |
| @@ -301,6 +472,8 @@ static int mxs_i2c_xfer_msg(struct i2c_adapter *adap, struct i2c_msg *msg, | |||
| 301 | 472 | ||
| 302 | timeout: | 473 | timeout: |
| 303 | dev_dbg(i2c->dev, "Timeout!\n"); | 474 | dev_dbg(i2c->dev, "Timeout!\n"); |
| 475 | if (i2c->dma_mode) | ||
| 476 | mxs_i2c_dma_finish(i2c); | ||
| 304 | mxs_i2c_reset(i2c); | 477 | mxs_i2c_reset(i2c); |
| 305 | return -ETIMEDOUT; | 478 | return -ETIMEDOUT; |
| 306 | } | 479 | } |
| @@ -342,11 +515,13 @@ static irqreturn_t mxs_i2c_isr(int this_irq, void *dev_id) | |||
| 342 | /* MXS_I2C_CTRL1_OVERSIZE_XFER_TERM_IRQ is only for slaves */ | 515 | /* MXS_I2C_CTRL1_OVERSIZE_XFER_TERM_IRQ is only for slaves */ |
| 343 | i2c->cmd_err = -EIO; | 516 | i2c->cmd_err = -EIO; |
| 344 | 517 | ||
| 345 | is_last_cmd = (readl(i2c->regs + MXS_I2C_QUEUESTAT) & | 518 | if (!i2c->dma_mode) { |
| 346 | MXS_I2C_QUEUESTAT_WRITE_QUEUE_CNT_MASK) == 0; | 519 | is_last_cmd = (readl(i2c->regs + MXS_I2C_QUEUESTAT) & |
| 520 | MXS_I2C_QUEUESTAT_WRITE_QUEUE_CNT_MASK) == 0; | ||
| 347 | 521 | ||
| 348 | if (is_last_cmd || i2c->cmd_err) | 522 | if (is_last_cmd || i2c->cmd_err) |
| 349 | complete(&i2c->cmd_complete); | 523 | complete(&i2c->cmd_complete); |
| 524 | } | ||
| 350 | 525 | ||
| 351 | writel(stat, i2c->regs + MXS_I2C_CTRL1_CLR); | 526 | writel(stat, i2c->regs + MXS_I2C_CTRL1_CLR); |
| 352 | 527 | ||
| @@ -358,6 +533,21 @@ static const struct i2c_algorithm mxs_i2c_algo = { | |||
| 358 | .functionality = mxs_i2c_func, | 533 | .functionality = mxs_i2c_func, |
| 359 | }; | 534 | }; |
| 360 | 535 | ||
| 536 | static bool mxs_i2c_dma_filter(struct dma_chan *chan, void *param) | ||
| 537 | { | ||
| 538 | struct mxs_i2c_dev *i2c = param; | ||
| 539 | |||
| 540 | if (!mxs_dma_is_apbx(chan)) | ||
| 541 | return false; | ||
| 542 | |||
| 543 | if (chan->chan_id != i2c->dma_channel) | ||
| 544 | return false; | ||
| 545 | |||
| 546 | chan->private = &i2c->dma_data; | ||
| 547 | |||
| 548 | return true; | ||
| 549 | } | ||
| 550 | |||
| 361 | static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c) | 551 | static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c) |
| 362 | { | 552 | { |
| 363 | uint32_t speed; | 553 | uint32_t speed; |
| @@ -365,6 +555,26 @@ static int mxs_i2c_get_ofdata(struct mxs_i2c_dev *i2c) | |||
| 365 | struct device_node *node = dev->of_node; | 555 | struct device_node *node = dev->of_node; |
| 366 | int ret; | 556 | int ret; |
| 367 | 557 | ||
| 558 | /* | ||
| 559 | * The MXS I2C DMA mode is prefered and enabled by default. | ||
| 560 | * The PIO mode is still supported, but should be used only | ||
| 561 | * for debuging purposes etc. | ||
| 562 | */ | ||
| 563 | i2c->dma_mode = !use_pioqueue; | ||
| 564 | if (!i2c->dma_mode) | ||
| 565 | dev_info(dev, "Using PIOQUEUE mode for I2C transfers!\n"); | ||
| 566 | |||
| 567 | /* | ||
| 568 | * TODO: This is a temporary solution and should be changed | ||
| 569 | * to use generic DMA binding later when the helpers get in. | ||
| 570 | */ | ||
| 571 | ret = of_property_read_u32(node, "fsl,i2c-dma-channel", | ||
| 572 | &i2c->dma_channel); | ||
| 573 | if (ret) { | ||
| 574 | dev_warn(dev, "Failed to get DMA channel, using PIOQUEUE!\n"); | ||
| 575 | i2c->dma_mode = 0; | ||
| 576 | } | ||
| 577 | |||
| 368 | ret = of_property_read_u32(node, "clock-frequency", &speed); | 578 | ret = of_property_read_u32(node, "clock-frequency", &speed); |
| 369 | if (ret) | 579 | if (ret) |
| 370 | dev_warn(dev, "No I2C speed selected, using 100kHz\n"); | 580 | dev_warn(dev, "No I2C speed selected, using 100kHz\n"); |
| @@ -384,7 +594,8 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev) | |||
| 384 | struct pinctrl *pinctrl; | 594 | struct pinctrl *pinctrl; |
| 385 | struct resource *res; | 595 | struct resource *res; |
| 386 | resource_size_t res_size; | 596 | resource_size_t res_size; |
| 387 | int err, irq; | 597 | int err, irq, dmairq; |
| 598 | dma_cap_mask_t mask; | ||
| 388 | 599 | ||
| 389 | pinctrl = devm_pinctrl_get_select_default(dev); | 600 | pinctrl = devm_pinctrl_get_select_default(dev); |
| 390 | if (IS_ERR(pinctrl)) | 601 | if (IS_ERR(pinctrl)) |
| @@ -395,7 +606,10 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev) | |||
| 395 | return -ENOMEM; | 606 | return -ENOMEM; |
| 396 | 607 | ||
| 397 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 608 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 398 | if (!res) | 609 | irq = platform_get_irq(pdev, 0); |
| 610 | dmairq = platform_get_irq(pdev, 1); | ||
| 611 | |||
| 612 | if (!res || irq < 0 || dmairq < 0) | ||
| 399 | return -ENOENT; | 613 | return -ENOENT; |
| 400 | 614 | ||
| 401 | res_size = resource_size(res); | 615 | res_size = resource_size(res); |
| @@ -406,10 +620,6 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev) | |||
| 406 | if (!i2c->regs) | 620 | if (!i2c->regs) |
| 407 | return -EBUSY; | 621 | return -EBUSY; |
| 408 | 622 | ||
| 409 | irq = platform_get_irq(pdev, 0); | ||
| 410 | if (irq < 0) | ||
| 411 | return irq; | ||
| 412 | |||
| 413 | err = devm_request_irq(dev, irq, mxs_i2c_isr, 0, dev_name(dev), i2c); | 623 | err = devm_request_irq(dev, irq, mxs_i2c_isr, 0, dev_name(dev), i2c); |
| 414 | if (err) | 624 | if (err) |
| 415 | return err; | 625 | return err; |
| @@ -423,6 +633,18 @@ static int __devinit mxs_i2c_probe(struct platform_device *pdev) | |||
| 423 | return err; | 633 | return err; |
| 424 | } | 634 | } |
| 425 | 635 | ||
| 636 | /* Setup the DMA */ | ||
| 637 | if (i2c->dma_mode) { | ||
| 638 | dma_cap_zero(mask); | ||
| 639 | dma_cap_set(DMA_SLAVE, mask); | ||
| 640 | i2c->dma_data.chan_irq = dmairq; | ||
| 641 | i2c->dmach = dma_request_channel(mask, mxs_i2c_dma_filter, i2c); | ||
| 642 | if (!i2c->dmach) { | ||
| 643 | dev_err(dev, "Failed to request dma\n"); | ||
| 644 | return -ENODEV; | ||
| 645 | } | ||
| 646 | } | ||
| 647 | |||
| 426 | platform_set_drvdata(pdev, i2c); | 648 | platform_set_drvdata(pdev, i2c); |
| 427 | 649 | ||
| 428 | /* Do reset to enforce correct startup after pinmuxing */ | 650 | /* Do reset to enforce correct startup after pinmuxing */ |
| @@ -458,6 +680,9 @@ static int __devexit mxs_i2c_remove(struct platform_device *pdev) | |||
| 458 | if (ret) | 680 | if (ret) |
| 459 | return -EBUSY; | 681 | return -EBUSY; |
| 460 | 682 | ||
| 683 | if (i2c->dmach) | ||
| 684 | dma_release_channel(i2c->dmach); | ||
| 685 | |||
| 461 | writel(MXS_I2C_CTRL0_SFTRST, i2c->regs + MXS_I2C_CTRL0_SET); | 686 | writel(MXS_I2C_CTRL0_SFTRST, i2c->regs + MXS_I2C_CTRL0_SET); |
| 462 | 687 | ||
| 463 | platform_set_drvdata(pdev, NULL); | 688 | platform_set_drvdata(pdev, NULL); |
diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index 61b00edacb08..698d7acb0f08 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c | |||
| @@ -22,9 +22,10 @@ | |||
| 22 | #include <linux/err.h> | 22 | #include <linux/err.h> |
| 23 | #include <linux/clk.h> | 23 | #include <linux/clk.h> |
| 24 | #include <linux/io.h> | 24 | #include <linux/io.h> |
| 25 | #include <linux/regulator/consumer.h> | ||
| 26 | #include <linux/pm_runtime.h> | 25 | #include <linux/pm_runtime.h> |
| 27 | #include <linux/platform_data/i2c-nomadik.h> | 26 | #include <linux/platform_data/i2c-nomadik.h> |
| 27 | #include <linux/of.h> | ||
| 28 | #include <linux/of_i2c.h> | ||
| 28 | 29 | ||
| 29 | #define DRIVER_NAME "nmk-i2c" | 30 | #define DRIVER_NAME "nmk-i2c" |
| 30 | 31 | ||
| @@ -146,7 +147,6 @@ struct i2c_nmk_client { | |||
| 146 | * @stop: stop condition. | 147 | * @stop: stop condition. |
| 147 | * @xfer_complete: acknowledge completion for a I2C message. | 148 | * @xfer_complete: acknowledge completion for a I2C message. |
| 148 | * @result: controller propogated result. | 149 | * @result: controller propogated result. |
| 149 | * @regulator: pointer to i2c regulator. | ||
| 150 | * @busy: Busy doing transfer. | 150 | * @busy: Busy doing transfer. |
| 151 | */ | 151 | */ |
| 152 | struct nmk_i2c_dev { | 152 | struct nmk_i2c_dev { |
| @@ -160,7 +160,6 @@ struct nmk_i2c_dev { | |||
| 160 | int stop; | 160 | int stop; |
| 161 | struct completion xfer_complete; | 161 | struct completion xfer_complete; |
| 162 | int result; | 162 | int result; |
| 163 | struct regulator *regulator; | ||
| 164 | bool busy; | 163 | bool busy; |
| 165 | }; | 164 | }; |
| 166 | 165 | ||
| @@ -643,8 +642,6 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap, | |||
| 643 | 642 | ||
| 644 | dev->busy = true; | 643 | dev->busy = true; |
| 645 | 644 | ||
| 646 | if (dev->regulator) | ||
| 647 | regulator_enable(dev->regulator); | ||
| 648 | pm_runtime_get_sync(&dev->adev->dev); | 645 | pm_runtime_get_sync(&dev->adev->dev); |
| 649 | 646 | ||
| 650 | clk_enable(dev->clk); | 647 | clk_enable(dev->clk); |
| @@ -676,8 +673,6 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap, | |||
| 676 | out: | 673 | out: |
| 677 | clk_disable(dev->clk); | 674 | clk_disable(dev->clk); |
| 678 | pm_runtime_put_sync(&dev->adev->dev); | 675 | pm_runtime_put_sync(&dev->adev->dev); |
| 679 | if (dev->regulator) | ||
| 680 | regulator_disable(dev->regulator); | ||
| 681 | 676 | ||
| 682 | dev->busy = false; | 677 | dev->busy = false; |
| 683 | 678 | ||
| @@ -920,18 +915,42 @@ static struct nmk_i2c_controller u8500_i2c = { | |||
| 920 | .sm = I2C_FREQ_MODE_FAST, | 915 | .sm = I2C_FREQ_MODE_FAST, |
| 921 | }; | 916 | }; |
| 922 | 917 | ||
| 918 | static void nmk_i2c_of_probe(struct device_node *np, | ||
| 919 | struct nmk_i2c_controller *pdata) | ||
| 920 | { | ||
| 921 | of_property_read_u32(np, "clock-frequency", &pdata->clk_freq); | ||
| 922 | |||
| 923 | /* This driver only supports 'standard' and 'fast' modes of operation. */ | ||
| 924 | if (pdata->clk_freq <= 100000) | ||
| 925 | pdata->sm = I2C_FREQ_MODE_STANDARD; | ||
| 926 | else | ||
| 927 | pdata->sm = I2C_FREQ_MODE_FAST; | ||
| 928 | } | ||
| 929 | |||
| 923 | static atomic_t adapter_id = ATOMIC_INIT(0); | 930 | static atomic_t adapter_id = ATOMIC_INIT(0); |
| 924 | 931 | ||
| 925 | static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) | 932 | static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) |
| 926 | { | 933 | { |
| 927 | int ret = 0; | 934 | int ret = 0; |
| 928 | struct nmk_i2c_controller *pdata = adev->dev.platform_data; | 935 | struct nmk_i2c_controller *pdata = adev->dev.platform_data; |
| 936 | struct device_node *np = adev->dev.of_node; | ||
| 929 | struct nmk_i2c_dev *dev; | 937 | struct nmk_i2c_dev *dev; |
| 930 | struct i2c_adapter *adap; | 938 | struct i2c_adapter *adap; |
| 931 | 939 | ||
| 932 | if (!pdata) | 940 | if (!pdata) { |
| 933 | /* No i2c configuration found, using the default. */ | 941 | if (np) { |
| 934 | pdata = &u8500_i2c; | 942 | pdata = devm_kzalloc(&adev->dev, sizeof(*pdata), GFP_KERNEL); |
| 943 | if (!pdata) { | ||
| 944 | ret = -ENOMEM; | ||
| 945 | goto err_no_mem; | ||
| 946 | } | ||
| 947 | /* Provide the default configuration as a base. */ | ||
| 948 | memcpy(pdata, &u8500_i2c, sizeof(struct nmk_i2c_controller)); | ||
| 949 | nmk_i2c_of_probe(np, pdata); | ||
| 950 | } else | ||
| 951 | /* No i2c configuration found, using the default. */ | ||
| 952 | pdata = &u8500_i2c; | ||
| 953 | } | ||
| 935 | 954 | ||
| 936 | dev = kzalloc(sizeof(struct nmk_i2c_dev), GFP_KERNEL); | 955 | dev = kzalloc(sizeof(struct nmk_i2c_dev), GFP_KERNEL); |
| 937 | if (!dev) { | 956 | if (!dev) { |
| @@ -957,12 +976,6 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 957 | goto err_irq; | 976 | goto err_irq; |
| 958 | } | 977 | } |
| 959 | 978 | ||
| 960 | dev->regulator = regulator_get(&adev->dev, "v-i2c"); | ||
| 961 | if (IS_ERR(dev->regulator)) { | ||
| 962 | dev_warn(&adev->dev, "could not get i2c regulator\n"); | ||
| 963 | dev->regulator = NULL; | ||
| 964 | } | ||
| 965 | |||
| 966 | pm_suspend_ignore_children(&adev->dev, true); | 979 | pm_suspend_ignore_children(&adev->dev, true); |
| 967 | 980 | ||
| 968 | dev->clk = clk_get(&adev->dev, NULL); | 981 | dev->clk = clk_get(&adev->dev, NULL); |
| @@ -973,6 +986,7 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 973 | } | 986 | } |
| 974 | 987 | ||
| 975 | adap = &dev->adap; | 988 | adap = &dev->adap; |
| 989 | adap->dev.of_node = np; | ||
| 976 | adap->dev.parent = &adev->dev; | 990 | adap->dev.parent = &adev->dev; |
| 977 | adap->owner = THIS_MODULE; | 991 | adap->owner = THIS_MODULE; |
| 978 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; | 992 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; |
| @@ -1002,6 +1016,8 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 1002 | goto err_add_adap; | 1016 | goto err_add_adap; |
| 1003 | } | 1017 | } |
| 1004 | 1018 | ||
| 1019 | of_i2c_register_devices(adap); | ||
| 1020 | |||
| 1005 | pm_runtime_put(&adev->dev); | 1021 | pm_runtime_put(&adev->dev); |
| 1006 | 1022 | ||
| 1007 | return 0; | 1023 | return 0; |
| @@ -1009,8 +1025,6 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 1009 | err_add_adap: | 1025 | err_add_adap: |
| 1010 | clk_put(dev->clk); | 1026 | clk_put(dev->clk); |
| 1011 | err_no_clk: | 1027 | err_no_clk: |
| 1012 | if (dev->regulator) | ||
| 1013 | regulator_put(dev->regulator); | ||
| 1014 | free_irq(dev->irq, dev); | 1028 | free_irq(dev->irq, dev); |
| 1015 | err_irq: | 1029 | err_irq: |
| 1016 | iounmap(dev->virtbase); | 1030 | iounmap(dev->virtbase); |
| @@ -1038,8 +1052,6 @@ static int nmk_i2c_remove(struct amba_device *adev) | |||
| 1038 | if (res) | 1052 | if (res) |
| 1039 | release_mem_region(res->start, resource_size(res)); | 1053 | release_mem_region(res->start, resource_size(res)); |
| 1040 | clk_put(dev->clk); | 1054 | clk_put(dev->clk); |
| 1041 | if (dev->regulator) | ||
| 1042 | regulator_put(dev->regulator); | ||
| 1043 | pm_runtime_disable(&adev->dev); | 1055 | pm_runtime_disable(&adev->dev); |
| 1044 | amba_set_drvdata(adev, NULL); | 1056 | amba_set_drvdata(adev, NULL); |
| 1045 | kfree(dev); | 1057 | kfree(dev); |
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index a0e49f6aaf96..db31eaed6ea5 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -43,6 +43,7 @@ | |||
| 43 | #include <linux/slab.h> | 43 | #include <linux/slab.h> |
| 44 | #include <linux/i2c-omap.h> | 44 | #include <linux/i2c-omap.h> |
| 45 | #include <linux/pm_runtime.h> | 45 | #include <linux/pm_runtime.h> |
| 46 | #include <linux/pm_qos.h> | ||
| 46 | 47 | ||
| 47 | /* I2C controller revisions */ | 48 | /* I2C controller revisions */ |
| 48 | #define OMAP_I2C_OMAP1_REV_2 0x20 | 49 | #define OMAP_I2C_OMAP1_REV_2 0x20 |
| @@ -55,6 +56,9 @@ | |||
| 55 | /* timeout waiting for the controller to respond */ | 56 | /* timeout waiting for the controller to respond */ |
| 56 | #define OMAP_I2C_TIMEOUT (msecs_to_jiffies(1000)) | 57 | #define OMAP_I2C_TIMEOUT (msecs_to_jiffies(1000)) |
| 57 | 58 | ||
| 59 | /* timeout for pm runtime autosuspend */ | ||
| 60 | #define OMAP_I2C_PM_TIMEOUT 1000 /* ms */ | ||
| 61 | |||
| 58 | /* For OMAP3 I2C_IV has changed to I2C_WE (wakeup enable) */ | 62 | /* For OMAP3 I2C_IV has changed to I2C_WE (wakeup enable) */ |
| 59 | enum { | 63 | enum { |
| 60 | OMAP_I2C_REV_REG = 0, | 64 | OMAP_I2C_REV_REG = 0, |
| @@ -176,15 +180,15 @@ enum { | |||
| 176 | #define I2C_OMAP_ERRATA_I462 (1 << 1) | 180 | #define I2C_OMAP_ERRATA_I462 (1 << 1) |
| 177 | 181 | ||
| 178 | struct omap_i2c_dev { | 182 | struct omap_i2c_dev { |
| 183 | spinlock_t lock; /* IRQ synchronization */ | ||
| 179 | struct device *dev; | 184 | struct device *dev; |
| 180 | void __iomem *base; /* virtual */ | 185 | void __iomem *base; /* virtual */ |
| 181 | int irq; | 186 | int irq; |
| 182 | int reg_shift; /* bit shift for I2C register addresses */ | 187 | int reg_shift; /* bit shift for I2C register addresses */ |
| 183 | struct completion cmd_complete; | 188 | struct completion cmd_complete; |
| 184 | struct resource *ioarea; | 189 | struct resource *ioarea; |
| 185 | u32 latency; /* maximum mpu wkup latency */ | 190 | u32 latency; /* maximum MPU wkup latency */ |
| 186 | void (*set_mpu_wkup_lat)(struct device *dev, | 191 | struct pm_qos_request pm_qos_request; |
| 187 | long latency); | ||
| 188 | u32 speed; /* Speed of bus in kHz */ | 192 | u32 speed; /* Speed of bus in kHz */ |
| 189 | u32 dtrev; /* extra revision from DT */ | 193 | u32 dtrev; /* extra revision from DT */ |
| 190 | u32 flags; | 194 | u32 flags; |
| @@ -193,12 +197,14 @@ struct omap_i2c_dev { | |||
| 193 | u8 *regs; | 197 | u8 *regs; |
| 194 | size_t buf_len; | 198 | size_t buf_len; |
| 195 | struct i2c_adapter adapter; | 199 | struct i2c_adapter adapter; |
| 200 | u8 threshold; | ||
| 196 | u8 fifo_size; /* use as flag and value | 201 | u8 fifo_size; /* use as flag and value |
| 197 | * fifo_size==0 implies no fifo | 202 | * fifo_size==0 implies no fifo |
| 198 | * if set, should be trsh+1 | 203 | * if set, should be trsh+1 |
| 199 | */ | 204 | */ |
| 200 | u8 rev; | 205 | u8 rev; |
| 201 | unsigned b_hw:1; /* bad h/w fixes */ | 206 | unsigned b_hw:1; /* bad h/w fixes */ |
| 207 | unsigned receiver:1; /* true when we're in receiver mode */ | ||
| 202 | u16 iestate; /* Saved interrupt register */ | 208 | u16 iestate; /* Saved interrupt register */ |
| 203 | u16 pscstate; | 209 | u16 pscstate; |
| 204 | u16 scllstate; | 210 | u16 scllstate; |
| @@ -417,13 +423,6 @@ static int omap_i2c_init(struct omap_i2c_dev *dev) | |||
| 417 | omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, scll); | 423 | omap_i2c_write_reg(dev, OMAP_I2C_SCLL_REG, scll); |
| 418 | omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, sclh); | 424 | omap_i2c_write_reg(dev, OMAP_I2C_SCLH_REG, sclh); |
| 419 | 425 | ||
| 420 | if (dev->fifo_size) { | ||
| 421 | /* Note: setup required fifo size - 1. RTRSH and XTRSH */ | ||
| 422 | buf = (dev->fifo_size - 1) << 8 | OMAP_I2C_BUF_RXFIF_CLR | | ||
| 423 | (dev->fifo_size - 1) | OMAP_I2C_BUF_TXFIF_CLR; | ||
| 424 | omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, buf); | ||
| 425 | } | ||
| 426 | |||
| 427 | /* Take the I2C module out of reset: */ | 426 | /* Take the I2C module out of reset: */ |
| 428 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); | 427 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, OMAP_I2C_CON_EN); |
| 429 | 428 | ||
| @@ -461,6 +460,43 @@ static int omap_i2c_wait_for_bb(struct omap_i2c_dev *dev) | |||
| 461 | return 0; | 460 | return 0; |
| 462 | } | 461 | } |
| 463 | 462 | ||
| 463 | static void omap_i2c_resize_fifo(struct omap_i2c_dev *dev, u8 size, bool is_rx) | ||
| 464 | { | ||
| 465 | u16 buf; | ||
| 466 | |||
| 467 | if (dev->flags & OMAP_I2C_FLAG_NO_FIFO) | ||
| 468 | return; | ||
| 469 | |||
| 470 | /* | ||
| 471 | * Set up notification threshold based on message size. We're doing | ||
| 472 | * this to try and avoid draining feature as much as possible. Whenever | ||
| 473 | * we have big messages to transfer (bigger than our total fifo size) | ||
| 474 | * then we might use draining feature to transfer the remaining bytes. | ||
| 475 | */ | ||
| 476 | |||
| 477 | dev->threshold = clamp(size, (u8) 1, dev->fifo_size); | ||
| 478 | |||
| 479 | buf = omap_i2c_read_reg(dev, OMAP_I2C_BUF_REG); | ||
| 480 | |||
| 481 | if (is_rx) { | ||
| 482 | /* Clear RX Threshold */ | ||
| 483 | buf &= ~(0x3f << 8); | ||
| 484 | buf |= ((dev->threshold - 1) << 8) | OMAP_I2C_BUF_RXFIF_CLR; | ||
| 485 | } else { | ||
| 486 | /* Clear TX Threshold */ | ||
| 487 | buf &= ~0x3f; | ||
| 488 | buf |= (dev->threshold - 1) | OMAP_I2C_BUF_TXFIF_CLR; | ||
| 489 | } | ||
| 490 | |||
| 491 | omap_i2c_write_reg(dev, OMAP_I2C_BUF_REG, buf); | ||
| 492 | |||
| 493 | if (dev->rev < OMAP_I2C_REV_ON_3630_4430) | ||
| 494 | dev->b_hw = 1; /* Enable hardware fixes */ | ||
| 495 | |||
| 496 | /* calculate wakeup latency constraint for MPU */ | ||
| 497 | dev->latency = (1000000 * dev->threshold) / (1000 * dev->speed / 8); | ||
| 498 | } | ||
| 499 | |||
| 464 | /* | 500 | /* |
| 465 | * Low level master read/write transaction. | 501 | * Low level master read/write transaction. |
| 466 | */ | 502 | */ |
| @@ -477,6 +513,9 @@ static int omap_i2c_xfer_msg(struct i2c_adapter *adap, | |||
| 477 | if (msg->len == 0) | 513 | if (msg->len == 0) |
| 478 | return -EINVAL; | 514 | return -EINVAL; |
| 479 | 515 | ||
| 516 | dev->receiver = !!(msg->flags & I2C_M_RD); | ||
| 517 | omap_i2c_resize_fifo(dev, msg->len, dev->receiver); | ||
| 518 | |||
| 480 | omap_i2c_write_reg(dev, OMAP_I2C_SA_REG, msg->addr); | 519 | omap_i2c_write_reg(dev, OMAP_I2C_SA_REG, msg->addr); |
| 481 | 520 | ||
| 482 | /* REVISIT: Could the STB bit of I2C_CON be used with probing? */ | 521 | /* REVISIT: Could the STB bit of I2C_CON be used with probing? */ |
| @@ -590,8 +629,16 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
| 590 | if (r < 0) | 629 | if (r < 0) |
| 591 | goto out; | 630 | goto out; |
| 592 | 631 | ||
| 593 | if (dev->set_mpu_wkup_lat != NULL) | 632 | /* |
| 594 | dev->set_mpu_wkup_lat(dev->dev, dev->latency); | 633 | * When waiting for completion of a i2c transfer, we need to |
| 634 | * set a wake up latency constraint for the MPU. This is to | ||
| 635 | * ensure quick enough wakeup from idle, when transfer | ||
| 636 | * completes. | ||
| 637 | */ | ||
| 638 | if (dev->latency) | ||
| 639 | pm_qos_add_request(&dev->pm_qos_request, | ||
| 640 | PM_QOS_CPU_DMA_LATENCY, | ||
| 641 | dev->latency); | ||
| 595 | 642 | ||
| 596 | for (i = 0; i < num; i++) { | 643 | for (i = 0; i < num; i++) { |
| 597 | r = omap_i2c_xfer_msg(adap, &msgs[i], (i == (num - 1))); | 644 | r = omap_i2c_xfer_msg(adap, &msgs[i], (i == (num - 1))); |
| @@ -599,15 +646,16 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
| 599 | break; | 646 | break; |
| 600 | } | 647 | } |
| 601 | 648 | ||
| 602 | if (dev->set_mpu_wkup_lat != NULL) | 649 | if (dev->latency) |
| 603 | dev->set_mpu_wkup_lat(dev->dev, -1); | 650 | pm_qos_remove_request(&dev->pm_qos_request); |
| 604 | 651 | ||
| 605 | if (r == 0) | 652 | if (r == 0) |
| 606 | r = num; | 653 | r = num; |
| 607 | 654 | ||
| 608 | omap_i2c_wait_for_bb(dev); | 655 | omap_i2c_wait_for_bb(dev); |
| 609 | out: | 656 | out: |
| 610 | pm_runtime_put(dev->dev); | 657 | pm_runtime_mark_last_busy(dev->dev); |
| 658 | pm_runtime_put_autosuspend(dev->dev); | ||
| 611 | return r; | 659 | return r; |
| 612 | } | 660 | } |
| 613 | 661 | ||
| @@ -725,186 +773,252 @@ omap_i2c_omap1_isr(int this_irq, void *dev_id) | |||
| 725 | * data to DATA_REG. Otherwise some data bytes can be lost while transferring | 773 | * data to DATA_REG. Otherwise some data bytes can be lost while transferring |
| 726 | * them from the memory to the I2C interface. | 774 | * them from the memory to the I2C interface. |
| 727 | */ | 775 | */ |
| 728 | static int errata_omap3_i462(struct omap_i2c_dev *dev, u16 *stat, int *err) | 776 | static int errata_omap3_i462(struct omap_i2c_dev *dev) |
| 729 | { | 777 | { |
| 730 | unsigned long timeout = 10000; | 778 | unsigned long timeout = 10000; |
| 779 | u16 stat; | ||
| 731 | 780 | ||
| 732 | while (--timeout && !(*stat & OMAP_I2C_STAT_XUDF)) { | 781 | do { |
| 733 | if (*stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { | 782 | stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); |
| 734 | omap_i2c_ack_stat(dev, *stat & (OMAP_I2C_STAT_XRDY | | 783 | if (stat & OMAP_I2C_STAT_XUDF) |
| 784 | break; | ||
| 785 | |||
| 786 | if (stat & (OMAP_I2C_STAT_NACK | OMAP_I2C_STAT_AL)) { | ||
| 787 | omap_i2c_ack_stat(dev, (OMAP_I2C_STAT_XRDY | | ||
| 735 | OMAP_I2C_STAT_XDR)); | 788 | OMAP_I2C_STAT_XDR)); |
| 736 | return -ETIMEDOUT; | 789 | if (stat & OMAP_I2C_STAT_NACK) { |
| 790 | dev->cmd_err |= OMAP_I2C_STAT_NACK; | ||
| 791 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); | ||
| 792 | } | ||
| 793 | |||
| 794 | if (stat & OMAP_I2C_STAT_AL) { | ||
| 795 | dev_err(dev->dev, "Arbitration lost\n"); | ||
| 796 | dev->cmd_err |= OMAP_I2C_STAT_AL; | ||
| 797 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); | ||
| 798 | } | ||
| 799 | |||
| 800 | return -EIO; | ||
| 737 | } | 801 | } |
| 738 | 802 | ||
| 739 | cpu_relax(); | 803 | cpu_relax(); |
| 740 | *stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); | 804 | } while (--timeout); |
| 741 | } | ||
| 742 | 805 | ||
| 743 | if (!timeout) { | 806 | if (!timeout) { |
| 744 | dev_err(dev->dev, "timeout waiting on XUDF bit\n"); | 807 | dev_err(dev->dev, "timeout waiting on XUDF bit\n"); |
| 745 | return 0; | 808 | return 0; |
| 746 | } | 809 | } |
| 747 | 810 | ||
| 748 | *err |= OMAP_I2C_STAT_XUDF; | ||
| 749 | return 0; | 811 | return 0; |
| 750 | } | 812 | } |
| 751 | 813 | ||
| 814 | static void omap_i2c_receive_data(struct omap_i2c_dev *dev, u8 num_bytes, | ||
| 815 | bool is_rdr) | ||
| 816 | { | ||
| 817 | u16 w; | ||
| 818 | |||
| 819 | while (num_bytes--) { | ||
| 820 | w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG); | ||
| 821 | *dev->buf++ = w; | ||
| 822 | dev->buf_len--; | ||
| 823 | |||
| 824 | /* | ||
| 825 | * Data reg in 2430, omap3 and | ||
| 826 | * omap4 is 8 bit wide | ||
| 827 | */ | ||
| 828 | if (dev->flags & OMAP_I2C_FLAG_16BIT_DATA_REG) { | ||
| 829 | *dev->buf++ = w >> 8; | ||
| 830 | dev->buf_len--; | ||
| 831 | } | ||
| 832 | } | ||
| 833 | } | ||
| 834 | |||
| 835 | static int omap_i2c_transmit_data(struct omap_i2c_dev *dev, u8 num_bytes, | ||
| 836 | bool is_xdr) | ||
| 837 | { | ||
| 838 | u16 w; | ||
| 839 | |||
| 840 | while (num_bytes--) { | ||
| 841 | w = *dev->buf++; | ||
| 842 | dev->buf_len--; | ||
| 843 | |||
| 844 | /* | ||
| 845 | * Data reg in 2430, omap3 and | ||
| 846 | * omap4 is 8 bit wide | ||
| 847 | */ | ||
| 848 | if (dev->flags & OMAP_I2C_FLAG_16BIT_DATA_REG) { | ||
| 849 | w |= *dev->buf++ << 8; | ||
| 850 | dev->buf_len--; | ||
| 851 | } | ||
| 852 | |||
| 853 | if (dev->errata & I2C_OMAP_ERRATA_I462) { | ||
| 854 | int ret; | ||
| 855 | |||
| 856 | ret = errata_omap3_i462(dev); | ||
| 857 | if (ret < 0) | ||
| 858 | return ret; | ||
| 859 | } | ||
| 860 | |||
| 861 | omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); | ||
| 862 | } | ||
| 863 | |||
| 864 | return 0; | ||
| 865 | } | ||
| 866 | |||
| 867 | static irqreturn_t | ||
| 868 | omap_i2c_isr(int irq, void *dev_id) | ||
| 869 | { | ||
| 870 | struct omap_i2c_dev *dev = dev_id; | ||
| 871 | irqreturn_t ret = IRQ_HANDLED; | ||
| 872 | u16 mask; | ||
| 873 | u16 stat; | ||
| 874 | |||
| 875 | spin_lock(&dev->lock); | ||
| 876 | mask = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); | ||
| 877 | stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); | ||
| 878 | |||
| 879 | if (stat & mask) | ||
| 880 | ret = IRQ_WAKE_THREAD; | ||
| 881 | |||
| 882 | spin_unlock(&dev->lock); | ||
| 883 | |||
| 884 | return ret; | ||
| 885 | } | ||
| 886 | |||
| 752 | static irqreturn_t | 887 | static irqreturn_t |
| 753 | omap_i2c_isr(int this_irq, void *dev_id) | 888 | omap_i2c_isr_thread(int this_irq, void *dev_id) |
| 754 | { | 889 | { |
| 755 | struct omap_i2c_dev *dev = dev_id; | 890 | struct omap_i2c_dev *dev = dev_id; |
| 891 | unsigned long flags; | ||
| 756 | u16 bits; | 892 | u16 bits; |
| 757 | u16 stat, w; | 893 | u16 stat; |
| 758 | int err, count = 0; | 894 | int err = 0, count = 0; |
| 895 | |||
| 896 | spin_lock_irqsave(&dev->lock, flags); | ||
| 897 | do { | ||
| 898 | bits = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); | ||
| 899 | stat = omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG); | ||
| 900 | stat &= bits; | ||
| 901 | |||
| 902 | /* If we're in receiver mode, ignore XDR/XRDY */ | ||
| 903 | if (dev->receiver) | ||
| 904 | stat &= ~(OMAP_I2C_STAT_XDR | OMAP_I2C_STAT_XRDY); | ||
| 905 | else | ||
| 906 | stat &= ~(OMAP_I2C_STAT_RDR | OMAP_I2C_STAT_RRDY); | ||
| 759 | 907 | ||
| 760 | if (pm_runtime_suspended(dev->dev)) | 908 | if (!stat) { |
| 761 | return IRQ_NONE; | 909 | /* my work here is done */ |
| 910 | goto out; | ||
| 911 | } | ||
| 762 | 912 | ||
| 763 | bits = omap_i2c_read_reg(dev, OMAP_I2C_IE_REG); | ||
| 764 | while ((stat = (omap_i2c_read_reg(dev, OMAP_I2C_STAT_REG))) & bits) { | ||
| 765 | dev_dbg(dev->dev, "IRQ (ISR = 0x%04x)\n", stat); | 913 | dev_dbg(dev->dev, "IRQ (ISR = 0x%04x)\n", stat); |
| 766 | if (count++ == 100) { | 914 | if (count++ == 100) { |
| 767 | dev_warn(dev->dev, "Too much work in one IRQ\n"); | 915 | dev_warn(dev->dev, "Too much work in one IRQ\n"); |
| 768 | break; | 916 | break; |
| 769 | } | 917 | } |
| 770 | 918 | ||
| 771 | err = 0; | 919 | if (stat & OMAP_I2C_STAT_NACK) { |
| 772 | complete: | ||
| 773 | /* | ||
| 774 | * Ack the stat in one go, but [R/X]DR and [R/X]RDY should be | ||
| 775 | * acked after the data operation is complete. | ||
| 776 | * Ref: TRM SWPU114Q Figure 18-31 | ||
| 777 | */ | ||
| 778 | omap_i2c_write_reg(dev, OMAP_I2C_STAT_REG, stat & | ||
| 779 | ~(OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR | | ||
| 780 | OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); | ||
| 781 | |||
| 782 | if (stat & OMAP_I2C_STAT_NACK) | ||
| 783 | err |= OMAP_I2C_STAT_NACK; | 920 | err |= OMAP_I2C_STAT_NACK; |
| 921 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_NACK); | ||
| 922 | break; | ||
| 923 | } | ||
| 784 | 924 | ||
| 785 | if (stat & OMAP_I2C_STAT_AL) { | 925 | if (stat & OMAP_I2C_STAT_AL) { |
| 786 | dev_err(dev->dev, "Arbitration lost\n"); | 926 | dev_err(dev->dev, "Arbitration lost\n"); |
| 787 | err |= OMAP_I2C_STAT_AL; | 927 | err |= OMAP_I2C_STAT_AL; |
| 928 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_AL); | ||
| 929 | break; | ||
| 788 | } | 930 | } |
| 931 | |||
| 789 | /* | 932 | /* |
| 790 | * ProDB0017052: Clear ARDY bit twice | 933 | * ProDB0017052: Clear ARDY bit twice |
| 791 | */ | 934 | */ |
| 792 | if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK | | 935 | if (stat & (OMAP_I2C_STAT_ARDY | OMAP_I2C_STAT_NACK | |
| 793 | OMAP_I2C_STAT_AL)) { | 936 | OMAP_I2C_STAT_AL)) { |
| 794 | omap_i2c_ack_stat(dev, stat & | 937 | omap_i2c_ack_stat(dev, (OMAP_I2C_STAT_RRDY | |
| 795 | (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR | | 938 | OMAP_I2C_STAT_RDR | |
| 796 | OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR | | 939 | OMAP_I2C_STAT_XRDY | |
| 797 | OMAP_I2C_STAT_ARDY)); | 940 | OMAP_I2C_STAT_XDR | |
| 798 | omap_i2c_complete_cmd(dev, err); | 941 | OMAP_I2C_STAT_ARDY)); |
| 799 | return IRQ_HANDLED; | 942 | break; |
| 800 | } | 943 | } |
| 801 | if (stat & (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR)) { | 944 | |
| 945 | if (stat & OMAP_I2C_STAT_RDR) { | ||
| 802 | u8 num_bytes = 1; | 946 | u8 num_bytes = 1; |
| 803 | 947 | ||
| 948 | if (dev->fifo_size) | ||
| 949 | num_bytes = dev->buf_len; | ||
| 950 | |||
| 951 | omap_i2c_receive_data(dev, num_bytes, true); | ||
| 952 | |||
| 804 | if (dev->errata & I2C_OMAP_ERRATA_I207) | 953 | if (dev->errata & I2C_OMAP_ERRATA_I207) |
| 805 | i2c_omap_errata_i207(dev, stat); | 954 | i2c_omap_errata_i207(dev, stat); |
| 806 | 955 | ||
| 807 | if (dev->fifo_size) { | 956 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RDR); |
| 808 | if (stat & OMAP_I2C_STAT_RRDY) | 957 | break; |
| 809 | num_bytes = dev->fifo_size; | 958 | } |
| 810 | else /* read RXSTAT on RDR interrupt */ | 959 | |
| 811 | num_bytes = (omap_i2c_read_reg(dev, | 960 | if (stat & OMAP_I2C_STAT_RRDY) { |
| 812 | OMAP_I2C_BUFSTAT_REG) | 961 | u8 num_bytes = 1; |
| 813 | >> 8) & 0x3F; | 962 | |
| 814 | } | 963 | if (dev->threshold) |
| 815 | while (num_bytes) { | 964 | num_bytes = dev->threshold; |
| 816 | num_bytes--; | 965 | |
| 817 | w = omap_i2c_read_reg(dev, OMAP_I2C_DATA_REG); | 966 | omap_i2c_receive_data(dev, num_bytes, false); |
| 818 | if (dev->buf_len) { | 967 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_RRDY); |
| 819 | *dev->buf++ = w; | ||
| 820 | dev->buf_len--; | ||
| 821 | /* | ||
| 822 | * Data reg in 2430, omap3 and | ||
| 823 | * omap4 is 8 bit wide | ||
| 824 | */ | ||
| 825 | if (dev->flags & | ||
| 826 | OMAP_I2C_FLAG_16BIT_DATA_REG) { | ||
| 827 | if (dev->buf_len) { | ||
| 828 | *dev->buf++ = w >> 8; | ||
| 829 | dev->buf_len--; | ||
| 830 | } | ||
| 831 | } | ||
| 832 | } else { | ||
| 833 | if (stat & OMAP_I2C_STAT_RRDY) | ||
| 834 | dev_err(dev->dev, | ||
| 835 | "RRDY IRQ while no data" | ||
| 836 | " requested\n"); | ||
| 837 | if (stat & OMAP_I2C_STAT_RDR) | ||
| 838 | dev_err(dev->dev, | ||
| 839 | "RDR IRQ while no data" | ||
| 840 | " requested\n"); | ||
| 841 | break; | ||
| 842 | } | ||
| 843 | } | ||
| 844 | omap_i2c_ack_stat(dev, | ||
| 845 | stat & (OMAP_I2C_STAT_RRDY | OMAP_I2C_STAT_RDR)); | ||
| 846 | continue; | 968 | continue; |
| 847 | } | 969 | } |
| 848 | if (stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)) { | 970 | |
| 971 | if (stat & OMAP_I2C_STAT_XDR) { | ||
| 849 | u8 num_bytes = 1; | 972 | u8 num_bytes = 1; |
| 850 | if (dev->fifo_size) { | 973 | int ret; |
| 851 | if (stat & OMAP_I2C_STAT_XRDY) | 974 | |
| 852 | num_bytes = dev->fifo_size; | 975 | if (dev->fifo_size) |
| 853 | else /* read TXSTAT on XDR interrupt */ | 976 | num_bytes = dev->buf_len; |
| 854 | num_bytes = omap_i2c_read_reg(dev, | 977 | |
| 855 | OMAP_I2C_BUFSTAT_REG) | 978 | ret = omap_i2c_transmit_data(dev, num_bytes, true); |
| 856 | & 0x3F; | 979 | if (ret < 0) |
| 857 | } | 980 | break; |
| 858 | while (num_bytes) { | 981 | |
| 859 | num_bytes--; | 982 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XDR); |
| 860 | w = 0; | 983 | break; |
| 861 | if (dev->buf_len) { | 984 | } |
| 862 | w = *dev->buf++; | 985 | |
| 863 | dev->buf_len--; | 986 | if (stat & OMAP_I2C_STAT_XRDY) { |
| 864 | /* | 987 | u8 num_bytes = 1; |
| 865 | * Data reg in 2430, omap3 and | 988 | int ret; |
| 866 | * omap4 is 8 bit wide | 989 | |
| 867 | */ | 990 | if (dev->threshold) |
| 868 | if (dev->flags & | 991 | num_bytes = dev->threshold; |
| 869 | OMAP_I2C_FLAG_16BIT_DATA_REG) { | 992 | |
| 870 | if (dev->buf_len) { | 993 | ret = omap_i2c_transmit_data(dev, num_bytes, false); |
| 871 | w |= *dev->buf++ << 8; | 994 | if (ret < 0) |
| 872 | dev->buf_len--; | 995 | break; |
| 873 | } | 996 | |
| 874 | } | 997 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XRDY); |
| 875 | } else { | ||
| 876 | if (stat & OMAP_I2C_STAT_XRDY) | ||
| 877 | dev_err(dev->dev, | ||
| 878 | "XRDY IRQ while no " | ||
| 879 | "data to send\n"); | ||
| 880 | if (stat & OMAP_I2C_STAT_XDR) | ||
| 881 | dev_err(dev->dev, | ||
| 882 | "XDR IRQ while no " | ||
| 883 | "data to send\n"); | ||
| 884 | break; | ||
| 885 | } | ||
| 886 | |||
| 887 | if ((dev->errata & I2C_OMAP_ERRATA_I462) && | ||
| 888 | errata_omap3_i462(dev, &stat, &err)) | ||
| 889 | goto complete; | ||
| 890 | |||
| 891 | omap_i2c_write_reg(dev, OMAP_I2C_DATA_REG, w); | ||
| 892 | } | ||
| 893 | omap_i2c_ack_stat(dev, | ||
| 894 | stat & (OMAP_I2C_STAT_XRDY | OMAP_I2C_STAT_XDR)); | ||
| 895 | continue; | 998 | continue; |
| 896 | } | 999 | } |
| 1000 | |||
| 897 | if (stat & OMAP_I2C_STAT_ROVR) { | 1001 | if (stat & OMAP_I2C_STAT_ROVR) { |
| 898 | dev_err(dev->dev, "Receive overrun\n"); | 1002 | dev_err(dev->dev, "Receive overrun\n"); |
| 899 | dev->cmd_err |= OMAP_I2C_STAT_ROVR; | 1003 | err |= OMAP_I2C_STAT_ROVR; |
| 1004 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_ROVR); | ||
| 1005 | break; | ||
| 900 | } | 1006 | } |
| 1007 | |||
| 901 | if (stat & OMAP_I2C_STAT_XUDF) { | 1008 | if (stat & OMAP_I2C_STAT_XUDF) { |
| 902 | dev_err(dev->dev, "Transmit underflow\n"); | 1009 | dev_err(dev->dev, "Transmit underflow\n"); |
| 903 | dev->cmd_err |= OMAP_I2C_STAT_XUDF; | 1010 | err |= OMAP_I2C_STAT_XUDF; |
| 1011 | omap_i2c_ack_stat(dev, OMAP_I2C_STAT_XUDF); | ||
| 1012 | break; | ||
| 904 | } | 1013 | } |
| 905 | } | 1014 | } while (stat); |
| 1015 | |||
| 1016 | omap_i2c_complete_cmd(dev, err); | ||
| 1017 | |||
| 1018 | out: | ||
| 1019 | spin_unlock_irqrestore(&dev->lock, flags); | ||
| 906 | 1020 | ||
| 907 | return count ? IRQ_HANDLED : IRQ_NONE; | 1021 | return IRQ_HANDLED; |
| 908 | } | 1022 | } |
| 909 | 1023 | ||
| 910 | static const struct i2c_algorithm omap_i2c_algo = { | 1024 | static const struct i2c_algorithm omap_i2c_algo = { |
| @@ -943,12 +1057,12 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 943 | { | 1057 | { |
| 944 | struct omap_i2c_dev *dev; | 1058 | struct omap_i2c_dev *dev; |
| 945 | struct i2c_adapter *adap; | 1059 | struct i2c_adapter *adap; |
| 946 | struct resource *mem, *irq, *ioarea; | 1060 | struct resource *mem; |
| 947 | const struct omap_i2c_bus_platform_data *pdata = | 1061 | const struct omap_i2c_bus_platform_data *pdata = |
| 948 | pdev->dev.platform_data; | 1062 | pdev->dev.platform_data; |
| 949 | struct device_node *node = pdev->dev.of_node; | 1063 | struct device_node *node = pdev->dev.of_node; |
| 950 | const struct of_device_id *match; | 1064 | const struct of_device_id *match; |
| 951 | irq_handler_t isr; | 1065 | int irq; |
| 952 | int r; | 1066 | int r; |
| 953 | 1067 | ||
| 954 | /* NOTE: driver uses the static register mapping */ | 1068 | /* NOTE: driver uses the static register mapping */ |
| @@ -957,23 +1071,23 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 957 | dev_err(&pdev->dev, "no mem resource?\n"); | 1071 | dev_err(&pdev->dev, "no mem resource?\n"); |
| 958 | return -ENODEV; | 1072 | return -ENODEV; |
| 959 | } | 1073 | } |
| 960 | irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0); | 1074 | |
| 961 | if (!irq) { | 1075 | irq = platform_get_irq(pdev, 0); |
| 1076 | if (irq < 0) { | ||
| 962 | dev_err(&pdev->dev, "no irq resource?\n"); | 1077 | dev_err(&pdev->dev, "no irq resource?\n"); |
| 963 | return -ENODEV; | 1078 | return irq; |
| 964 | } | 1079 | } |
| 965 | 1080 | ||
| 966 | ioarea = request_mem_region(mem->start, resource_size(mem), | 1081 | dev = devm_kzalloc(&pdev->dev, sizeof(struct omap_i2c_dev), GFP_KERNEL); |
| 967 | pdev->name); | 1082 | if (!dev) { |
| 968 | if (!ioarea) { | 1083 | dev_err(&pdev->dev, "Menory allocation failed\n"); |
| 969 | dev_err(&pdev->dev, "I2C region already claimed\n"); | 1084 | return -ENOMEM; |
| 970 | return -EBUSY; | ||
| 971 | } | 1085 | } |
| 972 | 1086 | ||
| 973 | dev = kzalloc(sizeof(struct omap_i2c_dev), GFP_KERNEL); | 1087 | dev->base = devm_request_and_ioremap(&pdev->dev, mem); |
| 974 | if (!dev) { | 1088 | if (!dev->base) { |
| 975 | r = -ENOMEM; | 1089 | dev_err(&pdev->dev, "I2C region already claimed\n"); |
| 976 | goto err_release_region; | 1090 | return -ENOMEM; |
| 977 | } | 1091 | } |
| 978 | 1092 | ||
| 979 | match = of_match_device(of_match_ptr(omap_i2c_of_match), &pdev->dev); | 1093 | match = of_match_device(of_match_ptr(omap_i2c_of_match), &pdev->dev); |
| @@ -990,17 +1104,13 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 990 | } else if (pdata != NULL) { | 1104 | } else if (pdata != NULL) { |
| 991 | dev->speed = pdata->clkrate; | 1105 | dev->speed = pdata->clkrate; |
| 992 | dev->flags = pdata->flags; | 1106 | dev->flags = pdata->flags; |
| 993 | dev->set_mpu_wkup_lat = pdata->set_mpu_wkup_lat; | ||
| 994 | dev->dtrev = pdata->rev; | 1107 | dev->dtrev = pdata->rev; |
| 995 | } | 1108 | } |
| 996 | 1109 | ||
| 997 | dev->dev = &pdev->dev; | 1110 | dev->dev = &pdev->dev; |
| 998 | dev->irq = irq->start; | 1111 | dev->irq = irq; |
| 999 | dev->base = ioremap(mem->start, resource_size(mem)); | 1112 | |
| 1000 | if (!dev->base) { | 1113 | spin_lock_init(&dev->lock); |
| 1001 | r = -ENOMEM; | ||
| 1002 | goto err_free_mem; | ||
| 1003 | } | ||
| 1004 | 1114 | ||
| 1005 | platform_set_drvdata(pdev, dev); | 1115 | platform_set_drvdata(pdev, dev); |
| 1006 | init_completion(&dev->cmd_complete); | 1116 | init_completion(&dev->cmd_complete); |
| @@ -1013,6 +1123,9 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 1013 | dev->regs = (u8 *)reg_map_ip_v1; | 1123 | dev->regs = (u8 *)reg_map_ip_v1; |
| 1014 | 1124 | ||
| 1015 | pm_runtime_enable(dev->dev); | 1125 | pm_runtime_enable(dev->dev); |
| 1126 | pm_runtime_set_autosuspend_delay(dev->dev, OMAP_I2C_PM_TIMEOUT); | ||
| 1127 | pm_runtime_use_autosuspend(dev->dev); | ||
| 1128 | |||
| 1016 | r = pm_runtime_get_sync(dev->dev); | 1129 | r = pm_runtime_get_sync(dev->dev); |
| 1017 | if (IS_ERR_VALUE(r)) | 1130 | if (IS_ERR_VALUE(r)) |
| 1018 | goto err_free_mem; | 1131 | goto err_free_mem; |
| @@ -1042,32 +1155,31 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 1042 | 1155 | ||
| 1043 | dev->fifo_size = (dev->fifo_size / 2); | 1156 | dev->fifo_size = (dev->fifo_size / 2); |
| 1044 | 1157 | ||
| 1045 | if (dev->rev >= OMAP_I2C_REV_ON_3630_4430) | 1158 | if (dev->rev < OMAP_I2C_REV_ON_3630_4430) |
| 1046 | dev->b_hw = 0; /* Disable hardware fixes */ | ||
| 1047 | else | ||
| 1048 | dev->b_hw = 1; /* Enable hardware fixes */ | 1159 | dev->b_hw = 1; /* Enable hardware fixes */ |
| 1049 | 1160 | ||
| 1050 | /* calculate wakeup latency constraint for MPU */ | 1161 | /* calculate wakeup latency constraint for MPU */ |
| 1051 | if (dev->set_mpu_wkup_lat != NULL) | 1162 | dev->latency = (1000000 * dev->fifo_size) / |
| 1052 | dev->latency = (1000000 * dev->fifo_size) / | 1163 | (1000 * dev->speed / 8); |
| 1053 | (1000 * dev->speed / 8); | ||
| 1054 | } | 1164 | } |
| 1055 | 1165 | ||
| 1056 | /* reset ASAP, clearing any IRQs */ | 1166 | /* reset ASAP, clearing any IRQs */ |
| 1057 | omap_i2c_init(dev); | 1167 | omap_i2c_init(dev); |
| 1058 | 1168 | ||
| 1059 | isr = (dev->rev < OMAP_I2C_OMAP1_REV_2) ? omap_i2c_omap1_isr : | 1169 | if (dev->rev < OMAP_I2C_OMAP1_REV_2) |
| 1060 | omap_i2c_isr; | 1170 | r = devm_request_irq(&pdev->dev, dev->irq, omap_i2c_omap1_isr, |
| 1061 | r = request_irq(dev->irq, isr, IRQF_NO_SUSPEND, pdev->name, dev); | 1171 | IRQF_NO_SUSPEND, pdev->name, dev); |
| 1172 | else | ||
| 1173 | r = devm_request_threaded_irq(&pdev->dev, dev->irq, | ||
| 1174 | omap_i2c_isr, omap_i2c_isr_thread, | ||
| 1175 | IRQF_NO_SUSPEND | IRQF_ONESHOT, | ||
| 1176 | pdev->name, dev); | ||
| 1062 | 1177 | ||
| 1063 | if (r) { | 1178 | if (r) { |
| 1064 | dev_err(dev->dev, "failure requesting irq %i\n", dev->irq); | 1179 | dev_err(dev->dev, "failure requesting irq %i\n", dev->irq); |
| 1065 | goto err_unuse_clocks; | 1180 | goto err_unuse_clocks; |
| 1066 | } | 1181 | } |
| 1067 | 1182 | ||
| 1068 | dev_info(dev->dev, "bus %d rev%d.%d.%d at %d kHz\n", pdev->id, | ||
| 1069 | dev->dtrev, dev->rev >> 4, dev->rev & 0xf, dev->speed); | ||
| 1070 | |||
| 1071 | adap = &dev->adapter; | 1183 | adap = &dev->adapter; |
| 1072 | i2c_set_adapdata(adap, dev); | 1184 | i2c_set_adapdata(adap, dev); |
| 1073 | adap->owner = THIS_MODULE; | 1185 | adap->owner = THIS_MODULE; |
| @@ -1082,27 +1194,25 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 1082 | r = i2c_add_numbered_adapter(adap); | 1194 | r = i2c_add_numbered_adapter(adap); |
| 1083 | if (r) { | 1195 | if (r) { |
| 1084 | dev_err(dev->dev, "failure adding adapter\n"); | 1196 | dev_err(dev->dev, "failure adding adapter\n"); |
| 1085 | goto err_free_irq; | 1197 | goto err_unuse_clocks; |
| 1086 | } | 1198 | } |
| 1087 | 1199 | ||
| 1200 | dev_info(dev->dev, "bus %d rev%d.%d.%d at %d kHz\n", adap->nr, | ||
| 1201 | dev->dtrev, dev->rev >> 4, dev->rev & 0xf, dev->speed); | ||
| 1202 | |||
| 1088 | of_i2c_register_devices(adap); | 1203 | of_i2c_register_devices(adap); |
| 1089 | 1204 | ||
| 1090 | pm_runtime_put(dev->dev); | 1205 | pm_runtime_mark_last_busy(dev->dev); |
| 1206 | pm_runtime_put_autosuspend(dev->dev); | ||
| 1091 | 1207 | ||
| 1092 | return 0; | 1208 | return 0; |
| 1093 | 1209 | ||
| 1094 | err_free_irq: | ||
| 1095 | free_irq(dev->irq, dev); | ||
| 1096 | err_unuse_clocks: | 1210 | err_unuse_clocks: |
| 1097 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); | 1211 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); |
| 1098 | pm_runtime_put(dev->dev); | 1212 | pm_runtime_put(dev->dev); |
| 1099 | iounmap(dev->base); | ||
| 1100 | pm_runtime_disable(&pdev->dev); | 1213 | pm_runtime_disable(&pdev->dev); |
| 1101 | err_free_mem: | 1214 | err_free_mem: |
| 1102 | platform_set_drvdata(pdev, NULL); | 1215 | platform_set_drvdata(pdev, NULL); |
| 1103 | kfree(dev); | ||
| 1104 | err_release_region: | ||
| 1105 | release_mem_region(mem->start, resource_size(mem)); | ||
| 1106 | 1216 | ||
| 1107 | return r; | 1217 | return r; |
| 1108 | } | 1218 | } |
| @@ -1110,12 +1220,10 @@ err_release_region: | |||
| 1110 | static int __devexit omap_i2c_remove(struct platform_device *pdev) | 1220 | static int __devexit omap_i2c_remove(struct platform_device *pdev) |
| 1111 | { | 1221 | { |
| 1112 | struct omap_i2c_dev *dev = platform_get_drvdata(pdev); | 1222 | struct omap_i2c_dev *dev = platform_get_drvdata(pdev); |
| 1113 | struct resource *mem; | ||
| 1114 | int ret; | 1223 | int ret; |
| 1115 | 1224 | ||
| 1116 | platform_set_drvdata(pdev, NULL); | 1225 | platform_set_drvdata(pdev, NULL); |
| 1117 | 1226 | ||
| 1118 | free_irq(dev->irq, dev); | ||
| 1119 | i2c_del_adapter(&dev->adapter); | 1227 | i2c_del_adapter(&dev->adapter); |
| 1120 | ret = pm_runtime_get_sync(&pdev->dev); | 1228 | ret = pm_runtime_get_sync(&pdev->dev); |
| 1121 | if (IS_ERR_VALUE(ret)) | 1229 | if (IS_ERR_VALUE(ret)) |
| @@ -1124,10 +1232,6 @@ static int __devexit omap_i2c_remove(struct platform_device *pdev) | |||
| 1124 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); | 1232 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); |
| 1125 | pm_runtime_put(&pdev->dev); | 1233 | pm_runtime_put(&pdev->dev); |
| 1126 | pm_runtime_disable(&pdev->dev); | 1234 | pm_runtime_disable(&pdev->dev); |
| 1127 | iounmap(dev->base); | ||
| 1128 | kfree(dev); | ||
| 1129 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 1130 | release_mem_region(mem->start, resource_size(mem)); | ||
| 1131 | return 0; | 1235 | return 0; |
| 1132 | } | 1236 | } |
| 1133 | 1237 | ||
diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c new file mode 100644 index 000000000000..f9399d163af2 --- /dev/null +++ b/drivers/i2c/busses/i2c-rcar.c | |||
| @@ -0,0 +1,709 @@ | |||
| 1 | /* | ||
| 2 | * drivers/i2c/busses/i2c-rcar.c | ||
| 3 | * | ||
| 4 | * Copyright (C) 2012 Renesas Solutions Corp. | ||
| 5 | * Kuninori Morimoto <kuninori.morimoto.gx@renesas.com> | ||
| 6 | * | ||
| 7 | * This file is based on the drivers/i2c/busses/i2c-sh7760.c | ||
| 8 | * (c) 2005-2008 MSC Vertriebsges.m.b.H, Manuel Lauss <mlau@msc-ge.com> | ||
| 9 | * | ||
| 10 | * This file used out-of-tree driver i2c-rcar.c | ||
| 11 | * Copyright (C) 2011-2012 Renesas Electronics Corporation | ||
| 12 | * | ||
| 13 | * This program is free software; you can redistribute it and/or modify | ||
| 14 | * it under the terms of the GNU General Public License as published by | ||
| 15 | * the Free Software Foundation; either version 2 of the License | ||
| 16 | * | ||
| 17 | * This program is distributed in the hope that it will be useful, | ||
| 18 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 19 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 20 | * GNU General Public License for more details. | ||
| 21 | * | ||
| 22 | * You should have received a copy of the GNU General Public License | ||
| 23 | * along with this program; if not, write to the Free Software | ||
| 24 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
| 25 | */ | ||
| 26 | #include <linux/clk.h> | ||
| 27 | #include <linux/delay.h> | ||
| 28 | #include <linux/err.h> | ||
| 29 | #include <linux/init.h> | ||
| 30 | #include <linux/interrupt.h> | ||
| 31 | #include <linux/io.h> | ||
| 32 | #include <linux/i2c.h> | ||
| 33 | #include <linux/i2c/i2c-rcar.h> | ||
| 34 | #include <linux/kernel.h> | ||
| 35 | #include <linux/module.h> | ||
| 36 | #include <linux/platform_device.h> | ||
| 37 | #include <linux/pm_runtime.h> | ||
| 38 | #include <linux/slab.h> | ||
| 39 | #include <linux/spinlock.h> | ||
| 40 | |||
| 41 | /* register offsets */ | ||
| 42 | #define ICSCR 0x00 /* slave ctrl */ | ||
| 43 | #define ICMCR 0x04 /* master ctrl */ | ||
| 44 | #define ICSSR 0x08 /* slave status */ | ||
| 45 | #define ICMSR 0x0C /* master status */ | ||
| 46 | #define ICSIER 0x10 /* slave irq enable */ | ||
| 47 | #define ICMIER 0x14 /* master irq enable */ | ||
| 48 | #define ICCCR 0x18 /* clock dividers */ | ||
| 49 | #define ICSAR 0x1C /* slave address */ | ||
| 50 | #define ICMAR 0x20 /* master address */ | ||
| 51 | #define ICRXTX 0x24 /* data port */ | ||
| 52 | |||
| 53 | /* ICMCR */ | ||
| 54 | #define MDBS (1 << 7) /* non-fifo mode switch */ | ||
| 55 | #define FSCL (1 << 6) /* override SCL pin */ | ||
| 56 | #define FSDA (1 << 5) /* override SDA pin */ | ||
| 57 | #define OBPC (1 << 4) /* override pins */ | ||
| 58 | #define MIE (1 << 3) /* master if enable */ | ||
| 59 | #define TSBE (1 << 2) | ||
| 60 | #define FSB (1 << 1) /* force stop bit */ | ||
| 61 | #define ESG (1 << 0) /* en startbit gen */ | ||
| 62 | |||
| 63 | /* ICMSR */ | ||
| 64 | #define MNR (1 << 6) /* nack received */ | ||
| 65 | #define MAL (1 << 5) /* arbitration lost */ | ||
| 66 | #define MST (1 << 4) /* sent a stop */ | ||
| 67 | #define MDE (1 << 3) | ||
| 68 | #define MDT (1 << 2) | ||
| 69 | #define MDR (1 << 1) | ||
| 70 | #define MAT (1 << 0) /* slave addr xfer done */ | ||
| 71 | |||
| 72 | /* ICMIE */ | ||
| 73 | #define MNRE (1 << 6) /* nack irq en */ | ||
| 74 | #define MALE (1 << 5) /* arblos irq en */ | ||
| 75 | #define MSTE (1 << 4) /* stop irq en */ | ||
| 76 | #define MDEE (1 << 3) | ||
| 77 | #define MDTE (1 << 2) | ||
| 78 | #define MDRE (1 << 1) | ||
| 79 | #define MATE (1 << 0) /* address sent irq en */ | ||
| 80 | |||
| 81 | |||
| 82 | enum { | ||
| 83 | RCAR_BUS_PHASE_ADDR, | ||
| 84 | RCAR_BUS_PHASE_DATA, | ||
| 85 | RCAR_BUS_PHASE_STOP, | ||
| 86 | }; | ||
| 87 | |||
| 88 | enum { | ||
| 89 | RCAR_IRQ_CLOSE, | ||
| 90 | RCAR_IRQ_OPEN_FOR_SEND, | ||
| 91 | RCAR_IRQ_OPEN_FOR_RECV, | ||
| 92 | RCAR_IRQ_OPEN_FOR_STOP, | ||
| 93 | }; | ||
| 94 | |||
| 95 | /* | ||
| 96 | * flags | ||
| 97 | */ | ||
| 98 | #define ID_LAST_MSG (1 << 0) | ||
| 99 | #define ID_IOERROR (1 << 1) | ||
| 100 | #define ID_DONE (1 << 2) | ||
| 101 | #define ID_ARBLOST (1 << 3) | ||
| 102 | #define ID_NACK (1 << 4) | ||
| 103 | |||
| 104 | struct rcar_i2c_priv { | ||
| 105 | void __iomem *io; | ||
| 106 | struct i2c_adapter adap; | ||
| 107 | struct i2c_msg *msg; | ||
| 108 | |||
| 109 | spinlock_t lock; | ||
| 110 | wait_queue_head_t wait; | ||
| 111 | |||
| 112 | int pos; | ||
| 113 | int irq; | ||
| 114 | u32 icccr; | ||
| 115 | u32 flags; | ||
| 116 | }; | ||
| 117 | |||
| 118 | #define rcar_i2c_priv_to_dev(p) ((p)->adap.dev.parent) | ||
| 119 | #define rcar_i2c_is_recv(p) ((p)->msg->flags & I2C_M_RD) | ||
| 120 | |||
| 121 | #define rcar_i2c_flags_set(p, f) ((p)->flags |= (f)) | ||
| 122 | #define rcar_i2c_flags_has(p, f) ((p)->flags & (f)) | ||
| 123 | |||
| 124 | #define LOOP_TIMEOUT 1024 | ||
| 125 | |||
| 126 | /* | ||
| 127 | * basic functions | ||
| 128 | */ | ||
| 129 | static void rcar_i2c_write(struct rcar_i2c_priv *priv, int reg, u32 val) | ||
| 130 | { | ||
| 131 | writel(val, priv->io + reg); | ||
| 132 | } | ||
| 133 | |||
| 134 | static u32 rcar_i2c_read(struct rcar_i2c_priv *priv, int reg) | ||
| 135 | { | ||
| 136 | return readl(priv->io + reg); | ||
| 137 | } | ||
| 138 | |||
| 139 | static void rcar_i2c_init(struct rcar_i2c_priv *priv) | ||
| 140 | { | ||
| 141 | /* | ||
| 142 | * reset slave mode. | ||
| 143 | * slave mode is not used on this driver | ||
| 144 | */ | ||
| 145 | rcar_i2c_write(priv, ICSIER, 0); | ||
| 146 | rcar_i2c_write(priv, ICSAR, 0); | ||
| 147 | rcar_i2c_write(priv, ICSCR, 0); | ||
| 148 | rcar_i2c_write(priv, ICSSR, 0); | ||
| 149 | |||
| 150 | /* reset master mode */ | ||
| 151 | rcar_i2c_write(priv, ICMIER, 0); | ||
| 152 | rcar_i2c_write(priv, ICMCR, 0); | ||
| 153 | rcar_i2c_write(priv, ICMSR, 0); | ||
| 154 | rcar_i2c_write(priv, ICMAR, 0); | ||
| 155 | } | ||
| 156 | |||
| 157 | static void rcar_i2c_irq_mask(struct rcar_i2c_priv *priv, int open) | ||
| 158 | { | ||
| 159 | u32 val = MNRE | MALE | MSTE | MATE; /* default */ | ||
| 160 | |||
| 161 | switch (open) { | ||
| 162 | case RCAR_IRQ_OPEN_FOR_SEND: | ||
| 163 | val |= MDEE; /* default + send */ | ||
| 164 | break; | ||
| 165 | case RCAR_IRQ_OPEN_FOR_RECV: | ||
| 166 | val |= MDRE; /* default + read */ | ||
| 167 | break; | ||
| 168 | case RCAR_IRQ_OPEN_FOR_STOP: | ||
| 169 | val = MSTE; /* stop irq only */ | ||
| 170 | break; | ||
| 171 | case RCAR_IRQ_CLOSE: | ||
| 172 | default: | ||
| 173 | val = 0; /* all close */ | ||
| 174 | break; | ||
| 175 | } | ||
| 176 | rcar_i2c_write(priv, ICMIER, val); | ||
| 177 | } | ||
| 178 | |||
| 179 | static void rcar_i2c_set_addr(struct rcar_i2c_priv *priv, u32 recv) | ||
| 180 | { | ||
| 181 | rcar_i2c_write(priv, ICMAR, (priv->msg->addr << 1) | recv); | ||
| 182 | } | ||
| 183 | |||
| 184 | /* | ||
| 185 | * bus control functions | ||
| 186 | */ | ||
| 187 | static int rcar_i2c_bus_barrier(struct rcar_i2c_priv *priv) | ||
| 188 | { | ||
| 189 | int i; | ||
| 190 | |||
| 191 | for (i = 0; i < LOOP_TIMEOUT; i++) { | ||
| 192 | /* make sure that bus is not busy */ | ||
| 193 | if (!(rcar_i2c_read(priv, ICMCR) & FSDA)) | ||
| 194 | return 0; | ||
| 195 | udelay(1); | ||
| 196 | } | ||
| 197 | |||
| 198 | return -EBUSY; | ||
| 199 | } | ||
| 200 | |||
| 201 | static void rcar_i2c_bus_phase(struct rcar_i2c_priv *priv, int phase) | ||
| 202 | { | ||
| 203 | switch (phase) { | ||
| 204 | case RCAR_BUS_PHASE_ADDR: | ||
| 205 | rcar_i2c_write(priv, ICMCR, MDBS | MIE | ESG); | ||
| 206 | break; | ||
| 207 | case RCAR_BUS_PHASE_DATA: | ||
| 208 | rcar_i2c_write(priv, ICMCR, MDBS | MIE); | ||
| 209 | break; | ||
| 210 | case RCAR_BUS_PHASE_STOP: | ||
| 211 | rcar_i2c_write(priv, ICMCR, MDBS | MIE | FSB); | ||
| 212 | break; | ||
| 213 | } | ||
| 214 | } | ||
| 215 | |||
| 216 | /* | ||
| 217 | * clock function | ||
| 218 | */ | ||
| 219 | static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, | ||
| 220 | u32 bus_speed, | ||
| 221 | struct device *dev) | ||
| 222 | { | ||
| 223 | struct clk *clkp = clk_get(NULL, "peripheral_clk"); | ||
| 224 | u32 scgd, cdf; | ||
| 225 | u32 round, ick; | ||
| 226 | u32 scl; | ||
| 227 | |||
| 228 | if (!clkp) { | ||
| 229 | dev_err(dev, "there is no peripheral_clk\n"); | ||
| 230 | return -EIO; | ||
| 231 | } | ||
| 232 | |||
| 233 | /* | ||
| 234 | * calculate SCL clock | ||
| 235 | * see | ||
| 236 | * ICCCR | ||
| 237 | * | ||
| 238 | * ick = clkp / (1 + CDF) | ||
| 239 | * SCL = ick / (20 + SCGD * 8 + F[(ticf + tr + intd) * ick]) | ||
| 240 | * | ||
| 241 | * ick : I2C internal clock < 20 MHz | ||
| 242 | * ticf : I2C SCL falling time = 35 ns here | ||
| 243 | * tr : I2C SCL rising time = 200 ns here | ||
| 244 | * intd : LSI internal delay = 50 ns here | ||
| 245 | * clkp : peripheral_clk | ||
| 246 | * F[] : integer up-valuation | ||
| 247 | */ | ||
| 248 | for (cdf = 0; cdf < 4; cdf++) { | ||
| 249 | ick = clk_get_rate(clkp) / (1 + cdf); | ||
| 250 | if (ick < 20000000) | ||
| 251 | goto ick_find; | ||
| 252 | } | ||
| 253 | dev_err(dev, "there is no best CDF\n"); | ||
| 254 | return -EIO; | ||
| 255 | |||
| 256 | ick_find: | ||
| 257 | /* | ||
| 258 | * it is impossible to calculate large scale | ||
| 259 | * number on u32. separate it | ||
| 260 | * | ||
| 261 | * F[(ticf + tr + intd) * ick] | ||
| 262 | * = F[(35 + 200 + 50)ns * ick] | ||
| 263 | * = F[285 * ick / 1000000000] | ||
| 264 | * = F[(ick / 1000000) * 285 / 1000] | ||
| 265 | */ | ||
| 266 | round = (ick + 500000) / 1000000 * 285; | ||
| 267 | round = (round + 500) / 1000; | ||
| 268 | |||
| 269 | /* | ||
| 270 | * SCL = ick / (20 + SCGD * 8 + F[(ticf + tr + intd) * ick]) | ||
| 271 | * | ||
| 272 | * Calculation result (= SCL) should be less than | ||
| 273 | * bus_speed for hardware safety | ||
| 274 | */ | ||
| 275 | for (scgd = 0; scgd < 0x40; scgd++) { | ||
| 276 | scl = ick / (20 + (scgd * 8) + round); | ||
| 277 | if (scl <= bus_speed) | ||
| 278 | goto scgd_find; | ||
| 279 | } | ||
| 280 | dev_err(dev, "it is impossible to calculate best SCL\n"); | ||
| 281 | return -EIO; | ||
| 282 | |||
| 283 | scgd_find: | ||
| 284 | dev_dbg(dev, "clk %d/%d(%lu), round %u, CDF:0x%x, SCGD: 0x%x\n", | ||
| 285 | scl, bus_speed, clk_get_rate(clkp), round, cdf, scgd); | ||
| 286 | |||
| 287 | /* | ||
| 288 | * keep icccr value | ||
| 289 | */ | ||
| 290 | priv->icccr = (scgd << 2 | cdf); | ||
| 291 | |||
| 292 | return 0; | ||
| 293 | } | ||
| 294 | |||
| 295 | static void rcar_i2c_clock_start(struct rcar_i2c_priv *priv) | ||
| 296 | { | ||
| 297 | rcar_i2c_write(priv, ICCCR, priv->icccr); | ||
| 298 | } | ||
| 299 | |||
| 300 | /* | ||
| 301 | * status functions | ||
| 302 | */ | ||
| 303 | static u32 rcar_i2c_status_get(struct rcar_i2c_priv *priv) | ||
| 304 | { | ||
| 305 | return rcar_i2c_read(priv, ICMSR); | ||
| 306 | } | ||
| 307 | |||
| 308 | #define rcar_i2c_status_clear(priv) rcar_i2c_status_bit_clear(priv, 0xffffffff) | ||
| 309 | static void rcar_i2c_status_bit_clear(struct rcar_i2c_priv *priv, u32 bit) | ||
| 310 | { | ||
| 311 | rcar_i2c_write(priv, ICMSR, ~bit); | ||
| 312 | } | ||
| 313 | |||
| 314 | /* | ||
| 315 | * recv/send functions | ||
| 316 | */ | ||
| 317 | static int rcar_i2c_recv(struct rcar_i2c_priv *priv) | ||
| 318 | { | ||
| 319 | rcar_i2c_set_addr(priv, 1); | ||
| 320 | rcar_i2c_status_clear(priv); | ||
| 321 | rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_ADDR); | ||
| 322 | rcar_i2c_irq_mask(priv, RCAR_IRQ_OPEN_FOR_RECV); | ||
| 323 | |||
| 324 | return 0; | ||
| 325 | } | ||
| 326 | |||
| 327 | static int rcar_i2c_send(struct rcar_i2c_priv *priv) | ||
| 328 | { | ||
| 329 | int ret; | ||
| 330 | |||
| 331 | /* | ||
| 332 | * It should check bus status when send case | ||
| 333 | */ | ||
| 334 | ret = rcar_i2c_bus_barrier(priv); | ||
| 335 | if (ret < 0) | ||
| 336 | return ret; | ||
| 337 | |||
| 338 | rcar_i2c_set_addr(priv, 0); | ||
| 339 | rcar_i2c_status_clear(priv); | ||
| 340 | rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_ADDR); | ||
| 341 | rcar_i2c_irq_mask(priv, RCAR_IRQ_OPEN_FOR_SEND); | ||
| 342 | |||
| 343 | return 0; | ||
| 344 | } | ||
| 345 | |||
| 346 | #define rcar_i2c_send_restart(priv) rcar_i2c_status_bit_clear(priv, (MAT | MDE)) | ||
| 347 | #define rcar_i2c_recv_restart(priv) rcar_i2c_status_bit_clear(priv, (MAT | MDR)) | ||
| 348 | |||
| 349 | /* | ||
| 350 | * interrupt functions | ||
| 351 | */ | ||
| 352 | static int rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr) | ||
| 353 | { | ||
| 354 | struct i2c_msg *msg = priv->msg; | ||
| 355 | |||
| 356 | /* | ||
| 357 | * FIXME | ||
| 358 | * sometimes, unknown interrupt happened. | ||
| 359 | * Do nothing | ||
| 360 | */ | ||
| 361 | if (!(msr & MDE)) | ||
| 362 | return 0; | ||
| 363 | |||
| 364 | /* | ||
| 365 | * If address transfer phase finished, | ||
| 366 | * goto data phase. | ||
| 367 | */ | ||
| 368 | if (msr & MAT) | ||
| 369 | rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_DATA); | ||
| 370 | |||
| 371 | if (priv->pos < msg->len) { | ||
| 372 | /* | ||
| 373 | * Prepare next data to ICRXTX register. | ||
| 374 | * This data will go to _SHIFT_ register. | ||
| 375 | * | ||
| 376 | * * | ||
| 377 | * [ICRXTX] -> [SHIFT] -> [I2C bus] | ||
| 378 | */ | ||
| 379 | rcar_i2c_write(priv, ICRXTX, msg->buf[priv->pos]); | ||
| 380 | priv->pos++; | ||
| 381 | |||
| 382 | } else { | ||
| 383 | /* | ||
| 384 | * The last data was pushed to ICRXTX on _PREV_ empty irq. | ||
| 385 | * It is on _SHIFT_ register, and will sent to I2C bus. | ||
| 386 | * | ||
| 387 | * * | ||
| 388 | * [ICRXTX] -> [SHIFT] -> [I2C bus] | ||
| 389 | */ | ||
| 390 | |||
| 391 | if (priv->flags & ID_LAST_MSG) | ||
| 392 | /* | ||
| 393 | * If current msg is the _LAST_ msg, | ||
| 394 | * prepare stop condition here. | ||
| 395 | * ID_DONE will be set on STOP irq. | ||
| 396 | */ | ||
| 397 | rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_STOP); | ||
| 398 | else | ||
| 399 | /* | ||
| 400 | * If current msg is _NOT_ last msg, | ||
| 401 | * it doesn't call stop phase. | ||
| 402 | * thus, there is no STOP irq. | ||
| 403 | * return ID_DONE here. | ||
| 404 | */ | ||
| 405 | return ID_DONE; | ||
| 406 | } | ||
| 407 | |||
| 408 | rcar_i2c_send_restart(priv); | ||
| 409 | |||
| 410 | return 0; | ||
| 411 | } | ||
| 412 | |||
| 413 | static int rcar_i2c_irq_recv(struct rcar_i2c_priv *priv, u32 msr) | ||
| 414 | { | ||
| 415 | struct i2c_msg *msg = priv->msg; | ||
| 416 | |||
| 417 | /* | ||
| 418 | * FIXME | ||
| 419 | * sometimes, unknown interrupt happened. | ||
| 420 | * Do nothing | ||
| 421 | */ | ||
| 422 | if (!(msr & MDR)) | ||
| 423 | return 0; | ||
| 424 | |||
| 425 | if (msr & MAT) { | ||
| 426 | /* | ||
| 427 | * Address transfer phase finished, | ||
| 428 | * but, there is no data at this point. | ||
| 429 | * Do nothing. | ||
| 430 | */ | ||
| 431 | } else if (priv->pos < msg->len) { | ||
| 432 | /* | ||
| 433 | * get received data | ||
| 434 | */ | ||
| 435 | msg->buf[priv->pos] = rcar_i2c_read(priv, ICRXTX); | ||
| 436 | priv->pos++; | ||
| 437 | } | ||
| 438 | |||
| 439 | /* | ||
| 440 | * If next received data is the _LAST_, | ||
| 441 | * go to STOP phase, | ||
| 442 | * otherwise, go to DATA phase. | ||
| 443 | */ | ||
| 444 | if (priv->pos + 1 >= msg->len) | ||
| 445 | rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_STOP); | ||
| 446 | else | ||
| 447 | rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_DATA); | ||
| 448 | |||
| 449 | rcar_i2c_recv_restart(priv); | ||
| 450 | |||
| 451 | return 0; | ||
| 452 | } | ||
| 453 | |||
| 454 | static irqreturn_t rcar_i2c_irq(int irq, void *ptr) | ||
| 455 | { | ||
| 456 | struct rcar_i2c_priv *priv = ptr; | ||
| 457 | struct device *dev = rcar_i2c_priv_to_dev(priv); | ||
| 458 | u32 msr; | ||
| 459 | |||
| 460 | /*-------------- spin lock -----------------*/ | ||
| 461 | spin_lock(&priv->lock); | ||
| 462 | |||
| 463 | msr = rcar_i2c_status_get(priv); | ||
| 464 | |||
| 465 | /* | ||
| 466 | * Arbitration lost | ||
| 467 | */ | ||
| 468 | if (msr & MAL) { | ||
| 469 | /* | ||
| 470 | * CAUTION | ||
| 471 | * | ||
| 472 | * When arbitration lost, device become _slave_ mode. | ||
| 473 | */ | ||
| 474 | dev_dbg(dev, "Arbitration Lost\n"); | ||
| 475 | rcar_i2c_flags_set(priv, (ID_DONE | ID_ARBLOST)); | ||
| 476 | goto out; | ||
| 477 | } | ||
| 478 | |||
| 479 | /* | ||
| 480 | * Stop | ||
| 481 | */ | ||
| 482 | if (msr & MST) { | ||
| 483 | dev_dbg(dev, "Stop\n"); | ||
| 484 | rcar_i2c_flags_set(priv, ID_DONE); | ||
| 485 | goto out; | ||
| 486 | } | ||
| 487 | |||
| 488 | /* | ||
| 489 | * Nack | ||
| 490 | */ | ||
| 491 | if (msr & MNR) { | ||
| 492 | dev_dbg(dev, "Nack\n"); | ||
| 493 | |||
| 494 | /* go to stop phase */ | ||
| 495 | rcar_i2c_bus_phase(priv, RCAR_BUS_PHASE_STOP); | ||
| 496 | rcar_i2c_irq_mask(priv, RCAR_IRQ_OPEN_FOR_STOP); | ||
| 497 | rcar_i2c_flags_set(priv, ID_NACK); | ||
| 498 | goto out; | ||
| 499 | } | ||
| 500 | |||
| 501 | /* | ||
| 502 | * recv/send | ||
| 503 | */ | ||
| 504 | if (rcar_i2c_is_recv(priv)) | ||
| 505 | rcar_i2c_flags_set(priv, rcar_i2c_irq_recv(priv, msr)); | ||
| 506 | else | ||
| 507 | rcar_i2c_flags_set(priv, rcar_i2c_irq_send(priv, msr)); | ||
| 508 | |||
| 509 | out: | ||
| 510 | if (rcar_i2c_flags_has(priv, ID_DONE)) { | ||
| 511 | rcar_i2c_irq_mask(priv, RCAR_IRQ_CLOSE); | ||
| 512 | rcar_i2c_status_clear(priv); | ||
| 513 | wake_up(&priv->wait); | ||
| 514 | } | ||
| 515 | |||
| 516 | spin_unlock(&priv->lock); | ||
| 517 | /*-------------- spin unlock -----------------*/ | ||
| 518 | |||
| 519 | return IRQ_HANDLED; | ||
| 520 | } | ||
| 521 | |||
| 522 | static int rcar_i2c_master_xfer(struct i2c_adapter *adap, | ||
| 523 | struct i2c_msg *msgs, | ||
| 524 | int num) | ||
| 525 | { | ||
| 526 | struct rcar_i2c_priv *priv = i2c_get_adapdata(adap); | ||
| 527 | struct device *dev = rcar_i2c_priv_to_dev(priv); | ||
| 528 | unsigned long flags; | ||
| 529 | int i, ret, timeout; | ||
| 530 | |||
| 531 | pm_runtime_get_sync(dev); | ||
| 532 | |||
| 533 | /*-------------- spin lock -----------------*/ | ||
| 534 | spin_lock_irqsave(&priv->lock, flags); | ||
| 535 | |||
| 536 | rcar_i2c_init(priv); | ||
| 537 | rcar_i2c_clock_start(priv); | ||
| 538 | |||
| 539 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 540 | /*-------------- spin unlock -----------------*/ | ||
| 541 | |||
| 542 | ret = -EINVAL; | ||
| 543 | for (i = 0; i < num; i++) { | ||
| 544 | /*-------------- spin lock -----------------*/ | ||
| 545 | spin_lock_irqsave(&priv->lock, flags); | ||
| 546 | |||
| 547 | /* init each data */ | ||
| 548 | priv->msg = &msgs[i]; | ||
| 549 | priv->pos = 0; | ||
| 550 | priv->flags = 0; | ||
| 551 | if (priv->msg == &msgs[num - 1]) | ||
| 552 | rcar_i2c_flags_set(priv, ID_LAST_MSG); | ||
| 553 | |||
| 554 | /* start send/recv */ | ||
| 555 | if (rcar_i2c_is_recv(priv)) | ||
| 556 | ret = rcar_i2c_recv(priv); | ||
| 557 | else | ||
| 558 | ret = rcar_i2c_send(priv); | ||
| 559 | |||
| 560 | spin_unlock_irqrestore(&priv->lock, flags); | ||
| 561 | /*-------------- spin unlock -----------------*/ | ||
| 562 | |||
| 563 | if (ret < 0) | ||
| 564 | break; | ||
| 565 | |||
| 566 | /* | ||
| 567 | * wait result | ||
| 568 | */ | ||
| 569 | timeout = wait_event_timeout(priv->wait, | ||
| 570 | rcar_i2c_flags_has(priv, ID_DONE), | ||
| 571 | 5 * HZ); | ||
| 572 | if (!timeout) { | ||
| 573 | ret = -ETIMEDOUT; | ||
| 574 | break; | ||
| 575 | } | ||
| 576 | |||
| 577 | /* | ||
| 578 | * error handling | ||
| 579 | */ | ||
| 580 | if (rcar_i2c_flags_has(priv, ID_NACK)) { | ||
| 581 | ret = -EREMOTEIO; | ||
| 582 | break; | ||
| 583 | } | ||
| 584 | |||
| 585 | if (rcar_i2c_flags_has(priv, ID_ARBLOST)) { | ||
| 586 | ret = -EAGAIN; | ||
| 587 | break; | ||
| 588 | } | ||
| 589 | |||
| 590 | if (rcar_i2c_flags_has(priv, ID_IOERROR)) { | ||
| 591 | ret = -EIO; | ||
| 592 | break; | ||
| 593 | } | ||
| 594 | |||
| 595 | ret = i + 1; /* The number of transfer */ | ||
| 596 | } | ||
| 597 | |||
| 598 | pm_runtime_put(dev); | ||
| 599 | |||
| 600 | if (ret < 0) | ||
| 601 | dev_err(dev, "error %d : %x\n", ret, priv->flags); | ||
| 602 | |||
| 603 | return ret; | ||
| 604 | } | ||
| 605 | |||
| 606 | static u32 rcar_i2c_func(struct i2c_adapter *adap) | ||
| 607 | { | ||
| 608 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | ||
| 609 | } | ||
| 610 | |||
| 611 | static const struct i2c_algorithm rcar_i2c_algo = { | ||
| 612 | .master_xfer = rcar_i2c_master_xfer, | ||
| 613 | .functionality = rcar_i2c_func, | ||
| 614 | }; | ||
| 615 | |||
| 616 | static int __devinit rcar_i2c_probe(struct platform_device *pdev) | ||
| 617 | { | ||
| 618 | struct i2c_rcar_platform_data *pdata = pdev->dev.platform_data; | ||
| 619 | struct rcar_i2c_priv *priv; | ||
| 620 | struct i2c_adapter *adap; | ||
| 621 | struct resource *res; | ||
| 622 | struct device *dev = &pdev->dev; | ||
| 623 | u32 bus_speed; | ||
| 624 | int ret; | ||
| 625 | |||
| 626 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 627 | if (!res) { | ||
| 628 | dev_err(dev, "no mmio resources\n"); | ||
| 629 | return -ENODEV; | ||
| 630 | } | ||
| 631 | |||
| 632 | priv = devm_kzalloc(dev, sizeof(struct rcar_i2c_priv), GFP_KERNEL); | ||
| 633 | if (!priv) { | ||
| 634 | dev_err(dev, "no mem for private data\n"); | ||
| 635 | return -ENOMEM; | ||
| 636 | } | ||
| 637 | |||
| 638 | bus_speed = 100000; /* default 100 kHz */ | ||
| 639 | if (pdata && pdata->bus_speed) | ||
| 640 | bus_speed = pdata->bus_speed; | ||
| 641 | ret = rcar_i2c_clock_calculate(priv, bus_speed, dev); | ||
| 642 | if (ret < 0) | ||
| 643 | return ret; | ||
| 644 | |||
| 645 | priv->io = devm_ioremap(dev, res->start, resource_size(res)); | ||
| 646 | if (!priv->io) { | ||
| 647 | dev_err(dev, "cannot ioremap\n"); | ||
| 648 | return -ENODEV; | ||
| 649 | } | ||
| 650 | |||
| 651 | priv->irq = platform_get_irq(pdev, 0); | ||
| 652 | init_waitqueue_head(&priv->wait); | ||
| 653 | spin_lock_init(&priv->lock); | ||
| 654 | |||
| 655 | adap = &priv->adap; | ||
| 656 | adap->nr = pdev->id; | ||
| 657 | adap->algo = &rcar_i2c_algo; | ||
| 658 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; | ||
| 659 | adap->retries = 3; | ||
| 660 | adap->dev.parent = dev; | ||
| 661 | i2c_set_adapdata(adap, priv); | ||
| 662 | strlcpy(adap->name, pdev->name, sizeof(adap->name)); | ||
| 663 | |||
| 664 | ret = devm_request_irq(dev, priv->irq, rcar_i2c_irq, 0, | ||
| 665 | dev_name(dev), priv); | ||
| 666 | if (ret < 0) { | ||
| 667 | dev_err(dev, "cannot get irq %d\n", priv->irq); | ||
| 668 | return ret; | ||
| 669 | } | ||
| 670 | |||
| 671 | ret = i2c_add_numbered_adapter(adap); | ||
| 672 | if (ret < 0) { | ||
| 673 | dev_err(dev, "reg adap failed: %d\n", ret); | ||
| 674 | return ret; | ||
| 675 | } | ||
| 676 | |||
| 677 | pm_runtime_enable(dev); | ||
| 678 | platform_set_drvdata(pdev, priv); | ||
| 679 | |||
| 680 | dev_info(dev, "probed\n"); | ||
| 681 | |||
| 682 | return 0; | ||
| 683 | } | ||
| 684 | |||
| 685 | static int __devexit rcar_i2c_remove(struct platform_device *pdev) | ||
| 686 | { | ||
| 687 | struct rcar_i2c_priv *priv = platform_get_drvdata(pdev); | ||
| 688 | struct device *dev = &pdev->dev; | ||
| 689 | |||
| 690 | i2c_del_adapter(&priv->adap); | ||
| 691 | pm_runtime_disable(dev); | ||
| 692 | |||
| 693 | return 0; | ||
| 694 | } | ||
| 695 | |||
| 696 | static struct platform_driver rcar_i2c_drv = { | ||
| 697 | .driver = { | ||
| 698 | .name = "i2c-rcar", | ||
| 699 | .owner = THIS_MODULE, | ||
| 700 | }, | ||
| 701 | .probe = rcar_i2c_probe, | ||
| 702 | .remove = __devexit_p(rcar_i2c_remove), | ||
| 703 | }; | ||
| 704 | |||
| 705 | module_platform_driver(rcar_i2c_drv); | ||
| 706 | |||
| 707 | MODULE_LICENSE("GPL"); | ||
| 708 | MODULE_DESCRIPTION("Renesas R-Car I2C bus driver"); | ||
| 709 | MODULE_AUTHOR("Kuninori Morimoto <kuninori.morimoto.gx@renesas.com>"); | ||
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 4d07dea9bca9..3e0335f1fc60 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
| @@ -601,14 +601,14 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, | |||
| 601 | int ret; | 601 | int ret; |
| 602 | 602 | ||
| 603 | pm_runtime_get_sync(&adap->dev); | 603 | pm_runtime_get_sync(&adap->dev); |
| 604 | clk_enable(i2c->clk); | 604 | clk_prepare_enable(i2c->clk); |
| 605 | 605 | ||
| 606 | for (retry = 0; retry < adap->retries; retry++) { | 606 | for (retry = 0; retry < adap->retries; retry++) { |
| 607 | 607 | ||
| 608 | ret = s3c24xx_i2c_doxfer(i2c, msgs, num); | 608 | ret = s3c24xx_i2c_doxfer(i2c, msgs, num); |
| 609 | 609 | ||
| 610 | if (ret != -EAGAIN) { | 610 | if (ret != -EAGAIN) { |
| 611 | clk_disable(i2c->clk); | 611 | clk_disable_unprepare(i2c->clk); |
| 612 | pm_runtime_put(&adap->dev); | 612 | pm_runtime_put(&adap->dev); |
| 613 | return ret; | 613 | return ret; |
| 614 | } | 614 | } |
| @@ -618,7 +618,7 @@ static int s3c24xx_i2c_xfer(struct i2c_adapter *adap, | |||
| 618 | udelay(100); | 618 | udelay(100); |
| 619 | } | 619 | } |
| 620 | 620 | ||
| 621 | clk_disable(i2c->clk); | 621 | clk_disable_unprepare(i2c->clk); |
| 622 | pm_runtime_put(&adap->dev); | 622 | pm_runtime_put(&adap->dev); |
| 623 | return -EREMOTEIO; | 623 | return -EREMOTEIO; |
| 624 | } | 624 | } |
| @@ -977,7 +977,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 977 | 977 | ||
| 978 | dev_dbg(&pdev->dev, "clock source %p\n", i2c->clk); | 978 | dev_dbg(&pdev->dev, "clock source %p\n", i2c->clk); |
| 979 | 979 | ||
| 980 | clk_enable(i2c->clk); | 980 | clk_prepare_enable(i2c->clk); |
| 981 | 981 | ||
| 982 | /* map the registers */ | 982 | /* map the registers */ |
| 983 | 983 | ||
| @@ -1065,7 +1065,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1065 | pm_runtime_enable(&i2c->adap.dev); | 1065 | pm_runtime_enable(&i2c->adap.dev); |
| 1066 | 1066 | ||
| 1067 | dev_info(&pdev->dev, "%s: S3C I2C adapter\n", dev_name(&i2c->adap.dev)); | 1067 | dev_info(&pdev->dev, "%s: S3C I2C adapter\n", dev_name(&i2c->adap.dev)); |
| 1068 | clk_disable(i2c->clk); | 1068 | clk_disable_unprepare(i2c->clk); |
| 1069 | return 0; | 1069 | return 0; |
| 1070 | 1070 | ||
| 1071 | err_cpufreq: | 1071 | err_cpufreq: |
| @@ -1082,7 +1082,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1082 | kfree(i2c->ioarea); | 1082 | kfree(i2c->ioarea); |
| 1083 | 1083 | ||
| 1084 | err_clk: | 1084 | err_clk: |
| 1085 | clk_disable(i2c->clk); | 1085 | clk_disable_unprepare(i2c->clk); |
| 1086 | clk_put(i2c->clk); | 1086 | clk_put(i2c->clk); |
| 1087 | 1087 | ||
| 1088 | err_noclk: | 1088 | err_noclk: |
| @@ -1106,7 +1106,7 @@ static int s3c24xx_i2c_remove(struct platform_device *pdev) | |||
| 1106 | i2c_del_adapter(&i2c->adap); | 1106 | i2c_del_adapter(&i2c->adap); |
| 1107 | free_irq(i2c->irq, i2c); | 1107 | free_irq(i2c->irq, i2c); |
| 1108 | 1108 | ||
| 1109 | clk_disable(i2c->clk); | 1109 | clk_disable_unprepare(i2c->clk); |
| 1110 | clk_put(i2c->clk); | 1110 | clk_put(i2c->clk); |
| 1111 | 1111 | ||
| 1112 | iounmap(i2c->regs); | 1112 | iounmap(i2c->regs); |
| @@ -1135,9 +1135,9 @@ static int s3c24xx_i2c_resume(struct device *dev) | |||
| 1135 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); | 1135 | struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); |
| 1136 | 1136 | ||
| 1137 | i2c->suspended = 0; | 1137 | i2c->suspended = 0; |
| 1138 | clk_enable(i2c->clk); | 1138 | clk_prepare_enable(i2c->clk); |
| 1139 | s3c24xx_i2c_init(i2c); | 1139 | s3c24xx_i2c_init(i2c); |
| 1140 | clk_disable(i2c->clk); | 1140 | clk_disable_unprepare(i2c->clk); |
| 1141 | 1141 | ||
| 1142 | return 0; | 1142 | return 0; |
| 1143 | } | 1143 | } |
diff --git a/include/linux/i2c-algo-pca.h b/include/linux/i2c-algo-pca.h index 1364d62e2fbe..a3c3ecd59f08 100644 --- a/include/linux/i2c-algo-pca.h +++ b/include/linux/i2c-algo-pca.h | |||
| @@ -62,6 +62,7 @@ struct i2c_algo_pca_data { | |||
| 62 | * 330000, 288000, 217000, 146000, 88000, 59000, 44000, 36000 | 62 | * 330000, 288000, 217000, 146000, 88000, 59000, 44000, 36000 |
| 63 | * For PCA9665, use the frequency you want here. */ | 63 | * For PCA9665, use the frequency you want here. */ |
| 64 | unsigned int i2c_clock; | 64 | unsigned int i2c_clock; |
| 65 | unsigned int chip; | ||
| 65 | }; | 66 | }; |
| 66 | 67 | ||
| 67 | int i2c_pca_add_bus(struct i2c_adapter *); | 68 | int i2c_pca_add_bus(struct i2c_adapter *); |
diff --git a/include/linux/i2c-omap.h b/include/linux/i2c-omap.h index 92a0dc75bc74..df804ba73e0b 100644 --- a/include/linux/i2c-omap.h +++ b/include/linux/i2c-omap.h | |||
| @@ -34,7 +34,6 @@ struct omap_i2c_bus_platform_data { | |||
| 34 | u32 clkrate; | 34 | u32 clkrate; |
| 35 | u32 rev; | 35 | u32 rev; |
| 36 | u32 flags; | 36 | u32 flags; |
| 37 | void (*set_mpu_wkup_lat)(struct device *dev, long set); | ||
| 38 | }; | 37 | }; |
| 39 | 38 | ||
| 40 | #endif | 39 | #endif |
diff --git a/include/linux/i2c/i2c-rcar.h b/include/linux/i2c/i2c-rcar.h new file mode 100644 index 000000000000..496f5c2b23c9 --- /dev/null +++ b/include/linux/i2c/i2c-rcar.h | |||
| @@ -0,0 +1,10 @@ | |||
| 1 | #ifndef __I2C_R_CAR_H__ | ||
| 2 | #define __I2C_R_CAR_H__ | ||
| 3 | |||
| 4 | #include <linux/platform_device.h> | ||
| 5 | |||
| 6 | struct i2c_rcar_platform_data { | ||
| 7 | u32 bus_speed; | ||
| 8 | }; | ||
| 9 | |||
| 10 | #endif /* __I2C_R_CAR_H__ */ | ||
diff --git a/include/linux/platform_data/i2c-nomadik.h b/include/linux/platform_data/i2c-nomadik.h index c2303c3e4803..3a8be9cdc95c 100644 --- a/include/linux/platform_data/i2c-nomadik.h +++ b/include/linux/platform_data/i2c-nomadik.h | |||
| @@ -28,7 +28,7 @@ enum i2c_freq_mode { | |||
| 28 | * @sm: speed mode | 28 | * @sm: speed mode |
| 29 | */ | 29 | */ |
| 30 | struct nmk_i2c_controller { | 30 | struct nmk_i2c_controller { |
| 31 | unsigned long clk_freq; | 31 | u32 clk_freq; |
| 32 | unsigned short slsu; | 32 | unsigned short slsu; |
| 33 | unsigned char tft; | 33 | unsigned char tft; |
| 34 | unsigned char rft; | 34 | unsigned char rft; |
