kernelnewbies.kernelnewbies.org archive mirror
 help / color / mirror / Atom feed
From: martink@posteo.de (Martin Kepplinger)
To: kernelnewbies@lists.kernelnewbies.org
Subject: i2c driver develpment with diolan DLN-2 / ACPI?
Date: Wed, 27 Apr 2016 13:36:58 +0200	[thread overview]
Message-ID: <5720A45A.9010009@posteo.de> (raw)

Hi roberta or anyone who uses a diolan i2c/spi bridge device,

I try to do get the kernel driver for the connected chip loaded, but I'm
having some trouble getting it right.

Cables are connected to the device (i2c), and the (mainline) kernel
driver for the diolan DLN-2 device is compiled and loaded on plugin.

I don't use any of their (userspace) software.

Now I get a new i2c bus and can manually instanciate my driver

root at laptop:/sys/bus/i2c/devices/i2c-7# echo mma8452 0x1c > new_device

and the driver loads. (Now for development, later maybe for merging) I
added acpi support, I guess I'd need it, but ACPI_HANDLE(&client->dev)
isn't true (during probe) hence we don't continue. I append my
adding-acpi-patch below.

How do you do it?

Do *you* manually instantiate your i2c-driver during development with
your diolan device or should it somehow even get loaded automatically?

thanks so much for any help,

                     martin


--- a/drivers/iio/accel/mma8452.c
+++ b/drivers/iio/accel/mma8452.c
@@ -33,6 +33,7 @@
 #include <linux/of_device.h>
 #include <linux/of_irq.h>
 #include <linux/pm_runtime.h>
+#include <linux/acpi.h>

 #define MMA8452_STATUS				0x00
 #define  MMA8452_STATUS_DRDY			(BIT(2) | BIT(1) | BIT(0))
@@ -1434,6 +1435,19 @@ static const struct of_device_id mma8452_dt_ids[] = {
 };
 MODULE_DEVICE_TABLE(of, mma8452_dt_ids);

+static const char *mma8452_match_acpi_device(struct device *dev, int *data)
+{
+        const struct acpi_device_id *id;
+
+        id = acpi_match_device(dev->driver->acpi_match_table, dev);
+        if (!id)
+                return NULL;
+
+        *data = (int)id->driver_data;
+
+        return dev_name(dev);
+}
+
 static int mma8452_probe(struct i2c_client *client,
 			 const struct i2c_device_id *id)
 {
@@ -1441,21 +1455,35 @@ static int mma8452_probe(struct i2c_client *client,
 	struct iio_dev *indio_dev;
 	int ret;
 	const struct of_device_id *match;
+	const char *name = NULL;
+	int dev_id = 0;

-	match = of_match_device(mma8452_dt_ids, &client->dev);
-	if (!match) {
-		dev_err(&client->dev, "unknown device model\n");
-		return -ENODEV;
-	}
+pr_info("mma probe running!!\n");

 	indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
 	if (!indio_dev)
 		return -ENOMEM;

 	data = iio_priv(indio_dev);
+	i2c_set_clientdata(client, indio_dev);
 	data->client = client;
+
+	match = of_match_device(mma8452_dt_ids, &client->dev);
+	if (match) {
+		if (id)
+			name = id->name;
+		data->chip_info = match->data;
+	} else if (ACPI_HANDLE(&client->dev)) {
+		name = mma8452_match_acpi_device(&client->dev, &dev_id);
+		pr_info("mma acpi ok. found id %d\n", dev_id);
+		/* TODO chip_info setting*/
+		data->chip_info = &mma_chip_info_table[dev_id];
+	} else {
+		dev_err(&client->dev, "unknown device model\n");
+		return -ENODEV;
+	}
+
 	mutex_init(&data->lock);
-	data->chip_info = match->data;

 	ret = i2c_smbus_read_byte_data(client, MMA8452_WHO_AM_I);
 	if (ret < 0)
@@ -1475,11 +1503,10 @@ static int mma8452_probe(struct i2c_client *client,
 	}

 	dev_info(&client->dev, "registering %s accelerometer; ID 0x%x\n",
-		 match->compatible, data->chip_info->chip_id);
+		 name, data->chip_info->chip_id);

-	i2c_set_clientdata(client, indio_dev);
 	indio_dev->info = &mma8452_info;
-	indio_dev->name = id->name;
+	indio_dev->name = name;
 	indio_dev->dev.parent = &client->dev;
 	indio_dev->modes = INDIO_DIRECT_MODE;
 	indio_dev->channels = data->chip_info->channels;
@@ -1669,6 +1696,17 @@ static const struct dev_pm_ops mma8452_pm_ops = {
 			   mma8452_runtime_resume, NULL)
 };

+static const struct acpi_device_id mma8452_acpi_match[] = {
+	{ "MMA8451", mma8451 },
+	{ "MMA8452", mma8452 },
+	{ "MMA8453", mma8453 },
+	{ "MMA8652", mma8652 },
+	{ "MMA8653", mma8653 },
+	{ "FXLS8471", fxls8471 },
+	{ },
+};
+MODULE_DEVICE_TABLE(acpi, mma8452_acpi_match);
+
 static const struct i2c_device_id mma8452_id[] = {
 	{ "mma8451", mma8451 },
 	{ "mma8452", mma8452 },
@@ -1684,6 +1722,7 @@ static struct i2c_driver mma8452_driver = {
 	.driver = {
 		.name	= "mma8452",
 		.of_match_table = of_match_ptr(mma8452_dt_ids),
+		.acpi_match_table = ACPI_PTR(mma8452_acpi_match),
 		.pm	= &mma8452_pm_ops,
 	},
 	.probe = mma8452_probe,
-- 
2.1.4

             reply	other threads:[~2016-04-27 11:36 UTC|newest]

Thread overview: 5+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-04-27 11:36 Martin Kepplinger [this message]
2016-04-27 11:51 ` i2c driver develpment with diolan DLN-2 / ACPI? Daniel Baluta
2016-04-30 15:10   ` Martin Kepplinger
2016-04-30 16:48     ` Daniel Baluta
2016-04-30 17:14       ` Martin Kepplinger

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=5720A45A.9010009@posteo.de \
    --to=martink@posteo.de \
    --cc=kernelnewbies@lists.kernelnewbies.org \
    /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).