From: Vasiliy Doylov <nekodevelopper@gmail.com>
To: Jonathan Cameron <jic23@kernel.org>,
Lars-Peter Clausen <lars@metafoo.de>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>
Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org,
Vasiliy Doylov <nekodevelopper@gmail.com>
Subject: [PATCH v2 4/5] iio: accel: mc3230: add multiple devices support
Date: Sun, 12 Jan 2025 15:06:05 +0300 [thread overview]
Message-ID: <20250112-mainlining-mc3510c-v2-4-322804a545cf@gmail.com> (raw)
In-Reply-To: <20250112-mainlining-mc3510c-v2-0-322804a545cf@gmail.com>
This patch allows to add new devices to this driver.
Signed-off-by: Vasiliy Doylov <nekodevelopper@gmail.com>
---
drivers/iio/accel/mc3230.c | 50 ++++++++++++++++++++++++++++++++++------------
1 file changed, 37 insertions(+), 13 deletions(-)
diff --git a/drivers/iio/accel/mc3230.c b/drivers/iio/accel/mc3230.c
index ba30c904d3f67002deeb3ca5a7e12bfae312e05f..ef9c4bcabb0b77518fe2a124e31ec5e7ca66816f 100644
--- a/drivers/iio/accel/mc3230.c
+++ b/drivers/iio/accel/mc3230.c
@@ -22,20 +22,29 @@
#define MC3230_MODE_OPCON_STANDBY 0x03
#define MC3230_REG_CHIP_ID 0x18
-#define MC3230_CHIP_ID 0x01
-
#define MC3230_REG_PRODUCT_CODE 0x3b
-#define MC3230_PRODUCT_CODE 0x19
/*
* The accelerometer has one measurement range:
*
* -1.5g - +1.5g (8-bit, signed)
*
- * scale = (1.5 + 1.5) * 9.81 / (2^8 - 1) = 0.115411765
*/
-static const int mc3230_nscale = 115411765;
+struct mc3230_chip_info {
+ const u8 chip_id;
+ const char *name;
+ const u8 product_code;
+ const int scale;
+};
+
+static struct mc3230_chip_info mc3230_chip_info = {
+ .chip_id = 0x01,
+ .name = "mc3230",
+ .product_code = 0x19,
+ /* (1.5 + 1.5) * 9.81 / (2^8 - 1) = 0.115411765 */
+ .scale = 115411765,
+};
#define MC3230_CHANNEL(reg, axis) { \
.type = IIO_ACCEL, \
@@ -48,6 +57,7 @@ static const int mc3230_nscale = 115411765;
}
struct mc3230_data {
+ const struct mc3xxx_chip_info *chip_info;
struct i2c_client *client;
struct iio_mount_matrix orientation;
};
@@ -111,7 +121,7 @@ static int mc3230_read_raw(struct iio_dev *indio_dev,
return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
*val = 0;
- *val2 = mc3230_nscale;
+ *val2 = data->chip_info->scale;
return IIO_VAL_INT_PLUS_NANO;
default:
return -EINVAL;
@@ -127,15 +137,28 @@ static int mc3230_probe(struct i2c_client *client)
int ret;
struct iio_dev *indio_dev;
struct mc3230_data *data;
+ const struct mc3xxx_chip_info *chip_info;
+
+ chip_info = i2c_get_match_data(client);
+ if (chip_info == NULL) {
+ dev_err(&client->dev, "failed to get match data");
+ return -ENODATA;
+ }
/* First check chip-id and product-id */
ret = i2c_smbus_read_byte_data(client, MC3230_REG_CHIP_ID);
- if (ret != MC3230_CHIP_ID)
- return (ret < 0) ? ret : -ENODEV;
+ if (ret != chip_info->chip_id) {
+ dev_info(&client->dev,
+ "chip id check fail: 0x%x != 0x%x !\n",
+ ret, chip_info->chip_id);
+ }
ret = i2c_smbus_read_byte_data(client, MC3230_REG_PRODUCT_CODE);
- if (ret != MC3230_PRODUCT_CODE)
- return (ret < 0) ? ret : -ENODEV;
+ if (ret != chip_info->product_code) {
+ dev_info(&client->dev,
+ "product code check fail: 0x%x != 0x%x !\n",
+ ret, chip_info->product_code);
+ }
indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
if (!indio_dev) {
@@ -144,11 +167,12 @@ static int mc3230_probe(struct i2c_client *client)
}
data = iio_priv(indio_dev);
+ data->chip_info = chip_info;
data->client = client;
i2c_set_clientdata(client, indio_dev);
indio_dev->info = &mc3230_info;
- indio_dev->name = "mc3230";
+ indio_dev->name = chip_info->name;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->channels = mc3230_channels;
indio_dev->num_channels = ARRAY_SIZE(mc3230_channels);
@@ -200,13 +224,13 @@ static int mc3230_resume(struct device *dev)
static DEFINE_SIMPLE_DEV_PM_OPS(mc3230_pm_ops, mc3230_suspend, mc3230_resume);
static const struct i2c_device_id mc3230_i2c_id[] = {
- { "mc3230" },
+ { "mc3230", (kernel_ulong_t)&mc3230_chip_info },
{}
};
MODULE_DEVICE_TABLE(i2c, mc3230_i2c_id);
static const struct of_device_id mc3230_of_match[] = {
- { .compatible = "mcube,mc3230" },
+ { .compatible = "mcube,mc3230", &c3230_chip_info },
{}
};
MODULE_DEVICE_TABLE(of, mc3230_of_match);
--
2.47.1
WARNING: multiple messages have this Message-ID (diff)
From: Vasiliy Doylov via B4 Relay <devnull+nekodevelopper.gmail.com@kernel.org>
To: Jonathan Cameron <jic23@kernel.org>,
Lars-Peter Clausen <lars@metafoo.de>,
Rob Herring <robh@kernel.org>,
Krzysztof Kozlowski <krzk+dt@kernel.org>,
Conor Dooley <conor+dt@kernel.org>
Cc: linux-iio@vger.kernel.org, linux-kernel@vger.kernel.org,
devicetree@vger.kernel.org,
Vasiliy Doylov <nekodevelopper@gmail.com>
Subject: [PATCH v2 4/5] iio: accel: mc3230: add multiple devices support
Date: Sun, 12 Jan 2025 15:06:05 +0300 [thread overview]
Message-ID: <20250112-mainlining-mc3510c-v2-4-322804a545cf@gmail.com> (raw)
In-Reply-To: <20250112-mainlining-mc3510c-v2-0-322804a545cf@gmail.com>
From: Vasiliy Doylov <nekodevelopper@gmail.com>
This patch allows to add new devices to this driver.
Signed-off-by: Vasiliy Doylov <nekodevelopper@gmail.com>
---
drivers/iio/accel/mc3230.c | 50 ++++++++++++++++++++++++++++++++++------------
1 file changed, 37 insertions(+), 13 deletions(-)
diff --git a/drivers/iio/accel/mc3230.c b/drivers/iio/accel/mc3230.c
index ba30c904d3f67002deeb3ca5a7e12bfae312e05f..ef9c4bcabb0b77518fe2a124e31ec5e7ca66816f 100644
--- a/drivers/iio/accel/mc3230.c
+++ b/drivers/iio/accel/mc3230.c
@@ -22,20 +22,29 @@
#define MC3230_MODE_OPCON_STANDBY 0x03
#define MC3230_REG_CHIP_ID 0x18
-#define MC3230_CHIP_ID 0x01
-
#define MC3230_REG_PRODUCT_CODE 0x3b
-#define MC3230_PRODUCT_CODE 0x19
/*
* The accelerometer has one measurement range:
*
* -1.5g - +1.5g (8-bit, signed)
*
- * scale = (1.5 + 1.5) * 9.81 / (2^8 - 1) = 0.115411765
*/
-static const int mc3230_nscale = 115411765;
+struct mc3230_chip_info {
+ const u8 chip_id;
+ const char *name;
+ const u8 product_code;
+ const int scale;
+};
+
+static struct mc3230_chip_info mc3230_chip_info = {
+ .chip_id = 0x01,
+ .name = "mc3230",
+ .product_code = 0x19,
+ /* (1.5 + 1.5) * 9.81 / (2^8 - 1) = 0.115411765 */
+ .scale = 115411765,
+};
#define MC3230_CHANNEL(reg, axis) { \
.type = IIO_ACCEL, \
@@ -48,6 +57,7 @@ static const int mc3230_nscale = 115411765;
}
struct mc3230_data {
+ const struct mc3xxx_chip_info *chip_info;
struct i2c_client *client;
struct iio_mount_matrix orientation;
};
@@ -111,7 +121,7 @@ static int mc3230_read_raw(struct iio_dev *indio_dev,
return IIO_VAL_INT;
case IIO_CHAN_INFO_SCALE:
*val = 0;
- *val2 = mc3230_nscale;
+ *val2 = data->chip_info->scale;
return IIO_VAL_INT_PLUS_NANO;
default:
return -EINVAL;
@@ -127,15 +137,28 @@ static int mc3230_probe(struct i2c_client *client)
int ret;
struct iio_dev *indio_dev;
struct mc3230_data *data;
+ const struct mc3xxx_chip_info *chip_info;
+
+ chip_info = i2c_get_match_data(client);
+ if (chip_info == NULL) {
+ dev_err(&client->dev, "failed to get match data");
+ return -ENODATA;
+ }
/* First check chip-id and product-id */
ret = i2c_smbus_read_byte_data(client, MC3230_REG_CHIP_ID);
- if (ret != MC3230_CHIP_ID)
- return (ret < 0) ? ret : -ENODEV;
+ if (ret != chip_info->chip_id) {
+ dev_info(&client->dev,
+ "chip id check fail: 0x%x != 0x%x !\n",
+ ret, chip_info->chip_id);
+ }
ret = i2c_smbus_read_byte_data(client, MC3230_REG_PRODUCT_CODE);
- if (ret != MC3230_PRODUCT_CODE)
- return (ret < 0) ? ret : -ENODEV;
+ if (ret != chip_info->product_code) {
+ dev_info(&client->dev,
+ "product code check fail: 0x%x != 0x%x !\n",
+ ret, chip_info->product_code);
+ }
indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*data));
if (!indio_dev) {
@@ -144,11 +167,12 @@ static int mc3230_probe(struct i2c_client *client)
}
data = iio_priv(indio_dev);
+ data->chip_info = chip_info;
data->client = client;
i2c_set_clientdata(client, indio_dev);
indio_dev->info = &mc3230_info;
- indio_dev->name = "mc3230";
+ indio_dev->name = chip_info->name;
indio_dev->modes = INDIO_DIRECT_MODE;
indio_dev->channels = mc3230_channels;
indio_dev->num_channels = ARRAY_SIZE(mc3230_channels);
@@ -200,13 +224,13 @@ static int mc3230_resume(struct device *dev)
static DEFINE_SIMPLE_DEV_PM_OPS(mc3230_pm_ops, mc3230_suspend, mc3230_resume);
static const struct i2c_device_id mc3230_i2c_id[] = {
- { "mc3230" },
+ { "mc3230", (kernel_ulong_t)&mc3230_chip_info },
{}
};
MODULE_DEVICE_TABLE(i2c, mc3230_i2c_id);
static const struct of_device_id mc3230_of_match[] = {
- { .compatible = "mcube,mc3230" },
+ { .compatible = "mcube,mc3230", &c3230_chip_info },
{}
};
MODULE_DEVICE_TABLE(of, mc3230_of_match);
--
2.47.1
next prev parent reply other threads:[~2025-01-12 12:06 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-01-12 12:06 [PATCH v2 0/5] iio: accel: mc3230: improve driver, add mc3510c Vasiliy Doylov
2025-01-12 12:06 ` Vasiliy Doylov via B4 Relay
2025-01-12 12:06 ` [PATCH v2 1/5] dt-bindings: iio: accel: mc3230: document mc3510c Vasiliy Doylov
2025-01-12 12:06 ` Vasiliy Doylov via B4 Relay
2025-01-12 12:06 ` [PATCH v2 2/5] iio: accel: mc3230: add mount matrix support Vasiliy Doylov
2025-01-12 12:06 ` Vasiliy Doylov via B4 Relay
2025-01-12 12:06 ` [PATCH v2 3/5] iio: accel: mc3230: add OF match table Vasiliy Doylov
2025-01-12 12:06 ` Vasiliy Doylov via B4 Relay
2025-01-12 12:06 ` Vasiliy Doylov [this message]
2025-01-12 12:06 ` [PATCH v2 4/5] iio: accel: mc3230: add multiple devices support Vasiliy Doylov via B4 Relay
2025-01-12 12:06 ` [PATCH v2 5/5] iio: accel: mc3230: add mc3510c support Vasiliy Doylov
2025-01-12 12:06 ` Vasiliy Doylov via B4 Relay
2025-01-12 12:41 ` [PATCH v2 0/5] iio: accel: mc3230: improve driver, add mc3510c Vasiliy Doylov
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=20250112-mainlining-mc3510c-v2-4-322804a545cf@gmail.com \
--to=nekodevelopper@gmail.com \
--cc=conor+dt@kernel.org \
--cc=devicetree@vger.kernel.org \
--cc=jic23@kernel.org \
--cc=krzk+dt@kernel.org \
--cc=lars@metafoo.de \
--cc=linux-iio@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=robh@kernel.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.