diff options
64 files changed, 3292 insertions, 501 deletions
diff --git a/Documentation/devicetree/bindings/i2c/i2c-at91.txt b/Documentation/devicetree/bindings/i2c/i2c-at91.txt index 4fade84bea16..388f0a275fba 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-at91.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-at91.txt | |||
| @@ -12,6 +12,7 @@ Required properties : | |||
| 12 | - clocks: phandles to input clocks. | 12 | - clocks: phandles to input clocks. |
| 13 | 13 | ||
| 14 | Optional properties: | 14 | Optional properties: |
| 15 | - clock-frequency: Desired I2C bus frequency in Hz, otherwise defaults to 100000 | ||
| 15 | - Child nodes conforming to i2c bus binding | 16 | - Child nodes conforming to i2c bus binding |
| 16 | 17 | ||
| 17 | Examples : | 18 | Examples : |
| @@ -23,6 +24,7 @@ i2c0: i2c@fff84000 { | |||
| 23 | #address-cells = <1>; | 24 | #address-cells = <1>; |
| 24 | #size-cells = <0>; | 25 | #size-cells = <0>; |
| 25 | clocks = <&twi0_clk>; | 26 | clocks = <&twi0_clk>; |
| 27 | clock-frequency = <400000>; | ||
| 26 | 28 | ||
| 27 | 24c512@50 { | 29 | 24c512@50 { |
| 28 | compatible = "24c512"; | 30 | compatible = "24c512"; |
diff --git a/Documentation/devicetree/bindings/i2c/i2c-cadence.txt b/Documentation/devicetree/bindings/i2c/i2c-cadence.txt new file mode 100644 index 000000000000..7cb0b5608f49 --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/i2c-cadence.txt | |||
| @@ -0,0 +1,24 @@ | |||
| 1 | Binding for the Cadence I2C controller | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - reg: Physical base address and size of the controller's register area. | ||
| 5 | - compatible: Compatibility string. Must be 'cdns,i2c-r1p10'. | ||
| 6 | - clocks: Input clock specifier. Refer to common clock bindings. | ||
| 7 | - interrupts: Interrupt specifier. Refer to interrupt bindings. | ||
| 8 | - #address-cells: Should be 1. | ||
| 9 | - #size-cells: Should be 0. | ||
| 10 | |||
| 11 | Optional properties: | ||
| 12 | - clock-frequency: Desired operating frequency, in Hz, of the bus. | ||
| 13 | - clock-names: Input clock name, should be 'pclk'. | ||
| 14 | |||
| 15 | Example: | ||
| 16 | i2c@e0004000 { | ||
| 17 | compatible = "cdns,i2c-r1p10"; | ||
| 18 | clocks = <&clkc 38>; | ||
| 19 | interrupts = <GIC_SPI 25 IRQ_TYPE_LEVEL_HIGH>; | ||
| 20 | reg = <0xe0004000 0x1000>; | ||
| 21 | clock-frequency = <400000>; | ||
| 22 | #address-cells = <1>; | ||
| 23 | #size-cells = <0>; | ||
| 24 | }; | ||
diff --git a/Documentation/devicetree/bindings/i2c/i2c-designware.txt b/Documentation/devicetree/bindings/i2c/i2c-designware.txt index 7fd7fa25e9b0..5199b0c8cf7a 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-designware.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-designware.txt | |||
| @@ -14,6 +14,12 @@ Optional properties : | |||
| 14 | - i2c-sda-hold-time-ns : should contain the SDA hold time in nanoseconds. | 14 | - i2c-sda-hold-time-ns : should contain the SDA hold time in nanoseconds. |
| 15 | This option is only supported in hardware blocks version 1.11a or newer. | 15 | This option is only supported in hardware blocks version 1.11a or newer. |
| 16 | 16 | ||
| 17 | - i2c-scl-falling-time : should contain the SCL falling time in nanoseconds. | ||
| 18 | This value which is by default 300ns is used to compute the tLOW period. | ||
| 19 | |||
| 20 | - i2c-sda-falling-time : should contain the SDA falling time in nanoseconds. | ||
| 21 | This value which is by default 300ns is used to compute the tHIGH period. | ||
| 22 | |||
| 17 | Example : | 23 | Example : |
| 18 | 24 | ||
| 19 | i2c@f0000 { | 25 | i2c@f0000 { |
| @@ -34,4 +40,6 @@ Example : | |||
| 34 | interrupts = <12 1>; | 40 | interrupts = <12 1>; |
| 35 | clock-frequency = <400000>; | 41 | clock-frequency = <400000>; |
| 36 | i2c-sda-hold-time-ns = <300>; | 42 | i2c-sda-hold-time-ns = <300>; |
| 43 | i2c-sda-falling-time-ns = <300>; | ||
| 44 | i2c-scl-falling-time-ns = <300>; | ||
| 37 | }; | 45 | }; |
diff --git a/Documentation/devicetree/bindings/i2c/i2c-efm32.txt b/Documentation/devicetree/bindings/i2c/i2c-efm32.txt new file mode 100644 index 000000000000..fc15ac519437 --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/i2c-efm32.txt | |||
| @@ -0,0 +1,34 @@ | |||
| 1 | * Energymicro efm32 i2c controller | ||
| 2 | |||
| 3 | Required properties : | ||
| 4 | |||
| 5 | - reg : Offset and length of the register set for the device | ||
| 6 | - compatible : should be "energymicro,efm32-i2c" | ||
| 7 | - interrupts : the interrupt number | ||
| 8 | - clocks : reference to the module clock | ||
| 9 | |||
| 10 | Recommended properties : | ||
| 11 | |||
| 12 | - clock-frequency : maximal I2C bus clock frequency in Hz. | ||
| 13 | - efm32,location : Decides the location of the USART I/O pins. | ||
| 14 | Allowed range : [0 .. 6] | ||
| 15 | |||
| 16 | Example: | ||
| 17 | i2c0: i2c@4000a000 { | ||
| 18 | #address-cells = <1>; | ||
| 19 | #size-cells = <0>; | ||
| 20 | compatible = "energymicro,efm32-i2c"; | ||
| 21 | reg = <0x4000a000 0x400>; | ||
| 22 | interrupts = <9>; | ||
| 23 | clocks = <&cmu clk_HFPERCLKI2C0>; | ||
| 24 | clock-frequency = <100000>; | ||
| 25 | status = "ok"; | ||
| 26 | efm32,location = <3>; | ||
| 27 | |||
| 28 | eeprom@50 { | ||
| 29 | compatible = "microchip,24c02"; | ||
| 30 | reg = <0x50>; | ||
| 31 | pagesize = <16>; | ||
| 32 | }; | ||
| 33 | }; | ||
| 34 | |||
diff --git a/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt b/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt index 582b4652a82a..befd4fb4764f 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-mv64xxx.txt | |||
| @@ -4,12 +4,16 @@ | |||
| 4 | Required properties : | 4 | Required properties : |
| 5 | 5 | ||
| 6 | - reg : Offset and length of the register set for the device | 6 | - reg : Offset and length of the register set for the device |
| 7 | - compatible : Should be "marvell,mv64xxx-i2c" or "allwinner,sun4i-i2c" | 7 | - compatible : Should be either: |
| 8 | or "marvell,mv78230-i2c" or "marvell,mv78230-a0-i2c" | 8 | - "allwinner,sun4i-i2c" |
| 9 | Note: Only use "marvell,mv78230-a0-i2c" for a very rare, | 9 | - "allwinner,sun6i-a31-i2c" |
| 10 | initial version of the SoC which had broken offload | 10 | - "marvell,mv64xxx-i2c" |
| 11 | support. Linux auto-detects this and sets it | 11 | - "marvell,mv78230-i2c" |
| 12 | appropriately. | 12 | - "marvell,mv78230-a0-i2c" |
| 13 | * Note: Only use "marvell,mv78230-a0-i2c" for a | ||
| 14 | very rare, initial version of the SoC which | ||
| 15 | had broken offload support. Linux | ||
| 16 | auto-detects this and sets it appropriately. | ||
| 13 | - interrupts : The interrupt number | 17 | - interrupts : The interrupt number |
| 14 | 18 | ||
| 15 | Optional properties : | 19 | Optional properties : |
| @@ -17,6 +21,10 @@ Optional properties : | |||
| 17 | - clock-frequency : Desired I2C bus clock frequency in Hz. If not set the | 21 | - clock-frequency : Desired I2C bus clock frequency in Hz. If not set the |
| 18 | default frequency is 100kHz | 22 | default frequency is 100kHz |
| 19 | 23 | ||
| 24 | - resets : phandle to the parent reset controller. Mandatory | ||
| 25 | whenever you're using the "allwinner,sun6i-a31-i2c" | ||
| 26 | compatible. | ||
| 27 | |||
| 20 | Examples: | 28 | Examples: |
| 21 | 29 | ||
| 22 | i2c@11000 { | 30 | i2c@11000 { |
diff --git a/Documentation/devicetree/bindings/i2c/i2c-rcar.txt b/Documentation/devicetree/bindings/i2c/i2c-rcar.txt index 897cfcd5ce92..dd8b2dd1edeb 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-rcar.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-rcar.txt | |||
| @@ -6,6 +6,7 @@ Required properties: | |||
| 6 | "renesas,i2c-r8a7778" | 6 | "renesas,i2c-r8a7778" |
| 7 | "renesas,i2c-r8a7779" | 7 | "renesas,i2c-r8a7779" |
| 8 | "renesas,i2c-r8a7790" | 8 | "renesas,i2c-r8a7790" |
| 9 | "renesas,i2c-r8a7791" | ||
| 9 | - reg: physical base address of the controller and length of memory mapped | 10 | - reg: physical base address of the controller and length of memory mapped |
| 10 | region. | 11 | region. |
| 11 | - interrupts: interrupt specifier. | 12 | - interrupts: interrupt specifier. |
| @@ -13,11 +14,16 @@ Required properties: | |||
| 13 | Optional properties: | 14 | Optional properties: |
| 14 | - clock-frequency: desired I2C bus clock frequency in Hz. The absence of this | 15 | - clock-frequency: desired I2C bus clock frequency in Hz. The absence of this |
| 15 | propoerty indicates the default frequency 100 kHz. | 16 | propoerty indicates the default frequency 100 kHz. |
| 17 | - clocks: clock specifier. | ||
| 16 | 18 | ||
| 17 | Examples : | 19 | Examples : |
| 18 | 20 | ||
| 19 | i2c0: i2c@e6500000 { | 21 | i2c0: i2c@e6508000 { |
| 20 | compatible = "renesas,i2c-rcar-h2"; | 22 | #address-cells = <1>; |
| 21 | reg = <0 0xe6500000 0 0x428>; | 23 | #size-cells = <0>; |
| 22 | interrupts = <0 174 0x4>; | 24 | compatible = "renesas,i2c-r8a7791"; |
| 25 | reg = <0 0xe6508000 0 0x40>; | ||
| 26 | interrupts = <0 287 IRQ_TYPE_LEVEL_HIGH>; | ||
| 27 | clocks = <&mstp9_clks R8A7791_CLK_I2C0>; | ||
| 28 | clock-frequency = <400000>; | ||
| 23 | }; | 29 | }; |
diff --git a/Documentation/devicetree/bindings/i2c/qcom,i2c-qup.txt b/Documentation/devicetree/bindings/i2c/qcom,i2c-qup.txt new file mode 100644 index 000000000000..dc71754a56af --- /dev/null +++ b/Documentation/devicetree/bindings/i2c/qcom,i2c-qup.txt | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | Qualcomm Universal Peripheral (QUP) I2C controller | ||
| 2 | |||
| 3 | Required properties: | ||
| 4 | - compatible: Should be: | ||
| 5 | * "qcom,i2c-qup-v1.1.1" for 8660, 8960 and 8064. | ||
| 6 | * "qcom,i2c-qup-v2.1.1" for 8974 v1. | ||
| 7 | * "qcom,i2c-qup-v2.2.1" for 8974 v2 and later. | ||
| 8 | - reg: Should contain QUP register address and length. | ||
| 9 | - interrupts: Should contain I2C interrupt. | ||
| 10 | |||
| 11 | - clocks: A list of phandles + clock-specifiers, one for each entry in | ||
| 12 | clock-names. | ||
| 13 | - clock-names: Should contain: | ||
| 14 | * "core" for the core clock | ||
| 15 | * "iface" for the AHB clock | ||
| 16 | |||
| 17 | - #address-cells: Should be <1> Address cells for i2c device address | ||
| 18 | - #size-cells: Should be <0> as i2c addresses have no size component | ||
| 19 | |||
| 20 | Optional properties: | ||
| 21 | - clock-frequency: Should specify the desired i2c bus clock frequency in Hz, | ||
| 22 | defaults to 100kHz if omitted. | ||
| 23 | |||
| 24 | Child nodes should conform to i2c bus binding. | ||
| 25 | |||
| 26 | Example: | ||
| 27 | |||
| 28 | i2c@f9924000 { | ||
| 29 | compatible = "qcom,i2c-qup-v2.2.1"; | ||
| 30 | reg = <0xf9924000 0x1000>; | ||
| 31 | interrupts = <0 96 0>; | ||
| 32 | |||
| 33 | clocks = <&gcc GCC_BLSP1_QUP2_I2C_APPS_CLK>, <&gcc GCC_BLSP1_AHB_CLK>; | ||
| 34 | clock-names = "core", "iface"; | ||
| 35 | |||
| 36 | clock-frequency = <355000>; | ||
| 37 | |||
| 38 | #address-cells = <1>; | ||
| 39 | #size-cells = <0>; | ||
| 40 | }; | ||
diff --git a/Documentation/i2c/busses/i2c-i801 b/Documentation/i2c/busses/i2c-i801 index aaaf069306a3..adf5e33e8312 100644 --- a/Documentation/i2c/busses/i2c-i801 +++ b/Documentation/i2c/busses/i2c-i801 | |||
| @@ -26,6 +26,7 @@ Supported adapters: | |||
| 26 | * Intel Wellsburg (PCH) | 26 | * Intel Wellsburg (PCH) |
| 27 | * Intel Coleto Creek (PCH) | 27 | * Intel Coleto Creek (PCH) |
| 28 | * Intel Wildcat Point-LP (PCH) | 28 | * Intel Wildcat Point-LP (PCH) |
| 29 | * Intel BayTrail (SOC) | ||
| 29 | Datasheets: Publicly available at the Intel website | 30 | Datasheets: Publicly available at the Intel website |
| 30 | 31 | ||
| 31 | On Intel Patsburg and later chipsets, both the normal host SMBus controller | 32 | On Intel Patsburg and later chipsets, both the normal host SMBus controller |
diff --git a/Documentation/i2c/functionality b/Documentation/i2c/functionality index b0ff2ab596ce..4556a3eb87c4 100644 --- a/Documentation/i2c/functionality +++ b/Documentation/i2c/functionality | |||
| @@ -46,7 +46,7 @@ A few combinations of the above flags are also defined for your convenience: | |||
| 46 | and write_block_data commands | 46 | and write_block_data commands |
| 47 | I2C_FUNC_SMBUS_I2C_BLOCK Handles the SMBus read_i2c_block_data | 47 | I2C_FUNC_SMBUS_I2C_BLOCK Handles the SMBus read_i2c_block_data |
| 48 | and write_i2c_block_data commands | 48 | and write_i2c_block_data commands |
| 49 | I2C_FUNC_SMBUS_EMUL Handles all SMBus commands than can be | 49 | I2C_FUNC_SMBUS_EMUL Handles all SMBus commands that can be |
| 50 | emulated by a real I2C adapter (using | 50 | emulated by a real I2C adapter (using |
| 51 | the transparent emulation layer) | 51 | the transparent emulation layer) |
| 52 | 52 | ||
diff --git a/Documentation/i2c/i2c-protocol b/Documentation/i2c/i2c-protocol index 0b3e62d1f77a..ff6d6cee6c7e 100644 --- a/Documentation/i2c/i2c-protocol +++ b/Documentation/i2c/i2c-protocol | |||
| @@ -6,8 +6,8 @@ Key to symbols | |||
| 6 | S (1 bit) : Start bit | 6 | S (1 bit) : Start bit |
| 7 | P (1 bit) : Stop bit | 7 | P (1 bit) : Stop bit |
| 8 | Rd/Wr (1 bit) : Read/Write bit. Rd equals 1, Wr equals 0. | 8 | Rd/Wr (1 bit) : Read/Write bit. Rd equals 1, Wr equals 0. |
| 9 | A, NA (1 bit) : Accept and reverse accept bit. | 9 | A, NA (1 bit) : Accept and reverse accept bit. |
| 10 | Addr (7 bits): I2C 7 bit address. Note that this can be expanded as usual to | 10 | Addr (7 bits): I2C 7 bit address. Note that this can be expanded as usual to |
| 11 | get a 10 bit I2C address. | 11 | get a 10 bit I2C address. |
| 12 | Comm (8 bits): Command byte, a data byte which often selects a register on | 12 | Comm (8 bits): Command byte, a data byte which often selects a register on |
| 13 | the device. | 13 | the device. |
| @@ -49,11 +49,20 @@ a byte read, followed by a byte write: | |||
| 49 | Modified transactions | 49 | Modified transactions |
| 50 | ===================== | 50 | ===================== |
| 51 | 51 | ||
| 52 | The following modifications to the I2C protocol can also be generated, | 52 | The following modifications to the I2C protocol can also be generated by |
| 53 | with the exception of I2C_M_NOSTART these are usually only needed to | 53 | setting these flags for i2c messages. With the exception of I2C_M_NOSTART, they |
| 54 | work around device issues: | 54 | are usually only needed to work around device issues: |
| 55 | 55 | ||
| 56 | Flag I2C_M_NOSTART: | 56 | I2C_M_IGNORE_NAK: |
| 57 | Normally message is interrupted immediately if there is [NA] from the | ||
| 58 | client. Setting this flag treats any [NA] as [A], and all of | ||
| 59 | message is sent. | ||
| 60 | These messages may still fail to SCL lo->hi timeout. | ||
| 61 | |||
| 62 | I2C_M_NO_RD_ACK: | ||
| 63 | In a read message, master A/NA bit is skipped. | ||
| 64 | |||
| 65 | I2C_M_NOSTART: | ||
| 57 | In a combined transaction, no 'S Addr Wr/Rd [A]' is generated at some | 66 | In a combined transaction, no 'S Addr Wr/Rd [A]' is generated at some |
| 58 | point. For example, setting I2C_M_NOSTART on the second partial message | 67 | point. For example, setting I2C_M_NOSTART on the second partial message |
| 59 | generates something like: | 68 | generates something like: |
| @@ -67,17 +76,13 @@ work around device issues: | |||
| 67 | I2C device but may also be used between direction changes by some | 76 | I2C device but may also be used between direction changes by some |
| 68 | rare devices. | 77 | rare devices. |
| 69 | 78 | ||
| 70 | Flags I2C_M_REV_DIR_ADDR | 79 | I2C_M_REV_DIR_ADDR: |
| 71 | This toggles the Rd/Wr flag. That is, if you want to do a write, but | 80 | This toggles the Rd/Wr flag. That is, if you want to do a write, but |
| 72 | need to emit an Rd instead of a Wr, or vice versa, you set this | 81 | need to emit an Rd instead of a Wr, or vice versa, you set this |
| 73 | flag. For example: | 82 | flag. For example: |
| 74 | S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P | 83 | S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P |
| 75 | 84 | ||
| 76 | Flags I2C_M_IGNORE_NAK | 85 | I2C_M_STOP: |
| 77 | Normally message is interrupted immediately if there is [NA] from the | 86 | Force a stop condition (P) after the message. Some I2C related protocols |
| 78 | client. Setting this flag treats any [NA] as [A], and all of | 87 | like SCCB require that. Normally, you really don't want to get interrupted |
| 79 | message is sent. | 88 | between the messages of one transfer. |
| 80 | These messages may still fail to SCL lo->hi timeout. | ||
| 81 | |||
| 82 | Flags I2C_M_NO_RD_ACK | ||
| 83 | In a read message, master A/NA bit is skipped. | ||
diff --git a/MAINTAINERS b/MAINTAINERS index a769432bddbe..beaa87a6e7fa 100644 --- a/MAINTAINERS +++ b/MAINTAINERS | |||
| @@ -1427,6 +1427,7 @@ F: drivers/cpuidle/cpuidle-zynq.c | |||
| 1427 | N: zynq | 1427 | N: zynq |
| 1428 | N: xilinx | 1428 | N: xilinx |
| 1429 | F: drivers/clocksource/cadence_ttc_timer.c | 1429 | F: drivers/clocksource/cadence_ttc_timer.c |
| 1430 | F: drivers/i2c/busses/i2c-cadence.c | ||
| 1430 | F: drivers/mmc/host/sdhci-of-arasan.c | 1431 | F: drivers/mmc/host/sdhci-of-arasan.c |
| 1431 | 1432 | ||
| 1432 | ARM SMMU DRIVER | 1433 | ARM SMMU DRIVER |
| @@ -4308,7 +4309,8 @@ F: drivers/i2c/i2c-stub.c | |||
| 4308 | I2C SUBSYSTEM | 4309 | I2C SUBSYSTEM |
| 4309 | M: Wolfram Sang <wsa@the-dreams.de> | 4310 | M: Wolfram Sang <wsa@the-dreams.de> |
| 4310 | L: linux-i2c@vger.kernel.org | 4311 | L: linux-i2c@vger.kernel.org |
| 4311 | W: http://i2c.wiki.kernel.org/ | 4312 | W: https://i2c.wiki.kernel.org/ |
| 4313 | Q: https://patchwork.ozlabs.org/project/linux-i2c/list/ | ||
| 4312 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git | 4314 | T: git git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux.git |
| 4313 | S: Maintained | 4315 | S: Maintained |
| 4314 | F: Documentation/i2c/ | 4316 | F: Documentation/i2c/ |
diff --git a/arch/blackfin/include/asm/bfin_twi.h b/arch/blackfin/include/asm/bfin_twi.h index 90c3c006557d..aaa0834d34aa 100644 --- a/arch/blackfin/include/asm/bfin_twi.h +++ b/arch/blackfin/include/asm/bfin_twi.h | |||
| @@ -9,60 +9,7 @@ | |||
| 9 | #ifndef __ASM_BFIN_TWI_H__ | 9 | #ifndef __ASM_BFIN_TWI_H__ |
| 10 | #define __ASM_BFIN_TWI_H__ | 10 | #define __ASM_BFIN_TWI_H__ |
| 11 | 11 | ||
| 12 | #include <linux/types.h> | 12 | #include <asm/blackfin.h> |
| 13 | #include <linux/i2c.h> | ||
| 14 | |||
| 15 | /* | ||
| 16 | * All Blackfin system MMRs are padded to 32bits even if the register | ||
| 17 | * itself is only 16bits. So use a helper macro to streamline this. | ||
| 18 | */ | ||
| 19 | #define __BFP(m) u16 m; u16 __pad_##m | ||
| 20 | |||
| 21 | /* | ||
| 22 | * bfin twi registers layout | ||
| 23 | */ | ||
| 24 | struct bfin_twi_regs { | ||
| 25 | __BFP(clkdiv); | ||
| 26 | __BFP(control); | ||
| 27 | __BFP(slave_ctl); | ||
| 28 | __BFP(slave_stat); | ||
| 29 | __BFP(slave_addr); | ||
| 30 | __BFP(master_ctl); | ||
| 31 | __BFP(master_stat); | ||
| 32 | __BFP(master_addr); | ||
| 33 | __BFP(int_stat); | ||
| 34 | __BFP(int_mask); | ||
| 35 | __BFP(fifo_ctl); | ||
| 36 | __BFP(fifo_stat); | ||
| 37 | u32 __pad[20]; | ||
| 38 | __BFP(xmt_data8); | ||
| 39 | __BFP(xmt_data16); | ||
| 40 | __BFP(rcv_data8); | ||
| 41 | __BFP(rcv_data16); | ||
| 42 | }; | ||
| 43 | |||
| 44 | #undef __BFP | ||
| 45 | |||
| 46 | struct bfin_twi_iface { | ||
| 47 | int irq; | ||
| 48 | spinlock_t lock; | ||
| 49 | char read_write; | ||
| 50 | u8 command; | ||
| 51 | u8 *transPtr; | ||
| 52 | int readNum; | ||
| 53 | int writeNum; | ||
| 54 | int cur_mode; | ||
| 55 | int manual_stop; | ||
| 56 | int result; | ||
| 57 | struct i2c_adapter adap; | ||
| 58 | struct completion complete; | ||
| 59 | struct i2c_msg *pmsg; | ||
| 60 | int msg_num; | ||
| 61 | int cur_msg; | ||
| 62 | u16 saved_clkdiv; | ||
| 63 | u16 saved_control; | ||
| 64 | struct bfin_twi_regs __iomem *regs_base; | ||
| 65 | }; | ||
| 66 | 13 | ||
| 67 | #define DEFINE_TWI_REG(reg_name, reg) \ | 14 | #define DEFINE_TWI_REG(reg_name, reg) \ |
| 68 | static inline u16 read_##reg_name(struct bfin_twi_iface *iface) \ | 15 | static inline u16 read_##reg_name(struct bfin_twi_iface *iface) \ |
| @@ -71,7 +18,6 @@ static inline void write_##reg_name(struct bfin_twi_iface *iface, u16 v) \ | |||
| 71 | { bfin_write16(&iface->regs_base->reg, v); } | 18 | { bfin_write16(&iface->regs_base->reg, v); } |
| 72 | 19 | ||
| 73 | DEFINE_TWI_REG(CLKDIV, clkdiv) | 20 | DEFINE_TWI_REG(CLKDIV, clkdiv) |
| 74 | DEFINE_TWI_REG(CONTROL, control) | ||
| 75 | DEFINE_TWI_REG(SLAVE_CTL, slave_ctl) | 21 | DEFINE_TWI_REG(SLAVE_CTL, slave_ctl) |
| 76 | DEFINE_TWI_REG(SLAVE_STAT, slave_stat) | 22 | DEFINE_TWI_REG(SLAVE_STAT, slave_stat) |
| 77 | DEFINE_TWI_REG(SLAVE_ADDR, slave_addr) | 23 | DEFINE_TWI_REG(SLAVE_ADDR, slave_addr) |
| @@ -80,7 +26,6 @@ DEFINE_TWI_REG(MASTER_STAT, master_stat) | |||
| 80 | DEFINE_TWI_REG(MASTER_ADDR, master_addr) | 26 | DEFINE_TWI_REG(MASTER_ADDR, master_addr) |
| 81 | DEFINE_TWI_REG(INT_STAT, int_stat) | 27 | DEFINE_TWI_REG(INT_STAT, int_stat) |
| 82 | DEFINE_TWI_REG(INT_MASK, int_mask) | 28 | DEFINE_TWI_REG(INT_MASK, int_mask) |
| 83 | DEFINE_TWI_REG(FIFO_CTL, fifo_ctl) | ||
| 84 | DEFINE_TWI_REG(FIFO_STAT, fifo_stat) | 29 | DEFINE_TWI_REG(FIFO_STAT, fifo_stat) |
| 85 | DEFINE_TWI_REG(XMT_DATA8, xmt_data8) | 30 | DEFINE_TWI_REG(XMT_DATA8, xmt_data8) |
| 86 | DEFINE_TWI_REG(XMT_DATA16, xmt_data16) | 31 | DEFINE_TWI_REG(XMT_DATA16, xmt_data16) |
| @@ -113,75 +58,25 @@ static inline u16 read_RCV_DATA16(struct bfin_twi_iface *iface) | |||
| 113 | } | 58 | } |
| 114 | #endif | 59 | #endif |
| 115 | 60 | ||
| 61 | static inline u16 read_FIFO_CTL(struct bfin_twi_iface *iface) | ||
| 62 | { | ||
| 63 | return bfin_read16(&iface->regs_base->fifo_ctl); | ||
| 64 | } | ||
| 116 | 65 | ||
| 117 | /* ******************** TWO-WIRE INTERFACE (TWI) MASKS ***********************/ | 66 | static inline void write_FIFO_CTL(struct bfin_twi_iface *iface, u16 v) |
| 118 | /* TWI_CLKDIV Macros (Use: *pTWI_CLKDIV = CLKLOW(x)|CLKHI(y); ) */ | 67 | { |
| 119 | #define CLKLOW(x) ((x) & 0xFF) /* Periods Clock Is Held Low */ | 68 | bfin_write16(&iface->regs_base->fifo_ctl, v); |
| 120 | #define CLKHI(y) (((y)&0xFF)<<0x8) /* Periods Before New Clock Low */ | 69 | SSYNC(); |
| 121 | 70 | } | |
| 122 | /* TWI_PRESCALE Masks */ | ||
| 123 | #define PRESCALE 0x007F /* SCLKs Per Internal Time Reference (10MHz) */ | ||
| 124 | #define TWI_ENA 0x0080 /* TWI Enable */ | ||
| 125 | #define SCCB 0x0200 /* SCCB Compatibility Enable */ | ||
| 126 | |||
| 127 | /* TWI_SLAVE_CTL Masks */ | ||
| 128 | #define SEN 0x0001 /* Slave Enable */ | ||
| 129 | #define SADD_LEN 0x0002 /* Slave Address Length */ | ||
| 130 | #define STDVAL 0x0004 /* Slave Transmit Data Valid */ | ||
| 131 | #define NAK 0x0008 /* NAK/ACK* Generated At Conclusion Of Transfer */ | ||
| 132 | #define GEN 0x0010 /* General Call Address Matching Enabled */ | ||
| 133 | |||
| 134 | /* TWI_SLAVE_STAT Masks */ | ||
| 135 | #define SDIR 0x0001 /* Slave Transfer Direction (Transmit/Receive*) */ | ||
| 136 | #define GCALL 0x0002 /* General Call Indicator */ | ||
| 137 | |||
| 138 | /* TWI_MASTER_CTL Masks */ | ||
| 139 | #define MEN 0x0001 /* Master Mode Enable */ | ||
| 140 | #define MADD_LEN 0x0002 /* Master Address Length */ | ||
| 141 | #define MDIR 0x0004 /* Master Transmit Direction (RX/TX*) */ | ||
| 142 | #define FAST 0x0008 /* Use Fast Mode Timing Specs */ | ||
| 143 | #define STOP 0x0010 /* Issue Stop Condition */ | ||
| 144 | #define RSTART 0x0020 /* Repeat Start or Stop* At End Of Transfer */ | ||
| 145 | #define DCNT 0x3FC0 /* Data Bytes To Transfer */ | ||
| 146 | #define SDAOVR 0x4000 /* Serial Data Override */ | ||
| 147 | #define SCLOVR 0x8000 /* Serial Clock Override */ | ||
| 148 | |||
| 149 | /* TWI_MASTER_STAT Masks */ | ||
| 150 | #define MPROG 0x0001 /* Master Transfer In Progress */ | ||
| 151 | #define LOSTARB 0x0002 /* Lost Arbitration Indicator (Xfer Aborted) */ | ||
| 152 | #define ANAK 0x0004 /* Address Not Acknowledged */ | ||
| 153 | #define DNAK 0x0008 /* Data Not Acknowledged */ | ||
| 154 | #define BUFRDERR 0x0010 /* Buffer Read Error */ | ||
| 155 | #define BUFWRERR 0x0020 /* Buffer Write Error */ | ||
| 156 | #define SDASEN 0x0040 /* Serial Data Sense */ | ||
| 157 | #define SCLSEN 0x0080 /* Serial Clock Sense */ | ||
| 158 | #define BUSBUSY 0x0100 /* Bus Busy Indicator */ | ||
| 159 | |||
| 160 | /* TWI_INT_SRC and TWI_INT_ENABLE Masks */ | ||
| 161 | #define SINIT 0x0001 /* Slave Transfer Initiated */ | ||
| 162 | #define SCOMP 0x0002 /* Slave Transfer Complete */ | ||
| 163 | #define SERR 0x0004 /* Slave Transfer Error */ | ||
| 164 | #define SOVF 0x0008 /* Slave Overflow */ | ||
| 165 | #define MCOMP 0x0010 /* Master Transfer Complete */ | ||
| 166 | #define MERR 0x0020 /* Master Transfer Error */ | ||
| 167 | #define XMTSERV 0x0040 /* Transmit FIFO Service */ | ||
| 168 | #define RCVSERV 0x0080 /* Receive FIFO Service */ | ||
| 169 | |||
| 170 | /* TWI_FIFO_CTRL Masks */ | ||
| 171 | #define XMTFLUSH 0x0001 /* Transmit Buffer Flush */ | ||
| 172 | #define RCVFLUSH 0x0002 /* Receive Buffer Flush */ | ||
| 173 | #define XMTINTLEN 0x0004 /* Transmit Buffer Interrupt Length */ | ||
| 174 | #define RCVINTLEN 0x0008 /* Receive Buffer Interrupt Length */ | ||
| 175 | |||
| 176 | /* TWI_FIFO_STAT Masks */ | ||
| 177 | #define XMTSTAT 0x0003 /* Transmit FIFO Status */ | ||
| 178 | #define XMT_EMPTY 0x0000 /* Transmit FIFO Empty */ | ||
| 179 | #define XMT_HALF 0x0001 /* Transmit FIFO Has 1 Byte To Write */ | ||
| 180 | #define XMT_FULL 0x0003 /* Transmit FIFO Full (2 Bytes To Write) */ | ||
| 181 | 71 | ||
| 182 | #define RCVSTAT 0x000C /* Receive FIFO Status */ | 72 | static inline u16 read_CONTROL(struct bfin_twi_iface *iface) |
| 183 | #define RCV_EMPTY 0x0000 /* Receive FIFO Empty */ | 73 | { |
| 184 | #define RCV_HALF 0x0004 /* Receive FIFO Has 1 Byte To Read */ | 74 | return bfin_read16(&iface->regs_base->control); |
| 185 | #define RCV_FULL 0x000C /* Receive FIFO Full (2 Bytes To Read) */ | 75 | } |
| 186 | 76 | ||
| 77 | static inline void write_CONTROL(struct bfin_twi_iface *iface, u16 v) | ||
| 78 | { | ||
| 79 | SSYNC(); | ||
| 80 | bfin_write16(&iface->regs_base->control, v); | ||
| 81 | } | ||
| 187 | #endif | 82 | #endif |
diff --git a/arch/blackfin/kernel/debug-mmrs.c b/arch/blackfin/kernel/debug-mmrs.c index 01232a13470d..947ad0832338 100644 --- a/arch/blackfin/kernel/debug-mmrs.c +++ b/arch/blackfin/kernel/debug-mmrs.c | |||
| @@ -10,6 +10,7 @@ | |||
| 10 | #include <linux/fs.h> | 10 | #include <linux/fs.h> |
| 11 | #include <linux/kernel.h> | 11 | #include <linux/kernel.h> |
| 12 | #include <linux/module.h> | 12 | #include <linux/module.h> |
| 13 | #include <linux/i2c/bfin_twi.h> | ||
| 13 | 14 | ||
| 14 | #include <asm/blackfin.h> | 15 | #include <asm/blackfin.h> |
| 15 | #include <asm/gpio.h> | 16 | #include <asm/gpio.h> |
diff --git a/drivers/i2c/busses/Kconfig b/drivers/i2c/busses/Kconfig index 014afab1d551..c94db1c5e353 100644 --- a/drivers/i2c/busses/Kconfig +++ b/drivers/i2c/busses/Kconfig | |||
| @@ -110,6 +110,7 @@ config I2C_I801 | |||
| 110 | Wellsburg (PCH) | 110 | Wellsburg (PCH) |
| 111 | Coleto Creek (PCH) | 111 | Coleto Creek (PCH) |
| 112 | Wildcat Point-LP (PCH) | 112 | Wildcat Point-LP (PCH) |
| 113 | BayTrail (SOC) | ||
| 113 | 114 | ||
| 114 | This driver can also be built as a module. If so, the module | 115 | This driver can also be built as a module. If so, the module |
| 115 | will be called i2c-i801. | 116 | will be called i2c-i801. |
| @@ -375,6 +376,13 @@ config I2C_BLACKFIN_TWI_CLK_KHZ | |||
| 375 | help | 376 | help |
| 376 | The unit of the TWI clock is kHz. | 377 | The unit of the TWI clock is kHz. |
| 377 | 378 | ||
| 379 | config I2C_CADENCE | ||
| 380 | tristate "Cadence I2C Controller" | ||
| 381 | depends on ARCH_ZYNQ | ||
| 382 | help | ||
| 383 | Say yes here to select Cadence I2C Host Controller. This controller is | ||
| 384 | e.g. used by Xilinx Zynq. | ||
| 385 | |||
| 378 | config I2C_CBUS_GPIO | 386 | config I2C_CBUS_GPIO |
| 379 | tristate "CBUS I2C driver" | 387 | tristate "CBUS I2C driver" |
| 380 | depends on GPIOLIB | 388 | depends on GPIOLIB |
| @@ -432,6 +440,13 @@ config I2C_DESIGNWARE_PCI | |||
| 432 | This driver can also be built as a module. If so, the module | 440 | This driver can also be built as a module. If so, the module |
| 433 | will be called i2c-designware-pci. | 441 | will be called i2c-designware-pci. |
| 434 | 442 | ||
| 443 | config I2C_EFM32 | ||
| 444 | tristate "EFM32 I2C controller" | ||
| 445 | depends on ARCH_EFM32 || COMPILE_TEST | ||
| 446 | help | ||
| 447 | This driver supports the i2c block found in Energy Micro's EFM32 | ||
| 448 | SoCs. | ||
| 449 | |||
| 435 | config I2C_EG20T | 450 | config I2C_EG20T |
| 436 | tristate "Intel EG20T PCH/LAPIS Semicon IOH(ML7213/ML7223/ML7831) I2C" | 451 | tristate "Intel EG20T PCH/LAPIS Semicon IOH(ML7213/ML7223/ML7831) I2C" |
| 437 | depends on PCI | 452 | depends on PCI |
| @@ -527,7 +542,7 @@ config I2C_MPC | |||
| 527 | 542 | ||
| 528 | config I2C_MV64XXX | 543 | config I2C_MV64XXX |
| 529 | tristate "Marvell mv64xxx I2C Controller" | 544 | tristate "Marvell mv64xxx I2C Controller" |
| 530 | depends on (MV64X60 || PLAT_ORION || ARCH_SUNXI) | 545 | depends on MV64X60 || PLAT_ORION || ARCH_SUNXI |
| 531 | help | 546 | help |
| 532 | If you say yes to this option, support will be included for the | 547 | If you say yes to this option, support will be included for the |
| 533 | built-in I2C interface on the Marvell 64xxx line of host bridges. | 548 | built-in I2C interface on the Marvell 64xxx line of host bridges. |
| @@ -648,6 +663,16 @@ config I2C_PXA_SLAVE | |||
| 648 | is necessary for systems where the PXA may be a target on the | 663 | is necessary for systems where the PXA may be a target on the |
| 649 | I2C bus. | 664 | I2C bus. |
| 650 | 665 | ||
| 666 | config I2C_QUP | ||
| 667 | tristate "Qualcomm QUP based I2C controller" | ||
| 668 | depends on ARCH_QCOM | ||
| 669 | help | ||
| 670 | If you say yes to this option, support will be included for the | ||
| 671 | built-in I2C interface on the Qualcomm SoCs. | ||
| 672 | |||
| 673 | This driver can also be built as a module. If so, the module | ||
| 674 | will be called i2c-qup. | ||
| 675 | |||
| 651 | config I2C_RIIC | 676 | config I2C_RIIC |
| 652 | tristate "Renesas RIIC adapter" | 677 | tristate "Renesas RIIC adapter" |
| 653 | depends on ARCH_SHMOBILE || COMPILE_TEST | 678 | depends on ARCH_SHMOBILE || COMPILE_TEST |
diff --git a/drivers/i2c/busses/Makefile b/drivers/i2c/busses/Makefile index a08931fe73e1..18d18ff9db93 100644 --- a/drivers/i2c/busses/Makefile +++ b/drivers/i2c/busses/Makefile | |||
| @@ -33,6 +33,7 @@ obj-$(CONFIG_I2C_AT91) += i2c-at91.o | |||
| 33 | obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o | 33 | obj-$(CONFIG_I2C_AU1550) += i2c-au1550.o |
| 34 | obj-$(CONFIG_I2C_BCM2835) += i2c-bcm2835.o | 34 | obj-$(CONFIG_I2C_BCM2835) += i2c-bcm2835.o |
| 35 | obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o | 35 | obj-$(CONFIG_I2C_BLACKFIN_TWI) += i2c-bfin-twi.o |
| 36 | obj-$(CONFIG_I2C_CADENCE) += i2c-cadence.o | ||
| 36 | obj-$(CONFIG_I2C_CBUS_GPIO) += i2c-cbus-gpio.o | 37 | obj-$(CONFIG_I2C_CBUS_GPIO) += i2c-cbus-gpio.o |
| 37 | obj-$(CONFIG_I2C_CPM) += i2c-cpm.o | 38 | obj-$(CONFIG_I2C_CPM) += i2c-cpm.o |
| 38 | obj-$(CONFIG_I2C_DAVINCI) += i2c-davinci.o | 39 | obj-$(CONFIG_I2C_DAVINCI) += i2c-davinci.o |
| @@ -41,6 +42,7 @@ obj-$(CONFIG_I2C_DESIGNWARE_PLATFORM) += i2c-designware-platform.o | |||
| 41 | i2c-designware-platform-objs := i2c-designware-platdrv.o | 42 | i2c-designware-platform-objs := i2c-designware-platdrv.o |
| 42 | obj-$(CONFIG_I2C_DESIGNWARE_PCI) += i2c-designware-pci.o | 43 | obj-$(CONFIG_I2C_DESIGNWARE_PCI) += i2c-designware-pci.o |
| 43 | i2c-designware-pci-objs := i2c-designware-pcidrv.o | 44 | i2c-designware-pci-objs := i2c-designware-pcidrv.o |
| 45 | obj-$(CONFIG_I2C_EFM32) += i2c-efm32.o | ||
| 44 | obj-$(CONFIG_I2C_EG20T) += i2c-eg20t.o | 46 | obj-$(CONFIG_I2C_EG20T) += i2c-eg20t.o |
| 45 | obj-$(CONFIG_I2C_EXYNOS5) += i2c-exynos5.o | 47 | obj-$(CONFIG_I2C_EXYNOS5) += i2c-exynos5.o |
| 46 | obj-$(CONFIG_I2C_GPIO) += i2c-gpio.o | 48 | obj-$(CONFIG_I2C_GPIO) += i2c-gpio.o |
| @@ -63,6 +65,7 @@ obj-$(CONFIG_I2C_PNX) += i2c-pnx.o | |||
| 63 | obj-$(CONFIG_I2C_PUV3) += i2c-puv3.o | 65 | obj-$(CONFIG_I2C_PUV3) += i2c-puv3.o |
| 64 | obj-$(CONFIG_I2C_PXA) += i2c-pxa.o | 66 | obj-$(CONFIG_I2C_PXA) += i2c-pxa.o |
| 65 | obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o | 67 | obj-$(CONFIG_I2C_PXA_PCI) += i2c-pxa-pci.o |
| 68 | obj-$(CONFIG_I2C_QUP) += i2c-qup.o | ||
| 66 | obj-$(CONFIG_I2C_RIIC) += i2c-riic.o | 69 | obj-$(CONFIG_I2C_RIIC) += i2c-riic.o |
| 67 | obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o | 70 | obj-$(CONFIG_I2C_S3C2410) += i2c-s3c2410.o |
| 68 | obj-$(CONFIG_I2C_S6000) += i2c-s6000.o | 71 | obj-$(CONFIG_I2C_S6000) += i2c-s6000.o |
diff --git a/drivers/i2c/busses/i2c-ali1535.c b/drivers/i2c/busses/i2c-ali1535.c index 7d60d3a1f621..451e305f7971 100644 --- a/drivers/i2c/busses/i2c-ali1535.c +++ b/drivers/i2c/busses/i2c-ali1535.c | |||
| @@ -494,7 +494,7 @@ static struct i2c_adapter ali1535_adapter = { | |||
| 494 | .algo = &smbus_algorithm, | 494 | .algo = &smbus_algorithm, |
| 495 | }; | 495 | }; |
| 496 | 496 | ||
| 497 | static DEFINE_PCI_DEVICE_TABLE(ali1535_ids) = { | 497 | static const struct pci_device_id ali1535_ids[] = { |
| 498 | { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101) }, | 498 | { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101) }, |
| 499 | { }, | 499 | { }, |
| 500 | }; | 500 | }; |
diff --git a/drivers/i2c/busses/i2c-ali1563.c b/drivers/i2c/busses/i2c-ali1563.c index 4611e4754a67..98a1c97739ba 100644 --- a/drivers/i2c/busses/i2c-ali1563.c +++ b/drivers/i2c/busses/i2c-ali1563.c | |||
| @@ -416,7 +416,7 @@ static void ali1563_remove(struct pci_dev *dev) | |||
| 416 | ali1563_shutdown(dev); | 416 | ali1563_shutdown(dev); |
| 417 | } | 417 | } |
| 418 | 418 | ||
| 419 | static DEFINE_PCI_DEVICE_TABLE(ali1563_id_table) = { | 419 | static const struct pci_device_id ali1563_id_table[] = { |
| 420 | { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1563) }, | 420 | { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1563) }, |
| 421 | {}, | 421 | {}, |
| 422 | }; | 422 | }; |
diff --git a/drivers/i2c/busses/i2c-ali15x3.c b/drivers/i2c/busses/i2c-ali15x3.c index 4823206a4870..2fa21ce9682b 100644 --- a/drivers/i2c/busses/i2c-ali15x3.c +++ b/drivers/i2c/busses/i2c-ali15x3.c | |||
| @@ -476,7 +476,7 @@ static struct i2c_adapter ali15x3_adapter = { | |||
| 476 | .algo = &smbus_algorithm, | 476 | .algo = &smbus_algorithm, |
| 477 | }; | 477 | }; |
| 478 | 478 | ||
| 479 | static DEFINE_PCI_DEVICE_TABLE(ali15x3_ids) = { | 479 | static const struct pci_device_id ali15x3_ids[] = { |
| 480 | { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101) }, | 480 | { PCI_DEVICE(PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101) }, |
| 481 | { 0, } | 481 | { 0, } |
| 482 | }; | 482 | }; |
diff --git a/drivers/i2c/busses/i2c-amd756.c b/drivers/i2c/busses/i2c-amd756.c index 819d3c1062a7..a16f72891358 100644 --- a/drivers/i2c/busses/i2c-amd756.c +++ b/drivers/i2c/busses/i2c-amd756.c | |||
| @@ -307,7 +307,7 @@ static const char* chipname[] = { | |||
| 307 | "nVidia nForce", "AMD8111", | 307 | "nVidia nForce", "AMD8111", |
| 308 | }; | 308 | }; |
| 309 | 309 | ||
| 310 | static DEFINE_PCI_DEVICE_TABLE(amd756_ids) = { | 310 | static const struct pci_device_id amd756_ids[] = { |
| 311 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_740B), | 311 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_740B), |
| 312 | .driver_data = AMD756 }, | 312 | .driver_data = AMD756 }, |
| 313 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7413), | 313 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7413), |
diff --git a/drivers/i2c/busses/i2c-amd8111.c b/drivers/i2c/busses/i2c-amd8111.c index f3d4d79855b5..95a80a8f81b5 100644 --- a/drivers/i2c/busses/i2c-amd8111.c +++ b/drivers/i2c/busses/i2c-amd8111.c | |||
| @@ -414,7 +414,7 @@ static const struct i2c_algorithm smbus_algorithm = { | |||
| 414 | }; | 414 | }; |
| 415 | 415 | ||
| 416 | 416 | ||
| 417 | static DEFINE_PCI_DEVICE_TABLE(amd8111_ids) = { | 417 | static const struct pci_device_id amd8111_ids[] = { |
| 418 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8111_SMBUS2) }, | 418 | { PCI_DEVICE(PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8111_SMBUS2) }, |
| 419 | { 0, } | 419 | { 0, } |
| 420 | }; | 420 | }; |
diff --git a/drivers/i2c/busses/i2c-at91.c b/drivers/i2c/busses/i2c-at91.c index 843d01268ae9..e95f9ba96790 100644 --- a/drivers/i2c/busses/i2c-at91.c +++ b/drivers/i2c/busses/i2c-at91.c | |||
| @@ -32,7 +32,7 @@ | |||
| 32 | #include <linux/slab.h> | 32 | #include <linux/slab.h> |
| 33 | #include <linux/platform_data/dma-atmel.h> | 33 | #include <linux/platform_data/dma-atmel.h> |
| 34 | 34 | ||
| 35 | #define TWI_CLK_HZ 100000 /* max 400 Kbits/s */ | 35 | #define DEFAULT_TWI_CLK_HZ 100000 /* max 400 Kbits/s */ |
| 36 | #define AT91_I2C_TIMEOUT msecs_to_jiffies(100) /* transfer timeout */ | 36 | #define AT91_I2C_TIMEOUT msecs_to_jiffies(100) /* transfer timeout */ |
| 37 | #define AT91_I2C_DMA_THRESHOLD 8 /* enable DMA if transfer size is bigger than this threshold */ | 37 | #define AT91_I2C_DMA_THRESHOLD 8 /* enable DMA if transfer size is bigger than this threshold */ |
| 38 | 38 | ||
| @@ -711,6 +711,7 @@ static int at91_twi_probe(struct platform_device *pdev) | |||
| 711 | struct resource *mem; | 711 | struct resource *mem; |
| 712 | int rc; | 712 | int rc; |
| 713 | u32 phy_addr; | 713 | u32 phy_addr; |
| 714 | u32 bus_clk_rate; | ||
| 714 | 715 | ||
| 715 | dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); | 716 | dev = devm_kzalloc(&pdev->dev, sizeof(*dev), GFP_KERNEL); |
| 716 | if (!dev) | 717 | if (!dev) |
| @@ -756,13 +757,18 @@ static int at91_twi_probe(struct platform_device *pdev) | |||
| 756 | dev->use_dma = true; | 757 | dev->use_dma = true; |
| 757 | } | 758 | } |
| 758 | 759 | ||
| 759 | at91_calc_twi_clock(dev, TWI_CLK_HZ); | 760 | rc = of_property_read_u32(dev->dev->of_node, "clock-frequency", |
| 761 | &bus_clk_rate); | ||
| 762 | if (rc) | ||
| 763 | bus_clk_rate = DEFAULT_TWI_CLK_HZ; | ||
| 764 | |||
| 765 | at91_calc_twi_clock(dev, bus_clk_rate); | ||
| 760 | at91_init_twi_bus(dev); | 766 | at91_init_twi_bus(dev); |
| 761 | 767 | ||
| 762 | snprintf(dev->adapter.name, sizeof(dev->adapter.name), "AT91"); | 768 | snprintf(dev->adapter.name, sizeof(dev->adapter.name), "AT91"); |
| 763 | i2c_set_adapdata(&dev->adapter, dev); | 769 | i2c_set_adapdata(&dev->adapter, dev); |
| 764 | dev->adapter.owner = THIS_MODULE; | 770 | dev->adapter.owner = THIS_MODULE; |
| 765 | dev->adapter.class = I2C_CLASS_HWMON; | 771 | dev->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_DEPRECATED; |
| 766 | dev->adapter.algo = &at91_twi_algorithm; | 772 | dev->adapter.algo = &at91_twi_algorithm; |
| 767 | dev->adapter.dev.parent = dev->dev; | 773 | dev->adapter.dev.parent = dev->dev; |
| 768 | dev->adapter.nr = pdev->id; | 774 | dev->adapter.nr = pdev->id; |
diff --git a/drivers/i2c/busses/i2c-bcm2835.c b/drivers/i2c/busses/i2c-bcm2835.c index 77df97b932af..c60719577fc3 100644 --- a/drivers/i2c/busses/i2c-bcm2835.c +++ b/drivers/i2c/busses/i2c-bcm2835.c | |||
| @@ -219,7 +219,7 @@ static const struct i2c_algorithm bcm2835_i2c_algo = { | |||
| 219 | static int bcm2835_i2c_probe(struct platform_device *pdev) | 219 | static int bcm2835_i2c_probe(struct platform_device *pdev) |
| 220 | { | 220 | { |
| 221 | struct bcm2835_i2c_dev *i2c_dev; | 221 | struct bcm2835_i2c_dev *i2c_dev; |
| 222 | struct resource *mem, *requested, *irq; | 222 | struct resource *mem, *irq; |
| 223 | u32 bus_clk_rate, divider; | 223 | u32 bus_clk_rate, divider; |
| 224 | int ret; | 224 | int ret; |
| 225 | struct i2c_adapter *adap; | 225 | struct i2c_adapter *adap; |
| @@ -234,25 +234,9 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) | |||
| 234 | init_completion(&i2c_dev->completion); | 234 | init_completion(&i2c_dev->completion); |
| 235 | 235 | ||
| 236 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 236 | mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 237 | if (!mem) { | 237 | i2c_dev->regs = devm_ioremap_resource(&pdev->dev, mem); |
| 238 | dev_err(&pdev->dev, "No mem resource\n"); | 238 | if (IS_ERR(i2c_dev->regs)) |
| 239 | return -ENODEV; | 239 | return PTR_ERR(i2c_dev->regs); |
| 240 | } | ||
| 241 | |||
| 242 | requested = devm_request_mem_region(&pdev->dev, mem->start, | ||
| 243 | resource_size(mem), | ||
| 244 | dev_name(&pdev->dev)); | ||
| 245 | if (!requested) { | ||
| 246 | dev_err(&pdev->dev, "Could not claim register region\n"); | ||
| 247 | return -EBUSY; | ||
| 248 | } | ||
| 249 | |||
| 250 | i2c_dev->regs = devm_ioremap(&pdev->dev, mem->start, | ||
| 251 | resource_size(mem)); | ||
| 252 | if (!i2c_dev->regs) { | ||
| 253 | dev_err(&pdev->dev, "Could not map registers\n"); | ||
| 254 | return -ENOMEM; | ||
| 255 | } | ||
| 256 | 240 | ||
| 257 | i2c_dev->clk = devm_clk_get(&pdev->dev, NULL); | 241 | i2c_dev->clk = devm_clk_get(&pdev->dev, NULL); |
| 258 | if (IS_ERR(i2c_dev->clk)) { | 242 | if (IS_ERR(i2c_dev->clk)) { |
| @@ -295,7 +279,7 @@ static int bcm2835_i2c_probe(struct platform_device *pdev) | |||
| 295 | adap = &i2c_dev->adapter; | 279 | adap = &i2c_dev->adapter; |
| 296 | i2c_set_adapdata(adap, i2c_dev); | 280 | i2c_set_adapdata(adap, i2c_dev); |
| 297 | adap->owner = THIS_MODULE; | 281 | adap->owner = THIS_MODULE; |
| 298 | adap->class = I2C_CLASS_HWMON; | 282 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_DEPRECATED; |
| 299 | strlcpy(adap->name, "bcm2835 I2C adapter", sizeof(adap->name)); | 283 | strlcpy(adap->name, "bcm2835 I2C adapter", sizeof(adap->name)); |
| 300 | adap->algo = &bcm2835_i2c_algo; | 284 | adap->algo = &bcm2835_i2c_algo; |
| 301 | adap->dev.parent = &pdev->dev; | 285 | adap->dev.parent = &pdev->dev; |
diff --git a/drivers/i2c/busses/i2c-bfin-twi.c b/drivers/i2c/busses/i2c-bfin-twi.c index 3b9bd9a3f2b0..e6d5162b6379 100644 --- a/drivers/i2c/busses/i2c-bfin-twi.c +++ b/drivers/i2c/busses/i2c-bfin-twi.c | |||
| @@ -21,10 +21,10 @@ | |||
| 21 | #include <linux/interrupt.h> | 21 | #include <linux/interrupt.h> |
| 22 | #include <linux/platform_device.h> | 22 | #include <linux/platform_device.h> |
| 23 | #include <linux/delay.h> | 23 | #include <linux/delay.h> |
| 24 | #include <linux/i2c/bfin_twi.h> | ||
| 24 | 25 | ||
| 25 | #include <asm/blackfin.h> | ||
| 26 | #include <asm/portmux.h> | ||
| 27 | #include <asm/irq.h> | 26 | #include <asm/irq.h> |
| 27 | #include <asm/portmux.h> | ||
| 28 | #include <asm/bfin_twi.h> | 28 | #include <asm/bfin_twi.h> |
| 29 | 29 | ||
| 30 | /* SMBus mode*/ | 30 | /* SMBus mode*/ |
| @@ -65,7 +65,6 @@ static void bfin_twi_handle_interrupt(struct bfin_twi_iface *iface, | |||
| 65 | /* Transmit next data */ | 65 | /* Transmit next data */ |
| 66 | while (iface->writeNum > 0 && | 66 | while (iface->writeNum > 0 && |
| 67 | (read_FIFO_STAT(iface) & XMTSTAT) != XMT_FULL) { | 67 | (read_FIFO_STAT(iface) & XMTSTAT) != XMT_FULL) { |
| 68 | SSYNC(); | ||
| 69 | write_XMT_DATA8(iface, *(iface->transPtr++)); | 68 | write_XMT_DATA8(iface, *(iface->transPtr++)); |
| 70 | iface->writeNum--; | 69 | iface->writeNum--; |
| 71 | } | 70 | } |
| @@ -248,7 +247,6 @@ static irqreturn_t bfin_twi_interrupt_entry(int irq, void *dev_id) | |||
| 248 | /* Clear interrupt status */ | 247 | /* Clear interrupt status */ |
| 249 | write_INT_STAT(iface, twi_int_status); | 248 | write_INT_STAT(iface, twi_int_status); |
| 250 | bfin_twi_handle_interrupt(iface, twi_int_status); | 249 | bfin_twi_handle_interrupt(iface, twi_int_status); |
| 251 | SSYNC(); | ||
| 252 | } | 250 | } |
| 253 | spin_unlock_irqrestore(&iface->lock, flags); | 251 | spin_unlock_irqrestore(&iface->lock, flags); |
| 254 | return IRQ_HANDLED; | 252 | return IRQ_HANDLED; |
| @@ -294,9 +292,7 @@ static int bfin_twi_do_master_xfer(struct i2c_adapter *adap, | |||
| 294 | * discarded before start a new operation. | 292 | * discarded before start a new operation. |
| 295 | */ | 293 | */ |
| 296 | write_FIFO_CTL(iface, 0x3); | 294 | write_FIFO_CTL(iface, 0x3); |
| 297 | SSYNC(); | ||
| 298 | write_FIFO_CTL(iface, 0); | 295 | write_FIFO_CTL(iface, 0); |
| 299 | SSYNC(); | ||
| 300 | 296 | ||
| 301 | if (pmsg->flags & I2C_M_RD) | 297 | if (pmsg->flags & I2C_M_RD) |
| 302 | iface->read_write = I2C_SMBUS_READ; | 298 | iface->read_write = I2C_SMBUS_READ; |
| @@ -306,7 +302,6 @@ static int bfin_twi_do_master_xfer(struct i2c_adapter *adap, | |||
| 306 | if (iface->writeNum > 0) { | 302 | if (iface->writeNum > 0) { |
| 307 | write_XMT_DATA8(iface, *(iface->transPtr++)); | 303 | write_XMT_DATA8(iface, *(iface->transPtr++)); |
| 308 | iface->writeNum--; | 304 | iface->writeNum--; |
| 309 | SSYNC(); | ||
| 310 | } | 305 | } |
| 311 | } | 306 | } |
| 312 | 307 | ||
| @@ -315,7 +310,6 @@ static int bfin_twi_do_master_xfer(struct i2c_adapter *adap, | |||
| 315 | 310 | ||
| 316 | /* Interrupt mask . Enable XMT, RCV interrupt */ | 311 | /* Interrupt mask . Enable XMT, RCV interrupt */ |
| 317 | write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV); | 312 | write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV); |
| 318 | SSYNC(); | ||
| 319 | 313 | ||
| 320 | if (pmsg->len <= 255) | 314 | if (pmsg->len <= 255) |
| 321 | write_MASTER_CTL(iface, pmsg->len << 6); | 315 | write_MASTER_CTL(iface, pmsg->len << 6); |
| @@ -329,7 +323,6 @@ static int bfin_twi_do_master_xfer(struct i2c_adapter *adap, | |||
| 329 | (iface->msg_num > 1 ? RSTART : 0) | | 323 | (iface->msg_num > 1 ? RSTART : 0) | |
| 330 | ((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) | | 324 | ((iface->read_write == I2C_SMBUS_READ) ? MDIR : 0) | |
| 331 | ((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0)); | 325 | ((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0)); |
| 332 | SSYNC(); | ||
| 333 | 326 | ||
| 334 | while (!iface->result) { | 327 | while (!iface->result) { |
| 335 | if (!wait_for_completion_timeout(&iface->complete, | 328 | if (!wait_for_completion_timeout(&iface->complete, |
| @@ -453,7 +446,6 @@ int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr, | |||
| 453 | * start a new operation. | 446 | * start a new operation. |
| 454 | */ | 447 | */ |
| 455 | write_FIFO_CTL(iface, 0x3); | 448 | write_FIFO_CTL(iface, 0x3); |
| 456 | SSYNC(); | ||
| 457 | write_FIFO_CTL(iface, 0); | 449 | write_FIFO_CTL(iface, 0); |
| 458 | 450 | ||
| 459 | /* clear int stat */ | 451 | /* clear int stat */ |
| @@ -461,7 +453,6 @@ int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr, | |||
| 461 | 453 | ||
| 462 | /* Set Transmit device address */ | 454 | /* Set Transmit device address */ |
| 463 | write_MASTER_ADDR(iface, addr); | 455 | write_MASTER_ADDR(iface, addr); |
| 464 | SSYNC(); | ||
| 465 | 456 | ||
| 466 | switch (iface->cur_mode) { | 457 | switch (iface->cur_mode) { |
| 467 | case TWI_I2C_MODE_STANDARDSUB: | 458 | case TWI_I2C_MODE_STANDARDSUB: |
| @@ -469,7 +460,6 @@ int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr, | |||
| 469 | write_INT_MASK(iface, MCOMP | MERR | | 460 | write_INT_MASK(iface, MCOMP | MERR | |
| 470 | ((iface->read_write == I2C_SMBUS_READ) ? | 461 | ((iface->read_write == I2C_SMBUS_READ) ? |
| 471 | RCVSERV : XMTSERV)); | 462 | RCVSERV : XMTSERV)); |
| 472 | SSYNC(); | ||
| 473 | 463 | ||
| 474 | if (iface->writeNum + 1 <= 255) | 464 | if (iface->writeNum + 1 <= 255) |
| 475 | write_MASTER_CTL(iface, (iface->writeNum + 1) << 6); | 465 | write_MASTER_CTL(iface, (iface->writeNum + 1) << 6); |
| @@ -484,7 +474,6 @@ int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr, | |||
| 484 | case TWI_I2C_MODE_COMBINED: | 474 | case TWI_I2C_MODE_COMBINED: |
| 485 | write_XMT_DATA8(iface, iface->command); | 475 | write_XMT_DATA8(iface, iface->command); |
| 486 | write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV); | 476 | write_INT_MASK(iface, MCOMP | MERR | RCVSERV | XMTSERV); |
| 487 | SSYNC(); | ||
| 488 | 477 | ||
| 489 | if (iface->writeNum > 0) | 478 | if (iface->writeNum > 0) |
| 490 | write_MASTER_CTL(iface, (iface->writeNum + 1) << 6); | 479 | write_MASTER_CTL(iface, (iface->writeNum + 1) << 6); |
| @@ -531,7 +520,6 @@ int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr, | |||
| 531 | write_INT_MASK(iface, MCOMP | MERR | | 520 | write_INT_MASK(iface, MCOMP | MERR | |
| 532 | ((iface->read_write == I2C_SMBUS_READ) ? | 521 | ((iface->read_write == I2C_SMBUS_READ) ? |
| 533 | RCVSERV : XMTSERV)); | 522 | RCVSERV : XMTSERV)); |
| 534 | SSYNC(); | ||
| 535 | 523 | ||
| 536 | /* Master enable */ | 524 | /* Master enable */ |
| 537 | write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN | | 525 | write_MASTER_CTL(iface, read_MASTER_CTL(iface) | MEN | |
| @@ -539,7 +527,6 @@ int bfin_twi_do_smbus_xfer(struct i2c_adapter *adap, u16 addr, | |||
| 539 | ((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0)); | 527 | ((CONFIG_I2C_BLACKFIN_TWI_CLK_KHZ > 100) ? FAST : 0)); |
| 540 | break; | 528 | break; |
| 541 | } | 529 | } |
| 542 | SSYNC(); | ||
| 543 | 530 | ||
| 544 | while (!iface->result) { | 531 | while (!iface->result) { |
| 545 | if (!wait_for_completion_timeout(&iface->complete, | 532 | if (!wait_for_completion_timeout(&iface->complete, |
| @@ -669,7 +656,7 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
| 669 | strlcpy(p_adap->name, pdev->name, sizeof(p_adap->name)); | 656 | strlcpy(p_adap->name, pdev->name, sizeof(p_adap->name)); |
| 670 | p_adap->algo = &bfin_twi_algorithm; | 657 | p_adap->algo = &bfin_twi_algorithm; |
| 671 | p_adap->algo_data = iface; | 658 | p_adap->algo_data = iface; |
| 672 | p_adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; | 659 | p_adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED; |
| 673 | p_adap->dev.parent = &pdev->dev; | 660 | p_adap->dev.parent = &pdev->dev; |
| 674 | p_adap->timeout = 5 * HZ; | 661 | p_adap->timeout = 5 * HZ; |
| 675 | p_adap->retries = 3; | 662 | p_adap->retries = 3; |
| @@ -704,7 +691,6 @@ static int i2c_bfin_twi_probe(struct platform_device *pdev) | |||
| 704 | 691 | ||
| 705 | /* Enable TWI */ | 692 | /* Enable TWI */ |
| 706 | write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA); | 693 | write_CONTROL(iface, read_CONTROL(iface) | TWI_ENA); |
| 707 | SSYNC(); | ||
| 708 | 694 | ||
| 709 | rc = i2c_add_numbered_adapter(p_adap); | 695 | rc = i2c_add_numbered_adapter(p_adap); |
| 710 | if (rc < 0) { | 696 | if (rc < 0) { |
diff --git a/drivers/i2c/busses/i2c-cadence.c b/drivers/i2c/busses/i2c-cadence.c new file mode 100644 index 000000000000..63f3f03ecc9b --- /dev/null +++ b/drivers/i2c/busses/i2c-cadence.c | |||
| @@ -0,0 +1,905 @@ | |||
| 1 | /* | ||
| 2 | * I2C bus driver for the Cadence I2C controller. | ||
| 3 | * | ||
| 4 | * Copyright (C) 2009 - 2014 Xilinx, Inc. | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it | ||
| 7 | * and/or modify it under the terms of the GNU General Public | ||
| 8 | * License as published by the Free Software Foundation; | ||
| 9 | * either version 2 of the License, or (at your option) any | ||
| 10 | * later version. | ||
| 11 | */ | ||
| 12 | |||
| 13 | #include <linux/clk.h> | ||
| 14 | #include <linux/delay.h> | ||
| 15 | #include <linux/i2c.h> | ||
| 16 | #include <linux/interrupt.h> | ||
| 17 | #include <linux/io.h> | ||
| 18 | #include <linux/module.h> | ||
| 19 | #include <linux/platform_device.h> | ||
| 20 | |||
| 21 | /* Register offsets for the I2C device. */ | ||
| 22 | #define CDNS_I2C_CR_OFFSET 0x00 /* Control Register, RW */ | ||
| 23 | #define CDNS_I2C_SR_OFFSET 0x04 /* Status Register, RO */ | ||
| 24 | #define CDNS_I2C_ADDR_OFFSET 0x08 /* I2C Address Register, RW */ | ||
| 25 | #define CDNS_I2C_DATA_OFFSET 0x0C /* I2C Data Register, RW */ | ||
| 26 | #define CDNS_I2C_ISR_OFFSET 0x10 /* IRQ Status Register, RW */ | ||
| 27 | #define CDNS_I2C_XFER_SIZE_OFFSET 0x14 /* Transfer Size Register, RW */ | ||
| 28 | #define CDNS_I2C_TIME_OUT_OFFSET 0x1C /* Time Out Register, RW */ | ||
| 29 | #define CDNS_I2C_IER_OFFSET 0x24 /* IRQ Enable Register, WO */ | ||
| 30 | #define CDNS_I2C_IDR_OFFSET 0x28 /* IRQ Disable Register, WO */ | ||
| 31 | |||
| 32 | /* Control Register Bit mask definitions */ | ||
| 33 | #define CDNS_I2C_CR_HOLD BIT(4) /* Hold Bus bit */ | ||
| 34 | #define CDNS_I2C_CR_ACK_EN BIT(3) | ||
| 35 | #define CDNS_I2C_CR_NEA BIT(2) | ||
| 36 | #define CDNS_I2C_CR_MS BIT(1) | ||
| 37 | /* Read or Write Master transfer 0 = Transmitter, 1 = Receiver */ | ||
| 38 | #define CDNS_I2C_CR_RW BIT(0) | ||
| 39 | /* 1 = Auto init FIFO to zeroes */ | ||
| 40 | #define CDNS_I2C_CR_CLR_FIFO BIT(6) | ||
| 41 | #define CDNS_I2C_CR_DIVA_SHIFT 14 | ||
| 42 | #define CDNS_I2C_CR_DIVA_MASK (3 << CDNS_I2C_CR_DIVA_SHIFT) | ||
| 43 | #define CDNS_I2C_CR_DIVB_SHIFT 8 | ||
| 44 | #define CDNS_I2C_CR_DIVB_MASK (0x3f << CDNS_I2C_CR_DIVB_SHIFT) | ||
| 45 | |||
| 46 | /* Status Register Bit mask definitions */ | ||
| 47 | #define CDNS_I2C_SR_BA BIT(8) | ||
| 48 | #define CDNS_I2C_SR_RXDV BIT(5) | ||
| 49 | |||
| 50 | /* | ||
| 51 | * I2C Address Register Bit mask definitions | ||
| 52 | * Normal addressing mode uses [6:0] bits. Extended addressing mode uses [9:0] | ||
| 53 | * bits. A write access to this register always initiates a transfer if the I2C | ||
| 54 | * is in master mode. | ||
| 55 | */ | ||
| 56 | #define CDNS_I2C_ADDR_MASK 0x000003FF /* I2C Address Mask */ | ||
| 57 | |||
| 58 | /* | ||
| 59 | * I2C Interrupt Registers Bit mask definitions | ||
| 60 | * All the four interrupt registers (Status/Mask/Enable/Disable) have the same | ||
| 61 | * bit definitions. | ||
| 62 | */ | ||
| 63 | #define CDNS_I2C_IXR_ARB_LOST BIT(9) | ||
| 64 | #define CDNS_I2C_IXR_RX_UNF BIT(7) | ||
| 65 | #define CDNS_I2C_IXR_TX_OVF BIT(6) | ||
| 66 | #define CDNS_I2C_IXR_RX_OVF BIT(5) | ||
| 67 | #define CDNS_I2C_IXR_SLV_RDY BIT(4) | ||
| 68 | #define CDNS_I2C_IXR_TO BIT(3) | ||
| 69 | #define CDNS_I2C_IXR_NACK BIT(2) | ||
| 70 | #define CDNS_I2C_IXR_DATA BIT(1) | ||
| 71 | #define CDNS_I2C_IXR_COMP BIT(0) | ||
| 72 | |||
| 73 | #define CDNS_I2C_IXR_ALL_INTR_MASK (CDNS_I2C_IXR_ARB_LOST | \ | ||
| 74 | CDNS_I2C_IXR_RX_UNF | \ | ||
| 75 | CDNS_I2C_IXR_TX_OVF | \ | ||
| 76 | CDNS_I2C_IXR_RX_OVF | \ | ||
| 77 | CDNS_I2C_IXR_SLV_RDY | \ | ||
| 78 | CDNS_I2C_IXR_TO | \ | ||
| 79 | CDNS_I2C_IXR_NACK | \ | ||
| 80 | CDNS_I2C_IXR_DATA | \ | ||
| 81 | CDNS_I2C_IXR_COMP) | ||
| 82 | |||
| 83 | #define CDNS_I2C_IXR_ERR_INTR_MASK (CDNS_I2C_IXR_ARB_LOST | \ | ||
| 84 | CDNS_I2C_IXR_RX_UNF | \ | ||
| 85 | CDNS_I2C_IXR_TX_OVF | \ | ||
| 86 | CDNS_I2C_IXR_RX_OVF | \ | ||
| 87 | CDNS_I2C_IXR_NACK) | ||
| 88 | |||
| 89 | #define CDNS_I2C_ENABLED_INTR_MASK (CDNS_I2C_IXR_ARB_LOST | \ | ||
| 90 | CDNS_I2C_IXR_RX_UNF | \ | ||
| 91 | CDNS_I2C_IXR_TX_OVF | \ | ||
| 92 | CDNS_I2C_IXR_RX_OVF | \ | ||
| 93 | CDNS_I2C_IXR_NACK | \ | ||
| 94 | CDNS_I2C_IXR_DATA | \ | ||
| 95 | CDNS_I2C_IXR_COMP) | ||
| 96 | |||
| 97 | #define CDNS_I2C_TIMEOUT msecs_to_jiffies(1000) | ||
| 98 | |||
| 99 | #define CDNS_I2C_FIFO_DEPTH 16 | ||
| 100 | /* FIFO depth at which the DATA interrupt occurs */ | ||
| 101 | #define CDNS_I2C_DATA_INTR_DEPTH (CDNS_I2C_FIFO_DEPTH - 2) | ||
| 102 | #define CDNS_I2C_MAX_TRANSFER_SIZE 255 | ||
| 103 | /* Transfer size in multiples of data interrupt depth */ | ||
| 104 | #define CDNS_I2C_TRANSFER_SIZE (CDNS_I2C_MAX_TRANSFER_SIZE - 3) | ||
| 105 | |||
| 106 | #define DRIVER_NAME "cdns-i2c" | ||
| 107 | |||
| 108 | #define CDNS_I2C_SPEED_MAX 400000 | ||
| 109 | #define CDNS_I2C_SPEED_DEFAULT 100000 | ||
| 110 | |||
| 111 | #define CDNS_I2C_DIVA_MAX 4 | ||
| 112 | #define CDNS_I2C_DIVB_MAX 64 | ||
| 113 | |||
| 114 | #define cdns_i2c_readreg(offset) readl_relaxed(id->membase + offset) | ||
| 115 | #define cdns_i2c_writereg(val, offset) writel_relaxed(val, id->membase + offset) | ||
| 116 | |||
| 117 | /** | ||
| 118 | * struct cdns_i2c - I2C device private data structure | ||
| 119 | * @membase: Base address of the I2C device | ||
| 120 | * @adap: I2C adapter instance | ||
| 121 | * @p_msg: Message pointer | ||
| 122 | * @err_status: Error status in Interrupt Status Register | ||
| 123 | * @xfer_done: Transfer complete status | ||
| 124 | * @p_send_buf: Pointer to transmit buffer | ||
| 125 | * @p_recv_buf: Pointer to receive buffer | ||
| 126 | * @suspended: Flag holding the device's PM status | ||
| 127 | * @send_count: Number of bytes still expected to send | ||
| 128 | * @recv_count: Number of bytes still expected to receive | ||
| 129 | * @irq: IRQ number | ||
| 130 | * @input_clk: Input clock to I2C controller | ||
| 131 | * @i2c_clk: Maximum I2C clock speed | ||
| 132 | * @bus_hold_flag: Flag used in repeated start for clearing HOLD bit | ||
| 133 | * @clk: Pointer to struct clk | ||
| 134 | * @clk_rate_change_nb: Notifier block for clock rate changes | ||
| 135 | */ | ||
| 136 | struct cdns_i2c { | ||
| 137 | void __iomem *membase; | ||
| 138 | struct i2c_adapter adap; | ||
| 139 | struct i2c_msg *p_msg; | ||
| 140 | int err_status; | ||
| 141 | struct completion xfer_done; | ||
| 142 | unsigned char *p_send_buf; | ||
| 143 | unsigned char *p_recv_buf; | ||
| 144 | u8 suspended; | ||
| 145 | unsigned int send_count; | ||
| 146 | unsigned int recv_count; | ||
| 147 | int irq; | ||
| 148 | unsigned long input_clk; | ||
| 149 | unsigned int i2c_clk; | ||
| 150 | unsigned int bus_hold_flag; | ||
| 151 | struct clk *clk; | ||
| 152 | struct notifier_block clk_rate_change_nb; | ||
| 153 | }; | ||
| 154 | |||
| 155 | #define to_cdns_i2c(_nb) container_of(_nb, struct cdns_i2c, \ | ||
| 156 | clk_rate_change_nb) | ||
| 157 | |||
| 158 | /** | ||
| 159 | * cdns_i2c_clear_bus_hold() - Clear bus hold bit | ||
| 160 | * @id: Pointer to driver data struct | ||
| 161 | * | ||
| 162 | * Helper to clear the controller's bus hold bit. | ||
| 163 | */ | ||
| 164 | static void cdns_i2c_clear_bus_hold(struct cdns_i2c *id) | ||
| 165 | { | ||
| 166 | u32 reg = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET); | ||
| 167 | if (reg & CDNS_I2C_CR_HOLD) | ||
| 168 | cdns_i2c_writereg(reg & ~CDNS_I2C_CR_HOLD, CDNS_I2C_CR_OFFSET); | ||
| 169 | } | ||
| 170 | |||
| 171 | /** | ||
| 172 | * cdns_i2c_isr - Interrupt handler for the I2C device | ||
| 173 | * @irq: irq number for the I2C device | ||
| 174 | * @ptr: void pointer to cdns_i2c structure | ||
| 175 | * | ||
| 176 | * This function handles the data interrupt, transfer complete interrupt and | ||
| 177 | * the error interrupts of the I2C device. | ||
| 178 | * | ||
| 179 | * Return: IRQ_HANDLED always | ||
| 180 | */ | ||
| 181 | static irqreturn_t cdns_i2c_isr(int irq, void *ptr) | ||
| 182 | { | ||
| 183 | unsigned int isr_status, avail_bytes; | ||
| 184 | unsigned int bytes_to_recv, bytes_to_send; | ||
| 185 | struct cdns_i2c *id = ptr; | ||
| 186 | /* Signal completion only after everything is updated */ | ||
| 187 | int done_flag = 0; | ||
| 188 | irqreturn_t status = IRQ_NONE; | ||
| 189 | |||
| 190 | isr_status = cdns_i2c_readreg(CDNS_I2C_ISR_OFFSET); | ||
| 191 | |||
| 192 | /* Handling nack and arbitration lost interrupt */ | ||
| 193 | if (isr_status & (CDNS_I2C_IXR_NACK | CDNS_I2C_IXR_ARB_LOST)) { | ||
| 194 | done_flag = 1; | ||
| 195 | status = IRQ_HANDLED; | ||
| 196 | } | ||
| 197 | |||
| 198 | /* Handling Data interrupt */ | ||
| 199 | if ((isr_status & CDNS_I2C_IXR_DATA) && | ||
| 200 | (id->recv_count >= CDNS_I2C_DATA_INTR_DEPTH)) { | ||
| 201 | /* Always read data interrupt threshold bytes */ | ||
| 202 | bytes_to_recv = CDNS_I2C_DATA_INTR_DEPTH; | ||
| 203 | id->recv_count -= CDNS_I2C_DATA_INTR_DEPTH; | ||
| 204 | avail_bytes = cdns_i2c_readreg(CDNS_I2C_XFER_SIZE_OFFSET); | ||
| 205 | |||
| 206 | /* | ||
| 207 | * if the tranfer size register value is zero, then | ||
| 208 | * check for the remaining bytes and update the | ||
| 209 | * transfer size register. | ||
| 210 | */ | ||
| 211 | if (!avail_bytes) { | ||
| 212 | if (id->recv_count > CDNS_I2C_TRANSFER_SIZE) | ||
| 213 | cdns_i2c_writereg(CDNS_I2C_TRANSFER_SIZE, | ||
| 214 | CDNS_I2C_XFER_SIZE_OFFSET); | ||
| 215 | else | ||
| 216 | cdns_i2c_writereg(id->recv_count, | ||
| 217 | CDNS_I2C_XFER_SIZE_OFFSET); | ||
| 218 | } | ||
| 219 | |||
| 220 | /* Process the data received */ | ||
| 221 | while (bytes_to_recv--) | ||
| 222 | *(id->p_recv_buf)++ = | ||
| 223 | cdns_i2c_readreg(CDNS_I2C_DATA_OFFSET); | ||
| 224 | |||
| 225 | if (!id->bus_hold_flag && | ||
| 226 | (id->recv_count <= CDNS_I2C_FIFO_DEPTH)) | ||
| 227 | cdns_i2c_clear_bus_hold(id); | ||
| 228 | |||
| 229 | status = IRQ_HANDLED; | ||
| 230 | } | ||
| 231 | |||
| 232 | /* Handling Transfer Complete interrupt */ | ||
| 233 | if (isr_status & CDNS_I2C_IXR_COMP) { | ||
| 234 | if (!id->p_recv_buf) { | ||
| 235 | /* | ||
| 236 | * If the device is sending data If there is further | ||
| 237 | * data to be sent. Calculate the available space | ||
| 238 | * in FIFO and fill the FIFO with that many bytes. | ||
| 239 | */ | ||
| 240 | if (id->send_count) { | ||
| 241 | avail_bytes = CDNS_I2C_FIFO_DEPTH - | ||
| 242 | cdns_i2c_readreg(CDNS_I2C_XFER_SIZE_OFFSET); | ||
| 243 | if (id->send_count > avail_bytes) | ||
| 244 | bytes_to_send = avail_bytes; | ||
| 245 | else | ||
| 246 | bytes_to_send = id->send_count; | ||
| 247 | |||
| 248 | while (bytes_to_send--) { | ||
| 249 | cdns_i2c_writereg( | ||
| 250 | (*(id->p_send_buf)++), | ||
| 251 | CDNS_I2C_DATA_OFFSET); | ||
| 252 | id->send_count--; | ||
| 253 | } | ||
| 254 | } else { | ||
| 255 | /* | ||
| 256 | * Signal the completion of transaction and | ||
| 257 | * clear the hold bus bit if there are no | ||
| 258 | * further messages to be processed. | ||
| 259 | */ | ||
| 260 | done_flag = 1; | ||
| 261 | } | ||
| 262 | if (!id->send_count && !id->bus_hold_flag) | ||
| 263 | cdns_i2c_clear_bus_hold(id); | ||
| 264 | } else { | ||
| 265 | if (!id->bus_hold_flag) | ||
| 266 | cdns_i2c_clear_bus_hold(id); | ||
| 267 | /* | ||
| 268 | * If the device is receiving data, then signal | ||
| 269 | * the completion of transaction and read the data | ||
| 270 | * present in the FIFO. Signal the completion of | ||
| 271 | * transaction. | ||
| 272 | */ | ||
| 273 | while (cdns_i2c_readreg(CDNS_I2C_SR_OFFSET) & | ||
| 274 | CDNS_I2C_SR_RXDV) { | ||
| 275 | *(id->p_recv_buf)++ = | ||
| 276 | cdns_i2c_readreg(CDNS_I2C_DATA_OFFSET); | ||
| 277 | id->recv_count--; | ||
| 278 | } | ||
| 279 | done_flag = 1; | ||
| 280 | } | ||
| 281 | |||
| 282 | status = IRQ_HANDLED; | ||
| 283 | } | ||
| 284 | |||
| 285 | /* Update the status for errors */ | ||
| 286 | id->err_status = isr_status & CDNS_I2C_IXR_ERR_INTR_MASK; | ||
| 287 | if (id->err_status) | ||
| 288 | status = IRQ_HANDLED; | ||
| 289 | |||
| 290 | cdns_i2c_writereg(isr_status, CDNS_I2C_ISR_OFFSET); | ||
| 291 | |||
| 292 | if (done_flag) | ||
| 293 | complete(&id->xfer_done); | ||
| 294 | |||
| 295 | return status; | ||
| 296 | } | ||
| 297 | |||
| 298 | /** | ||
| 299 | * cdns_i2c_mrecv - Prepare and start a master receive operation | ||
| 300 | * @id: pointer to the i2c device structure | ||
| 301 | */ | ||
| 302 | static void cdns_i2c_mrecv(struct cdns_i2c *id) | ||
| 303 | { | ||
| 304 | unsigned int ctrl_reg; | ||
| 305 | unsigned int isr_status; | ||
| 306 | |||
| 307 | id->p_recv_buf = id->p_msg->buf; | ||
| 308 | id->recv_count = id->p_msg->len; | ||
| 309 | |||
| 310 | /* Put the controller in master receive mode and clear the FIFO */ | ||
| 311 | ctrl_reg = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET); | ||
| 312 | ctrl_reg |= CDNS_I2C_CR_RW | CDNS_I2C_CR_CLR_FIFO; | ||
| 313 | |||
| 314 | if (id->p_msg->flags & I2C_M_RECV_LEN) | ||
| 315 | id->recv_count = I2C_SMBUS_BLOCK_MAX + 1; | ||
| 316 | |||
| 317 | /* | ||
| 318 | * Check for the message size against FIFO depth and set the | ||
| 319 | * 'hold bus' bit if it is greater than FIFO depth. | ||
| 320 | */ | ||
| 321 | if (id->recv_count > CDNS_I2C_FIFO_DEPTH) | ||
| 322 | ctrl_reg |= CDNS_I2C_CR_HOLD; | ||
| 323 | |||
| 324 | cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); | ||
| 325 | |||
| 326 | /* Clear the interrupts in interrupt status register */ | ||
| 327 | isr_status = cdns_i2c_readreg(CDNS_I2C_ISR_OFFSET); | ||
| 328 | cdns_i2c_writereg(isr_status, CDNS_I2C_ISR_OFFSET); | ||
| 329 | |||
| 330 | /* | ||
| 331 | * The no. of bytes to receive is checked against the limit of | ||
| 332 | * max transfer size. Set transfer size register with no of bytes | ||
| 333 | * receive if it is less than transfer size and transfer size if | ||
| 334 | * it is more. Enable the interrupts. | ||
| 335 | */ | ||
| 336 | if (id->recv_count > CDNS_I2C_TRANSFER_SIZE) | ||
| 337 | cdns_i2c_writereg(CDNS_I2C_TRANSFER_SIZE, | ||
| 338 | CDNS_I2C_XFER_SIZE_OFFSET); | ||
| 339 | else | ||
| 340 | cdns_i2c_writereg(id->recv_count, CDNS_I2C_XFER_SIZE_OFFSET); | ||
| 341 | /* Clear the bus hold flag if bytes to receive is less than FIFO size */ | ||
| 342 | if (!id->bus_hold_flag && | ||
| 343 | ((id->p_msg->flags & I2C_M_RECV_LEN) != I2C_M_RECV_LEN) && | ||
| 344 | (id->recv_count <= CDNS_I2C_FIFO_DEPTH)) | ||
| 345 | cdns_i2c_clear_bus_hold(id); | ||
| 346 | /* Set the slave address in address register - triggers operation */ | ||
| 347 | cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK, | ||
| 348 | CDNS_I2C_ADDR_OFFSET); | ||
| 349 | cdns_i2c_writereg(CDNS_I2C_ENABLED_INTR_MASK, CDNS_I2C_IER_OFFSET); | ||
| 350 | } | ||
| 351 | |||
| 352 | /** | ||
| 353 | * cdns_i2c_msend - Prepare and start a master send operation | ||
| 354 | * @id: pointer to the i2c device | ||
| 355 | */ | ||
| 356 | static void cdns_i2c_msend(struct cdns_i2c *id) | ||
| 357 | { | ||
| 358 | unsigned int avail_bytes; | ||
| 359 | unsigned int bytes_to_send; | ||
| 360 | unsigned int ctrl_reg; | ||
| 361 | unsigned int isr_status; | ||
| 362 | |||
| 363 | id->p_recv_buf = NULL; | ||
| 364 | id->p_send_buf = id->p_msg->buf; | ||
| 365 | id->send_count = id->p_msg->len; | ||
| 366 | |||
| 367 | /* Set the controller in Master transmit mode and clear the FIFO. */ | ||
| 368 | ctrl_reg = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET); | ||
| 369 | ctrl_reg &= ~CDNS_I2C_CR_RW; | ||
| 370 | ctrl_reg |= CDNS_I2C_CR_CLR_FIFO; | ||
| 371 | |||
| 372 | /* | ||
| 373 | * Check for the message size against FIFO depth and set the | ||
| 374 | * 'hold bus' bit if it is greater than FIFO depth. | ||
| 375 | */ | ||
| 376 | if (id->send_count > CDNS_I2C_FIFO_DEPTH) | ||
| 377 | ctrl_reg |= CDNS_I2C_CR_HOLD; | ||
| 378 | cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); | ||
| 379 | |||
| 380 | /* Clear the interrupts in interrupt status register. */ | ||
| 381 | isr_status = cdns_i2c_readreg(CDNS_I2C_ISR_OFFSET); | ||
| 382 | cdns_i2c_writereg(isr_status, CDNS_I2C_ISR_OFFSET); | ||
| 383 | |||
| 384 | /* | ||
| 385 | * Calculate the space available in FIFO. Check the message length | ||
| 386 | * against the space available, and fill the FIFO accordingly. | ||
| 387 | * Enable the interrupts. | ||
| 388 | */ | ||
| 389 | avail_bytes = CDNS_I2C_FIFO_DEPTH - | ||
| 390 | cdns_i2c_readreg(CDNS_I2C_XFER_SIZE_OFFSET); | ||
| 391 | |||
| 392 | if (id->send_count > avail_bytes) | ||
| 393 | bytes_to_send = avail_bytes; | ||
| 394 | else | ||
| 395 | bytes_to_send = id->send_count; | ||
| 396 | |||
| 397 | while (bytes_to_send--) { | ||
| 398 | cdns_i2c_writereg((*(id->p_send_buf)++), CDNS_I2C_DATA_OFFSET); | ||
| 399 | id->send_count--; | ||
| 400 | } | ||
| 401 | |||
| 402 | /* | ||
| 403 | * Clear the bus hold flag if there is no more data | ||
| 404 | * and if it is the last message. | ||
| 405 | */ | ||
| 406 | if (!id->bus_hold_flag && !id->send_count) | ||
| 407 | cdns_i2c_clear_bus_hold(id); | ||
| 408 | /* Set the slave address in address register - triggers operation. */ | ||
| 409 | cdns_i2c_writereg(id->p_msg->addr & CDNS_I2C_ADDR_MASK, | ||
| 410 | CDNS_I2C_ADDR_OFFSET); | ||
| 411 | |||
| 412 | cdns_i2c_writereg(CDNS_I2C_ENABLED_INTR_MASK, CDNS_I2C_IER_OFFSET); | ||
| 413 | } | ||
| 414 | |||
| 415 | /** | ||
| 416 | * cdns_i2c_master_reset - Reset the interface | ||
| 417 | * @adap: pointer to the i2c adapter driver instance | ||
| 418 | * | ||
| 419 | * This function cleanup the fifos, clear the hold bit and status | ||
| 420 | * and disable the interrupts. | ||
| 421 | */ | ||
| 422 | static void cdns_i2c_master_reset(struct i2c_adapter *adap) | ||
| 423 | { | ||
| 424 | struct cdns_i2c *id = adap->algo_data; | ||
| 425 | u32 regval; | ||
| 426 | |||
| 427 | /* Disable the interrupts */ | ||
| 428 | cdns_i2c_writereg(CDNS_I2C_IXR_ALL_INTR_MASK, CDNS_I2C_IDR_OFFSET); | ||
| 429 | /* Clear the hold bit and fifos */ | ||
| 430 | regval = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET); | ||
| 431 | regval &= ~CDNS_I2C_CR_HOLD; | ||
| 432 | regval |= CDNS_I2C_CR_CLR_FIFO; | ||
| 433 | cdns_i2c_writereg(regval, CDNS_I2C_CR_OFFSET); | ||
| 434 | /* Update the transfercount register to zero */ | ||
| 435 | cdns_i2c_writereg(0, CDNS_I2C_XFER_SIZE_OFFSET); | ||
| 436 | /* Clear the interupt status register */ | ||
| 437 | regval = cdns_i2c_readreg(CDNS_I2C_ISR_OFFSET); | ||
| 438 | cdns_i2c_writereg(regval, CDNS_I2C_ISR_OFFSET); | ||
| 439 | /* Clear the status register */ | ||
| 440 | regval = cdns_i2c_readreg(CDNS_I2C_SR_OFFSET); | ||
| 441 | cdns_i2c_writereg(regval, CDNS_I2C_SR_OFFSET); | ||
| 442 | } | ||
| 443 | |||
| 444 | static int cdns_i2c_process_msg(struct cdns_i2c *id, struct i2c_msg *msg, | ||
| 445 | struct i2c_adapter *adap) | ||
| 446 | { | ||
| 447 | int ret; | ||
| 448 | u32 reg; | ||
| 449 | |||
| 450 | id->p_msg = msg; | ||
| 451 | id->err_status = 0; | ||
| 452 | reinit_completion(&id->xfer_done); | ||
| 453 | |||
| 454 | /* Check for the TEN Bit mode on each msg */ | ||
| 455 | reg = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET); | ||
| 456 | if (msg->flags & I2C_M_TEN) { | ||
| 457 | if (reg & CDNS_I2C_CR_NEA) | ||
| 458 | cdns_i2c_writereg(reg & ~CDNS_I2C_CR_NEA, | ||
| 459 | CDNS_I2C_CR_OFFSET); | ||
| 460 | } else { | ||
| 461 | if (!(reg & CDNS_I2C_CR_NEA)) | ||
| 462 | cdns_i2c_writereg(reg | CDNS_I2C_CR_NEA, | ||
| 463 | CDNS_I2C_CR_OFFSET); | ||
| 464 | } | ||
| 465 | |||
| 466 | /* Check for the R/W flag on each msg */ | ||
| 467 | if (msg->flags & I2C_M_RD) | ||
| 468 | cdns_i2c_mrecv(id); | ||
| 469 | else | ||
| 470 | cdns_i2c_msend(id); | ||
| 471 | |||
| 472 | /* Wait for the signal of completion */ | ||
| 473 | ret = wait_for_completion_timeout(&id->xfer_done, adap->timeout); | ||
| 474 | if (!ret) { | ||
| 475 | cdns_i2c_master_reset(adap); | ||
| 476 | dev_err(id->adap.dev.parent, | ||
| 477 | "timeout waiting on completion\n"); | ||
| 478 | return -ETIMEDOUT; | ||
| 479 | } | ||
| 480 | |||
| 481 | cdns_i2c_writereg(CDNS_I2C_IXR_ALL_INTR_MASK, | ||
| 482 | CDNS_I2C_IDR_OFFSET); | ||
| 483 | |||
| 484 | /* If it is bus arbitration error, try again */ | ||
| 485 | if (id->err_status & CDNS_I2C_IXR_ARB_LOST) | ||
| 486 | return -EAGAIN; | ||
| 487 | |||
| 488 | return 0; | ||
| 489 | } | ||
| 490 | |||
| 491 | /** | ||
| 492 | * cdns_i2c_master_xfer - The main i2c transfer function | ||
| 493 | * @adap: pointer to the i2c adapter driver instance | ||
| 494 | * @msgs: pointer to the i2c message structure | ||
| 495 | * @num: the number of messages to transfer | ||
| 496 | * | ||
| 497 | * Initiates the send/recv activity based on the transfer message received. | ||
| 498 | * | ||
| 499 | * Return: number of msgs processed on success, negative error otherwise | ||
| 500 | */ | ||
| 501 | static int cdns_i2c_master_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs, | ||
| 502 | int num) | ||
| 503 | { | ||
| 504 | int ret, count; | ||
| 505 | u32 reg; | ||
| 506 | struct cdns_i2c *id = adap->algo_data; | ||
| 507 | |||
| 508 | /* Check if the bus is free */ | ||
| 509 | if (cdns_i2c_readreg(CDNS_I2C_SR_OFFSET) & CDNS_I2C_SR_BA) | ||
| 510 | return -EAGAIN; | ||
| 511 | |||
| 512 | /* | ||
| 513 | * Set the flag to one when multiple messages are to be | ||
| 514 | * processed with a repeated start. | ||
| 515 | */ | ||
| 516 | if (num > 1) { | ||
| 517 | id->bus_hold_flag = 1; | ||
| 518 | reg = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET); | ||
| 519 | reg |= CDNS_I2C_CR_HOLD; | ||
| 520 | cdns_i2c_writereg(reg, CDNS_I2C_CR_OFFSET); | ||
| 521 | } else { | ||
| 522 | id->bus_hold_flag = 0; | ||
| 523 | } | ||
| 524 | |||
| 525 | /* Process the msg one by one */ | ||
| 526 | for (count = 0; count < num; count++, msgs++) { | ||
| 527 | if (count == (num - 1)) | ||
| 528 | id->bus_hold_flag = 0; | ||
| 529 | |||
| 530 | ret = cdns_i2c_process_msg(id, msgs, adap); | ||
| 531 | if (ret) | ||
| 532 | return ret; | ||
| 533 | |||
| 534 | /* Report the other error interrupts to application */ | ||
| 535 | if (id->err_status) { | ||
| 536 | cdns_i2c_master_reset(adap); | ||
| 537 | |||
| 538 | if (id->err_status & CDNS_I2C_IXR_NACK) | ||
| 539 | return -ENXIO; | ||
| 540 | |||
| 541 | return -EIO; | ||
| 542 | } | ||
| 543 | } | ||
| 544 | |||
| 545 | return num; | ||
| 546 | } | ||
| 547 | |||
| 548 | /** | ||
| 549 | * cdns_i2c_func - Returns the supported features of the I2C driver | ||
| 550 | * @adap: pointer to the i2c adapter structure | ||
| 551 | * | ||
| 552 | * Return: 32 bit value, each bit corresponding to a feature | ||
| 553 | */ | ||
| 554 | static u32 cdns_i2c_func(struct i2c_adapter *adap) | ||
| 555 | { | ||
| 556 | return I2C_FUNC_I2C | I2C_FUNC_10BIT_ADDR | | ||
| 557 | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK) | | ||
| 558 | I2C_FUNC_SMBUS_BLOCK_DATA; | ||
| 559 | } | ||
| 560 | |||
| 561 | static const struct i2c_algorithm cdns_i2c_algo = { | ||
| 562 | .master_xfer = cdns_i2c_master_xfer, | ||
| 563 | .functionality = cdns_i2c_func, | ||
| 564 | }; | ||
| 565 | |||
| 566 | /** | ||
| 567 | * cdns_i2c_calc_divs - Calculate clock dividers | ||
| 568 | * @f: I2C clock frequency | ||
| 569 | * @input_clk: Input clock frequency | ||
| 570 | * @a: First divider (return value) | ||
| 571 | * @b: Second divider (return value) | ||
| 572 | * | ||
| 573 | * f is used as input and output variable. As input it is used as target I2C | ||
| 574 | * frequency. On function exit f holds the actually resulting I2C frequency. | ||
| 575 | * | ||
| 576 | * Return: 0 on success, negative errno otherwise. | ||
| 577 | */ | ||
| 578 | static int cdns_i2c_calc_divs(unsigned long *f, unsigned long input_clk, | ||
| 579 | unsigned int *a, unsigned int *b) | ||
| 580 | { | ||
| 581 | unsigned long fscl = *f, best_fscl = *f, actual_fscl, temp; | ||
| 582 | unsigned int div_a, div_b, calc_div_a = 0, calc_div_b = 0; | ||
| 583 | unsigned int last_error, current_error; | ||
| 584 | |||
| 585 | /* calculate (divisor_a+1) x (divisor_b+1) */ | ||
| 586 | temp = input_clk / (22 * fscl); | ||
| 587 | |||
| 588 | /* | ||
| 589 | * If the calculated value is negative or 0, the fscl input is out of | ||
| 590 | * range. Return error. | ||
| 591 | */ | ||
| 592 | if (!temp || (temp > (CDNS_I2C_DIVA_MAX * CDNS_I2C_DIVB_MAX))) | ||
| 593 | return -EINVAL; | ||
| 594 | |||
| 595 | last_error = -1; | ||
| 596 | for (div_a = 0; div_a < CDNS_I2C_DIVA_MAX; div_a++) { | ||
| 597 | div_b = DIV_ROUND_UP(input_clk, 22 * fscl * (div_a + 1)); | ||
| 598 | |||
| 599 | if ((div_b < 1) || (div_b > CDNS_I2C_DIVB_MAX)) | ||
| 600 | continue; | ||
| 601 | div_b--; | ||
| 602 | |||
| 603 | actual_fscl = input_clk / (22 * (div_a + 1) * (div_b + 1)); | ||
| 604 | |||
| 605 | if (actual_fscl > fscl) | ||
| 606 | continue; | ||
| 607 | |||
| 608 | current_error = ((actual_fscl > fscl) ? (actual_fscl - fscl) : | ||
| 609 | (fscl - actual_fscl)); | ||
| 610 | |||
| 611 | if (last_error > current_error) { | ||
| 612 | calc_div_a = div_a; | ||
| 613 | calc_div_b = div_b; | ||
| 614 | best_fscl = actual_fscl; | ||
| 615 | last_error = current_error; | ||
| 616 | } | ||
| 617 | } | ||
| 618 | |||
| 619 | *a = calc_div_a; | ||
| 620 | *b = calc_div_b; | ||
| 621 | *f = best_fscl; | ||
| 622 | |||
| 623 | return 0; | ||
| 624 | } | ||
| 625 | |||
| 626 | /** | ||
| 627 | * cdns_i2c_setclk - This function sets the serial clock rate for the I2C device | ||
| 628 | * @clk_in: I2C clock input frequency in Hz | ||
| 629 | * @id: Pointer to the I2C device structure | ||
| 630 | * | ||
| 631 | * The device must be idle rather than busy transferring data before setting | ||
| 632 | * these device options. | ||
| 633 | * The data rate is set by values in the control register. | ||
| 634 | * The formula for determining the correct register values is | ||
| 635 | * Fscl = Fpclk/(22 x (divisor_a+1) x (divisor_b+1)) | ||
| 636 | * See the hardware data sheet for a full explanation of setting the serial | ||
| 637 | * clock rate. The clock can not be faster than the input clock divide by 22. | ||
| 638 | * The two most common clock rates are 100KHz and 400KHz. | ||
| 639 | * | ||
| 640 | * Return: 0 on success, negative error otherwise | ||
| 641 | */ | ||
| 642 | static int cdns_i2c_setclk(unsigned long clk_in, struct cdns_i2c *id) | ||
| 643 | { | ||
| 644 | unsigned int div_a, div_b; | ||
| 645 | unsigned int ctrl_reg; | ||
| 646 | int ret = 0; | ||
| 647 | unsigned long fscl = id->i2c_clk; | ||
| 648 | |||
| 649 | ret = cdns_i2c_calc_divs(&fscl, clk_in, &div_a, &div_b); | ||
| 650 | if (ret) | ||
| 651 | return ret; | ||
| 652 | |||
| 653 | ctrl_reg = cdns_i2c_readreg(CDNS_I2C_CR_OFFSET); | ||
| 654 | ctrl_reg &= ~(CDNS_I2C_CR_DIVA_MASK | CDNS_I2C_CR_DIVB_MASK); | ||
| 655 | ctrl_reg |= ((div_a << CDNS_I2C_CR_DIVA_SHIFT) | | ||
| 656 | (div_b << CDNS_I2C_CR_DIVB_SHIFT)); | ||
| 657 | cdns_i2c_writereg(ctrl_reg, CDNS_I2C_CR_OFFSET); | ||
| 658 | |||
| 659 | return 0; | ||
| 660 | } | ||
| 661 | |||
| 662 | /** | ||
| 663 | * cdns_i2c_clk_notifier_cb - Clock rate change callback | ||
| 664 | * @nb: Pointer to notifier block | ||
| 665 | * @event: Notification reason | ||
| 666 | * @data: Pointer to notification data object | ||
| 667 | * | ||
| 668 | * This function is called when the cdns_i2c input clock frequency changes. | ||
| 669 | * The callback checks whether a valid bus frequency can be generated after the | ||
| 670 | * change. If so, the change is acknowledged, otherwise the change is aborted. | ||
| 671 | * New dividers are written to the HW in the pre- or post change notification | ||
| 672 | * depending on the scaling direction. | ||
| 673 | * | ||
| 674 | * Return: NOTIFY_STOP if the rate change should be aborted, NOTIFY_OK | ||
| 675 | * to acknowedge the change, NOTIFY_DONE if the notification is | ||
| 676 | * considered irrelevant. | ||
| 677 | */ | ||
| 678 | static int cdns_i2c_clk_notifier_cb(struct notifier_block *nb, unsigned long | ||
| 679 | event, void *data) | ||
| 680 | { | ||
| 681 | struct clk_notifier_data *ndata = data; | ||
| 682 | struct cdns_i2c *id = to_cdns_i2c(nb); | ||
| 683 | |||
| 684 | if (id->suspended) | ||
| 685 | return NOTIFY_OK; | ||
| 686 | |||
| 687 | switch (event) { | ||
| 688 | case PRE_RATE_CHANGE: | ||
| 689 | { | ||
| 690 | unsigned long input_clk = ndata->new_rate; | ||
| 691 | unsigned long fscl = id->i2c_clk; | ||
| 692 | unsigned int div_a, div_b; | ||
| 693 | int ret; | ||
| 694 | |||
| 695 | ret = cdns_i2c_calc_divs(&fscl, input_clk, &div_a, &div_b); | ||
| 696 | if (ret) { | ||
| 697 | dev_warn(id->adap.dev.parent, | ||
| 698 | "clock rate change rejected\n"); | ||
| 699 | return NOTIFY_STOP; | ||
| 700 | } | ||
| 701 | |||
| 702 | /* scale up */ | ||
| 703 | if (ndata->new_rate > ndata->old_rate) | ||
| 704 | cdns_i2c_setclk(ndata->new_rate, id); | ||
| 705 | |||
| 706 | return NOTIFY_OK; | ||
| 707 | } | ||
| 708 | case POST_RATE_CHANGE: | ||
| 709 | id->input_clk = ndata->new_rate; | ||
| 710 | /* scale down */ | ||
| 711 | if (ndata->new_rate < ndata->old_rate) | ||
| 712 | cdns_i2c_setclk(ndata->new_rate, id); | ||
| 713 | return NOTIFY_OK; | ||
| 714 | case ABORT_RATE_CHANGE: | ||
| 715 | /* scale up */ | ||
| 716 | if (ndata->new_rate > ndata->old_rate) | ||
| 717 | cdns_i2c_setclk(ndata->old_rate, id); | ||
| 718 | return NOTIFY_OK; | ||
| 719 | default: | ||
| 720 | return NOTIFY_DONE; | ||
| 721 | } | ||
| 722 | } | ||
| 723 | |||
| 724 | /** | ||
| 725 | * cdns_i2c_suspend - Suspend method for the driver | ||
| 726 | * @_dev: Address of the platform_device structure | ||
| 727 | * | ||
| 728 | * Put the driver into low power mode. | ||
| 729 | * | ||
| 730 | * Return: 0 always | ||
| 731 | */ | ||
| 732 | static int __maybe_unused cdns_i2c_suspend(struct device *_dev) | ||
| 733 | { | ||
| 734 | struct platform_device *pdev = container_of(_dev, | ||
| 735 | struct platform_device, dev); | ||
| 736 | struct cdns_i2c *xi2c = platform_get_drvdata(pdev); | ||
| 737 | |||
| 738 | clk_disable(xi2c->clk); | ||
| 739 | xi2c->suspended = 1; | ||
| 740 | |||
| 741 | return 0; | ||
| 742 | } | ||
| 743 | |||
| 744 | /** | ||
| 745 | * cdns_i2c_resume - Resume from suspend | ||
| 746 | * @_dev: Address of the platform_device structure | ||
| 747 | * | ||
| 748 | * Resume operation after suspend. | ||
| 749 | * | ||
| 750 | * Return: 0 on success and error value on error | ||
| 751 | */ | ||
| 752 | static int __maybe_unused cdns_i2c_resume(struct device *_dev) | ||
| 753 | { | ||
| 754 | struct platform_device *pdev = container_of(_dev, | ||
| 755 | struct platform_device, dev); | ||
| 756 | struct cdns_i2c *xi2c = platform_get_drvdata(pdev); | ||
| 757 | int ret; | ||
| 758 | |||
| 759 | ret = clk_enable(xi2c->clk); | ||
| 760 | if (ret) { | ||
| 761 | dev_err(_dev, "Cannot enable clock.\n"); | ||
| 762 | return ret; | ||
| 763 | } | ||
| 764 | |||
| 765 | xi2c->suspended = 0; | ||
| 766 | |||
| 767 | return 0; | ||
| 768 | } | ||
| 769 | |||
| 770 | static SIMPLE_DEV_PM_OPS(cdns_i2c_dev_pm_ops, cdns_i2c_suspend, | ||
| 771 | cdns_i2c_resume); | ||
| 772 | |||
| 773 | /** | ||
| 774 | * cdns_i2c_probe - Platform registration call | ||
| 775 | * @pdev: Handle to the platform device structure | ||
| 776 | * | ||
| 777 | * This function does all the memory allocation and registration for the i2c | ||
| 778 | * device. User can modify the address mode to 10 bit address mode using the | ||
| 779 | * ioctl call with option I2C_TENBIT. | ||
| 780 | * | ||
| 781 | * Return: 0 on success, negative error otherwise | ||
| 782 | */ | ||
| 783 | static int cdns_i2c_probe(struct platform_device *pdev) | ||
| 784 | { | ||
| 785 | struct resource *r_mem; | ||
| 786 | struct cdns_i2c *id; | ||
| 787 | int ret; | ||
| 788 | |||
| 789 | id = devm_kzalloc(&pdev->dev, sizeof(*id), GFP_KERNEL); | ||
| 790 | if (!id) | ||
| 791 | return -ENOMEM; | ||
| 792 | |||
| 793 | platform_set_drvdata(pdev, id); | ||
| 794 | |||
| 795 | r_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 796 | id->membase = devm_ioremap_resource(&pdev->dev, r_mem); | ||
| 797 | if (IS_ERR(id->membase)) | ||
| 798 | return PTR_ERR(id->membase); | ||
| 799 | |||
| 800 | id->irq = platform_get_irq(pdev, 0); | ||
| 801 | |||
| 802 | id->adap.dev.of_node = pdev->dev.of_node; | ||
| 803 | id->adap.algo = &cdns_i2c_algo; | ||
| 804 | id->adap.timeout = CDNS_I2C_TIMEOUT; | ||
| 805 | id->adap.retries = 3; /* Default retry value. */ | ||
| 806 | id->adap.algo_data = id; | ||
| 807 | id->adap.dev.parent = &pdev->dev; | ||
| 808 | init_completion(&id->xfer_done); | ||
| 809 | snprintf(id->adap.name, sizeof(id->adap.name), | ||
| 810 | "Cadence I2C at %08lx", (unsigned long)r_mem->start); | ||
| 811 | |||
| 812 | id->clk = devm_clk_get(&pdev->dev, NULL); | ||
| 813 | if (IS_ERR(id->clk)) { | ||
| 814 | dev_err(&pdev->dev, "input clock not found.\n"); | ||
| 815 | return PTR_ERR(id->clk); | ||
| 816 | } | ||
| 817 | ret = clk_prepare_enable(id->clk); | ||
| 818 | if (ret) { | ||
| 819 | dev_err(&pdev->dev, "Unable to enable clock.\n"); | ||
| 820 | return ret; | ||
| 821 | } | ||
| 822 | id->clk_rate_change_nb.notifier_call = cdns_i2c_clk_notifier_cb; | ||
| 823 | if (clk_notifier_register(id->clk, &id->clk_rate_change_nb)) | ||
| 824 | dev_warn(&pdev->dev, "Unable to register clock notifier.\n"); | ||
| 825 | id->input_clk = clk_get_rate(id->clk); | ||
| 826 | |||
| 827 | ret = of_property_read_u32(pdev->dev.of_node, "clock-frequency", | ||
| 828 | &id->i2c_clk); | ||
| 829 | if (ret || (id->i2c_clk > CDNS_I2C_SPEED_MAX)) | ||
| 830 | id->i2c_clk = CDNS_I2C_SPEED_DEFAULT; | ||
| 831 | |||
| 832 | cdns_i2c_writereg(CDNS_I2C_CR_ACK_EN | CDNS_I2C_CR_NEA | CDNS_I2C_CR_MS, | ||
| 833 | CDNS_I2C_CR_OFFSET); | ||
| 834 | |||
| 835 | ret = cdns_i2c_setclk(id->input_clk, id); | ||
| 836 | if (ret) { | ||
| 837 | dev_err(&pdev->dev, "invalid SCL clock: %u Hz\n", id->i2c_clk); | ||
| 838 | ret = -EINVAL; | ||
| 839 | goto err_clk_dis; | ||
| 840 | } | ||
| 841 | |||
| 842 | ret = devm_request_irq(&pdev->dev, id->irq, cdns_i2c_isr, 0, | ||
| 843 | DRIVER_NAME, id); | ||
| 844 | if (ret) { | ||
| 845 | dev_err(&pdev->dev, "cannot get irq %d\n", id->irq); | ||
| 846 | goto err_clk_dis; | ||
| 847 | } | ||
| 848 | |||
| 849 | ret = i2c_add_adapter(&id->adap); | ||
| 850 | if (ret < 0) { | ||
| 851 | dev_err(&pdev->dev, "reg adap failed: %d\n", ret); | ||
| 852 | goto err_clk_dis; | ||
| 853 | } | ||
| 854 | |||
| 855 | dev_info(&pdev->dev, "%u kHz mmio %08lx irq %d\n", | ||
| 856 | id->i2c_clk / 1000, (unsigned long)r_mem->start, id->irq); | ||
| 857 | |||
| 858 | return 0; | ||
| 859 | |||
| 860 | err_clk_dis: | ||
| 861 | clk_disable_unprepare(id->clk); | ||
| 862 | return ret; | ||
| 863 | } | ||
| 864 | |||
| 865 | /** | ||
| 866 | * cdns_i2c_remove - Unregister the device after releasing the resources | ||
| 867 | * @pdev: Handle to the platform device structure | ||
| 868 | * | ||
| 869 | * This function frees all the resources allocated to the device. | ||
| 870 | * | ||
| 871 | * Return: 0 always | ||
| 872 | */ | ||
| 873 | static int cdns_i2c_remove(struct platform_device *pdev) | ||
| 874 | { | ||
| 875 | struct cdns_i2c *id = platform_get_drvdata(pdev); | ||
| 876 | |||
| 877 | i2c_del_adapter(&id->adap); | ||
| 878 | clk_notifier_unregister(id->clk, &id->clk_rate_change_nb); | ||
| 879 | clk_disable_unprepare(id->clk); | ||
| 880 | |||
| 881 | return 0; | ||
| 882 | } | ||
| 883 | |||
| 884 | static const struct of_device_id cdns_i2c_of_match[] = { | ||
| 885 | { .compatible = "cdns,i2c-r1p10", }, | ||
| 886 | { /* end of table */ } | ||
| 887 | }; | ||
| 888 | MODULE_DEVICE_TABLE(of, cdns_i2c_of_match); | ||
| 889 | |||
| 890 | static struct platform_driver cdns_i2c_drv = { | ||
| 891 | .driver = { | ||
| 892 | .name = DRIVER_NAME, | ||
| 893 | .owner = THIS_MODULE, | ||
| 894 | .of_match_table = cdns_i2c_of_match, | ||
| 895 | .pm = &cdns_i2c_dev_pm_ops, | ||
| 896 | }, | ||
| 897 | .probe = cdns_i2c_probe, | ||
| 898 | .remove = cdns_i2c_remove, | ||
| 899 | }; | ||
| 900 | |||
| 901 | module_platform_driver(cdns_i2c_drv); | ||
| 902 | |||
| 903 | MODULE_AUTHOR("Xilinx Inc."); | ||
| 904 | MODULE_DESCRIPTION("Cadence I2C bus driver"); | ||
| 905 | MODULE_LICENSE("GPL"); | ||
diff --git a/drivers/i2c/busses/i2c-davinci.c b/drivers/i2c/busses/i2c-davinci.c index af0b5830303d..389bc68c55ad 100644 --- a/drivers/i2c/busses/i2c-davinci.c +++ b/drivers/i2c/busses/i2c-davinci.c | |||
| @@ -712,7 +712,7 @@ static int davinci_i2c_probe(struct platform_device *pdev) | |||
| 712 | adap = &dev->adapter; | 712 | adap = &dev->adapter; |
| 713 | i2c_set_adapdata(adap, dev); | 713 | i2c_set_adapdata(adap, dev); |
| 714 | adap->owner = THIS_MODULE; | 714 | adap->owner = THIS_MODULE; |
| 715 | adap->class = I2C_CLASS_HWMON; | 715 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_DEPRECATED; |
| 716 | strlcpy(adap->name, "DaVinci I2C adapter", sizeof(adap->name)); | 716 | strlcpy(adap->name, "DaVinci I2C adapter", sizeof(adap->name)); |
| 717 | adap->algo = &i2c_davinci_algo; | 717 | adap->algo = &i2c_davinci_algo; |
| 718 | adap->dev.parent = &pdev->dev; | 718 | adap->dev.parent = &pdev->dev; |
diff --git a/drivers/i2c/busses/i2c-designware-core.c b/drivers/i2c/busses/i2c-designware-core.c index 14c4b30d4ccc..22e92c3d3d07 100644 --- a/drivers/i2c/busses/i2c-designware-core.c +++ b/drivers/i2c/busses/i2c-designware-core.c | |||
| @@ -218,7 +218,7 @@ i2c_dw_scl_hcnt(u32 ic_clk, u32 tSYMBOL, u32 tf, int cond, int offset) | |||
| 218 | * | 218 | * |
| 219 | * If your hardware is free from tHD;STA issue, try this one. | 219 | * If your hardware is free from tHD;STA issue, try this one. |
| 220 | */ | 220 | */ |
| 221 | return (ic_clk * tSYMBOL + 5000) / 10000 - 8 + offset; | 221 | return (ic_clk * tSYMBOL + 500000) / 1000000 - 8 + offset; |
| 222 | else | 222 | else |
| 223 | /* | 223 | /* |
| 224 | * Conditional expression: | 224 | * Conditional expression: |
| @@ -234,7 +234,8 @@ i2c_dw_scl_hcnt(u32 ic_clk, u32 tSYMBOL, u32 tf, int cond, int offset) | |||
| 234 | * The reason why we need to take into account "tf" here, | 234 | * The reason why we need to take into account "tf" here, |
| 235 | * is the same as described in i2c_dw_scl_lcnt(). | 235 | * is the same as described in i2c_dw_scl_lcnt(). |
| 236 | */ | 236 | */ |
| 237 | return (ic_clk * (tSYMBOL + tf) + 5000) / 10000 - 3 + offset; | 237 | return (ic_clk * (tSYMBOL + tf) + 500000) / 1000000 |
| 238 | - 3 + offset; | ||
| 238 | } | 239 | } |
| 239 | 240 | ||
| 240 | static u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset) | 241 | static u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset) |
| @@ -250,7 +251,7 @@ static u32 i2c_dw_scl_lcnt(u32 ic_clk, u32 tLOW, u32 tf, int offset) | |||
| 250 | * account the fall time of SCL signal (tf). Default tf value | 251 | * account the fall time of SCL signal (tf). Default tf value |
| 251 | * should be 0.3 us, for safety. | 252 | * should be 0.3 us, for safety. |
| 252 | */ | 253 | */ |
| 253 | return ((ic_clk * (tLOW + tf) + 5000) / 10000) - 1 + offset; | 254 | return ((ic_clk * (tLOW + tf) + 500000) / 1000000) - 1 + offset; |
| 254 | } | 255 | } |
| 255 | 256 | ||
| 256 | static void __i2c_dw_enable(struct dw_i2c_dev *dev, bool enable) | 257 | static void __i2c_dw_enable(struct dw_i2c_dev *dev, bool enable) |
| @@ -287,6 +288,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
| 287 | u32 input_clock_khz; | 288 | u32 input_clock_khz; |
| 288 | u32 hcnt, lcnt; | 289 | u32 hcnt, lcnt; |
| 289 | u32 reg; | 290 | u32 reg; |
| 291 | u32 sda_falling_time, scl_falling_time; | ||
| 290 | 292 | ||
| 291 | input_clock_khz = dev->get_clk_rate_khz(dev); | 293 | input_clock_khz = dev->get_clk_rate_khz(dev); |
| 292 | 294 | ||
| @@ -308,15 +310,18 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
| 308 | 310 | ||
| 309 | /* set standard and fast speed deviders for high/low periods */ | 311 | /* set standard and fast speed deviders for high/low periods */ |
| 310 | 312 | ||
| 313 | sda_falling_time = dev->sda_falling_time ?: 300; /* ns */ | ||
| 314 | scl_falling_time = dev->scl_falling_time ?: 300; /* ns */ | ||
| 315 | |||
| 311 | /* Standard-mode */ | 316 | /* Standard-mode */ |
| 312 | hcnt = i2c_dw_scl_hcnt(input_clock_khz, | 317 | hcnt = i2c_dw_scl_hcnt(input_clock_khz, |
| 313 | 40, /* tHD;STA = tHIGH = 4.0 us */ | 318 | 4000, /* tHD;STA = tHIGH = 4.0 us */ |
| 314 | 3, /* tf = 0.3 us */ | 319 | sda_falling_time, |
| 315 | 0, /* 0: DW default, 1: Ideal */ | 320 | 0, /* 0: DW default, 1: Ideal */ |
| 316 | 0); /* No offset */ | 321 | 0); /* No offset */ |
| 317 | lcnt = i2c_dw_scl_lcnt(input_clock_khz, | 322 | lcnt = i2c_dw_scl_lcnt(input_clock_khz, |
| 318 | 47, /* tLOW = 4.7 us */ | 323 | 4700, /* tLOW = 4.7 us */ |
| 319 | 3, /* tf = 0.3 us */ | 324 | scl_falling_time, |
| 320 | 0); /* No offset */ | 325 | 0); /* No offset */ |
| 321 | 326 | ||
| 322 | /* Allow platforms to specify the ideal HCNT and LCNT values */ | 327 | /* Allow platforms to specify the ideal HCNT and LCNT values */ |
| @@ -330,13 +335,13 @@ int i2c_dw_init(struct dw_i2c_dev *dev) | |||
| 330 | 335 | ||
| 331 | /* Fast-mode */ | 336 | /* Fast-mode */ |
| 332 | hcnt = i2c_dw_scl_hcnt(input_clock_khz, | 337 | hcnt = i2c_dw_scl_hcnt(input_clock_khz, |
| 333 | 6, /* tHD;STA = tHIGH = 0.6 us */ | 338 | 600, /* tHD;STA = tHIGH = 0.6 us */ |
| 334 | 3, /* tf = 0.3 us */ | 339 | sda_falling_time, |
| 335 | 0, /* 0: DW default, 1: Ideal */ | 340 | 0, /* 0: DW default, 1: Ideal */ |
| 336 | 0); /* No offset */ | 341 | 0); /* No offset */ |
| 337 | lcnt = i2c_dw_scl_lcnt(input_clock_khz, | 342 | lcnt = i2c_dw_scl_lcnt(input_clock_khz, |
| 338 | 13, /* tLOW = 1.3 us */ | 343 | 1300, /* tLOW = 1.3 us */ |
| 339 | 3, /* tf = 0.3 us */ | 344 | scl_falling_time, |
| 340 | 0); /* No offset */ | 345 | 0); /* No offset */ |
| 341 | 346 | ||
| 342 | if (dev->fs_hcnt && dev->fs_lcnt) { | 347 | if (dev->fs_hcnt && dev->fs_lcnt) { |
diff --git a/drivers/i2c/busses/i2c-designware-core.h b/drivers/i2c/busses/i2c-designware-core.h index e8a756537ed0..d66b6cbc9edc 100644 --- a/drivers/i2c/busses/i2c-designware-core.h +++ b/drivers/i2c/busses/i2c-designware-core.h | |||
| @@ -99,6 +99,8 @@ struct dw_i2c_dev { | |||
| 99 | unsigned int rx_fifo_depth; | 99 | unsigned int rx_fifo_depth; |
| 100 | int rx_outstanding; | 100 | int rx_outstanding; |
| 101 | u32 sda_hold_time; | 101 | u32 sda_hold_time; |
| 102 | u32 sda_falling_time; | ||
| 103 | u32 scl_falling_time; | ||
| 102 | u16 ss_hcnt; | 104 | u16 ss_hcnt; |
| 103 | u16 ss_lcnt; | 105 | u16 ss_lcnt; |
| 104 | u16 fs_hcnt; | 106 | u16 fs_hcnt; |
diff --git a/drivers/i2c/busses/i2c-designware-pcidrv.c b/drivers/i2c/busses/i2c-designware-pcidrv.c index f6ed06c966ee..85056c22d21e 100644 --- a/drivers/i2c/busses/i2c-designware-pcidrv.c +++ b/drivers/i2c/busses/i2c-designware-pcidrv.c | |||
| @@ -54,6 +54,16 @@ enum dw_pci_ctl_id_t { | |||
| 54 | medfield_3, | 54 | medfield_3, |
| 55 | medfield_4, | 55 | medfield_4, |
| 56 | medfield_5, | 56 | medfield_5, |
| 57 | |||
| 58 | baytrail, | ||
| 59 | }; | ||
| 60 | |||
| 61 | struct dw_scl_sda_cfg { | ||
| 62 | u32 ss_hcnt; | ||
| 63 | u32 fs_hcnt; | ||
| 64 | u32 ss_lcnt; | ||
| 65 | u32 fs_lcnt; | ||
| 66 | u32 sda_hold; | ||
| 57 | }; | 67 | }; |
| 58 | 68 | ||
| 59 | struct dw_pci_controller { | 69 | struct dw_pci_controller { |
| @@ -62,12 +72,29 @@ struct dw_pci_controller { | |||
| 62 | u32 tx_fifo_depth; | 72 | u32 tx_fifo_depth; |
| 63 | u32 rx_fifo_depth; | 73 | u32 rx_fifo_depth; |
| 64 | u32 clk_khz; | 74 | u32 clk_khz; |
| 75 | u32 functionality; | ||
| 76 | struct dw_scl_sda_cfg *scl_sda_cfg; | ||
| 65 | }; | 77 | }; |
| 66 | 78 | ||
| 67 | #define INTEL_MID_STD_CFG (DW_IC_CON_MASTER | \ | 79 | #define INTEL_MID_STD_CFG (DW_IC_CON_MASTER | \ |
| 68 | DW_IC_CON_SLAVE_DISABLE | \ | 80 | DW_IC_CON_SLAVE_DISABLE | \ |
| 69 | DW_IC_CON_RESTART_EN) | 81 | DW_IC_CON_RESTART_EN) |
| 70 | 82 | ||
| 83 | #define DW_DEFAULT_FUNCTIONALITY (I2C_FUNC_I2C | \ | ||
| 84 | I2C_FUNC_SMBUS_BYTE | \ | ||
| 85 | I2C_FUNC_SMBUS_BYTE_DATA | \ | ||
| 86 | I2C_FUNC_SMBUS_WORD_DATA | \ | ||
| 87 | I2C_FUNC_SMBUS_I2C_BLOCK) | ||
| 88 | |||
| 89 | /* BayTrail HCNT/LCNT/SDA hold time */ | ||
| 90 | static struct dw_scl_sda_cfg byt_config = { | ||
| 91 | .ss_hcnt = 0x200, | ||
| 92 | .fs_hcnt = 0x55, | ||
| 93 | .ss_lcnt = 0x200, | ||
| 94 | .fs_lcnt = 0x99, | ||
| 95 | .sda_hold = 0x6, | ||
| 96 | }; | ||
| 97 | |||
| 71 | static struct dw_pci_controller dw_pci_controllers[] = { | 98 | static struct dw_pci_controller dw_pci_controllers[] = { |
| 72 | [moorestown_0] = { | 99 | [moorestown_0] = { |
| 73 | .bus_num = 0, | 100 | .bus_num = 0, |
| @@ -132,75 +159,40 @@ static struct dw_pci_controller dw_pci_controllers[] = { | |||
| 132 | .rx_fifo_depth = 32, | 159 | .rx_fifo_depth = 32, |
| 133 | .clk_khz = 25000, | 160 | .clk_khz = 25000, |
| 134 | }, | 161 | }, |
| 162 | [baytrail] = { | ||
| 163 | .bus_num = -1, | ||
| 164 | .bus_cfg = INTEL_MID_STD_CFG | DW_IC_CON_SPEED_FAST, | ||
| 165 | .tx_fifo_depth = 32, | ||
| 166 | .rx_fifo_depth = 32, | ||
| 167 | .clk_khz = 100000, | ||
| 168 | .functionality = I2C_FUNC_10BIT_ADDR, | ||
| 169 | .scl_sda_cfg = &byt_config, | ||
| 170 | }, | ||
| 135 | }; | 171 | }; |
| 136 | static struct i2c_algorithm i2c_dw_algo = { | 172 | static struct i2c_algorithm i2c_dw_algo = { |
| 137 | .master_xfer = i2c_dw_xfer, | 173 | .master_xfer = i2c_dw_xfer, |
| 138 | .functionality = i2c_dw_func, | 174 | .functionality = i2c_dw_func, |
| 139 | }; | 175 | }; |
| 140 | 176 | ||
| 177 | #ifdef CONFIG_PM | ||
| 141 | static int i2c_dw_pci_suspend(struct device *dev) | 178 | static int i2c_dw_pci_suspend(struct device *dev) |
| 142 | { | 179 | { |
| 143 | struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); | 180 | struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); |
| 144 | struct dw_i2c_dev *i2c = pci_get_drvdata(pdev); | ||
| 145 | int err; | ||
| 146 | |||
| 147 | |||
| 148 | i2c_dw_disable(i2c); | ||
| 149 | |||
| 150 | err = pci_save_state(pdev); | ||
| 151 | if (err) { | ||
| 152 | dev_err(&pdev->dev, "pci_save_state failed\n"); | ||
| 153 | return err; | ||
| 154 | } | ||
| 155 | |||
| 156 | err = pci_set_power_state(pdev, PCI_D3hot); | ||
| 157 | if (err) { | ||
| 158 | dev_err(&pdev->dev, "pci_set_power_state failed\n"); | ||
| 159 | return err; | ||
| 160 | } | ||
| 161 | 181 | ||
| 182 | i2c_dw_disable(pci_get_drvdata(pdev)); | ||
| 162 | return 0; | 183 | return 0; |
| 163 | } | 184 | } |
| 164 | 185 | ||
| 165 | static int i2c_dw_pci_resume(struct device *dev) | 186 | static int i2c_dw_pci_resume(struct device *dev) |
| 166 | { | 187 | { |
| 167 | struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); | 188 | struct pci_dev *pdev = container_of(dev, struct pci_dev, dev); |
| 168 | struct dw_i2c_dev *i2c = pci_get_drvdata(pdev); | ||
| 169 | int err; | ||
| 170 | u32 enabled; | ||
| 171 | |||
| 172 | enabled = i2c_dw_is_enabled(i2c); | ||
| 173 | if (enabled) | ||
| 174 | return 0; | ||
| 175 | |||
| 176 | err = pci_set_power_state(pdev, PCI_D0); | ||
| 177 | if (err) { | ||
| 178 | dev_err(&pdev->dev, "pci_set_power_state() failed\n"); | ||
| 179 | return err; | ||
| 180 | } | ||
| 181 | |||
| 182 | pci_restore_state(pdev); | ||
| 183 | |||
| 184 | i2c_dw_init(i2c); | ||
| 185 | return 0; | ||
| 186 | } | ||
| 187 | 189 | ||
| 188 | static int i2c_dw_pci_runtime_idle(struct device *dev) | 190 | return i2c_dw_init(pci_get_drvdata(pdev)); |
| 189 | { | ||
| 190 | int err = pm_schedule_suspend(dev, 500); | ||
| 191 | dev_dbg(dev, "runtime_idle called\n"); | ||
| 192 | |||
| 193 | if (err != 0) | ||
| 194 | return 0; | ||
| 195 | return -EBUSY; | ||
| 196 | } | 191 | } |
| 192 | #endif | ||
| 197 | 193 | ||
| 198 | static const struct dev_pm_ops i2c_dw_pm_ops = { | 194 | static UNIVERSAL_DEV_PM_OPS(i2c_dw_pm_ops, i2c_dw_pci_suspend, |
| 199 | .resume = i2c_dw_pci_resume, | 195 | i2c_dw_pci_resume, NULL); |
| 200 | .suspend = i2c_dw_pci_suspend, | ||
| 201 | SET_RUNTIME_PM_OPS(i2c_dw_pci_suspend, i2c_dw_pci_resume, | ||
| 202 | i2c_dw_pci_runtime_idle) | ||
| 203 | }; | ||
| 204 | 196 | ||
| 205 | static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev) | 197 | static u32 i2c_dw_get_clk_rate_khz(struct dw_i2c_dev *dev) |
| 206 | { | 198 | { |
| @@ -214,6 +206,7 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, | |||
| 214 | struct i2c_adapter *adap; | 206 | struct i2c_adapter *adap; |
| 215 | int r; | 207 | int r; |
| 216 | struct dw_pci_controller *controller; | 208 | struct dw_pci_controller *controller; |
| 209 | struct dw_scl_sda_cfg *cfg; | ||
| 217 | 210 | ||
| 218 | if (id->driver_data >= ARRAY_SIZE(dw_pci_controllers)) { | 211 | if (id->driver_data >= ARRAY_SIZE(dw_pci_controllers)) { |
| 219 | dev_err(&pdev->dev, "%s: invalid driver data %ld\n", __func__, | 212 | dev_err(&pdev->dev, "%s: invalid driver data %ld\n", __func__, |
| @@ -247,13 +240,18 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, | |||
| 247 | dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz; | 240 | dev->get_clk_rate_khz = i2c_dw_get_clk_rate_khz; |
| 248 | dev->base = pcim_iomap_table(pdev)[0]; | 241 | dev->base = pcim_iomap_table(pdev)[0]; |
| 249 | dev->dev = &pdev->dev; | 242 | dev->dev = &pdev->dev; |
| 250 | dev->functionality = | 243 | dev->functionality = controller->functionality | |
| 251 | I2C_FUNC_I2C | | 244 | DW_DEFAULT_FUNCTIONALITY; |
| 252 | I2C_FUNC_SMBUS_BYTE | | 245 | |
| 253 | I2C_FUNC_SMBUS_BYTE_DATA | | ||
| 254 | I2C_FUNC_SMBUS_WORD_DATA | | ||
| 255 | I2C_FUNC_SMBUS_I2C_BLOCK; | ||
| 256 | dev->master_cfg = controller->bus_cfg; | 246 | dev->master_cfg = controller->bus_cfg; |
| 247 | if (controller->scl_sda_cfg) { | ||
| 248 | cfg = controller->scl_sda_cfg; | ||
| 249 | dev->ss_hcnt = cfg->ss_hcnt; | ||
| 250 | dev->fs_hcnt = cfg->fs_hcnt; | ||
| 251 | dev->ss_lcnt = cfg->ss_lcnt; | ||
| 252 | dev->fs_lcnt = cfg->fs_lcnt; | ||
| 253 | dev->sda_hold_time = cfg->sda_hold; | ||
| 254 | } | ||
| 257 | 255 | ||
| 258 | pci_set_drvdata(pdev, dev); | 256 | pci_set_drvdata(pdev, dev); |
| 259 | 257 | ||
| @@ -270,8 +268,8 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, | |||
| 270 | adap->algo = &i2c_dw_algo; | 268 | adap->algo = &i2c_dw_algo; |
| 271 | adap->dev.parent = &pdev->dev; | 269 | adap->dev.parent = &pdev->dev; |
| 272 | adap->nr = controller->bus_num; | 270 | adap->nr = controller->bus_num; |
| 273 | snprintf(adap->name, sizeof(adap->name), "i2c-designware-pci-%d", | 271 | |
| 274 | adap->nr); | 272 | snprintf(adap->name, sizeof(adap->name), "i2c-designware-pci"); |
| 275 | 273 | ||
| 276 | r = devm_request_irq(&pdev->dev, pdev->irq, i2c_dw_isr, IRQF_SHARED, | 274 | r = devm_request_irq(&pdev->dev, pdev->irq, i2c_dw_isr, IRQF_SHARED, |
| 277 | adap->name, dev); | 275 | adap->name, dev); |
| @@ -290,6 +288,7 @@ static int i2c_dw_pci_probe(struct pci_dev *pdev, | |||
| 290 | 288 | ||
| 291 | pm_runtime_set_autosuspend_delay(&pdev->dev, 1000); | 289 | pm_runtime_set_autosuspend_delay(&pdev->dev, 1000); |
| 292 | pm_runtime_use_autosuspend(&pdev->dev); | 290 | pm_runtime_use_autosuspend(&pdev->dev); |
| 291 | pm_runtime_put_autosuspend(&pdev->dev); | ||
| 293 | pm_runtime_allow(&pdev->dev); | 292 | pm_runtime_allow(&pdev->dev); |
| 294 | 293 | ||
| 295 | return 0; | 294 | return 0; |
| @@ -309,7 +308,7 @@ static void i2c_dw_pci_remove(struct pci_dev *pdev) | |||
| 309 | /* work with hotplug and coldplug */ | 308 | /* work with hotplug and coldplug */ |
| 310 | MODULE_ALIAS("i2c_designware-pci"); | 309 | MODULE_ALIAS("i2c_designware-pci"); |
| 311 | 310 | ||
| 312 | static DEFINE_PCI_DEVICE_TABLE(i2_designware_pci_ids) = { | 311 | static const struct pci_device_id i2_designware_pci_ids[] = { |
| 313 | /* Moorestown */ | 312 | /* Moorestown */ |
| 314 | { PCI_VDEVICE(INTEL, 0x0802), moorestown_0 }, | 313 | { PCI_VDEVICE(INTEL, 0x0802), moorestown_0 }, |
| 315 | { PCI_VDEVICE(INTEL, 0x0803), moorestown_1 }, | 314 | { PCI_VDEVICE(INTEL, 0x0803), moorestown_1 }, |
| @@ -321,6 +320,14 @@ static DEFINE_PCI_DEVICE_TABLE(i2_designware_pci_ids) = { | |||
| 321 | { PCI_VDEVICE(INTEL, 0x082C), medfield_0 }, | 320 | { PCI_VDEVICE(INTEL, 0x082C), medfield_0 }, |
| 322 | { PCI_VDEVICE(INTEL, 0x082D), medfield_1 }, | 321 | { PCI_VDEVICE(INTEL, 0x082D), medfield_1 }, |
| 323 | { PCI_VDEVICE(INTEL, 0x082E), medfield_2 }, | 322 | { PCI_VDEVICE(INTEL, 0x082E), medfield_2 }, |
| 323 | /* Baytrail */ | ||
| 324 | { PCI_VDEVICE(INTEL, 0x0F41), baytrail }, | ||
| 325 | { PCI_VDEVICE(INTEL, 0x0F42), baytrail }, | ||
| 326 | { PCI_VDEVICE(INTEL, 0x0F43), baytrail }, | ||
| 327 | { PCI_VDEVICE(INTEL, 0x0F44), baytrail }, | ||
| 328 | { PCI_VDEVICE(INTEL, 0x0F45), baytrail }, | ||
| 329 | { PCI_VDEVICE(INTEL, 0x0F46), baytrail }, | ||
| 330 | { PCI_VDEVICE(INTEL, 0x0F47), baytrail }, | ||
| 324 | { 0,} | 331 | { 0,} |
| 325 | }; | 332 | }; |
| 326 | MODULE_DEVICE_TABLE(pci, i2_designware_pci_ids); | 333 | MODULE_DEVICE_TABLE(pci, i2_designware_pci_ids); |
diff --git a/drivers/i2c/busses/i2c-designware-platdrv.c b/drivers/i2c/busses/i2c-designware-platdrv.c index d0bdac0498ce..9c7802614342 100644 --- a/drivers/i2c/busses/i2c-designware-platdrv.c +++ b/drivers/i2c/busses/i2c-designware-platdrv.c | |||
| @@ -159,6 +159,13 @@ static int dw_i2c_probe(struct platform_device *pdev) | |||
| 159 | "i2c-sda-hold-time-ns", &ht); | 159 | "i2c-sda-hold-time-ns", &ht); |
| 160 | dev->sda_hold_time = div_u64((u64)ic_clk * ht + 500000, | 160 | dev->sda_hold_time = div_u64((u64)ic_clk * ht + 500000, |
| 161 | 1000000); | 161 | 1000000); |
| 162 | |||
| 163 | of_property_read_u32(pdev->dev.of_node, | ||
| 164 | "i2c-sda-falling-time-ns", | ||
| 165 | &dev->sda_falling_time); | ||
| 166 | of_property_read_u32(pdev->dev.of_node, | ||
| 167 | "i2c-scl-falling-time-ns", | ||
| 168 | &dev->scl_falling_time); | ||
| 162 | } | 169 | } |
| 163 | 170 | ||
| 164 | dev->functionality = | 171 | dev->functionality = |
| @@ -195,7 +202,7 @@ static int dw_i2c_probe(struct platform_device *pdev) | |||
| 195 | adap = &dev->adapter; | 202 | adap = &dev->adapter; |
| 196 | i2c_set_adapdata(adap, dev); | 203 | i2c_set_adapdata(adap, dev); |
| 197 | adap->owner = THIS_MODULE; | 204 | adap->owner = THIS_MODULE; |
| 198 | adap->class = I2C_CLASS_HWMON; | 205 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_DEPRECATED; |
| 199 | strlcpy(adap->name, "Synopsys DesignWare I2C adapter", | 206 | strlcpy(adap->name, "Synopsys DesignWare I2C adapter", |
| 200 | sizeof(adap->name)); | 207 | sizeof(adap->name)); |
| 201 | adap->algo = &i2c_dw_algo; | 208 | adap->algo = &i2c_dw_algo; |
diff --git a/drivers/i2c/busses/i2c-efm32.c b/drivers/i2c/busses/i2c-efm32.c new file mode 100644 index 000000000000..777ed409a24a --- /dev/null +++ b/drivers/i2c/busses/i2c-efm32.c | |||
| @@ -0,0 +1,481 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (C) 2014 Uwe Kleine-Koenig for Pengutronix | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify it under | ||
| 5 | * the terms of the GNU General Public License version 2 as published by the | ||
| 6 | * Free Software Foundation. | ||
| 7 | */ | ||
| 8 | #include <linux/module.h> | ||
| 9 | #include <linux/platform_device.h> | ||
| 10 | #include <linux/i2c.h> | ||
| 11 | #include <linux/io.h> | ||
| 12 | #include <linux/interrupt.h> | ||
| 13 | #include <linux/err.h> | ||
| 14 | #include <linux/clk.h> | ||
| 15 | |||
| 16 | #define DRIVER_NAME "efm32-i2c" | ||
| 17 | |||
| 18 | #define MASK_VAL(mask, val) ((val << __ffs(mask)) & mask) | ||
| 19 | |||
| 20 | #define REG_CTRL 0x00 | ||
| 21 | #define REG_CTRL_EN 0x00001 | ||
| 22 | #define REG_CTRL_SLAVE 0x00002 | ||
| 23 | #define REG_CTRL_AUTOACK 0x00004 | ||
| 24 | #define REG_CTRL_AUTOSE 0x00008 | ||
| 25 | #define REG_CTRL_AUTOSN 0x00010 | ||
| 26 | #define REG_CTRL_ARBDIS 0x00020 | ||
| 27 | #define REG_CTRL_GCAMEN 0x00040 | ||
| 28 | #define REG_CTRL_CLHR__MASK 0x00300 | ||
| 29 | #define REG_CTRL_BITO__MASK 0x03000 | ||
| 30 | #define REG_CTRL_BITO_OFF 0x00000 | ||
| 31 | #define REG_CTRL_BITO_40PCC 0x01000 | ||
| 32 | #define REG_CTRL_BITO_80PCC 0x02000 | ||
| 33 | #define REG_CTRL_BITO_160PCC 0x03000 | ||
| 34 | #define REG_CTRL_GIBITO 0x08000 | ||
| 35 | #define REG_CTRL_CLTO__MASK 0x70000 | ||
| 36 | #define REG_CTRL_CLTO_OFF 0x00000 | ||
| 37 | |||
| 38 | #define REG_CMD 0x04 | ||
| 39 | #define REG_CMD_START 0x00001 | ||
| 40 | #define REG_CMD_STOP 0x00002 | ||
| 41 | #define REG_CMD_ACK 0x00004 | ||
| 42 | #define REG_CMD_NACK 0x00008 | ||
| 43 | #define REG_CMD_CONT 0x00010 | ||
| 44 | #define REG_CMD_ABORT 0x00020 | ||
| 45 | #define REG_CMD_CLEARTX 0x00040 | ||
| 46 | #define REG_CMD_CLEARPC 0x00080 | ||
| 47 | |||
| 48 | #define REG_STATE 0x08 | ||
| 49 | #define REG_STATE_BUSY 0x00001 | ||
| 50 | #define REG_STATE_MASTER 0x00002 | ||
| 51 | #define REG_STATE_TRANSMITTER 0x00004 | ||
| 52 | #define REG_STATE_NACKED 0x00008 | ||
| 53 | #define REG_STATE_BUSHOLD 0x00010 | ||
| 54 | #define REG_STATE_STATE__MASK 0x000e0 | ||
| 55 | #define REG_STATE_STATE_IDLE 0x00000 | ||
| 56 | #define REG_STATE_STATE_WAIT 0x00020 | ||
| 57 | #define REG_STATE_STATE_START 0x00040 | ||
| 58 | #define REG_STATE_STATE_ADDR 0x00060 | ||
| 59 | #define REG_STATE_STATE_ADDRACK 0x00080 | ||
| 60 | #define REG_STATE_STATE_DATA 0x000a0 | ||
| 61 | #define REG_STATE_STATE_DATAACK 0x000c0 | ||
| 62 | |||
| 63 | #define REG_STATUS 0x0c | ||
| 64 | #define REG_STATUS_PSTART 0x00001 | ||
| 65 | #define REG_STATUS_PSTOP 0x00002 | ||
| 66 | #define REG_STATUS_PACK 0x00004 | ||
| 67 | #define REG_STATUS_PNACK 0x00008 | ||
| 68 | #define REG_STATUS_PCONT 0x00010 | ||
| 69 | #define REG_STATUS_PABORT 0x00020 | ||
| 70 | #define REG_STATUS_TXC 0x00040 | ||
| 71 | #define REG_STATUS_TXBL 0x00080 | ||
| 72 | #define REG_STATUS_RXDATAV 0x00100 | ||
| 73 | |||
| 74 | #define REG_CLKDIV 0x10 | ||
| 75 | #define REG_CLKDIV_DIV__MASK 0x001ff | ||
| 76 | #define REG_CLKDIV_DIV(div) MASK_VAL(REG_CLKDIV_DIV__MASK, (div)) | ||
| 77 | |||
| 78 | #define REG_SADDR 0x14 | ||
| 79 | #define REG_SADDRMASK 0x18 | ||
| 80 | #define REG_RXDATA 0x1c | ||
| 81 | #define REG_RXDATAP 0x20 | ||
| 82 | #define REG_TXDATA 0x24 | ||
| 83 | #define REG_IF 0x28 | ||
| 84 | #define REG_IF_START 0x00001 | ||
| 85 | #define REG_IF_RSTART 0x00002 | ||
| 86 | #define REG_IF_ADDR 0x00004 | ||
| 87 | #define REG_IF_TXC 0x00008 | ||
| 88 | #define REG_IF_TXBL 0x00010 | ||
| 89 | #define REG_IF_RXDATAV 0x00020 | ||
| 90 | #define REG_IF_ACK 0x00040 | ||
| 91 | #define REG_IF_NACK 0x00080 | ||
| 92 | #define REG_IF_MSTOP 0x00100 | ||
| 93 | #define REG_IF_ARBLOST 0x00200 | ||
| 94 | #define REG_IF_BUSERR 0x00400 | ||
| 95 | #define REG_IF_BUSHOLD 0x00800 | ||
| 96 | #define REG_IF_TXOF 0x01000 | ||
| 97 | #define REG_IF_RXUF 0x02000 | ||
| 98 | #define REG_IF_BITO 0x04000 | ||
| 99 | #define REG_IF_CLTO 0x08000 | ||
| 100 | #define REG_IF_SSTOP 0x10000 | ||
| 101 | |||
| 102 | #define REG_IFS 0x2c | ||
| 103 | #define REG_IFC 0x30 | ||
| 104 | #define REG_IFC__MASK 0x1ffcf | ||
| 105 | |||
| 106 | #define REG_IEN 0x34 | ||
| 107 | |||
| 108 | #define REG_ROUTE 0x38 | ||
| 109 | #define REG_ROUTE_SDAPEN 0x00001 | ||
| 110 | #define REG_ROUTE_SCLPEN 0x00002 | ||
| 111 | #define REG_ROUTE_LOCATION__MASK 0x00700 | ||
| 112 | #define REG_ROUTE_LOCATION(n) MASK_VAL(REG_ROUTE_LOCATION__MASK, (n)) | ||
| 113 | |||
| 114 | struct efm32_i2c_ddata { | ||
| 115 | struct i2c_adapter adapter; | ||
| 116 | |||
| 117 | struct clk *clk; | ||
| 118 | void __iomem *base; | ||
| 119 | unsigned int irq; | ||
| 120 | u8 location; | ||
| 121 | unsigned long frequency; | ||
| 122 | |||
| 123 | /* transfer data */ | ||
| 124 | struct completion done; | ||
| 125 | struct i2c_msg *msgs; | ||
| 126 | size_t num_msgs; | ||
| 127 | size_t current_word, current_msg; | ||
| 128 | int retval; | ||
| 129 | }; | ||
| 130 | |||
| 131 | static u32 efm32_i2c_read32(struct efm32_i2c_ddata *ddata, unsigned offset) | ||
| 132 | { | ||
| 133 | return readl(ddata->base + offset); | ||
| 134 | } | ||
| 135 | |||
| 136 | static void efm32_i2c_write32(struct efm32_i2c_ddata *ddata, | ||
| 137 | unsigned offset, u32 value) | ||
| 138 | { | ||
| 139 | writel(value, ddata->base + offset); | ||
| 140 | } | ||
| 141 | |||
| 142 | static void efm32_i2c_send_next_msg(struct efm32_i2c_ddata *ddata) | ||
| 143 | { | ||
| 144 | struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; | ||
| 145 | |||
| 146 | efm32_i2c_write32(ddata, REG_CMD, REG_CMD_START); | ||
| 147 | efm32_i2c_write32(ddata, REG_TXDATA, cur_msg->addr << 1 | | ||
| 148 | (cur_msg->flags & I2C_M_RD ? 1 : 0)); | ||
| 149 | } | ||
| 150 | |||
| 151 | static void efm32_i2c_send_next_byte(struct efm32_i2c_ddata *ddata) | ||
| 152 | { | ||
| 153 | struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; | ||
| 154 | |||
| 155 | if (ddata->current_word >= cur_msg->len) { | ||
| 156 | /* cur_msg completely transferred */ | ||
| 157 | ddata->current_word = 0; | ||
| 158 | ddata->current_msg += 1; | ||
| 159 | |||
| 160 | if (ddata->current_msg >= ddata->num_msgs) { | ||
| 161 | efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); | ||
| 162 | complete(&ddata->done); | ||
| 163 | } else { | ||
| 164 | efm32_i2c_send_next_msg(ddata); | ||
| 165 | } | ||
| 166 | } else { | ||
| 167 | efm32_i2c_write32(ddata, REG_TXDATA, | ||
| 168 | cur_msg->buf[ddata->current_word++]); | ||
| 169 | } | ||
| 170 | } | ||
| 171 | |||
| 172 | static void efm32_i2c_recv_next_byte(struct efm32_i2c_ddata *ddata) | ||
| 173 | { | ||
| 174 | struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; | ||
| 175 | |||
| 176 | cur_msg->buf[ddata->current_word] = efm32_i2c_read32(ddata, REG_RXDATA); | ||
| 177 | ddata->current_word += 1; | ||
| 178 | if (ddata->current_word >= cur_msg->len) { | ||
| 179 | /* cur_msg completely transferred */ | ||
| 180 | ddata->current_word = 0; | ||
| 181 | ddata->current_msg += 1; | ||
| 182 | |||
| 183 | efm32_i2c_write32(ddata, REG_CMD, REG_CMD_NACK); | ||
| 184 | |||
| 185 | if (ddata->current_msg >= ddata->num_msgs) { | ||
| 186 | efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); | ||
| 187 | complete(&ddata->done); | ||
| 188 | } else { | ||
| 189 | efm32_i2c_send_next_msg(ddata); | ||
| 190 | } | ||
| 191 | } else { | ||
| 192 | efm32_i2c_write32(ddata, REG_CMD, REG_CMD_ACK); | ||
| 193 | } | ||
| 194 | } | ||
| 195 | |||
| 196 | static irqreturn_t efm32_i2c_irq(int irq, void *dev_id) | ||
| 197 | { | ||
| 198 | struct efm32_i2c_ddata *ddata = dev_id; | ||
| 199 | struct i2c_msg *cur_msg = &ddata->msgs[ddata->current_msg]; | ||
| 200 | u32 irqflag = efm32_i2c_read32(ddata, REG_IF); | ||
| 201 | u32 state = efm32_i2c_read32(ddata, REG_STATE); | ||
| 202 | |||
| 203 | efm32_i2c_write32(ddata, REG_IFC, irqflag & REG_IFC__MASK); | ||
| 204 | |||
| 205 | switch (state & REG_STATE_STATE__MASK) { | ||
| 206 | case REG_STATE_STATE_IDLE: | ||
| 207 | /* arbitration lost? */ | ||
| 208 | ddata->retval = -EAGAIN; | ||
| 209 | complete(&ddata->done); | ||
| 210 | break; | ||
| 211 | case REG_STATE_STATE_WAIT: | ||
| 212 | /* | ||
| 213 | * huh, this shouldn't happen. | ||
| 214 | * Reset hardware state and get out | ||
| 215 | */ | ||
| 216 | ddata->retval = -EIO; | ||
| 217 | efm32_i2c_write32(ddata, REG_CMD, | ||
| 218 | REG_CMD_STOP | REG_CMD_ABORT | | ||
| 219 | REG_CMD_CLEARTX | REG_CMD_CLEARPC); | ||
| 220 | complete(&ddata->done); | ||
| 221 | break; | ||
| 222 | case REG_STATE_STATE_START: | ||
| 223 | /* "caller" is expected to send an address */ | ||
| 224 | break; | ||
| 225 | case REG_STATE_STATE_ADDR: | ||
| 226 | /* wait for Ack or NAck of slave */ | ||
| 227 | break; | ||
| 228 | case REG_STATE_STATE_ADDRACK: | ||
| 229 | if (state & REG_STATE_NACKED) { | ||
| 230 | efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); | ||
| 231 | ddata->retval = -ENXIO; | ||
| 232 | complete(&ddata->done); | ||
| 233 | } else if (cur_msg->flags & I2C_M_RD) { | ||
| 234 | /* wait for slave to send first data byte */ | ||
| 235 | } else { | ||
| 236 | efm32_i2c_send_next_byte(ddata); | ||
| 237 | } | ||
| 238 | break; | ||
| 239 | case REG_STATE_STATE_DATA: | ||
| 240 | if (cur_msg->flags & I2C_M_RD) { | ||
| 241 | efm32_i2c_recv_next_byte(ddata); | ||
| 242 | } else { | ||
| 243 | /* wait for Ack or Nack of slave */ | ||
| 244 | } | ||
| 245 | break; | ||
| 246 | case REG_STATE_STATE_DATAACK: | ||
| 247 | if (state & REG_STATE_NACKED) { | ||
| 248 | efm32_i2c_write32(ddata, REG_CMD, REG_CMD_STOP); | ||
| 249 | complete(&ddata->done); | ||
| 250 | } else { | ||
| 251 | efm32_i2c_send_next_byte(ddata); | ||
| 252 | } | ||
| 253 | } | ||
| 254 | |||
| 255 | return IRQ_HANDLED; | ||
| 256 | } | ||
| 257 | |||
| 258 | static int efm32_i2c_master_xfer(struct i2c_adapter *adap, | ||
| 259 | struct i2c_msg *msgs, int num) | ||
| 260 | { | ||
| 261 | struct efm32_i2c_ddata *ddata = i2c_get_adapdata(adap); | ||
| 262 | int ret; | ||
| 263 | |||
| 264 | if (ddata->msgs) | ||
| 265 | return -EBUSY; | ||
| 266 | |||
| 267 | ddata->msgs = msgs; | ||
| 268 | ddata->num_msgs = num; | ||
| 269 | ddata->current_word = 0; | ||
| 270 | ddata->current_msg = 0; | ||
| 271 | ddata->retval = -EIO; | ||
| 272 | |||
| 273 | reinit_completion(&ddata->done); | ||
| 274 | |||
| 275 | dev_dbg(&ddata->adapter.dev, "state: %08x, status: %08x\n", | ||
| 276 | efm32_i2c_read32(ddata, REG_STATE), | ||
| 277 | efm32_i2c_read32(ddata, REG_STATUS)); | ||
| 278 | |||
| 279 | efm32_i2c_send_next_msg(ddata); | ||
| 280 | |||
| 281 | wait_for_completion(&ddata->done); | ||
| 282 | |||
| 283 | if (ddata->current_msg >= ddata->num_msgs) | ||
| 284 | ret = ddata->num_msgs; | ||
| 285 | else | ||
| 286 | ret = ddata->retval; | ||
| 287 | |||
| 288 | return ret; | ||
| 289 | } | ||
| 290 | |||
| 291 | static u32 efm32_i2c_functionality(struct i2c_adapter *adap) | ||
| 292 | { | ||
| 293 | return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; | ||
| 294 | } | ||
| 295 | |||
| 296 | static const struct i2c_algorithm efm32_i2c_algo = { | ||
| 297 | .master_xfer = efm32_i2c_master_xfer, | ||
| 298 | .functionality = efm32_i2c_functionality, | ||
| 299 | }; | ||
| 300 | |||
| 301 | static u32 efm32_i2c_get_configured_location(struct efm32_i2c_ddata *ddata) | ||
| 302 | { | ||
| 303 | u32 reg = efm32_i2c_read32(ddata, REG_ROUTE); | ||
| 304 | |||
| 305 | return (reg & REG_ROUTE_LOCATION__MASK) >> | ||
| 306 | __ffs(REG_ROUTE_LOCATION__MASK); | ||
| 307 | } | ||
| 308 | |||
| 309 | static int efm32_i2c_probe(struct platform_device *pdev) | ||
| 310 | { | ||
| 311 | struct efm32_i2c_ddata *ddata; | ||
| 312 | struct resource *res; | ||
| 313 | unsigned long rate; | ||
| 314 | struct device_node *np = pdev->dev.of_node; | ||
| 315 | u32 location, frequency; | ||
| 316 | int ret; | ||
| 317 | u32 clkdiv; | ||
| 318 | |||
| 319 | if (!np) | ||
| 320 | return -EINVAL; | ||
| 321 | |||
| 322 | ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); | ||
| 323 | if (!ddata) { | ||
| 324 | dev_dbg(&pdev->dev, "failed to allocate private data\n"); | ||
| 325 | return -ENOMEM; | ||
| 326 | } | ||
| 327 | platform_set_drvdata(pdev, ddata); | ||
| 328 | |||
| 329 | init_completion(&ddata->done); | ||
| 330 | strlcpy(ddata->adapter.name, pdev->name, sizeof(ddata->adapter.name)); | ||
| 331 | ddata->adapter.owner = THIS_MODULE; | ||
| 332 | ddata->adapter.algo = &efm32_i2c_algo; | ||
| 333 | ddata->adapter.dev.parent = &pdev->dev; | ||
| 334 | ddata->adapter.dev.of_node = pdev->dev.of_node; | ||
| 335 | i2c_set_adapdata(&ddata->adapter, ddata); | ||
| 336 | |||
| 337 | ddata->clk = devm_clk_get(&pdev->dev, NULL); | ||
| 338 | if (IS_ERR(ddata->clk)) { | ||
| 339 | ret = PTR_ERR(ddata->clk); | ||
| 340 | dev_err(&pdev->dev, "failed to get clock: %d\n", ret); | ||
| 341 | return ret; | ||
| 342 | } | ||
| 343 | |||
| 344 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 345 | if (!res) { | ||
| 346 | dev_err(&pdev->dev, "failed to determine base address\n"); | ||
| 347 | return -ENODEV; | ||
| 348 | } | ||
| 349 | |||
| 350 | if (resource_size(res) < 0x42) { | ||
| 351 | dev_err(&pdev->dev, "memory resource too small\n"); | ||
| 352 | return -EINVAL; | ||
| 353 | } | ||
| 354 | |||
| 355 | ddata->base = devm_ioremap_resource(&pdev->dev, res); | ||
| 356 | if (IS_ERR(ddata->base)) | ||
| 357 | return PTR_ERR(ddata->base); | ||
| 358 | |||
| 359 | ret = platform_get_irq(pdev, 0); | ||
| 360 | if (ret <= 0) { | ||
| 361 | dev_err(&pdev->dev, "failed to get irq (%d)\n", ret); | ||
| 362 | if (!ret) | ||
| 363 | ret = -EINVAL; | ||
| 364 | return ret; | ||
| 365 | } | ||
| 366 | |||
| 367 | ddata->irq = ret; | ||
| 368 | |||
| 369 | ret = clk_prepare_enable(ddata->clk); | ||
| 370 | if (ret < 0) { | ||
| 371 | dev_err(&pdev->dev, "failed to enable clock (%d)\n", ret); | ||
| 372 | return ret; | ||
| 373 | } | ||
| 374 | |||
| 375 | ret = of_property_read_u32(np, "efm32,location", &location); | ||
| 376 | if (!ret) { | ||
| 377 | dev_dbg(&pdev->dev, "using location %u\n", location); | ||
| 378 | } else { | ||
| 379 | /* default to location configured in hardware */ | ||
| 380 | location = efm32_i2c_get_configured_location(ddata); | ||
| 381 | |||
| 382 | dev_info(&pdev->dev, "fall back to location %u\n", location); | ||
| 383 | } | ||
| 384 | |||
| 385 | ddata->location = location; | ||
| 386 | |||
| 387 | ret = of_property_read_u32(np, "clock-frequency", &frequency); | ||
| 388 | if (!ret) { | ||
| 389 | dev_dbg(&pdev->dev, "using frequency %u\n", frequency); | ||
| 390 | } else { | ||
| 391 | frequency = 100000; | ||
| 392 | dev_info(&pdev->dev, "defaulting to 100 kHz\n"); | ||
| 393 | } | ||
| 394 | ddata->frequency = frequency; | ||
| 395 | |||
| 396 | rate = clk_get_rate(ddata->clk); | ||
| 397 | if (!rate) { | ||
| 398 | dev_err(&pdev->dev, "there is no input clock available\n"); | ||
| 399 | ret = -EINVAL; | ||
| 400 | goto err_disable_clk; | ||
| 401 | } | ||
| 402 | clkdiv = DIV_ROUND_UP(rate, 8 * ddata->frequency) - 1; | ||
| 403 | if (clkdiv >= 0x200) { | ||
| 404 | dev_err(&pdev->dev, | ||
| 405 | "input clock too fast (%lu) to divide down to bus freq (%lu)", | ||
| 406 | rate, ddata->frequency); | ||
| 407 | ret = -EINVAL; | ||
| 408 | goto err_disable_clk; | ||
| 409 | } | ||
| 410 | |||
| 411 | dev_dbg(&pdev->dev, "input clock = %lu, bus freq = %lu, clkdiv = %lu\n", | ||
| 412 | rate, ddata->frequency, (unsigned long)clkdiv); | ||
| 413 | efm32_i2c_write32(ddata, REG_CLKDIV, REG_CLKDIV_DIV(clkdiv)); | ||
| 414 | |||
| 415 | efm32_i2c_write32(ddata, REG_ROUTE, REG_ROUTE_SDAPEN | | ||
| 416 | REG_ROUTE_SCLPEN | | ||
| 417 | REG_ROUTE_LOCATION(ddata->location)); | ||
| 418 | |||
| 419 | efm32_i2c_write32(ddata, REG_CTRL, REG_CTRL_EN | | ||
| 420 | REG_CTRL_BITO_160PCC | 0 * REG_CTRL_GIBITO); | ||
| 421 | |||
| 422 | efm32_i2c_write32(ddata, REG_IFC, REG_IFC__MASK); | ||
| 423 | efm32_i2c_write32(ddata, REG_IEN, REG_IF_TXC | REG_IF_ACK | REG_IF_NACK | ||
| 424 | | REG_IF_ARBLOST | REG_IF_BUSERR | REG_IF_RXDATAV); | ||
| 425 | |||
| 426 | /* to make bus idle */ | ||
| 427 | efm32_i2c_write32(ddata, REG_CMD, REG_CMD_ABORT); | ||
| 428 | |||
| 429 | ret = request_irq(ddata->irq, efm32_i2c_irq, 0, DRIVER_NAME, ddata); | ||
| 430 | if (ret < 0) { | ||
| 431 | dev_err(&pdev->dev, "failed to request irq (%d)\n", ret); | ||
| 432 | return ret; | ||
| 433 | } | ||
| 434 | |||
| 435 | ret = i2c_add_adapter(&ddata->adapter); | ||
| 436 | if (ret) { | ||
| 437 | dev_err(&pdev->dev, "failed to add i2c adapter (%d)\n", ret); | ||
| 438 | free_irq(ddata->irq, ddata); | ||
| 439 | |||
| 440 | err_disable_clk: | ||
| 441 | clk_disable_unprepare(ddata->clk); | ||
| 442 | } | ||
| 443 | return ret; | ||
| 444 | } | ||
| 445 | |||
| 446 | static int efm32_i2c_remove(struct platform_device *pdev) | ||
| 447 | { | ||
| 448 | struct efm32_i2c_ddata *ddata = platform_get_drvdata(pdev); | ||
| 449 | |||
| 450 | i2c_del_adapter(&ddata->adapter); | ||
| 451 | free_irq(ddata->irq, ddata); | ||
| 452 | clk_disable_unprepare(ddata->clk); | ||
| 453 | |||
| 454 | return 0; | ||
| 455 | } | ||
| 456 | |||
| 457 | static const struct of_device_id efm32_i2c_dt_ids[] = { | ||
| 458 | { | ||
| 459 | .compatible = "energymicro,efm32-i2c", | ||
| 460 | }, { | ||
| 461 | /* sentinel */ | ||
| 462 | } | ||
| 463 | }; | ||
| 464 | MODULE_DEVICE_TABLE(of, efm32_i2c_dt_ids); | ||
| 465 | |||
| 466 | static struct platform_driver efm32_i2c_driver = { | ||
| 467 | .probe = efm32_i2c_probe, | ||
| 468 | .remove = efm32_i2c_remove, | ||
| 469 | |||
| 470 | .driver = { | ||
| 471 | .name = DRIVER_NAME, | ||
| 472 | .owner = THIS_MODULE, | ||
| 473 | .of_match_table = efm32_i2c_dt_ids, | ||
| 474 | }, | ||
| 475 | }; | ||
| 476 | module_platform_driver(efm32_i2c_driver); | ||
| 477 | |||
| 478 | MODULE_AUTHOR("Uwe Kleine-Koenig <u.kleine-koenig@pengutronix.de>"); | ||
| 479 | MODULE_DESCRIPTION("EFM32 i2c driver"); | ||
| 480 | MODULE_LICENSE("GPL v2"); | ||
| 481 | MODULE_ALIAS("platform:" DRIVER_NAME); | ||
diff --git a/drivers/i2c/busses/i2c-eg20t.c b/drivers/i2c/busses/i2c-eg20t.c index e08e458bab02..ff775ac29e49 100644 --- a/drivers/i2c/busses/i2c-eg20t.c +++ b/drivers/i2c/busses/i2c-eg20t.c | |||
| @@ -186,7 +186,7 @@ static DEFINE_MUTEX(pch_mutex); | |||
| 186 | #define PCI_DEVICE_ID_ML7223_I2C 0x8010 | 186 | #define PCI_DEVICE_ID_ML7223_I2C 0x8010 |
| 187 | #define PCI_DEVICE_ID_ML7831_I2C 0x8817 | 187 | #define PCI_DEVICE_ID_ML7831_I2C 0x8817 |
| 188 | 188 | ||
| 189 | static DEFINE_PCI_DEVICE_TABLE(pch_pcidev_id) = { | 189 | static const struct pci_device_id pch_pcidev_id[] = { |
| 190 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_PCH_I2C), 1, }, | 190 | { PCI_VDEVICE(INTEL, PCI_DEVICE_ID_PCH_I2C), 1, }, |
| 191 | { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7213_I2C), 2, }, | 191 | { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7213_I2C), 2, }, |
| 192 | { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_I2C), 1, }, | 192 | { PCI_VDEVICE(ROHM, PCI_DEVICE_ID_ML7223_I2C), 1, }, |
diff --git a/drivers/i2c/busses/i2c-exynos5.c b/drivers/i2c/busses/i2c-exynos5.c index 9fd711c03dd2..00af0a0a3361 100644 --- a/drivers/i2c/busses/i2c-exynos5.c +++ b/drivers/i2c/busses/i2c-exynos5.c | |||
| @@ -566,7 +566,7 @@ static int exynos5_i2c_xfer_msg(struct exynos5_i2c *i2c, | |||
| 566 | static int exynos5_i2c_xfer(struct i2c_adapter *adap, | 566 | static int exynos5_i2c_xfer(struct i2c_adapter *adap, |
| 567 | struct i2c_msg *msgs, int num) | 567 | struct i2c_msg *msgs, int num) |
| 568 | { | 568 | { |
| 569 | struct exynos5_i2c *i2c = (struct exynos5_i2c *)adap->algo_data; | 569 | struct exynos5_i2c *i2c = adap->algo_data; |
| 570 | int i = 0, ret = 0, stop = 0; | 570 | int i = 0, ret = 0, stop = 0; |
| 571 | 571 | ||
| 572 | if (i2c->suspended) { | 572 | if (i2c->suspended) { |
| @@ -715,6 +715,7 @@ static int exynos5_i2c_remove(struct platform_device *pdev) | |||
| 715 | return 0; | 715 | return 0; |
| 716 | } | 716 | } |
| 717 | 717 | ||
| 718 | #ifdef CONFIG_PM_SLEEP | ||
| 718 | static int exynos5_i2c_suspend_noirq(struct device *dev) | 719 | static int exynos5_i2c_suspend_noirq(struct device *dev) |
| 719 | { | 720 | { |
| 720 | struct platform_device *pdev = to_platform_device(dev); | 721 | struct platform_device *pdev = to_platform_device(dev); |
| @@ -745,6 +746,7 @@ static int exynos5_i2c_resume_noirq(struct device *dev) | |||
| 745 | 746 | ||
| 746 | return 0; | 747 | return 0; |
| 747 | } | 748 | } |
| 749 | #endif | ||
| 748 | 750 | ||
| 749 | static SIMPLE_DEV_PM_OPS(exynos5_i2c_dev_pm_ops, exynos5_i2c_suspend_noirq, | 751 | static SIMPLE_DEV_PM_OPS(exynos5_i2c_dev_pm_ops, exynos5_i2c_suspend_noirq, |
| 750 | exynos5_i2c_resume_noirq); | 752 | exynos5_i2c_resume_noirq); |
diff --git a/drivers/i2c/busses/i2c-gpio.c b/drivers/i2c/busses/i2c-gpio.c index d9f7e186a4c7..02d2d4abb9dd 100644 --- a/drivers/i2c/busses/i2c-gpio.c +++ b/drivers/i2c/busses/i2c-gpio.c | |||
| @@ -94,6 +94,9 @@ static int of_i2c_gpio_get_pins(struct device_node *np, | |||
| 94 | *sda_pin = of_get_gpio(np, 0); | 94 | *sda_pin = of_get_gpio(np, 0); |
| 95 | *scl_pin = of_get_gpio(np, 1); | 95 | *scl_pin = of_get_gpio(np, 1); |
| 96 | 96 | ||
| 97 | if (*sda_pin == -EPROBE_DEFER || *scl_pin == -EPROBE_DEFER) | ||
| 98 | return -EPROBE_DEFER; | ||
| 99 | |||
| 97 | if (!gpio_is_valid(*sda_pin) || !gpio_is_valid(*scl_pin)) { | 100 | if (!gpio_is_valid(*sda_pin) || !gpio_is_valid(*scl_pin)) { |
| 98 | pr_err("%s: invalid GPIO pins, sda=%d/scl=%d\n", | 101 | pr_err("%s: invalid GPIO pins, sda=%d/scl=%d\n", |
| 99 | np->full_name, *sda_pin, *scl_pin); | 102 | np->full_name, *sda_pin, *scl_pin); |
diff --git a/drivers/i2c/busses/i2c-hydra.c b/drivers/i2c/busses/i2c-hydra.c index e248257fe517..14d2b76de25f 100644 --- a/drivers/i2c/busses/i2c-hydra.c +++ b/drivers/i2c/busses/i2c-hydra.c | |||
| @@ -104,7 +104,7 @@ static struct i2c_adapter hydra_adap = { | |||
| 104 | .algo_data = &hydra_bit_data, | 104 | .algo_data = &hydra_bit_data, |
| 105 | }; | 105 | }; |
| 106 | 106 | ||
| 107 | static DEFINE_PCI_DEVICE_TABLE(hydra_ids) = { | 107 | static const struct pci_device_id hydra_ids[] = { |
| 108 | { PCI_DEVICE(PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_HYDRA) }, | 108 | { PCI_DEVICE(PCI_VENDOR_ID_APPLE, PCI_DEVICE_ID_APPLE_HYDRA) }, |
| 109 | { 0, } | 109 | { 0, } |
| 110 | }; | 110 | }; |
diff --git a/drivers/i2c/busses/i2c-i801.c b/drivers/i2c/busses/i2c-i801.c index 349c2d35e792..6777cd6f8776 100644 --- a/drivers/i2c/busses/i2c-i801.c +++ b/drivers/i2c/busses/i2c-i801.c | |||
| @@ -60,6 +60,7 @@ | |||
| 60 | Wellsburg (PCH) MS 0x8d7f 32 hard yes yes yes | 60 | Wellsburg (PCH) MS 0x8d7f 32 hard yes yes yes |
| 61 | Coleto Creek (PCH) 0x23b0 32 hard yes yes yes | 61 | Coleto Creek (PCH) 0x23b0 32 hard yes yes yes |
| 62 | Wildcat Point-LP (PCH) 0x9ca2 32 hard yes yes yes | 62 | Wildcat Point-LP (PCH) 0x9ca2 32 hard yes yes yes |
| 63 | BayTrail (SOC) 0x0f12 32 hard yes yes yes | ||
| 63 | 64 | ||
| 64 | Features supported by this driver: | 65 | Features supported by this driver: |
| 65 | Software PEC no | 66 | Software PEC no |
| @@ -161,6 +162,7 @@ | |||
| 161 | STATUS_ERROR_FLAGS) | 162 | STATUS_ERROR_FLAGS) |
| 162 | 163 | ||
| 163 | /* Older devices have their ID defined in <linux/pci_ids.h> */ | 164 | /* Older devices have their ID defined in <linux/pci_ids.h> */ |
| 165 | #define PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS 0x0f12 | ||
| 164 | #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 | 166 | #define PCI_DEVICE_ID_INTEL_COUGARPOINT_SMBUS 0x1c22 |
| 165 | #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 | 167 | #define PCI_DEVICE_ID_INTEL_PATSBURG_SMBUS 0x1d22 |
| 166 | /* Patsburg also has three 'Integrated Device Function' SMBus controllers */ | 168 | /* Patsburg also has three 'Integrated Device Function' SMBus controllers */ |
| @@ -789,7 +791,7 @@ static const struct i2c_algorithm smbus_algorithm = { | |||
| 789 | .functionality = i801_func, | 791 | .functionality = i801_func, |
| 790 | }; | 792 | }; |
| 791 | 793 | ||
| 792 | static DEFINE_PCI_DEVICE_TABLE(i801_ids) = { | 794 | static const struct pci_device_id i801_ids[] = { |
| 793 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) }, | 795 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AA_3) }, |
| 794 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) }, | 796 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801AB_3) }, |
| 795 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) }, | 797 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_2) }, |
| @@ -822,6 +824,7 @@ static DEFINE_PCI_DEVICE_TABLE(i801_ids) = { | |||
| 822 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2) }, | 824 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WELLSBURG_SMBUS_MS2) }, |
| 823 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS) }, | 825 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_COLETOCREEK_SMBUS) }, |
| 824 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS) }, | 826 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_WILDCATPOINT_LP_SMBUS) }, |
| 827 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_BAYTRAIL_SMBUS) }, | ||
| 825 | { 0, } | 828 | { 0, } |
| 826 | }; | 829 | }; |
| 827 | 830 | ||
diff --git a/drivers/i2c/busses/i2c-ismt.c b/drivers/i2c/busses/i2c-ismt.c index 8ce4f517fc56..984492553e95 100644 --- a/drivers/i2c/busses/i2c-ismt.c +++ b/drivers/i2c/busses/i2c-ismt.c | |||
| @@ -182,7 +182,7 @@ struct ismt_priv { | |||
| 182 | /** | 182 | /** |
| 183 | * ismt_ids - PCI device IDs supported by this driver | 183 | * ismt_ids - PCI device IDs supported by this driver |
| 184 | */ | 184 | */ |
| 185 | static DEFINE_PCI_DEVICE_TABLE(ismt_ids) = { | 185 | static const struct pci_device_id ismt_ids[] = { |
| 186 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_S1200_SMT0) }, | 186 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_S1200_SMT0) }, |
| 187 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_S1200_SMT1) }, | 187 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_S1200_SMT1) }, |
| 188 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_AVOTON_SMT) }, | 188 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_AVOTON_SMT) }, |
diff --git a/drivers/i2c/busses/i2c-mv64xxx.c b/drivers/i2c/busses/i2c-mv64xxx.c index d52d84937ad3..540ea692bf79 100644 --- a/drivers/i2c/busses/i2c-mv64xxx.c +++ b/drivers/i2c/busses/i2c-mv64xxx.c | |||
| @@ -17,6 +17,7 @@ | |||
| 17 | #include <linux/interrupt.h> | 17 | #include <linux/interrupt.h> |
| 18 | #include <linux/mv643xx_i2c.h> | 18 | #include <linux/mv643xx_i2c.h> |
| 19 | #include <linux/platform_device.h> | 19 | #include <linux/platform_device.h> |
| 20 | #include <linux/reset.h> | ||
| 20 | #include <linux/io.h> | 21 | #include <linux/io.h> |
| 21 | #include <linux/of.h> | 22 | #include <linux/of.h> |
| 22 | #include <linux/of_device.h> | 23 | #include <linux/of_device.h> |
| @@ -97,7 +98,6 @@ enum { | |||
| 97 | enum { | 98 | enum { |
| 98 | MV64XXX_I2C_ACTION_INVALID, | 99 | MV64XXX_I2C_ACTION_INVALID, |
| 99 | MV64XXX_I2C_ACTION_CONTINUE, | 100 | MV64XXX_I2C_ACTION_CONTINUE, |
| 100 | MV64XXX_I2C_ACTION_SEND_START, | ||
| 101 | MV64XXX_I2C_ACTION_SEND_RESTART, | 101 | MV64XXX_I2C_ACTION_SEND_RESTART, |
| 102 | MV64XXX_I2C_ACTION_OFFLOAD_RESTART, | 102 | MV64XXX_I2C_ACTION_OFFLOAD_RESTART, |
| 103 | MV64XXX_I2C_ACTION_SEND_ADDR_1, | 103 | MV64XXX_I2C_ACTION_SEND_ADDR_1, |
| @@ -148,6 +148,8 @@ struct mv64xxx_i2c_data { | |||
| 148 | bool offload_enabled; | 148 | bool offload_enabled; |
| 149 | /* 5us delay in order to avoid repeated start timing violation */ | 149 | /* 5us delay in order to avoid repeated start timing violation */ |
| 150 | bool errata_delay; | 150 | bool errata_delay; |
| 151 | struct reset_control *rstc; | ||
| 152 | bool irq_clear_inverted; | ||
| 151 | }; | 153 | }; |
| 152 | 154 | ||
| 153 | static struct mv64xxx_i2c_regs mv64xxx_i2c_regs_mv64xxx = { | 155 | static struct mv64xxx_i2c_regs mv64xxx_i2c_regs_mv64xxx = { |
| @@ -176,11 +178,6 @@ mv64xxx_i2c_prepare_for_io(struct mv64xxx_i2c_data *drv_data, | |||
| 176 | { | 178 | { |
| 177 | u32 dir = 0; | 179 | u32 dir = 0; |
| 178 | 180 | ||
| 179 | drv_data->msg = msg; | ||
| 180 | drv_data->byte_posn = 0; | ||
| 181 | drv_data->bytes_left = msg->len; | ||
| 182 | drv_data->aborting = 0; | ||
| 183 | drv_data->rc = 0; | ||
| 184 | drv_data->cntl_bits = MV64XXX_I2C_REG_CONTROL_ACK | | 181 | drv_data->cntl_bits = MV64XXX_I2C_REG_CONTROL_ACK | |
| 185 | MV64XXX_I2C_REG_CONTROL_INTEN | MV64XXX_I2C_REG_CONTROL_TWSIEN; | 182 | MV64XXX_I2C_REG_CONTROL_INTEN | MV64XXX_I2C_REG_CONTROL_TWSIEN; |
| 186 | 183 | ||
| @@ -206,11 +203,6 @@ static int mv64xxx_i2c_offload_msg(struct mv64xxx_i2c_data *drv_data) | |||
| 206 | if (!drv_data->offload_enabled) | 203 | if (!drv_data->offload_enabled) |
| 207 | return -EOPNOTSUPP; | 204 | return -EOPNOTSUPP; |
| 208 | 205 | ||
| 209 | drv_data->msg = msg; | ||
| 210 | drv_data->byte_posn = 0; | ||
| 211 | drv_data->bytes_left = msg->len; | ||
| 212 | drv_data->aborting = 0; | ||
| 213 | drv_data->rc = 0; | ||
| 214 | /* Only regular transactions can be offloaded */ | 206 | /* Only regular transactions can be offloaded */ |
| 215 | if ((msg->flags & ~(I2C_M_TEN | I2C_M_RD)) != 0) | 207 | if ((msg->flags & ~(I2C_M_TEN | I2C_M_RD)) != 0) |
| 216 | return -EINVAL; | 208 | return -EINVAL; |
| @@ -419,6 +411,23 @@ mv64xxx_i2c_fsm(struct mv64xxx_i2c_data *drv_data, u32 status) | |||
| 419 | } | 411 | } |
| 420 | } | 412 | } |
| 421 | 413 | ||
| 414 | static void mv64xxx_i2c_send_start(struct mv64xxx_i2c_data *drv_data) | ||
| 415 | { | ||
| 416 | drv_data->msg = drv_data->msgs; | ||
| 417 | drv_data->byte_posn = 0; | ||
| 418 | drv_data->bytes_left = drv_data->msg->len; | ||
| 419 | drv_data->aborting = 0; | ||
| 420 | drv_data->rc = 0; | ||
| 421 | |||
| 422 | /* Can we offload this msg ? */ | ||
| 423 | if (mv64xxx_i2c_offload_msg(drv_data) < 0) { | ||
| 424 | /* No, switch to standard path */ | ||
| 425 | mv64xxx_i2c_prepare_for_io(drv_data, drv_data->msgs); | ||
| 426 | writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START, | ||
| 427 | drv_data->reg_base + drv_data->reg_offsets.control); | ||
| 428 | } | ||
| 429 | } | ||
| 430 | |||
| 422 | static void | 431 | static void |
| 423 | mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data) | 432 | mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data) |
| 424 | { | 433 | { |
| @@ -435,14 +444,8 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data) | |||
| 435 | 444 | ||
| 436 | drv_data->msgs++; | 445 | drv_data->msgs++; |
| 437 | drv_data->num_msgs--; | 446 | drv_data->num_msgs--; |
| 438 | if (mv64xxx_i2c_offload_msg(drv_data) < 0) { | 447 | mv64xxx_i2c_send_start(drv_data); |
| 439 | drv_data->cntl_bits |= MV64XXX_I2C_REG_CONTROL_START; | ||
| 440 | writel(drv_data->cntl_bits, | ||
| 441 | drv_data->reg_base + drv_data->reg_offsets.control); | ||
| 442 | 448 | ||
| 443 | /* Setup for the next message */ | ||
| 444 | mv64xxx_i2c_prepare_for_io(drv_data, drv_data->msgs); | ||
| 445 | } | ||
| 446 | if (drv_data->errata_delay) | 449 | if (drv_data->errata_delay) |
| 447 | udelay(5); | 450 | udelay(5); |
| 448 | 451 | ||
| @@ -459,16 +462,6 @@ mv64xxx_i2c_do_action(struct mv64xxx_i2c_data *drv_data) | |||
| 459 | drv_data->reg_base + drv_data->reg_offsets.control); | 462 | drv_data->reg_base + drv_data->reg_offsets.control); |
| 460 | break; | 463 | break; |
| 461 | 464 | ||
| 462 | case MV64XXX_I2C_ACTION_SEND_START: | ||
| 463 | /* Can we offload this msg ? */ | ||
| 464 | if (mv64xxx_i2c_offload_msg(drv_data) < 0) { | ||
| 465 | /* No, switch to standard path */ | ||
| 466 | mv64xxx_i2c_prepare_for_io(drv_data, drv_data->msgs); | ||
| 467 | writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_START, | ||
| 468 | drv_data->reg_base + drv_data->reg_offsets.control); | ||
| 469 | } | ||
| 470 | break; | ||
| 471 | |||
| 472 | case MV64XXX_I2C_ACTION_SEND_ADDR_1: | 465 | case MV64XXX_I2C_ACTION_SEND_ADDR_1: |
| 473 | writel(drv_data->addr1, | 466 | writel(drv_data->addr1, |
| 474 | drv_data->reg_base + drv_data->reg_offsets.data); | 467 | drv_data->reg_base + drv_data->reg_offsets.data); |
| @@ -566,6 +559,11 @@ mv64xxx_i2c_intr(int irq, void *dev_id) | |||
| 566 | status = readl(drv_data->reg_base + drv_data->reg_offsets.status); | 559 | status = readl(drv_data->reg_base + drv_data->reg_offsets.status); |
| 567 | mv64xxx_i2c_fsm(drv_data, status); | 560 | mv64xxx_i2c_fsm(drv_data, status); |
| 568 | mv64xxx_i2c_do_action(drv_data); | 561 | mv64xxx_i2c_do_action(drv_data); |
| 562 | |||
| 563 | if (drv_data->irq_clear_inverted) | ||
| 564 | writel(drv_data->cntl_bits | MV64XXX_I2C_REG_CONTROL_IFLG, | ||
| 565 | drv_data->reg_base + drv_data->reg_offsets.control); | ||
| 566 | |||
| 569 | rc = IRQ_HANDLED; | 567 | rc = IRQ_HANDLED; |
| 570 | } | 568 | } |
| 571 | spin_unlock_irqrestore(&drv_data->lock, flags); | 569 | spin_unlock_irqrestore(&drv_data->lock, flags); |
| @@ -626,12 +624,11 @@ mv64xxx_i2c_execute_msg(struct mv64xxx_i2c_data *drv_data, struct i2c_msg *msg, | |||
| 626 | 624 | ||
| 627 | spin_lock_irqsave(&drv_data->lock, flags); | 625 | spin_lock_irqsave(&drv_data->lock, flags); |
| 628 | 626 | ||
| 629 | drv_data->action = MV64XXX_I2C_ACTION_SEND_START; | ||
| 630 | drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_START_COND; | 627 | drv_data->state = MV64XXX_I2C_STATE_WAITING_FOR_START_COND; |
| 631 | 628 | ||
| 632 | drv_data->send_stop = is_last; | 629 | drv_data->send_stop = is_last; |
| 633 | drv_data->block = 1; | 630 | drv_data->block = 1; |
| 634 | mv64xxx_i2c_do_action(drv_data); | 631 | mv64xxx_i2c_send_start(drv_data); |
| 635 | spin_unlock_irqrestore(&drv_data->lock, flags); | 632 | spin_unlock_irqrestore(&drv_data->lock, flags); |
| 636 | 633 | ||
| 637 | mv64xxx_i2c_wait_for_completion(drv_data); | 634 | mv64xxx_i2c_wait_for_completion(drv_data); |
| @@ -685,6 +682,7 @@ static const struct i2c_algorithm mv64xxx_i2c_algo = { | |||
| 685 | */ | 682 | */ |
| 686 | static const struct of_device_id mv64xxx_i2c_of_match_table[] = { | 683 | static const struct of_device_id mv64xxx_i2c_of_match_table[] = { |
| 687 | { .compatible = "allwinner,sun4i-i2c", .data = &mv64xxx_i2c_regs_sun4i}, | 684 | { .compatible = "allwinner,sun4i-i2c", .data = &mv64xxx_i2c_regs_sun4i}, |
| 685 | { .compatible = "allwinner,sun6i-a31-i2c", .data = &mv64xxx_i2c_regs_sun4i}, | ||
| 688 | { .compatible = "marvell,mv64xxx-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, | 686 | { .compatible = "marvell,mv64xxx-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, |
| 689 | { .compatible = "marvell,mv78230-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, | 687 | { .compatible = "marvell,mv78230-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, |
| 690 | { .compatible = "marvell,mv78230-a0-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, | 688 | { .compatible = "marvell,mv78230-a0-i2c", .data = &mv64xxx_i2c_regs_mv64xxx}, |
| @@ -759,6 +757,16 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data, | |||
| 759 | } | 757 | } |
| 760 | drv_data->irq = irq_of_parse_and_map(np, 0); | 758 | drv_data->irq = irq_of_parse_and_map(np, 0); |
| 761 | 759 | ||
| 760 | drv_data->rstc = devm_reset_control_get_optional(dev, NULL); | ||
| 761 | if (IS_ERR(drv_data->rstc)) { | ||
| 762 | if (PTR_ERR(drv_data->rstc) == -EPROBE_DEFER) { | ||
| 763 | rc = -EPROBE_DEFER; | ||
| 764 | goto out; | ||
| 765 | } | ||
| 766 | } else { | ||
| 767 | reset_control_deassert(drv_data->rstc); | ||
| 768 | } | ||
| 769 | |||
| 762 | /* Its not yet defined how timeouts will be specified in device tree. | 770 | /* Its not yet defined how timeouts will be specified in device tree. |
| 763 | * So hard code the value to 1 second. | 771 | * So hard code the value to 1 second. |
| 764 | */ | 772 | */ |
| @@ -783,6 +791,10 @@ mv64xxx_of_config(struct mv64xxx_i2c_data *drv_data, | |||
| 783 | drv_data->offload_enabled = false; | 791 | drv_data->offload_enabled = false; |
| 784 | drv_data->errata_delay = true; | 792 | drv_data->errata_delay = true; |
| 785 | } | 793 | } |
| 794 | |||
| 795 | if (of_device_is_compatible(np, "allwinner,sun6i-a31-i2c")) | ||
| 796 | drv_data->irq_clear_inverted = true; | ||
| 797 | |||
| 786 | out: | 798 | out: |
| 787 | return rc; | 799 | return rc; |
| 788 | #endif | 800 | #endif |
| @@ -845,13 +857,13 @@ mv64xxx_i2c_probe(struct platform_device *pd) | |||
| 845 | } | 857 | } |
| 846 | if (drv_data->irq < 0) { | 858 | if (drv_data->irq < 0) { |
| 847 | rc = -ENXIO; | 859 | rc = -ENXIO; |
| 848 | goto exit_clk; | 860 | goto exit_reset; |
| 849 | } | 861 | } |
| 850 | 862 | ||
| 851 | drv_data->adapter.dev.parent = &pd->dev; | 863 | drv_data->adapter.dev.parent = &pd->dev; |
| 852 | drv_data->adapter.algo = &mv64xxx_i2c_algo; | 864 | drv_data->adapter.algo = &mv64xxx_i2c_algo; |
| 853 | drv_data->adapter.owner = THIS_MODULE; | 865 | drv_data->adapter.owner = THIS_MODULE; |
| 854 | drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD; | 866 | drv_data->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED; |
| 855 | drv_data->adapter.nr = pd->id; | 867 | drv_data->adapter.nr = pd->id; |
| 856 | drv_data->adapter.dev.of_node = pd->dev.of_node; | 868 | drv_data->adapter.dev.of_node = pd->dev.of_node; |
| 857 | platform_set_drvdata(pd, drv_data); | 869 | platform_set_drvdata(pd, drv_data); |
| @@ -865,7 +877,7 @@ mv64xxx_i2c_probe(struct platform_device *pd) | |||
| 865 | dev_err(&drv_data->adapter.dev, | 877 | dev_err(&drv_data->adapter.dev, |
| 866 | "mv64xxx: Can't register intr handler irq%d: %d\n", | 878 | "mv64xxx: Can't register intr handler irq%d: %d\n", |
| 867 | drv_data->irq, rc); | 879 | drv_data->irq, rc); |
| 868 | goto exit_clk; | 880 | goto exit_reset; |
| 869 | } else if ((rc = i2c_add_numbered_adapter(&drv_data->adapter)) != 0) { | 881 | } else if ((rc = i2c_add_numbered_adapter(&drv_data->adapter)) != 0) { |
| 870 | dev_err(&drv_data->adapter.dev, | 882 | dev_err(&drv_data->adapter.dev, |
| 871 | "mv64xxx: Can't add i2c adapter, rc: %d\n", -rc); | 883 | "mv64xxx: Can't add i2c adapter, rc: %d\n", -rc); |
| @@ -876,6 +888,9 @@ mv64xxx_i2c_probe(struct platform_device *pd) | |||
| 876 | 888 | ||
| 877 | exit_free_irq: | 889 | exit_free_irq: |
| 878 | free_irq(drv_data->irq, drv_data); | 890 | free_irq(drv_data->irq, drv_data); |
| 891 | exit_reset: | ||
| 892 | if (!IS_ERR_OR_NULL(drv_data->rstc)) | ||
| 893 | reset_control_assert(drv_data->rstc); | ||
| 879 | exit_clk: | 894 | exit_clk: |
| 880 | #if defined(CONFIG_HAVE_CLK) | 895 | #if defined(CONFIG_HAVE_CLK) |
| 881 | /* Not all platforms have a clk */ | 896 | /* Not all platforms have a clk */ |
| @@ -894,6 +909,8 @@ mv64xxx_i2c_remove(struct platform_device *dev) | |||
| 894 | 909 | ||
| 895 | i2c_del_adapter(&drv_data->adapter); | 910 | i2c_del_adapter(&drv_data->adapter); |
| 896 | free_irq(drv_data->irq, drv_data); | 911 | free_irq(drv_data->irq, drv_data); |
| 912 | if (!IS_ERR_OR_NULL(drv_data->rstc)) | ||
| 913 | reset_control_assert(drv_data->rstc); | ||
| 897 | #if defined(CONFIG_HAVE_CLK) | 914 | #if defined(CONFIG_HAVE_CLK) |
| 898 | /* Not all platforms have a clk */ | 915 | /* Not all platforms have a clk */ |
| 899 | if (!IS_ERR(drv_data->clk)) { | 916 | if (!IS_ERR(drv_data->clk)) { |
diff --git a/drivers/i2c/busses/i2c-mxs.c b/drivers/i2c/busses/i2c-mxs.c index 0cde4e6ab2b2..7170fc892829 100644 --- a/drivers/i2c/busses/i2c-mxs.c +++ b/drivers/i2c/busses/i2c-mxs.c | |||
| @@ -806,7 +806,6 @@ static int mxs_i2c_probe(struct platform_device *pdev) | |||
| 806 | struct mxs_i2c_dev *i2c; | 806 | struct mxs_i2c_dev *i2c; |
| 807 | struct i2c_adapter *adap; | 807 | struct i2c_adapter *adap; |
| 808 | struct resource *res; | 808 | struct resource *res; |
| 809 | resource_size_t res_size; | ||
| 810 | int err, irq; | 809 | int err, irq; |
| 811 | 810 | ||
| 812 | i2c = devm_kzalloc(dev, sizeof(struct mxs_i2c_dev), GFP_KERNEL); | 811 | i2c = devm_kzalloc(dev, sizeof(struct mxs_i2c_dev), GFP_KERNEL); |
| @@ -819,18 +818,13 @@ static int mxs_i2c_probe(struct platform_device *pdev) | |||
| 819 | } | 818 | } |
| 820 | 819 | ||
| 821 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 820 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 822 | irq = platform_get_irq(pdev, 0); | 821 | i2c->regs = devm_ioremap_resource(&pdev->dev, res); |
| 823 | 822 | if (IS_ERR(i2c->regs)) | |
| 824 | if (!res || irq < 0) | 823 | return PTR_ERR(i2c->regs); |
| 825 | return -ENOENT; | ||
| 826 | 824 | ||
| 827 | res_size = resource_size(res); | 825 | irq = platform_get_irq(pdev, 0); |
| 828 | if (!devm_request_mem_region(dev, res->start, res_size, res->name)) | 826 | if (irq < 0) |
| 829 | return -EBUSY; | 827 | return irq; |
| 830 | |||
| 831 | i2c->regs = devm_ioremap_nocache(dev, res->start, res_size); | ||
| 832 | if (!i2c->regs) | ||
| 833 | return -EBUSY; | ||
| 834 | 828 | ||
| 835 | err = devm_request_irq(dev, irq, mxs_i2c_isr, 0, dev_name(dev), i2c); | 829 | err = devm_request_irq(dev, irq, mxs_i2c_isr, 0, dev_name(dev), i2c); |
| 836 | if (err) | 830 | if (err) |
diff --git a/drivers/i2c/busses/i2c-nforce2.c b/drivers/i2c/busses/i2c-nforce2.c index 0038c451095c..ee3a76c7ae97 100644 --- a/drivers/i2c/busses/i2c-nforce2.c +++ b/drivers/i2c/busses/i2c-nforce2.c | |||
| @@ -306,7 +306,7 @@ static struct i2c_algorithm smbus_algorithm = { | |||
| 306 | }; | 306 | }; |
| 307 | 307 | ||
| 308 | 308 | ||
| 309 | static DEFINE_PCI_DEVICE_TABLE(nforce2_ids) = { | 309 | static const struct pci_device_id nforce2_ids[] = { |
| 310 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS) }, | 310 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2_SMBUS) }, |
| 311 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SMBUS) }, | 311 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2S_SMBUS) }, |
| 312 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_SMBUS) }, | 312 | { PCI_DEVICE(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE3_SMBUS) }, |
diff --git a/drivers/i2c/busses/i2c-nomadik.c b/drivers/i2c/busses/i2c-nomadik.c index 4443613514ee..28cbe1b2a2ec 100644 --- a/drivers/i2c/busses/i2c-nomadik.c +++ b/drivers/i2c/busses/i2c-nomadik.c | |||
| @@ -111,22 +111,6 @@ enum i2c_freq_mode { | |||
| 111 | }; | 111 | }; |
| 112 | 112 | ||
| 113 | /** | 113 | /** |
| 114 | * struct nmk_i2c_controller - client specific controller configuration | ||
| 115 | * @clk_freq: clock frequency for the operation mode | ||
| 116 | * @tft: Tx FIFO Threshold in bytes | ||
| 117 | * @rft: Rx FIFO Threshold in bytes | ||
| 118 | * @timeout Slave response timeout(ms) | ||
| 119 | * @sm: speed mode | ||
| 120 | */ | ||
| 121 | struct nmk_i2c_controller { | ||
| 122 | u32 clk_freq; | ||
| 123 | unsigned char tft; | ||
| 124 | unsigned char rft; | ||
| 125 | int timeout; | ||
| 126 | enum i2c_freq_mode sm; | ||
| 127 | }; | ||
| 128 | |||
| 129 | /** | ||
| 130 | * struct i2c_vendor_data - per-vendor variations | 114 | * struct i2c_vendor_data - per-vendor variations |
| 131 | * @has_mtdws: variant has the MTDWS bit | 115 | * @has_mtdws: variant has the MTDWS bit |
| 132 | * @fifodepth: variant FIFO depth | 116 | * @fifodepth: variant FIFO depth |
| @@ -174,12 +158,15 @@ struct i2c_nmk_client { | |||
| 174 | * @irq: interrupt line for the controller. | 158 | * @irq: interrupt line for the controller. |
| 175 | * @virtbase: virtual io memory area. | 159 | * @virtbase: virtual io memory area. |
| 176 | * @clk: hardware i2c block clock. | 160 | * @clk: hardware i2c block clock. |
| 177 | * @cfg: machine provided controller configuration. | ||
| 178 | * @cli: holder of client specific data. | 161 | * @cli: holder of client specific data. |
| 162 | * @clk_freq: clock frequency for the operation mode | ||
| 163 | * @tft: Tx FIFO Threshold in bytes | ||
| 164 | * @rft: Rx FIFO Threshold in bytes | ||
| 165 | * @timeout Slave response timeout (ms) | ||
| 166 | * @sm: speed mode | ||
| 179 | * @stop: stop condition. | 167 | * @stop: stop condition. |
| 180 | * @xfer_complete: acknowledge completion for a I2C message. | 168 | * @xfer_complete: acknowledge completion for a I2C message. |
| 181 | * @result: controller propogated result. | 169 | * @result: controller propogated result. |
| 182 | * @busy: Busy doing transfer. | ||
| 183 | */ | 170 | */ |
| 184 | struct nmk_i2c_dev { | 171 | struct nmk_i2c_dev { |
| 185 | struct i2c_vendor_data *vendor; | 172 | struct i2c_vendor_data *vendor; |
| @@ -188,12 +175,15 @@ struct nmk_i2c_dev { | |||
| 188 | int irq; | 175 | int irq; |
| 189 | void __iomem *virtbase; | 176 | void __iomem *virtbase; |
| 190 | struct clk *clk; | 177 | struct clk *clk; |
| 191 | struct nmk_i2c_controller cfg; | ||
| 192 | struct i2c_nmk_client cli; | 178 | struct i2c_nmk_client cli; |
| 179 | u32 clk_freq; | ||
| 180 | unsigned char tft; | ||
| 181 | unsigned char rft; | ||
| 182 | int timeout; | ||
| 183 | enum i2c_freq_mode sm; | ||
| 193 | int stop; | 184 | int stop; |
| 194 | struct completion xfer_complete; | 185 | struct completion xfer_complete; |
| 195 | int result; | 186 | int result; |
| 196 | bool busy; | ||
| 197 | }; | 187 | }; |
| 198 | 188 | ||
| 199 | /* controller's abort causes */ | 189 | /* controller's abort causes */ |
| @@ -386,7 +376,7 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) | |||
| 386 | * slsu = cycles / (1000000000 / f) + 1 | 376 | * slsu = cycles / (1000000000 / f) + 1 |
| 387 | */ | 377 | */ |
| 388 | ns = DIV_ROUND_UP_ULL(1000000000ULL, i2c_clk); | 378 | ns = DIV_ROUND_UP_ULL(1000000000ULL, i2c_clk); |
| 389 | switch (dev->cfg.sm) { | 379 | switch (dev->sm) { |
| 390 | case I2C_FREQ_MODE_FAST: | 380 | case I2C_FREQ_MODE_FAST: |
| 391 | case I2C_FREQ_MODE_FAST_PLUS: | 381 | case I2C_FREQ_MODE_FAST_PLUS: |
| 392 | slsu = DIV_ROUND_UP(100, ns); /* Fast */ | 382 | slsu = DIV_ROUND_UP(100, ns); /* Fast */ |
| @@ -409,7 +399,7 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) | |||
| 409 | * 2 whereas it is 3 for fast and fastplus mode of | 399 | * 2 whereas it is 3 for fast and fastplus mode of |
| 410 | * operation. TODO - high speed support. | 400 | * operation. TODO - high speed support. |
| 411 | */ | 401 | */ |
| 412 | div = (dev->cfg.clk_freq > 100000) ? 3 : 2; | 402 | div = (dev->clk_freq > 100000) ? 3 : 2; |
| 413 | 403 | ||
| 414 | /* | 404 | /* |
| 415 | * generate the mask for baud rate counters. The controller | 405 | * generate the mask for baud rate counters. The controller |
| @@ -419,7 +409,7 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) | |||
| 419 | * so set brcr1 to 0. | 409 | * so set brcr1 to 0. |
| 420 | */ | 410 | */ |
| 421 | brcr1 = 0 << 16; | 411 | brcr1 = 0 << 16; |
| 422 | brcr2 = (i2c_clk/(dev->cfg.clk_freq * div)) & 0xffff; | 412 | brcr2 = (i2c_clk/(dev->clk_freq * div)) & 0xffff; |
| 423 | 413 | ||
| 424 | /* set the baud rate counter register */ | 414 | /* set the baud rate counter register */ |
| 425 | writel((brcr1 | brcr2), dev->virtbase + I2C_BRCR); | 415 | writel((brcr1 | brcr2), dev->virtbase + I2C_BRCR); |
| @@ -430,7 +420,7 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) | |||
| 430 | * TODO - support for fast mode plus (up to 1Mb/s) | 420 | * TODO - support for fast mode plus (up to 1Mb/s) |
| 431 | * and high speed (up to 3.4 Mb/s) | 421 | * and high speed (up to 3.4 Mb/s) |
| 432 | */ | 422 | */ |
| 433 | if (dev->cfg.sm > I2C_FREQ_MODE_FAST) { | 423 | if (dev->sm > I2C_FREQ_MODE_FAST) { |
| 434 | dev_err(&dev->adev->dev, | 424 | dev_err(&dev->adev->dev, |
| 435 | "do not support this mode defaulting to std. mode\n"); | 425 | "do not support this mode defaulting to std. mode\n"); |
| 436 | brcr2 = i2c_clk/(100000 * 2) & 0xffff; | 426 | brcr2 = i2c_clk/(100000 * 2) & 0xffff; |
| @@ -438,11 +428,11 @@ static void setup_i2c_controller(struct nmk_i2c_dev *dev) | |||
| 438 | writel(I2C_FREQ_MODE_STANDARD << 4, | 428 | writel(I2C_FREQ_MODE_STANDARD << 4, |
| 439 | dev->virtbase + I2C_CR); | 429 | dev->virtbase + I2C_CR); |
| 440 | } | 430 | } |
| 441 | writel(dev->cfg.sm << 4, dev->virtbase + I2C_CR); | 431 | writel(dev->sm << 4, dev->virtbase + I2C_CR); |
| 442 | 432 | ||
| 443 | /* set the Tx and Rx FIFO threshold */ | 433 | /* set the Tx and Rx FIFO threshold */ |
| 444 | writel(dev->cfg.tft, dev->virtbase + I2C_TFTR); | 434 | writel(dev->tft, dev->virtbase + I2C_TFTR); |
| 445 | writel(dev->cfg.rft, dev->virtbase + I2C_RFTR); | 435 | writel(dev->rft, dev->virtbase + I2C_RFTR); |
| 446 | } | 436 | } |
| 447 | 437 | ||
| 448 | /** | 438 | /** |
| @@ -674,28 +664,13 @@ static int nmk_i2c_xfer_one(struct nmk_i2c_dev *dev, u16 flags) | |||
| 674 | static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap, | 664 | static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap, |
| 675 | struct i2c_msg msgs[], int num_msgs) | 665 | struct i2c_msg msgs[], int num_msgs) |
| 676 | { | 666 | { |
| 677 | int status; | 667 | int status = 0; |
| 678 | int i; | 668 | int i; |
| 679 | struct nmk_i2c_dev *dev = i2c_get_adapdata(i2c_adap); | 669 | struct nmk_i2c_dev *dev = i2c_get_adapdata(i2c_adap); |
| 680 | int j; | 670 | int j; |
| 681 | 671 | ||
| 682 | dev->busy = true; | ||
| 683 | |||
| 684 | pm_runtime_get_sync(&dev->adev->dev); | 672 | pm_runtime_get_sync(&dev->adev->dev); |
| 685 | 673 | ||
| 686 | status = clk_prepare_enable(dev->clk); | ||
| 687 | if (status) { | ||
| 688 | dev_err(&dev->adev->dev, "can't prepare_enable clock\n"); | ||
| 689 | goto out_clk; | ||
| 690 | } | ||
| 691 | |||
| 692 | /* Optionaly enable pins to be muxed in and configured */ | ||
| 693 | pinctrl_pm_select_default_state(&dev->adev->dev); | ||
| 694 | |||
| 695 | status = init_hw(dev); | ||
| 696 | if (status) | ||
| 697 | goto out; | ||
| 698 | |||
| 699 | /* Attempt three times to send the message queue */ | 674 | /* Attempt three times to send the message queue */ |
| 700 | for (j = 0; j < 3; j++) { | 675 | for (j = 0; j < 3; j++) { |
| 701 | /* setup the i2c controller */ | 676 | /* setup the i2c controller */ |
| @@ -716,16 +691,8 @@ static int nmk_i2c_xfer(struct i2c_adapter *i2c_adap, | |||
| 716 | break; | 691 | break; |
| 717 | } | 692 | } |
| 718 | 693 | ||
| 719 | out: | ||
| 720 | clk_disable_unprepare(dev->clk); | ||
| 721 | out_clk: | ||
| 722 | /* Optionally let pins go into idle state */ | ||
| 723 | pinctrl_pm_select_idle_state(&dev->adev->dev); | ||
| 724 | |||
| 725 | pm_runtime_put_sync(&dev->adev->dev); | 694 | pm_runtime_put_sync(&dev->adev->dev); |
| 726 | 695 | ||
| 727 | dev->busy = false; | ||
| 728 | |||
| 729 | /* return the no. messages processed */ | 696 | /* return the no. messages processed */ |
| 730 | if (status) | 697 | if (status) |
| 731 | return status; | 698 | return status; |
| @@ -909,22 +876,15 @@ static irqreturn_t i2c_irq_handler(int irq, void *arg) | |||
| 909 | return IRQ_HANDLED; | 876 | return IRQ_HANDLED; |
| 910 | } | 877 | } |
| 911 | 878 | ||
| 912 | 879 | #ifdef CONFIG_PM_SLEEP | |
| 913 | #ifdef CONFIG_PM | 880 | static int nmk_i2c_suspend_late(struct device *dev) |
| 914 | static int nmk_i2c_suspend(struct device *dev) | ||
| 915 | { | 881 | { |
| 916 | struct amba_device *adev = to_amba_device(dev); | ||
| 917 | struct nmk_i2c_dev *nmk_i2c = amba_get_drvdata(adev); | ||
| 918 | |||
| 919 | if (nmk_i2c->busy) | ||
| 920 | return -EBUSY; | ||
| 921 | |||
| 922 | pinctrl_pm_select_sleep_state(dev); | 882 | pinctrl_pm_select_sleep_state(dev); |
| 923 | 883 | ||
| 924 | return 0; | 884 | return 0; |
| 925 | } | 885 | } |
| 926 | 886 | ||
| 927 | static int nmk_i2c_resume(struct device *dev) | 887 | static int nmk_i2c_resume_early(struct device *dev) |
| 928 | { | 888 | { |
| 929 | /* First go to the default state */ | 889 | /* First go to the default state */ |
| 930 | pinctrl_pm_select_default_state(dev); | 890 | pinctrl_pm_select_default_state(dev); |
| @@ -933,19 +893,48 @@ static int nmk_i2c_resume(struct device *dev) | |||
| 933 | 893 | ||
| 934 | return 0; | 894 | return 0; |
| 935 | } | 895 | } |
| 936 | #else | ||
| 937 | #define nmk_i2c_suspend NULL | ||
| 938 | #define nmk_i2c_resume NULL | ||
| 939 | #endif | 896 | #endif |
| 940 | 897 | ||
| 941 | /* | 898 | #ifdef CONFIG_PM |
| 942 | * We use noirq so that we suspend late and resume before the wakeup interrupt | 899 | static int nmk_i2c_runtime_suspend(struct device *dev) |
| 943 | * to ensure that we do the !pm_runtime_suspended() check in resume before | 900 | { |
| 944 | * there has been a regular pm runtime resume (via pm_runtime_get_sync()). | 901 | struct amba_device *adev = to_amba_device(dev); |
| 945 | */ | 902 | struct nmk_i2c_dev *nmk_i2c = amba_get_drvdata(adev); |
| 903 | |||
| 904 | clk_disable_unprepare(nmk_i2c->clk); | ||
| 905 | pinctrl_pm_select_idle_state(dev); | ||
| 906 | return 0; | ||
| 907 | } | ||
| 908 | |||
| 909 | static int nmk_i2c_runtime_resume(struct device *dev) | ||
| 910 | { | ||
| 911 | struct amba_device *adev = to_amba_device(dev); | ||
| 912 | struct nmk_i2c_dev *nmk_i2c = amba_get_drvdata(adev); | ||
| 913 | int ret; | ||
| 914 | |||
| 915 | ret = clk_prepare_enable(nmk_i2c->clk); | ||
| 916 | if (ret) { | ||
| 917 | dev_err(dev, "can't prepare_enable clock\n"); | ||
| 918 | return ret; | ||
| 919 | } | ||
| 920 | |||
| 921 | pinctrl_pm_select_default_state(dev); | ||
| 922 | |||
| 923 | ret = init_hw(nmk_i2c); | ||
| 924 | if (ret) { | ||
| 925 | clk_disable_unprepare(nmk_i2c->clk); | ||
| 926 | pinctrl_pm_select_idle_state(dev); | ||
| 927 | } | ||
| 928 | |||
| 929 | return ret; | ||
| 930 | } | ||
| 931 | #endif | ||
| 932 | |||
| 946 | static const struct dev_pm_ops nmk_i2c_pm = { | 933 | static const struct dev_pm_ops nmk_i2c_pm = { |
| 947 | .suspend_noirq = nmk_i2c_suspend, | 934 | SET_LATE_SYSTEM_SLEEP_PM_OPS(nmk_i2c_suspend_late, nmk_i2c_resume_early) |
| 948 | .resume_noirq = nmk_i2c_resume, | 935 | SET_PM_RUNTIME_PM_OPS(nmk_i2c_runtime_suspend, |
| 936 | nmk_i2c_runtime_resume, | ||
| 937 | NULL) | ||
| 949 | }; | 938 | }; |
| 950 | 939 | ||
| 951 | static unsigned int nmk_i2c_functionality(struct i2c_adapter *adap) | 940 | static unsigned int nmk_i2c_functionality(struct i2c_adapter *adap) |
| @@ -958,118 +947,98 @@ static const struct i2c_algorithm nmk_i2c_algo = { | |||
| 958 | .functionality = nmk_i2c_functionality | 947 | .functionality = nmk_i2c_functionality |
| 959 | }; | 948 | }; |
| 960 | 949 | ||
| 961 | static struct nmk_i2c_controller u8500_i2c = { | ||
| 962 | .tft = 1, /* Tx FIFO threshold */ | ||
| 963 | .rft = 8, /* Rx FIFO threshold */ | ||
| 964 | .clk_freq = 400000, /* fast mode operation */ | ||
| 965 | .timeout = 200, /* Slave response timeout(ms) */ | ||
| 966 | .sm = I2C_FREQ_MODE_FAST, | ||
| 967 | }; | ||
| 968 | |||
| 969 | static void nmk_i2c_of_probe(struct device_node *np, | 950 | static void nmk_i2c_of_probe(struct device_node *np, |
| 970 | struct nmk_i2c_controller *pdata) | 951 | struct nmk_i2c_dev *nmk) |
| 971 | { | 952 | { |
| 972 | of_property_read_u32(np, "clock-frequency", &pdata->clk_freq); | 953 | /* Default to 100 kHz if no frequency is given in the node */ |
| 954 | if (of_property_read_u32(np, "clock-frequency", &nmk->clk_freq)) | ||
| 955 | nmk->clk_freq = 100000; | ||
| 973 | 956 | ||
| 974 | /* This driver only supports 'standard' and 'fast' modes of operation. */ | 957 | /* This driver only supports 'standard' and 'fast' modes of operation. */ |
| 975 | if (pdata->clk_freq <= 100000) | 958 | if (nmk->clk_freq <= 100000) |
| 976 | pdata->sm = I2C_FREQ_MODE_STANDARD; | 959 | nmk->sm = I2C_FREQ_MODE_STANDARD; |
| 977 | else | 960 | else |
| 978 | pdata->sm = I2C_FREQ_MODE_FAST; | 961 | nmk->sm = I2C_FREQ_MODE_FAST; |
| 962 | nmk->tft = 1; /* Tx FIFO threshold */ | ||
| 963 | nmk->rft = 8; /* Rx FIFO threshold */ | ||
| 964 | nmk->timeout = 200; /* Slave response timeout(ms) */ | ||
| 979 | } | 965 | } |
| 980 | 966 | ||
| 981 | static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) | 967 | static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) |
| 982 | { | 968 | { |
| 983 | int ret = 0; | 969 | int ret = 0; |
| 984 | struct nmk_i2c_controller *pdata = dev_get_platdata(&adev->dev); | ||
| 985 | struct device_node *np = adev->dev.of_node; | 970 | struct device_node *np = adev->dev.of_node; |
| 986 | struct nmk_i2c_dev *dev; | 971 | struct nmk_i2c_dev *dev; |
| 987 | struct i2c_adapter *adap; | 972 | struct i2c_adapter *adap; |
| 988 | struct i2c_vendor_data *vendor = id->data; | 973 | struct i2c_vendor_data *vendor = id->data; |
| 989 | u32 max_fifo_threshold = (vendor->fifodepth / 2) - 1; | 974 | u32 max_fifo_threshold = (vendor->fifodepth / 2) - 1; |
| 990 | 975 | ||
| 991 | if (!pdata) { | 976 | dev = devm_kzalloc(&adev->dev, sizeof(struct nmk_i2c_dev), GFP_KERNEL); |
| 992 | if (np) { | 977 | if (!dev) { |
| 993 | pdata = devm_kzalloc(&adev->dev, sizeof(*pdata), GFP_KERNEL); | 978 | dev_err(&adev->dev, "cannot allocate memory\n"); |
| 994 | if (!pdata) { | 979 | ret = -ENOMEM; |
| 995 | ret = -ENOMEM; | 980 | goto err_no_mem; |
| 996 | goto err_no_mem; | ||
| 997 | } | ||
| 998 | /* Provide the default configuration as a base. */ | ||
| 999 | memcpy(pdata, &u8500_i2c, sizeof(struct nmk_i2c_controller)); | ||
| 1000 | nmk_i2c_of_probe(np, pdata); | ||
| 1001 | } else | ||
| 1002 | /* No i2c configuration found, using the default. */ | ||
| 1003 | pdata = &u8500_i2c; | ||
| 1004 | } | 981 | } |
| 982 | dev->vendor = vendor; | ||
| 983 | dev->adev = adev; | ||
| 984 | nmk_i2c_of_probe(np, dev); | ||
| 1005 | 985 | ||
| 1006 | if (pdata->tft > max_fifo_threshold) { | 986 | if (dev->tft > max_fifo_threshold) { |
| 1007 | dev_warn(&adev->dev, "requested TX FIFO threshold %u, adjusted down to %u\n", | 987 | dev_warn(&adev->dev, "requested TX FIFO threshold %u, adjusted down to %u\n", |
| 1008 | pdata->tft, max_fifo_threshold); | 988 | dev->tft, max_fifo_threshold); |
| 1009 | pdata->tft = max_fifo_threshold; | 989 | dev->tft = max_fifo_threshold; |
| 1010 | } | 990 | } |
| 1011 | 991 | ||
| 1012 | if (pdata->rft > max_fifo_threshold) { | 992 | if (dev->rft > max_fifo_threshold) { |
| 1013 | dev_warn(&adev->dev, "requested RX FIFO threshold %u, adjusted down to %u\n", | 993 | dev_warn(&adev->dev, "requested RX FIFO threshold %u, adjusted down to %u\n", |
| 1014 | pdata->rft, max_fifo_threshold); | 994 | dev->rft, max_fifo_threshold); |
| 1015 | pdata->rft = max_fifo_threshold; | 995 | dev->rft = max_fifo_threshold; |
| 1016 | } | 996 | } |
| 1017 | 997 | ||
| 1018 | dev = kzalloc(sizeof(struct nmk_i2c_dev), GFP_KERNEL); | ||
| 1019 | if (!dev) { | ||
| 1020 | dev_err(&adev->dev, "cannot allocate memory\n"); | ||
| 1021 | ret = -ENOMEM; | ||
| 1022 | goto err_no_mem; | ||
| 1023 | } | ||
| 1024 | dev->vendor = vendor; | ||
| 1025 | dev->busy = false; | ||
| 1026 | dev->adev = adev; | ||
| 1027 | amba_set_drvdata(adev, dev); | 998 | amba_set_drvdata(adev, dev); |
| 1028 | 999 | ||
| 1029 | /* Select default pin state */ | 1000 | dev->virtbase = devm_ioremap(&adev->dev, adev->res.start, |
| 1030 | pinctrl_pm_select_default_state(&adev->dev); | 1001 | resource_size(&adev->res)); |
| 1031 | /* If possible, let's go to idle until the first transfer */ | 1002 | if (IS_ERR(dev->virtbase)) { |
| 1032 | pinctrl_pm_select_idle_state(&adev->dev); | ||
| 1033 | |||
| 1034 | dev->virtbase = ioremap(adev->res.start, resource_size(&adev->res)); | ||
| 1035 | if (!dev->virtbase) { | ||
| 1036 | ret = -ENOMEM; | 1003 | ret = -ENOMEM; |
| 1037 | goto err_no_ioremap; | 1004 | goto err_no_mem; |
| 1038 | } | 1005 | } |
| 1039 | 1006 | ||
| 1040 | dev->irq = adev->irq[0]; | 1007 | dev->irq = adev->irq[0]; |
| 1041 | ret = request_irq(dev->irq, i2c_irq_handler, 0, | 1008 | ret = devm_request_irq(&adev->dev, dev->irq, i2c_irq_handler, 0, |
| 1042 | DRIVER_NAME, dev); | 1009 | DRIVER_NAME, dev); |
| 1043 | if (ret) { | 1010 | if (ret) { |
| 1044 | dev_err(&adev->dev, "cannot claim the irq %d\n", dev->irq); | 1011 | dev_err(&adev->dev, "cannot claim the irq %d\n", dev->irq); |
| 1045 | goto err_irq; | 1012 | goto err_no_mem; |
| 1046 | } | 1013 | } |
| 1047 | 1014 | ||
| 1048 | pm_suspend_ignore_children(&adev->dev, true); | 1015 | pm_suspend_ignore_children(&adev->dev, true); |
| 1049 | 1016 | ||
| 1050 | dev->clk = clk_get(&adev->dev, NULL); | 1017 | dev->clk = devm_clk_get(&adev->dev, NULL); |
| 1051 | if (IS_ERR(dev->clk)) { | 1018 | if (IS_ERR(dev->clk)) { |
| 1052 | dev_err(&adev->dev, "could not get i2c clock\n"); | 1019 | dev_err(&adev->dev, "could not get i2c clock\n"); |
| 1053 | ret = PTR_ERR(dev->clk); | 1020 | ret = PTR_ERR(dev->clk); |
| 1054 | goto err_no_clk; | 1021 | goto err_no_mem; |
| 1022 | } | ||
| 1023 | |||
| 1024 | ret = clk_prepare_enable(dev->clk); | ||
| 1025 | if (ret) { | ||
| 1026 | dev_err(&adev->dev, "can't prepare_enable clock\n"); | ||
| 1027 | goto err_no_mem; | ||
| 1055 | } | 1028 | } |
| 1056 | 1029 | ||
| 1030 | init_hw(dev); | ||
| 1031 | |||
| 1057 | adap = &dev->adap; | 1032 | adap = &dev->adap; |
| 1058 | adap->dev.of_node = np; | 1033 | adap->dev.of_node = np; |
| 1059 | adap->dev.parent = &adev->dev; | 1034 | adap->dev.parent = &adev->dev; |
| 1060 | adap->owner = THIS_MODULE; | 1035 | adap->owner = THIS_MODULE; |
| 1061 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; | 1036 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED; |
| 1062 | adap->algo = &nmk_i2c_algo; | 1037 | adap->algo = &nmk_i2c_algo; |
| 1063 | adap->timeout = msecs_to_jiffies(pdata->timeout); | 1038 | adap->timeout = msecs_to_jiffies(dev->timeout); |
| 1064 | snprintf(adap->name, sizeof(adap->name), | 1039 | snprintf(adap->name, sizeof(adap->name), |
| 1065 | "Nomadik I2C at %pR", &adev->res); | 1040 | "Nomadik I2C at %pR", &adev->res); |
| 1066 | 1041 | ||
| 1067 | /* fetch the controller configuration from machine */ | ||
| 1068 | dev->cfg.clk_freq = pdata->clk_freq; | ||
| 1069 | dev->cfg.tft = pdata->tft; | ||
| 1070 | dev->cfg.rft = pdata->rft; | ||
| 1071 | dev->cfg.sm = pdata->sm; | ||
| 1072 | |||
| 1073 | i2c_set_adapdata(adap, dev); | 1042 | i2c_set_adapdata(adap, dev); |
| 1074 | 1043 | ||
| 1075 | dev_info(&adev->dev, | 1044 | dev_info(&adev->dev, |
| @@ -1079,21 +1048,15 @@ static int nmk_i2c_probe(struct amba_device *adev, const struct amba_id *id) | |||
| 1079 | ret = i2c_add_adapter(adap); | 1048 | ret = i2c_add_adapter(adap); |
| 1080 | if (ret) { | 1049 | if (ret) { |
| 1081 | dev_err(&adev->dev, "failed to add adapter\n"); | 1050 | dev_err(&adev->dev, "failed to add adapter\n"); |
| 1082 | goto err_add_adap; | 1051 | goto err_no_adap; |
| 1083 | } | 1052 | } |
| 1084 | 1053 | ||
| 1085 | pm_runtime_put(&adev->dev); | 1054 | pm_runtime_put(&adev->dev); |
| 1086 | 1055 | ||
| 1087 | return 0; | 1056 | return 0; |
| 1088 | 1057 | ||
| 1089 | err_add_adap: | 1058 | err_no_adap: |
| 1090 | clk_put(dev->clk); | 1059 | clk_disable_unprepare(dev->clk); |
| 1091 | err_no_clk: | ||
| 1092 | free_irq(dev->irq, dev); | ||
| 1093 | err_irq: | ||
| 1094 | iounmap(dev->virtbase); | ||
| 1095 | err_no_ioremap: | ||
| 1096 | kfree(dev); | ||
| 1097 | err_no_mem: | 1060 | err_no_mem: |
| 1098 | 1061 | ||
| 1099 | return ret; | 1062 | return ret; |
| @@ -1110,13 +1073,9 @@ static int nmk_i2c_remove(struct amba_device *adev) | |||
| 1110 | clear_all_interrupts(dev); | 1073 | clear_all_interrupts(dev); |
| 1111 | /* disable the controller */ | 1074 | /* disable the controller */ |
| 1112 | i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE); | 1075 | i2c_clr_bit(dev->virtbase + I2C_CR, I2C_CR_PE); |
| 1113 | free_irq(dev->irq, dev); | 1076 | clk_disable_unprepare(dev->clk); |
| 1114 | iounmap(dev->virtbase); | ||
| 1115 | if (res) | 1077 | if (res) |
| 1116 | release_mem_region(res->start, resource_size(res)); | 1078 | release_mem_region(res->start, resource_size(res)); |
| 1117 | clk_put(dev->clk); | ||
| 1118 | pm_runtime_disable(&adev->dev); | ||
| 1119 | kfree(dev); | ||
| 1120 | 1079 | ||
| 1121 | return 0; | 1080 | return 0; |
| 1122 | } | 1081 | } |
diff --git a/drivers/i2c/busses/i2c-ocores.c b/drivers/i2c/busses/i2c-ocores.c index 80e06fa45720..1f6369f14fb6 100644 --- a/drivers/i2c/busses/i2c-ocores.c +++ b/drivers/i2c/busses/i2c-ocores.c | |||
| @@ -246,7 +246,7 @@ static const struct i2c_algorithm ocores_algorithm = { | |||
| 246 | static struct i2c_adapter ocores_adapter = { | 246 | static struct i2c_adapter ocores_adapter = { |
| 247 | .owner = THIS_MODULE, | 247 | .owner = THIS_MODULE, |
| 248 | .name = "i2c-ocores", | 248 | .name = "i2c-ocores", |
| 249 | .class = I2C_CLASS_HWMON | I2C_CLASS_SPD, | 249 | .class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED, |
| 250 | .algo = &ocores_algorithm, | 250 | .algo = &ocores_algorithm, |
| 251 | }; | 251 | }; |
| 252 | 252 | ||
diff --git a/drivers/i2c/busses/i2c-omap.c b/drivers/i2c/busses/i2c-omap.c index 90dcc2eaac5f..85f8eac9ba18 100644 --- a/drivers/i2c/busses/i2c-omap.c +++ b/drivers/i2c/busses/i2c-omap.c | |||
| @@ -636,7 +636,7 @@ omap_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg msgs[], int num) | |||
| 636 | int r; | 636 | int r; |
| 637 | 637 | ||
| 638 | r = pm_runtime_get_sync(dev->dev); | 638 | r = pm_runtime_get_sync(dev->dev); |
| 639 | if (IS_ERR_VALUE(r)) | 639 | if (r < 0) |
| 640 | goto out; | 640 | goto out; |
| 641 | 641 | ||
| 642 | r = omap_i2c_wait_for_bb(dev); | 642 | r = omap_i2c_wait_for_bb(dev); |
| @@ -1155,7 +1155,7 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 1155 | pm_runtime_use_autosuspend(dev->dev); | 1155 | pm_runtime_use_autosuspend(dev->dev); |
| 1156 | 1156 | ||
| 1157 | r = pm_runtime_get_sync(dev->dev); | 1157 | r = pm_runtime_get_sync(dev->dev); |
| 1158 | if (IS_ERR_VALUE(r)) | 1158 | if (r < 0) |
| 1159 | goto err_free_mem; | 1159 | goto err_free_mem; |
| 1160 | 1160 | ||
| 1161 | /* | 1161 | /* |
| @@ -1238,7 +1238,7 @@ omap_i2c_probe(struct platform_device *pdev) | |||
| 1238 | adap = &dev->adapter; | 1238 | adap = &dev->adapter; |
| 1239 | i2c_set_adapdata(adap, dev); | 1239 | i2c_set_adapdata(adap, dev); |
| 1240 | adap->owner = THIS_MODULE; | 1240 | adap->owner = THIS_MODULE; |
| 1241 | adap->class = I2C_CLASS_HWMON; | 1241 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_DEPRECATED; |
| 1242 | strlcpy(adap->name, "OMAP I2C adapter", sizeof(adap->name)); | 1242 | strlcpy(adap->name, "OMAP I2C adapter", sizeof(adap->name)); |
| 1243 | adap->algo = &omap_i2c_algo; | 1243 | adap->algo = &omap_i2c_algo; |
| 1244 | adap->dev.parent = &pdev->dev; | 1244 | adap->dev.parent = &pdev->dev; |
| @@ -1276,7 +1276,7 @@ static int omap_i2c_remove(struct platform_device *pdev) | |||
| 1276 | 1276 | ||
| 1277 | i2c_del_adapter(&dev->adapter); | 1277 | i2c_del_adapter(&dev->adapter); |
| 1278 | ret = pm_runtime_get_sync(&pdev->dev); | 1278 | ret = pm_runtime_get_sync(&pdev->dev); |
| 1279 | if (IS_ERR_VALUE(ret)) | 1279 | if (ret < 0) |
| 1280 | return ret; | 1280 | return ret; |
| 1281 | 1281 | ||
| 1282 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); | 1282 | omap_i2c_write_reg(dev, OMAP_I2C_CON_REG, 0); |
diff --git a/drivers/i2c/busses/i2c-pasemi.c b/drivers/i2c/busses/i2c-pasemi.c index 615f632c846f..7a9dce43e115 100644 --- a/drivers/i2c/busses/i2c-pasemi.c +++ b/drivers/i2c/busses/i2c-pasemi.c | |||
| @@ -401,7 +401,7 @@ static void pasemi_smb_remove(struct pci_dev *dev) | |||
| 401 | kfree(smbus); | 401 | kfree(smbus); |
| 402 | } | 402 | } |
| 403 | 403 | ||
| 404 | static DEFINE_PCI_DEVICE_TABLE(pasemi_smb_ids) = { | 404 | static const struct pci_device_id pasemi_smb_ids[] = { |
| 405 | { PCI_DEVICE(0x1959, 0xa003) }, | 405 | { PCI_DEVICE(0x1959, 0xa003) }, |
| 406 | { 0, } | 406 | { 0, } |
| 407 | }; | 407 | }; |
diff --git a/drivers/i2c/busses/i2c-piix4.c b/drivers/i2c/busses/i2c-piix4.c index 39dd8ec60dfd..a6f54ba27e2a 100644 --- a/drivers/i2c/busses/i2c-piix4.c +++ b/drivers/i2c/busses/i2c-piix4.c | |||
| @@ -540,7 +540,7 @@ static const struct i2c_algorithm smbus_algorithm = { | |||
| 540 | .functionality = piix4_func, | 540 | .functionality = piix4_func, |
| 541 | }; | 541 | }; |
| 542 | 542 | ||
| 543 | static DEFINE_PCI_DEVICE_TABLE(piix4_ids) = { | 543 | static const struct pci_device_id piix4_ids[] = { |
| 544 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3) }, | 544 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3) }, |
| 545 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_3) }, | 545 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443MX_3) }, |
| 546 | { PCI_DEVICE(PCI_VENDOR_ID_EFAR, PCI_DEVICE_ID_EFAR_SLC90E66_3) }, | 546 | { PCI_DEVICE(PCI_VENDOR_ID_EFAR, PCI_DEVICE_ID_EFAR_SLC90E66_3) }, |
diff --git a/drivers/i2c/busses/i2c-pxa-pci.c b/drivers/i2c/busses/i2c-pxa-pci.c index 9639be86e53f..417464e9ea2a 100644 --- a/drivers/i2c/busses/i2c-pxa-pci.c +++ b/drivers/i2c/busses/i2c-pxa-pci.c | |||
| @@ -148,7 +148,7 @@ static void ce4100_i2c_remove(struct pci_dev *dev) | |||
| 148 | kfree(sds); | 148 | kfree(sds); |
| 149 | } | 149 | } |
| 150 | 150 | ||
| 151 | static DEFINE_PCI_DEVICE_TABLE(ce4100_i2c_devices) = { | 151 | static const struct pci_device_id ce4100_i2c_devices[] = { |
| 152 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2e68)}, | 152 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, 0x2e68)}, |
| 153 | { }, | 153 | { }, |
| 154 | }; | 154 | }; |
diff --git a/drivers/i2c/busses/i2c-qup.c b/drivers/i2c/busses/i2c-qup.c new file mode 100644 index 000000000000..1b4cf14f1106 --- /dev/null +++ b/drivers/i2c/busses/i2c-qup.c | |||
| @@ -0,0 +1,768 @@ | |||
| 1 | /* | ||
| 2 | * Copyright (c) 2009-2013, The Linux Foundation. All rights reserved. | ||
| 3 | * Copyright (c) 2014, Sony Mobile Communications AB. | ||
| 4 | * | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License version 2 and | ||
| 8 | * only version 2 as published by the Free Software Foundation. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | * | ||
| 15 | */ | ||
| 16 | |||
| 17 | #include <linux/clk.h> | ||
| 18 | #include <linux/delay.h> | ||
| 19 | #include <linux/err.h> | ||
| 20 | #include <linux/i2c.h> | ||
| 21 | #include <linux/interrupt.h> | ||
| 22 | #include <linux/io.h> | ||
| 23 | #include <linux/module.h> | ||
| 24 | #include <linux/of.h> | ||
| 25 | #include <linux/platform_device.h> | ||
| 26 | #include <linux/pm_runtime.h> | ||
| 27 | |||
| 28 | /* QUP Registers */ | ||
| 29 | #define QUP_CONFIG 0x000 | ||
| 30 | #define QUP_STATE 0x004 | ||
| 31 | #define QUP_IO_MODE 0x008 | ||
| 32 | #define QUP_SW_RESET 0x00c | ||
| 33 | #define QUP_OPERATIONAL 0x018 | ||
| 34 | #define QUP_ERROR_FLAGS 0x01c | ||
| 35 | #define QUP_ERROR_FLAGS_EN 0x020 | ||
| 36 | #define QUP_HW_VERSION 0x030 | ||
| 37 | #define QUP_MX_OUTPUT_CNT 0x100 | ||
| 38 | #define QUP_OUT_FIFO_BASE 0x110 | ||
| 39 | #define QUP_MX_WRITE_CNT 0x150 | ||
| 40 | #define QUP_MX_INPUT_CNT 0x200 | ||
| 41 | #define QUP_MX_READ_CNT 0x208 | ||
| 42 | #define QUP_IN_FIFO_BASE 0x218 | ||
| 43 | #define QUP_I2C_CLK_CTL 0x400 | ||
| 44 | #define QUP_I2C_STATUS 0x404 | ||
| 45 | |||
| 46 | /* QUP States and reset values */ | ||
| 47 | #define QUP_RESET_STATE 0 | ||
| 48 | #define QUP_RUN_STATE 1 | ||
| 49 | #define QUP_PAUSE_STATE 3 | ||
| 50 | #define QUP_STATE_MASK 3 | ||
| 51 | |||
| 52 | #define QUP_STATE_VALID BIT(2) | ||
| 53 | #define QUP_I2C_MAST_GEN BIT(4) | ||
| 54 | |||
| 55 | #define QUP_OPERATIONAL_RESET 0x000ff0 | ||
| 56 | #define QUP_I2C_STATUS_RESET 0xfffffc | ||
| 57 | |||
| 58 | /* QUP OPERATIONAL FLAGS */ | ||
| 59 | #define QUP_I2C_NACK_FLAG BIT(3) | ||
| 60 | #define QUP_OUT_NOT_EMPTY BIT(4) | ||
| 61 | #define QUP_IN_NOT_EMPTY BIT(5) | ||
| 62 | #define QUP_OUT_FULL BIT(6) | ||
| 63 | #define QUP_OUT_SVC_FLAG BIT(8) | ||
| 64 | #define QUP_IN_SVC_FLAG BIT(9) | ||
| 65 | #define QUP_MX_OUTPUT_DONE BIT(10) | ||
| 66 | #define QUP_MX_INPUT_DONE BIT(11) | ||
| 67 | |||
| 68 | /* I2C mini core related values */ | ||
| 69 | #define QUP_CLOCK_AUTO_GATE BIT(13) | ||
| 70 | #define I2C_MINI_CORE (2 << 8) | ||
| 71 | #define I2C_N_VAL 15 | ||
| 72 | /* Most significant word offset in FIFO port */ | ||
| 73 | #define QUP_MSW_SHIFT (I2C_N_VAL + 1) | ||
| 74 | |||
| 75 | /* Packing/Unpacking words in FIFOs, and IO modes */ | ||
| 76 | #define QUP_OUTPUT_BLK_MODE (1 << 10) | ||
| 77 | #define QUP_INPUT_BLK_MODE (1 << 12) | ||
| 78 | #define QUP_UNPACK_EN BIT(14) | ||
| 79 | #define QUP_PACK_EN BIT(15) | ||
| 80 | |||
| 81 | #define QUP_REPACK_EN (QUP_UNPACK_EN | QUP_PACK_EN) | ||
| 82 | |||
| 83 | #define QUP_OUTPUT_BLOCK_SIZE(x)(((x) >> 0) & 0x03) | ||
| 84 | #define QUP_OUTPUT_FIFO_SIZE(x) (((x) >> 2) & 0x07) | ||
| 85 | #define QUP_INPUT_BLOCK_SIZE(x) (((x) >> 5) & 0x03) | ||
| 86 | #define QUP_INPUT_FIFO_SIZE(x) (((x) >> 7) & 0x07) | ||
| 87 | |||
| 88 | /* QUP tags */ | ||
| 89 | #define QUP_TAG_START (1 << 8) | ||
| 90 | #define QUP_TAG_DATA (2 << 8) | ||
| 91 | #define QUP_TAG_STOP (3 << 8) | ||
| 92 | #define QUP_TAG_REC (4 << 8) | ||
| 93 | |||
| 94 | /* Status, Error flags */ | ||
| 95 | #define I2C_STATUS_WR_BUFFER_FULL BIT(0) | ||
| 96 | #define I2C_STATUS_BUS_ACTIVE BIT(8) | ||
| 97 | #define I2C_STATUS_ERROR_MASK 0x38000fc | ||
| 98 | #define QUP_STATUS_ERROR_FLAGS 0x7c | ||
| 99 | |||
| 100 | #define QUP_READ_LIMIT 256 | ||
| 101 | |||
| 102 | struct qup_i2c_dev { | ||
| 103 | struct device *dev; | ||
| 104 | void __iomem *base; | ||
| 105 | int irq; | ||
| 106 | struct clk *clk; | ||
| 107 | struct clk *pclk; | ||
| 108 | struct i2c_adapter adap; | ||
| 109 | |||
| 110 | int clk_ctl; | ||
| 111 | int out_fifo_sz; | ||
| 112 | int in_fifo_sz; | ||
| 113 | int out_blk_sz; | ||
| 114 | int in_blk_sz; | ||
| 115 | |||
| 116 | unsigned long one_byte_t; | ||
| 117 | |||
| 118 | struct i2c_msg *msg; | ||
| 119 | /* Current posion in user message buffer */ | ||
| 120 | int pos; | ||
| 121 | /* I2C protocol errors */ | ||
| 122 | u32 bus_err; | ||
| 123 | /* QUP core errors */ | ||
| 124 | u32 qup_err; | ||
| 125 | |||
| 126 | struct completion xfer; | ||
| 127 | }; | ||
| 128 | |||
| 129 | static irqreturn_t qup_i2c_interrupt(int irq, void *dev) | ||
| 130 | { | ||
| 131 | struct qup_i2c_dev *qup = dev; | ||
| 132 | u32 bus_err; | ||
| 133 | u32 qup_err; | ||
| 134 | u32 opflags; | ||
| 135 | |||
| 136 | bus_err = readl(qup->base + QUP_I2C_STATUS); | ||
| 137 | qup_err = readl(qup->base + QUP_ERROR_FLAGS); | ||
| 138 | opflags = readl(qup->base + QUP_OPERATIONAL); | ||
| 139 | |||
| 140 | if (!qup->msg) { | ||
| 141 | /* Clear Error interrupt */ | ||
| 142 | writel(QUP_RESET_STATE, qup->base + QUP_STATE); | ||
| 143 | return IRQ_HANDLED; | ||
| 144 | } | ||
| 145 | |||
| 146 | bus_err &= I2C_STATUS_ERROR_MASK; | ||
| 147 | qup_err &= QUP_STATUS_ERROR_FLAGS; | ||
| 148 | |||
| 149 | if (qup_err) { | ||
| 150 | /* Clear Error interrupt */ | ||
| 151 | writel(qup_err, qup->base + QUP_ERROR_FLAGS); | ||
| 152 | goto done; | ||
| 153 | } | ||
| 154 | |||
| 155 | if (bus_err) { | ||
| 156 | /* Clear Error interrupt */ | ||
| 157 | writel(QUP_RESET_STATE, qup->base + QUP_STATE); | ||
| 158 | goto done; | ||
| 159 | } | ||
| 160 | |||
| 161 | if (opflags & QUP_IN_SVC_FLAG) | ||
| 162 | writel(QUP_IN_SVC_FLAG, qup->base + QUP_OPERATIONAL); | ||
| 163 | |||
| 164 | if (opflags & QUP_OUT_SVC_FLAG) | ||
| 165 | writel(QUP_OUT_SVC_FLAG, qup->base + QUP_OPERATIONAL); | ||
| 166 | |||
| 167 | done: | ||
| 168 | qup->qup_err = qup_err; | ||
| 169 | qup->bus_err = bus_err; | ||
| 170 | complete(&qup->xfer); | ||
| 171 | return IRQ_HANDLED; | ||
| 172 | } | ||
| 173 | |||
| 174 | static int qup_i2c_poll_state_mask(struct qup_i2c_dev *qup, | ||
| 175 | u32 req_state, u32 req_mask) | ||
| 176 | { | ||
| 177 | int retries = 1; | ||
| 178 | u32 state; | ||
| 179 | |||
| 180 | /* | ||
| 181 | * State transition takes 3 AHB clocks cycles + 3 I2C master clock | ||
| 182 | * cycles. So retry once after a 1uS delay. | ||
| 183 | */ | ||
| 184 | do { | ||
| 185 | state = readl(qup->base + QUP_STATE); | ||
| 186 | |||
| 187 | if (state & QUP_STATE_VALID && | ||
| 188 | (state & req_mask) == req_state) | ||
| 189 | return 0; | ||
| 190 | |||
| 191 | udelay(1); | ||
| 192 | } while (retries--); | ||
| 193 | |||
| 194 | return -ETIMEDOUT; | ||
| 195 | } | ||
| 196 | |||
| 197 | static int qup_i2c_poll_state(struct qup_i2c_dev *qup, u32 req_state) | ||
| 198 | { | ||
| 199 | return qup_i2c_poll_state_mask(qup, req_state, QUP_STATE_MASK); | ||
| 200 | } | ||
| 201 | |||
| 202 | static int qup_i2c_poll_state_valid(struct qup_i2c_dev *qup) | ||
| 203 | { | ||
| 204 | return qup_i2c_poll_state_mask(qup, 0, 0); | ||
| 205 | } | ||
| 206 | |||
| 207 | static int qup_i2c_poll_state_i2c_master(struct qup_i2c_dev *qup) | ||
| 208 | { | ||
| 209 | return qup_i2c_poll_state_mask(qup, QUP_I2C_MAST_GEN, QUP_I2C_MAST_GEN); | ||
| 210 | } | ||
| 211 | |||
| 212 | static int qup_i2c_change_state(struct qup_i2c_dev *qup, u32 state) | ||
| 213 | { | ||
| 214 | if (qup_i2c_poll_state_valid(qup) != 0) | ||
| 215 | return -EIO; | ||
| 216 | |||
| 217 | writel(state, qup->base + QUP_STATE); | ||
| 218 | |||
| 219 | if (qup_i2c_poll_state(qup, state) != 0) | ||
| 220 | return -EIO; | ||
| 221 | return 0; | ||
| 222 | } | ||
| 223 | |||
| 224 | static int qup_i2c_wait_writeready(struct qup_i2c_dev *qup) | ||
| 225 | { | ||
| 226 | unsigned long timeout; | ||
| 227 | u32 opflags; | ||
| 228 | u32 status; | ||
| 229 | |||
| 230 | timeout = jiffies + HZ; | ||
| 231 | |||
| 232 | for (;;) { | ||
| 233 | opflags = readl(qup->base + QUP_OPERATIONAL); | ||
| 234 | status = readl(qup->base + QUP_I2C_STATUS); | ||
| 235 | |||
| 236 | if (!(opflags & QUP_OUT_NOT_EMPTY) && | ||
| 237 | !(status & I2C_STATUS_BUS_ACTIVE)) | ||
| 238 | return 0; | ||
| 239 | |||
| 240 | if (time_after(jiffies, timeout)) | ||
| 241 | return -ETIMEDOUT; | ||
| 242 | |||
| 243 | usleep_range(qup->one_byte_t, qup->one_byte_t * 2); | ||
| 244 | } | ||
| 245 | } | ||
| 246 | |||
| 247 | static void qup_i2c_set_write_mode(struct qup_i2c_dev *qup, struct i2c_msg *msg) | ||
| 248 | { | ||
| 249 | /* Number of entries to shift out, including the start */ | ||
| 250 | int total = msg->len + 1; | ||
| 251 | |||
| 252 | if (total < qup->out_fifo_sz) { | ||
| 253 | /* FIFO mode */ | ||
| 254 | writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE); | ||
| 255 | writel(total, qup->base + QUP_MX_WRITE_CNT); | ||
| 256 | } else { | ||
| 257 | /* BLOCK mode (transfer data on chunks) */ | ||
| 258 | writel(QUP_OUTPUT_BLK_MODE | QUP_REPACK_EN, | ||
| 259 | qup->base + QUP_IO_MODE); | ||
| 260 | writel(total, qup->base + QUP_MX_OUTPUT_CNT); | ||
| 261 | } | ||
| 262 | } | ||
| 263 | |||
| 264 | static void qup_i2c_issue_write(struct qup_i2c_dev *qup, struct i2c_msg *msg) | ||
| 265 | { | ||
| 266 | u32 addr = msg->addr << 1; | ||
| 267 | u32 qup_tag; | ||
| 268 | u32 opflags; | ||
| 269 | int idx; | ||
| 270 | u32 val; | ||
| 271 | |||
| 272 | if (qup->pos == 0) { | ||
| 273 | val = QUP_TAG_START | addr; | ||
| 274 | idx = 1; | ||
| 275 | } else { | ||
| 276 | val = 0; | ||
| 277 | idx = 0; | ||
| 278 | } | ||
| 279 | |||
| 280 | while (qup->pos < msg->len) { | ||
| 281 | /* Check that there's space in the FIFO for our pair */ | ||
| 282 | opflags = readl(qup->base + QUP_OPERATIONAL); | ||
| 283 | if (opflags & QUP_OUT_FULL) | ||
| 284 | break; | ||
| 285 | |||
| 286 | if (qup->pos == msg->len - 1) | ||
| 287 | qup_tag = QUP_TAG_STOP; | ||
| 288 | else | ||
| 289 | qup_tag = QUP_TAG_DATA; | ||
| 290 | |||
| 291 | if (idx & 1) | ||
| 292 | val |= (qup_tag | msg->buf[qup->pos]) << QUP_MSW_SHIFT; | ||
| 293 | else | ||
| 294 | val = qup_tag | msg->buf[qup->pos]; | ||
| 295 | |||
| 296 | /* Write out the pair and the last odd value */ | ||
| 297 | if (idx & 1 || qup->pos == msg->len - 1) | ||
| 298 | writel(val, qup->base + QUP_OUT_FIFO_BASE); | ||
| 299 | |||
| 300 | qup->pos++; | ||
| 301 | idx++; | ||
| 302 | } | ||
| 303 | } | ||
| 304 | |||
| 305 | static int qup_i2c_write_one(struct qup_i2c_dev *qup, struct i2c_msg *msg) | ||
| 306 | { | ||
| 307 | unsigned long left; | ||
| 308 | int ret; | ||
| 309 | |||
| 310 | qup->msg = msg; | ||
| 311 | qup->pos = 0; | ||
| 312 | |||
| 313 | enable_irq(qup->irq); | ||
| 314 | |||
| 315 | qup_i2c_set_write_mode(qup, msg); | ||
| 316 | |||
| 317 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | ||
| 318 | if (ret) | ||
| 319 | goto err; | ||
| 320 | |||
| 321 | writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL); | ||
| 322 | |||
| 323 | do { | ||
| 324 | ret = qup_i2c_change_state(qup, QUP_PAUSE_STATE); | ||
| 325 | if (ret) | ||
| 326 | goto err; | ||
| 327 | |||
| 328 | qup_i2c_issue_write(qup, msg); | ||
| 329 | |||
| 330 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | ||
| 331 | if (ret) | ||
| 332 | goto err; | ||
| 333 | |||
| 334 | left = wait_for_completion_timeout(&qup->xfer, HZ); | ||
| 335 | if (!left) { | ||
| 336 | writel(1, qup->base + QUP_SW_RESET); | ||
| 337 | ret = -ETIMEDOUT; | ||
| 338 | goto err; | ||
| 339 | } | ||
| 340 | |||
| 341 | if (qup->bus_err || qup->qup_err) { | ||
| 342 | if (qup->bus_err & QUP_I2C_NACK_FLAG) | ||
| 343 | dev_err(qup->dev, "NACK from %x\n", msg->addr); | ||
| 344 | ret = -EIO; | ||
| 345 | goto err; | ||
| 346 | } | ||
| 347 | } while (qup->pos < msg->len); | ||
| 348 | |||
| 349 | /* Wait for the outstanding data in the fifo to drain */ | ||
| 350 | ret = qup_i2c_wait_writeready(qup); | ||
| 351 | |||
| 352 | err: | ||
| 353 | disable_irq(qup->irq); | ||
| 354 | qup->msg = NULL; | ||
| 355 | |||
| 356 | return ret; | ||
| 357 | } | ||
| 358 | |||
| 359 | static void qup_i2c_set_read_mode(struct qup_i2c_dev *qup, int len) | ||
| 360 | { | ||
| 361 | if (len < qup->in_fifo_sz) { | ||
| 362 | /* FIFO mode */ | ||
| 363 | writel(QUP_REPACK_EN, qup->base + QUP_IO_MODE); | ||
| 364 | writel(len, qup->base + QUP_MX_READ_CNT); | ||
| 365 | } else { | ||
| 366 | /* BLOCK mode (transfer data on chunks) */ | ||
| 367 | writel(QUP_INPUT_BLK_MODE | QUP_REPACK_EN, | ||
| 368 | qup->base + QUP_IO_MODE); | ||
| 369 | writel(len, qup->base + QUP_MX_INPUT_CNT); | ||
| 370 | } | ||
| 371 | } | ||
| 372 | |||
| 373 | static void qup_i2c_issue_read(struct qup_i2c_dev *qup, struct i2c_msg *msg) | ||
| 374 | { | ||
| 375 | u32 addr, len, val; | ||
| 376 | |||
| 377 | addr = (msg->addr << 1) | 1; | ||
| 378 | |||
| 379 | /* 0 is used to specify a length 256 (QUP_READ_LIMIT) */ | ||
| 380 | len = (msg->len == QUP_READ_LIMIT) ? 0 : msg->len; | ||
| 381 | |||
| 382 | val = ((QUP_TAG_REC | len) << QUP_MSW_SHIFT) | QUP_TAG_START | addr; | ||
| 383 | writel(val, qup->base + QUP_OUT_FIFO_BASE); | ||
| 384 | } | ||
| 385 | |||
| 386 | |||
| 387 | static void qup_i2c_read_fifo(struct qup_i2c_dev *qup, struct i2c_msg *msg) | ||
| 388 | { | ||
| 389 | u32 opflags; | ||
| 390 | u32 val = 0; | ||
| 391 | int idx; | ||
| 392 | |||
| 393 | for (idx = 0; qup->pos < msg->len; idx++) { | ||
| 394 | if ((idx & 1) == 0) { | ||
| 395 | /* Check that FIFO have data */ | ||
| 396 | opflags = readl(qup->base + QUP_OPERATIONAL); | ||
| 397 | if (!(opflags & QUP_IN_NOT_EMPTY)) | ||
| 398 | break; | ||
| 399 | |||
| 400 | /* Reading 2 words at time */ | ||
| 401 | val = readl(qup->base + QUP_IN_FIFO_BASE); | ||
| 402 | |||
| 403 | msg->buf[qup->pos++] = val & 0xFF; | ||
| 404 | } else { | ||
| 405 | msg->buf[qup->pos++] = val >> QUP_MSW_SHIFT; | ||
| 406 | } | ||
| 407 | } | ||
| 408 | } | ||
| 409 | |||
| 410 | static int qup_i2c_read_one(struct qup_i2c_dev *qup, struct i2c_msg *msg) | ||
| 411 | { | ||
| 412 | unsigned long left; | ||
| 413 | int ret; | ||
| 414 | |||
| 415 | /* | ||
| 416 | * The QUP block will issue a NACK and STOP on the bus when reaching | ||
| 417 | * the end of the read, the length of the read is specified as one byte | ||
| 418 | * which limits the possible read to 256 (QUP_READ_LIMIT) bytes. | ||
| 419 | */ | ||
| 420 | if (msg->len > QUP_READ_LIMIT) { | ||
| 421 | dev_err(qup->dev, "HW not capable of reads over %d bytes\n", | ||
| 422 | QUP_READ_LIMIT); | ||
| 423 | return -EINVAL; | ||
| 424 | } | ||
| 425 | |||
| 426 | qup->msg = msg; | ||
| 427 | qup->pos = 0; | ||
| 428 | |||
| 429 | enable_irq(qup->irq); | ||
| 430 | |||
| 431 | qup_i2c_set_read_mode(qup, msg->len); | ||
| 432 | |||
| 433 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | ||
| 434 | if (ret) | ||
| 435 | goto err; | ||
| 436 | |||
| 437 | writel(qup->clk_ctl, qup->base + QUP_I2C_CLK_CTL); | ||
| 438 | |||
| 439 | ret = qup_i2c_change_state(qup, QUP_PAUSE_STATE); | ||
| 440 | if (ret) | ||
| 441 | goto err; | ||
| 442 | |||
| 443 | qup_i2c_issue_read(qup, msg); | ||
| 444 | |||
| 445 | ret = qup_i2c_change_state(qup, QUP_RUN_STATE); | ||
| 446 | if (ret) | ||
| 447 | goto err; | ||
| 448 | |||
| 449 | do { | ||
| 450 | left = wait_for_completion_timeout(&qup->xfer, HZ); | ||
| 451 | if (!left) { | ||
| 452 | writel(1, qup->base + QUP_SW_RESET); | ||
| 453 | ret = -ETIMEDOUT; | ||
| 454 | goto err; | ||
| 455 | } | ||
| 456 | |||
| 457 | if (qup->bus_err || qup->qup_err) { | ||
| 458 | if (qup->bus_err & QUP_I2C_NACK_FLAG) | ||
| 459 | dev_err(qup->dev, "NACK from %x\n", msg->addr); | ||
| 460 | ret = -EIO; | ||
| 461 | goto err; | ||
| 462 | } | ||
| 463 | |||
| 464 | qup_i2c_read_fifo(qup, msg); | ||
| 465 | } while (qup->pos < msg->len); | ||
| 466 | |||
| 467 | err: | ||
| 468 | disable_irq(qup->irq); | ||
| 469 | qup->msg = NULL; | ||
| 470 | |||
| 471 | return ret; | ||
| 472 | } | ||
| 473 | |||
| 474 | static int qup_i2c_xfer(struct i2c_adapter *adap, | ||
| 475 | struct i2c_msg msgs[], | ||
| 476 | int num) | ||
| 477 | { | ||
| 478 | struct qup_i2c_dev *qup = i2c_get_adapdata(adap); | ||
| 479 | int ret, idx; | ||
| 480 | |||
| 481 | ret = pm_runtime_get_sync(qup->dev); | ||
| 482 | if (ret) | ||
| 483 | goto out; | ||
| 484 | |||
| 485 | writel(1, qup->base + QUP_SW_RESET); | ||
| 486 | ret = qup_i2c_poll_state(qup, QUP_RESET_STATE); | ||
| 487 | if (ret) | ||
| 488 | goto out; | ||
| 489 | |||
| 490 | /* Configure QUP as I2C mini core */ | ||
| 491 | writel(I2C_MINI_CORE | I2C_N_VAL, qup->base + QUP_CONFIG); | ||
| 492 | |||
| 493 | for (idx = 0; idx < num; idx++) { | ||
| 494 | if (msgs[idx].len == 0) { | ||
| 495 | ret = -EINVAL; | ||
| 496 | goto out; | ||
| 497 | } | ||
| 498 | |||
| 499 | if (qup_i2c_poll_state_i2c_master(qup)) { | ||
| 500 | ret = -EIO; | ||
| 501 | goto out; | ||
| 502 | } | ||
| 503 | |||
| 504 | if (msgs[idx].flags & I2C_M_RD) | ||
| 505 | ret = qup_i2c_read_one(qup, &msgs[idx]); | ||
| 506 | else | ||
| 507 | ret = qup_i2c_write_one(qup, &msgs[idx]); | ||
| 508 | |||
| 509 | if (ret) | ||
| 510 | break; | ||
| 511 | |||
| 512 | ret = qup_i2c_change_state(qup, QUP_RESET_STATE); | ||
| 513 | if (ret) | ||
| 514 | break; | ||
| 515 | } | ||
| 516 | |||
| 517 | if (ret == 0) | ||
| 518 | ret = num; | ||
| 519 | out: | ||
| 520 | |||
| 521 | pm_runtime_mark_last_busy(qup->dev); | ||
| 522 | pm_runtime_put_autosuspend(qup->dev); | ||
| 523 | |||
| 524 | return ret; | ||
| 525 | } | ||
| 526 | |||
| 527 | static u32 qup_i2c_func(struct i2c_adapter *adap) | ||
| 528 | { | ||
| 529 | return I2C_FUNC_I2C | (I2C_FUNC_SMBUS_EMUL & ~I2C_FUNC_SMBUS_QUICK); | ||
| 530 | } | ||
| 531 | |||
| 532 | static const struct i2c_algorithm qup_i2c_algo = { | ||
| 533 | .master_xfer = qup_i2c_xfer, | ||
| 534 | .functionality = qup_i2c_func, | ||
| 535 | }; | ||
| 536 | |||
| 537 | static void qup_i2c_enable_clocks(struct qup_i2c_dev *qup) | ||
| 538 | { | ||
| 539 | clk_prepare_enable(qup->clk); | ||
| 540 | clk_prepare_enable(qup->pclk); | ||
| 541 | } | ||
| 542 | |||
| 543 | static void qup_i2c_disable_clocks(struct qup_i2c_dev *qup) | ||
| 544 | { | ||
| 545 | u32 config; | ||
| 546 | |||
| 547 | qup_i2c_change_state(qup, QUP_RESET_STATE); | ||
| 548 | clk_disable_unprepare(qup->clk); | ||
| 549 | config = readl(qup->base + QUP_CONFIG); | ||
| 550 | config |= QUP_CLOCK_AUTO_GATE; | ||
| 551 | writel(config, qup->base + QUP_CONFIG); | ||
| 552 | clk_disable_unprepare(qup->pclk); | ||
| 553 | } | ||
| 554 | |||
| 555 | static int qup_i2c_probe(struct platform_device *pdev) | ||
| 556 | { | ||
| 557 | static const int blk_sizes[] = {4, 16, 32}; | ||
| 558 | struct device_node *node = pdev->dev.of_node; | ||
| 559 | struct qup_i2c_dev *qup; | ||
| 560 | unsigned long one_bit_t; | ||
| 561 | struct resource *res; | ||
| 562 | u32 io_mode, hw_ver, size; | ||
| 563 | int ret, fs_div, hs_div; | ||
| 564 | int src_clk_freq; | ||
| 565 | u32 clk_freq = 100000; | ||
| 566 | |||
| 567 | qup = devm_kzalloc(&pdev->dev, sizeof(*qup), GFP_KERNEL); | ||
| 568 | if (!qup) | ||
| 569 | return -ENOMEM; | ||
| 570 | |||
| 571 | qup->dev = &pdev->dev; | ||
| 572 | init_completion(&qup->xfer); | ||
| 573 | platform_set_drvdata(pdev, qup); | ||
| 574 | |||
| 575 | of_property_read_u32(node, "clock-frequency", &clk_freq); | ||
| 576 | |||
| 577 | /* We support frequencies up to FAST Mode (400KHz) */ | ||
| 578 | if (!clk_freq || clk_freq > 400000) { | ||
| 579 | dev_err(qup->dev, "clock frequency not supported %d\n", | ||
| 580 | clk_freq); | ||
| 581 | return -EINVAL; | ||
| 582 | } | ||
| 583 | |||
| 584 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | ||
| 585 | qup->base = devm_ioremap_resource(qup->dev, res); | ||
| 586 | if (IS_ERR(qup->base)) | ||
| 587 | return PTR_ERR(qup->base); | ||
| 588 | |||
| 589 | qup->irq = platform_get_irq(pdev, 0); | ||
| 590 | if (qup->irq < 0) { | ||
| 591 | dev_err(qup->dev, "No IRQ defined\n"); | ||
| 592 | return qup->irq; | ||
| 593 | } | ||
| 594 | |||
| 595 | qup->clk = devm_clk_get(qup->dev, "core"); | ||
| 596 | if (IS_ERR(qup->clk)) { | ||
| 597 | dev_err(qup->dev, "Could not get core clock\n"); | ||
| 598 | return PTR_ERR(qup->clk); | ||
| 599 | } | ||
| 600 | |||
| 601 | qup->pclk = devm_clk_get(qup->dev, "iface"); | ||
| 602 | if (IS_ERR(qup->pclk)) { | ||
| 603 | dev_err(qup->dev, "Could not get iface clock\n"); | ||
| 604 | return PTR_ERR(qup->pclk); | ||
| 605 | } | ||
| 606 | |||
| 607 | qup_i2c_enable_clocks(qup); | ||
| 608 | |||
| 609 | /* | ||
| 610 | * Bootloaders might leave a pending interrupt on certain QUP's, | ||
| 611 | * so we reset the core before registering for interrupts. | ||
| 612 | */ | ||
| 613 | writel(1, qup->base + QUP_SW_RESET); | ||
| 614 | ret = qup_i2c_poll_state_valid(qup); | ||
| 615 | if (ret) | ||
| 616 | goto fail; | ||
| 617 | |||
| 618 | ret = devm_request_irq(qup->dev, qup->irq, qup_i2c_interrupt, | ||
| 619 | IRQF_TRIGGER_HIGH, "i2c_qup", qup); | ||
| 620 | if (ret) { | ||
| 621 | dev_err(qup->dev, "Request %d IRQ failed\n", qup->irq); | ||
| 622 | goto fail; | ||
| 623 | } | ||
| 624 | disable_irq(qup->irq); | ||
| 625 | |||
| 626 | hw_ver = readl(qup->base + QUP_HW_VERSION); | ||
| 627 | dev_dbg(qup->dev, "Revision %x\n", hw_ver); | ||
| 628 | |||
| 629 | io_mode = readl(qup->base + QUP_IO_MODE); | ||
| 630 | |||
| 631 | /* | ||
| 632 | * The block/fifo size w.r.t. 'actual data' is 1/2 due to 'tag' | ||
| 633 | * associated with each byte written/received | ||
| 634 | */ | ||
| 635 | size = QUP_OUTPUT_BLOCK_SIZE(io_mode); | ||
| 636 | if (size >= ARRAY_SIZE(blk_sizes)) | ||
| 637 | return -EIO; | ||
| 638 | qup->out_blk_sz = blk_sizes[size] / 2; | ||
| 639 | |||
| 640 | size = QUP_INPUT_BLOCK_SIZE(io_mode); | ||
| 641 | if (size >= ARRAY_SIZE(blk_sizes)) | ||
| 642 | return -EIO; | ||
| 643 | qup->in_blk_sz = blk_sizes[size] / 2; | ||
| 644 | |||
| 645 | size = QUP_OUTPUT_FIFO_SIZE(io_mode); | ||
| 646 | qup->out_fifo_sz = qup->out_blk_sz * (2 << size); | ||
| 647 | |||
| 648 | size = QUP_INPUT_FIFO_SIZE(io_mode); | ||
| 649 | qup->in_fifo_sz = qup->in_blk_sz * (2 << size); | ||
| 650 | |||
| 651 | src_clk_freq = clk_get_rate(qup->clk); | ||
| 652 | fs_div = ((src_clk_freq / clk_freq) / 2) - 3; | ||
| 653 | hs_div = 3; | ||
| 654 | qup->clk_ctl = (hs_div << 8) | (fs_div & 0xff); | ||
| 655 | |||
| 656 | /* | ||
| 657 | * Time it takes for a byte to be clocked out on the bus. | ||
| 658 | * Each byte takes 9 clock cycles (8 bits + 1 ack). | ||
| 659 | */ | ||
| 660 | one_bit_t = (USEC_PER_SEC / clk_freq) + 1; | ||
| 661 | qup->one_byte_t = one_bit_t * 9; | ||
| 662 | |||
| 663 | dev_dbg(qup->dev, "IN:block:%d, fifo:%d, OUT:block:%d, fifo:%d\n", | ||
| 664 | qup->in_blk_sz, qup->in_fifo_sz, | ||
| 665 | qup->out_blk_sz, qup->out_fifo_sz); | ||
| 666 | |||
| 667 | i2c_set_adapdata(&qup->adap, qup); | ||
| 668 | qup->adap.algo = &qup_i2c_algo; | ||
| 669 | qup->adap.dev.parent = qup->dev; | ||
| 670 | qup->adap.dev.of_node = pdev->dev.of_node; | ||
| 671 | strlcpy(qup->adap.name, "QUP I2C adapter", sizeof(qup->adap.name)); | ||
| 672 | |||
| 673 | ret = i2c_add_adapter(&qup->adap); | ||
| 674 | if (ret) | ||
| 675 | goto fail; | ||
| 676 | |||
| 677 | pm_runtime_set_autosuspend_delay(qup->dev, MSEC_PER_SEC); | ||
| 678 | pm_runtime_use_autosuspend(qup->dev); | ||
| 679 | pm_runtime_set_active(qup->dev); | ||
| 680 | pm_runtime_enable(qup->dev); | ||
| 681 | return 0; | ||
| 682 | |||
| 683 | fail: | ||
| 684 | qup_i2c_disable_clocks(qup); | ||
| 685 | return ret; | ||
| 686 | } | ||
| 687 | |||
| 688 | static int qup_i2c_remove(struct platform_device *pdev) | ||
| 689 | { | ||
| 690 | struct qup_i2c_dev *qup = platform_get_drvdata(pdev); | ||
| 691 | |||
| 692 | disable_irq(qup->irq); | ||
| 693 | qup_i2c_disable_clocks(qup); | ||
| 694 | i2c_del_adapter(&qup->adap); | ||
| 695 | pm_runtime_disable(qup->dev); | ||
| 696 | pm_runtime_set_suspended(qup->dev); | ||
| 697 | return 0; | ||
| 698 | } | ||
| 699 | |||
| 700 | #ifdef CONFIG_PM | ||
| 701 | static int qup_i2c_pm_suspend_runtime(struct device *device) | ||
| 702 | { | ||
| 703 | struct qup_i2c_dev *qup = dev_get_drvdata(device); | ||
| 704 | |||
| 705 | dev_dbg(device, "pm_runtime: suspending...\n"); | ||
| 706 | qup_i2c_disable_clocks(qup); | ||
| 707 | return 0; | ||
| 708 | } | ||
| 709 | |||
| 710 | static int qup_i2c_pm_resume_runtime(struct device *device) | ||
| 711 | { | ||
| 712 | struct qup_i2c_dev *qup = dev_get_drvdata(device); | ||
| 713 | |||
| 714 | dev_dbg(device, "pm_runtime: resuming...\n"); | ||
| 715 | qup_i2c_enable_clocks(qup); | ||
| 716 | return 0; | ||
| 717 | } | ||
| 718 | #endif | ||
| 719 | |||
| 720 | #ifdef CONFIG_PM_SLEEP | ||
| 721 | static int qup_i2c_suspend(struct device *device) | ||
| 722 | { | ||
| 723 | qup_i2c_pm_suspend_runtime(device); | ||
| 724 | return 0; | ||
| 725 | } | ||
| 726 | |||
| 727 | static int qup_i2c_resume(struct device *device) | ||
| 728 | { | ||
| 729 | qup_i2c_pm_resume_runtime(device); | ||
| 730 | pm_runtime_mark_last_busy(device); | ||
| 731 | pm_request_autosuspend(device); | ||
| 732 | return 0; | ||
| 733 | } | ||
| 734 | #endif | ||
| 735 | |||
| 736 | static const struct dev_pm_ops qup_i2c_qup_pm_ops = { | ||
| 737 | SET_SYSTEM_SLEEP_PM_OPS( | ||
| 738 | qup_i2c_suspend, | ||
| 739 | qup_i2c_resume) | ||
| 740 | SET_RUNTIME_PM_OPS( | ||
| 741 | qup_i2c_pm_suspend_runtime, | ||
| 742 | qup_i2c_pm_resume_runtime, | ||
| 743 | NULL) | ||
| 744 | }; | ||
| 745 | |||
| 746 | static const struct of_device_id qup_i2c_dt_match[] = { | ||
| 747 | { .compatible = "qcom,i2c-qup-v1.1.1" }, | ||
| 748 | { .compatible = "qcom,i2c-qup-v2.1.1" }, | ||
| 749 | { .compatible = "qcom,i2c-qup-v2.2.1" }, | ||
| 750 | {} | ||
| 751 | }; | ||
| 752 | MODULE_DEVICE_TABLE(of, qup_i2c_dt_match); | ||
| 753 | |||
| 754 | static struct platform_driver qup_i2c_driver = { | ||
| 755 | .probe = qup_i2c_probe, | ||
| 756 | .remove = qup_i2c_remove, | ||
| 757 | .driver = { | ||
| 758 | .name = "i2c_qup", | ||
| 759 | .owner = THIS_MODULE, | ||
| 760 | .pm = &qup_i2c_qup_pm_ops, | ||
| 761 | .of_match_table = qup_i2c_dt_match, | ||
| 762 | }, | ||
| 763 | }; | ||
| 764 | |||
| 765 | module_platform_driver(qup_i2c_driver); | ||
| 766 | |||
| 767 | MODULE_LICENSE("GPL v2"); | ||
| 768 | MODULE_ALIAS("platform:i2c_qup"); | ||
diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c index 0282d4d42805..d4fa8eba6e9d 100644 --- a/drivers/i2c/busses/i2c-rcar.c +++ b/drivers/i2c/busses/i2c-rcar.c | |||
| @@ -638,6 +638,7 @@ static const struct of_device_id rcar_i2c_dt_ids[] = { | |||
| 638 | { .compatible = "renesas,i2c-r8a7778", .data = (void *)I2C_RCAR_GEN1 }, | 638 | { .compatible = "renesas,i2c-r8a7778", .data = (void *)I2C_RCAR_GEN1 }, |
| 639 | { .compatible = "renesas,i2c-r8a7779", .data = (void *)I2C_RCAR_GEN1 }, | 639 | { .compatible = "renesas,i2c-r8a7779", .data = (void *)I2C_RCAR_GEN1 }, |
| 640 | { .compatible = "renesas,i2c-r8a7790", .data = (void *)I2C_RCAR_GEN2 }, | 640 | { .compatible = "renesas,i2c-r8a7790", .data = (void *)I2C_RCAR_GEN2 }, |
| 641 | { .compatible = "renesas,i2c-r8a7791", .data = (void *)I2C_RCAR_GEN2 }, | ||
| 641 | {}, | 642 | {}, |
| 642 | }; | 643 | }; |
| 643 | MODULE_DEVICE_TABLE(of, rcar_i2c_dt_ids); | 644 | MODULE_DEVICE_TABLE(of, rcar_i2c_dt_ids); |
| @@ -691,7 +692,7 @@ static int rcar_i2c_probe(struct platform_device *pdev) | |||
| 691 | adap = &priv->adap; | 692 | adap = &priv->adap; |
| 692 | adap->nr = pdev->id; | 693 | adap->nr = pdev->id; |
| 693 | adap->algo = &rcar_i2c_algo; | 694 | adap->algo = &rcar_i2c_algo; |
| 694 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD; | 695 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED; |
| 695 | adap->retries = 3; | 696 | adap->retries = 3; |
| 696 | adap->dev.parent = dev; | 697 | adap->dev.parent = dev; |
| 697 | adap->dev.of_node = dev->of_node; | 698 | adap->dev.of_node = dev->of_node; |
diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index 684d21e71e4a..ae4491062e41 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c | |||
| @@ -601,6 +601,31 @@ static irqreturn_t s3c24xx_i2c_irq(int irqno, void *dev_id) | |||
| 601 | return IRQ_HANDLED; | 601 | return IRQ_HANDLED; |
| 602 | } | 602 | } |
| 603 | 603 | ||
| 604 | /* | ||
| 605 | * Disable the bus so that we won't get any interrupts from now on, or try | ||
| 606 | * to drive any lines. This is the default state when we don't have | ||
| 607 | * anything to send/receive. | ||
| 608 | * | ||
| 609 | * If there is an event on the bus, or we have a pre-existing event at | ||
| 610 | * kernel boot time, we may not notice the event and the I2C controller | ||
| 611 | * will lock the bus with the I2C clock line low indefinitely. | ||
| 612 | */ | ||
| 613 | static inline void s3c24xx_i2c_disable_bus(struct s3c24xx_i2c *i2c) | ||
| 614 | { | ||
| 615 | unsigned long tmp; | ||
| 616 | |||
| 617 | /* Stop driving the I2C pins */ | ||
| 618 | tmp = readl(i2c->regs + S3C2410_IICSTAT); | ||
| 619 | tmp &= ~S3C2410_IICSTAT_TXRXEN; | ||
| 620 | writel(tmp, i2c->regs + S3C2410_IICSTAT); | ||
| 621 | |||
| 622 | /* We don't expect any interrupts now, and don't want send acks */ | ||
| 623 | tmp = readl(i2c->regs + S3C2410_IICCON); | ||
| 624 | tmp &= ~(S3C2410_IICCON_IRQEN | S3C2410_IICCON_IRQPEND | | ||
| 625 | S3C2410_IICCON_ACKEN); | ||
| 626 | writel(tmp, i2c->regs + S3C2410_IICCON); | ||
| 627 | } | ||
| 628 | |||
| 604 | 629 | ||
| 605 | /* s3c24xx_i2c_set_master | 630 | /* s3c24xx_i2c_set_master |
| 606 | * | 631 | * |
| @@ -735,7 +760,11 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, | |||
| 735 | 760 | ||
| 736 | s3c24xx_i2c_wait_idle(i2c); | 761 | s3c24xx_i2c_wait_idle(i2c); |
| 737 | 762 | ||
| 763 | s3c24xx_i2c_disable_bus(i2c); | ||
| 764 | |||
| 738 | out: | 765 | out: |
| 766 | i2c->state = STATE_IDLE; | ||
| 767 | |||
| 739 | return ret; | 768 | return ret; |
| 740 | } | 769 | } |
| 741 | 770 | ||
| @@ -1004,7 +1033,6 @@ static void s3c24xx_i2c_dt_gpio_free(struct s3c24xx_i2c *i2c) | |||
| 1004 | 1033 | ||
| 1005 | static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c) | 1034 | static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c) |
| 1006 | { | 1035 | { |
| 1007 | unsigned long iicon = S3C2410_IICCON_IRQEN | S3C2410_IICCON_ACKEN; | ||
| 1008 | struct s3c2410_platform_i2c *pdata; | 1036 | struct s3c2410_platform_i2c *pdata; |
| 1009 | unsigned int freq; | 1037 | unsigned int freq; |
| 1010 | 1038 | ||
| @@ -1018,12 +1046,12 @@ static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c) | |||
| 1018 | 1046 | ||
| 1019 | dev_info(i2c->dev, "slave address 0x%02x\n", pdata->slave_addr); | 1047 | dev_info(i2c->dev, "slave address 0x%02x\n", pdata->slave_addr); |
| 1020 | 1048 | ||
| 1021 | writel(iicon, i2c->regs + S3C2410_IICCON); | 1049 | writel(0, i2c->regs + S3C2410_IICCON); |
| 1050 | writel(0, i2c->regs + S3C2410_IICSTAT); | ||
| 1022 | 1051 | ||
| 1023 | /* we need to work out the divisors for the clock... */ | 1052 | /* we need to work out the divisors for the clock... */ |
| 1024 | 1053 | ||
| 1025 | if (s3c24xx_i2c_clockrate(i2c, &freq) != 0) { | 1054 | if (s3c24xx_i2c_clockrate(i2c, &freq) != 0) { |
| 1026 | writel(0, i2c->regs + S3C2410_IICCON); | ||
| 1027 | dev_err(i2c->dev, "cannot meet bus frequency required\n"); | 1055 | dev_err(i2c->dev, "cannot meet bus frequency required\n"); |
| 1028 | return -EINVAL; | 1056 | return -EINVAL; |
| 1029 | } | 1057 | } |
| @@ -1031,7 +1059,8 @@ static int s3c24xx_i2c_init(struct s3c24xx_i2c *i2c) | |||
| 1031 | /* todo - check that the i2c lines aren't being dragged anywhere */ | 1059 | /* todo - check that the i2c lines aren't being dragged anywhere */ |
| 1032 | 1060 | ||
| 1033 | dev_info(i2c->dev, "bus frequency set to %d KHz\n", freq); | 1061 | dev_info(i2c->dev, "bus frequency set to %d KHz\n", freq); |
| 1034 | dev_dbg(i2c->dev, "S3C2410_IICCON=0x%02lx\n", iicon); | 1062 | dev_dbg(i2c->dev, "S3C2410_IICCON=0x%02x\n", |
| 1063 | readl(i2c->regs + S3C2410_IICCON)); | ||
| 1035 | 1064 | ||
| 1036 | return 0; | 1065 | return 0; |
| 1037 | } | 1066 | } |
| @@ -1106,7 +1135,7 @@ static int s3c24xx_i2c_probe(struct platform_device *pdev) | |||
| 1106 | i2c->adap.owner = THIS_MODULE; | 1135 | i2c->adap.owner = THIS_MODULE; |
| 1107 | i2c->adap.algo = &s3c24xx_i2c_algorithm; | 1136 | i2c->adap.algo = &s3c24xx_i2c_algorithm; |
| 1108 | i2c->adap.retries = 2; | 1137 | i2c->adap.retries = 2; |
| 1109 | i2c->adap.class = I2C_CLASS_HWMON | I2C_CLASS_SPD; | 1138 | i2c->adap.class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED; |
| 1110 | i2c->tx_setup = 50; | 1139 | i2c->tx_setup = 50; |
| 1111 | 1140 | ||
| 1112 | init_waitqueue_head(&i2c->wait); | 1141 | init_waitqueue_head(&i2c->wait); |
diff --git a/drivers/i2c/busses/i2c-sirf.c b/drivers/i2c/busses/i2c-sirf.c index 6784f7f527a4..8e3be7ed0586 100644 --- a/drivers/i2c/busses/i2c-sirf.c +++ b/drivers/i2c/busses/i2c-sirf.c | |||
| @@ -312,7 +312,7 @@ static int i2c_sirfsoc_probe(struct platform_device *pdev) | |||
| 312 | goto out; | 312 | goto out; |
| 313 | } | 313 | } |
| 314 | adap = &siic->adapter; | 314 | adap = &siic->adapter; |
| 315 | adap->class = I2C_CLASS_HWMON; | 315 | adap->class = I2C_CLASS_HWMON | I2C_CLASS_DEPRECATED; |
| 316 | 316 | ||
| 317 | mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 317 | mem_res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
| 318 | siic->base = devm_ioremap_resource(&pdev->dev, mem_res); | 318 | siic->base = devm_ioremap_resource(&pdev->dev, mem_res); |
diff --git a/drivers/i2c/busses/i2c-sis5595.c b/drivers/i2c/busses/i2c-sis5595.c index 79fd96a04386..ac9bc33acef4 100644 --- a/drivers/i2c/busses/i2c-sis5595.c +++ b/drivers/i2c/busses/i2c-sis5595.c | |||
| @@ -369,7 +369,7 @@ static struct i2c_adapter sis5595_adapter = { | |||
| 369 | .algo = &smbus_algorithm, | 369 | .algo = &smbus_algorithm, |
| 370 | }; | 370 | }; |
| 371 | 371 | ||
| 372 | static DEFINE_PCI_DEVICE_TABLE(sis5595_ids) = { | 372 | static const struct pci_device_id sis5595_ids[] = { |
| 373 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) }, | 373 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) }, |
| 374 | { 0, } | 374 | { 0, } |
| 375 | }; | 375 | }; |
diff --git a/drivers/i2c/busses/i2c-sis630.c b/drivers/i2c/busses/i2c-sis630.c index 19b8505d0cdd..c6366733008d 100644 --- a/drivers/i2c/busses/i2c-sis630.c +++ b/drivers/i2c/busses/i2c-sis630.c | |||
| @@ -510,7 +510,7 @@ static struct i2c_adapter sis630_adapter = { | |||
| 510 | .retries = 3 | 510 | .retries = 3 |
| 511 | }; | 511 | }; |
| 512 | 512 | ||
| 513 | static DEFINE_PCI_DEVICE_TABLE(sis630_ids) = { | 513 | static const struct pci_device_id sis630_ids[] = { |
| 514 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) }, | 514 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_503) }, |
| 515 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC) }, | 515 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_LPC) }, |
| 516 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_964) }, | 516 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_964) }, |
diff --git a/drivers/i2c/busses/i2c-sis96x.c b/drivers/i2c/busses/i2c-sis96x.c index f8aa0c29f02b..8dc2fc5f74ff 100644 --- a/drivers/i2c/busses/i2c-sis96x.c +++ b/drivers/i2c/busses/i2c-sis96x.c | |||
| @@ -244,7 +244,7 @@ static struct i2c_adapter sis96x_adapter = { | |||
| 244 | .algo = &smbus_algorithm, | 244 | .algo = &smbus_algorithm, |
| 245 | }; | 245 | }; |
| 246 | 246 | ||
| 247 | static DEFINE_PCI_DEVICE_TABLE(sis96x_ids) = { | 247 | static const struct pci_device_id sis96x_ids[] = { |
| 248 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_SMBUS) }, | 248 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_SMBUS) }, |
| 249 | { 0, } | 249 | { 0, } |
| 250 | }; | 250 | }; |
diff --git a/drivers/i2c/busses/i2c-st.c b/drivers/i2c/busses/i2c-st.c index 9cf715d69551..872016196ef3 100644 --- a/drivers/i2c/busses/i2c-st.c +++ b/drivers/i2c/busses/i2c-st.c | |||
| @@ -574,7 +574,7 @@ static irqreturn_t st_i2c_isr_thread(int irq, void *data) | |||
| 574 | writel_relaxed(it, i2c_dev->base + SSC_IEN); | 574 | writel_relaxed(it, i2c_dev->base + SSC_IEN); |
| 575 | 575 | ||
| 576 | st_i2c_set_bits(i2c_dev->base + SSC_I2C, SSC_I2C_STOPG); | 576 | st_i2c_set_bits(i2c_dev->base + SSC_I2C, SSC_I2C_STOPG); |
| 577 | c->result = -EIO; | 577 | c->result = -EAGAIN; |
| 578 | break; | 578 | break; |
| 579 | 579 | ||
| 580 | default: | 580 | default: |
diff --git a/drivers/i2c/busses/i2c-stu300.c b/drivers/i2c/busses/i2c-stu300.c index 5b80ef310841..29b1fb778943 100644 --- a/drivers/i2c/busses/i2c-stu300.c +++ b/drivers/i2c/busses/i2c-stu300.c | |||
| @@ -911,7 +911,7 @@ static int stu300_probe(struct platform_device *pdev) | |||
| 911 | adap = &dev->adapter; | 911 | adap = &dev->adapter; |
| 912 | adap->owner = THIS_MODULE; | 912 | adap->owner = THIS_MODULE; |
| 913 | /* DDC class but actually often used for more generic I2C */ | 913 | /* DDC class but actually often used for more generic I2C */ |
| 914 | adap->class = I2C_CLASS_DDC; | 914 | adap->class = I2C_CLASS_DDC | I2C_CLASS_DEPRECATED; |
| 915 | strlcpy(adap->name, "ST Microelectronics DDC I2C adapter", | 915 | strlcpy(adap->name, "ST Microelectronics DDC I2C adapter", |
| 916 | sizeof(adap->name)); | 916 | sizeof(adap->name)); |
| 917 | adap->nr = bus_nr; | 917 | adap->nr = bus_nr; |
diff --git a/drivers/i2c/busses/i2c-tegra.c b/drivers/i2c/busses/i2c-tegra.c index 9704537aee3c..00f04cb5b4eb 100644 --- a/drivers/i2c/busses/i2c-tegra.c +++ b/drivers/i2c/busses/i2c-tegra.c | |||
| @@ -794,7 +794,7 @@ static int tegra_i2c_probe(struct platform_device *pdev) | |||
| 794 | 794 | ||
| 795 | i2c_set_adapdata(&i2c_dev->adapter, i2c_dev); | 795 | i2c_set_adapdata(&i2c_dev->adapter, i2c_dev); |
| 796 | i2c_dev->adapter.owner = THIS_MODULE; | 796 | i2c_dev->adapter.owner = THIS_MODULE; |
| 797 | i2c_dev->adapter.class = I2C_CLASS_HWMON; | 797 | i2c_dev->adapter.class = I2C_CLASS_HWMON | I2C_CLASS_DEPRECATED; |
| 798 | strlcpy(i2c_dev->adapter.name, "Tegra I2C adapter", | 798 | strlcpy(i2c_dev->adapter.name, "Tegra I2C adapter", |
| 799 | sizeof(i2c_dev->adapter.name)); | 799 | sizeof(i2c_dev->adapter.name)); |
| 800 | i2c_dev->adapter.algo = &tegra_i2c_algo; | 800 | i2c_dev->adapter.algo = &tegra_i2c_algo; |
diff --git a/drivers/i2c/busses/i2c-via.c b/drivers/i2c/busses/i2c-via.c index 49d7f14b9d27..f4a1ed757612 100644 --- a/drivers/i2c/busses/i2c-via.c +++ b/drivers/i2c/busses/i2c-via.c | |||
| @@ -88,7 +88,7 @@ static struct i2c_adapter vt586b_adapter = { | |||
| 88 | }; | 88 | }; |
| 89 | 89 | ||
| 90 | 90 | ||
| 91 | static DEFINE_PCI_DEVICE_TABLE(vt586b_ids) = { | 91 | static const struct pci_device_id vt586b_ids[] = { |
| 92 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3) }, | 92 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3) }, |
| 93 | { 0, } | 93 | { 0, } |
| 94 | }; | 94 | }; |
diff --git a/drivers/i2c/busses/i2c-viapro.c b/drivers/i2c/busses/i2c-viapro.c index 40d36df678de..6841200b6e50 100644 --- a/drivers/i2c/busses/i2c-viapro.c +++ b/drivers/i2c/busses/i2c-viapro.c | |||
| @@ -442,7 +442,7 @@ release_region: | |||
| 442 | return error; | 442 | return error; |
| 443 | } | 443 | } |
| 444 | 444 | ||
| 445 | static DEFINE_PCI_DEVICE_TABLE(vt596_ids) = { | 445 | static const struct pci_device_id vt596_ids[] = { |
| 446 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596_3), | 446 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596_3), |
| 447 | .driver_data = SMBBA1 }, | 447 | .driver_data = SMBBA1 }, |
| 448 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596B_3), | 448 | { PCI_DEVICE(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596B_3), |
diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c index 28107502517f..7731f1795869 100644 --- a/drivers/i2c/busses/i2c-xiic.c +++ b/drivers/i2c/busses/i2c-xiic.c | |||
| @@ -684,7 +684,7 @@ static const struct i2c_algorithm xiic_algorithm = { | |||
| 684 | static struct i2c_adapter xiic_adapter = { | 684 | static struct i2c_adapter xiic_adapter = { |
| 685 | .owner = THIS_MODULE, | 685 | .owner = THIS_MODULE, |
| 686 | .name = DRIVER_NAME, | 686 | .name = DRIVER_NAME, |
| 687 | .class = I2C_CLASS_HWMON | I2C_CLASS_SPD, | 687 | .class = I2C_CLASS_HWMON | I2C_CLASS_SPD | I2C_CLASS_DEPRECATED, |
| 688 | .algo = &xiic_algorithm, | 688 | .algo = &xiic_algorithm, |
| 689 | }; | 689 | }; |
| 690 | 690 | ||
diff --git a/drivers/i2c/busses/scx200_acb.c b/drivers/i2c/busses/scx200_acb.c index 2d1d2c5653fb..cb66f9586f76 100644 --- a/drivers/i2c/busses/scx200_acb.c +++ b/drivers/i2c/busses/scx200_acb.c | |||
| @@ -556,7 +556,7 @@ static struct platform_driver scx200_pci_driver = { | |||
| 556 | .remove = scx200_remove, | 556 | .remove = scx200_remove, |
| 557 | }; | 557 | }; |
| 558 | 558 | ||
| 559 | static DEFINE_PCI_DEVICE_TABLE(scx200_isa) = { | 559 | static const struct pci_device_id scx200_isa[] = { |
| 560 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SCx200_BRIDGE) }, | 560 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SCx200_BRIDGE) }, |
| 561 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SC1100_BRIDGE) }, | 561 | { PCI_DEVICE(PCI_VENDOR_ID_NS, PCI_DEVICE_ID_NS_SC1100_BRIDGE) }, |
| 562 | { 0, } | 562 | { 0, } |
diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c index 5fb80b8962a2..7c7f4b856bad 100644 --- a/drivers/i2c/i2c-core.c +++ b/drivers/i2c/i2c-core.c | |||
| @@ -48,10 +48,13 @@ | |||
| 48 | #include <linux/rwsem.h> | 48 | #include <linux/rwsem.h> |
| 49 | #include <linux/pm_runtime.h> | 49 | #include <linux/pm_runtime.h> |
| 50 | #include <linux/acpi.h> | 50 | #include <linux/acpi.h> |
| 51 | #include <linux/jump_label.h> | ||
| 51 | #include <asm/uaccess.h> | 52 | #include <asm/uaccess.h> |
| 52 | 53 | ||
| 53 | #include "i2c-core.h" | 54 | #include "i2c-core.h" |
| 54 | 55 | ||
| 56 | #define CREATE_TRACE_POINTS | ||
| 57 | #include <trace/events/i2c.h> | ||
| 55 | 58 | ||
| 56 | /* core_lock protects i2c_adapter_idr, and guarantees | 59 | /* core_lock protects i2c_adapter_idr, and guarantees |
| 57 | that device detection, deletion of detected devices, and attach_adapter | 60 | that device detection, deletion of detected devices, and attach_adapter |
| @@ -62,6 +65,18 @@ static DEFINE_IDR(i2c_adapter_idr); | |||
| 62 | static struct device_type i2c_client_type; | 65 | static struct device_type i2c_client_type; |
| 63 | static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver); | 66 | static int i2c_detect(struct i2c_adapter *adapter, struct i2c_driver *driver); |
| 64 | 67 | ||
| 68 | static struct static_key i2c_trace_msg = STATIC_KEY_INIT_FALSE; | ||
| 69 | |||
| 70 | void i2c_transfer_trace_reg(void) | ||
| 71 | { | ||
| 72 | static_key_slow_inc(&i2c_trace_msg); | ||
| 73 | } | ||
| 74 | |||
| 75 | void i2c_transfer_trace_unreg(void) | ||
| 76 | { | ||
| 77 | static_key_slow_dec(&i2c_trace_msg); | ||
| 78 | } | ||
| 79 | |||
| 65 | /* ------------------------------------------------------------------------- */ | 80 | /* ------------------------------------------------------------------------- */ |
| 66 | 81 | ||
| 67 | static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id, | 82 | static const struct i2c_device_id *i2c_match_id(const struct i2c_device_id *id, |
| @@ -1686,6 +1701,7 @@ static void __exit i2c_exit(void) | |||
| 1686 | class_compat_unregister(i2c_adapter_compat_class); | 1701 | class_compat_unregister(i2c_adapter_compat_class); |
| 1687 | #endif | 1702 | #endif |
| 1688 | bus_unregister(&i2c_bus_type); | 1703 | bus_unregister(&i2c_bus_type); |
| 1704 | tracepoint_synchronize_unregister(); | ||
| 1689 | } | 1705 | } |
| 1690 | 1706 | ||
| 1691 | /* We must initialize early, because some subsystems register i2c drivers | 1707 | /* We must initialize early, because some subsystems register i2c drivers |
| @@ -1716,6 +1732,19 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
| 1716 | unsigned long orig_jiffies; | 1732 | unsigned long orig_jiffies; |
| 1717 | int ret, try; | 1733 | int ret, try; |
| 1718 | 1734 | ||
| 1735 | /* i2c_trace_msg gets enabled when tracepoint i2c_transfer gets | ||
| 1736 | * enabled. This is an efficient way of keeping the for-loop from | ||
| 1737 | * being executed when not needed. | ||
| 1738 | */ | ||
| 1739 | if (static_key_false(&i2c_trace_msg)) { | ||
| 1740 | int i; | ||
| 1741 | for (i = 0; i < num; i++) | ||
| 1742 | if (msgs[i].flags & I2C_M_RD) | ||
| 1743 | trace_i2c_read(adap, &msgs[i], i); | ||
| 1744 | else | ||
| 1745 | trace_i2c_write(adap, &msgs[i], i); | ||
| 1746 | } | ||
| 1747 | |||
| 1719 | /* Retry automatically on arbitration loss */ | 1748 | /* Retry automatically on arbitration loss */ |
| 1720 | orig_jiffies = jiffies; | 1749 | orig_jiffies = jiffies; |
| 1721 | for (ret = 0, try = 0; try <= adap->retries; try++) { | 1750 | for (ret = 0, try = 0; try <= adap->retries; try++) { |
| @@ -1726,6 +1755,14 @@ int __i2c_transfer(struct i2c_adapter *adap, struct i2c_msg *msgs, int num) | |||
| 1726 | break; | 1755 | break; |
| 1727 | } | 1756 | } |
| 1728 | 1757 | ||
| 1758 | if (static_key_false(&i2c_trace_msg)) { | ||
| 1759 | int i; | ||
| 1760 | for (i = 0; i < ret; i++) | ||
| 1761 | if (msgs[i].flags & I2C_M_RD) | ||
| 1762 | trace_i2c_reply(adap, &msgs[i], i); | ||
| 1763 | trace_i2c_result(adap, i, ret); | ||
| 1764 | } | ||
| 1765 | |||
| 1729 | return ret; | 1766 | return ret; |
| 1730 | } | 1767 | } |
| 1731 | EXPORT_SYMBOL(__i2c_transfer); | 1768 | EXPORT_SYMBOL(__i2c_transfer); |
| @@ -1941,6 +1978,13 @@ static int i2c_detect_address(struct i2c_client *temp_client, | |||
| 1941 | struct i2c_client *client; | 1978 | struct i2c_client *client; |
| 1942 | 1979 | ||
| 1943 | /* Detection succeeded, instantiate the device */ | 1980 | /* Detection succeeded, instantiate the device */ |
| 1981 | if (adapter->class & I2C_CLASS_DEPRECATED) | ||
| 1982 | dev_warn(&adapter->dev, | ||
| 1983 | "This adapter will soon drop class based instantiation of devices. " | ||
| 1984 | "Please make sure client 0x%02x gets instantiated by other means. " | ||
| 1985 | "Check 'Documentation/i2c/instantiating-devices' for details.\n", | ||
| 1986 | info.addr); | ||
| 1987 | |||
| 1944 | dev_dbg(&adapter->dev, "Creating %s at 0x%02x\n", | 1988 | dev_dbg(&adapter->dev, "Creating %s at 0x%02x\n", |
| 1945 | info.type, info.addr); | 1989 | info.type, info.addr); |
| 1946 | client = i2c_new_device(adapter, &info); | 1990 | client = i2c_new_device(adapter, &info); |
| @@ -2521,6 +2565,14 @@ s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags, | |||
| 2521 | int try; | 2565 | int try; |
| 2522 | s32 res; | 2566 | s32 res; |
| 2523 | 2567 | ||
| 2568 | /* If enabled, the following two tracepoints are conditional on | ||
| 2569 | * read_write and protocol. | ||
| 2570 | */ | ||
| 2571 | trace_smbus_write(adapter, addr, flags, read_write, | ||
| 2572 | command, protocol, data); | ||
| 2573 | trace_smbus_read(adapter, addr, flags, read_write, | ||
| 2574 | command, protocol); | ||
| 2575 | |||
| 2524 | flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB; | 2576 | flags &= I2C_M_TEN | I2C_CLIENT_PEC | I2C_CLIENT_SCCB; |
| 2525 | 2577 | ||
| 2526 | if (adapter->algo->smbus_xfer) { | 2578 | if (adapter->algo->smbus_xfer) { |
| @@ -2541,15 +2593,24 @@ s32 i2c_smbus_xfer(struct i2c_adapter *adapter, u16 addr, unsigned short flags, | |||
| 2541 | i2c_unlock_adapter(adapter); | 2593 | i2c_unlock_adapter(adapter); |
| 2542 | 2594 | ||
| 2543 | if (res != -EOPNOTSUPP || !adapter->algo->master_xfer) | 2595 | if (res != -EOPNOTSUPP || !adapter->algo->master_xfer) |
| 2544 | return res; | 2596 | goto trace; |
| 2545 | /* | 2597 | /* |
| 2546 | * Fall back to i2c_smbus_xfer_emulated if the adapter doesn't | 2598 | * Fall back to i2c_smbus_xfer_emulated if the adapter doesn't |
| 2547 | * implement native support for the SMBus operation. | 2599 | * implement native support for the SMBus operation. |
| 2548 | */ | 2600 | */ |
| 2549 | } | 2601 | } |
| 2550 | 2602 | ||
| 2551 | return i2c_smbus_xfer_emulated(adapter, addr, flags, read_write, | 2603 | res = i2c_smbus_xfer_emulated(adapter, addr, flags, read_write, |
| 2552 | command, protocol, data); | 2604 | command, protocol, data); |
| 2605 | |||
| 2606 | trace: | ||
| 2607 | /* If enabled, the reply tracepoint is conditional on read_write. */ | ||
| 2608 | trace_smbus_reply(adapter, addr, flags, read_write, | ||
| 2609 | command, protocol, data); | ||
| 2610 | trace_smbus_result(adapter, addr, flags, read_write, | ||
| 2611 | command, protocol, res); | ||
| 2612 | |||
| 2613 | return res; | ||
| 2553 | } | 2614 | } |
| 2554 | EXPORT_SYMBOL(i2c_smbus_xfer); | 2615 | EXPORT_SYMBOL(i2c_smbus_xfer); |
| 2555 | 2616 | ||
diff --git a/include/linux/i2c.h b/include/linux/i2c.h index deddeb8c337c..b556e0ab946f 100644 --- a/include/linux/i2c.h +++ b/include/linux/i2c.h | |||
| @@ -487,6 +487,7 @@ void i2c_unlock_adapter(struct i2c_adapter *); | |||
| 487 | #define I2C_CLASS_HWMON (1<<0) /* lm_sensors, ... */ | 487 | #define I2C_CLASS_HWMON (1<<0) /* lm_sensors, ... */ |
| 488 | #define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */ | 488 | #define I2C_CLASS_DDC (1<<3) /* DDC bus on graphics adapters */ |
| 489 | #define I2C_CLASS_SPD (1<<7) /* Memory modules */ | 489 | #define I2C_CLASS_SPD (1<<7) /* Memory modules */ |
| 490 | #define I2C_CLASS_DEPRECATED (1<<8) /* Warn users that adapter will stop using classes */ | ||
| 490 | 491 | ||
| 491 | /* Internal numbers to terminate lists */ | 492 | /* Internal numbers to terminate lists */ |
| 492 | #define I2C_CLIENT_END 0xfffeU | 493 | #define I2C_CLIENT_END 0xfffeU |
diff --git a/include/linux/i2c/bfin_twi.h b/include/linux/i2c/bfin_twi.h new file mode 100644 index 000000000000..135a4e0876ae --- /dev/null +++ b/include/linux/i2c/bfin_twi.h | |||
| @@ -0,0 +1,145 @@ | |||
| 1 | /* | ||
| 2 | * i2c-bfin-twi.h - interface to ADI TWI controller | ||
| 3 | * | ||
| 4 | * Copyright 2005-2014 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Licensed under the GPL-2 or later. | ||
| 7 | */ | ||
| 8 | |||
| 9 | #ifndef __I2C_BFIN_TWI_H__ | ||
| 10 | #define __I2C_BFIN_TWI_H__ | ||
| 11 | |||
| 12 | #include <linux/types.h> | ||
| 13 | #include <linux/i2c.h> | ||
| 14 | |||
| 15 | /* | ||
| 16 | * ADI twi registers layout | ||
| 17 | */ | ||
| 18 | struct bfin_twi_regs { | ||
| 19 | u16 clkdiv; | ||
| 20 | u16 dummy1; | ||
| 21 | u16 control; | ||
| 22 | u16 dummy2; | ||
| 23 | u16 slave_ctl; | ||
| 24 | u16 dummy3; | ||
| 25 | u16 slave_stat; | ||
| 26 | u16 dummy4; | ||
| 27 | u16 slave_addr; | ||
| 28 | u16 dummy5; | ||
| 29 | u16 master_ctl; | ||
| 30 | u16 dummy6; | ||
| 31 | u16 master_stat; | ||
| 32 | u16 dummy7; | ||
| 33 | u16 master_addr; | ||
| 34 | u16 dummy8; | ||
| 35 | u16 int_stat; | ||
| 36 | u16 dummy9; | ||
| 37 | u16 int_mask; | ||
| 38 | u16 dummy10; | ||
| 39 | u16 fifo_ctl; | ||
| 40 | u16 dummy11; | ||
| 41 | u16 fifo_stat; | ||
| 42 | u16 dummy12; | ||
| 43 | u32 __pad[20]; | ||
| 44 | u16 xmt_data8; | ||
| 45 | u16 dummy13; | ||
| 46 | u16 xmt_data16; | ||
| 47 | u16 dummy14; | ||
| 48 | u16 rcv_data8; | ||
| 49 | u16 dummy15; | ||
| 50 | u16 rcv_data16; | ||
| 51 | u16 dummy16; | ||
| 52 | }; | ||
| 53 | |||
| 54 | struct bfin_twi_iface { | ||
| 55 | int irq; | ||
| 56 | spinlock_t lock; | ||
| 57 | char read_write; | ||
| 58 | u8 command; | ||
| 59 | u8 *transPtr; | ||
| 60 | int readNum; | ||
| 61 | int writeNum; | ||
| 62 | int cur_mode; | ||
| 63 | int manual_stop; | ||
| 64 | int result; | ||
| 65 | struct i2c_adapter adap; | ||
| 66 | struct completion complete; | ||
| 67 | struct i2c_msg *pmsg; | ||
| 68 | int msg_num; | ||
| 69 | int cur_msg; | ||
| 70 | u16 saved_clkdiv; | ||
| 71 | u16 saved_control; | ||
| 72 | struct bfin_twi_regs __iomem *regs_base; | ||
| 73 | }; | ||
| 74 | |||
| 75 | /* ******************** TWO-WIRE INTERFACE (TWI) MASKS ********************/ | ||
| 76 | /* TWI_CLKDIV Macros (Use: *pTWI_CLKDIV = CLKLOW(x)|CLKHI(y); ) */ | ||
| 77 | #define CLKLOW(x) ((x) & 0xFF) /* Periods Clock Is Held Low */ | ||
| 78 | #define CLKHI(y) (((y)&0xFF)<<0x8) /* Periods Before New Clock Low */ | ||
| 79 | |||
| 80 | /* TWI_PRESCALE Masks */ | ||
| 81 | #define PRESCALE 0x007F /* SCLKs Per Internal Time Reference (10MHz) */ | ||
| 82 | #define TWI_ENA 0x0080 /* TWI Enable */ | ||
| 83 | #define SCCB 0x0200 /* SCCB Compatibility Enable */ | ||
| 84 | |||
| 85 | /* TWI_SLAVE_CTL Masks */ | ||
| 86 | #define SEN 0x0001 /* Slave Enable */ | ||
| 87 | #define SADD_LEN 0x0002 /* Slave Address Length */ | ||
| 88 | #define STDVAL 0x0004 /* Slave Transmit Data Valid */ | ||
| 89 | #define NAK 0x0008 /* NAK Generated At Conclusion Of Transfer */ | ||
| 90 | #define GEN 0x0010 /* General Call Address Matching Enabled */ | ||
| 91 | |||
| 92 | /* TWI_SLAVE_STAT Masks */ | ||
| 93 | #define SDIR 0x0001 /* Slave Transfer Direction (RX/TX*) */ | ||
| 94 | #define GCALL 0x0002 /* General Call Indicator */ | ||
| 95 | |||
| 96 | /* TWI_MASTER_CTL Masks */ | ||
| 97 | #define MEN 0x0001 /* Master Mode Enable */ | ||
| 98 | #define MADD_LEN 0x0002 /* Master Address Length */ | ||
| 99 | #define MDIR 0x0004 /* Master Transmit Direction (RX/TX*) */ | ||
| 100 | #define FAST 0x0008 /* Use Fast Mode Timing Specs */ | ||
| 101 | #define STOP 0x0010 /* Issue Stop Condition */ | ||
| 102 | #define RSTART 0x0020 /* Repeat Start or Stop* At End Of Transfer */ | ||
| 103 | #define DCNT 0x3FC0 /* Data Bytes To Transfer */ | ||
| 104 | #define SDAOVR 0x4000 /* Serial Data Override */ | ||
| 105 | #define SCLOVR 0x8000 /* Serial Clock Override */ | ||
| 106 | |||
| 107 | /* TWI_MASTER_STAT Masks */ | ||
| 108 | #define MPROG 0x0001 /* Master Transfer In Progress */ | ||
| 109 | #define LOSTARB 0x0002 /* Lost Arbitration Indicator (Xfer Aborted) */ | ||
| 110 | #define ANAK 0x0004 /* Address Not Acknowledged */ | ||
| 111 | #define DNAK 0x0008 /* Data Not Acknowledged */ | ||
| 112 | #define BUFRDERR 0x0010 /* Buffer Read Error */ | ||
| 113 | #define BUFWRERR 0x0020 /* Buffer Write Error */ | ||
| 114 | #define SDASEN 0x0040 /* Serial Data Sense */ | ||
| 115 | #define SCLSEN 0x0080 /* Serial Clock Sense */ | ||
| 116 | #define BUSBUSY 0x0100 /* Bus Busy Indicator */ | ||
| 117 | |||
| 118 | /* TWI_INT_SRC and TWI_INT_ENABLE Masks */ | ||
| 119 | #define SINIT 0x0001 /* Slave Transfer Initiated */ | ||
| 120 | #define SCOMP 0x0002 /* Slave Transfer Complete */ | ||
| 121 | #define SERR 0x0004 /* Slave Transfer Error */ | ||
| 122 | #define SOVF 0x0008 /* Slave Overflow */ | ||
| 123 | #define MCOMP 0x0010 /* Master Transfer Complete */ | ||
| 124 | #define MERR 0x0020 /* Master Transfer Error */ | ||
| 125 | #define XMTSERV 0x0040 /* Transmit FIFO Service */ | ||
| 126 | #define RCVSERV 0x0080 /* Receive FIFO Service */ | ||
| 127 | |||
| 128 | /* TWI_FIFO_CTRL Masks */ | ||
| 129 | #define XMTFLUSH 0x0001 /* Transmit Buffer Flush */ | ||
| 130 | #define RCVFLUSH 0x0002 /* Receive Buffer Flush */ | ||
| 131 | #define XMTINTLEN 0x0004 /* Transmit Buffer Interrupt Length */ | ||
| 132 | #define RCVINTLEN 0x0008 /* Receive Buffer Interrupt Length */ | ||
| 133 | |||
| 134 | /* TWI_FIFO_STAT Masks */ | ||
| 135 | #define XMTSTAT 0x0003 /* Transmit FIFO Status */ | ||
| 136 | #define XMT_EMPTY 0x0000 /* Transmit FIFO Empty */ | ||
| 137 | #define XMT_HALF 0x0001 /* Transmit FIFO Has 1 Byte To Write */ | ||
| 138 | #define XMT_FULL 0x0003 /* Transmit FIFO Full (2 Bytes To Write) */ | ||
| 139 | |||
| 140 | #define RCVSTAT 0x000C /* Receive FIFO Status */ | ||
| 141 | #define RCV_EMPTY 0x0000 /* Receive FIFO Empty */ | ||
| 142 | #define RCV_HALF 0x0004 /* Receive FIFO Has 1 Byte To Read */ | ||
| 143 | #define RCV_FULL 0x000C /* Receive FIFO Full (2 Bytes To Read) */ | ||
| 144 | |||
| 145 | #endif | ||
diff --git a/include/linux/platform_data/i2c-s3c2410.h b/include/linux/platform_data/i2c-s3c2410.h index 2a50048c1c44..05af66b840b9 100644 --- a/include/linux/platform_data/i2c-s3c2410.h +++ b/include/linux/platform_data/i2c-s3c2410.h | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | /* arch/arm/plat-s3c/include/plat/iic.h | 1 | /* |
| 2 | * | ||
| 3 | * Copyright 2004-2009 Simtec Electronics | 2 | * Copyright 2004-2009 Simtec Electronics |
| 4 | * Ben Dooks <ben@simtec.co.uk> | 3 | * Ben Dooks <ben@simtec.co.uk> |
| 5 | * | 4 | * |
| @@ -10,8 +9,8 @@ | |||
| 10 | * published by the Free Software Foundation. | 9 | * published by the Free Software Foundation. |
| 11 | */ | 10 | */ |
| 12 | 11 | ||
| 13 | #ifndef __ASM_ARCH_IIC_H | 12 | #ifndef __I2C_S3C2410_H |
| 14 | #define __ASM_ARCH_IIC_H __FILE__ | 13 | #define __I2C_S3C2410_H __FILE__ |
| 15 | 14 | ||
| 16 | #define S3C_IICFLG_FILTER (1<<0) /* enable s3c2440 filter */ | 15 | #define S3C_IICFLG_FILTER (1<<0) /* enable s3c2440 filter */ |
| 17 | 16 | ||
| @@ -76,4 +75,4 @@ extern void s3c_i2c7_cfg_gpio(struct platform_device *dev); | |||
| 76 | 75 | ||
| 77 | extern struct s3c2410_platform_i2c default_i2c_data; | 76 | extern struct s3c2410_platform_i2c default_i2c_data; |
| 78 | 77 | ||
| 79 | #endif /* __ASM_ARCH_IIC_H */ | 78 | #endif /* __I2C_S3C2410_H */ |
diff --git a/include/trace/events/i2c.h b/include/trace/events/i2c.h new file mode 100644 index 000000000000..fe17187df65d --- /dev/null +++ b/include/trace/events/i2c.h | |||
| @@ -0,0 +1,372 @@ | |||
| 1 | /* I2C and SMBUS message transfer tracepoints | ||
| 2 | * | ||
| 3 | * Copyright (C) 2013 Red Hat, Inc. All Rights Reserved. | ||
| 4 | * Written by David Howells (dhowells@redhat.com) | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or | ||
| 7 | * modify it under the terms of the GNU General Public Licence | ||
| 8 | * as published by the Free Software Foundation; either version | ||
| 9 | * 2 of the Licence, or (at your option) any later version. | ||
| 10 | */ | ||
| 11 | #undef TRACE_SYSTEM | ||
| 12 | #define TRACE_SYSTEM i2c | ||
| 13 | |||
| 14 | #if !defined(_TRACE_I2C_H) || defined(TRACE_HEADER_MULTI_READ) | ||
| 15 | #define _TRACE_I2C_H | ||
| 16 | |||
| 17 | #include <linux/i2c.h> | ||
| 18 | #include <linux/tracepoint.h> | ||
| 19 | |||
| 20 | /* | ||
| 21 | * drivers/i2c/i2c-core.c | ||
| 22 | */ | ||
| 23 | extern void i2c_transfer_trace_reg(void); | ||
| 24 | extern void i2c_transfer_trace_unreg(void); | ||
| 25 | |||
| 26 | /* | ||
| 27 | * __i2c_transfer() write request | ||
| 28 | */ | ||
| 29 | TRACE_EVENT_FN(i2c_write, | ||
| 30 | TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, | ||
| 31 | int num), | ||
| 32 | TP_ARGS(adap, msg, num), | ||
| 33 | TP_STRUCT__entry( | ||
| 34 | __field(int, adapter_nr ) | ||
| 35 | __field(__u16, msg_nr ) | ||
| 36 | __field(__u16, addr ) | ||
| 37 | __field(__u16, flags ) | ||
| 38 | __field(__u16, len ) | ||
| 39 | __dynamic_array(__u8, buf, msg->len) ), | ||
| 40 | TP_fast_assign( | ||
| 41 | __entry->adapter_nr = adap->nr; | ||
| 42 | __entry->msg_nr = num; | ||
| 43 | __entry->addr = msg->addr; | ||
| 44 | __entry->flags = msg->flags; | ||
| 45 | __entry->len = msg->len; | ||
| 46 | memcpy(__get_dynamic_array(buf), msg->buf, msg->len); | ||
| 47 | ), | ||
| 48 | TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]", | ||
| 49 | __entry->adapter_nr, | ||
| 50 | __entry->msg_nr, | ||
| 51 | __entry->addr, | ||
| 52 | __entry->flags, | ||
| 53 | __entry->len, | ||
| 54 | __entry->len, __get_dynamic_array(buf) | ||
| 55 | ), | ||
| 56 | i2c_transfer_trace_reg, | ||
| 57 | i2c_transfer_trace_unreg); | ||
| 58 | |||
| 59 | /* | ||
| 60 | * __i2c_transfer() read request | ||
| 61 | */ | ||
| 62 | TRACE_EVENT_FN(i2c_read, | ||
| 63 | TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, | ||
| 64 | int num), | ||
| 65 | TP_ARGS(adap, msg, num), | ||
| 66 | TP_STRUCT__entry( | ||
| 67 | __field(int, adapter_nr ) | ||
| 68 | __field(__u16, msg_nr ) | ||
| 69 | __field(__u16, addr ) | ||
| 70 | __field(__u16, flags ) | ||
| 71 | __field(__u16, len ) | ||
| 72 | ), | ||
| 73 | TP_fast_assign( | ||
| 74 | __entry->adapter_nr = adap->nr; | ||
| 75 | __entry->msg_nr = num; | ||
| 76 | __entry->addr = msg->addr; | ||
| 77 | __entry->flags = msg->flags; | ||
| 78 | __entry->len = msg->len; | ||
| 79 | ), | ||
| 80 | TP_printk("i2c-%d #%u a=%03x f=%04x l=%u", | ||
| 81 | __entry->adapter_nr, | ||
| 82 | __entry->msg_nr, | ||
| 83 | __entry->addr, | ||
| 84 | __entry->flags, | ||
| 85 | __entry->len | ||
| 86 | ), | ||
| 87 | i2c_transfer_trace_reg, | ||
| 88 | i2c_transfer_trace_unreg); | ||
| 89 | |||
| 90 | /* | ||
| 91 | * __i2c_transfer() read reply | ||
| 92 | */ | ||
| 93 | TRACE_EVENT_FN(i2c_reply, | ||
| 94 | TP_PROTO(const struct i2c_adapter *adap, const struct i2c_msg *msg, | ||
| 95 | int num), | ||
| 96 | TP_ARGS(adap, msg, num), | ||
| 97 | TP_STRUCT__entry( | ||
| 98 | __field(int, adapter_nr ) | ||
| 99 | __field(__u16, msg_nr ) | ||
| 100 | __field(__u16, addr ) | ||
| 101 | __field(__u16, flags ) | ||
| 102 | __field(__u16, len ) | ||
| 103 | __dynamic_array(__u8, buf, msg->len) ), | ||
| 104 | TP_fast_assign( | ||
| 105 | __entry->adapter_nr = adap->nr; | ||
| 106 | __entry->msg_nr = num; | ||
| 107 | __entry->addr = msg->addr; | ||
| 108 | __entry->flags = msg->flags; | ||
| 109 | __entry->len = msg->len; | ||
| 110 | memcpy(__get_dynamic_array(buf), msg->buf, msg->len); | ||
| 111 | ), | ||
| 112 | TP_printk("i2c-%d #%u a=%03x f=%04x l=%u [%*phD]", | ||
| 113 | __entry->adapter_nr, | ||
| 114 | __entry->msg_nr, | ||
| 115 | __entry->addr, | ||
| 116 | __entry->flags, | ||
| 117 | __entry->len, | ||
| 118 | __entry->len, __get_dynamic_array(buf) | ||
| 119 | ), | ||
| 120 | i2c_transfer_trace_reg, | ||
| 121 | i2c_transfer_trace_unreg); | ||
| 122 | |||
| 123 | /* | ||
| 124 | * __i2c_transfer() result | ||
| 125 | */ | ||
| 126 | TRACE_EVENT_FN(i2c_result, | ||
| 127 | TP_PROTO(const struct i2c_adapter *adap, int num, int ret), | ||
| 128 | TP_ARGS(adap, num, ret), | ||
| 129 | TP_STRUCT__entry( | ||
| 130 | __field(int, adapter_nr ) | ||
| 131 | __field(__u16, nr_msgs ) | ||
| 132 | __field(__s16, ret ) | ||
| 133 | ), | ||
| 134 | TP_fast_assign( | ||
| 135 | __entry->adapter_nr = adap->nr; | ||
| 136 | __entry->nr_msgs = num; | ||
| 137 | __entry->ret = ret; | ||
| 138 | ), | ||
| 139 | TP_printk("i2c-%d n=%u ret=%d", | ||
| 140 | __entry->adapter_nr, | ||
| 141 | __entry->nr_msgs, | ||
| 142 | __entry->ret | ||
| 143 | ), | ||
| 144 | i2c_transfer_trace_reg, | ||
| 145 | i2c_transfer_trace_unreg); | ||
| 146 | |||
| 147 | /* | ||
| 148 | * i2c_smbus_xfer() write data or procedure call request | ||
| 149 | */ | ||
| 150 | TRACE_EVENT_CONDITION(smbus_write, | ||
| 151 | TP_PROTO(const struct i2c_adapter *adap, | ||
| 152 | u16 addr, unsigned short flags, | ||
| 153 | char read_write, u8 command, int protocol, | ||
| 154 | const union i2c_smbus_data *data), | ||
| 155 | TP_ARGS(adap, addr, flags, read_write, command, protocol, data), | ||
| 156 | TP_CONDITION(read_write == I2C_SMBUS_WRITE || | ||
| 157 | protocol == I2C_SMBUS_PROC_CALL || | ||
| 158 | protocol == I2C_SMBUS_BLOCK_PROC_CALL), | ||
| 159 | TP_STRUCT__entry( | ||
| 160 | __field(int, adapter_nr ) | ||
| 161 | __field(__u16, addr ) | ||
| 162 | __field(__u16, flags ) | ||
| 163 | __field(__u8, command ) | ||
| 164 | __field(__u8, len ) | ||
| 165 | __field(__u32, protocol ) | ||
| 166 | __array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2) ), | ||
| 167 | TP_fast_assign( | ||
| 168 | __entry->adapter_nr = adap->nr; | ||
| 169 | __entry->addr = addr; | ||
| 170 | __entry->flags = flags; | ||
| 171 | __entry->command = command; | ||
| 172 | __entry->protocol = protocol; | ||
| 173 | |||
| 174 | switch (protocol) { | ||
| 175 | case I2C_SMBUS_BYTE_DATA: | ||
| 176 | __entry->len = 1; | ||
| 177 | goto copy; | ||
| 178 | case I2C_SMBUS_WORD_DATA: | ||
| 179 | case I2C_SMBUS_PROC_CALL: | ||
| 180 | __entry->len = 2; | ||
| 181 | goto copy; | ||
| 182 | case I2C_SMBUS_BLOCK_DATA: | ||
| 183 | case I2C_SMBUS_BLOCK_PROC_CALL: | ||
| 184 | case I2C_SMBUS_I2C_BLOCK_DATA: | ||
| 185 | __entry->len = data->block[0] + 1; | ||
| 186 | copy: | ||
| 187 | memcpy(__entry->buf, data->block, __entry->len); | ||
| 188 | break; | ||
| 189 | case I2C_SMBUS_QUICK: | ||
| 190 | case I2C_SMBUS_BYTE: | ||
| 191 | case I2C_SMBUS_I2C_BLOCK_BROKEN: | ||
| 192 | default: | ||
| 193 | __entry->len = 0; | ||
| 194 | } | ||
| 195 | ), | ||
| 196 | TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]", | ||
| 197 | __entry->adapter_nr, | ||
| 198 | __entry->addr, | ||
| 199 | __entry->flags, | ||
| 200 | __entry->command, | ||
| 201 | __print_symbolic(__entry->protocol, | ||
| 202 | { I2C_SMBUS_QUICK, "QUICK" }, | ||
| 203 | { I2C_SMBUS_BYTE, "BYTE" }, | ||
| 204 | { I2C_SMBUS_BYTE_DATA, "BYTE_DATA" }, | ||
| 205 | { I2C_SMBUS_WORD_DATA, "WORD_DATA" }, | ||
| 206 | { I2C_SMBUS_PROC_CALL, "PROC_CALL" }, | ||
| 207 | { I2C_SMBUS_BLOCK_DATA, "BLOCK_DATA" }, | ||
| 208 | { I2C_SMBUS_I2C_BLOCK_BROKEN, "I2C_BLOCK_BROKEN" }, | ||
| 209 | { I2C_SMBUS_BLOCK_PROC_CALL, "BLOCK_PROC_CALL" }, | ||
| 210 | { I2C_SMBUS_I2C_BLOCK_DATA, "I2C_BLOCK_DATA" }), | ||
| 211 | __entry->len, | ||
| 212 | __entry->len, __entry->buf | ||
| 213 | )); | ||
| 214 | |||
| 215 | /* | ||
| 216 | * i2c_smbus_xfer() read data request | ||
| 217 | */ | ||
| 218 | TRACE_EVENT_CONDITION(smbus_read, | ||
| 219 | TP_PROTO(const struct i2c_adapter *adap, | ||
| 220 | u16 addr, unsigned short flags, | ||
| 221 | char read_write, u8 command, int protocol), | ||
| 222 | TP_ARGS(adap, addr, flags, read_write, command, protocol), | ||
| 223 | TP_CONDITION(!(read_write == I2C_SMBUS_WRITE || | ||
| 224 | protocol == I2C_SMBUS_PROC_CALL || | ||
| 225 | protocol == I2C_SMBUS_BLOCK_PROC_CALL)), | ||
| 226 | TP_STRUCT__entry( | ||
| 227 | __field(int, adapter_nr ) | ||
| 228 | __field(__u16, flags ) | ||
| 229 | __field(__u16, addr ) | ||
| 230 | __field(__u8, command ) | ||
| 231 | __field(__u32, protocol ) | ||
| 232 | __array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2) ), | ||
| 233 | TP_fast_assign( | ||
| 234 | __entry->adapter_nr = adap->nr; | ||
| 235 | __entry->addr = addr; | ||
| 236 | __entry->flags = flags; | ||
| 237 | __entry->command = command; | ||
| 238 | __entry->protocol = protocol; | ||
| 239 | ), | ||
| 240 | TP_printk("i2c-%d a=%03x f=%04x c=%x %s", | ||
| 241 | __entry->adapter_nr, | ||
| 242 | __entry->addr, | ||
| 243 | __entry->flags, | ||
| 244 | __entry->command, | ||
| 245 | __print_symbolic(__entry->protocol, | ||
| 246 | { I2C_SMBUS_QUICK, "QUICK" }, | ||
| 247 | { I2C_SMBUS_BYTE, "BYTE" }, | ||
| 248 | { I2C_SMBUS_BYTE_DATA, "BYTE_DATA" }, | ||
| 249 | { I2C_SMBUS_WORD_DATA, "WORD_DATA" }, | ||
| 250 | { I2C_SMBUS_PROC_CALL, "PROC_CALL" }, | ||
| 251 | { I2C_SMBUS_BLOCK_DATA, "BLOCK_DATA" }, | ||
| 252 | { I2C_SMBUS_I2C_BLOCK_BROKEN, "I2C_BLOCK_BROKEN" }, | ||
| 253 | { I2C_SMBUS_BLOCK_PROC_CALL, "BLOCK_PROC_CALL" }, | ||
| 254 | { I2C_SMBUS_I2C_BLOCK_DATA, "I2C_BLOCK_DATA" }) | ||
| 255 | )); | ||
| 256 | |||
| 257 | /* | ||
| 258 | * i2c_smbus_xfer() read data or procedure call reply | ||
| 259 | */ | ||
| 260 | TRACE_EVENT_CONDITION(smbus_reply, | ||
| 261 | TP_PROTO(const struct i2c_adapter *adap, | ||
| 262 | u16 addr, unsigned short flags, | ||
| 263 | char read_write, u8 command, int protocol, | ||
| 264 | const union i2c_smbus_data *data), | ||
| 265 | TP_ARGS(adap, addr, flags, read_write, command, protocol, data), | ||
| 266 | TP_CONDITION(read_write == I2C_SMBUS_READ), | ||
| 267 | TP_STRUCT__entry( | ||
| 268 | __field(int, adapter_nr ) | ||
| 269 | __field(__u16, addr ) | ||
| 270 | __field(__u16, flags ) | ||
| 271 | __field(__u8, command ) | ||
| 272 | __field(__u8, len ) | ||
| 273 | __field(__u32, protocol ) | ||
| 274 | __array(__u8, buf, I2C_SMBUS_BLOCK_MAX + 2) ), | ||
| 275 | TP_fast_assign( | ||
| 276 | __entry->adapter_nr = adap->nr; | ||
| 277 | __entry->addr = addr; | ||
| 278 | __entry->flags = flags; | ||
| 279 | __entry->command = command; | ||
| 280 | __entry->protocol = protocol; | ||
| 281 | |||
| 282 | switch (protocol) { | ||
| 283 | case I2C_SMBUS_BYTE: | ||
| 284 | case I2C_SMBUS_BYTE_DATA: | ||
| 285 | __entry->len = 1; | ||
| 286 | goto copy; | ||
| 287 | case I2C_SMBUS_WORD_DATA: | ||
| 288 | case I2C_SMBUS_PROC_CALL: | ||
| 289 | __entry->len = 2; | ||
| 290 | goto copy; | ||
| 291 | case I2C_SMBUS_BLOCK_DATA: | ||
| 292 | case I2C_SMBUS_BLOCK_PROC_CALL: | ||
| 293 | case I2C_SMBUS_I2C_BLOCK_DATA: | ||
| 294 | __entry->len = data->block[0] + 1; | ||
| 295 | copy: | ||
| 296 | memcpy(__entry->buf, data->block, __entry->len); | ||
| 297 | break; | ||
| 298 | case I2C_SMBUS_QUICK: | ||
| 299 | case I2C_SMBUS_I2C_BLOCK_BROKEN: | ||
| 300 | default: | ||
| 301 | __entry->len = 0; | ||
| 302 | } | ||
| 303 | ), | ||
| 304 | TP_printk("i2c-%d a=%03x f=%04x c=%x %s l=%u [%*phD]", | ||
| 305 | __entry->adapter_nr, | ||
| 306 | __entry->addr, | ||
| 307 | __entry->flags, | ||
| 308 | __entry->command, | ||
| 309 | __print_symbolic(__entry->protocol, | ||
| 310 | { I2C_SMBUS_QUICK, "QUICK" }, | ||
| 311 | { I2C_SMBUS_BYTE, "BYTE" }, | ||
| 312 | { I2C_SMBUS_BYTE_DATA, "BYTE_DATA" }, | ||
| 313 | { I2C_SMBUS_WORD_DATA, "WORD_DATA" }, | ||
| 314 | { I2C_SMBUS_PROC_CALL, "PROC_CALL" }, | ||
| 315 | { I2C_SMBUS_BLOCK_DATA, "BLOCK_DATA" }, | ||
| 316 | { I2C_SMBUS_I2C_BLOCK_BROKEN, "I2C_BLOCK_BROKEN" }, | ||
| 317 | { I2C_SMBUS_BLOCK_PROC_CALL, "BLOCK_PROC_CALL" }, | ||
| 318 | { I2C_SMBUS_I2C_BLOCK_DATA, "I2C_BLOCK_DATA" }), | ||
| 319 | __entry->len, | ||
| 320 | __entry->len, __entry->buf | ||
| 321 | )); | ||
| 322 | |||
| 323 | /* | ||
| 324 | * i2c_smbus_xfer() result | ||
| 325 | */ | ||
| 326 | TRACE_EVENT(smbus_result, | ||
| 327 | TP_PROTO(const struct i2c_adapter *adap, | ||
| 328 | u16 addr, unsigned short flags, | ||
| 329 | char read_write, u8 command, int protocol, | ||
| 330 | int res), | ||
| 331 | TP_ARGS(adap, addr, flags, read_write, command, protocol, res), | ||
| 332 | TP_STRUCT__entry( | ||
| 333 | __field(int, adapter_nr ) | ||
| 334 | __field(__u16, addr ) | ||
| 335 | __field(__u16, flags ) | ||
| 336 | __field(__u8, read_write ) | ||
| 337 | __field(__u8, command ) | ||
| 338 | __field(__s16, res ) | ||
| 339 | __field(__u32, protocol ) | ||
| 340 | ), | ||
| 341 | TP_fast_assign( | ||
| 342 | __entry->adapter_nr = adap->nr; | ||
| 343 | __entry->addr = addr; | ||
| 344 | __entry->flags = flags; | ||
| 345 | __entry->read_write = read_write; | ||
| 346 | __entry->command = command; | ||
| 347 | __entry->protocol = protocol; | ||
| 348 | __entry->res = res; | ||
| 349 | ), | ||
| 350 | TP_printk("i2c-%d a=%03x f=%04x c=%x %s %s res=%d", | ||
| 351 | __entry->adapter_nr, | ||
| 352 | __entry->addr, | ||
| 353 | __entry->flags, | ||
| 354 | __entry->command, | ||
| 355 | __print_symbolic(__entry->protocol, | ||
| 356 | { I2C_SMBUS_QUICK, "QUICK" }, | ||
| 357 | { I2C_SMBUS_BYTE, "BYTE" }, | ||
| 358 | { I2C_SMBUS_BYTE_DATA, "BYTE_DATA" }, | ||
| 359 | { I2C_SMBUS_WORD_DATA, "WORD_DATA" }, | ||
| 360 | { I2C_SMBUS_PROC_CALL, "PROC_CALL" }, | ||
| 361 | { I2C_SMBUS_BLOCK_DATA, "BLOCK_DATA" }, | ||
| 362 | { I2C_SMBUS_I2C_BLOCK_BROKEN, "I2C_BLOCK_BROKEN" }, | ||
| 363 | { I2C_SMBUS_BLOCK_PROC_CALL, "BLOCK_PROC_CALL" }, | ||
| 364 | { I2C_SMBUS_I2C_BLOCK_DATA, "I2C_BLOCK_DATA" }), | ||
| 365 | __entry->read_write == I2C_SMBUS_WRITE ? "wr" : "rd", | ||
| 366 | __entry->res | ||
| 367 | )); | ||
| 368 | |||
| 369 | #endif /* _TRACE_I2C_H */ | ||
| 370 | |||
| 371 | /* This part must be outside protection */ | ||
| 372 | #include <trace/define_trace.h> | ||
