Commit 8fe31e09 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'gpio-fixes-for-v5.15-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux

Pull gpio fixes from Bartosz Golaszewski:

 - fix module autoloading on gpio-74x164 after a revert of OF modaliases

 - fix problems with the bias setting in gpio-pca953x

 - fix a use-after-free bug in gpio-mockup by using software nodes

* tag 'gpio-fixes-for-v5.15-rc6' of git://git.kernel.org/pub/scm/linux/kernel/git/brgl/linux:
  gpio: mockup: Convert to use software nodes
  gpio: pca953x: Improve bias setting
  gpio: 74x164: Add SPI device ID table
parents 985f6ab9 6fda593f
...@@ -174,6 +174,13 @@ static int gen_74x164_remove(struct spi_device *spi) ...@@ -174,6 +174,13 @@ static int gen_74x164_remove(struct spi_device *spi)
return 0; return 0;
} }
static const struct spi_device_id gen_74x164_spi_ids[] = {
{ .name = "74hc595" },
{ .name = "74lvc594" },
{},
};
MODULE_DEVICE_TABLE(spi, gen_74x164_spi_ids);
static const struct of_device_id gen_74x164_dt_ids[] = { static const struct of_device_id gen_74x164_dt_ids[] = {
{ .compatible = "fairchild,74hc595" }, { .compatible = "fairchild,74hc595" },
{ .compatible = "nxp,74lvc594" }, { .compatible = "nxp,74lvc594" },
...@@ -188,6 +195,7 @@ static struct spi_driver gen_74x164_driver = { ...@@ -188,6 +195,7 @@ static struct spi_driver gen_74x164_driver = {
}, },
.probe = gen_74x164_probe, .probe = gen_74x164_probe,
.remove = gen_74x164_remove, .remove = gen_74x164_remove,
.id_table = gen_74x164_spi_ids,
}; };
module_spi_driver(gen_74x164_driver); module_spi_driver(gen_74x164_driver);
......
...@@ -476,10 +476,19 @@ static struct platform_device *gpio_mockup_pdevs[GPIO_MOCKUP_MAX_GC]; ...@@ -476,10 +476,19 @@ static struct platform_device *gpio_mockup_pdevs[GPIO_MOCKUP_MAX_GC];
static void gpio_mockup_unregister_pdevs(void) static void gpio_mockup_unregister_pdevs(void)
{ {
struct platform_device *pdev;
struct fwnode_handle *fwnode;
int i; int i;
for (i = 0; i < GPIO_MOCKUP_MAX_GC; i++) for (i = 0; i < GPIO_MOCKUP_MAX_GC; i++) {
platform_device_unregister(gpio_mockup_pdevs[i]); pdev = gpio_mockup_pdevs[i];
if (!pdev)
continue;
fwnode = dev_fwnode(&pdev->dev);
platform_device_unregister(pdev);
fwnode_remove_software_node(fwnode);
}
} }
static __init char **gpio_mockup_make_line_names(const char *label, static __init char **gpio_mockup_make_line_names(const char *label,
...@@ -508,6 +517,7 @@ static int __init gpio_mockup_register_chip(int idx) ...@@ -508,6 +517,7 @@ static int __init gpio_mockup_register_chip(int idx)
struct property_entry properties[GPIO_MOCKUP_MAX_PROP]; struct property_entry properties[GPIO_MOCKUP_MAX_PROP];
struct platform_device_info pdevinfo; struct platform_device_info pdevinfo;
struct platform_device *pdev; struct platform_device *pdev;
struct fwnode_handle *fwnode;
char **line_names = NULL; char **line_names = NULL;
char chip_label[32]; char chip_label[32];
int prop = 0, base; int prop = 0, base;
...@@ -536,13 +546,18 @@ static int __init gpio_mockup_register_chip(int idx) ...@@ -536,13 +546,18 @@ static int __init gpio_mockup_register_chip(int idx)
"gpio-line-names", line_names, ngpio); "gpio-line-names", line_names, ngpio);
} }
fwnode = fwnode_create_software_node(properties, NULL);
if (IS_ERR(fwnode))
return PTR_ERR(fwnode);
pdevinfo.name = "gpio-mockup"; pdevinfo.name = "gpio-mockup";
pdevinfo.id = idx; pdevinfo.id = idx;
pdevinfo.properties = properties; pdevinfo.fwnode = fwnode;
pdev = platform_device_register_full(&pdevinfo); pdev = platform_device_register_full(&pdevinfo);
kfree_strarray(line_names, ngpio); kfree_strarray(line_names, ngpio);
if (IS_ERR(pdev)) { if (IS_ERR(pdev)) {
fwnode_remove_software_node(fwnode);
pr_err("error registering device"); pr_err("error registering device");
return PTR_ERR(pdev); return PTR_ERR(pdev);
} }
......
...@@ -559,21 +559,21 @@ static int pca953x_gpio_set_pull_up_down(struct pca953x_chip *chip, ...@@ -559,21 +559,21 @@ static int pca953x_gpio_set_pull_up_down(struct pca953x_chip *chip,
mutex_lock(&chip->i2c_lock); mutex_lock(&chip->i2c_lock);
/* Disable pull-up/pull-down */
ret = regmap_write_bits(chip->regmap, pull_en_reg, bit, 0);
if (ret)
goto exit;
/* Configure pull-up/pull-down */ /* Configure pull-up/pull-down */
if (config == PIN_CONFIG_BIAS_PULL_UP) if (config == PIN_CONFIG_BIAS_PULL_UP)
ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, bit); ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, bit);
else if (config == PIN_CONFIG_BIAS_PULL_DOWN) else if (config == PIN_CONFIG_BIAS_PULL_DOWN)
ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, 0); ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, 0);
else
ret = 0;
if (ret) if (ret)
goto exit; goto exit;
/* Enable pull-up/pull-down */ /* Disable/Enable pull-up/pull-down */
ret = regmap_write_bits(chip->regmap, pull_en_reg, bit, bit); if (config == PIN_CONFIG_BIAS_DISABLE)
ret = regmap_write_bits(chip->regmap, pull_en_reg, bit, 0);
else
ret = regmap_write_bits(chip->regmap, pull_en_reg, bit, bit);
exit: exit:
mutex_unlock(&chip->i2c_lock); mutex_unlock(&chip->i2c_lock);
...@@ -587,7 +587,9 @@ static int pca953x_gpio_set_config(struct gpio_chip *gc, unsigned int offset, ...@@ -587,7 +587,9 @@ static int pca953x_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
switch (pinconf_to_config_param(config)) { switch (pinconf_to_config_param(config)) {
case PIN_CONFIG_BIAS_PULL_UP: case PIN_CONFIG_BIAS_PULL_UP:
case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
case PIN_CONFIG_BIAS_PULL_DOWN: case PIN_CONFIG_BIAS_PULL_DOWN:
case PIN_CONFIG_BIAS_DISABLE:
return pca953x_gpio_set_pull_up_down(chip, offset, config); return pca953x_gpio_set_pull_up_down(chip, offset, config);
default: default:
return -ENOTSUPP; return -ENOTSUPP;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment