linux-i2c.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Kieran Bingham <kieran@ksquared.org.uk>
To: Wolfram Sang <wsa@the-dreams.de>,
	Lee Jones <lee.jones@linaro.org>,
	Kieran Bingham <kieran@ksquared.org.uk>
Cc: linux-i2c@vger.kernel.org, linux-kernel@vger.kernel.org,
	Javier Martinez Canillas <javier@osg.samsung.com>,
	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	[thread overview]
Message-ID: <1478522866-29620-12-git-send-email-kieran@bingham.xyz> (raw)
In-Reply-To: <1478522866-29620-1-git-send-email-kieran@bingham.xyz>

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

  parent reply	other threads:[~2016-11-07 12:48 UTC|newest]

Thread overview: 26+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-07 12:47 [PATCHv7 00/11] i2c: Relax mandatory I2C ID table passing Kieran Bingham
2016-11-07 12:47 ` [PATCHv7 01/11] i2c: Add pointer dereference protection to i2c_match_id() Kieran Bingham
2016-11-07 12:47 ` [PATCHv7 02/11] i2c: Add the ability to match device to compatible string without an of_node Kieran Bingham
2016-11-07 12:47 ` [PATCHv7 03/11] i2c: Match using traditional OF methods, then by vendor-less compatible strings Kieran Bingham
2016-11-07 12:47 ` [PATCHv7 04/11] i2c: Make I2C ID tables non-mandatory for DT'ed devices Kieran Bingham
2016-11-07 12:47 ` [PATCHv7 05/11] i2c: Export i2c_match_id() for direct use by device drivers Kieran Bingham
2016-11-07 12:47 ` [PATCHv7 06/11] i2c: Provide a temporary .probe_new() call-back type Kieran Bingham
2016-11-07 12:47 ` [PATCHv7 07/11] i2c: match dt-style device names from sysfs interface Kieran Bingham
2016-11-07 19:10   ` Javier Martinez Canillas
2016-11-14 22:27   ` Wolfram Sang
2016-11-15  9:48     ` Kieran Bingham
2016-11-07 12:47 ` [PATCHv7 08/11] i2c: match vendorless strings on the internal string length Kieran Bingham
2016-11-07 19:12   ` Javier Martinez Canillas
2016-11-14 22:27   ` Wolfram Sang
2016-11-15  9:49     ` Kieran Bingham
2016-11-07 12:47 ` [PATCHv7 09/11] mfd: 88pm860x: Move over to new I2C device .probe() call Kieran Bingham
2016-11-07 19:13   ` Javier Martinez Canillas
2016-11-07 12:47 ` [PATCHv7 10/11] mfd: as3722: Rid driver of superfluous I2C device ID structure Kieran Bingham
2016-11-07 19:20   ` Javier Martinez Canillas
2016-11-07 22:05     ` Kieran Bingham
2016-11-08  2:02       ` Javier Martinez Canillas
2016-11-07 23:09     ` Wolfram Sang
2016-11-08  2:14       ` Javier Martinez Canillas
2016-11-07 12:47 ` Kieran Bingham [this message]
2016-11-13 18:26 ` [PATCHv7 00/11] i2c: Relax mandatory I2C ID table passing Wolfram Sang
2016-11-17 21:15 ` Wolfram Sang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1478522866-29620-12-git-send-email-kieran@bingham.xyz \
    --to=kieran@ksquared.org.uk \
    --cc=javier@osg.samsung.com \
    --cc=lee.jones@linaro.org \
    --cc=linux-i2c@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=sameo@linux.intel.com \
    --cc=wsa@the-dreams.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).