From patchwork Thu Oct 30 08:04:29 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pankaj Dubey X-Patchwork-Id: 5194551 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id AF0F7C11AC for ; Thu, 30 Oct 2014 08:14:25 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id BF5C820266 for ; Thu, 30 Oct 2014 08:14:20 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher DHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id E4ED720173 for ; Thu, 30 Oct 2014 08:14:15 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xjkph-0006JW-KD; Thu, 30 Oct 2014 08:11:49 +0000 Received: from mailout2.samsung.com ([203.254.224.25]) by bombadil.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1Xjkpd-0006Ey-V5 for linux-arm-kernel@lists.infradead.org; Thu, 30 Oct 2014 08:11:47 +0000 Received: from epcpsbgr2.samsung.com (u142.gpu120.samsung.co.kr [203.254.230.142]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NE900DFA02Q1S30@mailout2.samsung.com> for linux-arm-kernel@lists.infradead.org; Thu, 30 Oct 2014 17:11:14 +0900 (KST) Received: from epcpsbgm1.samsung.com ( [172.20.52.123]) by epcpsbgr2.samsung.com (EPCPMTA) with SMTP id 0F.22.11124.2A2F1545; Thu, 30 Oct 2014 17:11:14 +0900 (KST) X-AuditID: cbfee68e-f79b46d000002b74-91-5451f2a289da Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm1.samsung.com (EPCPMTA) with SMTP id 00.E7.20081.2A2F1545; Thu, 30 Oct 2014 17:11:14 +0900 (KST) Received: from chromebld-server.sisodomain.com ([107.108.73.106]) by mmp2.samsung.com (Oracle Communications Messaging Server 7u4-24.01(7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTPA id <0NE900A3D00QTAK1@mmp2.samsung.com>; Thu, 30 Oct 2014 17:11:14 +0900 (KST) From: Pankaj Dubey To: linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org Subject: [PATCH v4 1/2] i2c: s3c2410: Handle i2c sys_cfg register in i2c driver Date: Thu, 30 Oct 2014 13:34:29 +0530 Message-id: <1414656270-8048-2-git-send-email-pankaj.dubey@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1414656270-8048-1-git-send-email-pankaj.dubey@samsung.com> References: <1414656270-8048-1-git-send-email-pankaj.dubey@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFvrFLMWRmVeSWpSXmKPExsWyRsSkWnfRp8AQg19r5SzmHznHatG74Cqb xabH11gtFrYtYbHo+PuF0WLG+X1MFrcv81os2vqF3eLtneksFq17j7BbdCxjtFh5YhazA49H S3MPm8fmFVoem1Z1AhlL6j36tqxi9Dh56gmLx+dNcgHsUVw2Kak5mWWpRfp2CVwZM1b/Yyz4 alhxuWMiUwPjDY0uRk4OCQETiX9n/rFB2GISF+6tB7K5OIQEljJKfJo0hR2m6NeW3SwQiemM Eu1LdrNCOBOYJE48ucwKUsUmoCvx5P1c5i5GDg4RAW+J5dcUQWqYBbYySdxc+JYZpEZYwF/i fWMn2DoWAVWJZ59XMIHYvALuElvmL2IB6ZUQUJCYM8kGJMwp4CHxdCPEdUJAJS8uN7ODzJQQ OMUucf/jLmaIOQIS3yYfguqVldh0gBniaEmJgytusExgFF7AyLCKUTS1ILmgOCm9yEivODG3 uDQvXS85P3cTIzBKTv971reD8eYB60OMAhyMSjy8GicCQ4RYE8uKK3MPMZoCbZjILCWanA+M xbySeENjMyMLUxNTYyNzSzMlcd4EqZ/BQgLpiSWp2ampBalF8UWlOanFhxiZODilGhirDA71 75GQmhq0TV54bUfK3niZ+39vLlPzW72nJk5G6Yz/enONlSfMu/Y6Gd90nxI2l9Uru8Gvcm/T iRLr22enKLEnSE5MlD2wOO1C0UHOlt/PN85RP+OlW/SUM92JwYfnhk3A+6SXCi98bxRUvN+1 I6PEew7vD6OahXFu27xnHOJJ7XlWIavEUpyRaKjFXFScCABytcZejQIAAA== X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrCIsWRmVeSWpSXmKPExsVy+t9jQd1FnwJDDKY/EbaYf+Qcq0Xvgqts FpseX2O1WNi2hMWi4+8XRosZ5/cxWdy+zGuxaOsXdou3d6azWLTuPcJu0bGM0WLliVnMDjwe Lc09bB6bV2h5bFrVCWQsqffo27KK0ePkqScsHp83yQWwRzUw2mSkJqakFimk5iXnp2Tmpdsq eQfHO8ebmhkY6hpaWpgrKeQl5qbaKrn4BOi6ZeYAnamkUJaYUwoUCkgsLlbSt8M0ITTETdcC pjFC1zckCK7HyAANJKxhzJix+h9jwVfDissdE5kaGG9odDFyckgImEj82rKbBcIWk7hwbz1b FyMXh5DAdEaJ9iW7WSGcCUwSJ55cZgWpYhPQlXjyfi5zFyMHh4iAt8Tya4ogNcwCW5kkbi58 ywxSIyzgL/G+sZMNxGYRUJV49nkFE4jNK+AusWX+IhaQXgkBBYk5k2xAwpwCHhJPN/4DKxcC KnlxuZl9AiPvAkaGVYyiqQXJBcVJ6bmGesWJucWleel6yfm5mxjBMfhMagfjygaLQ4wCHIxK PLwaJwJDhFgTy4orcw8xSnAwK4nwJl4GCvGmJFZWpRblxxeV5qQWH2I0BTpqIrOUaHI+MD3k lcQbGpuYmxqbWppYmJhZKonzHmi1DhQSSE8sSc1OTS1ILYLpY+LglGpgVOvMYvLtS9Rcb/ZH VPTbevbMTNOO7g+5NW9nlc+ccLeFdfn9OUkcuWluPMejH09an//0Q3NviVrorPSfm/5M/24z 7R/b4U0Rf+0OdO56oC/AHtH3+WbH852ef7R+XJ982KLIpmt/8qM9nimbzp8/2MF/OC0+ZYvk VMOMeRuWC7a3W+moRIrfU2Ipzkg01GIuKk4EAAOrZlfXAgAA DLP-Filter: Pass X-MTR: 20000000000000000@CPGS X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20141030_011146_221677_9754BC97 X-CRM114-Status: GOOD ( 15.81 ) X-Spam-Score: -5.6 (-----) Cc: devicetree@vger.kernel.org, kgene.kim@samsung.com, linux@arm.linux.org.uk, Wolfram Sang , Pankaj Dubey , Randy Dunlap , linux-doc@vger.kernel.org, Rob Herring , thomas.ab@samsung.com, linux-i2c@vger.kernel.org X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , MIME-Version: 1.0 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Spam-Status: No, score=-2.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Let's handle i2c interrupt re-configuration in i2c driver. This will help us in removing some soc specific checks from machine files and will help in removing static iomapping of SYS register in exynos.c Since only Exynos5250, and Exynos5420 has i2c nodes in DT, added syscon based phandle to i2c device nodes of respective SoC DT files. Also handle saving and restoring of SYS_I2C_CFG register during suspend and resume of i2c driver. CC: Rob Herring CC: Randy Dunlap CC: Wolfram Sang CC: Russell King CC: devicetree@vger.kernel.org CC: linux-doc@vger.kernel.org CC: linux-i2c@vger.kernel.org Signed-off-by: Pankaj Dubey --- .../devicetree/bindings/i2c/i2c-s3c2410.txt | 1 + arch/arm/boot/dts/exynos5250.dtsi | 4 +++ arch/arm/boot/dts/exynos5420.dtsi | 4 +++ drivers/i2c/busses/i2c-s3c2410.c | 31 ++++++++++++++++++++ 4 files changed, 40 insertions(+) diff --git a/Documentation/devicetree/bindings/i2c/i2c-s3c2410.txt b/Documentation/devicetree/bindings/i2c/i2c-s3c2410.txt index 278de8e..89b3250 100644 --- a/Documentation/devicetree/bindings/i2c/i2c-s3c2410.txt +++ b/Documentation/devicetree/bindings/i2c/i2c-s3c2410.txt @@ -32,6 +32,7 @@ Optional properties: specified, default value is 0. - samsung,i2c-max-bus-freq: Desired frequency in Hz of the bus. If not specified, the default value in Hz is 100000. + - samsung,sysreg-phandle - handle to syscon used to control the system registers Example: diff --git a/arch/arm/boot/dts/exynos5250.dtsi b/arch/arm/boot/dts/exynos5250.dtsi index 012b021..6a32d50 100644 --- a/arch/arm/boot/dts/exynos5250.dtsi +++ b/arch/arm/boot/dts/exynos5250.dtsi @@ -293,6 +293,7 @@ clock-names = "i2c"; pinctrl-names = "default"; pinctrl-0 = <&i2c0_bus>; + samsung,sysreg-phandle = <&sysreg_system_controller>; status = "disabled"; }; @@ -306,6 +307,7 @@ clock-names = "i2c"; pinctrl-names = "default"; pinctrl-0 = <&i2c1_bus>; + samsung,sysreg-phandle = <&sysreg_system_controller>; status = "disabled"; }; @@ -319,6 +321,7 @@ clock-names = "i2c"; pinctrl-names = "default"; pinctrl-0 = <&i2c2_bus>; + samsung,sysreg-phandle = <&sysreg_system_controller>; status = "disabled"; }; @@ -332,6 +335,7 @@ clock-names = "i2c"; pinctrl-names = "default"; pinctrl-0 = <&i2c3_bus>; + samsung,sysreg-phandle = <&sysreg_system_controller>; status = "disabled"; }; diff --git a/arch/arm/boot/dts/exynos5420.dtsi b/arch/arm/boot/dts/exynos5420.dtsi index 8617a03..90bf401 100644 --- a/arch/arm/boot/dts/exynos5420.dtsi +++ b/arch/arm/boot/dts/exynos5420.dtsi @@ -560,6 +560,7 @@ clock-names = "i2c"; pinctrl-names = "default"; pinctrl-0 = <&i2c0_bus>; + samsung,sysreg-phandle = <&sysreg_system_controller>; status = "disabled"; }; @@ -573,6 +574,7 @@ clock-names = "i2c"; pinctrl-names = "default"; pinctrl-0 = <&i2c1_bus>; + samsung,sysreg-phandle = <&sysreg_system_controller>; status = "disabled"; }; @@ -586,6 +588,7 @@ clock-names = "i2c"; pinctrl-names = "default"; pinctrl-0 = <&i2c2_bus>; + samsung,sysreg-phandle = <&sysreg_system_controller>; status = "disabled"; }; @@ -599,6 +602,7 @@ clock-names = "i2c"; pinctrl-names = "default"; pinctrl-0 = <&i2c3_bus>; + samsung,sysreg-phandle = <&sysreg_system_controller>; status = "disabled"; }; diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c index e3b0337..a46435a 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -39,6 +39,8 @@ #include #include #include +#include +#include #include @@ -91,6 +93,9 @@ /* Max time to wait for bus to become idle after a xfer (in us) */ #define S3C2410_IDLE_TIMEOUT 5000 +/* Exynos5 Sysreg offset */ +#define EXYNOS5_SYS_I2C_CFG 0x0234 + /* i2c controller state */ enum s3c24xx_i2c_state { STATE_IDLE, @@ -127,6 +132,8 @@ struct s3c24xx_i2c { #if defined(CONFIG_ARM_S3C24XX_CPUFREQ) struct notifier_block freq_transition; #endif + struct regmap *sysreg; + unsigned int sys_i2c_cfg; }; static struct platform_device_id s3c24xx_driver_ids[] = { @@ -1075,6 +1082,7 @@ static void s3c24xx_i2c_parse_dt(struct device_node *np, struct s3c24xx_i2c *i2c) { struct s3c2410_platform_i2c *pdata = i2c->pdata; + int id; if (!np) return; @@ -1084,6 +1092,23 @@ s3c24xx_i2c_parse_dt(struct device_node *np, struct s3c24xx_i2c *i2c) of_property_read_u32(np, "samsung,i2c-slave-addr", &pdata->slave_addr); of_property_read_u32(np, "samsung,i2c-max-bus-freq", (u32 *)&pdata->frequency); + /* + * Exynos5's legacy i2c controller and new high speed i2c + * controller have muxed interrupt sources. By default the + * interrupts for 4-channel HS-I2C controller are enabled. + * If node for first four channels of legacy i2c controller + * are available then re-configure the interrupts via the + * system register. + */ + id = of_alias_get_id(np, "i2c"); + i2c->sysreg = syscon_regmap_lookup_by_phandle(np, + "samsung,sysreg-phandle"); + if (IS_ERR(i2c->sysreg)) { + /* As this is not compulsory do not return error */ + pr_info("i2c-%d skipping re-configuration of interrutps\n", id); + return; + } + regmap_update_bits(i2c->sysreg, EXYNOS5_SYS_I2C_CFG, BIT(id), 0); } #else static void @@ -1264,6 +1289,9 @@ static int s3c24xx_i2c_suspend_noirq(struct device *dev) i2c->suspended = 1; + if (!IS_ERR(i2c->sysreg)) + regmap_read(i2c->sysreg, EXYNOS5_SYS_I2C_CFG, &i2c->sys_i2c_cfg); + return 0; } @@ -1272,6 +1300,9 @@ static int s3c24xx_i2c_resume_noirq(struct device *dev) struct platform_device *pdev = to_platform_device(dev); struct s3c24xx_i2c *i2c = platform_get_drvdata(pdev); + if (!IS_ERR(i2c->sysreg)) + regmap_write(i2c->sysreg, EXYNOS5_SYS_I2C_CFG, i2c->sys_i2c_cfg); + clk_prepare_enable(i2c->clk); s3c24xx_i2c_init(i2c); clk_disable_unprepare(i2c->clk);