From patchwork Mon Sep 8 07:32:24 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matti Vaittinen X-Patchwork-Id: 386797 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-qa0-x23c.google.com (mail-qa0-x23c.google.com [IPv6:2607:f8b0:400d:c00::23c]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 5F3A714012C for ; Mon, 8 Sep 2014 16:28:26 +1000 (EST) Received: by mail-qa0-f60.google.com with SMTP id w8sf3038709qac.25 for ; Sun, 07 Sep 2014 23:28:24 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlegroups.com; s=20120806; h=date:from:to:cc:subject:message-id:mime-version:user-agent :x-original-sender:x-original-authentication-results:reply-to :precedence:mailing-list:list-id:list-post:list-help:list-archive :sender:list-subscribe:list-unsubscribe:content-type :content-disposition; bh=CsXR+fAAVZgoLRb3ZoI3FQHqg1VBUX3cSTjkfRcc9n4=; b=emgCVCp4ja0QXXjCfW7mt5rVpHyjmdHDTYL4N9gfnS0JVhjjQ1J0vA07yx7OHFopx/ p9OQDssg/9xvySQ3PxKqPy1k0TvYODutJ84jxOXi/SdiGSJgb6WeWnCEqJ778F0MvpTx KcZnudeE6ak9tGYK+2BzKo3OBSbU3FXkkLkZjIEM+E5KWj5VUbzLKhVqMDK4QN6NfDFN Ey0BAVPNnFFnUJoH4XY9HBBhNcjVFMmq9grlUPHVQeAhfBVIAhlvs0MtXm0ft25KJi5k mH53D8TNJBm65mCYdW6MCvmfKJXSTvBN+t55orw0ghsQb8+QHSGYnsMBuEuk6l5ZkNHr LeUQ== X-Received: by 10.182.232.225 with SMTP id tr1mr101obc.41.1410157704491; Sun, 07 Sep 2014 23:28:24 -0700 (PDT) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.182.85.138 with SMTP id h10ls668189obz.80.gmail; Sun, 07 Sep 2014 23:28:23 -0700 (PDT) X-Received: by 10.182.45.162 with SMTP id o2mr17157624obm.20.1410157703853; Sun, 07 Sep 2014 23:28:23 -0700 (PDT) Received: from demumfd002.nsn-inter.net (demumfd002.nsn-inter.net. [93.183.12.31]) by gmr-mx.google.com with ESMTPS id pp6si1171384pac.0.2014.09.07.23.28.22 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Sun, 07 Sep 2014 23:28:23 -0700 (PDT) Received-SPF: pass (google.com: domain of matti.vaittinen@nsn.com designates 93.183.12.31 as permitted sender) client-ip=93.183.12.31; Received: from demuprx016.emea.nsn-intra.net ([10.150.129.55]) by demumfd002.nsn-inter.net (8.14.3/8.14.3) with ESMTP id s886S9N5022554 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Mon, 8 Sep 2014 06:28:09 GMT Received: from fi-ourus-dhcp00977.emea.nsn-net.net ([10.145.11.157]) by demuprx016.emea.nsn-intra.net (8.12.11.20060308/8.12.11) with SMTP id s886S1l4030734; Mon, 8 Sep 2014 08:28:01 +0200 Date: Mon, 8 Sep 2014 10:32:24 +0300 From: Matti Vaittinen To: robh+dt@kernel.org, pawel.moll@arm.com, mark.rutland@arm.com, ijc+devicetree@hellion.org.uk, galak@codeaurora.org, "jason@lakedaemon.net" , "linux@roeck-us.net" Cc: a.zummo@towertech.it, "jic23@kernel.org" , "arno@natisbad.org" , jgunthorpe@obsidianresearch.com, san@rosetechnology.dk, hs@denx.de, "devicetree@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "rtc-linux@googlegroups.com" , Sverdlin Alexander Subject: [rtc-linux] [RESEND PATCH v3] rtc: ds1307: add trickle charger device tree binding Message-ID: <20140908073216.GA20850@fi-ourus-dhcp00977.emea.nsn-net.net> MIME-Version: 1.0 User-Agent: Mutt/1.5.21 (2010-09-15) X-purgate-type: clean X-purgate-Ad: Categorized by eleven eXpurgate (R) http://www.eleven.de X-purgate: clean X-purgate: This mail is considered clean (visit http://www.eleven.de for further information) X-purgate-size: 5959 X-purgate-ID: 151667::1410157691-000023E0-85AD33F6/0/0 X-Original-Sender: matti.vaittinen@nsn.com X-Original-Authentication-Results: gmr-mx.google.com; spf=pass (google.com: domain of matti.vaittinen@nsn.com designates 93.183.12.31 as permitted sender) smtp.mail=matti.vaittinen@nsn.com Reply-To: rtc-linux@googlegroups.com Precedence: list Mailing-list: list rtc-linux@googlegroups.com; contact rtc-linux+owners@googlegroups.com List-ID: X-Google-Group-Id: 712029733259 List-Post: , List-Help: , List-Archive: , List-Unsubscribe: , Content-Disposition: inline Hi dt bindings maintainers (and others interested in device-tree bindings), I would like to get this included in your tree. Do you think there is still something I could improve/change in order to get this accepted? Or do you think I should address this to someone else? Some DS13XX devices have "trickle chargers". Introduce a device tree binding for specifying the trickle charger configuration for ds1339. Signed-off-by: Matti Vaittinen Acked-by: Jason Cooper --- .../devicetree/bindings/i2c/trivial-devices.txt | 1 - .../devicetree/bindings/rtc/dallas,ds1339.txt | 18 ++++++ drivers/rtc/rtc-ds1307.c | 66 ++++++++++++++++++++-- 3 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 Documentation/devicetree/bindings/rtc/dallas,ds1339.txt diff --git a/Documentation/devicetree/bindings/i2c/trivial-devices.txt b/Documentation/devicetree/bindings/i2c/trivial-devices.txt index 6af570e..e9206a4 100644 --- a/Documentation/devicetree/bindings/i2c/trivial-devices.txt +++ b/Documentation/devicetree/bindings/i2c/trivial-devices.txt @@ -35,7 +35,6 @@ catalyst,24c32 i2c serial eeprom cirrus,cs42l51 Cirrus Logic CS42L51 audio codec dallas,ds1307 64 x 8, Serial, I2C Real-Time Clock dallas,ds1338 I2C RTC with 56-Byte NV RAM -dallas,ds1339 I2C Serial Real-Time Clock dallas,ds1340 I2C RTC with Trickle Charger dallas,ds1374 I2C, 32-Bit Binary Counter Watchdog RTC with Trickle Charger and Reset Input/Output dallas,ds1631 High-Precision Digital Thermometer diff --git a/Documentation/devicetree/bindings/rtc/dallas,ds1339.txt b/Documentation/devicetree/bindings/rtc/dallas,ds1339.txt new file mode 100644 index 0000000..fba65b2 --- /dev/null +++ b/Documentation/devicetree/bindings/rtc/dallas,ds1339.txt @@ -0,0 +1,18 @@ +* Dallas DS1339 I2C Serial Real-Time Clock + +Required properties: +- compatible: Should contain "dallas,ds1339". +- reg: I2C address for chip + +Optional properties: +- trickle-resistor-ohms : Selected resistor for trickle charger + Values usable for ds1339 are 250, 2000, 4000 + Should be given if trickle charger should be enabled +- trickle-diode-enable : Use internal trickle charger diode + Should be given if internal trickle charger diode should be enabled +Example: + ds1339: rtc@68 { + compatible = "dallas,ds1339"; + trickle-resistor-ohms = <250>; + reg = <0x68>; + }; diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index f03d5ba..b297c2c 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -126,9 +126,14 @@ struct chip_desc { u16 nvram_offset; u16 nvram_size; u16 trickle_charger_reg; + u8 trickle_charger_setup; + u8 (*do_trickle_setup)(struct i2c_client *, uint32_t, bool); }; -static const struct chip_desc chips[last_ds_type] = { +static u8 do_trickle_setup_ds1339(struct i2c_client *, + uint32_t ohms, bool diode); + +static struct chip_desc chips[last_ds_type] = { [ds_1307] = { .nvram_offset = 8, .nvram_size = 56, @@ -143,6 +148,7 @@ static const struct chip_desc chips[last_ds_type] = { [ds_1339] = { .alarm = 1, .trickle_charger_reg = 0x10, + .do_trickle_setup = &do_trickle_setup_ds1339, }, [ds_1340] = { .trickle_charger_reg = 0x08, @@ -833,15 +839,57 @@ ds1307_nvram_write(struct file *filp, struct kobject *kobj, return count; } + /*----------------------------------------------------------------------*/ +static u8 do_trickle_setup_ds1339(struct i2c_client *client, + uint32_t ohms, bool diode) +{ + u8 setup = (diode) ? DS1307_TRICKLE_CHARGER_DIODE : + DS1307_TRICKLE_CHARGER_NO_DIODE; + + switch (ohms) { + case 250: + setup |= DS1307_TRICKLE_CHARGER_250_OHM; + break; + case 2000: + setup |= DS1307_TRICKLE_CHARGER_2K_OHM; + break; + case 4000: + setup |= DS1307_TRICKLE_CHARGER_4K_OHM; + break; + default: + dev_warn(&client->dev, + "Unsupported ohm value %u in dt\n", ohms); + return 0; + } + return setup; +} + +static void ds1307_trickle_of_init(struct i2c_client *client, + struct chip_desc *chip) +{ + uint32_t ohms = 0; + bool diode = false; + + if (!chip->do_trickle_setup) + goto out; + if (of_property_read_u32(client->dev.of_node, "trickle-resistor-ohms" , &ohms)) + goto out; + diode = of_property_read_bool(client->dev.of_node, "diode-connected"); + chip->trickle_charger_setup = chip->do_trickle_setup(client, + ohms, diode); +out: + return; +} + static int ds1307_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct ds1307 *ds1307; int err = -ENODEV; int tmp; - const struct chip_desc *chip = &chips[id->driver_data]; + struct chip_desc *chip = &chips[id->driver_data]; struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); bool want_irq = false; unsigned char *buf; @@ -866,9 +914,19 @@ static int ds1307_probe(struct i2c_client *client, ds1307->client = client; ds1307->type = id->driver_data; - if (pdata && pdata->trickle_charger_setup && chip->trickle_charger_reg) + if (!pdata && client->dev.of_node) + ds1307_trickle_of_init(client, chip); + else if (pdata && pdata->trickle_charger_setup) + chip->trickle_charger_setup = pdata->trickle_charger_setup; + + if (chip->trickle_charger_setup && chip->trickle_charger_reg) { + dev_dbg(&client->dev, "writing trickle charger info 0x%x to 0x%x\n", + DS13XX_TRICKLE_CHARGER_MAGIC | chip->trickle_charger_setup, + chip->trickle_charger_reg); i2c_smbus_write_byte_data(client, chip->trickle_charger_reg, - DS13XX_TRICKLE_CHARGER_MAGIC | pdata->trickle_charger_setup); + DS13XX_TRICKLE_CHARGER_MAGIC | + chip->trickle_charger_setup); + } buf = ds1307->regs; if (i2c_check_functionality(adapter, I2C_FUNC_SMBUS_I2C_BLOCK)) {