From patchwork Sun Jun 12 21:13:47 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Kieran Bingham X-Patchwork-Id: 634235 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3rSTDN1XDfz9t0G for ; Mon, 13 Jun 2016 07:13:56 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (1024-bit key; unprotected) header.d=ksquared.org.uk header.i=@ksquared.org.uk header.b=cCqs2yhH; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=bingham-xyz.20150623.gappssmtp.com header.i=@bingham-xyz.20150623.gappssmtp.com header.b=coNY6n/O; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753484AbcFLVNy (ORCPT ); Sun, 12 Jun 2016 17:13:54 -0400 Received: from mail-wm0-f66.google.com ([74.125.82.66]:36409 "EHLO mail-wm0-f66.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753045AbcFLVNx (ORCPT ); Sun, 12 Jun 2016 17:13:53 -0400 Received: by mail-wm0-f66.google.com with SMTP id m124so10561820wme.3 for ; Sun, 12 Jun 2016 14:13:52 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ksquared.org.uk; s=google; h=sender:from:to:cc:subject:date:message-id:in-reply-to; bh=UKYOapoLeCY/sEt8J00lMxLAUlyxu4ECfP1AOUSG8zQ=; b=cCqs2yhHAQlwk/k58620hw7g6S3LeXbBcvR4OpU6IRwAjX+7Mh+iGc2PTMvl7TK3HR k73bUCuJRIEmHryk3bW8/0zqU8FPnq6745ycxhHoxeuRQG+LnODpYwMkKxPKRoO/LPfP EeGzEZm/otWQIaIldUfiofXhM4Pm+JfSIISk8= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bingham-xyz.20150623.gappssmtp.com; s=20150623; h=sender:from:to:cc:subject:date:message-id:in-reply-to; bh=UKYOapoLeCY/sEt8J00lMxLAUlyxu4ECfP1AOUSG8zQ=; b=coNY6n/OKFKBB9BW5+y/ZA3Up0XXcX0/xl7QRgd21CUIvfyGUrwQcfsnHy0kkBoil5 ls8O10jeCgy5tstb1rPDieBTbtkTVXZAY/CSiLWL2YZFrnrW3/kWFP3SFUAGyrlzoRaU uDf19qxH+QqmPDqHeETbKQQCrKKoGG70n1wOeoiKhcP9jo57QyPhD7HXBR3NyiXToot3 vye6MfkDQH8tMQKEbM4RMTtyYq2WUrJTA07SCPx+C0dbetMIF9PzWOm6fqqkjCyKLr2e uwQogBxJ10qx/REsMkFG193iz21GrlPW0wmrq2LSpM8mRFEZ0xodLZD4phIBbV5BpteH hRlg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id :in-reply-to; bh=UKYOapoLeCY/sEt8J00lMxLAUlyxu4ECfP1AOUSG8zQ=; b=TtUNxPEY4BE3tvCoO9VDJBCNmC1vFxE0HPLrWh4QHN438eNLgnI3Kl+9pFLfGor75A e8T6AD+0/4wTTi26tXNIFhjbqlD/McuNV2sfZGSyXSqV2TpRaK9ytzsN0Aj3KMwmMr3t Pk8KPwuXQQZfjTfeLdPY7KDWKWrBJKJ70GynOExAbeinjEUfXHaPNlvJ6C3LCJOlrlGH aTnMs9wbtQA6EK/4S9Q9TGCH6pFzAQ5HLnMu8w9jyKaEZ9ybFRGLBcXJUu27IF1DBFhU zx4dmqbcBxcIFrXDLkYgo85bxIfLl0XS199KmgOBsPr5d2lpOc2jJugqVOwiMY/xXvzf aS2w== X-Gm-Message-State: ALyK8tJIiPGyPZ3CJD13trKh9GwHEcN0ni0/T3XO8qWXepGJLlwitl0r7GZTa8HY5Q+1mg== X-Received: by 10.194.116.195 with SMTP id jy3mr12349333wjb.36.1465766031713; Sun, 12 Jun 2016 14:13:51 -0700 (PDT) Received: from CookieMonster.cookiemonster.local (cpc87017-aztw30-2-0-cust65.18-1.cable.virginm.net. [92.232.232.66]) by smtp.gmail.com with ESMTPSA id a4sm1399601wjq.40.2016.06.12.14.13.50 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Sun, 12 Jun 2016 14:13:50 -0700 (PDT) From: Kieran Bingham To: kieran@ksquared.org.uk, Wolfram Sang Cc: Javier Martinez Canillas , Lee Jones , linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, grant.likely@linaro.org, sameo@linux.intel.com Subject: [TEST PATCH] rtc: convert ds1307 to interim probe_new Date: Sun, 12 Jun 2016 22:13:47 +0100 Message-Id: <1465766027-485-1-git-send-email-kieran@bingham.xyz> X-Mailer: git-send-email 2.7.4 In-Reply-To: <20160610133200.GB1624@katana> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org Just for testing, specify a ds9999 device to identify the code path used when instantiating the driver from userspace. As we match on only the device, not the manufacturer, I've changed your sketch so that the test maxim line is on a compatible with name ds9999 to make it unique. Otherwise, we would match to the dallas,ds1307 id type. If you would prefer that we support separate manufacturers, I can update the match function so that it attempts a full match first, followed by a stripped manufacturer match. I'm not certain if we have a need for that at the moment though, as the current drivers simply match on the device name: This patch also demonstrates a method to obtain the device ID from the new match system for drivers which would normally have expected this information to be passed in. Testing: =======- root@arm:~# echo ds9999 0x68 > /sys/bus/i2c/devices/i2c-2/new_device [ 43.262432] rtc-ds1307 2-0068: I'm a Maxim ... [ 43.268707] rtc-ds1307 2-0068: rtc core: registered ds9999 as rtc0 [ 43.275276] rtc-ds1307 2-0068: 56 bytes nvram [ 43.279920] i2c i2c-2: new_device: Instantiated device ds9999 at 0x68 root@arm:~# cat /sys/class/rtc/rtc0/date 2016-06-12 root@arm:~# cat /sys/class/rtc/rtc0/name ds9999 --- drivers/rtc/rtc-ds1307.c | 60 ++++++++++++++++++++++++++++++------------------ 1 file changed, 38 insertions(+), 22 deletions(-) diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 821d9c089cdb..d97e8adb866b 100644 --- a/drivers/rtc/rtc-ds1307.c +++ b/drivers/rtc/rtc-ds1307.c @@ -31,6 +31,7 @@ */ enum ds_type { ds_1307, + maxim_1307, ds_1337, ds_1338, ds_1339, @@ -144,6 +145,10 @@ static struct chip_desc chips[last_ds_type] = { .nvram_offset = 8, .nvram_size = 56, }, + [maxim_1307] = { + .nvram_offset = 8, + .nvram_size = 56, + }, [ds_1337] = { .alarm = 1, }, @@ -173,22 +178,6 @@ static struct chip_desc chips[last_ds_type] = { }, }; -static const struct i2c_device_id ds1307_id[] = { - { "ds1307", ds_1307 }, - { "ds1337", ds_1337 }, - { "ds1338", ds_1338 }, - { "ds1339", ds_1339 }, - { "ds1388", ds_1388 }, - { "ds1340", ds_1340 }, - { "ds3231", ds_3231 }, - { "m41t00", m41t00 }, - { "mcp7940x", mcp794xx }, - { "mcp7941x", mcp794xx }, - { "pt7c4338", ds_1307 }, - { "rx8025", rx_8025 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, ds1307_id); /*----------------------------------------------------------------------*/ @@ -1226,13 +1215,27 @@ static void ds1307_clks_register(struct ds1307 *ds1307) #endif /* CONFIG_COMMON_CLK */ -static int ds1307_probe(struct i2c_client *client, - const struct i2c_device_id *id) +static const struct of_device_id ds1307_dt_ids[] = { + /* We are only matching on the device name, *NOT* the manufacturer name + * I.e. dallas, maxim, are dropped in the search when someone tries to load a + * 'ds1307', and hence first match wins. + * + * We could extend this to do a full match first, followed by a fallback match + * to just the device name. + */ + { .compatible = "dallas,ds1307", .data = (void *)ds_1307 }, + { .compatible = "maxim,ds9999", .data = (void *)maxim_1307 }, + { /* sentinel */ } +}; +MODULE_DEVICE_TABLE(of, ds1307_dt_ids); + +static int ds1307_probe(struct i2c_client *client) { struct ds1307 *ds1307; int err = -ENODEV; int tmp; - struct chip_desc *chip = &chips[id->driver_data]; + const struct of_device_id *idof; + struct chip_desc *chip; struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); bool want_irq = false; bool ds1307_can_wakeup_device = false; @@ -1255,10 +1258,20 @@ static int ds1307_probe(struct i2c_client *client, if (!ds1307) return -ENOMEM; + /* If we've got this far, this shouldn't be able to fail - but check anyway for now */ + idof = i2c_of_match_device(ds1307_dt_ids, client); + if (!idof) { + dev_err(&client->dev, "Probe failed to find an id entry\n"); + return -ENODEV; + } + + /* Now we can set our chip entry */ + chip = &chips[(int)idof->data]; + i2c_set_clientdata(client, ds1307); ds1307->client = client; - ds1307->type = id->driver_data; + ds1307->type = (int) idof->data; if (!pdata && client->dev.of_node) ds1307_trickle_of_init(client, chip); @@ -1435,6 +1448,9 @@ read_rtc: */ tmp = ds1307->regs[DS1307_REG_SECS]; switch (ds1307->type) { + case maxim_1307: + dev_info(&client->dev, "I'm a Maxim ... \n"); + /* fallthrough */ case ds_1307: case m41t00: /* clock halted? turn it on, so clock can tick. */ @@ -1613,10 +1629,10 @@ static int ds1307_remove(struct i2c_client *client) static struct i2c_driver ds1307_driver = { .driver = { .name = "rtc-ds1307", + .of_match_table = of_match_ptr(ds1307_dt_ids), }, - .probe = ds1307_probe, + .probe_new = ds1307_probe, .remove = ds1307_remove, - .id_table = ds1307_id, }; module_i2c_driver(ds1307_driver);