From patchwork Sun Jan 24 21:41:21 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Jonathan_Neusch=C3=A4fer?= X-Patchwork-Id: 370013 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 503CBC43219 for ; Sun, 24 Jan 2021 21:45:21 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 24E8B22571 for ; Sun, 24 Jan 2021 21:45:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726612AbhAXVpQ (ORCPT ); Sun, 24 Jan 2021 16:45:16 -0500 Received: from mout.gmx.net ([212.227.15.18]:47351 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726593AbhAXVpL (ORCPT ); Sun, 24 Jan 2021 16:45:11 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1611524567; bh=pfoAHiS3JW+I+IidEQrjOYzxyrhSYw62WId/6NSEQ1I=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=iOm5i1FBUc49tNc3Rildb1gpiy1Eyq9i2Fchh1iaWCH6aYi7J/m1JPmCwDfhy8HwN oqc1JvUmXEC6yQjMqcQIJBrgc7xqSJBcEs7IVLti/FPVhhbI+VXVXnH2voQg+5AYwg /eWsLz7RJYOaMUq6rc/z274ILHgjcvTQOC/2Ry2k= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from longitude ([37.201.215.209]) by mail.gmx.net (mrgmx005 [212.227.17.190]) with ESMTPSA (Nemesis) id 1MMofW-1lKE4p2Ejs-00Ihtj; Sun, 24 Jan 2021 22:42:47 +0100 From: =?utf-8?q?Jonathan_Neusch=C3=A4fer?= To: linux-kernel@vger.kernel.org Cc: Lee Jones , Rob Herring , =?utf-8?q?Jonathan_Neusch=C3=A4fer?= , Thierry Reding , =?utf-8?q?Uwe_Kleine-K?= =?utf-8?b?w7ZuaWc=?= , Alessandro Zummo , Alexandre Belloni , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Sam Ravnborg , Linus Walleij , Heiko Stuebner , Stephan Gerhold , Lubomir Rintel , Mark Brown , allen , Mauro Carvalho Chehab , "David S. Miller" , devicetree@vger.kernel.org, linux-pwm@vger.kernel.org, linux-rtc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Heiko Stuebner , Josua Mayer , Andreas Kemnade , Arnd Bergmann , Daniel Palmer , Andy Shevchenko , Rob Herring , Krzysztof Kozlowski , Kuninori Morimoto , Geert Uytterhoeven , Max Merchel Subject: [PATCH v9 1/7] dt-bindings: Add vendor prefix for Netronix, Inc. Date: Sun, 24 Jan 2021 22:41:21 +0100 Message-Id: <20210124214127.3631530-2-j.neuschaefer@gmx.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210124214127.3631530-1-j.neuschaefer@gmx.net> References: <20210124214127.3631530-1-j.neuschaefer@gmx.net> MIME-Version: 1.0 X-Provags-ID: V03:K1:RA2BOFMmPLxT6sYRc5u7dbmApp3Hn60nxFWYkZtmUBIzM536iYu sUyRmV8X5K8BTan6FX5xGbAwnTO1Nk200smNCqnLYm1jR0IexV7adj3+TYC2ivBk+9Ic/Mf lVEhxQwVHOOAfJGrL5SPAYMox6lgr+0lEYWqlfw9jT/hfsTrOU9CHynFUf72iOJQZXqtr94 3IPgN/jmJitCg1WaewdFg== X-UI-Out-Filterresults: notjunk:1; V03:K0:fEJR78faCKg=:o8y3iK1imYk4TvctkwX7lu 84QN/OjJePjfxcy7PYe5ZhfBvLt0j4wNGBnrtDqIaywEAUnqvB5PpA7suonImNVuuTE0sDeqs MpTL2cxP9RaSG6YsfHjojXygxL86WP0beFActHDNLsa4SXppwOQ2ZvSt3GKsg1SH+QiVib+QA r/D84Mbyve1ybf13/yRJ8zsVdyYQ0CsXMUL9lPWATOe9i13fqES5ttl5yVDeRpMzRxdMvkB4B cegHBt+/2E+/WQ/JfdrGHB+6IYrT30cqlWjGA6uoir/wh7rmKgpfMGuYZUl7ahaQ4Y/lTgd30 fW/b83g2ndy++HguO83xDopTruIkuS9sDh1UXvni3Rd9FaEHLUSU4467tD72wRCCYw7vgmTvK Cp8LDSd06nlSjidtImmta9BZ2a3Qoh1WMORYSHte81eYo1+YcuLt6CuReU897mKTwXi53QTFL kI9ft0aeMqej3wcWkyXdPPEcZWFdUa1hCMnZl4ogvblCRCDvLdn4yHA11b3evoJ8A2JUZNrWD /r8FuChCOx/VNiR2YNlBAP5DpxqW3/yyBSc3a7H/gQ1VTwydgOOj4b7f9oLbOV1gzViOHUzHK eICxyhEAeTxUR/G7vuX5IBu4Qkgm3sTcVJo0hXYOEggsXeb1gI8Q7ch/9aAEo5HAdvnk8HLaY 99xiocTjG/AlRLRFLGKg+GXlmzJoE6MfCQmWnHVAmWHeB3NN5uAQu5O+IIbxyiF5CE5n9RwOT eo5cwBFRlqQFQ7iTnLOwe6uF7GMJrHrY07Y0sZnyy0SzcXUQzZ0INdfxVH9weufradEiEh3JC OCX0RL/WJw384SIDjKM99E5tuJWzDJB42wKuywAJ+G8f1HrfIkQKHLn/le3czqwtvSOruJT1d J58r70hZLHQDY0RIy86Q== Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org Netronix, Inc. (http://www.netronixinc.com/) makes ebook reader board designs, which are for example used in Kobo and Tolino devices. An alternative prefix for Netronix would be "ntx", which is already used in code released by Netronix. It is shorter, but perhaps less clear. Signed-off-by: Jonathan Neuschäfer Acked-by: Rob Herring --- v4-v9: - No changes v3: - https://lore.kernel.org/lkml/20200924192455.2484005-2-j.neuschaefer@gmx.net/ - Add Acked-by tag v2: - No changes --- Documentation/devicetree/bindings/vendor-prefixes.yaml | 2 ++ 1 file changed, 2 insertions(+) -- 2.29.2 diff --git a/Documentation/devicetree/bindings/vendor-prefixes.yaml b/Documentation/devicetree/bindings/vendor-prefixes.yaml index 041ae90b0d8fd..4d36b8173b568 100644 --- a/Documentation/devicetree/bindings/vendor-prefixes.yaml +++ b/Documentation/devicetree/bindings/vendor-prefixes.yaml @@ -756,6 +756,8 @@ patternProperties: description: Broadcom Corporation (formerly NetLogic Microsystems) "^netron-dy,.*": description: Netron DY + "^netronix,.*": + description: Netronix, Inc. "^netxeon,.*": description: Shenzhen Netxeon Technology CO., LTD "^neweast,.*": From patchwork Sun Jan 24 21:41:22 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Jonathan_Neusch=C3=A4fer?= X-Patchwork-Id: 370014 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI, SPF_HELO_NONE, SPF_PASS, USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 69A1CC43381 for ; Sun, 24 Jan 2021 21:45:20 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 44356221F9 for ; Sun, 24 Jan 2021 21:45:20 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726571AbhAXVpC (ORCPT ); Sun, 24 Jan 2021 16:45:02 -0500 Received: from mout.gmx.net ([212.227.17.20]:44747 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726530AbhAXVo6 (ORCPT ); Sun, 24 Jan 2021 16:44:58 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1611524573; bh=ngTCQG3YidRGM9uatLNaoIdxkdT5FvSPUy7gUjLrx78=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=fzSonySvdOY3WOj72SvnKV6EMG1MNPcNNXCg7eN/+A7qQe1Szpu+mDTkVb0P5s7Cq hdK22t9i+6jmvqxSJPYDRnzEG1HnZzfqHYEOeekBSLhzzU1Vnxq6IkIwFc52C0dkH8 TYgZssEAxUPR7vwQdadV+hXkRVbJN3aYubnJIFkc= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from longitude ([37.201.215.209]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1N2Dx8-1m0OWp0lDC-013dMk; Sun, 24 Jan 2021 22:42:53 +0100 From: =?utf-8?q?Jonathan_Neusch=C3=A4fer?= To: linux-kernel@vger.kernel.org Cc: Lee Jones , Rob Herring , =?utf-8?q?Jonathan_Neusch=C3=A4fer?= , Thierry Reding , =?utf-8?q?Uwe_Kleine-K?= =?utf-8?b?w7ZuaWc=?= , Alessandro Zummo , Alexandre Belloni , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Sam Ravnborg , Linus Walleij , Heiko Stuebner , Stephan Gerhold , Lubomir Rintel , Mark Brown , allen , Mauro Carvalho Chehab , "David S. Miller" , devicetree@vger.kernel.org, linux-pwm@vger.kernel.org, linux-rtc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Heiko Stuebner , Josua Mayer , Andreas Kemnade , Arnd Bergmann , Daniel Palmer , Andy Shevchenko , Rob Herring Subject: [PATCH v9 2/7] dt-bindings: mfd: Add binding for Netronix embedded controller Date: Sun, 24 Jan 2021 22:41:22 +0100 Message-Id: <20210124214127.3631530-3-j.neuschaefer@gmx.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210124214127.3631530-1-j.neuschaefer@gmx.net> References: <20210124214127.3631530-1-j.neuschaefer@gmx.net> MIME-Version: 1.0 X-Provags-ID: V03:K1:JIe7A0UYeZlLX5PnpR7cFCKPznxi8JqQH+a8jEEq4mWvs1e2WN3 7aI7VMeWOuj9wh7tokKFnMNfEZiNWbh8FZhggqkKHjCap7oLBswwNLfkk51AbEi/Kq0Mt63 6vvM318fjHDkEIrahMyExq6RuNCcoyRBve3/qct2aZV35ga01TxJF2EastBwTNE2UyvlBrJ F9uNd/UnYF3TfTW4TR1rQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:PsRlcRtmN0E=:T6B8ye0ru9REaopNGDYWNG 4Dj2y8DI9pgKknEM9k7mB4yaNw0gq1kd9V3yTOexzcamPdliu41+RUwfKzjNppFMCXVBlUu8c 4AyJ1QEoDy8qjNAYTuzo5EEucpUtKt+H4WvomHZdIvNz4j1f3ckYdr3JxBtgjotDyP5wiOEV5 L7tCrh0VKmwJ0xnqf+J1DWUi/TzIRKNUIMK8Q9Ue6Jf3VxeNSnQzIRG2rLA1ie9/hKn0btLRn WWjX+XMVURss18lPp8+nMuUL09yKHaWljmwbQnnu081891ZDETSA1+nmzlauTbBLjctpBNYZY Ko924Fc2tozNnGdOYOssqMtUUH5n7aW+3LtqGU10W3MBO3AhFfUG0JW4Hww57YlL/hejvzOAm 2vDP8xZkhffU26i1YTyvaiTFgb5LdnjfqCjPD53FfkmATsxNHzgqVR6ysKgbMzlJjhAtbKL0p 4GeTPM1oJWs8wf4MWX01G9pMgDtxv7UmCCfTKCD+uGmUiDshxguIX3NF2wFwURRtSXnoWvaG0 PAN749r7eWqOSNAEIm4TGuoSRP7ycUTQRORQlJZysFlgOY5KeApGJKdN9+9kqfB4hlQrno0c3 cnk8GhbFMGu27PPErxLFs1IXZ+UEm8Yvz6B621ZnurOmQomG+KWGBEjUvZ/Qq17lPwvc//Sdg l8q3Q9Bzb0slWgskxtQId59xfeOWfO4i2aTe7Imz3znaYsIXT2n3/hiuDSZUimn52HBoTWx1d wOVf8MAqFOHEFNTcQ6OVqdAxi0tZocx1Zg4xOxZ5aetT81FuzsR1HStsCBC2ZnDBLF22fylQP YA4almOZJwHX/wfSpe54pVwNojcevoh7NRNuRa6AMOxPa/veOG4ySbTfGHTo0PvdlOvA74SO4 ClRF9Vf4MgHljrF4FS1Q== Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org This EC is found in e-book readers of multiple brands (e.g. Kobo, Tolino), and is typically implemented as a TI MSP430 microcontroller. It controls different functions of the system, such as power on/off, RTC, PWM for the backlight. The exact functionality provided can vary between boards. Signed-off-by: Jonathan Neuschäfer Reviewed-by: Rob Herring --- v5-v9: - no changes v4: - Add R-b tag v3: - https://lore.kernel.org/lkml/20200924192455.2484005-3-j.neuschaefer@gmx.net/ - Remove binding in text form patch description again - Add additionalProperties: false - Remove interrupt-controller property from example - Merge pwm/rtc nodes into main node v2: - Add the plaintext DT binding for comparison --- .../bindings/mfd/netronix,ntxec.yaml | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 Documentation/devicetree/bindings/mfd/netronix,ntxec.yaml -- 2.29.2 diff --git a/Documentation/devicetree/bindings/mfd/netronix,ntxec.yaml b/Documentation/devicetree/bindings/mfd/netronix,ntxec.yaml new file mode 100644 index 0000000000000..59a630025f52f --- /dev/null +++ b/Documentation/devicetree/bindings/mfd/netronix,ntxec.yaml @@ -0,0 +1,76 @@ +# SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) +%YAML 1.2 +--- +$id: http://devicetree.org/schemas/mfd/netronix,ntxec.yaml# +$schema: http://devicetree.org/meta-schemas/core.yaml# + +title: Netronix Embedded Controller + +maintainers: + - Jonathan Neuschäfer + +description: | + This EC is found in e-book readers of multiple brands (e.g. Kobo, Tolino), and + is typically implemented as a TI MSP430 microcontroller. + +properties: + compatible: + const: netronix,ntxec + + reg: + items: + - description: The I2C address of the EC + + system-power-controller: + type: boolean + description: See Documentation/devicetree/bindings/power/power-controller.txt + + interrupts: + minItems: 1 + description: + The EC can signal interrupts via a GPIO line + + "#pwm-cells": + const: 2 + description: | + Number of cells in a PWM specifier. + + The following PWM channels are supported: + - 0: The PWM channel controlled by registers 0xa1-0xa7 + +required: + - compatible + - reg + +additionalProperties: false + +examples: + - | + #include + i2c { + #address-cells = <1>; + #size-cells = <0>; + + ec: embedded-controller@43 { + pinctrl-names = "default"; + pinctrl-0 = <&pinctrl_ntxec>; + + compatible = "netronix,ntxec"; + reg = <0x43>; + system-power-controller; + interrupt-parent = <&gpio4>; + interrupts = <11 IRQ_TYPE_EDGE_FALLING>; + #pwm-cells = <2>; + }; + }; + + backlight { + compatible = "pwm-backlight"; + pwms = <&ec 0 50000>; + power-supply = <&backlight_regulator>; + }; + + backlight_regulator: regulator-dummy { + compatible = "regulator-fixed"; + regulator-name = "backlight"; + }; From patchwork Sun Jan 24 21:41:24 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Jonathan_Neusch=C3=A4fer?= X-Patchwork-Id: 370010 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E083AC433DB for ; Sun, 24 Jan 2021 22:45:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id B2CFA22CF6 for ; Sun, 24 Jan 2021 22:45:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726164AbhAXWpW (ORCPT ); Sun, 24 Jan 2021 17:45:22 -0500 Received: from mout.gmx.net ([212.227.17.20]:43101 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1725968AbhAXWpU (ORCPT ); Sun, 24 Jan 2021 17:45:20 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1611528183; bh=lSNWekm6862ykeKcP9D2OG5qE6fxZEmN3uJ3zTlZGc0=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=abW8pCkFuonuHElu6fswRkXCI7Wvi99jCi54ZFApsGx0GOkChWBOZqKZjRmzZBYwB 5NloHbglL3C/86Zzz7qkU/ruHcPWgXa3CTueG5Nn6IaT+R7JhKi6PjmTNtMWpT+GPg eZy/+2kKWiBKM6L3EMFex6dVeT2KKFQ6uf+AwQ6Y= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from longitude ([37.201.215.209]) by mail.gmx.net (mrgmx105 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MplXp-1lmRVD41zJ-00q89k; Sun, 24 Jan 2021 23:43:03 +0100 From: =?utf-8?q?Jonathan_Neusch=C3=A4fer?= To: linux-kernel@vger.kernel.org Cc: Lee Jones , Rob Herring , =?utf-8?q?Jonathan_Neusch=C3=A4fer?= , Thierry Reding , =?utf-8?q?Uwe_Kleine-K?= =?utf-8?b?w7ZuaWc=?= , Alessandro Zummo , Alexandre Belloni , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Sam Ravnborg , Linus Walleij , Heiko Stuebner , Stephan Gerhold , Lubomir Rintel , Mark Brown , allen , Mauro Carvalho Chehab , "David S. Miller" , devicetree@vger.kernel.org, linux-pwm@vger.kernel.org, linux-rtc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Heiko Stuebner , Josua Mayer , Andreas Kemnade , Arnd Bergmann , Daniel Palmer , Andy Shevchenko Subject: [PATCH v9 4/7] pwm: ntxec: Add driver for PWM function in Netronix EC Date: Sun, 24 Jan 2021 22:41:24 +0100 Message-Id: <20210124214127.3631530-5-j.neuschaefer@gmx.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210124214127.3631530-1-j.neuschaefer@gmx.net> References: <20210124214127.3631530-1-j.neuschaefer@gmx.net> MIME-Version: 1.0 X-Provags-ID: V03:K1:hA0CPIm1ZvUBpyqE/I8BqaaeeTiEqr0lWWiltlfHwR5gZh7PQI/ L4QGEcsSh4JzXSHYBg0U6jCTOxM/Jm3R+BSpHzvnvbCiFpD6gFf0z4i9jhsokK48e45Zkpj AMyKsL7z49tuq5P8kmaon2K3hxYEf9EG4Hhg3RgHIi8oXiKxxPpjonz0X5juDf38Ihl1/9G qUBnKFMXh4hVJ82JQfNqQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:DVSa4BFhq94=:irIx3TIizs5o1to6LgdE3h lsLU2rOggiFJHwP3AqwTUyeCPpE7IZzUKLS1kS76Ptr2ryfGuo2nuLULujuv+mS6QPLh7RwLm 0CB/gjkQinRqErD7B9zKu5/w4NzPBBzv2fI95MR+QYzYRWXQB0P0eMlqaQfo5+JvhrnfNUQeC tRLIa8/cwk4NGYyqWJSn6PC1+CXRs8Qh5CZIKDAsDHI1tvSEanCpPOWzHWVtk8q6GTElbuCzG VjEdxy9mPlhCCkyLUtahcFCqGm93OX2Po+8bHluLLfgMe/QX/AN6I+7Jx5F0CzG+S74EebPDX uhqOVDU1KLzpEC3CBLLWKnHL5WK8mbsyKiAa3KzwMjnCR0I5mwNquqnXyxdWJPBXsTwOoJ8VX 5N25hSOqOtQs9P1985gy1wCCkmjcc7/s0u8Ni0XU0FsniHxtf15ZGbyRJ9quy2lSI8jV3xMB3 gatGG2qjj9iBQCsQbVTPSfYyZPZHbLXYCF0p0JLpo1uyMPx57FonkX99z3peGKt5KqFe2of+p XilC1qUx/XCx9iKvzO698j6jjoRN2MWorGLUFa2phNyurN9BVCCBy/CvikohHRz5RetSAmfq5 FiICZQ4aFImxx0QG5iHVrHUC2un5vgEdIDEdexl4YCUuS4BFLCUBnf4ZwX/fqoVjR8QRLTgi/ mXS72xUnKeGqiM7Ez8qh7fbVlk1kNYMdwSNPpP17M6qRDTXuDe7Fu9TmGe7Anplel4ATDfwNB 9FyfPOxhWhi6RGnhY9Ex7Dz/yq0qrFKzHh3l4sYsxaoGbVmat8h3TUkGQh+9qztCKHKdbsFMO wOQvmwTBIPZegOjItf0VbnSUmYKcgjgiQOBYWu7Tjxfm6n/7Cxkvn+4R2OTHEMTEa8zMEIbxt 5ihcLFrLehEXQ9ZB8EnA== Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org The Netronix EC provides a PWM output which is used for the backlight on some ebook readers. This patches adds a driver for the PWM output. The .get_state callback is not implemented, because the PWM state can't be read back from the hardware. Signed-off-by: Jonathan Neuschäfer Reviewed-by: Uwe Kleine-König Acked-by: Thierry Reding --- v9: - Add Thierry Reding's A-b tag v8: - https://lore.kernel.org/lkml/20210116194826.3866540-5-j.neuschaefer@gmx.net/ - Add Uwe Kleine-König's R-b tag - Copy dev.of_node from parent device v7: - no changes v6: - Move period / duty cycle setting code to a function - Rename pwmchip_to_priv to ntxec_pwm_from_chip - Set period and duty cycle only before enabling the output - Mention that duty=0, enable=1 is assumed not to happen - Interleave writes to the period and duty cycle registers, to minimize the window of time that an inconsistent state is configured v5: - Avoid truncation of period and duty cycle to 32 bits - Make ntxec_pwm_ops const - Use regmap_multi_reg_write - Add comment about get_state to ntxec_pwm_ops - Add comments about non-atomicity of (period, duty cycle) update v4: - Document hardware/driver limitations - Only accept normal polarity - Fix a typo ("zone" -> "zero") - change MAX_PERIOD_NS to 0xffff * 125 - Clamp period to the maximum rather than returning an error - Rename private struct pointer to priv - Rearrage control flow in _probe to save a few lines and a temporary variable - Add missing MODULE_ALIAS line - Spell out ODM v3: - Relicense as GPLv2 or later - Add email address to copyright line - Remove OF compatible string and don't include linux/of_device.h - Fix bogus ?: in return line - Don't use a comma after sentinels - Avoid ret |= ... pattern - Move 8-bit register conversion to ntxec.h v2: - Various grammar and style improvements, as suggested by Uwe Kleine-König, Lee Jones, and Alexandre Belloni - Switch to regmap - Prefix registers with NTXEC_REG_ - Add help text to the Kconfig option - Use the .apply callback instead of the old API - Add a #define for the time base (125ns) - Don't change device state in .probe; this avoids multiple problems - Rework division and overflow check logic to perform divisions in 32 bits - Avoid setting duty cycle to zero, to work around a hardware quirk --- drivers/pwm/Kconfig | 8 ++ drivers/pwm/Makefile | 1 + drivers/pwm/pwm-ntxec.c | 184 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 drivers/pwm/pwm-ntxec.c -- 2.29.2 diff --git a/drivers/pwm/Kconfig b/drivers/pwm/Kconfig index 0937e1c047acb..a2830b8832b97 100644 --- a/drivers/pwm/Kconfig +++ b/drivers/pwm/Kconfig @@ -393,6 +393,14 @@ config PWM_MXS To compile this driver as a module, choose M here: the module will be called pwm-mxs. +config PWM_NTXEC + tristate "Netronix embedded controller PWM support" + depends on MFD_NTXEC + help + Say yes here if you want to support the PWM output of the embedded + controller found in certain e-book readers designed by the original + design manufacturer Netronix. + config PWM_OMAP_DMTIMER tristate "OMAP Dual-Mode Timer PWM support" depends on OF diff --git a/drivers/pwm/Makefile b/drivers/pwm/Makefile index 18b89d7fd092a..7d97eb595bbef 100644 --- a/drivers/pwm/Makefile +++ b/drivers/pwm/Makefile @@ -35,6 +35,7 @@ obj-$(CONFIG_PWM_MESON) += pwm-meson.o obj-$(CONFIG_PWM_MEDIATEK) += pwm-mediatek.o obj-$(CONFIG_PWM_MTK_DISP) += pwm-mtk-disp.o obj-$(CONFIG_PWM_MXS) += pwm-mxs.o +obj-$(CONFIG_PWM_NTXEC) += pwm-ntxec.o obj-$(CONFIG_PWM_OMAP_DMTIMER) += pwm-omap-dmtimer.o obj-$(CONFIG_PWM_PCA9685) += pwm-pca9685.o obj-$(CONFIG_PWM_PXA) += pwm-pxa.o diff --git a/drivers/pwm/pwm-ntxec.c b/drivers/pwm/pwm-ntxec.c new file mode 100644 index 0000000000000..50c454c553c46 --- /dev/null +++ b/drivers/pwm/pwm-ntxec.c @@ -0,0 +1,184 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * The Netronix embedded controller is a microcontroller found in some + * e-book readers designed by the original design manufacturer Netronix, Inc. + * It contains RTC, battery monitoring, system power management, and PWM + * functionality. + * + * This driver implements PWM output. + * + * Copyright 2020 Jonathan Neuschäfer + * + * Limitations: + * - The get_state callback is not implemented, because the current state of + * the PWM output can't be read back from the hardware. + * - The hardware can only generate normal polarity output. + * - The period and duty cycle can't be changed together in one atomic action. + */ + +#include +#include +#include +#include +#include +#include + +struct ntxec_pwm { + struct device *dev; + struct ntxec *ec; + struct pwm_chip chip; +}; + +static struct ntxec_pwm *ntxec_pwm_from_chip(struct pwm_chip *chip) +{ + return container_of(chip, struct ntxec_pwm, chip); +} + +#define NTXEC_REG_AUTO_OFF_HI 0xa1 +#define NTXEC_REG_AUTO_OFF_LO 0xa2 +#define NTXEC_REG_ENABLE 0xa3 +#define NTXEC_REG_PERIOD_LOW 0xa4 +#define NTXEC_REG_PERIOD_HIGH 0xa5 +#define NTXEC_REG_DUTY_LOW 0xa6 +#define NTXEC_REG_DUTY_HIGH 0xa7 + +/* + * The time base used in the EC is 8MHz, or 125ns. Period and duty cycle are + * measured in this unit. + */ +#define TIME_BASE_NS 125 + +/* + * The maximum input value (in nanoseconds) is determined by the time base and + * the range of the hardware registers that hold the converted value. + * It fits into 32 bits, so we can do our calculations in 32 bits as well. + */ +#define MAX_PERIOD_NS (TIME_BASE_NS * 0xffff) + +static int ntxec_pwm_set_raw_period_and_duty_cycle(struct pwm_chip *chip, + int period, int duty) +{ + struct ntxec_pwm *priv = ntxec_pwm_from_chip(chip); + + /* + * Changes to the period and duty cycle take effect as soon as the + * corresponding low byte is written, so the hardware may be configured + * to an inconsistent state after the period is written and before the + * duty cycle is fully written. If, in such a case, the old duty cycle + * is longer than the new period, the EC may output 100% for a moment. + * + * To minimize the time between the changes to period and duty cycle + * taking effect, the writes are interleaved. + */ + + struct reg_sequence regs[] = { + { NTXEC_REG_PERIOD_HIGH, ntxec_reg8(period >> 8) }, + { NTXEC_REG_DUTY_HIGH, ntxec_reg8(duty >> 8) }, + { NTXEC_REG_PERIOD_LOW, ntxec_reg8(period) }, + { NTXEC_REG_DUTY_LOW, ntxec_reg8(duty) }, + }; + + return regmap_multi_reg_write(priv->ec->regmap, regs, ARRAY_SIZE(regs)); +} + +static int ntxec_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm_dev, + const struct pwm_state *state) +{ + struct ntxec_pwm *priv = ntxec_pwm_from_chip(chip); + unsigned int period, duty; + int res; + + if (state->polarity != PWM_POLARITY_NORMAL) + return -EINVAL; + + period = min_t(u64, state->period, MAX_PERIOD_NS); + duty = min_t(u64, state->duty_cycle, period); + + period /= TIME_BASE_NS; + duty /= TIME_BASE_NS; + + /* + * Writing a duty cycle of zero puts the device into a state where + * writing a higher duty cycle doesn't result in the brightness that it + * usually results in. This can be fixed by cycling the ENABLE register. + * + * As a workaround, write ENABLE=0 when the duty cycle is zero. + * The case that something has previously set the duty cycle to zero + * but ENABLE=1, is not handled. + */ + if (state->enabled && duty != 0) { + res = ntxec_pwm_set_raw_period_and_duty_cycle(chip, period, duty); + if (res) + return res; + + res = regmap_write(priv->ec->regmap, NTXEC_REG_ENABLE, ntxec_reg8(1)); + if (res) + return res; + + /* Disable the auto-off timer */ + res = regmap_write(priv->ec->regmap, NTXEC_REG_AUTO_OFF_HI, ntxec_reg8(0xff)); + if (res) + return res; + + return regmap_write(priv->ec->regmap, NTXEC_REG_AUTO_OFF_LO, ntxec_reg8(0xff)); + } else { + return regmap_write(priv->ec->regmap, NTXEC_REG_ENABLE, ntxec_reg8(0)); + } +} + +static const struct pwm_ops ntxec_pwm_ops = { + .owner = THIS_MODULE, + .apply = ntxec_pwm_apply, + /* + * No .get_state callback, because the current state cannot be read + * back from the hardware. + */ +}; + +static int ntxec_pwm_probe(struct platform_device *pdev) +{ + struct ntxec *ec = dev_get_drvdata(pdev->dev.parent); + struct ntxec_pwm *priv; + struct pwm_chip *chip; + + pdev->dev.of_node = pdev->dev.parent->of_node; + + priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); + if (!priv) + return -ENOMEM; + + priv->ec = ec; + priv->dev = &pdev->dev; + + platform_set_drvdata(pdev, priv); + + chip = &priv->chip; + chip->dev = &pdev->dev; + chip->ops = &ntxec_pwm_ops; + chip->base = -1; + chip->npwm = 1; + + return pwmchip_add(chip); +} + +static int ntxec_pwm_remove(struct platform_device *pdev) +{ + struct ntxec_pwm *priv = platform_get_drvdata(pdev); + struct pwm_chip *chip = &priv->chip; + + return pwmchip_remove(chip); +} + +static struct platform_driver ntxec_pwm_driver = { + .driver = { + .name = "ntxec-pwm", + }, + .probe = ntxec_pwm_probe, + .remove = ntxec_pwm_remove, +}; +module_platform_driver(ntxec_pwm_driver); + +MODULE_AUTHOR("Jonathan Neuschäfer "); +MODULE_DESCRIPTION("PWM driver for Netronix EC"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ntxec-pwm"); From patchwork Sun Jan 24 21:41:25 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Jonathan_Neusch=C3=A4fer?= X-Patchwork-Id: 370009 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-15.8 required=3.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8708DC4332D for ; Sun, 24 Jan 2021 22:46:01 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 5AA1322C9F for ; Sun, 24 Jan 2021 22:46:01 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726699AbhAXWpp (ORCPT ); Sun, 24 Jan 2021 17:45:45 -0500 Received: from mout.gmx.net ([212.227.17.21]:54995 "EHLO mout.gmx.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726670AbhAXWp3 (ORCPT ); Sun, 24 Jan 2021 17:45:29 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gmx.net; s=badeba3b8450; t=1611528190; bh=7z3e7eIs2m1EJ3EXPvYoF48skrucAmlDLTA/IAwAyDk=; h=X-UI-Sender-Class:From:To:Cc:Subject:Date:In-Reply-To:References; b=U7NH4g+qYDcYJsV0aTvUaMmkM4iu+sm5rlYjLRSVE3tcIdgetozjlNhnMwyYLX3Ov f3oQSlIGoefso7Q6PTG185J+EXK/2NHJ6T35vDHo1Ja3V+6r2PbXapPFc7phAJ9FIH yDCiJqJv2uS4toyQK0wdQgy4xCxiER/Q5KQ5bzoM= X-UI-Sender-Class: 01bb95c1-4bf8-414a-932a-4f6e2808ef9c Received: from longitude ([37.201.215.209]) by mail.gmx.net (mrgmx104 [212.227.17.168]) with ESMTPSA (Nemesis) id 1MpDNf-1lmzSr15qR-00qksq; Sun, 24 Jan 2021 23:43:10 +0100 From: =?utf-8?q?Jonathan_Neusch=C3=A4fer?= To: linux-kernel@vger.kernel.org Cc: Lee Jones , Rob Herring , =?utf-8?q?Jonathan_Neusch=C3=A4fer?= , Thierry Reding , =?utf-8?q?Uwe_Kleine-K?= =?utf-8?b?w7ZuaWc=?= , Alessandro Zummo , Alexandre Belloni , Shawn Guo , Sascha Hauer , Pengutronix Kernel Team , Fabio Estevam , NXP Linux Team , Sam Ravnborg , Linus Walleij , Heiko Stuebner , Stephan Gerhold , Lubomir Rintel , Mark Brown , allen , Mauro Carvalho Chehab , "David S. Miller" , devicetree@vger.kernel.org, linux-pwm@vger.kernel.org, linux-rtc@vger.kernel.org, linux-arm-kernel@lists.infradead.org, Heiko Stuebner , Josua Mayer , Andreas Kemnade , Arnd Bergmann , Daniel Palmer , Andy Shevchenko Subject: [PATCH v9 5/7] rtc: New driver for RTC in Netronix embedded controller Date: Sun, 24 Jan 2021 22:41:25 +0100 Message-Id: <20210124214127.3631530-6-j.neuschaefer@gmx.net> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20210124214127.3631530-1-j.neuschaefer@gmx.net> References: <20210124214127.3631530-1-j.neuschaefer@gmx.net> MIME-Version: 1.0 X-Provags-ID: V03:K1:BZJ7Sf0Z444iOSRedPl9o8dj+dDfs3vkZzwftWwyZPFjO2lsmDu lRcS9gPFCWxvfmeB8T822rGSVg/fcOzML0x3UvRP0NvdobiS/7N1/d1KRH7AUr60OZcc58u yv0JG+dLc6zOpnchKGXbkIGvzC10Clv6sE6dESQJcVHuBvSVtRUCS1FMAQcYVHFPl5euSgl sZEy7w8ZZpy1pkEzcTXHQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:eig9ImzRoBg=:TqY66fqR+tfmfPhxX0kl7p c1/ycqAjApPItJq5bjr4CvCVuarRSMH64GrggnBFMtomL+5LHHAEQu7cZVOdFgG0CK1gfUNww IfNREz4wauu17o97LwsJrwzW5VrLHgx4YBROnI2E6XbLaBxs8Cak4euvlZixyReEpUPdT9TqQ ePBT/cDXpJcllMKsyiUhB7dtjNZmlUAW73mzohn58tldAbDYDrT+oYiMX5TvJWnjOCre0mVtg djDpGAVNj/DVPkN967AAD077SbjJbaliEog+ErqVQZ+aPwC8gavc/ccanf6oWPcSw8cvbFySR qbNiHfWt/pkF1T4D0VattsaqSlfKconl9wSlDDKYxnptMHX1K7BdH+np0Vk8TdRkxOOHoI4CD 1RnPcGVyj6V5fWYA0v9o+4enNqycjzPwTGWlBuXKcO43ufvmFzDdfbX6DmzrtDOlTVPeky2e7 l2ncBFI1MRWQwmRdVujE+aLSu/Ri5UWeoyOr6hcaA5EjM4g7Ko9aCAtsDNrkmJoQEU4Fz37mO 9TG5jqfMpFR9r0jS0GU9w4yAFT7StBItIe9dGljN3wZcqvxEEPA96O+shmqyQmJGZcmRkuRVR LP3t0z65ha7fzSZsWur8nYi4lNOuoNzd2sz00c2Xzheq/6FHjI75ZC8dJVILVJBDgTzEsaFoe z+u1tZLs8kaccoh+9o+4PtatD/loTGwdFB2H8QaFu5xuxa+kQ1b/heQIdz7V0GZC/pS1jlxEb xQe3EX7mcW9noJ9b++nFakqknOgyHH6FtgOocZNa4atry4Pjdfbq54kxYrUuMOt6OTg0W/RXn SqWWPfd+/tqNUbb8Fx5SKLT8IQ5cI9gtaPAvIP71WihT8HTTA2Y5pVk4nQLp9bh4NGNpjoUXN +Qe0wECnkPRdXY3jp9Aw== Precedence: bulk List-ID: X-Mailing-List: devicetree@vger.kernel.org With this driver, mainline Linux can keep its time and date in sync with the vendor kernel. Advanced functionality like alarm and automatic power-on is not yet supported. Signed-off-by: Jonathan Neuschäfer Acked-by: Alexandre Belloni --- v9: - no changes v8: - https://lore.kernel.org/lkml/20210116194826.3866540-6-j.neuschaefer@gmx.net/ - Copy dev.of_node from parent device v7: - Adjust to recent RTC API change (rtc_register_device -> devm_rtc_register_device) v6: - no changes v5: - Add Alexandre Belloni's A-b - Use regmap_multi_reg_write v4: - Remove "driver" from Kconfig entry for consistency with most other entries - Add missing MODULE_ALIAS line - Give NTXEC_REG_READ_ macros longer names - Solve the read tearing issue using Alexandre Belloni's algorithm - Solve the write tearing issue using Uwe Kleine-König's algorithm - Spell out ODM v3: - Add email address to copyright line - Remove OF compatible string and don't include linux/of_device.h - Don't use a comma after sentinels - Avoid ret |= ... pattern - Move 8-bit register conversion to ntxec.h - Relicense as GPLv2 or later v2: - Rework top-of-file comment [Lee Jones] - Sort the #include lines [Alexandre Belloni] - don't align = signs in struct initializers [Uwe Kleine-König] - Switch to regmap - Fix register number used to read minutes and seconds - Prefix registers with NTXEC_REG_ - Add help text to the Kconfig option - Use devm_rtc_allocate_device and rtc_register_device, set ->range_min and ->range_max --- drivers/rtc/Kconfig | 8 +++ drivers/rtc/Makefile | 1 + drivers/rtc/rtc-ntxec.c | 145 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 drivers/rtc/rtc-ntxec.c -- 2.29.2 diff --git a/drivers/rtc/Kconfig b/drivers/rtc/Kconfig index 6123f9f4fbc90..d49cf387add14 100644 --- a/drivers/rtc/Kconfig +++ b/drivers/rtc/Kconfig @@ -1315,6 +1315,14 @@ config RTC_DRV_CROS_EC This driver can also be built as a module. If so, the module will be called rtc-cros-ec. +config RTC_DRV_NTXEC + tristate "Netronix embedded controller RTC" + depends on MFD_NTXEC + help + Say yes here if you want to support the RTC functionality of the + embedded controller found in certain e-book readers designed by the + original design manufacturer Netronix. + comment "on-CPU RTC drivers" config RTC_DRV_ASM9260 diff --git a/drivers/rtc/Makefile b/drivers/rtc/Makefile index bb8f319b09fbf..92c26eafe70ce 100644 --- a/drivers/rtc/Makefile +++ b/drivers/rtc/Makefile @@ -110,6 +110,7 @@ obj-$(CONFIG_RTC_DRV_MT7622) += rtc-mt7622.o obj-$(CONFIG_RTC_DRV_MV) += rtc-mv.o obj-$(CONFIG_RTC_DRV_MXC) += rtc-mxc.o obj-$(CONFIG_RTC_DRV_MXC_V2) += rtc-mxc_v2.o +obj-$(CONFIG_RTC_DRV_NTXEC) += rtc-ntxec.o obj-$(CONFIG_RTC_DRV_OMAP) += rtc-omap.o obj-$(CONFIG_RTC_DRV_OPAL) += rtc-opal.o obj-$(CONFIG_RTC_DRV_PALMAS) += rtc-palmas.o diff --git a/drivers/rtc/rtc-ntxec.c b/drivers/rtc/rtc-ntxec.c new file mode 100644 index 0000000000000..850ca49186fdc --- /dev/null +++ b/drivers/rtc/rtc-ntxec.c @@ -0,0 +1,145 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * The Netronix embedded controller is a microcontroller found in some + * e-book readers designed by the original design manufacturer Netronix, Inc. + * It contains RTC, battery monitoring, system power management, and PWM + * functionality. + * + * This driver implements access to the RTC time and date. + * + * Copyright 2020 Jonathan Neuschäfer + */ + +#include +#include +#include +#include +#include +#include + +struct ntxec_rtc { + struct device *dev; + struct ntxec *ec; +}; + +#define NTXEC_REG_WRITE_YEAR 0x10 +#define NTXEC_REG_WRITE_MONTH 0x11 +#define NTXEC_REG_WRITE_DAY 0x12 +#define NTXEC_REG_WRITE_HOUR 0x13 +#define NTXEC_REG_WRITE_MINUTE 0x14 +#define NTXEC_REG_WRITE_SECOND 0x15 + +#define NTXEC_REG_READ_YEAR_MONTH 0x20 +#define NTXEC_REG_READ_MDAY_HOUR 0x21 +#define NTXEC_REG_READ_MINUTE_SECOND 0x23 + +static int ntxec_read_time(struct device *dev, struct rtc_time *tm) +{ + struct ntxec_rtc *rtc = dev_get_drvdata(dev); + unsigned int value; + int res; + +retry: + res = regmap_read(rtc->ec->regmap, NTXEC_REG_READ_MINUTE_SECOND, &value); + if (res < 0) + return res; + + tm->tm_min = value >> 8; + tm->tm_sec = value & 0xff; + + res = regmap_read(rtc->ec->regmap, NTXEC_REG_READ_MDAY_HOUR, &value); + if (res < 0) + return res; + + tm->tm_mday = value >> 8; + tm->tm_hour = value & 0xff; + + res = regmap_read(rtc->ec->regmap, NTXEC_REG_READ_YEAR_MONTH, &value); + if (res < 0) + return res; + + tm->tm_year = (value >> 8) + 100; + tm->tm_mon = (value & 0xff) - 1; + + /* + * Read the minutes/seconds field again. If it changed since the first + * read, we can't assume that the values read so far are consistent, + * and should start from the beginning. + */ + res = regmap_read(rtc->ec->regmap, NTXEC_REG_READ_MINUTE_SECOND, &value); + if (res < 0) + return res; + + if (tm->tm_min != value >> 8 || tm->tm_sec != (value & 0xff)) + goto retry; + + return 0; +} + +static int ntxec_set_time(struct device *dev, struct rtc_time *tm) +{ + struct ntxec_rtc *rtc = dev_get_drvdata(dev); + + /* + * To avoid time overflows while we're writing the full date/time, + * set the seconds field to zero before doing anything else. For the + * next 59 seconds (plus however long it takes until the RTC's next + * update of the second field), the seconds field will not overflow + * into the other fields. + */ + struct reg_sequence regs[] = { + { NTXEC_REG_WRITE_SECOND, ntxec_reg8(0) }, + { NTXEC_REG_WRITE_YEAR, ntxec_reg8(tm->tm_year - 100) }, + { NTXEC_REG_WRITE_MONTH, ntxec_reg8(tm->tm_mon + 1) }, + { NTXEC_REG_WRITE_DAY, ntxec_reg8(tm->tm_mday) }, + { NTXEC_REG_WRITE_HOUR, ntxec_reg8(tm->tm_hour) }, + { NTXEC_REG_WRITE_MINUTE, ntxec_reg8(tm->tm_min) }, + { NTXEC_REG_WRITE_SECOND, ntxec_reg8(tm->tm_sec) }, + }; + + return regmap_multi_reg_write(rtc->ec->regmap, regs, ARRAY_SIZE(regs)); +} + +static const struct rtc_class_ops ntxec_rtc_ops = { + .read_time = ntxec_read_time, + .set_time = ntxec_set_time, +}; + +static int ntxec_rtc_probe(struct platform_device *pdev) +{ + struct rtc_device *dev; + struct ntxec_rtc *rtc; + + pdev->dev.of_node = pdev->dev.parent->of_node; + + rtc = devm_kzalloc(&pdev->dev, sizeof(*rtc), GFP_KERNEL); + if (!rtc) + return -ENOMEM; + + rtc->dev = &pdev->dev; + rtc->ec = dev_get_drvdata(pdev->dev.parent); + platform_set_drvdata(pdev, rtc); + + dev = devm_rtc_allocate_device(&pdev->dev); + if (IS_ERR(dev)) + return PTR_ERR(dev); + + dev->ops = &ntxec_rtc_ops; + dev->range_min = RTC_TIMESTAMP_BEGIN_2000; + dev->range_max = 9025257599LL; /* 2255-12-31 23:59:59 */ + + return devm_rtc_register_device(dev); +} + +static struct platform_driver ntxec_rtc_driver = { + .driver = { + .name = "ntxec-rtc", + }, + .probe = ntxec_rtc_probe, +}; +module_platform_driver(ntxec_rtc_driver); + +MODULE_AUTHOR("Jonathan Neuschäfer "); +MODULE_DESCRIPTION("RTC driver for Netronix EC"); +MODULE_LICENSE("GPL"); +MODULE_ALIAS("platform:ntxec-rtc");