From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753256AbcKGMsg (ORCPT ); Mon, 7 Nov 2016 07:48:36 -0500 Received: from mail.kernel.org ([198.145.29.136]:56974 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753095AbcKGMsb (ORCPT ); Mon, 7 Nov 2016 07:48:31 -0500 From: Kieran Bingham To: Wolfram Sang , Lee Jones , Kieran Bingham Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org, Javier Martinez Canillas , sameo@linux.intel.com Subject: [PATCHv7 11/11] [TESTPATCH] rtc: convert ds1307 to interim probe_new Date: Mon, 7 Nov 2016 12:47:46 +0000 Message-Id: <1478522866-29620-12-git-send-email-kieran@bingham.xyz> X-Mailer: git-send-email 2.7.4 In-Reply-To: <1478522866-29620-1-git-send-email-kieran@bingham.xyz> References: <1478522866-29620-1-git-send-email-kieran@bingham.xyz> Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Just for testing, specify a maxim,ds1307 device to identify the code path used when instantiating the driver from userspace. root@arm:~# echo maxim,ds1307 0x68 > /sys/bus/i2c/devices/i2c-2/new_device [ 49.807383] rtc-ds1307 2-0068: I'm a Maxim ... [ 49.814706] rtc-ds1307 2-0068: rtc core: registered maxim,ds1307 as rtc0 [ 49.821813] rtc-ds1307 2-0068: 56 bytes nvram [ 49.826444] i2c i2c-2: new_device: Instantiated device maxim,ds1307 at 0x68 This patch also demonstrates how to obtain data from the id's using the new methods. --- drivers/rtc/rtc-ds1307.c | 54 +++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 23 deletions(-) diff --git a/drivers/rtc/rtc-ds1307.c b/drivers/rtc/rtc-ds1307.c index 4e31036ee259..a5b744e9716c 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,23 +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 }, - { "isl12057", ds_1337 }, - { } -}; -MODULE_DEVICE_TABLE(i2c, ds1307_id); /*----------------------------------------------------------------------*/ @@ -1262,13 +1250,20 @@ 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[] = { + { .compatible = "dallas,ds1307", .data = (void *)ds_1307 }, + { .compatible = "maxim,ds1307", .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, wday; - 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; @@ -1294,10 +1289,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); @@ -1479,6 +1484,9 @@ static int ds1307_probe(struct i2c_client *client, */ 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. */ @@ -1678,10 +1686,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); -- 2.7.4