From ae8733d2f92ff3fa2688ab0935b161c6b2ed4208 Mon Sep 17 00:00:00 2001 From: Jian Hu Date: Wed, 27 Nov 2019 20:01:32 +0800 Subject: [PATCH] i2c: meson: add suspend/resume to set gpio status [1/1] PD#SWPL-17544 Problem: it will cause Current reverse irrigation if the gpio to i2c function when the system is in STR mode Solution: keep the gpio to sleep mode to protect to slave device there are two sleep mode for i2c pins, and it depends the pull up power. we can choose the exact sleep mode. 1)pull up power is on, set the sleep mode to input 2)pull up power if off, set low the gpio Verify: verified on x301 Change-Id: Ie62f70449be2ff2cef7e3ab5c918ac379d861ca1 Signed-off-by: Jian Hu --- arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts | 35 +++++++++++++++-- arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts | 15 ++++--- arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts | 39 +++++++++++++++++-- .../boot/dts/amlogic/tl1_t962x2_x301_1g.dts | 15 ++++--- .../boot/dts/amlogic/sm1_s905d3_ac202_1g.dts | 27 +++++++++++++ .../boot/dts/amlogic/tl1_t962x2_t309.dts | 21 +++++----- .../boot/dts/amlogic/tl1_t962x2_x301_1g.dts | 15 ++++--- .../boot/dts/amlogic/tl1_t962x2_x301_2g.dts | 15 ++++--- drivers/amlogic/i2c/i2c-meson-master.c | 19 +++++++++ 9 files changed, 160 insertions(+), 41 deletions(-) diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts index 0707d50e38be..b73540e3b408 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_skt.dts @@ -921,8 +921,9 @@ &i2c0 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c0_dv_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c0_dv_pins>; + pinctrl-1 = <&i2c0_dv_pins_slp_input>; }; &audiobus { @@ -1296,8 +1297,9 @@ &i2c2 { status = "okay"; - pinctrl-names="default"; - pinctrl-0=<&i2c2_z_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c2_z_pins>; + pinctrl-1 = <&i2c2_z_pins_slp_input>; clock-frequency = <400000>; tas5805: tas5805@36 { @@ -1482,6 +1484,31 @@ &pwm_ab { status = "okay"; + clock-frequency = <300000>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c1_h_pins>; + pinctrl-1 = <&i2c1_h_pins_slp_input>; + + lcd_extern_i2c0: lcd_extern_i2c@0 { + compatible = "lcd_ext, i2c"; + dev_name = "i2c_T5800Q"; + reg = <0x1c>; + status = "okay"; + }; + + lcd_extern_i2c1: lcd_extern_i2c@1 { + compatible = "lcd_ext, i2c"; + dev_name = "i2c_ANX6862"; + reg = <0x20>; + status = "okay"; + }; + + lcd_extern_i2c2: lcd_extern_i2c@2 { + compatible = "lcd_ext, i2c"; + dev_name = "i2c_ANX7911"; + reg = <0x74>; + status = "okay"; + }; }; &efuse { diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts index 8747e2a5e010..7f6f13003e45 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_t309.dts @@ -1237,8 +1237,9 @@ &i2c0 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c0_dv_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c0_dv_pins>; + pinctrl-1 = <&i2c0_dv_pins_slp_input>; }; &audiobus { @@ -1589,8 +1590,9 @@ &i2c2 { status = "okay"; - pinctrl-names="default"; - pinctrl-0=<&i2c2_z_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c2_z_pins>; + pinctrl-1 = <&i2c2_z_pins_slp_input>; clock-frequency = <400000>; ad82584f: ad82584f@62 { @@ -1758,8 +1760,9 @@ &i2c1 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c1_h_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c1_h_pins>; + pinctrl-1 = <&i2c1_h_pins_slp_input>; lcd_extern_i2c0: lcd_extern_i2c@0 { compatible = "lcd_ext, i2c"; diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts index efb0b131a7be..c639af3fd9cc 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301.dts @@ -925,8 +925,9 @@ &i2c0 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c0_dv_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c0_dv_pins>; + pinctrl-1 = <&i2c0_dv_pins_slp_input>; }; &audiobus { @@ -1277,8 +1278,9 @@ &i2c2 { status = "okay"; - pinctrl-names="default"; - pinctrl-0=<&i2c2_z_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c2_z_pins>; + pinctrl-1 = <&i2c2_z_pins_slp_input>; clock-frequency = <400000>; tas5805: tas5805@36 { @@ -1478,6 +1480,35 @@ status = "okay"; }; +&i2c1 { + status = "okay"; + clock-frequency = <300000>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c1_h_pins>; + pinctrl-1 = <&i2c1_h_pins_slp_input>; + + lcd_extern_i2c0: lcd_extern_i2c@0 { + compatible = "lcd_ext, i2c"; + dev_name = "i2c_T5800Q"; + reg = <0x1c>; + status = "okay"; + }; + + lcd_extern_i2c1: lcd_extern_i2c@1 { + compatible = "lcd_ext, i2c"; + dev_name = "i2c_ANX6862"; + reg = <0x20>; + status = "okay"; + }; + + lcd_extern_i2c2: lcd_extern_i2c@2 { + compatible = "lcd_ext, i2c"; + dev_name = "i2c_ANX7911"; + reg = <0x74>; + status = "okay"; + }; +}; + &pwm_ab { status = "okay"; }; diff --git a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts index a0d603ef85d8..9f27260ed76f 100644 --- a/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts +++ b/arch/arm/boot/dts/amlogic/tl1_t962x2_x301_1g.dts @@ -1506,8 +1506,9 @@ &i2c0 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c0_dv_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c0_dv_pins>; + pinctrl-1 = <&i2c0_dv_pins_slp_input>; }; &audiobus { @@ -1893,8 +1894,9 @@ &i2c2 { status = "okay"; - pinctrl-names="default"; - pinctrl-0=<&i2c2_z_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c2_z_pins>; + pinctrl-1 = <&i2c2_z_pins_slp_input>; clock-frequency = <400000>; tas5805: tas5805@36 { @@ -2070,8 +2072,9 @@ &i2c1 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c1_h_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c1_h_pins>; + pinctrl-1 = <&i2c1_h_pins_slp_input>; lcd_extern_i2c0: lcd_extern_i2c@0 { compatible = "lcd_ext, i2c"; diff --git a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202_1g.dts b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202_1g.dts index 09e82ba38643..492598d5957a 100644 --- a/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202_1g.dts +++ b/arch/arm64/boot/dts/amlogic/sm1_s905d3_ac202_1g.dts @@ -1880,4 +1880,31 @@ &dvfs800_cfg &dvfs800_cfg>; }; +&i2c1 { + status = "okay"; + clock-frequency = <300000>; + pinctrl-names="default"; + pinctrl-0=<&i2c1_h_pins>; + + lcd_extern_i2c0: lcd_extern_i2c@0 { + compatible = "lcd_ext, i2c"; + dev_name = "i2c_T5800Q"; + reg = <0x1c>; + status = "okay"; + }; + + lcd_extern_i2c1: lcd_extern_i2c@1 { + compatible = "lcd_ext, i2c"; + dev_name = "i2c_ANX6862"; + reg = <0x20>; + status = "okay"; + }; + + lcd_extern_i2c2: lcd_extern_i2c@2 { + compatible = "lcd_ext, i2c"; + dev_name = "i2c_ANX7911"; + reg = <0x74>; + status = "okay"; + }; +}; diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts index 31fd0afcc3d0..f754a3073b8d 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_t309.dts @@ -1428,8 +1428,9 @@ &i2c0 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c0_dv_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c0_dv_pins>; + pinctrl-1 = <&i2c0_dv_pins_slp_input>; }; &audiobus { @@ -1781,8 +1782,9 @@ &i2c2 { status = "okay"; - pinctrl-names="default"; - pinctrl-0=<&i2c2_z_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c2_z_pins>; + pinctrl-1 = <&i2c2_z_pins_slp_input>; clock-frequency = <400000>; tas5805: tas5805@36 { @@ -1959,27 +1961,28 @@ &i2c1 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c1_h_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c1_h_pins>; + pinctrl-1 = <&i2c1_h_pins_slp_input>; lcd_extern_i2c0: lcd_extern_i2c@0 { compatible = "lcd_ext, i2c"; dev_name = "i2c_T5800Q"; - reg = <0x0 0x1c>; + reg = <0x1c>; status = "okay"; }; lcd_extern_i2c1: lcd_extern_i2c@1 { compatible = "lcd_ext, i2c"; dev_name = "i2c_ANX6862"; - reg = <0x0 0x20>; + reg = <0x20>; status = "okay"; }; lcd_extern_i2c2: lcd_extern_i2c@2 { compatible = "lcd_ext, i2c"; dev_name = "i2c_ANX7911"; - reg = <0x0 0x74>; + reg = <0x74>; status = "okay"; }; }; diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts index 72ec3751e5b3..30d8a299f5c2 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_1g.dts @@ -1313,8 +1313,9 @@ &i2c0 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c0_dv_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c0_dv_pins>; + pinctrl-1 = <&i2c0_dv_pins_slp_input>; }; &audiobus { @@ -1665,8 +1666,9 @@ &i2c2 { status = "okay"; - pinctrl-names="default"; - pinctrl-0=<&i2c2_z_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c2_z_pins>; + pinctrl-1 = <&i2c2_z_pins_slp_input>; clock-frequency = <400000>; tas5805: tas5805@36 { @@ -1842,8 +1844,9 @@ &i2c1 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c1_h_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c1_h_pins>; + pinctrl-1 = <&i2c1_h_pins_slp_input>; lcd_extern_i2c0: lcd_extern_i2c@0 { compatible = "lcd_ext, i2c"; diff --git a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts index b0c41429a6c9..c84f3d484537 100644 --- a/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts +++ b/arch/arm64/boot/dts/amlogic/tl1_t962x2_x301_2g.dts @@ -1307,8 +1307,9 @@ &i2c0 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c0_dv_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c0_dv_pins>; + pinctrl-1 = <&i2c0_dv_pins_slp_input>; }; &audiobus { @@ -1660,8 +1661,9 @@ &i2c2 { status = "okay"; - pinctrl-names="default"; - pinctrl-0=<&i2c2_z_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c2_z_pins>; + pinctrl-1 = <&i2c2_z_pins_slp_input>; clock-frequency = <400000>; tas5805: tas5805@36 { @@ -1837,8 +1839,9 @@ &i2c1 { status = "okay"; clock-frequency = <300000>; - pinctrl-names="default"; - pinctrl-0=<&i2c1_h_pins>; + pinctrl-names = "default", "sleep"; + pinctrl-0 = <&i2c1_h_pins>; + pinctrl-1 = <&i2c1_h_pins_slp_input>; lcd_extern_i2c0: lcd_extern_i2c@0 { compatible = "lcd_ext, i2c"; diff --git a/drivers/amlogic/i2c/i2c-meson-master.c b/drivers/amlogic/i2c/i2c-meson-master.c index 8bd7d4797ed5..f91bfcf8d93d 100644 --- a/drivers/amlogic/i2c/i2c-meson-master.c +++ b/drivers/amlogic/i2c/i2c-meson-master.c @@ -667,6 +667,24 @@ static int meson_i2c_remove(struct platform_device *pdev) return 0; } +static int __maybe_unused meson_i2c_resume(struct device *dev) +{ + pinctrl_pm_select_default_state(dev); + + return 0; +} + +static int __maybe_unused meson_i2c_suspend(struct device *dev) +{ + pinctrl_pm_select_sleep_state(dev); + + return 0; +} + +static const struct dev_pm_ops meson_i2c_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(meson_i2c_suspend, meson_i2c_resume) +}; + static const struct meson_i2c_data i2c_meson6_data = { .div_factor = 4, .delay_ajust = 15, @@ -727,6 +745,7 @@ static struct platform_driver meson_i2c_driver = { .remove = meson_i2c_remove, .driver = { .name = "meson-i2c", + .pm = &meson_i2c_pm_ops, .of_match_table = meson_i2c_match, }, };