From ac7c49b114c3b1b68ffaec3517d6c0806f20793b Mon Sep 17 00:00:00 2001 From: Kevin Kim Date: Tue, 8 Jan 2019 11:40:18 +0900 Subject: [PATCH] ODROID-N2/C4: Amlogic i2c master pinctrl for odroid. Change-Id: I3a1a931769104de99f87e013a0e488304fdf2c38 --- .../boot/dts/amlogic/meson64_odroidn2.dts | 3 +- .../dts/amlogic/mesong12_odroid_common.dtsi | 19 ++++++++++- .../dts/amlogic/mesonsm1_odroid_common.dtsi | 33 ++++++++++++++++++- drivers/amlogic/i2c/i2c-meson-master.c | 30 +++++++++++++++++ 4 files changed, 82 insertions(+), 3 deletions(-) diff --git a/arch/arm64/boot/dts/amlogic/meson64_odroidn2.dts b/arch/arm64/boot/dts/amlogic/meson64_odroidn2.dts index 1e67b70eeef4..32f06a117418 100644 --- a/arch/arm64/boot/dts/amlogic/meson64_odroidn2.dts +++ b/arch/arm64/boot/dts/amlogic/meson64_odroidn2.dts @@ -572,9 +572,10 @@ &i2c2 { status = "okay"; - pinctrl-names = "default"; + pinctrl-names = "default","gpio_periphs"; /* 40 Pin Header : SDA(GPIOX.17->3 Pin), SCL(GPIOX.18->5 Pin) */ pinctrl-0 = <&i2c2_master_pins1>; + pinctrl-1 = <&i2c2_to_gpiox>; /* default 400k */ clock-frequency = <400000>; }; diff --git a/arch/arm64/boot/dts/amlogic/mesong12_odroid_common.dtsi b/arch/arm64/boot/dts/amlogic/mesong12_odroid_common.dtsi index 72a8bbf9acca..9eaa2b00dacf 100644 --- a/arch/arm64/boot/dts/amlogic/mesong12_odroid_common.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesong12_odroid_common.dtsi @@ -312,8 +312,9 @@ &i2c3 { status = "okay"; - pinctrl-names = "default"; + pinctrl-names = "default","gpio_periphs"; pinctrl-0 = <&i2c3_master_pins2>; + pinctrl-1 = <&i2c3_to_gpioa>; clock-frequency = <100000>; /* default 100k */ pcf8563: rtc@51 { @@ -527,11 +528,27 @@ drive-strength = <2>; }; }; + i2c2_to_gpiox:i2c2_gpiox { + mux { + groups = "GPIOX_17", + "GPIOX_18"; + function = "gpio_periphs"; + drive-strength = <3>; + }; + }; i2c3_master_pins2:i2c3_pins2 { mux { drive-strength = <3>; }; }; + i2c3_to_gpioa:i2c3_gpioa { + mux { + groups = "GPIOA_14", + "GPIOA_15"; + function = "gpio_periphs"; + drive-strength = <3>; + }; + }; spdifout: spdifout { mux {/* GPIOA_11 */ groups = "spdif_out_a11"; diff --git a/arch/arm64/boot/dts/amlogic/mesonsm1_odroid_common.dtsi b/arch/arm64/boot/dts/amlogic/mesonsm1_odroid_common.dtsi index e2144fcfb492..21011751d834 100644 --- a/arch/arm64/boot/dts/amlogic/mesonsm1_odroid_common.dtsi +++ b/arch/arm64/boot/dts/amlogic/mesonsm1_odroid_common.dtsi @@ -161,8 +161,17 @@ &i2c2 { status = "okay"; - pinctrl-names = "default"; + pinctrl-names = "default","gpio_periphs"; pinctrl-0 = <&i2c2_master_pins1>; + pinctrl-1 = <&i2c2_to_gpiox>; + clock-frequency = <100000>; /* default 100k */ +}; + +&i2c3 { + status = "okay"; + pinctrl-names = "default","gpio_periphs"; + pinctrl-0 = <&i2c3_master_pins2>; + pinctrl-1 = <&i2c3_to_gpioa>; clock-frequency = <100000>; /* default 100k */ }; @@ -219,11 +228,33 @@ }; &pinctrl_periphs { + i2c2_master_pins1: i2c2_pins1 { + mux { + drive-strength = <3>; + }; + }; + i2c2_to_gpiox:i2c2_gpiox { + mux { + groups = "GPIOX_17", + "GPIOX_18"; + function = "gpio_periphs"; + drive-strength = <3>; + }; + }; i2c3_master_pins2:i2c3_pins2 { mux { drive-strength = <3>; }; }; + i2c3_to_gpioa:i2c3_gpioa { + mux { + groups = "GPIOA_14", + "GPIOA_15"; + function = "gpio_periphs"; + drive-strength = <3>; + }; + }; + pwmcd_to_gpios:pwmcd_gpio { mux { groups = "GPIOX_5", "GPIOX_6"; diff --git a/drivers/amlogic/i2c/i2c-meson-master.c b/drivers/amlogic/i2c/i2c-meson-master.c index 6d111982d4b5..8bd7d4797ed5 100644 --- a/drivers/amlogic/i2c/i2c-meson-master.c +++ b/drivers/amlogic/i2c/i2c-meson-master.c @@ -26,6 +26,9 @@ #include #include #include +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) +#include +#endif /* Meson I2C register map */ #define REG_CTRL 0x00 @@ -116,6 +119,9 @@ struct meson_i2c { int retain_fastmode; struct meson_i2c_data *data; +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + struct pinctrl *pinctrl; +#endif }; static void meson_i2c_set_mask(struct meson_i2c *i2c, int reg, u32 mask, @@ -558,6 +564,10 @@ static int meson_i2c_probe(struct platform_device *pdev) i2c->dev = &pdev->dev; platform_set_drvdata(pdev, i2c); +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + i2c->pinctrl = NULL; +#endif + spin_lock_init(&i2c->lock); init_completion(&i2c->done); @@ -594,6 +604,14 @@ static int meson_i2c_probe(struct platform_device *pdev) return ret; } +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + i2c->pinctrl = devm_pinctrl_get_select(&pdev->dev, "default"); + if (IS_ERR(i2c->pinctrl)) { + i2c->pinctrl = NULL; + dev_err(&pdev->dev, "i2c pinmux : can't get i2c_pins\n"); + } +#endif + strlcpy(i2c->adap.name, "Meson I2C adapter", sizeof(i2c->adap.name)); i2c->adap.owner = THIS_MODULE; @@ -631,6 +649,18 @@ static int meson_i2c_remove(struct platform_device *pdev) { struct meson_i2c *i2c = platform_get_drvdata(pdev); +#if defined(CONFIG_ARCH_MESON64_ODROID_COMMON) + struct device *dev = &pdev->dev; + + sysfs_remove_file(&dev->kobj, &dev_attr_speed.attr); + + if (i2c->pinctrl) + devm_pinctrl_put(i2c->pinctrl); + + i2c->pinctrl = devm_pinctrl_get_select(&pdev->dev, "gpio_periphs"); + devm_pinctrl_put(i2c->pinctrl); + i2c->pinctrl = NULL; +#endif i2c_del_adapter(&i2c->adap); clk_unprepare(i2c->clk);