From patchwork Wed May 16 21:08:39 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giulio Benetti X-Patchwork-Id: 914955 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=micronovasrl.com Authentication-Results: ozlabs.org; dkim=fail reason="key not found in DNS" (0-bit key; unprotected) header.d=micronovasrl.com header.i=@micronovasrl.com header.b="Tqd9SCwV"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40mRr65mlsz9s1d for ; Thu, 17 May 2018 07:08:54 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751474AbeEPVIw (ORCPT ); Wed, 16 May 2018 17:08:52 -0400 Received: from mail.micronovasrl.com ([212.103.203.10]:55314 "EHLO mail.micronovasrl.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751290AbeEPVIw (ORCPT ); Wed, 16 May 2018 17:08:52 -0400 Received: from mail.micronovasrl.com (mail.micronovasrl.com [127.0.0.1]) by mail.micronovasrl.com (Postfix) with ESMTP id E6C5FB0098C for ; Wed, 16 May 2018 23:08:50 +0200 (CEST) Authentication-Results: mail.micronovasrl.com (amavisd-new); dkim=pass reason="pass (just generated, assumed good)" header.d=micronovasrl.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=micronovasrl.com; h=x-mailer:message-id:date:date:subject:subject:to:from:from; s=dkim; t=1526504930; x=1527368931; bh=WEU3Rr3UzKxvim0FdETImUxJ +vpzdcUN2Onog0bfsBE=; b=Tqd9SCwVvxBkPyaR/Pa42q3Q4wO4YOPsEe8orXiu hZ9yX9ByQpvA9wSJfLTRahjGJ2hnGJkj/cr24QBEt/wg0R5qB4VLMm0siOkpUXNv L9hmVGrkQ/no3DsY0NCLQ8UH+R9XrGc5xy1fWNiZZUejNR77boEpsRlrqyYP0lBl D9s= X-Virus-Scanned: Debian amavisd-new at mail.micronovasrl.com X-Spam-Flag: NO X-Spam-Score: -2.9 X-Spam-Level: X-Spam-Status: No, score=-2.9 tagged_above=-10 required=4.5 tests=[ALL_TRUSTED=-1, BAYES_00=-1.9] autolearn=unavailable autolearn_force=no Received: from mail.micronovasrl.com ([127.0.0.1]) by mail.micronovasrl.com (mail.micronovasrl.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id FC9CxbcnQYWX for ; Wed, 16 May 2018 23:08:50 +0200 (CEST) Received: from localhost.localdomain (unknown [192.168.123.79]) by mail.micronovasrl.com (Postfix) with ESMTPSA id 23D16B000D8; Wed, 16 May 2018 23:08:49 +0200 (CEST) From: Giulio Benetti To: a.zummo@towertech.it, alexandre.belloni@bootlin.com Cc: robh+dt@kernel.org, mark.rutland@arm.com, linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, andy.shevchenko@gmail.com, Giulio Benetti Subject: [PATCH v6 1/4] rtc: ds1307: fix data pointer to m41t0 Date: Wed, 16 May 2018 23:08:39 +0200 Message-Id: <20180516210842.5874-1-giulio.benetti@micronovasrl.com> X-Mailer: git-send-email 2.17.0 Sender: linux-rtc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org data field points to m41t00, instead it should point to m41t0. Driver works correctly because on both cases(m41t0 and m41t00) chip_desc are equal. Point to right enum m41t0 instead of m41t00. Signed-off-by: Giulio Benetti --- drivers/rtc/rtc-ds1307.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index a13e59edff53..32aadcbc377f 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -298,7 +298,7 @@ static const struct of_device_id ds1307_of_match[] = { }, { .compatible = "st,m41t0", - .data = (void *)m41t00 + .data = (void *)m41t0 }, { .compatible = "st,m41t00", From patchwork Wed May 16 21:08:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giulio Benetti X-Patchwork-Id: 914959 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=micronovasrl.com Authentication-Results: ozlabs.org; dkim=fail reason="key not found in DNS" (0-bit key; unprotected) header.d=micronovasrl.com header.i=@micronovasrl.com header.b="uHTx2bp+"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40mRsx6HCGz9s0q for ; Thu, 17 May 2018 07:10:29 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752075AbeEPVK3 (ORCPT ); Wed, 16 May 2018 17:10:29 -0400 Received: from mail.micronovasrl.com ([212.103.203.10]:55370 "EHLO mail.micronovasrl.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751892AbeEPVIx (ORCPT ); Wed, 16 May 2018 17:08:53 -0400 Received: from mail.micronovasrl.com (mail.micronovasrl.com [127.0.0.1]) by mail.micronovasrl.com (Postfix) with ESMTP id 314CFB00999 for ; Wed, 16 May 2018 23:08:52 +0200 (CEST) Authentication-Results: mail.micronovasrl.com (amavisd-new); dkim=pass reason="pass (just generated, assumed good)" header.d=micronovasrl.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=micronovasrl.com; h=references:in-reply-to:x-mailer:message-id:date:date:subject :subject:to:from:from; s=dkim; t=1526504931; x=1527368932; bh=EI pJ9GdokAbg3XsS8XKE4NtMy7/BOt0Ww6UG442qvsE=; b=uHTx2bp+QVJHURw4ls 6+pRkPNlULULByHx1kDtLv7ykZUgf59yE7QZE4ZLLP8yLECT73LEnfZEgGUmYoLO Tn66vYihFo3d4gJgp1IawheN2P4y2Yb+abDiRXRjaYxVCwsR+rVZx+J2PUU28Fbo Y751U/S7iS8pOOhRhBWT1ZV80= X-Virus-Scanned: Debian amavisd-new at mail.micronovasrl.com X-Spam-Flag: NO X-Spam-Score: -2.9 X-Spam-Level: X-Spam-Status: No, score=-2.9 tagged_above=-10 required=4.5 tests=[ALL_TRUSTED=-1, BAYES_00=-1.9] autolearn=unavailable autolearn_force=no Received: from mail.micronovasrl.com ([127.0.0.1]) by mail.micronovasrl.com (mail.micronovasrl.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id 46UMb7xfq5jX for ; Wed, 16 May 2018 23:08:51 +0200 (CEST) Received: from localhost.localdomain (unknown [192.168.123.79]) by mail.micronovasrl.com (Postfix) with ESMTPSA id 1AB20B00126; Wed, 16 May 2018 23:08:50 +0200 (CEST) From: Giulio Benetti To: a.zummo@towertech.it, alexandre.belloni@bootlin.com Cc: robh+dt@kernel.org, mark.rutland@arm.com, linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, andy.shevchenko@gmail.com, Giulio Benetti Subject: [PATCH v6 2/4] rtc: ds1307: support m41t11 variant Date: Wed, 16 May 2018 23:08:40 +0200 Message-Id: <20180516210842.5874-2-giulio.benetti@micronovasrl.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180516210842.5874-1-giulio.benetti@micronovasrl.com> References: <20180516210842.5874-1-giulio.benetti@micronovasrl.com> Sender: linux-rtc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org The m41t11 variant is very similar to the already supported m41t00 and m41t0, but it has also 56 bytes of NVRAM. Add it to driver taking into account NVRAM section. Signed-off-by: Giulio Benetti Reviewed-by: Rob Herring --- .../devicetree/bindings/rtc/rtc-ds1307.txt | 1 + drivers/rtc/rtc-ds1307.c | 14 ++++++++++++++ 2 files changed, 15 insertions(+) diff --git a/Documentation/devicetree/bindings/rtc/rtc-ds1307.txt b/Documentation/devicetree/bindings/rtc/rtc-ds1307.txt index d28d6e7f6ae8..ce6469c1a516 100644 --- a/Documentation/devicetree/bindings/rtc/rtc-ds1307.txt +++ b/Documentation/devicetree/bindings/rtc/rtc-ds1307.txt @@ -13,6 +13,7 @@ Required properties: "maxim,ds3231", "st,m41t0", "st,m41t00", + "st,m41t11", "microchip,mcp7940x", "microchip,mcp7941x", "pericom,pt7c4338", diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 32aadcbc377f..0ab0c166da83 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -44,6 +44,7 @@ enum ds_type { ds_3231, m41t0, m41t00, + m41t11, mcp794xx, rx_8025, rx_8130, @@ -226,6 +227,11 @@ static const struct chip_desc chips[last_ds_type] = { .irq_handler = rx8130_irq, .rtc_ops = &rx8130_rtc_ops, }, + [m41t11] = { + /* this is battery backed SRAM */ + .nvram_offset = 8, + .nvram_size = 56, + }, [mcp794xx] = { .alarm = 1, /* this is battery backed SRAM */ @@ -248,6 +254,7 @@ static const struct i2c_device_id ds1307_id[] = { { "ds3231", ds_3231 }, { "m41t0", m41t0 }, { "m41t00", m41t00 }, + { "m41t11", m41t11 }, { "mcp7940x", mcp794xx }, { "mcp7941x", mcp794xx }, { "pt7c4338", ds_1307 }, @@ -304,6 +311,10 @@ static const struct of_device_id ds1307_of_match[] = { .compatible = "st,m41t00", .data = (void *)m41t00 }, + { + .compatible = "st,m41t11", + .data = (void *)m41t11 + }, { .compatible = "microchip,mcp7940x", .data = (void *)mcp794xx @@ -346,6 +357,7 @@ static const struct acpi_device_id ds1307_acpi_ids[] = { { .id = "DS3231", .driver_data = ds_3231 }, { .id = "M41T0", .driver_data = m41t0 }, { .id = "M41T00", .driver_data = m41t00 }, + { .id = "M41T11", .driver_data = m41t11 }, { .id = "MCP7940X", .driver_data = mcp794xx }, { .id = "MCP7941X", .driver_data = mcp794xx }, { .id = "PT7C4338", .driver_data = ds_1307 }, @@ -1574,6 +1586,7 @@ static int ds1307_probe(struct i2c_client *client, case ds_1307: case m41t0: case m41t00: + case m41t11: /* clock halted? turn it on, so clock can tick. */ if (tmp & DS1307_BIT_CH) { regmap_write(ds1307->regmap, DS1307_REG_SECS, 0); @@ -1639,6 +1652,7 @@ static int ds1307_probe(struct i2c_client *client, case ds_1340: case m41t0: case m41t00: + case m41t11: /* * NOTE: ignores century bits; fix before deploying * systems that will run through year 2100. From patchwork Wed May 16 21:08:41 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giulio Benetti X-Patchwork-Id: 914956 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=micronovasrl.com Authentication-Results: ozlabs.org; dkim=fail reason="key not found in DNS" (0-bit key; unprotected) header.d=micronovasrl.com header.i=@micronovasrl.com header.b="ONxsuEEV"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40mRr90NBGz9s0q for ; Thu, 17 May 2018 07:08:57 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752208AbeEPVI4 (ORCPT ); Wed, 16 May 2018 17:08:56 -0400 Received: from mail.micronovasrl.com ([212.103.203.10]:55366 "EHLO mail.micronovasrl.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752200AbeEPVIz (ORCPT ); Wed, 16 May 2018 17:08:55 -0400 Received: from mail.micronovasrl.com (mail.micronovasrl.com [127.0.0.1]) by mail.micronovasrl.com (Postfix) with ESMTP id 39334B00999 for ; Wed, 16 May 2018 23:08:54 +0200 (CEST) Authentication-Results: mail.micronovasrl.com (amavisd-new); dkim=pass reason="pass (just generated, assumed good)" header.d=micronovasrl.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=micronovasrl.com; h=references:in-reply-to:x-mailer:message-id:date:date:subject :subject:to:from:from; s=dkim; t=1526504933; x=1527368934; bh=RQ yWnOMEoK1JzY0ta7pNvCCF7y8YpqDVSOrtvg5Ypm8=; b=ONxsuEEVhOdiIYOTDA r705eT/E2duwMkujruV65BHrOp8GHiB58XJg8cYTA3Y5H7vkOF1+KLEOW4tiKEDt jbAqLZ+qAqx1VNYXaTsC1eS61jJHSrpvZ0yfsRQSfe/MY6r4j8NxVNZU+zEocPUZ zWH7fEhkYMTIWyqy4xWnjCfF0= X-Virus-Scanned: Debian amavisd-new at mail.micronovasrl.com X-Spam-Flag: NO X-Spam-Score: -2.9 X-Spam-Level: X-Spam-Status: No, score=-2.9 tagged_above=-10 required=4.5 tests=[ALL_TRUSTED=-1, BAYES_00=-1.9] autolearn=unavailable autolearn_force=no Received: from mail.micronovasrl.com ([127.0.0.1]) by mail.micronovasrl.com (mail.micronovasrl.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id hFVJ484B7Nz6 for ; Wed, 16 May 2018 23:08:53 +0200 (CEST) Received: from localhost.localdomain (unknown [192.168.123.79]) by mail.micronovasrl.com (Postfix) with ESMTPSA id 51B86B00883; Wed, 16 May 2018 23:08:51 +0200 (CEST) From: Giulio Benetti To: a.zummo@towertech.it, alexandre.belloni@bootlin.com Cc: robh+dt@kernel.org, mark.rutland@arm.com, linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, andy.shevchenko@gmail.com, Giulio Benetti Subject: [PATCH v6 3/4] rtc: ds1307: add offset sysfs for mt41txx chips. Date: Wed, 16 May 2018 23:08:41 +0200 Message-Id: <20180516210842.5874-3-giulio.benetti@micronovasrl.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180516210842.5874-1-giulio.benetti@micronovasrl.com> References: <20180516210842.5874-1-giulio.benetti@micronovasrl.com> Sender: linux-rtc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org m41txx chips can hold a calibration value to get correct clock bias. Add offset handling (ranging between -63ppm and 126ppm) via sysfs. Signed-off-by: Giulio Benetti --- drivers/rtc/rtc-ds1307.c | 81 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 0ab0c166da83..2797d01bfa1d 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -114,6 +114,20 @@ enum ds_type { # define RX8025_BIT_VDET 0x40 # define RX8025_BIT_XST 0x20 +#define M41TXX_REG_CONTROL 0x07 +# define M41TXX_BIT_OUT 0x80 +# define M41TXX_BIT_FT 0x40 +# define M41TXX_BIT_CALIB_SIGN 0x20 +# define M41TXX_M_CALIBRATION 0x1f + +/* negative offset step is -2.034ppm */ +#define M41TXX_NEG_OFFSET_STEP_PPM 2034 +/* positive offset step is +4.068ppm */ +#define M41TXX_POS_OFFSET_STEP_PPM 4068 +/* Min and max values supported with 'offset' interface by M41TXX */ +#define M41TXX_MIN_OFFSET (((-31) * M41TXX_NEG_OFFSET_STEP_PPM) / 1000) +#define M41TXX_MAX_OFFSET (((31) * M41TXX_POS_OFFSET_STEP_PPM) / 1000) + struct ds1307 { enum ds_type type; unsigned long flags; @@ -146,6 +160,9 @@ struct chip_desc { static int ds1307_get_time(struct device *dev, struct rtc_time *t); static int ds1307_set_time(struct device *dev, struct rtc_time *t); +static int ds1337_read_alarm(struct device *dev, struct rtc_wkalrm *t); +static int ds1337_set_alarm(struct device *dev, struct rtc_wkalrm *t); +static int ds1307_alarm_irq_enable(struct device *dev, unsigned int enabled); static u8 do_trickle_setup_ds1339(struct ds1307 *, u32 ohms, bool diode); static irqreturn_t rx8130_irq(int irq, void *dev_id); static int rx8130_read_alarm(struct device *dev, struct rtc_wkalrm *t); @@ -155,6 +172,8 @@ static irqreturn_t mcp794xx_irq(int irq, void *dev_id); static int mcp794xx_read_alarm(struct device *dev, struct rtc_wkalrm *t); static int mcp794xx_set_alarm(struct device *dev, struct rtc_wkalrm *t); static int mcp794xx_alarm_irq_enable(struct device *dev, unsigned int enabled); +static int m41txx_rtc_read_offset(struct device *dev, long *offset); +static int m41txx_rtc_set_offset(struct device *dev, long offset); static const struct rtc_class_ops rx8130_rtc_ops = { .read_time = ds1307_get_time, @@ -172,6 +191,16 @@ static const struct rtc_class_ops mcp794xx_rtc_ops = { .alarm_irq_enable = mcp794xx_alarm_irq_enable, }; +static const struct rtc_class_ops m41txx_rtc_ops = { + .read_time = ds1307_get_time, + .set_time = ds1307_set_time, + .read_alarm = ds1337_read_alarm, + .set_alarm = ds1337_set_alarm, + .alarm_irq_enable = ds1307_alarm_irq_enable, + .read_offset = m41txx_rtc_read_offset, + .set_offset = m41txx_rtc_set_offset, +}; + static const struct chip_desc chips[last_ds_type] = { [ds_1307] = { .nvram_offset = 8, @@ -227,10 +256,17 @@ static const struct chip_desc chips[last_ds_type] = { .irq_handler = rx8130_irq, .rtc_ops = &rx8130_rtc_ops, }, + [m41t0] = { + .rtc_ops = &m41txx_rtc_ops, + }, + [m41t00] = { + .rtc_ops = &m41txx_rtc_ops, + }, [m41t11] = { /* this is battery backed SRAM */ .nvram_offset = 8, .nvram_size = 56, + .rtc_ops = &m41txx_rtc_ops, }, [mcp794xx] = { .alarm = 1, @@ -972,6 +1008,51 @@ static int mcp794xx_alarm_irq_enable(struct device *dev, unsigned int enabled) enabled ? MCP794XX_BIT_ALM0_EN : 0); } +static int m41txx_rtc_read_offset(struct device *dev, long *offset) +{ + struct ds1307 *ds1307 = dev_get_drvdata(dev); + unsigned int ctrl_reg; + u8 val; + + regmap_read(ds1307->regmap, M41TXX_REG_CONTROL, &ctrl_reg); + + val = ctrl_reg & M41TXX_M_CALIBRATION; + + /* check if positive */ + if (ctrl_reg & M41TXX_BIT_CALIB_SIGN) + *offset = (val * M41TXX_POS_OFFSET_STEP_PPM); + else + *offset = -(val * M41TXX_NEG_OFFSET_STEP_PPM); + + *offset = DIV_ROUND_CLOSEST(*offset, 1000); + + return 0; +} + +static int m41txx_rtc_set_offset(struct device *dev, long offset) +{ + struct ds1307 *ds1307 = dev_get_drvdata(dev); + unsigned int ctrl_reg; + + if ((offset < M41TXX_MIN_OFFSET) || (offset > M41TXX_MAX_OFFSET)) + return -ERANGE; + + offset *= 1000; + + if (offset >= 0) { + ctrl_reg = DIV_ROUND_CLOSEST(offset, + M41TXX_POS_OFFSET_STEP_PPM); + ctrl_reg |= M41TXX_BIT_CALIB_SIGN; + } else { + ctrl_reg = DIV_ROUND_CLOSEST(abs(offset), + M41TXX_NEG_OFFSET_STEP_PPM); + } + + return regmap_update_bits(ds1307->regmap, M41TXX_REG_CONTROL, + M41TXX_M_CALIBRATION | M41TXX_BIT_CALIB_SIGN, + ctrl_reg); +} + /*----------------------------------------------------------------------*/ static int ds1307_nvram_read(void *priv, unsigned int offset, void *val, From patchwork Wed May 16 21:08:42 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Giulio Benetti X-Patchwork-Id: 914957 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-rtc-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=micronovasrl.com Authentication-Results: ozlabs.org; dkim=fail reason="key not found in DNS" (0-bit key; unprotected) header.d=micronovasrl.com header.i=@micronovasrl.com header.b="WvXVJyJc"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 40mRs96T3Gz9s0q for ; Thu, 17 May 2018 07:09:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751028AbeEPVJr (ORCPT ); Wed, 16 May 2018 17:09:47 -0400 Received: from mail.micronovasrl.com ([212.103.203.10]:55408 "EHLO mail.micronovasrl.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752204AbeEPVI4 (ORCPT ); Wed, 16 May 2018 17:08:56 -0400 Received: from mail.micronovasrl.com (mail.micronovasrl.com [127.0.0.1]) by mail.micronovasrl.com (Postfix) with ESMTP id 5875CB00985 for ; Wed, 16 May 2018 23:08:55 +0200 (CEST) Authentication-Results: mail.micronovasrl.com (amavisd-new); dkim=pass reason="pass (just generated, assumed good)" header.d=micronovasrl.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=micronovasrl.com; h=references:in-reply-to:x-mailer:message-id:date:date:subject :subject:to:from:from; s=dkim; t=1526504934; x=1527368935; bh=X5 3Kl5f+R/zDnoFjhDEW/l7kg7G4vUYC0rOrOmHxvl8=; b=WvXVJyJcLMHEjPu5Z4 X/WRUW2OXJ0JqwIMWDNfnXKQQW9HMDfDKjsJ1ZmUJH2yz2kFEv5AzmIYbAMasqz0 0sRWNAON9ZcOnpiq/nBymV+sUqdTIZF2twnUfl8jC7c9p2vz3ZwvAgcxQ14NAN6J xxQq+7OyCWvu8nD3pOT5RjaxA= X-Virus-Scanned: Debian amavisd-new at mail.micronovasrl.com X-Spam-Flag: NO X-Spam-Score: -2.9 X-Spam-Level: X-Spam-Status: No, score=-2.9 tagged_above=-10 required=4.5 tests=[ALL_TRUSTED=-1, BAYES_00=-1.9] autolearn=unavailable autolearn_force=no Received: from mail.micronovasrl.com ([127.0.0.1]) by mail.micronovasrl.com (mail.micronovasrl.com [127.0.0.1]) (amavisd-new, port 10026) with ESMTP id NvAltVuGX3SX for ; Wed, 16 May 2018 23:08:54 +0200 (CEST) Received: from localhost.localdomain (unknown [192.168.123.79]) by mail.micronovasrl.com (Postfix) with ESMTPSA id 79DECB0098A; Wed, 16 May 2018 23:08:52 +0200 (CEST) From: Giulio Benetti To: a.zummo@towertech.it, alexandre.belloni@bootlin.com Cc: robh+dt@kernel.org, mark.rutland@arm.com, linux-rtc@vger.kernel.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, andy.shevchenko@gmail.com, Giulio Benetti Subject: [PATCH v6 4/4] rtc: ds1307: add frequency_test_enable sysfs attribute to check tick on m41txx Date: Wed, 16 May 2018 23:08:42 +0200 Message-Id: <20180516210842.5874-4-giulio.benetti@micronovasrl.com> X-Mailer: git-send-email 2.17.0 In-Reply-To: <20180516210842.5874-1-giulio.benetti@micronovasrl.com> References: <20180516210842.5874-1-giulio.benetti@micronovasrl.com> Sender: linux-rtc-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-rtc@vger.kernel.org On m41txx you can enable open-drain OUT pin to check if offset is ok. Enabling OUT pin with frequency_test_enable attribute, OUT pin will tick 512 times faster than 1s tick base. Enable or Disable FT bit on CONTROL register if freq_test is 1 or 0. Signed-off-by: Giulio Benetti --- V5 => V6 * frequency_test_enable handled as a boolean drivers/rtc/rtc-ds1307.c | 96 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 2797d01bfa1d..b2e87845d860 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -1053,6 +1053,96 @@ static int m41txx_rtc_set_offset(struct device *dev, long offset) ctrl_reg); } +static ssize_t frequency_test_enable_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct ds1307 *ds1307 = dev_get_drvdata(dev); + bool freq_test_en = 0; + int ret; + + ret = kstrtobool(buf, &freq_test_en); + if (ret == -EINVAL) { + dev_err(dev, "Failed to store RTC Frequency Test attribute\n"); + return ret; + } + + regmap_update_bits(ds1307->regmap, M41TXX_REG_CONTROL, M41TXX_BIT_FT, + freq_test_en ? M41TXX_BIT_FT : 0); + + return count; +} + +static ssize_t frequency_test_enable_show(struct device *dev, + struct device_attribute *attr, + char *buf) +{ + struct ds1307 *ds1307 = dev_get_drvdata(dev); + unsigned int ctrl_reg; + + regmap_read(ds1307->regmap, M41TXX_REG_CONTROL, &ctrl_reg); + + if (ctrl_reg & M41TXX_BIT_FT) + return scnprintf(buf, PAGE_SIZE, "on\n"); + else + return scnprintf(buf, PAGE_SIZE, "off\n"); +} + +static DEVICE_ATTR_RW(frequency_test_enable); + +static struct attribute *rtc_freq_test_attrs[] = { + &dev_attr_frequency_test_enable.attr, + NULL, +}; + +static const struct attribute_group rtc_freq_test_attr_group = { + .attrs = rtc_freq_test_attrs, +}; + +static void rtc_calib_remove_sysfs_group(void *_dev) +{ + struct device *dev = _dev; + + sysfs_remove_group(&dev->kobj, &rtc_freq_test_attr_group); +} + +static int ds1307_add_frequency_test(struct ds1307 *ds1307) +{ + int err = 0; + + switch (ds1307->type) { + case m41t0: + case m41t00: + case m41t11: + /* Export sysfs entries */ + err = sysfs_create_group(&(ds1307->dev)->kobj, + &rtc_freq_test_attr_group); + if (err) { + dev_err(ds1307->dev, + "Failed to create sysfs group: %d\n", + err); + return err; + } + + err = devm_add_action_or_reset(ds1307->dev, + rtc_calib_remove_sysfs_group, + ds1307->dev); + if (err) { + dev_err(ds1307->dev, + "Failed to add sysfs cleanup action: %d\n", + err); + sysfs_remove_group(&(ds1307->dev)->kobj, + &rtc_freq_test_attr_group); + return err; + } + break; + default: + break; + } + + return err; +} + /*----------------------------------------------------------------------*/ static int ds1307_nvram_read(void *priv, unsigned int offset, void *val, @@ -1794,6 +1884,12 @@ static int ds1307_probe(struct i2c_client *client, if (err) return err; + err = ds1307_add_frequency_test(ds1307); + if (err) { + rtc_device_unregister(ds1307->rtc); + return err; + } + if (chip->nvram_size) { struct nvmem_config nvmem_cfg = { .name = "ds1307_nvram",