|
@@ -771,6 +771,7 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
|
|
|
{
|
|
|
int status, ret;
|
|
|
bool mirror = false;
|
|
|
+ struct regmap_config *one_regmap_config = NULL;
|
|
|
|
|
|
mutex_init(&mcp->lock);
|
|
|
|
|
@@ -791,22 +792,36 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
|
|
|
switch (type) {
|
|
|
#ifdef CONFIG_SPI_MASTER
|
|
|
case MCP_TYPE_S08:
|
|
|
- mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp,
|
|
|
- &mcp23x08_regmap);
|
|
|
- mcp->reg_shift = 0;
|
|
|
- mcp->chip.ngpio = 8;
|
|
|
- mcp->chip.label = "mcp23s08";
|
|
|
- break;
|
|
|
-
|
|
|
case MCP_TYPE_S17:
|
|
|
+ switch (type) {
|
|
|
+ case MCP_TYPE_S08:
|
|
|
+ one_regmap_config =
|
|
|
+ devm_kmemdup(dev, &mcp23x08_regmap,
|
|
|
+ sizeof(struct regmap_config), GFP_KERNEL);
|
|
|
+ mcp->reg_shift = 0;
|
|
|
+ mcp->chip.ngpio = 8;
|
|
|
+ mcp->chip.label = "mcp23s08";
|
|
|
+ break;
|
|
|
+ case MCP_TYPE_S17:
|
|
|
+ one_regmap_config =
|
|
|
+ devm_kmemdup(dev, &mcp23x17_regmap,
|
|
|
+ sizeof(struct regmap_config), GFP_KERNEL);
|
|
|
+ mcp->reg_shift = 1;
|
|
|
+ mcp->chip.ngpio = 16;
|
|
|
+ mcp->chip.label = "mcp23s17";
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ if (!one_regmap_config)
|
|
|
+ return -ENOMEM;
|
|
|
+
|
|
|
+ one_regmap_config->name = devm_kasprintf(dev, GFP_KERNEL, "%d", (addr & ~0x40) >> 1);
|
|
|
mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp,
|
|
|
- &mcp23x17_regmap);
|
|
|
- mcp->reg_shift = 1;
|
|
|
- mcp->chip.ngpio = 16;
|
|
|
- mcp->chip.label = "mcp23s17";
|
|
|
+ one_regmap_config);
|
|
|
break;
|
|
|
|
|
|
case MCP_TYPE_S18:
|
|
|
+ if (!one_regmap_config)
|
|
|
+ return -ENOMEM;
|
|
|
mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp,
|
|
|
&mcp23x17_regmap);
|
|
|
mcp->reg_shift = 1;
|