From patchwork Fri Nov 21 10:22:02 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Pankaj Dubey X-Patchwork-Id: 5354151 Return-Path: X-Original-To: patchwork-linux-arm@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork1.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork1.web.kernel.org (Postfix) with ESMTP id 4BEF99F387 for ; Fri, 21 Nov 2014 10:32:44 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 054C820131 for ; Fri, 21 Nov 2014 10:32:43 +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 A805A200D4 for ; Fri, 21 Nov 2014 10:32:41 +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 1XrlTV-0001FK-7v; Fri, 21 Nov 2014 10:30:01 +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 1XrlTP-000172-Gr for linux-arm-kernel@lists.infradead.org; Fri, 21 Nov 2014 10:29:56 +0000 Received: from epcpsbgr3.samsung.com (u143.gpu120.samsung.co.kr [203.254.230.143]) by mailout2.samsung.com (Oracle Communications Messaging Server 7u4-24.01 (7.0.4.24.0) 64bit (built Nov 17 2011)) with ESMTP id <0NFD00AGMX57N820@mailout2.samsung.com> for linux-arm-kernel@lists.infradead.org; Fri, 21 Nov 2014 19:29:31 +0900 (KST) Received: from epcpsbgm2.samsung.com ( [172.20.52.124]) by epcpsbgr3.samsung.com (EPCPMTA) with SMTP id 52.5B.18484.B041F645; Fri, 21 Nov 2014 19:29:31 +0900 (KST) X-AuditID: cbfee68f-f791c6d000004834-0b-546f140b26aa Received: from epmmp2 ( [203.254.227.17]) by epcpsbgm2.samsung.com (EPCPMTA) with SMTP id 82.2B.09430.A041F645; Fri, 21 Nov 2014 19:29:31 +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 <0NFD00DPPX2W0050@mmp2.samsung.com>; Fri, 21 Nov 2014 19:29:30 +0900 (KST) From: Pankaj Dubey To: linux-arm-kernel@lists.infradead.org, linux-samsung-soc@vger.kernel.org Subject: [PATCH v5 1/2] i2c: s3c2410: Handle i2c sys_cfg register in i2c driver Date: Fri, 21 Nov 2014 15:52:02 +0530 Message-id: <1416565323-24899-2-git-send-email-pankaj.dubey@samsung.com> X-Mailer: git-send-email 1.7.9.5 In-reply-to: <1416565323-24899-1-git-send-email-pankaj.dubey@samsung.com> References: <1416565323-24899-1-git-send-email-pankaj.dubey@samsung.com> X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFmpmkeLIzCtJLcpLzFFi42JZI2JSo8stkh9i0P2I22L+kXOsFr0LrrJZ bHp8jdViYdsSFouOv18YLWac38dkcfsyr8WirV/YLd7emc5i0br3CLtFxzJGi1W7/jBarDwx i9mB16OluYfNY+esu+wem1doeWxa1cnmsXlJvUffllWMHidPPWHx+LxJLoAjissmJTUnsyy1 SN8ugSvjx/YljAVfDSrWvbjP3MD4Ub2LkZNDQsBE4uqpi4wQtpjEhXvr2boYuTiEBJYySkyZ +pwVpqjlxG8WEFtIYDqjRPc6R4iiCUwS39duAUuwCehKPHk/l7mLkYNDRMBbYvk1RZAaZoHb TBI/XswAGyQs4C9xd8IlNhCbRUBV4uTZhWA2r4CHxOkzvWC9EgIKEnMm2YCEOQU8JTasucsM sddD4l7nSWaQmRICt9glLix8zAIxR0Di2+RDLBC9shKbDjBD3CwpcXDFDZYJjMILGBlWMYqm FiQXFCelFxnrFSfmFpfmpesl5+duYgTGzel/z/p3MN49YH2IUYCDUYmH98P0vBAh1sSy4src Q4ymQBsmMkuJJucDozOvJN7Q2MzIwtTE1NjI3NJMSZx3odTPYCGB9MSS1OzU1ILUovii0pzU 4kOMTBycUg2MXjNmHi+ULT/26ceEfN/t7Ksn/9wbLC+tqHWUSWUDo8H98Dz9K9l7Gjj23Hd5 5P3v9L47t2/JtAn+Pr7/+cH7Eb0y0XMk+pabtMVb2XrtMvz41qH13kSXe7f74w+/fjxd6/rX b06mMppnJhdFXr0/59dRVZ+TOr7xHquldry7wu6bp/hFsvKGhxJLcUaioRZzUXEiAJlmPNuW AgAA X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFjrLIsWRmVeSWpSXmKPExsVy+t9jQV1ukfwQg4tXGS3mHznHatG74Cqb xabH11gtFrYtYbHo+PuF0WLG+X1MFrcv81os2vqF3eLtneksFq17j7BbdCxjtFi16w+jxcoT s5gdeD1amnvYPHbOusvusXmFlsemVZ1sHpuX1Hv0bVnF6HHy1BMWj8+b5AI4ohoYbTJSE1NS ixRS85LzUzLz0m2VvIPjneNNzQwMdQ0tLcyVFPISc1NtlVx8AnTdMnOADlZSKEvMKQUKBSQW Fyvp22GaEBripmsB0xih6xsSBNdjZIAGEtYwZvzYvoSx4KtBxboX95kbGD+qdzFyckgImEi0 nPjNAmGLSVy4t54NxBYSmM4o0b3OsYuRC8iewCTxfe0WsCI2AV2JJ+/nMncxcnCICHhLLL+m CFLDLHCbSeLHixmsIDXCAv4SdydcAhvEIqAqcfLsQjCbV8BD4vSZXrBeCQEFiTmTbEDCnAKe EhvW3GWG2Oshca/zJPMERt4FjAyrGEVTC5ILipPSc430ihNzi0vz0vWS83M3MYKj8pn0DsZV DRaHGAU4GJV4eD9MzwsRYk0sK67MPcQowcGsJMIbxpofIsSbklhZlVqUH19UmpNafIjRFOio icxSosn5wISRVxJvaGxibmpsamliYWJmqSTOe+NmboiQQHpiSWp2ampBahFMHxMHp1QDY8qy cxu75wREBLKkzJ0w/1qz49KI6hVvNHeXz9Ko37m46fDP7zbyxoy+DncLF99oiXn0y2ZLbIPu 7C+uqU/P+hw40tB1S23ypMgLWscuZWY9LN8z/euxCe6TbyjUPg85eNZ3055lYo5n5di+Pmq6 4xkd+1R5l3vwjsA9PwI2lH85c9Zv+7Rv7NVKLMUZiYZazEXFiQBUwZ9j4AIAAA== 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-20141121_022955_726993_8FF27E4F X-CRM114-Status: GOOD ( 15.07 ) X-Spam-Score: -5.0 (-----) Cc: devicetree@vger.kernel.org, kgene.kim@samsung.com, Russell King , Wolfram Sang , Pankaj Dubey , Randy Dunlap , linux-doc@vger.kernel.org, tomasz.figa@gmail.com, 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.6 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_LOW, T_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 | 29 ++++++++++++++++++++ 4 files changed, 38 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 0a588b4..d45a07e 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 6524477..09a6bac 100644 --- a/drivers/i2c/busses/i2c-s3c2410.c +++ b/drivers/i2c/busses/i2c-s3c2410.c @@ -35,6 +35,8 @@ #include #include #include +#include +#include #include @@ -87,6 +89,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, @@ -123,6 +128,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[] = { @@ -1071,6 +1078,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; @@ -1080,6 +1088,21 @@ 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 nodes 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)) + return; + + regmap_update_bits(i2c->sysreg, EXYNOS5_SYS_I2C_CFG, BIT(id), 0); } #else static void @@ -1260,6 +1283,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; } @@ -1268,6 +1294,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);