Commit 0874758e authored by Andy Shevchenko's avatar Andy Shevchenko Committed by Linus Walleij
Browse files

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: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
Link: https://lore.kernel.org/r/20200407173849.43628-5-andriy.shevchenko@linux.intel.com


Signed-off-by: default avatarLinus Walleij <linus.walleij@linaro.org>
parent 0521701c
Loading
Loading
Loading
Loading
+28 −33
Original line number Diff line number Diff line
@@ -888,50 +888,38 @@ struct mcp23s08_driver_data {
static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
				    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) {
	case MCP_TYPE_S08:
	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 = devm_kasprintf(dev, GFP_KERNEL,
					"mcp23s08.%d", addr);
		mcp->chip.label = devm_kasprintf(dev, GFP_KERNEL, "mcp23s08.%d",
						 addr);

		config = &mcp23x08_regmap;
		name = devm_kasprintf(dev, GFP_KERNEL, "%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;
		mcp->chip.label = devm_kasprintf(dev, GFP_KERNEL, "mcp23s17.%d",
						 addr);

		one_regmap_config->name = devm_kasprintf(dev, GFP_KERNEL, "%d", addr);
		mcp->regmap = devm_regmap_init(dev, &mcp23sxx_spi_regmap, mcp,
					       one_regmap_config);
		config = &mcp23x17_regmap;
		name = devm_kasprintf(dev, GFP_KERNEL, "%d", addr);
		break;

	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->chip.ngpio = 16;
		mcp->chip.label = "mcp23s18";

		config = &mcp23x17_regmap;
		name = config->name;
		break;

	default:
@@ -939,6 +927,13 @@ static int mcp23s08_spi_regmap_init(struct mcp23s08 *mcp, struct device *dev,
		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))
		return PTR_ERR(mcp->regmap);