[2/2] gpio: mcp32s08: add support for mcp23018

Message ID 1507166615-4530-3-git-send-email-preid@electromag.com.au
State New
Headers show
Series
  • gpio: mcp32s08: add support for mcp23018
Related show

Commit Message

Phil Reid Oct. 5, 2017, 1:23 a.m.
This adds the required definitions for the mcp23018 which is the i2c
variant of the mcp23s18.

Signed-off-by: Phil Reid <preid@electromag.com.au>
---
 drivers/gpio/gpio-mcp23s08.c | 15 ++++++++++++++-
 1 file changed, 14 insertions(+), 1 deletion(-)

Comments

Phil Reid Oct. 5, 2017, 6:56 a.m. | #1
On 5/10/2017 09:23, Phil Reid wrote:
> This adds the required definitions for the mcp23018 which is the i2c
> variant of the mcp23s18.
> 
> Signed-off-by: Phil Reid <preid@electromag.com.au>
> ---
>   drivers/gpio/gpio-mcp23s08.c | 15 ++++++++++++++-
>   1 file changed, 14 insertions(+), 1 deletion(-)

I've just noticed that this needs to be rebased as mcp23s08 driver has moved.
Other that the new location the patch is the same so far.
I have a couple of queries regarding the driver in another email, will wait for that first..



> 
> diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c
> index 2a57d024..92751e5 100644
> --- a/drivers/gpio/gpio-mcp23s08.c
> +++ b/drivers/gpio/gpio-mcp23s08.c
> @@ -33,6 +33,7 @@
>   #define MCP_TYPE_008	2
>   #define MCP_TYPE_017	3
>   #define MCP_TYPE_S18    4
> +#define MCP_TYPE_018    5
>   
>   /* Registers are all 8 bits wide.
>    *
> @@ -595,6 +596,13 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
>   		mcp->chip.ngpio = 16;
>   		mcp->chip.label = "mcp23017";
>   		break;
> +
> +	case MCP_TYPE_018:
> +		mcp->regmap = devm_regmap_init_i2c(data, &mcp23x17_regmap);
> +		mcp->reg_shift = 1;
> +		mcp->chip.ngpio = 16;
> +		mcp->chip.label = "mcp23018";
> +		break;
>   #endif /* CONFIG_I2C */
>   
>   	default:
> @@ -640,7 +648,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
>   		if (mirror)
>   			status |= IOCON_MIRROR | (IOCON_MIRROR << 8);
>   
> -		if (type == MCP_TYPE_S18)
> +		if (type == MCP_TYPE_S18 || type == MCP_TYPE_018)
>   			status |= IOCON_INTCC | (IOCON_INTCC << 8);
>   
>   		ret = mcp_write(mcp, MCP_IOCON, status);
> @@ -729,6 +737,10 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
>   		.compatible = "microchip,mcp23017",
>   		.data = (void *) MCP_TYPE_017,
>   	},
> +	{
> +		.compatible = "microchip,mcp23018",
> +		.data = (void *) MCP_TYPE_018,
> +	},
>   /* NOTE: The use of the mcp prefix is deprecated and will be removed. */
>   	{
>   		.compatible = "mcp,mcp23008",
> @@ -812,6 +824,7 @@ static int mcp230xx_remove(struct i2c_client *client)
>   static const struct i2c_device_id mcp230xx_id[] = {
>   	{ "mcp23008", MCP_TYPE_008 },
>   	{ "mcp23017", MCP_TYPE_017 },
> +	{ "mcp23018", MCP_TYPE_018 },
>   	{ },
>   };
>   MODULE_DEVICE_TABLE(i2c, mcp230xx_id);
>

Patch

diff --git a/drivers/gpio/gpio-mcp23s08.c b/drivers/gpio/gpio-mcp23s08.c
index 2a57d024..92751e5 100644
--- a/drivers/gpio/gpio-mcp23s08.c
+++ b/drivers/gpio/gpio-mcp23s08.c
@@ -33,6 +33,7 @@ 
 #define MCP_TYPE_008	2
 #define MCP_TYPE_017	3
 #define MCP_TYPE_S18    4
+#define MCP_TYPE_018    5
 
 /* Registers are all 8 bits wide.
  *
@@ -595,6 +596,13 @@  static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
 		mcp->chip.ngpio = 16;
 		mcp->chip.label = "mcp23017";
 		break;
+
+	case MCP_TYPE_018:
+		mcp->regmap = devm_regmap_init_i2c(data, &mcp23x17_regmap);
+		mcp->reg_shift = 1;
+		mcp->chip.ngpio = 16;
+		mcp->chip.label = "mcp23018";
+		break;
 #endif /* CONFIG_I2C */
 
 	default:
@@ -640,7 +648,7 @@  static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
 		if (mirror)
 			status |= IOCON_MIRROR | (IOCON_MIRROR << 8);
 
-		if (type == MCP_TYPE_S18)
+		if (type == MCP_TYPE_S18 || type == MCP_TYPE_018)
 			status |= IOCON_INTCC | (IOCON_INTCC << 8);
 
 		ret = mcp_write(mcp, MCP_IOCON, status);
@@ -729,6 +737,10 @@  static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
 		.compatible = "microchip,mcp23017",
 		.data = (void *) MCP_TYPE_017,
 	},
+	{
+		.compatible = "microchip,mcp23018",
+		.data = (void *) MCP_TYPE_018,
+	},
 /* NOTE: The use of the mcp prefix is deprecated and will be removed. */
 	{
 		.compatible = "mcp,mcp23008",
@@ -812,6 +824,7 @@  static int mcp230xx_remove(struct i2c_client *client)
 static const struct i2c_device_id mcp230xx_id[] = {
 	{ "mcp23008", MCP_TYPE_008 },
 	{ "mcp23017", MCP_TYPE_017 },
+	{ "mcp23018", MCP_TYPE_018 },
 	{ },
 };
 MODULE_DEVICE_TABLE(i2c, mcp230xx_id);