From patchwork Tue Sep 9 10:38:40 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matti Vaittinen X-Patchwork-Id: 387226 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-ee0-x237.google.com (mail-ee0-x237.google.com [IPv6:2a00:1450:4013:c00::237]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 7168114008B for ; Tue, 9 Sep 2014 19:34:37 +1000 (EST) Received: by mail-ee0-f55.google.com with SMTP id d17sf774628eek.10 for ; Tue, 09 Sep 2014 02:34:34 -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=v4+PxuQ7Ywd93HiE7S/T2HRb98Vi6bG9Yw/MZWWw1pI=; b=DKHEo5rTa1Kz/9tBRVmND4zgwfUBlVNyHIqqs7LMMg+5nFWXEM8JeQHp4X919nODBU jzGC47Bh9omInQEEr87i7IopIpvsT3YCwnZO9rXfGxeO4CzRp2zdWeVm9V4wuOve4+Xj PZyysEusfQM78pBEATF+XYlhNUqDR91GCEoAbn3BtZLPjjyxk8SLpYR4uLMwKSlugQWr dUOwjm1jgIGCsw7z+b0sHqCbbC6bKe3UKNp55ebbUASsRKDHCnkvtijlAWnPdTfcu5yz VC1cCRP1MwSDKgchtomcvFIGi2QA1AlXTOBUpYBbJ0RVwrwU0yhqUuo+eOK5uKodq0n3 7tow== X-Received: by 10.152.18.167 with SMTP id x7mr46963lad.16.1410255274365; Tue, 09 Sep 2014 02:34:34 -0700 (PDT) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.152.37.4 with SMTP id u4ls172661laj.99.gmail; Tue, 09 Sep 2014 02:34:33 -0700 (PDT) X-Received: by 10.112.6.226 with SMTP id e2mr1012109lba.7.1410255273545; Tue, 09 Sep 2014 02:34:33 -0700 (PDT) Received: from demumfd001.nsn-inter.net (demumfd001.nsn-inter.net. [93.183.12.32]) by gmr-mx.google.com with ESMTPS id p7si77749wiz.1.2014.09.09.02.34.33 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 09 Sep 2014 02:34:33 -0700 (PDT) Received-SPF: pass (google.com: domain of matti.vaittinen@nsn.com designates 93.183.12.32 as permitted sender) client-ip=93.183.12.32; Received: from demuprx016.emea.nsn-intra.net ([10.150.129.55]) by demumfd001.nsn-inter.net (8.14.3/8.14.3) with ESMTP id s899YM8i015665 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 9 Sep 2014 09:34:23 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 s899YJM1002306; Tue, 9 Sep 2014 11:34:19 +0200 Date: Tue, 9 Sep 2014 13:38:40 +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] [PATCH v4 2/2] rtc: ds1307: add trickle charger device tree binding. Message-ID: <20140909103832.GA338@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: 4393 X-purgate-ID: 151667::1410255263-00002A30-68E82DA5/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.32 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 rtc: ds1307: add trickle charger device tree binding. Some DS13XX devices have "trickle chargers". Introduce a device tree binding for specifying the trickle charger configuration for ds1339. Only ds1339 dt binding is supported because this is the only chip I have. I _assume_ the code would have worked on other allready supported chips. However I cannot check the resistor values for the other chips or test them. For other chips the driver code works as earlier Eg. it does not check the dt bindings at all. Signed-off-by: Matti Vaittinen --- drivers/rtc/rtc-ds1307.c | 66 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 62 insertions(+), 4 deletions(-) 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)) {