mirror of
https://github.com/t2linux/kernel.git
synced 2026-04-30 13:48:59 -07:00
Merge branch 'i2c/for-mergewindow' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c updates from Wolfram Sang: - core supports now bus regulators controlling power for SCL/SDA - quite some DT binding conversions to YAML - added a seperate DT binding for the optional SMBus Alert feature - documentation with examples how to deal with I2C sysfs files - some bigger rework for the i801 driver - and a few usual driver updates * 'i2c/for-mergewindow' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: (42 commits) i2c: ali1535: mention that the device should not be disabled i2c: mpc: Restore reread of I2C status register i2c: core-smbus: Expose PEC calculate function for generic use Documentation: i2c: Add doc for I2C sysfs i2c: core: Disable client irq on reboot/shutdown dt-bindings: i2c: update bindings for MT8195 SoC i2c: imx: Fix some checkpatch warnings i2c: davinci: Simplify with dev_err_probe() i2c: cadence: Simplify with dev_err_probe() i2c: xiic: Simplify with dev_err_probe() i2c: cadence: Clear HOLD bit before xfer_size register rolls over dt-bindings: i2c: ce4100: Replace "ti,pcf8575" by "nxp,pcf8575" i2c: i801: Improve i801_setup_hstcfg i2c: i801: Use driver name constant instead of function dev_driver_string i2c: i801: Simplify initialization of i2c_board_info in i801_probe_optional_slaves i2c: i801: Improve status polling i2c: cht-wc: Replace of_node by NULL i2c: riic: Add RZ/G2L support dt-bindings: i2c: renesas,riic: Document RZ/G2L I2C controller dt-bindings: i2c: renesas,iic: Convert to json-schema ...
This commit is contained in:
@@ -15,6 +15,7 @@ Required properties:
|
||||
"mediatek,mt8173-i2c": for MediaTek MT8173
|
||||
"mediatek,mt8183-i2c": for MediaTek MT8183
|
||||
"mediatek,mt8192-i2c": for MediaTek MT8192
|
||||
"mediatek,mt8195-i2c", "mediatek,mt8192-i2c": for MediaTek MT8195
|
||||
"mediatek,mt8516-i2c", "mediatek,mt2712-i2c": for MediaTek MT8516
|
||||
- reg: physical base address of the controller and dma base, length of memory
|
||||
mapped region.
|
||||
@@ -32,6 +33,7 @@ Optional properties:
|
||||
- mediatek,have-pmic: platform can control i2c form special pmic side.
|
||||
Only mt6589 and mt8135 support this feature.
|
||||
- mediatek,use-push-pull: IO config use push-pull mode.
|
||||
- vbus-supply: phandle to the regulator that provides power to SCL/SDA.
|
||||
|
||||
Example:
|
||||
|
||||
|
||||
@@ -62,7 +62,6 @@ Example:
|
||||
reg = <0x3c>;
|
||||
pwms = <&pwm 4 3000>;
|
||||
reset-gpios = <&gpio2 7 1>;
|
||||
reset-active-low;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -1,37 +0,0 @@
|
||||
I2C for OMAP platforms
|
||||
|
||||
Required properties :
|
||||
- compatible : Must be
|
||||
"ti,omap2420-i2c" for OMAP2420 SoCs
|
||||
"ti,omap2430-i2c" for OMAP2430 SoCs
|
||||
"ti,omap3-i2c" for OMAP3 SoCs
|
||||
"ti,omap4-i2c" for OMAP4+ SoCs
|
||||
"ti,am654-i2c", "ti,omap4-i2c" for AM654 SoCs
|
||||
"ti,j721e-i2c", "ti,omap4-i2c" for J721E SoCs
|
||||
"ti,am64-i2c", "ti,omap4-i2c" for AM64 SoCs
|
||||
- ti,hwmods : Must be "i2c<n>", n being the instance number (1-based)
|
||||
- #address-cells = <1>;
|
||||
- #size-cells = <0>;
|
||||
|
||||
Recommended properties :
|
||||
- clock-frequency : Desired I2C bus clock frequency in Hz. Otherwise
|
||||
the default 100 kHz frequency will be used.
|
||||
|
||||
Optional properties:
|
||||
- Child nodes conforming to i2c bus binding
|
||||
|
||||
Note: Current implementation will fetch base address, irq and dma
|
||||
from omap hwmod data base during device registration.
|
||||
Future plan is to migrate hwmod data base contents into device tree
|
||||
blob so that, all the required data will be used from device tree dts
|
||||
file.
|
||||
|
||||
Examples :
|
||||
|
||||
i2c1: i2c@0 {
|
||||
compatible = "ti,omap3-i2c";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
ti,hwmods = "i2c1";
|
||||
clock-frequency = <400000>;
|
||||
};
|
||||
@@ -71,7 +71,7 @@ This is an example which is used on FalconFalls:
|
||||
/* This I2C controller has one gpio controller */
|
||||
gpio@26 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "ti,pcf8575";
|
||||
compatible = "nxp,pcf8575";
|
||||
reg = <0x26>;
|
||||
gpio-controller;
|
||||
};
|
||||
@@ -85,7 +85,7 @@ This is an example which is used on FalconFalls:
|
||||
|
||||
gpio@26 {
|
||||
#gpio-cells = <2>;
|
||||
compatible = "ti,pcf8575";
|
||||
compatible = "nxp,pcf8575";
|
||||
reg = <0x26>;
|
||||
gpio-controller;
|
||||
};
|
||||
|
||||
@@ -9,6 +9,7 @@ PROPERTIES:
|
||||
"qcom,msm8916-cci"
|
||||
"qcom,msm8996-cci"
|
||||
"qcom,sdm845-cci"
|
||||
"qcom,sm8250-cci"
|
||||
|
||||
- reg
|
||||
Usage: required
|
||||
@@ -41,8 +42,8 @@ PROPERTIES:
|
||||
|
||||
SUBNODES:
|
||||
|
||||
The CCI provides I2C masters for one (msm8916) or two i2c busses (msm8996 and
|
||||
sdm845), described as subdevices named "i2c-bus@0" and "i2c-bus@1".
|
||||
The CCI provides I2C masters for one (msm8916) or two i2c busses (msm8996,
|
||||
sdm845 and sm8250), described as subdevices named "i2c-bus@0" and "i2c-bus@1".
|
||||
|
||||
PROPERTIES:
|
||||
|
||||
|
||||
@@ -36,6 +36,7 @@ properties:
|
||||
- rockchip,px30-i2c
|
||||
- rockchip,rk3308-i2c
|
||||
- rockchip,rk3328-i2c
|
||||
- rockchip,rk3568-i2c
|
||||
- const: rockchip,rk3399-i2c
|
||||
|
||||
reg:
|
||||
|
||||
@@ -89,8 +89,11 @@ wants to support one of the below features, it should adapt these bindings.
|
||||
|
||||
- smbus
|
||||
states that additional SMBus restrictions and features apply to this bus.
|
||||
Examples of features are SMBusHostNotify and SMBusAlert. Examples of
|
||||
restrictions are more reserved addresses and timeout definitions.
|
||||
An example of feature is SMBusHostNotify. Examples of restrictions are
|
||||
more reserved addresses and timeout definitions.
|
||||
|
||||
- smbus-alert
|
||||
states that the optional SMBus-Alert feature apply to this bus.
|
||||
|
||||
Required properties (per child device)
|
||||
--------------------------------------
|
||||
|
||||
@@ -1,67 +0,0 @@
|
||||
I2C for R-Car platforms
|
||||
|
||||
Required properties:
|
||||
- compatible:
|
||||
"renesas,i2c-r8a7742" if the device is a part of a R8A7742 SoC.
|
||||
"renesas,i2c-r8a7743" if the device is a part of a R8A7743 SoC.
|
||||
"renesas,i2c-r8a7744" if the device is a part of a R8A7744 SoC.
|
||||
"renesas,i2c-r8a7745" if the device is a part of a R8A7745 SoC.
|
||||
"renesas,i2c-r8a77470" if the device is a part of a R8A77470 SoC.
|
||||
"renesas,i2c-r8a774a1" if the device is a part of a R8A774A1 SoC.
|
||||
"renesas,i2c-r8a774b1" if the device is a part of a R8A774B1 SoC.
|
||||
"renesas,i2c-r8a774c0" if the device is a part of a R8A774C0 SoC.
|
||||
"renesas,i2c-r8a774e1" if the device is a part of a R8A774E1 SoC.
|
||||
"renesas,i2c-r8a7778" if the device is a part of a R8A7778 SoC.
|
||||
"renesas,i2c-r8a7779" if the device is a part of a R8A7779 SoC.
|
||||
"renesas,i2c-r8a7790" if the device is a part of a R8A7790 SoC.
|
||||
"renesas,i2c-r8a7791" if the device is a part of a R8A7791 SoC.
|
||||
"renesas,i2c-r8a7792" if the device is a part of a R8A7792 SoC.
|
||||
"renesas,i2c-r8a7793" if the device is a part of a R8A7793 SoC.
|
||||
"renesas,i2c-r8a7794" if the device is a part of a R8A7794 SoC.
|
||||
"renesas,i2c-r8a7795" if the device is a part of a R8A7795 SoC.
|
||||
"renesas,i2c-r8a7796" if the device is a part of a R8A77960 SoC.
|
||||
"renesas,i2c-r8a77961" if the device is a part of a R8A77961 SoC.
|
||||
"renesas,i2c-r8a77965" if the device is a part of a R8A77965 SoC.
|
||||
"renesas,i2c-r8a77970" if the device is a part of a R8A77970 SoC.
|
||||
"renesas,i2c-r8a77980" if the device is a part of a R8A77980 SoC.
|
||||
"renesas,i2c-r8a77990" if the device is a part of a R8A77990 SoC.
|
||||
"renesas,i2c-r8a77995" if the device is a part of a R8A77995 SoC.
|
||||
"renesas,i2c-r8a779a0" if the device is a part of a R8A779A0 SoC.
|
||||
"renesas,rcar-gen1-i2c" for a generic R-Car Gen1 compatible device.
|
||||
"renesas,rcar-gen2-i2c" for a generic R-Car Gen2 or RZ/G1 compatible
|
||||
device.
|
||||
"renesas,rcar-gen3-i2c" for a generic R-Car Gen3 or RZ/G2 compatible
|
||||
device.
|
||||
"renesas,i2c-rcar" (deprecated)
|
||||
|
||||
When compatible with the generic version, nodes must list the
|
||||
SoC-specific version corresponding to the platform first followed
|
||||
by the generic version.
|
||||
|
||||
- reg: physical base address of the controller and length of memory mapped
|
||||
region.
|
||||
- interrupts: interrupt specifier.
|
||||
|
||||
Optional properties:
|
||||
- clock-frequency: desired I2C bus clock frequency in Hz. The absence of this
|
||||
property indicates the default frequency 100 kHz.
|
||||
- clocks: clock specifier.
|
||||
- dmas: Must contain a list of two references to DMA specifiers, one for
|
||||
transmission, and one for reception.
|
||||
- dma-names: Must contain a list of two DMA names, "tx" and "rx".
|
||||
|
||||
- i2c-scl-falling-time-ns: see i2c.txt
|
||||
- i2c-scl-internal-delay-ns: see i2c.txt
|
||||
- i2c-scl-rising-time-ns: see i2c.txt
|
||||
|
||||
Examples :
|
||||
|
||||
i2c0: i2c@e6508000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,i2c-r8a7791", "renesas,rcar-gen2-i2c";
|
||||
reg = <0 0xe6508000 0 0x40>;
|
||||
interrupts = <0 287 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&mstp9_clks R8A7791_CLK_I2C0>;
|
||||
clock-frequency = <400000>;
|
||||
};
|
||||
@@ -1,22 +0,0 @@
|
||||
Device tree configuration for Renesas EMEV2 IIC controller
|
||||
|
||||
Required properties:
|
||||
- compatible : "renesas,iic-emev2"
|
||||
- reg : address start and address range size of device
|
||||
- interrupts : specifier for the IIC controller interrupt
|
||||
- clocks : phandle to the IP core SCLK
|
||||
- clock-names : must be "sclk"
|
||||
- #address-cells : should be <1>
|
||||
- #size-cells : should be <0>
|
||||
|
||||
Example:
|
||||
|
||||
iic0: i2c@e0070000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,iic-emev2";
|
||||
reg = <0xe0070000 0x28>;
|
||||
interrupts = <0 32 IRQ_TYPE_EDGE_RISING>;
|
||||
clocks = <&iic0_sclk>;
|
||||
clock-names = "sclk";
|
||||
};
|
||||
@@ -0,0 +1,54 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/i2c/renesas,iic-emev2.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas EMMA Mobile EV2 IIC Interface
|
||||
|
||||
maintainers:
|
||||
- Wolfram Sang <wsa+renesas@sang-engineering.com>
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/i2c/i2c-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
const: renesas,iic-emev2
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
const: sclk
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-names
|
||||
- '#address-cells'
|
||||
- '#size-cells'
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
iic0: i2c@e0070000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,iic-emev2";
|
||||
reg = <0xe0070000 0x28>;
|
||||
interrupts = <GIC_SPI 32 IRQ_TYPE_EDGE_RISING>;
|
||||
clocks = <&iic0_sclk>;
|
||||
clock-names = "sclk";
|
||||
};
|
||||
@@ -1,72 +0,0 @@
|
||||
Device tree configuration for Renesas IIC (sh_mobile) driver
|
||||
|
||||
Required properties:
|
||||
- compatible :
|
||||
- "renesas,iic-r8a73a4" (R-Mobile APE6)
|
||||
- "renesas,iic-r8a7740" (R-Mobile A1)
|
||||
- "renesas,iic-r8a7742" (RZ/G1H)
|
||||
- "renesas,iic-r8a7743" (RZ/G1M)
|
||||
- "renesas,iic-r8a7744" (RZ/G1N)
|
||||
- "renesas,iic-r8a7745" (RZ/G1E)
|
||||
- "renesas,iic-r8a774a1" (RZ/G2M)
|
||||
- "renesas,iic-r8a774b1" (RZ/G2N)
|
||||
- "renesas,iic-r8a774c0" (RZ/G2E)
|
||||
- "renesas,iic-r8a774e1" (RZ/G2H)
|
||||
- "renesas,iic-r8a7790" (R-Car H2)
|
||||
- "renesas,iic-r8a7791" (R-Car M2-W)
|
||||
- "renesas,iic-r8a7792" (R-Car V2H)
|
||||
- "renesas,iic-r8a7793" (R-Car M2-N)
|
||||
- "renesas,iic-r8a7794" (R-Car E2)
|
||||
- "renesas,iic-r8a7795" (R-Car H3)
|
||||
- "renesas,iic-r8a7796" (R-Car M3-W)
|
||||
- "renesas,iic-r8a77961" (R-Car M3-W+)
|
||||
- "renesas,iic-r8a77965" (R-Car M3-N)
|
||||
- "renesas,iic-r8a77990" (R-Car E3)
|
||||
- "renesas,iic-sh73a0" (SH-Mobile AG5)
|
||||
- "renesas,rcar-gen2-iic" (generic R-Car Gen2 or RZ/G1
|
||||
compatible device)
|
||||
- "renesas,rcar-gen3-iic" (generic R-Car Gen3 or RZ/G2
|
||||
compatible device)
|
||||
- "renesas,rmobile-iic" (generic device)
|
||||
|
||||
When compatible with a generic R-Car version, nodes
|
||||
must list the SoC-specific version corresponding to
|
||||
the platform first followed by the generic R-Car
|
||||
version.
|
||||
|
||||
When compatible with "renesas,rmobile-iic" it should
|
||||
be the last compatibility string listed.
|
||||
|
||||
The r8a77990 (R-Car E3) and r8a774c0 (RZ/G2E)
|
||||
controllers are not considered compatible with
|
||||
"renesas,rcar-gen3-iic" or "renesas,rmobile-iic"
|
||||
due to the absence of automatic transmission registers.
|
||||
|
||||
- reg : address start and address range size of device
|
||||
- interrupts : interrupt of device
|
||||
- clocks : clock for device
|
||||
- #address-cells : should be <1>
|
||||
- #size-cells : should be <0>
|
||||
|
||||
Optional properties:
|
||||
- clock-frequency : frequency of bus clock in Hz. Default 100kHz if unset.
|
||||
- dmas : Must contain a list of two references to DMA
|
||||
specifiers, one for transmission, and one for
|
||||
reception.
|
||||
- dma-names : Must contain a list of two DMA names, "tx" and "rx".
|
||||
|
||||
|
||||
Pinctrl properties might be needed, too. See there.
|
||||
|
||||
Example:
|
||||
|
||||
iic0: i2c@e6500000 {
|
||||
compatible = "renesas,iic-r8a7790", "renesas,rcar-gen2-iic",
|
||||
"renesas,rmobile-iic";
|
||||
reg = <0 0xe6500000 0 0x425>;
|
||||
interrupts = <0 174 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&mstp3_clks R8A7790_CLK_IIC0>;
|
||||
clock-frequency = <400000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
@@ -0,0 +1,158 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/i2c/renesas,rcar-i2c.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas R-Car I2C Controller
|
||||
|
||||
maintainers:
|
||||
- Wolfram Sang <wsa+renesas@sang-engineering.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,i2c-r8a7778 # R-Car M1A
|
||||
- renesas,i2c-r8a7779 # R-Car H1
|
||||
- const: renesas,rcar-gen1-i2c # R-Car Gen1
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,i2c-r8a7742 # RZ/G1H
|
||||
- renesas,i2c-r8a7743 # RZ/G1M
|
||||
- renesas,i2c-r8a7744 # RZ/G1N
|
||||
- renesas,i2c-r8a7745 # RZ/G1E
|
||||
- renesas,i2c-r8a77470 # RZ/G1C
|
||||
- renesas,i2c-r8a7790 # R-Car H2
|
||||
- renesas,i2c-r8a7791 # R-Car M2-W
|
||||
- renesas,i2c-r8a7792 # R-Car V2H
|
||||
- renesas,i2c-r8a7793 # R-Car M2-N
|
||||
- renesas,i2c-r8a7794 # R-Car E2
|
||||
- const: renesas,rcar-gen2-i2c # R-Car Gen2 and RZ/G1
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,i2c-r8a774a1 # RZ/G2M
|
||||
- renesas,i2c-r8a774b1 # RZ/G2N
|
||||
- renesas,i2c-r8a774c0 # RZ/G2E
|
||||
- renesas,i2c-r8a774e1 # RZ/G2H
|
||||
- renesas,i2c-r8a7795 # R-Car H3
|
||||
- renesas,i2c-r8a7796 # R-Car M3-W
|
||||
- renesas,i2c-r8a77961 # R-Car M3-W+
|
||||
- renesas,i2c-r8a77965 # R-Car M3-N
|
||||
- renesas,i2c-r8a77970 # R-Car V3M
|
||||
- renesas,i2c-r8a77980 # R-Car V3H
|
||||
- renesas,i2c-r8a77990 # R-Car E3
|
||||
- renesas,i2c-r8a77995 # R-Car D3
|
||||
- renesas,i2c-r8a779a0 # R-Car V3U
|
||||
- const: renesas,rcar-gen3-i2c # R-Car Gen3 and RZ/G2
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clock-frequency:
|
||||
description:
|
||||
Desired I2C bus clock frequency in Hz. The absence of this property
|
||||
indicates the default frequency 100 kHz.
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
dmas:
|
||||
minItems: 2
|
||||
maxItems: 4
|
||||
description:
|
||||
Must contain a list of pairs of references to DMA specifiers, one for
|
||||
transmission, and one for reception.
|
||||
|
||||
dma-names:
|
||||
minItems: 2
|
||||
maxItems: 4
|
||||
items:
|
||||
enum:
|
||||
- tx
|
||||
- rx
|
||||
|
||||
i2c-scl-falling-time-ns:
|
||||
default: 35
|
||||
description:
|
||||
Number of nanoseconds the SCL signal takes to fall; t(f) in the I2C
|
||||
specification.
|
||||
|
||||
i2c-scl-internal-delay-ns:
|
||||
default: 50
|
||||
description:
|
||||
Number of nanoseconds the IP core additionally needs to setup SCL.
|
||||
|
||||
i2c-scl-rising-time-ns:
|
||||
default: 200
|
||||
description:
|
||||
Number of nanoseconds the SCL signal takes to rise; t(r) in the I2C
|
||||
specification.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- power-domains
|
||||
- '#address-cells'
|
||||
- '#size-cells'
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/i2c/i2c-controller.yaml#
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,rcar-gen1-i2c
|
||||
- renesas,rcar-gen2-i2c
|
||||
then:
|
||||
properties:
|
||||
dmas: false
|
||||
dma-names: false
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,rcar-gen2-i2c
|
||||
- renesas,rcar-gen3-i2c
|
||||
then:
|
||||
required:
|
||||
- resets
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/r8a7791-cpg-mssr.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/power/r8a7791-sysc.h>
|
||||
|
||||
i2c0: i2c@e6508000 {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
compatible = "renesas,i2c-r8a7791", "renesas,rcar-gen2-i2c";
|
||||
reg = <0xe6508000 0x40>;
|
||||
interrupts = <GIC_SPI 287 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-frequency = <400000>;
|
||||
clocks = <&cpg CPG_MOD 931>;
|
||||
power-domains = <&sysc R8A7791_PD_ALWAYS_ON>;
|
||||
resets = <&cpg 931>;
|
||||
i2c-scl-internal-delay-ns = <6>;
|
||||
};
|
||||
@@ -1,32 +0,0 @@
|
||||
Device tree configuration for Renesas RIIC driver
|
||||
|
||||
Required properties:
|
||||
- compatible :
|
||||
"renesas,riic-r7s72100" if the device is a part of a R7S72100 SoC.
|
||||
"renesas,riic-r7s9210" if the device is a part of a R7S9210 SoC.
|
||||
"renesas,riic-rz" for a generic RZ/A compatible device.
|
||||
- reg : address start and address range size of device
|
||||
- interrupts : 8 interrupts (TEI, RI, TI, SPI, STI, NAKI, ALI, TMOI)
|
||||
- clock-frequency : frequency of bus clock in Hz
|
||||
- #address-cells : should be <1>
|
||||
- #size-cells : should be <0>
|
||||
|
||||
Pinctrl properties might be needed, too. See there.
|
||||
|
||||
Example:
|
||||
|
||||
i2c0: i2c@fcfee000 {
|
||||
compatible = "renesas,riic-r7s72100", "renesas,riic-rz";
|
||||
reg = <0xfcfee000 0x44>;
|
||||
interrupts = <0 157 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 158 IRQ_TYPE_EDGE_RISING>,
|
||||
<0 159 IRQ_TYPE_EDGE_RISING>,
|
||||
<0 160 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 161 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 162 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 163 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<0 164 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clock-frequency = <100000>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
@@ -0,0 +1,93 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/i2c/renesas,riic.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas RZ/A and RZ/G2L I2C Bus Interface (RIIC)
|
||||
|
||||
maintainers:
|
||||
- Chris Brandt <chris.brandt@renesas.com>
|
||||
- Wolfram Sang <wsa+renesas@sang-engineering.com>
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/i2c/i2c-controller.yaml#
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
items:
|
||||
- enum:
|
||||
- renesas,riic-r7s72100 # RZ/A1H
|
||||
- renesas,riic-r7s9210 # RZ/A2M
|
||||
- renesas,riic-r9a07g044 # RZ/G2{L,LC}
|
||||
- const: renesas,riic-rz # RZ/A or RZ/G2L
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
items:
|
||||
- description: Transmit End Interrupt (TEI)
|
||||
- description: Receive Data Full Interrupt (RI)
|
||||
- description: Transmit Data Empty Interrupt (TI)
|
||||
- description: Stop Condition Detection Interrupt (SPI)
|
||||
- description: Start Condition Detection Interrupt (STI)
|
||||
- description: NACK Reception Interrupt (NAKI)
|
||||
- description: Arbitration-Lost Interrupt (ALI)
|
||||
- description: Timeout Interrupt (TMOI)
|
||||
|
||||
clock-frequency:
|
||||
description:
|
||||
Desired I2C bus clock frequency in Hz. The absence of this property
|
||||
indicates the default frequency 100 kHz.
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- clock-frequency
|
||||
- power-domains
|
||||
- '#address-cells'
|
||||
- '#size-cells'
|
||||
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,riic-r9a07g044
|
||||
then:
|
||||
required:
|
||||
- resets
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/r7s72100-clock.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
i2c0: i2c@fcfee000 {
|
||||
compatible = "renesas,riic-r7s72100", "renesas,riic-rz";
|
||||
reg = <0xfcfee000 0x44>;
|
||||
interrupts = <GIC_SPI 157 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 158 IRQ_TYPE_EDGE_RISING>,
|
||||
<GIC_SPI 159 IRQ_TYPE_EDGE_RISING>,
|
||||
<GIC_SPI 160 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 161 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 162 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 163 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 164 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&mstp9_clks R7S72100_CLK_I2C0>;
|
||||
clock-frequency = <100000>;
|
||||
power-domains = <&cpg_clocks>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
@@ -0,0 +1,149 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/i2c/renesas,rmobile-iic.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Renesas R-Mobile I2C Bus Interface (IIC)
|
||||
|
||||
maintainers:
|
||||
- Wolfram Sang <wsa+renesas@sang-engineering.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,iic-r8a73a4 # R-Mobile APE6
|
||||
- renesas,iic-r8a7740 # R-Mobile A1
|
||||
- renesas,iic-sh73a0 # SH-Mobile AG5
|
||||
- const: renesas,rmobile-iic # Generic
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,iic-r8a7742 # RZ/G1H
|
||||
- renesas,iic-r8a7743 # RZ/G1M
|
||||
- renesas,iic-r8a7744 # RZ/G1N
|
||||
- renesas,iic-r8a7745 # RZ/G1E
|
||||
- renesas,iic-r8a7790 # R-Car H2
|
||||
- renesas,iic-r8a7791 # R-Car M2-W
|
||||
- renesas,iic-r8a7792 # R-Car V2H
|
||||
- renesas,iic-r8a7793 # R-Car M2-N
|
||||
- renesas,iic-r8a7794 # R-Car E2
|
||||
- const: renesas,rcar-gen2-iic # R-Car Gen2 and RZ/G1
|
||||
- const: renesas,rmobile-iic # Generic
|
||||
|
||||
- items:
|
||||
- enum:
|
||||
- renesas,iic-r8a774a1 # RZ/G2M
|
||||
- renesas,iic-r8a774b1 # RZ/G2N
|
||||
- renesas,iic-r8a774c0 # RZ/G2E
|
||||
- renesas,iic-r8a774e1 # RZ/G2H
|
||||
- renesas,iic-r8a7795 # R-Car H3
|
||||
- renesas,iic-r8a7796 # R-Car M3-W
|
||||
- renesas,iic-r8a77961 # R-Car M3-W+
|
||||
- renesas,iic-r8a77965 # R-Car M3-N
|
||||
- renesas,iic-r8a77990 # R-Car E3
|
||||
- const: renesas,rcar-gen3-iic # R-Car Gen3 and RZ/G2
|
||||
- const: renesas,rmobile-iic # Generic
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts: true
|
||||
|
||||
clock-frequency:
|
||||
description:
|
||||
Desired I2C bus clock frequency in Hz. The absence of this property
|
||||
indicates the default frequency 100 kHz.
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
power-domains:
|
||||
maxItems: 1
|
||||
|
||||
resets:
|
||||
maxItems: 1
|
||||
|
||||
dmas:
|
||||
minItems: 2
|
||||
maxItems: 4
|
||||
description:
|
||||
Must contain a list of pairs of references to DMA specifiers, one for
|
||||
transmission, and one for reception.
|
||||
|
||||
dma-names:
|
||||
minItems: 2
|
||||
maxItems: 4
|
||||
items:
|
||||
enum:
|
||||
- tx
|
||||
- rx
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
- clocks
|
||||
- power-domains
|
||||
- '#address-cells'
|
||||
- '#size-cells'
|
||||
|
||||
allOf:
|
||||
- $ref: /schemas/i2c/i2c-controller.yaml#
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,iic-r8a7740
|
||||
- renesas,iic-sh73a0
|
||||
then:
|
||||
properties:
|
||||
interrupts:
|
||||
items:
|
||||
- description: Arbitration Lost Interrupt (ALI)
|
||||
- description: Non-acknowledge Detection Interrupt (TACKI)
|
||||
- description: Wait Interrupt (WAITI)
|
||||
- description: Data Transmit Enable interrupt (DTEI)
|
||||
else:
|
||||
properties:
|
||||
interrupts:
|
||||
items:
|
||||
- description: Single combined interrupt
|
||||
|
||||
- if:
|
||||
properties:
|
||||
compatible:
|
||||
contains:
|
||||
enum:
|
||||
- renesas,rcar-gen2-iic
|
||||
- renesas,rcar-gen3-iic
|
||||
then:
|
||||
required:
|
||||
- resets
|
||||
|
||||
unevaluatedProperties: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/clock/r8a7790-cpg-mssr.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
#include <dt-bindings/power/r8a7790-sysc.h>
|
||||
|
||||
iic0: i2c@e6500000 {
|
||||
compatible = "renesas,iic-r8a7790", "renesas,rcar-gen2-iic",
|
||||
"renesas,rmobile-iic";
|
||||
reg = <0xe6500000 0x425>;
|
||||
interrupts = <GIC_SPI 174 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&cpg CPG_MOD 318>;
|
||||
clock-frequency = <400000>;
|
||||
dmas = <&dmac0 0x61>, <&dmac0 0x62>, <&dmac1 0x61>, <&dmac1 0x62>;
|
||||
dma-names = "tx", "rx", "tx", "rx";
|
||||
power-domains = <&sysc R8A7790_PD_ALWAYS_ON>;
|
||||
resets = <&cpg 318>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
@@ -0,0 +1,102 @@
|
||||
# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause)
|
||||
%YAML 1.2
|
||||
---
|
||||
$id: http://devicetree.org/schemas/i2c/ti,omap4-i2c.yaml#
|
||||
$schema: http://devicetree.org/meta-schemas/core.yaml#
|
||||
|
||||
title: Bindings for I2C controllers on TI's OMAP and K3 SoCs
|
||||
|
||||
maintainers:
|
||||
- Vignesh Raghavendra <vigneshr@ti.com>
|
||||
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- enum:
|
||||
- ti,omap2420-i2c
|
||||
- ti,omap2430-i2c
|
||||
- ti,omap3-i2c
|
||||
- ti,omap4-i2c
|
||||
- items:
|
||||
- enum:
|
||||
- ti,am4372-i2c
|
||||
- ti,am64-i2c
|
||||
- ti,am654-i2c
|
||||
- ti,j721e-i2c
|
||||
- const: ti,omap4-i2c
|
||||
|
||||
reg:
|
||||
maxItems: 1
|
||||
|
||||
interrupts:
|
||||
maxItems: 1
|
||||
|
||||
clocks:
|
||||
maxItems: 1
|
||||
|
||||
clock-names:
|
||||
const: fck
|
||||
|
||||
clock-frequency: true
|
||||
|
||||
power-domains: true
|
||||
|
||||
"#address-cells":
|
||||
const: 1
|
||||
|
||||
"#size-cells":
|
||||
const: 0
|
||||
|
||||
ti,hwmods:
|
||||
description:
|
||||
Must be "i2c<n>", n being the instance number (1-based).
|
||||
This property is applicable only on legacy platforms mainly omap2/3
|
||||
and ti81xx and should not be used on other platforms.
|
||||
$ref: /schemas/types.yaml#/definitions/string
|
||||
deprecated: true
|
||||
|
||||
# subnode's properties
|
||||
patternProperties:
|
||||
"@[0-9a-f]+$":
|
||||
type: object
|
||||
description:
|
||||
Flash device uses the below defined properties in the subnode.
|
||||
|
||||
required:
|
||||
- compatible
|
||||
- reg
|
||||
- interrupts
|
||||
|
||||
additionalProperties: false
|
||||
|
||||
if:
|
||||
properties:
|
||||
compatible:
|
||||
oneOf:
|
||||
- const: ti,omap2420-i2c
|
||||
- const: ti,omap2430-i2c
|
||||
- const: ti,omap3-i2c
|
||||
- const: ti,omap4-i2c
|
||||
|
||||
then:
|
||||
properties:
|
||||
ti,hwmods:
|
||||
items:
|
||||
- pattern: "^i2c([1-9])$"
|
||||
|
||||
else:
|
||||
properties:
|
||||
ti,hwmods: false
|
||||
|
||||
examples:
|
||||
- |
|
||||
#include <dt-bindings/interrupt-controller/irq.h>
|
||||
#include <dt-bindings/interrupt-controller/arm-gic.h>
|
||||
|
||||
main_i2c0: i2c@2000000 {
|
||||
compatible = "ti,j721e-i2c", "ti,omap4-i2c";
|
||||
reg = <0x2000000 0x100>;
|
||||
interrupts = <GIC_SPI 200 IRQ_TYPE_LEVEL_HIGH>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
};
|
||||
@@ -0,0 +1,395 @@
|
||||
.. SPDX-License-Identifier: GPL-2.0
|
||||
|
||||
===============
|
||||
Linux I2C Sysfs
|
||||
===============
|
||||
|
||||
Overview
|
||||
========
|
||||
|
||||
I2C topology can be complex because of the existence of I2C MUX
|
||||
(I2C Multiplexer). The Linux
|
||||
kernel abstracts the MUX channels into logical I2C bus numbers. However, there
|
||||
is a gap of knowledge to map from the I2C bus physical number and MUX topology
|
||||
to logical I2C bus number. This doc is aimed to fill in this gap, so the
|
||||
audience (hardware engineers and new software developers for example) can learn
|
||||
the concept of logical I2C buses in the kernel, by knowing the physical I2C
|
||||
topology and navigating through the I2C sysfs in Linux shell. This knowledge is
|
||||
useful and essential to use ``i2c-tools`` for the purpose of development and
|
||||
debugging.
|
||||
|
||||
Target audience
|
||||
---------------
|
||||
|
||||
People who need to use Linux shell to interact with I2C subsystem on a system
|
||||
which the Linux is running on.
|
||||
|
||||
Prerequisites
|
||||
-------------
|
||||
|
||||
1. Knowledge of general Linux shell file system commands and operations.
|
||||
|
||||
2. General knowledge of I2C, I2C MUX and I2C topology.
|
||||
|
||||
Location of I2C Sysfs
|
||||
=====================
|
||||
|
||||
Typically, the Linux Sysfs filesystem is mounted at the ``/sys`` directory,
|
||||
so you can find the I2C Sysfs under ``/sys/bus/i2c/devices``
|
||||
where you can directly ``cd`` to it.
|
||||
There is a list of symbolic links under that directory. The links that
|
||||
start with ``i2c-`` are I2C buses, which may be either physical or logical. The
|
||||
other links that begin with numbers and end with numbers are I2C devices, where
|
||||
the first number is I2C bus number, and the second number is I2C address.
|
||||
|
||||
Google Pixel 3 phone for example::
|
||||
|
||||
blueline:/sys/bus/i2c/devices $ ls
|
||||
0-0008 0-0061 1-0028 3-0043 4-0036 4-0041 i2c-1 i2c-3
|
||||
0-000c 0-0066 2-0049 4-000b 4-0040 i2c-0 i2c-2 i2c-4
|
||||
|
||||
``i2c-2`` is an I2C bus whose number is 2, and ``2-0049`` is an I2C device
|
||||
on bus 2 address 0x49 bound with a kernel driver.
|
||||
|
||||
Terminologies
|
||||
=============
|
||||
|
||||
First, let us define a couple of terminologies to avoid confusions in the later
|
||||
sections.
|
||||
|
||||
(Physical) I2C Bus Controller
|
||||
-----------------------------
|
||||
|
||||
The hardware system that the Linux kernel is running on may have multiple
|
||||
physical I2C bus controllers. The controllers are hardware and physical, and the
|
||||
system may define multiple registers in the memory space to manipulate the
|
||||
controllers. Linux kernel has I2C bus drivers under source directory
|
||||
``drivers/i2c/busses`` to translate kernel I2C API into register
|
||||
operations for different systems. This terminology is not limited to Linux
|
||||
kernel only.
|
||||
|
||||
I2C Bus Physical Number
|
||||
-----------------------
|
||||
|
||||
For each physical I2C bus controller, the system vendor may assign a physical
|
||||
number to each controller. For example, the first I2C bus controller which has
|
||||
the lowest register addresses may be called ``I2C-0``.
|
||||
|
||||
Logical I2C Bus
|
||||
---------------
|
||||
|
||||
Every I2C bus number you see in Linux I2C Sysfs is a logical I2C bus with a
|
||||
number assigned. This is similar to the fact that software code is usually
|
||||
written upon virtual memory space, instead of physical memory space.
|
||||
|
||||
Each logical I2C bus may be an abstraction of a physical I2C bus controller, or
|
||||
an abstraction of a channel behind an I2C MUX. In case it is an abstraction of a
|
||||
MUX channel, whenever we access an I2C device via a such logical bus, the kernel
|
||||
will switch the I2C MUX for you to the proper channel as part of the
|
||||
abstraction.
|
||||
|
||||
Physical I2C Bus
|
||||
----------------
|
||||
|
||||
If the logical I2C bus is a direct abstraction of a physical I2C bus controller,
|
||||
let us call it a physical I2C bus.
|
||||
|
||||
Caveat
|
||||
------
|
||||
|
||||
This may be a confusing part for people who only know about the physical I2C
|
||||
design of a board. It is actually possible to rename the I2C bus physical number
|
||||
to a different number in logical I2C bus level in Device Tree Source (DTS) under
|
||||
section ``aliases``. See
|
||||
`arch/arm/boot/dts/nuvoton-npcm730-gsj.dts
|
||||
<../../arch/arm/boot/dts/nuvoton-npcm730-gsj.dts>`_
|
||||
for an example of DTS file.
|
||||
|
||||
Best Practice: **(To kernel software developers)** It is better to keep the I2C
|
||||
bus physical number the same as their corresponding logical I2C bus number,
|
||||
instead of renaming or mapping them, so that it may be less confusing to other
|
||||
users. These physical I2C buses can be served as good starting points for I2C
|
||||
MUX fanouts. For the following examples, we will assume that the physical I2C
|
||||
bus has a number same as their I2C bus physical number.
|
||||
|
||||
Walk through Logical I2C Bus
|
||||
============================
|
||||
|
||||
For the following content, we will use a more complex I2C topology as an
|
||||
example. Here is a brief graph for the I2C topology. If you do not understand
|
||||
this graph at the first glance, do not be afraid to continue reading this doc
|
||||
and review it when you finish reading.
|
||||
|
||||
::
|
||||
|
||||
i2c-7 (physical I2C bus controller 7)
|
||||
`-- 7-0071 (4-channel I2C MUX at 0x71)
|
||||
|-- i2c-60 (channel-0)
|
||||
|-- i2c-73 (channel-1)
|
||||
| |-- 73-0040 (I2C sensor device with hwmon directory)
|
||||
| |-- 73-0070 (I2C MUX at 0x70, exists in DTS, but failed to probe)
|
||||
| `-- 73-0072 (8-channel I2C MUX at 0x72)
|
||||
| |-- i2c-78 (channel-0)
|
||||
| |-- ... (channel-1...6, i2c-79...i2c-84)
|
||||
| `-- i2c-85 (channel-7)
|
||||
|-- i2c-86 (channel-2)
|
||||
`-- i2c-203 (channel-3)
|
||||
|
||||
Distinguish Physical and Logical I2C Bus
|
||||
----------------------------------------
|
||||
|
||||
One simple way to distinguish between a physical I2C bus and a logical I2C bus,
|
||||
is to read the symbolic link ``device`` under the I2C bus directory by using
|
||||
command ``ls -l`` or ``readlink``.
|
||||
|
||||
An alternative symbolic link to check is ``mux_device``. This link only exists
|
||||
in logical I2C bus directory which is fanned out from another I2C bus.
|
||||
Reading this link will also tell you which I2C MUX device created
|
||||
this logical I2C bus.
|
||||
|
||||
If the symbolic link points to a directory ending with ``.i2c``, it should be a
|
||||
physical I2C bus, directly abstracting a physical I2C bus controller. For
|
||||
example::
|
||||
|
||||
$ readlink /sys/bus/i2c/devices/i2c-7/device
|
||||
../../f0087000.i2c
|
||||
$ ls /sys/bus/i2c/devices/i2c-7/mux_device
|
||||
ls: /sys/bus/i2c/devices/i2c-7/mux_device: No such file or directory
|
||||
|
||||
In this case, ``i2c-7`` is a physical I2C bus, so it does not have the symbolic
|
||||
link ``mux_device`` under its directory. And if the kernel software developer
|
||||
follows the common practice by not renaming physical I2C buses, this should also
|
||||
mean the physical I2C bus controller 7 of the system.
|
||||
|
||||
On the other hand, if the symbolic link points to another I2C bus, the I2C bus
|
||||
presented by the current directory has to be a logical bus. The I2C bus pointed
|
||||
by the link is the parent bus which may be either a physical I2C bus or a
|
||||
logical one. In this case, the I2C bus presented by the current directory
|
||||
abstracts an I2C MUX channel under the parent bus.
|
||||
|
||||
For example::
|
||||
|
||||
$ readlink /sys/bus/i2c/devices/i2c-73/device
|
||||
../../i2c-7
|
||||
$ readlink /sys/bus/i2c/devices/i2c-73/mux_device
|
||||
../7-0071
|
||||
|
||||
``i2c-73`` is a logical bus fanout by an I2C MUX under ``i2c-7``
|
||||
whose I2C address is 0x71.
|
||||
Whenever we access an I2C device with bus 73, the kernel will always
|
||||
switch the I2C MUX addressed 0x71 to the proper channel for you as part of the
|
||||
abstraction.
|
||||
|
||||
Finding out Logical I2C Bus Number
|
||||
----------------------------------
|
||||
|
||||
In this section, we will describe how to find out the logical I2C bus number
|
||||
representing certain I2C MUX channels based on the knowledge of physical
|
||||
hardware I2C topology.
|
||||
|
||||
In this example, we have a system which has a physical I2C bus 7 and not renamed
|
||||
in DTS. There is a 4-channel MUX at address 0x71 on that bus. There is another
|
||||
8-channel MUX at address 0x72 behind the channel 1 of the 0x71 MUX. Let us
|
||||
navigate through Sysfs and find out the logical I2C bus number of the channel 3
|
||||
of the 0x72 MUX.
|
||||
|
||||
First of all, let us go to the directory of ``i2c-7``::
|
||||
|
||||
~$ cd /sys/bus/i2c/devices/i2c-7
|
||||
/sys/bus/i2c/devices/i2c-7$ ls
|
||||
7-0071 i2c-60 name subsystem
|
||||
delete_device i2c-73 new_device uevent
|
||||
device i2c-86 of_node
|
||||
i2c-203 i2c-dev power
|
||||
|
||||
There, we see the 0x71 MUX as ``7-0071``. Go inside it::
|
||||
|
||||
/sys/bus/i2c/devices/i2c-7$ cd 7-0071/
|
||||
/sys/bus/i2c/devices/i2c-7/7-0071$ ls -l
|
||||
channel-0 channel-3 modalias power
|
||||
channel-1 driver name subsystem
|
||||
channel-2 idle_state of_node uevent
|
||||
|
||||
Read the link ``channel-1`` using ``readlink`` or ``ls -l``::
|
||||
|
||||
/sys/bus/i2c/devices/i2c-7/7-0071$ readlink channel-1
|
||||
../i2c-73
|
||||
|
||||
We find out that the channel 1 of 0x71 MUX on ``i2c-7`` is assigned
|
||||
with a logical I2C bus number of 73.
|
||||
Let us continue the journey to directory ``i2c-73`` in either ways::
|
||||
|
||||
# cd to i2c-73 under I2C Sysfs root
|
||||
/sys/bus/i2c/devices/i2c-7/7-0071$ cd /sys/bus/i2c/devices/i2c-73
|
||||
/sys/bus/i2c/devices/i2c-73$
|
||||
|
||||
# cd the channel symbolic link
|
||||
/sys/bus/i2c/devices/i2c-7/7-0071$ cd channel-1
|
||||
/sys/bus/i2c/devices/i2c-7/7-0071/channel-1$
|
||||
|
||||
# cd the link content
|
||||
/sys/bus/i2c/devices/i2c-7/7-0071$ cd ../i2c-73
|
||||
/sys/bus/i2c/devices/i2c-7/i2c-73$
|
||||
|
||||
Either ways, you will end up in the directory of ``i2c-73``. Similar to above,
|
||||
we can now find the 0x72 MUX and what logical I2C bus numbers
|
||||
that its channels are assigned::
|
||||
|
||||
/sys/bus/i2c/devices/i2c-73$ ls
|
||||
73-0040 device i2c-83 new_device
|
||||
73-004e i2c-78 i2c-84 of_node
|
||||
73-0050 i2c-79 i2c-85 power
|
||||
73-0070 i2c-80 i2c-dev subsystem
|
||||
73-0072 i2c-81 mux_device uevent
|
||||
delete_device i2c-82 name
|
||||
/sys/bus/i2c/devices/i2c-73$ cd 73-0072
|
||||
/sys/bus/i2c/devices/i2c-73/73-0072$ ls
|
||||
channel-0 channel-4 driver of_node
|
||||
channel-1 channel-5 idle_state power
|
||||
channel-2 channel-6 modalias subsystem
|
||||
channel-3 channel-7 name uevent
|
||||
/sys/bus/i2c/devices/i2c-73/73-0072$ readlink channel-3
|
||||
../i2c-81
|
||||
|
||||
There, we find out the logical I2C bus number of the channel 3 of the 0x72 MUX
|
||||
is 81. We can later use this number to switch to its own I2C Sysfs directory or
|
||||
issue ``i2c-tools`` commands.
|
||||
|
||||
Tip: Once you understand the I2C topology with MUX, command
|
||||
`i2cdetect -l
|
||||
<https://manpages.debian.org/unstable/i2c-tools/i2cdetect.8.en.html>`_
|
||||
in
|
||||
`I2C Tools
|
||||
<https://i2c.wiki.kernel.org/index.php/I2C_Tools>`_
|
||||
can give you
|
||||
an overview of the I2C topology easily, if it is available on your system. For
|
||||
example::
|
||||
|
||||
$ i2cdetect -l | grep -e '\-73' -e _7 | sort -V
|
||||
i2c-7 i2c npcm_i2c_7 I2C adapter
|
||||
i2c-73 i2c i2c-7-mux (chan_id 1) I2C adapter
|
||||
i2c-78 i2c i2c-73-mux (chan_id 0) I2C adapter
|
||||
i2c-79 i2c i2c-73-mux (chan_id 1) I2C adapter
|
||||
i2c-80 i2c i2c-73-mux (chan_id 2) I2C adapter
|
||||
i2c-81 i2c i2c-73-mux (chan_id 3) I2C adapter
|
||||
i2c-82 i2c i2c-73-mux (chan_id 4) I2C adapter
|
||||
i2c-83 i2c i2c-73-mux (chan_id 5) I2C adapter
|
||||
i2c-84 i2c i2c-73-mux (chan_id 6) I2C adapter
|
||||
i2c-85 i2c i2c-73-mux (chan_id 7) I2C adapter
|
||||
|
||||
Pinned Logical I2C Bus Number
|
||||
-----------------------------
|
||||
|
||||
If not specified in DTS, when an I2C MUX driver is applied and the MUX device is
|
||||
successfully probed, the kernel will assign the MUX channels with a logical bus
|
||||
number based on the current biggest logical bus number incrementally. For
|
||||
example, if the system has ``i2c-15`` as the highest logical bus number, and a
|
||||
4-channel MUX is applied successfully, we will have ``i2c-16`` for the
|
||||
MUX channel 0, and all the way to ``i2c-19`` for the MUX channel 3.
|
||||
|
||||
The kernel software developer is able to pin the fanout MUX channels to a static
|
||||
logical I2C bus number in the DTS. This doc will not go through the details on
|
||||
how to implement this in DTS, but we can see an example in:
|
||||
`arch/arm/boot/dts/aspeed-bmc-facebook-wedge400.dts
|
||||
<../../arch/arm/boot/dts/aspeed-bmc-facebook-wedge400.dts>`_
|
||||
|
||||
In the above example, there is an 8-channel I2C MUX at address 0x70 on physical
|
||||
I2C bus 2. The channel 2 of the MUX is defined as ``imux18`` in DTS,
|
||||
and pinned to logical I2C bus number 18 with the line of ``i2c18 = &imux18;``
|
||||
in section ``aliases``.
|
||||
|
||||
Take it further, it is possible to design a logical I2C bus number schema that
|
||||
can be easily remembered by humans or calculated arithmetically. For example, we
|
||||
can pin the fanout channels of a MUX on bus 3 to start at 30. So 30 will be the
|
||||
logical bus number of the channel 0 of the MUX on bus 3, and 37 will be the
|
||||
logical bus number of the channel 7 of the MUX on bus 3.
|
||||
|
||||
I2C Devices
|
||||
===========
|
||||
|
||||
In previous sections, we mostly covered the I2C bus. In this section, let us see
|
||||
what we can learn from the I2C device directory whose link name is in the format
|
||||
of ``${bus}-${addr}``. The ``${bus}`` part in the name is a logical I2C bus
|
||||
decimal number, while the ``${addr}`` part is a hex number of the I2C address
|
||||
of each device.
|
||||
|
||||
I2C Device Directory Content
|
||||
----------------------------
|
||||
|
||||
Inside each I2C device directory, there is a file named ``name``.
|
||||
This file tells what device name it was used for the kernel driver to
|
||||
probe this device. Use command ``cat`` to read its content. For example::
|
||||
|
||||
/sys/bus/i2c/devices/i2c-73$ cat 73-0040/name
|
||||
ina230
|
||||
/sys/bus/i2c/devices/i2c-73$ cat 73-0070/name
|
||||
pca9546
|
||||
/sys/bus/i2c/devices/i2c-73$ cat 73-0072/name
|
||||
pca9547
|
||||
|
||||
There is a symbolic link named ``driver`` to tell what Linux kernel driver was
|
||||
used to probe this device::
|
||||
|
||||
/sys/bus/i2c/devices/i2c-73$ readlink -f 73-0040/driver
|
||||
/sys/bus/i2c/drivers/ina2xx
|
||||
/sys/bus/i2c/devices/i2c-73$ readlink -f 73-0072/driver
|
||||
/sys/bus/i2c/drivers/pca954x
|
||||
|
||||
But if the link ``driver`` does not exist at the first place,
|
||||
it may mean that the kernel driver failed to probe this device due to
|
||||
some errors. The error may be found in ``dmesg``::
|
||||
|
||||
/sys/bus/i2c/devices/i2c-73$ ls 73-0070/driver
|
||||
ls: 73-0070/driver: No such file or directory
|
||||
/sys/bus/i2c/devices/i2c-73$ dmesg | grep 73-0070
|
||||
pca954x 73-0070: probe failed
|
||||
pca954x 73-0070: probe failed
|
||||
|
||||
Depending on what the I2C device is and what kernel driver was used to probe the
|
||||
device, we may have different content in the device directory.
|
||||
|
||||
I2C MUX Device
|
||||
--------------
|
||||
|
||||
While you may be already aware of this in previous sections, an I2C MUX device
|
||||
will have symbolic link ``channel-*`` inside its device directory.
|
||||
These symbolic links point to their logical I2C bus directories::
|
||||
|
||||
/sys/bus/i2c/devices/i2c-73$ ls -l 73-0072/channel-*
|
||||
lrwxrwxrwx ... 73-0072/channel-0 -> ../i2c-78
|
||||
lrwxrwxrwx ... 73-0072/channel-1 -> ../i2c-79
|
||||
lrwxrwxrwx ... 73-0072/channel-2 -> ../i2c-80
|
||||
lrwxrwxrwx ... 73-0072/channel-3 -> ../i2c-81
|
||||
lrwxrwxrwx ... 73-0072/channel-4 -> ../i2c-82
|
||||
lrwxrwxrwx ... 73-0072/channel-5 -> ../i2c-83
|
||||
lrwxrwxrwx ... 73-0072/channel-6 -> ../i2c-84
|
||||
lrwxrwxrwx ... 73-0072/channel-7 -> ../i2c-85
|
||||
|
||||
I2C Sensor Device / Hwmon
|
||||
-------------------------
|
||||
|
||||
I2C sensor device is also common to see. If they are bound by a kernel hwmon
|
||||
(Hardware Monitoring) driver successfully, you will see a ``hwmon`` directory
|
||||
inside the I2C device directory. Keep digging into it, you will find the Hwmon
|
||||
Sysfs for the I2C sensor device::
|
||||
|
||||
/sys/bus/i2c/devices/i2c-73/73-0040/hwmon/hwmon17$ ls
|
||||
curr1_input in0_lcrit_alarm name subsystem
|
||||
device in1_crit power uevent
|
||||
in0_crit in1_crit_alarm power1_crit update_interval
|
||||
in0_crit_alarm in1_input power1_crit_alarm
|
||||
in0_input in1_lcrit power1_input
|
||||
in0_lcrit in1_lcrit_alarm shunt_resistor
|
||||
|
||||
For more info on the Hwmon Sysfs, refer to the doc:
|
||||
|
||||
`Naming and data format standards for sysfs files
|
||||
<../hwmon/sysfs-interface.rst>`_
|
||||
|
||||
Instantiate I2C Devices in I2C Sysfs
|
||||
------------------------------------
|
||||
|
||||
Refer to the doc:
|
||||
|
||||
`How to instantiate I2C devices, Method 4: Instantiate from user-space
|
||||
<instantiating-devices.rst#method-4-instantiate-from-user-space>`_
|
||||
+8
-5
@@ -13494,7 +13494,7 @@ M: Vignesh R <vigneshr@ti.com>
|
||||
L: linux-omap@vger.kernel.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/devicetree/bindings/i2c/i2c-omap.txt
|
||||
F: Documentation/devicetree/bindings/i2c/ti,omap4-i2c.yaml
|
||||
F: drivers/i2c/busses/i2c-omap.c
|
||||
|
||||
OMAP IMAGING SUBSYSTEM (OMAP3 ISP and OMAP4 ISS)
|
||||
@@ -15722,8 +15722,9 @@ F: drivers/clk/renesas/
|
||||
|
||||
RENESAS EMEV2 I2C DRIVER
|
||||
M: Wolfram Sang <wsa+renesas@sang-engineering.com>
|
||||
L: linux-renesas-soc@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/i2c/renesas,iic-emev2.txt
|
||||
F: Documentation/devicetree/bindings/i2c/renesas,iic-emev2.yaml
|
||||
F: drivers/i2c/busses/i2c-emev2.c
|
||||
|
||||
RENESAS ETHERNET DRIVERS
|
||||
@@ -15743,9 +15744,10 @@ F: drivers/iio/adc/rcar-gyroadc.c
|
||||
|
||||
RENESAS R-CAR I2C DRIVERS
|
||||
M: Wolfram Sang <wsa+renesas@sang-engineering.com>
|
||||
L: linux-renesas-soc@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/i2c/renesas,i2c.txt
|
||||
F: Documentation/devicetree/bindings/i2c/renesas,iic.txt
|
||||
F: Documentation/devicetree/bindings/i2c/renesas,rcar-i2c.yaml
|
||||
F: Documentation/devicetree/bindings/i2c/renesas,rmobile-iic.yaml
|
||||
F: drivers/i2c/busses/i2c-rcar.c
|
||||
F: drivers/i2c/busses/i2c-sh_mobile.c
|
||||
|
||||
@@ -15760,8 +15762,9 @@ F: drivers/thermal/rcar_thermal.c
|
||||
|
||||
RENESAS RIIC DRIVER
|
||||
M: Chris Brandt <chris.brandt@renesas.com>
|
||||
L: linux-renesas-soc@vger.kernel.org
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/i2c/renesas,riic.txt
|
||||
F: Documentation/devicetree/bindings/i2c/renesas,riic.yaml
|
||||
F: drivers/i2c/busses/i2c-riic.c
|
||||
|
||||
RENESAS USB PHY DRIVER
|
||||
|
||||
@@ -508,6 +508,11 @@ static void ali1535_remove(struct pci_dev *dev)
|
||||
{
|
||||
i2c_del_adapter(&ali1535_adapter);
|
||||
release_region(ali1535_smba, ALI1535_SMB_IOSIZE);
|
||||
|
||||
/*
|
||||
* do not call pci_disable_device(dev) since it can cause hard hangs on
|
||||
* some systems during power-off
|
||||
*/
|
||||
}
|
||||
|
||||
static struct pci_driver ali1535_driver = {
|
||||
|
||||
@@ -727,10 +727,14 @@ static void __aspeed_i2c_reg_slave(struct aspeed_i2c_bus *bus, u16 slave_addr)
|
||||
{
|
||||
u32 addr_reg_val, func_ctrl_reg_val;
|
||||
|
||||
/* Set slave addr. */
|
||||
addr_reg_val = readl(bus->base + ASPEED_I2C_DEV_ADDR_REG);
|
||||
addr_reg_val &= ~ASPEED_I2CD_DEV_ADDR_MASK;
|
||||
addr_reg_val |= slave_addr & ASPEED_I2CD_DEV_ADDR_MASK;
|
||||
/*
|
||||
* Set slave addr. Reserved bits can all safely be written with zeros
|
||||
* on all of ast2[456]00, so zero everything else to ensure we only
|
||||
* enable a single slave address (ast2500 has two, ast2600 has three,
|
||||
* the enable bits for which are also in this register) so that we don't
|
||||
* end up with additional phantom devices responding on the bus.
|
||||
*/
|
||||
addr_reg_val = slave_addr & ASPEED_I2CD_DEV_ADDR_MASK;
|
||||
writel(addr_reg_val, bus->base + ASPEED_I2C_DEV_ADDR_REG);
|
||||
|
||||
/* Turn on slave mode. */
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user