mirror of
https://github.com/torvalds/linux.git
synced 2024-11-23 12:42:02 +00:00
gpio fixes for v5.15-rc6
- 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 -----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEFp3rbAvDxGAT0sefEacuoBRx13IFAmFpdQUACgkQEacuoBRx 13JpLRAAuf/8qGqPzdU6zvzU8lXMRKEibjAdG65tk4eOsZhcmydhYVZ2TktycUK2 4MZE0oNClmSZlB2hm/UT/94h5LXRqsAxD+IC66siZB7keK00KV5TdR+JSAMlKt1F fzAIf4RWgc2Nfqy+Xp5JJaPr8fiM1S6/LjNJJCdbPERWI4pC7x0CamnooatGf4N8 mM7MIrUVll1OKvpSYAiqE4SgGr2WcxbM3334ZniBk++YowA0nT7GBwC9Yzoc0jzR 9njv6U2H1WOpeNWpwOYYjnyHIRClfPcyzi0KmetrQjQYa+rzavAQZ/TmM5eQn+D3 K+7Wbo5I4/YRBuNBGLnW1W1DTSJRk5+x3bkfvSgYxU59r1P/UNhJpqg8WB0t5XRw ILELPzugJkj77mSQyjBzmj7NsqgMd3B8YY8VUneB/cAHyeTqouqVRvpbr1Y1WTTv J2Pwwtz2Sg0FENVVI1hy+L9IuLaf1Yt7WQBabYCLdgz0aOLte3h8HyPLsJef1UL5 VG8e1hKbNwfuWXVVLHcykNi61MKM0sSH4BwiaHWsOBDrE+tO6dzDz3kCEOoF7+FI nzx1gT6HqeUf43rXu9AJd6+nGd+RlwoGSlioBWXtfFoenKr8OcmvEEK0h+BE7O56 NenCKlCXqDas1xiZM2xTixdyhHccZPDncAx5F34FYs3ixk7yGsQ= =dOer -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
8fe31e0995
@ -174,6 +174,13 @@ static int gen_74x164_remove(struct spi_device *spi)
|
||||
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[] = {
|
||||
{ .compatible = "fairchild,74hc595" },
|
||||
{ .compatible = "nxp,74lvc594" },
|
||||
@ -188,6 +195,7 @@ static struct spi_driver gen_74x164_driver = {
|
||||
},
|
||||
.probe = gen_74x164_probe,
|
||||
.remove = gen_74x164_remove,
|
||||
.id_table = gen_74x164_spi_ids,
|
||||
};
|
||||
module_spi_driver(gen_74x164_driver);
|
||||
|
||||
|
@ -476,10 +476,19 @@ static struct platform_device *gpio_mockup_pdevs[GPIO_MOCKUP_MAX_GC];
|
||||
|
||||
static void gpio_mockup_unregister_pdevs(void)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct fwnode_handle *fwnode;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < GPIO_MOCKUP_MAX_GC; i++)
|
||||
platform_device_unregister(gpio_mockup_pdevs[i]);
|
||||
for (i = 0; i < GPIO_MOCKUP_MAX_GC; 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,
|
||||
@ -508,6 +517,7 @@ static int __init gpio_mockup_register_chip(int idx)
|
||||
struct property_entry properties[GPIO_MOCKUP_MAX_PROP];
|
||||
struct platform_device_info pdevinfo;
|
||||
struct platform_device *pdev;
|
||||
struct fwnode_handle *fwnode;
|
||||
char **line_names = NULL;
|
||||
char chip_label[32];
|
||||
int prop = 0, base;
|
||||
@ -536,13 +546,18 @@ static int __init gpio_mockup_register_chip(int idx)
|
||||
"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.id = idx;
|
||||
pdevinfo.properties = properties;
|
||||
pdevinfo.fwnode = fwnode;
|
||||
|
||||
pdev = platform_device_register_full(&pdevinfo);
|
||||
kfree_strarray(line_names, ngpio);
|
||||
if (IS_ERR(pdev)) {
|
||||
fwnode_remove_software_node(fwnode);
|
||||
pr_err("error registering device");
|
||||
return PTR_ERR(pdev);
|
||||
}
|
||||
|
@ -559,21 +559,21 @@ static int pca953x_gpio_set_pull_up_down(struct pca953x_chip *chip,
|
||||
|
||||
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 */
|
||||
if (config == PIN_CONFIG_BIAS_PULL_UP)
|
||||
ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, bit);
|
||||
else if (config == PIN_CONFIG_BIAS_PULL_DOWN)
|
||||
ret = regmap_write_bits(chip->regmap, pull_sel_reg, bit, 0);
|
||||
else
|
||||
ret = 0;
|
||||
if (ret)
|
||||
goto exit;
|
||||
|
||||
/* Enable pull-up/pull-down */
|
||||
ret = regmap_write_bits(chip->regmap, pull_en_reg, bit, bit);
|
||||
/* Disable/Enable pull-up/pull-down */
|
||||
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:
|
||||
mutex_unlock(&chip->i2c_lock);
|
||||
@ -587,7 +587,9 @@ static int pca953x_gpio_set_config(struct gpio_chip *gc, unsigned int offset,
|
||||
|
||||
switch (pinconf_to_config_param(config)) {
|
||||
case PIN_CONFIG_BIAS_PULL_UP:
|
||||
case PIN_CONFIG_BIAS_PULL_PIN_DEFAULT:
|
||||
case PIN_CONFIG_BIAS_PULL_DOWN:
|
||||
case PIN_CONFIG_BIAS_DISABLE:
|
||||
return pca953x_gpio_set_pull_up_down(chip, offset, config);
|
||||
default:
|
||||
return -ENOTSUPP;
|
||||
|
Loading…
Reference in New Issue
Block a user