* [PATCH v2 0/4] Match data improvements for mcp23s08 driver
@ 2023-09-09 12:18 Biju Das
2023-09-09 12:19 ` [PATCH v2 1/4] pinctrl: mcp23s08_i2c: Extend match support for OF tables Biju Das
` (4 more replies)
0 siblings, 5 replies; 6+ messages in thread
From: Biju Das @ 2023-09-09 12:18 UTC (permalink / raw)
To: Linus Walleij
Cc: Biju Das, linux-gpio, linux-kernel, Biju Das, Andy Shevchenko
This patch series aims to add match data improvements for mcp23s08 driver.
This patch series is only compile tested.
v1->v2:
* Arranged variable declaration in reverse xmas tree for patch#1.
* Updated commit description for patch#2.
* Dropped printing 'type' in error path for i2c_get_match_data().
* Added similar simplification for SPI driver.
Biju Das (4):
pinctrl: mcp23s08_i2c: Extend match support for OF tables
pinctrl: mcp23s08_i2c: Simplify probe()
pinctrl: mcp23s08_spi: Simplify probe()
pinctrl: mcp23s08_spi: Simplify mcp23s08_spi_regmap_init()
drivers/pinctrl/pinctrl-mcp23s08_i2c.c | 101 ++++++++++++-------------
drivers/pinctrl/pinctrl-mcp23s08_spi.c | 101 +++++++++++++------------
2 files changed, 100 insertions(+), 102 deletions(-)
--
2.25.1
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH v2 1/4] pinctrl: mcp23s08_i2c: Extend match support for OF tables
2023-09-09 12:18 [PATCH v2 0/4] Match data improvements for mcp23s08 driver Biju Das
@ 2023-09-09 12:19 ` Biju Das
2023-09-09 12:19 ` [PATCH v2 2/4] pinctrl: mcp23s08_i2c: Simplify probe() Biju Das
` (3 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Biju Das @ 2023-09-09 12:19 UTC (permalink / raw)
To: Linus Walleij
Cc: Biju Das, linux-gpio, linux-kernel, Biju Das, Andy Shevchenko
The driver has OF match table, still it uses ID lookup table for
retrieving match data. Currently the driver is working on the
assumption that a I2C device registered via OF will always match a
legacy I2C device ID. The correct approach is to have an OF device ID
table using of_device_match_data() if the devices are registered via OF.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
v1->v2:
* Arranged variable declaration in reverse xmas tree.
---
drivers/pinctrl/pinctrl-mcp23s08_i2c.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-mcp23s08_i2c.c b/drivers/pinctrl/pinctrl-mcp23s08_i2c.c
index 3dd1bd8e73eb..41ea2650a7e4 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08_i2c.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08_i2c.c
@@ -10,16 +10,16 @@
static int mcp230xx_probe(struct i2c_client *client)
{
- const struct i2c_device_id *id = i2c_client_get_device_id(client);
struct device *dev = &client->dev;
- unsigned int type = id->driver_data;
struct mcp23s08 *mcp;
+ unsigned int type;
int ret;
mcp = devm_kzalloc(dev, sizeof(*mcp), GFP_KERNEL);
if (!mcp)
return -ENOMEM;
+ type = (uintptr_t)i2c_get_match_data(client);
switch (type) {
case MCP_TYPE_008:
mcp->regmap = devm_regmap_init_i2c(client, &mcp23x08_regmap);
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 2/4] pinctrl: mcp23s08_i2c: Simplify probe()
2023-09-09 12:18 [PATCH v2 0/4] Match data improvements for mcp23s08 driver Biju Das
2023-09-09 12:19 ` [PATCH v2 1/4] pinctrl: mcp23s08_i2c: Extend match support for OF tables Biju Das
@ 2023-09-09 12:19 ` Biju Das
2023-09-09 12:19 ` [PATCH v2 3/4] pinctrl: mcp23s08_spi: " Biju Das
` (2 subsequent siblings)
4 siblings, 0 replies; 6+ messages in thread
From: Biju Das @ 2023-09-09 12:19 UTC (permalink / raw)
To: Linus Walleij
Cc: Biju Das, linux-gpio, linux-kernel, Biju Das, Andy Shevchenko
Add struct mcp23s08_i2c_info and simplify probe() by replacing
match data 'type' with 'struct mcp23s08_i2c_info'.
While at it, replace 'dev_err()'->'dev_err_probe()' and drop printing
'type' in error path for i2c_get_match_data().
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
v1->v2:
* Updated commit description
* Dropped printing 'type' in error path for i2c_get_match_data().
---
drivers/pinctrl/pinctrl-mcp23s08_i2c.c | 101 ++++++++++++-------------
1 file changed, 49 insertions(+), 52 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-mcp23s08_i2c.c b/drivers/pinctrl/pinctrl-mcp23s08_i2c.c
index 41ea2650a7e4..34b2cfb45860 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08_i2c.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08_i2c.c
@@ -8,52 +8,40 @@
#include "pinctrl-mcp23s08.h"
+struct mcp23s08_i2c_info {
+ const struct regmap_config *regmap;
+ const char *label;
+ unsigned int type;
+ u16 ngpio;
+ bool reg_shift;
+};
+
static int mcp230xx_probe(struct i2c_client *client)
{
+ const struct mcp23s08_i2c_info *info;
struct device *dev = &client->dev;
struct mcp23s08 *mcp;
- unsigned int type;
int ret;
mcp = devm_kzalloc(dev, sizeof(*mcp), GFP_KERNEL);
if (!mcp)
return -ENOMEM;
- type = (uintptr_t)i2c_get_match_data(client);
- switch (type) {
- case MCP_TYPE_008:
- mcp->regmap = devm_regmap_init_i2c(client, &mcp23x08_regmap);
- mcp->reg_shift = 0;
- mcp->chip.ngpio = 8;
- mcp->chip.label = "mcp23008";
- break;
-
- case MCP_TYPE_017:
- mcp->regmap = devm_regmap_init_i2c(client, &mcp23x17_regmap);
- mcp->reg_shift = 1;
- mcp->chip.ngpio = 16;
- mcp->chip.label = "mcp23017";
- break;
-
- case MCP_TYPE_018:
- mcp->regmap = devm_regmap_init_i2c(client, &mcp23x17_regmap);
- mcp->reg_shift = 1;
- mcp->chip.ngpio = 16;
- mcp->chip.label = "mcp23018";
- break;
-
- default:
- dev_err(dev, "invalid device type (%d)\n", type);
- return -EINVAL;
- }
+ info = i2c_get_match_data(client);
+ if (!info)
+ return dev_err_probe(dev, -EINVAL, "invalid device type\n");
+ mcp->reg_shift = info->reg_shift;
+ mcp->chip.ngpio = info->ngpio;
+ mcp->chip.label = info->label;
+ mcp->regmap = devm_regmap_init_i2c(client, info->regmap);
if (IS_ERR(mcp->regmap))
return PTR_ERR(mcp->regmap);
mcp->irq = client->irq;
mcp->pinctrl_desc.name = "mcp23xxx-pinctrl";
- ret = mcp23s08_probe_one(mcp, dev, client->addr, type, -1);
+ ret = mcp23s08_probe_one(mcp, dev, client->addr, info->type, -1);
if (ret)
return ret;
@@ -62,36 +50,45 @@ static int mcp230xx_probe(struct i2c_client *client)
return 0;
}
+static const struct mcp23s08_i2c_info mcp23s08_i2c_0008 = {
+ .regmap = &mcp23x08_regmap,
+ .label = "mcp23008",
+ .type = MCP_TYPE_008,
+ .ngpio = 8,
+ .reg_shift = 0,
+};
+
+static const struct mcp23s08_i2c_info mcp23s08_i2c_0017 = {
+ .regmap = &mcp23x17_regmap,
+ .label = "mcp23017",
+ .type = MCP_TYPE_017,
+ .ngpio = 16,
+ .reg_shift = 1,
+};
+
+static const struct mcp23s08_i2c_info mcp23s08_i2c_0018 = {
+ .regmap = &mcp23x17_regmap,
+ .label = "mcp23018",
+ .type = MCP_TYPE_018,
+ .ngpio = 16,
+ .reg_shift = 1,
+};
+
static const struct i2c_device_id mcp230xx_id[] = {
- { "mcp23008", MCP_TYPE_008 },
- { "mcp23017", MCP_TYPE_017 },
- { "mcp23018", MCP_TYPE_018 },
+ { "mcp23008", (kernel_ulong_t)&mcp23s08_i2c_0008 },
+ { "mcp23017", (kernel_ulong_t)&mcp23s08_i2c_0017 },
+ { "mcp23018", (kernel_ulong_t)&mcp23s08_i2c_0018 },
{ }
};
MODULE_DEVICE_TABLE(i2c, mcp230xx_id);
static const struct of_device_id mcp23s08_i2c_of_match[] = {
- {
- .compatible = "microchip,mcp23008",
- .data = (void *) MCP_TYPE_008,
- },
- {
- .compatible = "microchip,mcp23017",
- .data = (void *) MCP_TYPE_017,
- },
- {
- .compatible = "microchip,mcp23018",
- .data = (void *) MCP_TYPE_018,
- },
+ { .compatible = "microchip,mcp23008", .data = &mcp23s08_i2c_0008 },
+ { .compatible = "microchip,mcp23017", .data = &mcp23s08_i2c_0017 },
+ { .compatible = "microchip,mcp23018", .data = &mcp23s08_i2c_0018 },
/* NOTE: The use of the mcp prefix is deprecated and will be removed. */
- {
- .compatible = "mcp,mcp23008",
- .data = (void *) MCP_TYPE_008,
- },
- {
- .compatible = "mcp,mcp23017",
- .data = (void *) MCP_TYPE_017,
- },
+ { .compatible = "mcp,mcp23008", .data = &mcp23s08_i2c_0008 },
+ { .compatible = "mcp,mcp23017", .data = &mcp23s08_i2c_0017 },
{ }
};
MODULE_DEVICE_TABLE(of, mcp23s08_i2c_of_match);
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 3/4] pinctrl: mcp23s08_spi: Simplify probe()
2023-09-09 12:18 [PATCH v2 0/4] Match data improvements for mcp23s08 driver Biju Das
2023-09-09 12:19 ` [PATCH v2 1/4] pinctrl: mcp23s08_i2c: Extend match support for OF tables Biju Das
2023-09-09 12:19 ` [PATCH v2 2/4] pinctrl: mcp23s08_i2c: Simplify probe() Biju Das
@ 2023-09-09 12:19 ` Biju Das
2023-09-09 12:19 ` [PATCH v2 4/4] pinctrl: mcp23s08_spi: Simplify mcp23s08_spi_regmap_init() Biju Das
2023-09-11 10:10 ` [PATCH v2 0/4] Match data improvements for mcp23s08 driver Andy Shevchenko
4 siblings, 0 replies; 6+ messages in thread
From: Biju Das @ 2023-09-09 12:19 UTC (permalink / raw)
To: Linus Walleij
Cc: Biju Das, linux-gpio, linux-kernel, Biju Das, Andy Shevchenko
Simpilfy probe() by replacing device_get_match_data() and ID lookup for
retrieving match data by spi_get_device_match_data().
While at it, replace data type of variable type from 'int'->'unsigned int'
and declare variables following a reverse christmas tree order.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
v2:
* New patch.
---
drivers/pinctrl/pinctrl-mcp23s08_spi.c | 13 ++++---------
1 file changed, 4 insertions(+), 9 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-mcp23s08_spi.c b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
index ea059b9c5542..caf528284d07 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08_spi.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
@@ -143,22 +143,17 @@ static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
static int mcp23s08_probe(struct spi_device *spi)
{
- struct device *dev = &spi->dev;
struct mcp23s08_driver_data *data;
+ struct device *dev = &spi->dev;
unsigned long spi_present_mask;
- const void *match;
- unsigned int addr;
unsigned int ngpio = 0;
+ unsigned int type;
+ unsigned int addr;
int chips;
- int type;
int ret;
u32 v;
- match = device_get_match_data(dev);
- if (match)
- type = (int)(uintptr_t)match;
- else
- type = spi_get_device_id(spi)->driver_data;
+ type = (uintptr_t)spi_get_device_match_data(spi);
ret = device_property_read_u32(dev, "microchip,spi-present-mask", &v);
if (ret) {
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* [PATCH v2 4/4] pinctrl: mcp23s08_spi: Simplify mcp23s08_spi_regmap_init()
2023-09-09 12:18 [PATCH v2 0/4] Match data improvements for mcp23s08 driver Biju Das
` (2 preceding siblings ...)
2023-09-09 12:19 ` [PATCH v2 3/4] pinctrl: mcp23s08_spi: " Biju Das
@ 2023-09-09 12:19 ` Biju Das
2023-09-11 10:10 ` [PATCH v2 0/4] Match data improvements for mcp23s08 driver Andy Shevchenko
4 siblings, 0 replies; 6+ messages in thread
From: Biju Das @ 2023-09-09 12:19 UTC (permalink / raw)
To: Linus Walleij
Cc: Biju Das, linux-gpio, linux-kernel, Biju Das, Andy Shevchenko
Add struct mcp23s08_spi_info and simplify mcp23s08_spi_regmap_init() by
replacing match data 'type' with 'struct mcp23s08_spi_info'.
Signed-off-by: Biju Das <biju.das.jz@bp.renesas.com>
---
v2:
* New patch
---
drivers/pinctrl/pinctrl-mcp23s08_spi.c | 92 ++++++++++++++------------
1 file changed, 49 insertions(+), 43 deletions(-)
diff --git a/drivers/pinctrl/pinctrl-mcp23s08_spi.c b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
index caf528284d07..b7f5b4109007 100644
--- a/drivers/pinctrl/pinctrl-mcp23s08_spi.c
+++ b/drivers/pinctrl/pinctrl-mcp23s08_spi.c
@@ -11,6 +11,13 @@
#define MCP_MAX_DEV_PER_CS 8
+struct mcp23s08_spi_info {
+ const struct regmap_config *regmap;
+ unsigned int type;
+ u16 ngpio;
+ bool reg_shift;
+};
+
/*
* A given spi_device can represent up to eight mcp23sxx chips
* sharing the same chipselect but using different addresses
@@ -80,21 +87,18 @@ static const struct regmap_bus mcp23sxx_spi_regmap = {
};
static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
- unsigned int addr, unsigned int type)
+ unsigned int addr,
+ const struct mcp23s08_spi_info *info)
{
- const struct regmap_config *config;
struct regmap_config *copy;
const char *name;
- switch (type) {
+ switch (info->type) {
case MCP_TYPE_S08:
- mcp->reg_shift = 0;
- mcp->chip.ngpio = 8;
mcp->chip.label = devm_kasprintf(dev, GFP_KERNEL, "mcp23s08.%d", addr);
if (!mcp->chip.label)
return -ENOMEM;
- config = &mcp23x08_regmap;
name = devm_kasprintf(dev, GFP_KERNEL, "%d", addr);
if (!name)
return -ENOMEM;
@@ -102,13 +106,10 @@ static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
break;
case MCP_TYPE_S17:
- mcp->reg_shift = 1;
- mcp->chip.ngpio = 16;
mcp->chip.label = devm_kasprintf(dev, GFP_KERNEL, "mcp23s17.%d", addr);
if (!mcp->chip.label)
return -ENOMEM;
- config = &mcp23x17_regmap;
name = devm_kasprintf(dev, GFP_KERNEL, "%d", addr);
if (!name)
return -ENOMEM;
@@ -116,20 +117,18 @@ static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
break;
case MCP_TYPE_S18:
- mcp->reg_shift = 1;
- mcp->chip.ngpio = 16;
mcp->chip.label = "mcp23s18";
-
- config = &mcp23x17_regmap;
- name = config->name;
+ name = info->regmap->name;
break;
default:
- dev_err(dev, "invalid device type (%d)\n", type);
+ dev_err(dev, "invalid device type (%d)\n", info->type);
return -EINVAL;
}
- copy = devm_kmemdup(dev, config, sizeof(*config), GFP_KERNEL);
+ mcp->reg_shift = info->reg_shift;
+ mcp->chip.ngpio = info->ngpio;
+ copy = devm_kmemdup(dev, info->regmap, sizeof(*info->regmap), GFP_KERNEL);
if (!copy)
return -ENOMEM;
@@ -143,17 +142,17 @@ static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
static int mcp23s08_probe(struct spi_device *spi)
{
+ const struct mcp23s08_spi_info *info;
struct mcp23s08_driver_data *data;
struct device *dev = &spi->dev;
unsigned long spi_present_mask;
unsigned int ngpio = 0;
- unsigned int type;
unsigned int addr;
int chips;
int ret;
u32 v;
- type = (uintptr_t)spi_get_device_match_data(spi);
+ info = spi_get_device_match_data(spi);
ret = device_property_read_u32(dev, "microchip,spi-present-mask", &v);
if (ret) {
@@ -182,7 +181,7 @@ static int mcp23s08_probe(struct spi_device *spi)
data->mcp[addr] = &data->chip[--chips];
data->mcp[addr]->irq = spi->irq;
- ret = mcp23s08_spi_regmap_init(data->mcp[addr], dev, addr, type);
+ ret = mcp23s08_spi_regmap_init(data->mcp[addr], dev, addr, info);
if (ret)
return ret;
@@ -192,7 +191,8 @@ static int mcp23s08_probe(struct spi_device *spi)
if (!data->mcp[addr]->pinctrl_desc.name)
return -ENOMEM;
- ret = mcp23s08_probe_one(data->mcp[addr], dev, 0x40 | (addr << 1), type, -1);
+ ret = mcp23s08_probe_one(data->mcp[addr], dev, 0x40 | (addr << 1),
+ info->type, -1);
if (ret < 0)
return ret;
@@ -203,36 +203,42 @@ static int mcp23s08_probe(struct spi_device *spi)
return 0;
}
+static const struct mcp23s08_spi_info mcp23s08_spi_s08 = {
+ .regmap = &mcp23x08_regmap,
+ .type = MCP_TYPE_S08,
+ .ngpio = 8,
+ .reg_shift = 0,
+};
+
+static const struct mcp23s08_spi_info mcp23s08_spi_s17 = {
+ .regmap = &mcp23x17_regmap,
+ .type = MCP_TYPE_S17,
+ .ngpio = 16,
+ .reg_shift = 1,
+};
+
+static const struct mcp23s08_spi_info mcp23s08_spi_s18 = {
+ .regmap = &mcp23x17_regmap,
+ .type = MCP_TYPE_S18,
+ .ngpio = 16,
+ .reg_shift = 1,
+};
+
static const struct spi_device_id mcp23s08_ids[] = {
- { "mcp23s08", MCP_TYPE_S08 },
- { "mcp23s17", MCP_TYPE_S17 },
- { "mcp23s18", MCP_TYPE_S18 },
+ { "mcp23s08", (kernel_ulong_t)&mcp23s08_spi_s08 },
+ { "mcp23s17", (kernel_ulong_t)&mcp23s08_spi_s17 },
+ { "mcp23s18", (kernel_ulong_t)&mcp23s08_spi_s18 },
{ }
};
MODULE_DEVICE_TABLE(spi, mcp23s08_ids);
static const struct of_device_id mcp23s08_spi_of_match[] = {
- {
- .compatible = "microchip,mcp23s08",
- .data = (void *) MCP_TYPE_S08,
- },
- {
- .compatible = "microchip,mcp23s17",
- .data = (void *) MCP_TYPE_S17,
- },
- {
- .compatible = "microchip,mcp23s18",
- .data = (void *) MCP_TYPE_S18,
- },
+ { .compatible = "microchip,mcp23s08", .data = &mcp23s08_spi_s08 },
+ { .compatible = "microchip,mcp23s17", .data = &mcp23s08_spi_s17 },
+ { .compatible = "microchip,mcp23s18", .data = &mcp23s08_spi_s18 },
/* NOTE: The use of the mcp prefix is deprecated and will be removed. */
- {
- .compatible = "mcp,mcp23s08",
- .data = (void *) MCP_TYPE_S08,
- },
- {
- .compatible = "mcp,mcp23s17",
- .data = (void *) MCP_TYPE_S17,
- },
+ { .compatible = "mcp,mcp23s08", .data = &mcp23s08_spi_s08 },
+ { .compatible = "mcp,mcp23s17", .data = &mcp23s08_spi_s17 },
{ }
};
MODULE_DEVICE_TABLE(of, mcp23s08_spi_of_match);
--
2.25.1
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH v2 0/4] Match data improvements for mcp23s08 driver
2023-09-09 12:18 [PATCH v2 0/4] Match data improvements for mcp23s08 driver Biju Das
` (3 preceding siblings ...)
2023-09-09 12:19 ` [PATCH v2 4/4] pinctrl: mcp23s08_spi: Simplify mcp23s08_spi_regmap_init() Biju Das
@ 2023-09-11 10:10 ` Andy Shevchenko
4 siblings, 0 replies; 6+ messages in thread
From: Andy Shevchenko @ 2023-09-11 10:10 UTC (permalink / raw)
To: Biju Das; +Cc: Linus Walleij, linux-gpio, linux-kernel, Biju Das
On Sat, Sep 09, 2023 at 01:18:59PM +0100, Biju Das wrote:
> This patch series aims to add match data improvements for mcp23s08 driver.
> This patch series is only compile tested.
Now, do you see the common grounds for unifying two data structure types you
created?
IN the common header you may introduce a type and use it in the both files.
For the patches 1 & 3 (the API simplification):
Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
--
With Best Regards,
Andy Shevchenko
^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-09-11 20:54 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-09-09 12:18 [PATCH v2 0/4] Match data improvements for mcp23s08 driver Biju Das
2023-09-09 12:19 ` [PATCH v2 1/4] pinctrl: mcp23s08_i2c: Extend match support for OF tables Biju Das
2023-09-09 12:19 ` [PATCH v2 2/4] pinctrl: mcp23s08_i2c: Simplify probe() Biju Das
2023-09-09 12:19 ` [PATCH v2 3/4] pinctrl: mcp23s08_spi: " Biju Das
2023-09-09 12:19 ` [PATCH v2 4/4] pinctrl: mcp23s08_spi: Simplify mcp23s08_spi_regmap_init() Biju Das
2023-09-11 10:10 ` [PATCH v2 0/4] Match data improvements for mcp23s08 driver Andy Shevchenko
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.