From patchwork Fri Oct 7 15:11:26 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Bhuvanchandra DV X-Patchwork-Id: 9366225 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id 88D2860752 for ; Fri, 7 Oct 2016 15:16:33 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 794AE296A8 for ; Fri, 7 Oct 2016 15:16:33 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id 6E053296B1; Fri, 7 Oct 2016 15:16:33 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-4.1 required=2.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_MED,T_DKIM_INVALID autolearn=ham version=3.3.1 Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.9]) (using TLSv1.2 with cipher AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by mail.wl.linuxfoundation.org (Postfix) with ESMTPS id D6721296A8 for ; Fri, 7 Oct 2016 15:16:32 +0000 (UTC) Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.85_2 #1 (Red Hat Linux)) id 1bsWrc-0000qM-Co; Fri, 07 Oct 2016 15:15:08 +0000 Received: from mail-am5eur03on0716.outbound.protection.outlook.com ([2a01:111:f400:fe08::716] helo=EUR03-AM5-obe.outbound.protection.outlook.com) by bombadil.infradead.org with esmtps (Exim 4.85_2 #1 (Red Hat Linux)) id 1bsWr7-0000SY-AJ for linux-arm-kernel@lists.infradead.org; Fri, 07 Oct 2016 15:14:40 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=toradex.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=is/hHgAwVoAq20w1P3p9aYyAj7kKc6+pBFRw+jX0ouk=; b=VnF0V8GZFq9d+2bm47sQCr0GHXxsRXymHPTfq6ineYUHZRrBObljQBvP8WgIpFA7wLTuFROsE1UYJfRnY3nM0u6AepgD2cGcIFUs6BHV4M/szIGRzGvqs+7fdoUaU1c+DqqiQAYtUMluSYNf4tb3MQqEsXw8ieeOE7lYVn+sbGY= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=bhuvanchandra.dv@toradex.com; Received: from tdx-in-nb-0014.toradex.int (115.115.243.34) by VI1PR05MB1407.eurprd05.prod.outlook.com (10.162.125.156) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.649.16; Fri, 7 Oct 2016 15:14:13 +0000 From: Bhuvanchandra DV To: , Subject: [PATCH v3 3/6] pwm: imx: support output polarity inversion Date: Fri, 7 Oct 2016 20:41:26 +0530 Message-ID: <20161007151129.6043-4-bhuvanchandra.dv@toradex.com> X-Mailer: git-send-email 2.10.0 In-Reply-To: <20161007151129.6043-1-bhuvanchandra.dv@toradex.com> References: <20161007151129.6043-1-bhuvanchandra.dv@toradex.com> MIME-Version: 1.0 X-Originating-IP: [115.115.243.34] X-ClientProxiedBy: BM1PR01CA0062.INDPRD01.PROD.OUTLOOK.COM (10.163.199.34) To VI1PR05MB1407.eurprd05.prod.outlook.com (10.162.125.156) X-MS-Office365-Filtering-Correlation-Id: 858dd20b-50ed-4c17-d1a2-08d3eec49a70 X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1407; 2:mdKglPFQVXo/3w3mWmekuqAjXK9NY4tkb2w5NPj9ZKvMI2yFHJJH5hC4xPWI3ccxRazJQPdnFsCQ6grvw4+CqOxpY/zTv72OInwf/aOwm9oyG/SfhWj1IAX3sTJTTIEGAvOjDwNx5UXgORZ7c1tfM1XXOhUiwZegXmi7xoO/n2WzVarIn5Z+Btkh2HnrcDJo/yCLhHokvgrIgKQANEEsiQ==; 3:gJjt/r3L7npvRRR2qLMV6OYf6e+68J0s3N6su/Ch6m2mQuNASK5Oo9j1AbXlP+Vs0MMddK9DPI5p+tspO1ZHRhPBmaQ5pzk4yYvRqX2frI1E5HPaaGqNlgG586Y/u6d8dBuEe0ds6RCyYAq0hCD8vA== X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:VI1PR05MB1407; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1407; 25:xIPK+9vX+IbHF4Zq+NOiYCS07GmK85wqRxdT3wKRgxPHfLlJfqNvl0Dmkkl0FwlVzQf+YrhJUDUzaET5yH0M2BJCCCnXTixaMbmgO94ledmtAn5Vl+t9WFxmwtmhU+JXEzCTExrg2yMnKJFBHo3kZrt8CEQjWewr082j23AOuFnxiuvjmM4eFTM7I11qwyOgtur+ZvrNolhBPEreDg7J6Z5w7a7VzKeJmGfJSxNR8g7o56wbYQniSHQ6cBhLWBoyAdCW2jVGVDNAuNuMTP44qc8E7CwpDlrArd3Wh7ONjtTHPehX6ZLUqXCVyxrvZs1uuB+iqFp1RRiaPRCJHD1rHjs68dkUEyqkSfPxSGaMUcKNPQ6N71qAHQc493TGkjImttiNxT2U6ZbVf9ffWpBvJEVQu+PR5bIscppEvTFcB9HwuMaQxcgXFqXwnPGDeS5KeuUp8ZlRvRnTbNpdeUrFMPEdQ3vAa0SeN/MNpZNp/CF3waY3oLkUfFp0V/nvU0mOjdC9uIR0nvU1knZyYH0FP/YmtxCb0ji/jht+cBtAms1Zlj4ARVPIOp7Aw7+jT7Y/OIytY3Cs4NFMLMlt0gFofYbxYN2xQLdYF51eB2J1EPQSueXo0nUo+zYOvyAaBLFcxjleH+iAiia66lNusYMpwpl5CF1qCHcbWEntJruuBPctUFTLALgSHQBJg8PQ+Uu7FW6Y1yA1jUcXeF7jl8tgJMQ9psQAbOOFDkGhy8lVDz0= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1407; 31:M5Iy7hSv/tpLKvLHb0NQEVkpcouk+n6fLubV8FuUoD5uAQsMiXINEXd7w37kPMxo9HWHPPOuFszodRpmYkpDvZVPEvcCctSsU6DFCiil4/NMXMhr2h2u203cRT/pQeS0zgsXOHGc4DtMyqTwooPT0ofb8cK8OPmO3jz3c9i7fmEK1mHrshsjfSKIaSWtfmUC3GOCvGkXzfMIQI5gwX/BDW/dkL69+M08TePOF30QDJkYsdyXHbTvrKGzgBGtHHWv; 20:ixBBeNXDAjAeL5SvrMfsobcW0xZCyzrbv4ZPHWdWhujCllQD8gcC3EXZzJCIjuPmdxeqWiDkrL/qUQ2zx4y7+Z6VZVxAu4AzzoMDHV32ZzdkyeIuZQ1GXYuOk/HlTFYXMYf0KdI0H+fvvncb0/Tb8oHZAc2rPSx1H3lMlp2OVXQ/vldvXQh4hxjCXyfPWTMd5TOtsAhkQ8kXggSH5Ar3CsWJ3SGtOF2Shz8PshspvGe3h0q+LfczcYxZ4lChiK99+uqJoQ7+axq9NtzCo2rDjGrwg902/AuOc2ZacuY6S2aF4FD9j9kM3w6fEDvBWO4N4i237UvqzFPWY9PBSFGUuw== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(7411616537696); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(8121501046)(5005006)(10201501046)(3002001); SRVR:VI1PR05MB1407; BCL:0; PCL:0; RULEID:; SRVR:VI1PR05MB1407; X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1407; 4:JgvjNcge7hRyy+sT94tHDHMcB7NgjuMqnWFGCQNzvZSe0T14AO2fg+988nDR9/3aPo2UqxIt6dyTnOoaYKS7aTulRAvF4ZqugI9qsLQr1zkKAprYV4p/GM2dYSvKh+nYIoOOZQv06T33X6DNEDzNw5m7ZU8LithbssYqsguIdGsuKnuvk7axaD86VCRBUdoQQjHw6M1Zuw+XeuhH1RABuX6u/PLBsatLbpS3BLrZvd9hn6syRTJTiYAIk6bxZ3ZbO6CnRUpXAdIAGk4zQ2tuCyp8kqCtgegGn348lAWF7ZsSqUIEOA4Lfm9dSevymjrHGrXSbsa0ADOPWxIdFIeSBM+xQYXqGyfgxh75pGq562YHSRqaVAPssAufzNEEsmFq4QQ93tcZfh/B0y5wyRtOnfBsXFC4o/C6lDJp5aW9769vryd5MPsqf4T3dr0lCVvA X-Forefront-PRVS: 0088C92887 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10019020)(4630300001)(6009001)(7916002)(199003)(189002)(4001430100002)(5001770100001)(97736004)(77096005)(68736007)(107886002)(86362001)(189998001)(4326007)(81166006)(81156014)(8676002)(36756003)(92566002)(2906002)(6116002)(50226002)(2870700001)(5820100001)(50466002)(69596002)(586003)(1076002)(3846002)(33646002)(76176999)(50986999)(101416001)(6666003)(2950100002)(47776003)(42186005)(66066001)(7416002)(8666005)(7736002)(305945005)(5660300001)(19580405001)(19580395003)(7846002)(53416004)(105586002)(229853001)(23676002)(106356001)(7059030); DIR:OUT; SFP:1102; SCL:1; SRVR:VI1PR05MB1407; H:tdx-in-nb-0014.toradex.int; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: toradex.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtWSTFQUjA1TUIxNDA3OzIzOjkwQ0E2WVBGWFdMSmQ3WUpNWTBsQXlqQ29t?= =?utf-8?B?NTNUbVVWRDhRQndkVEZYVGg1UU9UNFdDOUNkK3YwTWV1dXVUQmoycnJMemls?= =?utf-8?B?QlJBRVJCV2Jjck8wOWRsbm9HTnRMcUd5dm5rWUhhejRvZWNkUnNNRjdCazNo?= =?utf-8?B?SThUQ1lzSXpHTFlWMWl1QWxVZ3FlWmdpZEsza200WnJJUFJxNThDcmRmNG1w?= =?utf-8?B?Kys4UDNCTmc5Z0llVVFteFZCa2huNWVaeElKWTIrbkNtZlJLYkxySVhaOTdK?= =?utf-8?B?YmhYa0s0L2JGSE5od3pjdmVVcXRVdjNHTldZNDgvdnZiQ3NtWGJoTUpVZmxm?= =?utf-8?B?ZnQrVEhrdEFrS2NhT2c4MzExVXVJWmVsSDdGeERxSDJHdThXOTYwR29EZVBR?= =?utf-8?B?NWhxUDVzc2I1d2ZSOGxSa09rbjRtbitEVWM1ZnIvbFA2cm41UEhsd2xxZXJ3?= =?utf-8?B?aFB4d3lxNjZMOURmR3NLNm8rQ3Z2SnNYaEdBcnJPaE01WXBydHBBdUc5ZnpD?= =?utf-8?B?Wk9VTENLdzBIZkdtZURNczI1UncwNkQyWDBZeGhHSDQxR1RRTlJGdTU2QXJi?= =?utf-8?B?S29xeEVCY1JvbnoyMEJsNjh4RCs4akpnMnRJNWtYUVJXdUkyQ1dXQzNUVDd6?= =?utf-8?B?cUNURHJFWWtwZVQ4c1QxOW12SktVYkJYczBFbDA2dm5CRjNmUXArbkxQZVJw?= =?utf-8?B?dlNjTCtTcER0elZYWTMzZHh6cStBZnE5bXJpRFgxZkVqaGVQdmRwSmRnU3pv?= =?utf-8?B?d3QvaWo3MW4zc1IxNWtTcTVmVVpHbGQ0Z25jT1FUa1FnUHFnK1VDQ2VDc2l6?= =?utf-8?B?M3diNEY2Mm1BQzlrRDUwbGVQTzdQaXAxWnc5SFdYU09HUWtoMlF1SUx0STdO?= =?utf-8?B?alB1SFYyYld4Rkp5R3FzQzF2U1RzTWRIZ2VPdjZMYnJ4YmUxdi8wOFlmTG9B?= =?utf-8?B?SjhmajhzcDRSd0FMVkkwN0Q1cWtHR1haQk9kTG4raG1rK1N6VnAvdnB4NTkv?= =?utf-8?B?bldVeDc5d3ZMcExXK2dxZ3k0ZnpWSC9mSGRkRjl6TkNyL0srcHVrQjFmbmxz?= =?utf-8?B?dm9RbjhEOFFDVCtpandMN1A4VVJ3VDMzV0REaTExYWVGYUZZbkNFN25EMDNY?= =?utf-8?B?cDdjdnNWSVFpVFhyWU5ZME0xUHVWY3lwVldNQUcraWMzK2VhQm5SWVdtaW4x?= =?utf-8?B?bG1mMmQ3NkxOKzRTR3ZjNnZqODFrS3puZ3V3KzJaYlAxTzlpMjl0QzdFdEdh?= =?utf-8?B?Y2pnNTkycXMva0IrQ2t2ZjhaZWR2ek5GZjZ0dnd0d3A0QWU0VWxsVUxpOEJ5?= =?utf-8?B?QUdvNnZpWjZqcU5rcEx5SXdsZ0tWbzlRb1Y0cUVKbUI2UXQ1d2dLQ0xtQ0p4?= =?utf-8?B?M2FFOWxXS2xNMndYS3ozWm1TSmN2THJmMEsrUFA2VnNaNGQ2czJSZWRNb1FQ?= =?utf-8?B?YUJPelliUlJGeW9zOHB4MHpvTUd3YXY0dnJmK0FNVkVCbkJsdk1TVzhLT05w?= =?utf-8?B?Vldxd2t0ME1oNXlzUHhvZ3RjUHlWaksyNU9WNWlnUVcxR1d2alZROWFCeEdU?= =?utf-8?B?TmRNdi9LbG1yV3N3U2l1ZDVWQkFiakdtZ2Y3UjdidGF3SnJESWlGRHZibU1m?= =?utf-8?B?enNZTks1Q0dZYnZLSHRzSjN4cFhLVUY2cmU0aEZac1FGVFJCUzMwT2x0NTIx?= =?utf-8?B?NmJnTTF6QWZPRHpEOHNRVENiSTlBWWdCTGJ6Tmg4SkdPOWhnZnVWbkJ1RDV0?= =?utf-8?B?NjZicFBnNFJwSnJGT0R4QT09?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR05MB1407; 6:pAyUoHrLCurKwWIC+MzDSwz/1a14Q3Oc7j+vIMjmJb4AVMn0sRkdDLgGAeubFkXISbTu/h8chUZrlAPGsofzNMlBUlq5MtbldlDSBE1ep8JknoIqobm1scqM3sEKE4tKCL4/gAPx8e63b/+ueVsFIQKwq2ibLxsV2g/T6lS4q1rFzkchGmwQP7UYezyWr+5D40AL8iMIbHRzyOLg36msIDB7FNG7Zi2pKXKwi445gryVoO26l34LcQD+kRe5WHNdoO/d9Vx/EVa7gwKB0UwNPMWQpJaRZrKSDkKHVG8tSkLsXRhe6qmbuLvppJpzyH6N; 5:GFzkgsmO/FRqb6MBt9uGJ9w1E+M5rZnMUXMI9/khJgXzvI90kk3eJi2rIs7yvbaAbNkqjuZqB3K/ki1VrRpaHsaOTF1nyWwbRcI0WkrDbGxpKpiYSngLuG6b04J9m+vVpjYTqO9ooEWqGLFVbFGCz00Mi5q91btjF3oZ8ibXNvA=; 24:pfds3l3JWCvYTt67BYqqHKo8W3sv0Z1kdpCK+v+BPvS5pZy7etLKjh3r1OO9hfkaLwDZbKVw7wxYFDWUBhVDewk9sACar8HbyQAXyNyAJCY=; 7:ZQxO9DSwmcwstnfCRLqHvH5rgqwHdvwl5B4cZ8Z2y0pv6Qb9TQ26QPmz7TMb+ehdqq+9UbXO/IGZ6+KESGQ2Aw4irFxW4tEA//6kv1lTexlIcrk35M09rqimDEC8rzvdmmCIEg2hnDliTJcMbmlKPJNlOiPAfNYP7CldWQuJkcS/p1yJGRpEj02zEWaqSaBQkKhaxa2wUkg6r30OR3UC/7UuOUI0TdML04Fh7lbTpSLTXBh+iyBEjPyKDWX8aQHQI74gT+KXtM78uni6MS38pRUJU4a53t5mzshdB2LkhComNTNjS9JBduMfi7hEa34RAM+dR7BPOuVeCRR89neBGA== SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: toradex.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Oct 2016 15:14:13.8789 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR05MB1407 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20161007_081437_743433_3154C798 X-CRM114-Status: GOOD ( 13.97 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: mark.rutland@arm.com, linux-pwm@vger.kernel.org, l.majewski@samsung.com, Bhuvanchandra DV , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, stefan@agner.ch, robh+dt@kernel.org, kernel@pengutronix.de, fabio.estevam@nxp.com, linux-arm-kernel@lists.infradead.org, Lothar Wassmann Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+patchwork-linux-arm=patchwork.kernel.org@lists.infradead.org X-Virus-Scanned: ClamAV using ClamSMTP From: Lothar Wassmann The i.MX pwm unit on i.MX27 and newer SoCs provides a configurable output polarity. This patch adds support to utilize this feature where available. Signed-off-by: Lothar Waßmann Signed-off-by: Lukasz Majewski Signed-off-by: Bhuvanchandra DV Acked-by: Shawn Guo Reviewed-by: Sascha Hauer Tested-by: Lukasz Majewski Acked-by: Rob Herring --- Documentation/devicetree/bindings/pwm/imx-pwm.txt | 6 +-- drivers/pwm/pwm-imx.c | 51 +++++++++++++++++++++-- 2 files changed, 51 insertions(+), 6 deletions(-) diff --git a/Documentation/devicetree/bindings/pwm/imx-pwm.txt b/Documentation/devicetree/bindings/pwm/imx-pwm.txt index e00c2e9..c61bdf8 100644 --- a/Documentation/devicetree/bindings/pwm/imx-pwm.txt +++ b/Documentation/devicetree/bindings/pwm/imx-pwm.txt @@ -6,8 +6,8 @@ Required properties: - "fsl,imx1-pwm" for PWM compatible with the one integrated on i.MX1 - "fsl,imx27-pwm" for PWM compatible with the one integrated on i.MX27 - reg: physical base address and length of the controller's registers -- #pwm-cells: should be 2. See pwm.txt in this directory for a description of - the cells format. +- #pwm-cells: 2 for i.MX1 and 3 for i.MX27 and newer SoCs. See pwm.txt + in this directory for a description of the cells format. - clocks : Clock specifiers for both ipg and per clocks. - clock-names : Clock names should include both "ipg" and "per" See the clock consumer binding, @@ -17,7 +17,7 @@ See the clock consumer binding, Example: pwm1: pwm@53fb4000 { - #pwm-cells = <2>; + #pwm-cells = <3>; compatible = "fsl,imx53-pwm", "fsl,imx27-pwm"; reg = <0x53fb4000 0x4000>; clocks = <&clks IMX5_CLK_PWM1_IPG_GATE>, diff --git a/drivers/pwm/pwm-imx.c b/drivers/pwm/pwm-imx.c index d600fd5..c37d223 100644 --- a/drivers/pwm/pwm-imx.c +++ b/drivers/pwm/pwm-imx.c @@ -38,6 +38,7 @@ #define MX3_PWMCR_DOZEEN (1 << 24) #define MX3_PWMCR_WAITEN (1 << 23) #define MX3_PWMCR_DBGEN (1 << 22) +#define MX3_PWMCR_POUTC (1 << 18) #define MX3_PWMCR_CLKSRC_IPG_HIGH (2 << 16) #define MX3_PWMCR_CLKSRC_IPG (1 << 16) #define MX3_PWMCR_SWR (1 << 3) @@ -180,6 +181,9 @@ static int imx_pwm_config_v2(struct pwm_chip *chip, if (enable) cr |= MX3_PWMCR_EN; + if (pwm->args.polarity == PWM_POLARITY_INVERSED) + cr |= MX3_PWMCR_POUTC; + writel(cr, imx->mmio_base + MX3_PWMCR); return 0; @@ -240,27 +244,62 @@ static void imx_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm) clk_disable_unprepare(imx->clk_per); } -static struct pwm_ops imx_pwm_ops = { +static int imx_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device *pwm, + enum pwm_polarity polarity) +{ + struct imx_chip *imx = to_imx_chip(chip); + u32 val; + + if (polarity == pwm->args.polarity) + return 0; + + val = readl(imx->mmio_base + MX3_PWMCR); + + if (polarity == PWM_POLARITY_INVERSED) + val |= MX3_PWMCR_POUTC; + else + val &= ~MX3_PWMCR_POUTC; + + writel(val, imx->mmio_base + MX3_PWMCR); + + dev_dbg(imx->chip.dev, "%s: polarity set to %s\n", __func__, + polarity == PWM_POLARITY_INVERSED ? "inverted" : "normal"); + + return 0; +} + +static struct pwm_ops imx_pwm_ops_v1 = { .enable = imx_pwm_enable, .disable = imx_pwm_disable, .config = imx_pwm_config, .owner = THIS_MODULE, }; +static struct pwm_ops imx_pwm_ops_v2 = { + .enable = imx_pwm_enable, + .disable = imx_pwm_disable, + .set_polarity = imx_pwm_set_polarity, + .config = imx_pwm_config, + .owner = THIS_MODULE, +}; + struct imx_pwm_data { int (*config)(struct pwm_chip *chip, struct pwm_device *pwm, int duty_ns, int period_ns); void (*set_enable)(struct pwm_chip *chip, bool enable); + struct pwm_ops *pwm_ops; }; static struct imx_pwm_data imx_pwm_data_v1 = { .config = imx_pwm_config_v1, .set_enable = imx_pwm_set_enable_v1, + .pwm_ops = &imx_pwm_ops_v1, }; static struct imx_pwm_data imx_pwm_data_v2 = { .config = imx_pwm_config_v2, .set_enable = imx_pwm_set_enable_v2, + .pwm_ops = &imx_pwm_ops_v2, }; static const struct of_device_id imx_pwm_dt_ids[] = { @@ -282,6 +321,8 @@ static int imx_pwm_probe(struct platform_device *pdev) if (!of_id) return -ENODEV; + data = of_id->data; + imx = devm_kzalloc(&pdev->dev, sizeof(*imx), GFP_KERNEL); if (imx == NULL) return -ENOMEM; @@ -300,18 +341,22 @@ static int imx_pwm_probe(struct platform_device *pdev) return PTR_ERR(imx->clk_ipg); } - imx->chip.ops = &imx_pwm_ops; + imx->chip.ops = data->pwm_ops; imx->chip.dev = &pdev->dev; imx->chip.base = -1; imx->chip.npwm = 1; imx->chip.can_sleep = true; + if (data->pwm_ops->set_polarity) { + dev_dbg(&pdev->dev, "PWM supports output inversion\n"); + imx->chip.of_xlate = of_pwm_xlate_with_flags; + imx->chip.of_pwm_n_cells = 3; + } r = platform_get_resource(pdev, IORESOURCE_MEM, 0); imx->mmio_base = devm_ioremap_resource(&pdev->dev, r); if (IS_ERR(imx->mmio_base)) return PTR_ERR(imx->mmio_base); - data = of_id->data; imx->config = data->config; imx->set_enable = data->set_enable;