From patchwork Tue Sep 9 14:33:49 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Matti Vaittinen X-Patchwork-Id: 387332 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from mail-wi0-x23c.google.com (mail-wi0-x23c.google.com [IPv6:2a00:1450:400c:c05::23c]) (using TLSv1 with cipher ECDHE-RSA-RC4-SHA (128/128 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 4F5DD14007B for ; Tue, 9 Sep 2014 23:29:45 +1000 (EST) Received: by mail-wi0-f188.google.com with SMTP id z2sf1592258wiv.15 for ; Tue, 09 Sep 2014 06:29:42 -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=hWDBo37ojLSvUzRNbajHvyhfWHuAEG9H3ave0wNL22I=; b=uyYYPZZCT069lu8YQZlpqhpION8BfIStlp7ftMcNlXkw94LoT63W8jHKk4OczP58ri o8dgLuDKaNH9WL3Fi4Kx2YBqlom+llHrw2t4kTPzZ+SBXcsB94G3T4YDNkHCezGR7KgA kqx8RdyX7FjevNP/p2qNnPIddFlnj66A4Yi1oGocGKVIZyShSru1tzuZ6beVDKnpv4Xr KOWUPtKTgcB2yQNc8GsrWhFPRgn4A7Lo0dzwBMzEi0/V/RGeAw2V/6HAnWpJjQiij2kY MSaqElyZ0pM3Cinvq+pXiYLlbiX79rOWHVwSalzbb97n5RlcdDeWIGoiixDns000EQ9m 4p3w== X-Received: by 10.180.21.204 with SMTP id x12mr152053wie.20.1410269382617; Tue, 09 Sep 2014 06:29:42 -0700 (PDT) X-BeenThere: rtc-linux@googlegroups.com Received: by 10.180.208.1 with SMTP id ma1ls577869wic.32.canary; Tue, 09 Sep 2014 06:29:42 -0700 (PDT) X-Received: by 10.180.99.74 with SMTP id eo10mr2707173wib.2.1410269382279; Tue, 09 Sep 2014 06:29:42 -0700 (PDT) Received: from demumfd002.nsn-inter.net (demumfd002.nsn-inter.net. [93.183.12.31]) by gmr-mx.google.com with ESMTPS id i6si385621wiy.0.2014.09.09.06.29.42 for (version=TLSv1 cipher=RC4-SHA bits=128/128); Tue, 09 Sep 2014 06:29:42 -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 demuprx017.emea.nsn-intra.net ([10.150.129.56]) by demumfd002.nsn-inter.net (8.14.3/8.14.3) with ESMTP id s89DTWEU022821 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 9 Sep 2014 13:29:32 GMT Received: from fi-ourus-dhcp00977.emea.nsn-net.net ([10.145.11.157]) by demuprx017.emea.nsn-intra.net (8.12.11.20060308/8.12.11) with SMTP id s89DTSCh016909; Tue, 9 Sep 2014 15:29:29 +0200 Date: Tue, 9 Sep 2014 17:33:49 +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 v5 2/2] rtc: ds1307: add trickle charger device tree binding. Message-ID: <20140909143342.GA2179@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: 4406 X-purgate-ID: 151667::1410269372-00005326-49396D58/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 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 --- Delta to v5 -Actually sent correct patch drivers/rtc/rtc-ds1307.c | 67 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 63 insertions(+), 4 deletions(-) diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index f03d5ba..bb43cf7 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,58 @@ 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 = true; + + if (!chip->do_trickle_setup) + goto out; + if (of_property_read_u32(client->dev.of_node, "trickle-resistor-ohms" , &ohms)) + goto out; + if (of_property_read_bool(client->dev.of_node, "trickle-diode-disable")) + diode = false; + 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 +915,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)) {