From patchwork Wed Jan 4 05:25:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dennis Lambe X-Patchwork-Id: 1721238 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2620:137:e000::1:20; helo=out1.vger.email; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="key not found in DNS" header.d=sparkcharge.io header.i=@sparkcharge.io header.a=rsa-sha256 header.s=google header.b=Du0R4iD1; dkim-atps=neutral Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by legolas.ozlabs.org (Postfix) with ESMTP id 4Nmyjj3b4qz23ff for ; Wed, 4 Jan 2023 16:25:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230303AbjADFZ1 (ORCPT ); Wed, 4 Jan 2023 00:25:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55048 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230195AbjADFZZ (ORCPT ); Wed, 4 Jan 2023 00:25:25 -0500 Received: from mail-qt1-x832.google.com (mail-qt1-x832.google.com [IPv6:2607:f8b0:4864:20::832]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 60F33175A7 for ; Tue, 3 Jan 2023 21:25:24 -0800 (PST) Received: by mail-qt1-x832.google.com with SMTP id a16so26471632qtw.10 for ; Tue, 03 Jan 2023 21:25:24 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sparkcharge.io; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=LV9OZ3zFtkDLpf/Q73kAo3k3wQt+efvU2HfxDW5J4xU=; b=Du0R4iD1kfzmb4EfxtgF+gSIOWGDbJD0iExwUv1ZDRundKTzoDa695OqloAYC0BdIX /n4DwNWbqEr7HA4g1IL3tlSoo0NQN+w03uf+axir/nbFf+kNPdFbcIOlOML6znSZsbjY nkIfCEJHC1vW0AGW15gVU9BhfdPv8zwOg2wVOSXX/nPuRQALIAEbs6+oxi9Qf6t34C1t eqhm8vQ30zpztA+A7FQQIAfxEF6XsVS2bhNU++qzYkuqrX8kd6KZzEzmnqdDqOox8ygP XU/RLiMdFYiInbF9Qjk8v6wLb5RdhVb2liw95K3SR3d2ByTcbGODDtamnxo+uiwJCOCX f2NQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=LV9OZ3zFtkDLpf/Q73kAo3k3wQt+efvU2HfxDW5J4xU=; b=rof+WfM5Pl5/Gn7McnCepIVyg/+o0G90VObM6Qwa+GO/xhAVsvylyoqQXFc4z5ndBq AJUbjlsNIXP9BjEhqI1efWdG1tJ39n+71OVB8ahEMOPAfvX24ie5jXrAPtvP/HEetMTT aXeF6T4C/ISXsehfR1Wh9neZdKzSwEMMTVeJUg7U4x7pNcd96Dlwca9qmCgsO+5Yj22W rsOvAqp6H6LaVMlRwF1cXDjTrXFNd9BKAKxqYWmBkeviEkjwxtMezlTgUF9fwAVMVwQi pyMUwsAhWrTrPuckguf5YdbtCnHS8+zIfumHg5Mdw1qs2SVpLDvor7KvRUjJafh6wYef AyZQ== X-Gm-Message-State: AFqh2krorAExrGLNJUqabaC5qAWF7CaULM5G9lel6j7cULQGd1BhyfNu z22sh/rZ9CkNg77vBuhREL/Hnw== X-Google-Smtp-Source: AMrXdXsq0aGkcmpSVefm8C3EMlsbGaK7lvGqxzZYrsvn/31+eK+d69jtkytPR+yjgqAzg6dpNX8+Xw== X-Received: by 2002:ac8:47cd:0:b0:3a7:e4ad:5499 with SMTP id d13-20020ac847cd000000b003a7e4ad5499mr70331981qtr.32.1672809923519; Tue, 03 Jan 2023 21:25:23 -0800 (PST) Received: from localhost.localdomain (c-66-31-16-167.hsd1.ma.comcast.net. [66.31.16.167]) by smtp.gmail.com with ESMTPSA id t1-20020ac865c1000000b003a7e4129f83sm19425602qto.85.2023.01.03.21.25.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 21:25:23 -0800 (PST) From: Dennis Lambe Jr To: Alessandro Zummo , Alexandre Belloni , Krzysztof Kozlowski , Rob Herring Cc: Atsushi Nemoto , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, Dennis Lambe Jr Subject: [PATCH v2 1/3] rtc: m41t80: probe: use IS_ENABLED for CONFIG_OF Date: Wed, 4 Jan 2023 05:25:04 +0000 Message-Id: <20230104052506.575619-2-dennis@sparkcharge.io> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230104052506.575619-1-dennis@sparkcharge.io> References: <20230104052506.575619-1-dennis@sparkcharge.io> MIME-Version: 1.0 X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_NONE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org The style guide recommends IS_ENABLED rather than ifdef for wrapping conditional code wherever possible. Functions that are only called on DeviceTree platforms would otherwise need to be cluttered up with __maybe_unused, which is especially undesirable if there's nothing inherently DT-specific about those functions. Signed-off-by: Dennis Lambe Jr --- Notes: v1 -> v2: spelling fix in changelog drivers/rtc/rtc-m41t80.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c index 494052dbd39f..f963b76e5fc0 100644 --- a/drivers/rtc/rtc-m41t80.c +++ b/drivers/rtc/rtc-m41t80.c @@ -909,10 +909,11 @@ static int m41t80_probe(struct i2c_client *client) if (IS_ERR(m41t80_data->rtc)) return PTR_ERR(m41t80_data->rtc); -#ifdef CONFIG_OF - wakeup_source = of_property_read_bool(client->dev.of_node, - "wakeup-source"); -#endif + if (IS_ENABLED(CONFIG_OF)) { + wakeup_source = of_property_read_bool(client->dev.of_node, + "wakeup-source"); + } + if (client->irq > 0) { rc = devm_request_threaded_irq(&client->dev, client->irq, NULL, m41t80_handle_irq, From patchwork Wed Jan 4 05:25:05 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dennis Lambe X-Patchwork-Id: 1721239 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2620:137:e000::1:20; helo=out1.vger.email; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="key not found in DNS" header.d=sparkcharge.io header.i=@sparkcharge.io header.a=rsa-sha256 header.s=google header.b=NKXV9Fm1; dkim-atps=neutral Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by legolas.ozlabs.org (Postfix) with ESMTP id 4Nmyjj6b1cz23fg for ; Wed, 4 Jan 2023 16:25:29 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230378AbjADFZ2 (ORCPT ); Wed, 4 Jan 2023 00:25:28 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55068 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229799AbjADFZ0 (ORCPT ); Wed, 4 Jan 2023 00:25:26 -0500 Received: from mail-qt1-x82d.google.com (mail-qt1-x82d.google.com [IPv6:2607:f8b0:4864:20::82d]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7B058165B3 for ; Tue, 3 Jan 2023 21:25:25 -0800 (PST) Received: by mail-qt1-x82d.google.com with SMTP id bp44so23865687qtb.0 for ; Tue, 03 Jan 2023 21:25:25 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sparkcharge.io; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=fFS/lCQcj6VGGmUkQIK4WQwbgzLe7pFGBO2z51//9yI=; b=NKXV9Fm1i9JCRE7A8ERMnQADG9tfJJIjStUM8uI7Zd1ba8vLDANg82dkmoa+A4r7Sl dMKbBcsWYvqtfPI5yAC8Wpfwwaa+El/4iXsUsGEcbwUdURkweWS3Ql8dQHpgDo7x+DFV B7iwmCI9JucvdJDoozwGq3krWcDfKRKAeRnggJW8JRif0eZ3xMQWEH2ty+qTL0iQ1G5u ioHd4/fZ4k+XseTlfWF0qSpOcMhp8zkf0OeXdPgIGhgjIcLws5ECpHVdSyh1LRS1UXau vfAcEakVoDcCZFkwqsaQ+xgpzxaZxeVBhYQcjLqrje261Y7VB5Z2avXB2P6B0u3UQYyK nl4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=fFS/lCQcj6VGGmUkQIK4WQwbgzLe7pFGBO2z51//9yI=; b=dnkxtvNsfCJm6r5v44st0E1rfI3RW7BkKxJvneyD5N6Z4qGtQ2+tPi+Kkfb89AQkxg g1uWjboVyvV4ZTePvVdNwBT8mxW1BVb7DcS18BYe/ed+MJ2o889AoIJBx5bckZ8XJO2m d7fiwAn9JrNgIC8lUsyv/TCKinfn5Biuda7AFZZ962iyK6FuLsjNIA08lt/8gY/izzZx 6XNMK3I9QgPaiv2WroweJLWu4DqaraM/oELM0DgX2q4qV3h4MQ0ursiR4wRCrB9KcENC SOJ/h3vaD2j9gjgMq5vrgVjkXvwWgMxQJAeCuyEvtA+ivt3+x2Kx7+CkdiVXzBI0TXXk 6IZw== X-Gm-Message-State: AFqh2krFj0LVuFQzjzHUebH93H7dL8dy30Aeb8EUxoLBCMh1NmPFGJj4 4xn2s84hXEjPbnPBd1ZDPDE5q5e8d6Rw0qJ/2Ec= X-Google-Smtp-Source: AMrXdXuJA0DQCbJ/n73PHFUtowQN37EANSgPuI19HQ2cdjPM/nUgKiD9pJSVDNum/6Gd4Cd7D0KzxQ== X-Received: by 2002:ac8:44d7:0:b0:3a5:4fa8:141c with SMTP id b23-20020ac844d7000000b003a54fa8141cmr74557522qto.23.1672809924601; Tue, 03 Jan 2023 21:25:24 -0800 (PST) Received: from localhost.localdomain (c-66-31-16-167.hsd1.ma.comcast.net. [66.31.16.167]) by smtp.gmail.com with ESMTPSA id t1-20020ac865c1000000b003a7e4129f83sm19425602qto.85.2023.01.03.21.25.23 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 21:25:24 -0800 (PST) From: Dennis Lambe Jr To: Alessandro Zummo , Alexandre Belloni , Krzysztof Kozlowski , Rob Herring Cc: Atsushi Nemoto , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, Dennis Lambe Jr Subject: [PATCH v2 2/3] dt-bindings: m41t80: add xtal load capacitance Date: Wed, 4 Jan 2023 05:25:05 +0000 Message-Id: <20230104052506.575619-3-dennis@sparkcharge.io> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230104052506.575619-1-dennis@sparkcharge.io> References: <20230104052506.575619-1-dennis@sparkcharge.io> MIME-Version: 1.0 X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_NONE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org The ST m41t82 and m41t83 support programmable load capacitance from 3.5 pF to 17.4 pF. The hardware defaults to 12.5 pF. The accuracy of the xtal can be calibrated precisely by adjusting the load capacitance. Add default, minimum, and maximum for the standard rtc property quartz-load-femtofarads on compatible devices. Signed-off-by: Dennis Lambe Jr Reviewed-by: Krzysztof Kozlowski --- Notes: v1 -> v2: remove accidental wakeup-sources line suggested by Krzysztof Kozlowski spelling fix in changelog .../devicetree/bindings/rtc/st,m41t80.yaml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/Documentation/devicetree/bindings/rtc/st,m41t80.yaml b/Documentation/devicetree/bindings/rtc/st,m41t80.yaml index fc9c6da6483f..6673adf6e99b 100644 --- a/Documentation/devicetree/bindings/rtc/st,m41t80.yaml +++ b/Documentation/devicetree/bindings/rtc/st,m41t80.yaml @@ -33,6 +33,11 @@ properties: "#clock-cells": const: 1 + quartz-load-femtofarads: + default: 12500 + minimum: 3500 + maximum: 17375 + clock-output-names: maxItems: 1 description: From common clock binding to override the default output clock name. @@ -46,6 +51,17 @@ properties: allOf: - $ref: rtc.yaml + - if: + not: + properties: + compatible: + contains: + enum: + - st,m41t82 + - st,m41t83 + then: + properties: + quartz-load-femtofarads: false unevaluatedProperties: false From patchwork Wed Jan 4 05:25:06 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dennis Lambe X-Patchwork-Id: 1721240 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org (client-ip=2620:137:e000::1:20; helo=out1.vger.email; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Authentication-Results: legolas.ozlabs.org; dkim=fail reason="key not found in DNS" header.d=sparkcharge.io header.i=@sparkcharge.io header.a=rsa-sha256 header.s=google header.b=i+ZpVp3m; dkim-atps=neutral Received: from out1.vger.email (out1.vger.email [IPv6:2620:137:e000::1:20]) by legolas.ozlabs.org (Postfix) with ESMTP id 4Nmyjk2kLMz23fh for ; Wed, 4 Jan 2023 16:25:30 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229799AbjADFZ3 (ORCPT ); Wed, 4 Jan 2023 00:25:29 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55078 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230297AbjADFZ1 (ORCPT ); Wed, 4 Jan 2023 00:25:27 -0500 Received: from mail-qt1-x831.google.com (mail-qt1-x831.google.com [IPv6:2607:f8b0:4864:20::831]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0EBDD15FE8 for ; Tue, 3 Jan 2023 21:25:26 -0800 (PST) Received: by mail-qt1-x831.google.com with SMTP id a16so26471674qtw.10 for ; Tue, 03 Jan 2023 21:25:26 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sparkcharge.io; s=google; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=jgeqi6RRPNuIjdr+16qci9xGfe9jHTKnAUBA+hjYEZ0=; b=i+ZpVp3mwT2dg7r2pBy6XLj5KfrohEUpJoq6O8hVqiGvmISCNWCgyBvYhOvbkvaoa+ 5qiXpGkGenGYuxhu2zeoOUvF2PHPgBk707lO27MDyn60VB4ufNR2/P5N7IIrtF5OSGap 4Sagp9ntb2S1Y17WVR/3IQLHGsBthABGCsCD3PGa7MibJHbwmvJ4h4LbMx0OcgAERHom /BAPz3rTSBREIrACwlIYwlAkXTIedssNQFaFtl2TDntb8m3V59YTG4UWu20ISvszMWr0 epwE+RbT4EkeWBJ214kfPPGJPuSnWeoBqE+On0vi+BUkgqMsLJgCLNatvRuxjln+Td1D EhMg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=jgeqi6RRPNuIjdr+16qci9xGfe9jHTKnAUBA+hjYEZ0=; b=P9h4J/jhA95KZMX/etu8G5/O7BDeKdxZNSg8X7zbauVMerCYPVKkcUcAe6AdXGAwdc MzCV7sdOBSTDV2h+txTNiFRCtjYXn+CkiTC+oEe35ectcUqVO8xFzxxgXSRsODC91BWp v9NIb7zxZVpN06LgHheM4U7XSmPMbTAad/ddlVgDtgRCwavuebIjBIO7KzbawwcxuqLy NvD1xy5OIkUpGcv2eKnU+QYbFomyWW7k4qjt3X81ARowEPaT3xRqsJ7+8Uy0WpTBPjDM +YnZdovcT0/Yyj1U131BEpQltN/uyY5hjgomzV8GytQmWVeTt9d6qRl6CbihquLZ8Iwg Q7eQ== X-Gm-Message-State: AFqh2koplXR8RMXlE4t7xo7ctoTMUAgqqA10qCxyI26PyV2wk/sOOkla N0l+mNHsUq/o2xSPqRAyq9pwaw== X-Google-Smtp-Source: AMrXdXsFdnvfK2zYz6sa3lAuau2z4Epb/qTRBrCqn6Ond7JrtcwYz5TNx9+t2yVxdNlvPd2wzL5bmQ== X-Received: by 2002:ac8:6896:0:b0:3ab:6cf1:1e7d with SMTP id m22-20020ac86896000000b003ab6cf11e7dmr63382460qtq.2.1672809925668; Tue, 03 Jan 2023 21:25:25 -0800 (PST) Received: from localhost.localdomain (c-66-31-16-167.hsd1.ma.comcast.net. [66.31.16.167]) by smtp.gmail.com with ESMTPSA id t1-20020ac865c1000000b003a7e4129f83sm19425602qto.85.2023.01.03.21.25.24 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 03 Jan 2023 21:25:25 -0800 (PST) From: Dennis Lambe Jr To: Alessandro Zummo , Alexandre Belloni , Krzysztof Kozlowski , Rob Herring Cc: Atsushi Nemoto , devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-rtc@vger.kernel.org, Dennis Lambe Jr Subject: [PATCH v2 3/3] rtc: m41t80: set xtal load capacitance from DT Date: Wed, 4 Jan 2023 05:25:06 +0000 Message-Id: <20230104052506.575619-4-dennis@sparkcharge.io> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20230104052506.575619-1-dennis@sparkcharge.io> References: <20230104052506.575619-1-dennis@sparkcharge.io> MIME-Version: 1.0 X-Spam-Status: No, score=-1.7 required=5.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,RCVD_IN_DNSWL_NONE,SPF_HELO_NONE,SPF_NONE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org Add support for specifying the xtal load capacitance in the DT node for devices with an Analog Calibration register. the m41t82 and m41t83 support xtal load capacitance from 3.5 pF to 17.4 pF. If no xtal load capacitance is specified, the battery-backed register won't be modified. The hardware defaults to 12.5 pF on reset. Signed-off-by: Dennis Lambe Jr --- drivers/rtc/rtc-m41t80.c | 75 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 71 insertions(+), 4 deletions(-) diff --git a/drivers/rtc/rtc-m41t80.c b/drivers/rtc/rtc-m41t80.c index f963b76e5fc0..85bde7130a4d 100644 --- a/drivers/rtc/rtc-m41t80.c +++ b/drivers/rtc/rtc-m41t80.c @@ -44,12 +44,17 @@ #define M41T80_REG_ALARM_MIN 0x0d #define M41T80_REG_ALARM_SEC 0x0e #define M41T80_REG_FLAGS 0x0f +#define M41T80_REG_AC 0x12 #define M41T80_REG_SQW 0x13 #define M41T80_DATETIME_REG_SIZE (M41T80_REG_YEAR + 1) #define M41T80_ALARM_REG_SIZE \ (M41T80_REG_ALARM_SEC + 1 - M41T80_REG_ALARM_MON) +#define M41T80_AC_MIN 3500 +#define M41T80_AC_MAX 17375 +#define M41T80_AC_DEFAULT 12500 + #define M41T80_SQW_MAX_FREQ 32768 #define M41T80_SEC_ST BIT(7) /* ST: Stop Bit */ @@ -68,6 +73,7 @@ #define M41T80_FEATURE_SQ BIT(2) /* Squarewave feature */ #define M41T80_FEATURE_WD BIT(3) /* Extra watchdog resolution */ #define M41T80_FEATURE_SQ_ALT BIT(4) /* RSx bits are in reg 4 */ +#define M41T80_FEATURE_AC BIT(5) /* Analog calibration */ static const struct i2c_device_id m41t80_id[] = { { "m41t62", M41T80_FEATURE_SQ | M41T80_FEATURE_SQ_ALT }, @@ -75,8 +81,10 @@ static const struct i2c_device_id m41t80_id[] = { { "m41t80", M41T80_FEATURE_SQ }, { "m41t81", M41T80_FEATURE_HT | M41T80_FEATURE_SQ}, { "m41t81s", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ }, - { "m41t82", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ }, - { "m41t83", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ }, + { "m41t82", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ + | M41T80_FEATURE_AC }, + { "m41t83", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ + | M41T80_FEATURE_AC }, { "m41st84", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ }, { "m41st85", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ }, { "m41st87", M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ }, @@ -108,11 +116,13 @@ static const __maybe_unused struct of_device_id m41t80_of_match[] = { }, { .compatible = "st,m41t82", - .data = (void *)(M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ) + .data = (void *)(M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ + | M41T80_FEATURE_AC) }, { .compatible = "st,m41t83", - .data = (void *)(M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ) + .data = (void *)(M41T80_FEATURE_HT | M41T80_FEATURE_BL | M41T80_FEATURE_SQ + | M41T80_FEATURE_AC) }, { .compatible = "st,m41t84", @@ -405,6 +415,54 @@ static const struct rtc_class_ops m41t80_rtc_ops = { .alarm_irq_enable = m41t80_alarm_irq_enable, }; +static u8 to_sign_magnitude_u8(int n) +{ + if (n < 0) + return 0x80 | -n; + return n; +} + +static int m41t80_encode_ac(int quartz_load) +{ + if (quartz_load < M41T80_AC_MIN || quartz_load > M41T80_AC_MAX) + return -EINVAL; + + /* + * register representation is the per-capacitor offset from its default + * value in units of 1/4 pF, in sign-magnitude form. + */ + return to_sign_magnitude_u8((quartz_load - M41T80_AC_DEFAULT) / 125); +} + +static int m41t80_set_ac(struct m41t80_data *m41t80_data, int quartz_load) +{ + struct i2c_client *client = m41t80_data->client; + struct device *dev = &client->dev; + int ret; + int ac; + + if (!(m41t80_data->features & M41T80_FEATURE_AC)) { + dev_err(dev, "analog calibration requested but not supported\n"); + return -EOPNOTSUPP; + } + + ac = m41t80_encode_ac(quartz_load); + if (ac < 0) { + dev_err(dev, "quartz load %d fF out of range\n", + quartz_load); + return ac; + } + + ret = i2c_smbus_write_byte_data(client, M41T80_REG_AC, ac); + if (ret < 0) { + dev_err(dev, "Can't set AC register\n"); + return ret; + } + + dev_info(dev, "quartz load set to %d fF (AC=0x%x)\n", quartz_load, ac); + return 0; +} + #ifdef CONFIG_PM_SLEEP static int m41t80_suspend(struct device *dev) { @@ -883,6 +941,7 @@ static int m41t80_probe(struct i2c_client *client) struct rtc_time tm; struct m41t80_data *m41t80_data = NULL; bool wakeup_source = false; + u32 quartz_load = M41T80_AC_DEFAULT; if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_I2C_BLOCK | I2C_FUNC_SMBUS_BYTE_DATA)) { @@ -912,6 +971,14 @@ static int m41t80_probe(struct i2c_client *client) if (IS_ENABLED(CONFIG_OF)) { wakeup_source = of_property_read_bool(client->dev.of_node, "wakeup-source"); + + rc = of_property_read_u32(client->dev.of_node, + "quartz-load-femtofarads", + &quartz_load); + if (!rc) + m41t80_set_ac(m41t80_data, quartz_load); + else if (rc != -EINVAL) + dev_err(&client->dev, "quartz-load-femtofarads property value is missing or invalid\n"); } if (client->irq > 0) {