pinctrl: mcp23s08: Refactor mcp23s08_spi_regmap_init()
There is a lot of duplication for one small helper function. Refactor mcp23s08_spi_regmap_init() to prepare everything first and then register regmap at the end. Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20200407173849.43628-5-andriy.shevchenko@linux.intel.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
This commit is contained in:
Родитель
0521701c8d
Коммит
0874758ecb
|
@ -888,50 +888,38 @@ struct mcp23s08_driver_data {
|
||||||
static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
|
static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
|
||||||
unsigned int addr, unsigned int type)
|
unsigned int addr, unsigned int type)
|
||||||
{
|
{
|
||||||
struct regmap_config *one_regmap_config = NULL;
|
const struct regmap_config *config;
|
||||||
|
struct regmap_config *copy;
|
||||||
|
const char *name;
|
||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case MCP_TYPE_S08:
|
case MCP_TYPE_S08:
|
||||||
case MCP_TYPE_S17:
|
mcp->reg_shift = 0;
|
||||||
switch (type) {
|
mcp->chip.ngpio = 8;
|
||||||
case MCP_TYPE_S08:
|
mcp->chip.label = devm_kasprintf(dev, GFP_KERNEL, "mcp23s08.%d",
|
||||||
one_regmap_config =
|
addr);
|
||||||
devm_kmemdup(dev, &mcp23x08_regmap,
|
|
||||||
sizeof(struct regmap_config), GFP_KERNEL);
|
|
||||||
mcp->reg_shift = 0;
|
|
||||||
mcp->chip.ngpio = 8;
|
|
||||||
mcp->chip.label = devm_kasprintf(dev, GFP_KERNEL,
|
|
||||||
"mcp23s08.%d", addr);
|
|
||||||
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 = devm_kasprintf(dev, GFP_KERNEL,
|
|
||||||
"mcp23s17.%d", addr);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!one_regmap_config)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
one_regmap_config->name = devm_kasprintf(dev, GFP_KERNEL, "%d", addr);
|
config = &mcp23x08_regmap;
|
||||||
mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp,
|
name = devm_kasprintf(dev, GFP_KERNEL, "%d", addr);
|
||||||
one_regmap_config);
|
break;
|
||||||
|
|
||||||
|
case MCP_TYPE_S17:
|
||||||
|
mcp->reg_shift = 1;
|
||||||
|
mcp->chip.ngpio = 16;
|
||||||
|
mcp->chip.label = devm_kasprintf(dev, GFP_KERNEL, "mcp23s17.%d",
|
||||||
|
addr);
|
||||||
|
|
||||||
|
config = &mcp23x17_regmap;
|
||||||
|
name = devm_kasprintf(dev, GFP_KERNEL, "%d", addr);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case MCP_TYPE_S18:
|
case MCP_TYPE_S18:
|
||||||
one_regmap_config =
|
|
||||||
devm_kmemdup(dev, &mcp23x17_regmap,
|
|
||||||
sizeof(struct regmap_config), GFP_KERNEL);
|
|
||||||
if (!one_regmap_config)
|
|
||||||
return -ENOMEM;
|
|
||||||
mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp,
|
|
||||||
one_regmap_config);
|
|
||||||
mcp->reg_shift = 1;
|
mcp->reg_shift = 1;
|
||||||
mcp->chip.ngpio = 16;
|
mcp->chip.ngpio = 16;
|
||||||
mcp->chip.label = "mcp23s18";
|
mcp->chip.label = "mcp23s18";
|
||||||
|
|
||||||
|
config = &mcp23x17_regmap;
|
||||||
|
name = config->name;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -939,6 +927,13 @@ static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
copy = devm_kmemdup(dev, &config, sizeof(config), GFP_KERNEL);
|
||||||
|
if (!copy)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
copy->name = name;
|
||||||
|
|
||||||
|
mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp, copy);
|
||||||
if (IS_ERR(mcp->regmap))
|
if (IS_ERR(mcp->regmap))
|
||||||
return PTR_ERR(mcp->regmap);
|
return PTR_ERR(mcp->regmap);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче