From patchwork Tue Jul 7 19:02:05 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Adrian Alonso X-Patchwork-Id: 492573 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 8293C1402B4 for ; Wed, 8 Jul 2015 05:03:09 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932722AbbGGTDI (ORCPT ); Tue, 7 Jul 2015 15:03:08 -0400 Received: from mail-bn1bon0118.outbound.protection.outlook.com ([157.56.111.118]:18882 "EHLO na01-bn1-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S932789AbbGGTDF (ORCPT ); Tue, 7 Jul 2015 15:03:05 -0400 X-Greylist: delayed 71246 seconds by postgrey-1.27 at vger.kernel.org; Tue, 07 Jul 2015 15:03:04 EDT Received: from BN3PR0301CA0068.namprd03.prod.outlook.com (10.160.152.164) by BY1PR0301MB1223.namprd03.prod.outlook.com (10.161.203.19) with Microsoft SMTP Server (TLS) id 15.1.201.16; Tue, 7 Jul 2015 19:03:00 +0000 Received: from BN1BFFO11FD056.protection.gbl (2a01:111:f400:7c10::1:168) by BN3PR0301CA0068.outlook.office365.com (2a01:111:e400:401e::36) with Microsoft SMTP Server (TLS) id 15.1.213.14 via Frontend Transport; Tue, 7 Jul 2015 19:03:00 +0000 Authentication-Results: spf=fail (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of freescale.com does not designate 192.88.158.2 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.158.2; helo=az84smr01.freescale.net; Received: from az84smr01.freescale.net (192.88.158.2) by BN1BFFO11FD056.mail.protection.outlook.com (10.58.145.11) with Microsoft SMTP Server (TLS) id 15.1.190.9 via Frontend Transport; Tue, 7 Jul 2015 19:03:00 +0000 Received: from bluefly.am.freescale.net (bluefly.am.freescale.net [10.81.17.130]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id t67J2vLS016352; Tue, 7 Jul 2015 12:02:58 -0700 From: Adrian Alonso To: , , , , CC: , , , , , , Subject: [PATCH][v3] ARM: imx: pinctrl-imx: imx7d: add support for iomuxc lpsr Date: Tue, 7 Jul 2015 14:02:05 -0500 Message-ID: <1436295725-19011-1-git-send-email-aalonso@freescale.com> X-Mailer: git-send-email 2.1.4 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BN1BFFO11FD056; 1:Bjo5c4G1jAONPP/htf9BwNlN12xELA7eJtK0r+agnibF3NL1HWzL8cdrM57e+ztukGEi9eV1T75DEiOm8rBqjCFybGfkO5kNSK61Qf8Ipka94OK6pJF/zZ2XnsR3g2tRfQC6BSnQvrlG1qb4BeXy9JgynFH2YTEjMql7QYhAjt4x4P4aTcopeBUkGmYtPmGFQAUpdY8PbCPMmbHf8yEeFngdr1osiR+nYY15RH/2qDFrWXCI5bxPf9nv/UU0vYIj+m4nc915QbHRmjPsO8ZhVc+aCDhPQ6cZstQa8+QQhEHeGZ7MNAWoSB56cKKez35wB7yxuak3mXRUpn7ZgxAPBw== X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(339900001)(199003)(189002)(5001770100001)(106466001)(36756003)(77156002)(62966003)(77096005)(5003940100001)(6806004)(47776003)(19580405001)(5001960100002)(107886002)(229853001)(50986999)(87936001)(105606002)(104016003)(33646002)(48376002)(575784001)(19580395003)(50466002)(50226001)(85426001)(92566002)(189998001)(46102003)(86362001)(2201001)(2101003)(4001430100001); DIR:OUT; SFP:1102; SCL:1; SRVR:BY1PR0301MB1223; H:az84smr01.freescale.net; FPR:; SPF:Fail; MLV:sfv; A:1; MX:1; LANG:en; MIME-Version: 1.0 X-Microsoft-Exchange-Diagnostics: 1; BY1PR0301MB1223; 2:zBfsOF8wk2w0CiS2VHBJJS1d7j+eGj9NhZJpML3nlIsO3XVdHTl8AAQ+ZNlWJOFz; 3:ma+76CgOJoSJqXF7XPwrBZWn5dyF9UOSrVnI0V273UIdu9r0m4rCKQNryoEsEoA13Ld70y0jD99tG8WGwdhmlqWTSbjKwNw1s+15Gr2BG5M0gq9qdTu/e6B7fYMOjuurCZf+kYg897YXbm2U+BiyCHDGl4nIIIPzEXJT4Y6sW/ru2e+Qp7KzHfizva/eV+OC35PzNRvxQ0v9ESYcuUCWqfnzSYqXAMENs2kUVaem3DE=; 25:m6e/Dana+sgrnQvh9ELbDZpfSZSzvHvpWEsm87I0cmJ++HJvUqqSAVbJ+agcXcbwQHOBvUaNeycnFFs1koeotdPNoecw/oq3TEom6nsVqtid/TwibcyZkBr8vTXw77I2TaqKSyldytEJR33lxxN8KtO3muUe/JjWlGuIXj+UbV7nGB1KP+YGdmXeOixrQn3KBQFhDO6fRyci9BZrb6SmCau5Ippvxwk20w3sLKXKC1BKbiZhhsu8L266H6lF7n1kaPIJki0SYEeP4sizzjvTlQ==; 20:HW5I4Loivbh5VMv4torcVo6najQDy7FnwKdnwZC1I3OD71Ca5/3HsBTVF1avjTtjDg68iGSrwCwD3Xb2rDWfmfy2I8ylb2XvAW7gZfWE2JT+Hob9/tvvOjFPoYl1flgI5Kcj7b2+x6hjSHFbKiH56kUqhrezDOM84NgC+k4vm24uCjKwM9Iicb/dFQ5HRyYSfZqu4GajRIrcmvJDzLUn3X9faftpyQgH3SEp/6wruLs7Fd9fvTZPeFAS6jWc8pcUibgp1Cd+j5NUMAovzC22cJVHfoIiE8LKzi1S32k8VZW0EGV3U/UT12JcLl50vgDmQDk46yS0dcX48Xqjc0HLh4gxJgXnj81+ZRtmRDNFJ7A= X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:BY1PR0301MB1223; X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(5005006)(3002001); SRVR:BY1PR0301MB1223; BCL:0; PCL:0; RULEID:; SRVR:BY1PR0301MB1223; X-Microsoft-Exchange-Diagnostics: 1; BY1PR0301MB1223; 4:d0jitQb2E0jlRCtCGnd0T+aXM49DGJA84k3H/s1OKpxrmZH7UzvaG2wr5OHQVy2X7KCtcS4QsBjRKgd9Oa+68NRX1sQRC4aXS91RPMnpEAQMgmHTaHPw3UZISiZ1ifPq9OIqq8HC4qEEpxT+Franvbgu6YzJHsmvQdtp7+OMSKeb2KEfIKwDtKkjjjzBGbqrSzi2WtrdHRntz1i/NbHTeOrz0y7GFTCpiFZM3YQbVE0tsHkWajvF1qtluxr3K7s1PZTyw9cTGQxNIWIpR/It5d47dHr8wN4tPPzI4Nz0UHo= X-Forefront-PRVS: 0630013541 X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; BY1PR0301MB1223; 23:4a/1959PPEWgTXgrPjrAbncicdd3QGWhZb6Zw0N?= =?us-ascii?Q?UkJajNPDjpmNx+JiFQVvv4b7IcmrPEMAc7mIRn/1MQQSBfCvMKL6r2Yph+mI?= =?us-ascii?Q?JhCC71X+qsPz42R2P1bCeP+1lRiUlTYrAtjwnLshPXEMNFtn3xvos5HNuq5x?= =?us-ascii?Q?XDw74r5UCS22Z2sSb/zgNwS80aRAuqKafWUMnp0Dy8VAVzlbu2c3dFWBD5g2?= =?us-ascii?Q?4radnnklGatsvM/jUy2Nub1bLN4chrjHhXW337UaoiUnro9PwUy+bDy7y9T/?= =?us-ascii?Q?Tz2X+r1g3CNu11cup2YCsIU2C2n5cOGPntKsSo5UTQWfVBfAzzD/zrPlR3Tn?= =?us-ascii?Q?l0QNUHNXprP3KHN84IqeX7nAu0pap2dJPrUPQExtSO/e1GWBUzFnnEUGHp06?= =?us-ascii?Q?aQBH1eIXAtAA6hKcOdh3NgQM3OHwVwK7Seu28RTEdzMcoNPmbR0MI1nhUCIS?= =?us-ascii?Q?om7LzjBiKf0pYe7tY8NJ5GEZGrm1+sUCT9EAWdOqBkW5v2DnrZdF6i8RqzrT?= =?us-ascii?Q?iu0GRFpPqCUcdaxvuNo/kuVKppzZvxNMDDcWT1BPVWKTfLPbKyGLViboh7Ix?= =?us-ascii?Q?tN7vHrNDo+6fAlgG2xVHywVT6p8h2k6zxDK86oY9vrBxpYn30n/cmThERe/8?= =?us-ascii?Q?zoMRJWCd9inz0SRj2si5qXEmfGvIkgePQ52JUosV7d3dgOe3YuJiOoXtcXZM?= =?us-ascii?Q?tAUURvVOqxhmn8AjYmP3hv8OuG1OC7SLIIIBD/tnL4Qe6IErW7f5KJvrsgHP?= =?us-ascii?Q?3GwpwPuroTb7Ci27HAxEeQj3+JmpEhDnU0nm7+XqBQjLdsIePC3FNSokV8kQ?= =?us-ascii?Q?vnpL7UtQXmoMXCcV2bD3TRx/vWF+YBYvrr2CEwdi1u5cV8srxeboXlZEc+QG?= =?us-ascii?Q?PVCagInLddjx1Dk2LxJZ+mcEpq+6RbPEVGzxdfdefDtH3+57W08LhyUaUUbV?= =?us-ascii?Q?qAz+Ng0WNslRl7RfR05URoFD5ORMiS9wpAZ4/Pq/7+Q=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; BY1PR0301MB1223; 5:AkaOpyOb0s3ajbaqmgPyDqSRpQmWQ2eeEXLyz66NwL2StELbI2Nn/s1sEJv4wrUnKtRTOIkYE/0Tdk6ibE7tb5mcw/yas8NQQkSOl2KiAtK0Y76Q/OAOqmTacdV3/h+n+krDaFDCisD8dZbfjXPIdA==; 24:VumnaDmMXZ/IOoUQaGOGl5L1wYBGkzd2Kw46A8rA6mbigATlTLpgvufPI88t4GDUb6VS1NfT8fYoAtqcbVf6PIfG37zsWBI0PC4yP7/BR6w=; 20:TzK64hDHJN4iuCWbxiFkwpQ5d52zTB+gOgCEXHgwqL789A8Q8ii0p5ryZpQOedGHPqpCoeL2MebEo7JEwBhrBA== X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Jul 2015 19:03:00.0347 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: BY1PR0301MB1223 Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org * Extend pinctrl-imx driver to support iomux lpsr conntroller, * iMX7D has two iomuxc controllers, iomuxc controller similar as previous iMX SoC generation and iomuxc-lpsr which provides low power state rentetion capabilities on gpios that are part of iomuxc-lpsr (GPIO1_IO7..GPIO1_IO0). * Use IOMUXC_LPSR_SUPPORT and iput_val most significant bits to properly configure iomuxc/iomuxc-lpsr settings. Signed-off-by: Adrian Alonso * Change from v1 to v2: - Add suggested comment for input select register shared between iomuxc-lpsr and normal iomuxc controller. - Use IOMUXC_LPSR_MASK to extract pad group id and aling pin_id to 16 bit representation. * Change from v2 to v3 - Use devm_ioremap_resource instead of of_iomap to get iomuxc-lpsr base register address. --- drivers/pinctrl/freescale/pinctrl-imx.c | 72 ++++++++++++++++++++++----------- drivers/pinctrl/freescale/pinctrl-imx.h | 7 +++- 2 files changed, 55 insertions(+), 24 deletions(-) diff --git a/drivers/pinctrl/freescale/pinctrl-imx.c b/drivers/pinctrl/freescale/pinctrl-imx.c index d7b98ba..aef4ca3 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.c +++ b/drivers/pinctrl/freescale/pinctrl-imx.c @@ -1,7 +1,7 @@ /* * Core driver for the imx pin controller * - * Copyright (C) 2012 Freescale Semiconductor, Inc. + * Copyright (C) 2012-2015 Freescale Semiconductor, Inc. * Copyright (C) 2012 Linaro Ltd. * * Author: Dong Aisheng @@ -38,7 +38,6 @@ struct imx_pinctrl { struct device *dev; struct pinctrl_dev *pctl; - void __iomem *base; const struct imx_pinctrl_soc_info *info; }; @@ -212,12 +211,12 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector, if (info->flags & SHARE_MUX_CONF_REG) { u32 reg; - reg = readl(ipctl->base + pin_reg->mux_reg); + reg = readl(pin_reg->base + pin_reg->mux_reg); reg &= ~(0x7 << 20); reg |= (pin->mux_mode << 20); - writel(reg, ipctl->base + pin_reg->mux_reg); + writel(reg, pin_reg->base + pin_reg->mux_reg); } else { - writel(pin->mux_mode, ipctl->base + pin_reg->mux_reg); + writel(pin->mux_mode, pin_reg->base + pin_reg->mux_reg); } dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%x\n", pin_reg->mux_reg, pin->mux_mode); @@ -245,16 +244,22 @@ static int imx_pmx_set(struct pinctrl_dev *pctldev, unsigned selector, * The input_reg[i] here is actually some IOMUXC general * purpose register, not regular select input register. */ - val = readl(ipctl->base + pin->input_reg); + val = readl(pin_reg->base + pin->input_reg); val &= ~mask; val |= select << shift; - writel(val, ipctl->base + pin->input_reg); + writel(val, pin_reg->base + pin->input_reg); } else if (pin->input_reg) { /* * Regular select input register can never be at offset * 0, and we only print register value for regular case. */ - writel(pin->input_val, ipctl->base + pin->input_reg); + if (info->flags & IOMUXC_LPSR_SUPPORT && + IOMUXC_LPSR_MASK(pin->input_val)) + /* iomuxc-lpsr select input register shared with normal iomuxc */ + writel(pin->input_val, info->base + pin->input_reg); + else + writel(pin->input_val, pin_reg->base + pin->input_reg); + dev_dbg(ipctl->dev, "==>select_input: offset 0x%x val 0x%x\n", pin->input_reg, pin->input_val); @@ -326,10 +331,10 @@ static int imx_pmx_gpio_request_enable(struct pinctrl_dev *pctldev, return -EINVAL; mux_pin: - reg = readl(ipctl->base + pin_reg->mux_reg); + reg = readl(pin_reg->base + pin_reg->mux_reg); reg &= ~(0x7 << 20); reg |= imx_pin->config; - writel(reg, ipctl->base + pin_reg->mux_reg); + writel(reg, pin_reg->base + pin_reg->mux_reg); return 0; } @@ -354,12 +359,12 @@ static int imx_pmx_gpio_set_direction(struct pinctrl_dev *pctldev, return -EINVAL; /* IBE always enabled allows us to read the value "on the wire" */ - reg = readl(ipctl->base + pin_reg->mux_reg); + reg = readl(pin_reg->base + pin_reg->mux_reg); if (input) reg &= ~0x2; else reg |= 0x2; - writel(reg, ipctl->base + pin_reg->mux_reg); + writel(reg, pin_reg->base + pin_reg->mux_reg); return 0; } @@ -386,7 +391,7 @@ static int imx_pinconf_get(struct pinctrl_dev *pctldev, return -EINVAL; } - *config = readl(ipctl->base + pin_reg->conf_reg); + *config = readl(pin_reg->base + pin_reg->conf_reg); if (info->flags & SHARE_MUX_CONF_REG) *config &= 0xffff; @@ -415,12 +420,12 @@ static int imx_pinconf_set(struct pinctrl_dev *pctldev, for (i = 0; i < num_configs; i++) { if (info->flags & SHARE_MUX_CONF_REG) { u32 reg; - reg = readl(ipctl->base + pin_reg->conf_reg); + reg = readl(pin_reg->base + pin_reg->conf_reg); reg &= ~0xffff; reg |= configs[i]; - writel(reg, ipctl->base + pin_reg->conf_reg); + writel(reg, pin_reg->base + pin_reg->conf_reg); } else { - writel(configs[i], ipctl->base + pin_reg->conf_reg); + writel(configs[i], pin_reg->base + pin_reg->conf_reg); } dev_dbg(ipctl->dev, "write: offset 0x%x val 0x%lx\n", pin_reg->conf_reg, configs[i]); @@ -442,7 +447,7 @@ static void imx_pinconf_dbg_show(struct pinctrl_dev *pctldev, return; } - config = readl(ipctl->base + pin_reg->conf_reg); + config = readl(pin_reg->base + pin_reg->conf_reg); seq_printf(s, "0x%lx", config); } @@ -551,14 +556,25 @@ static int imx_pinctrl_parse_groups(struct device_node *np, } pin_id = mux_reg ? mux_reg / 4 : conf_reg / 4; + + pin->input_reg = be32_to_cpu(*list++); + pin->mux_mode = be32_to_cpu(*list++); + pin->input_val = be32_to_cpu(*list++); + + if (info->flags & IOMUXC_LPSR_SUPPORT && + IOMUXC_LPSR_MASK(pin->input_val)) + pin_id = IOMUXC_LPSR_MASK(pin->input_val); + pin_reg = &info->pin_regs[pin_id]; pin->pin = pin_id; grp->pin_ids[i] = pin_id; pin_reg->mux_reg = mux_reg; pin_reg->conf_reg = conf_reg; - pin->input_reg = be32_to_cpu(*list++); - pin->mux_mode = be32_to_cpu(*list++); - pin->input_val = be32_to_cpu(*list++); + pin_reg->base = info->base; + + if (info->flags & IOMUXC_LPSR_SUPPORT && + IOMUXC_LPSR_MASK(pin->input_val)) + pin_reg->base = info->base_lpsr; /* SION bit is in mux register */ config = be32_to_cpu(*list++); @@ -709,9 +725,19 @@ int imx_pinctrl_probe(struct platform_device *pdev, } res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - ipctl->base = devm_ioremap_resource(&pdev->dev, res); - if (IS_ERR(ipctl->base)) - return PTR_ERR(ipctl->base); + info->base = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->base)) + return PTR_ERR(info->base); + + if (info->flags & IOMUXC_LPSR_SUPPORT) { + res = platform_get_resource(pdev, IORESOURCE_MEM, 1); + info->base_lpsr = devm_ioremap_resource(&pdev->dev, res); + if (IS_ERR(info->base_lpsr)) { + dev_err(&pdev->dev, + "iomuxc-lpsr base address not found\n"); + return PTR_ERR(info->base_lpsr); + } + } imx_pinctrl_desc.name = dev_name(&pdev->dev); imx_pinctrl_desc.pins = info->pins; diff --git a/drivers/pinctrl/freescale/pinctrl-imx.h b/drivers/pinctrl/freescale/pinctrl-imx.h index 49e55d3..5e0f2e0 100644 --- a/drivers/pinctrl/freescale/pinctrl-imx.h +++ b/drivers/pinctrl/freescale/pinctrl-imx.h @@ -1,7 +1,7 @@ /* * IMX pinmux core definitions * - * Copyright (C) 2012 Freescale Semiconductor, Inc. + * Copyright (C) 2012-2015 Freescale Semiconductor, Inc. * Copyright (C) 2012 Linaro Ltd. * * Author: Dong Aisheng @@ -69,6 +69,7 @@ struct imx_pmx_func { struct imx_pin_reg { s16 mux_reg; s16 conf_reg; + void __iomem *base; }; struct imx_pinctrl_soc_info { @@ -81,9 +82,13 @@ struct imx_pinctrl_soc_info { struct imx_pmx_func *functions; unsigned int nfunctions; unsigned int flags; + void __iomem *base; + void __iomem *base_lpsr; }; #define SHARE_MUX_CONF_REG 0x1 +#define IOMUXC_LPSR_SUPPORT 0x2 +#define IOMUXC_LPSR_MASK(id) ((id >> 0x10) & 0xffff) #define NO_MUX 0x0 #define NO_PAD 0x0