]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/pinctrl/pinctrl-mcp23s08.c
iommu/vt-d: Fix usage of force parameter in intel_ir_reconfigure_irte()
[mirror_ubuntu-bionic-kernel.git] / drivers / pinctrl / pinctrl-mcp23s08.c
index 4a6ea159c65de4c6365ebfffb698b214fa2ae937..03ee9be2bb30adef285b0210e8874111d6420df4 100644 (file)
@@ -777,6 +777,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);
 
@@ -797,22 +798,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;
@@ -896,16 +911,16 @@ static int mcp23s08_probe_one(struct mcp23s08 *mcp, struct device *dev,
                        goto fail;
        }
 
-       ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp);
-       if (ret < 0)
-               goto fail;
-
        if (mcp->irq && mcp->irq_controller) {
                ret = mcp23s08_irq_setup(mcp);
                if (ret)
                        goto fail;
        }
 
+       ret = devm_gpiochip_add_data(dev, &mcp->chip, mcp);
+       if (ret < 0)
+               goto fail;
+
        mcp->pinctrl_desc.name = "mcp23xxx-pinctrl";
        mcp->pinctrl_desc.pctlops = &mcp_pinctrl_ops;
        mcp->pinctrl_desc.confops = &mcp_pinconf_ops;