Commit 66f7d2ce authored by Lee Jones's avatar Lee Jones

Merge branches 'ib-leds-mips-sound-6.10' and 'ib-leds-locking-6.10' into ibs-for-leds-merged

parents ab2ab9e6 c382e2e3
...@@ -283,7 +283,10 @@ static int an30259a_probe(struct i2c_client *client) ...@@ -283,7 +283,10 @@ static int an30259a_probe(struct i2c_client *client)
if (err < 0) if (err < 0)
return err; return err;
mutex_init(&chip->mutex); err = devm_mutex_init(&client->dev, &chip->mutex);
if (err)
return err;
chip->client = client; chip->client = client;
i2c_set_clientdata(client, chip); i2c_set_clientdata(client, chip);
...@@ -317,17 +320,9 @@ static int an30259a_probe(struct i2c_client *client) ...@@ -317,17 +320,9 @@ static int an30259a_probe(struct i2c_client *client)
return 0; return 0;
exit: exit:
mutex_destroy(&chip->mutex);
return err; return err;
} }
static void an30259a_remove(struct i2c_client *client)
{
struct an30259a *chip = i2c_get_clientdata(client);
mutex_destroy(&chip->mutex);
}
static const struct of_device_id an30259a_match_table[] = { static const struct of_device_id an30259a_match_table[] = {
{ .compatible = "panasonic,an30259a", }, { .compatible = "panasonic,an30259a", },
{ /* sentinel */ }, { /* sentinel */ },
...@@ -347,7 +342,6 @@ static struct i2c_driver an30259a_driver = { ...@@ -347,7 +342,6 @@ static struct i2c_driver an30259a_driver = {
.of_match_table = an30259a_match_table, .of_match_table = an30259a_match_table,
}, },
.probe = an30259a_probe, .probe = an30259a_probe,
.remove = an30259a_remove,
.id_table = an30259a_id, .id_table = an30259a_id,
}; };
......
...@@ -530,6 +530,16 @@ static const struct regmap_config aw200xx_regmap_config = { ...@@ -530,6 +530,16 @@ static const struct regmap_config aw200xx_regmap_config = {
.disable_locking = true, .disable_locking = true,
}; };
static void aw200xx_chip_reset_action(void *data)
{
aw200xx_chip_reset(data);
}
static void aw200xx_disable_action(void *data)
{
aw200xx_disable(data);
}
static int aw200xx_probe(struct i2c_client *client) static int aw200xx_probe(struct i2c_client *client)
{ {
const struct aw200xx_chipdef *cdef; const struct aw200xx_chipdef *cdef;
...@@ -568,11 +578,17 @@ static int aw200xx_probe(struct i2c_client *client) ...@@ -568,11 +578,17 @@ static int aw200xx_probe(struct i2c_client *client)
aw200xx_enable(chip); aw200xx_enable(chip);
ret = devm_add_action(&client->dev, aw200xx_disable_action, chip);
if (ret)
return ret;
ret = aw200xx_chip_check(chip); ret = aw200xx_chip_check(chip);
if (ret) if (ret)
return ret; return ret;
mutex_init(&chip->mutex); ret = devm_mutex_init(&client->dev, &chip->mutex);
if (ret)
return ret;
/* Need a lock now since after call aw200xx_probe_fw, sysfs nodes created */ /* Need a lock now since after call aw200xx_probe_fw, sysfs nodes created */
mutex_lock(&chip->mutex); mutex_lock(&chip->mutex);
...@@ -581,6 +597,10 @@ static int aw200xx_probe(struct i2c_client *client) ...@@ -581,6 +597,10 @@ static int aw200xx_probe(struct i2c_client *client)
if (ret) if (ret)
goto out_unlock; goto out_unlock;
ret = devm_add_action(&client->dev, aw200xx_chip_reset_action, chip);
if (ret)
goto out_unlock;
ret = aw200xx_probe_fw(&client->dev, chip); ret = aw200xx_probe_fw(&client->dev, chip);
if (ret) if (ret)
goto out_unlock; goto out_unlock;
...@@ -595,15 +615,6 @@ static int aw200xx_probe(struct i2c_client *client) ...@@ -595,15 +615,6 @@ static int aw200xx_probe(struct i2c_client *client)
return ret; return ret;
} }
static void aw200xx_remove(struct i2c_client *client)
{
struct aw200xx *chip = i2c_get_clientdata(client);
aw200xx_chip_reset(chip);
aw200xx_disable(chip);
mutex_destroy(&chip->mutex);
}
static const struct aw200xx_chipdef aw20036_cdef = { static const struct aw200xx_chipdef aw20036_cdef = {
.channels = 36, .channels = 36,
.display_size_rows_max = 3, .display_size_rows_max = 3,
...@@ -652,7 +663,6 @@ static struct i2c_driver aw200xx_driver = { ...@@ -652,7 +663,6 @@ static struct i2c_driver aw200xx_driver = {
.of_match_table = aw200xx_match_table, .of_match_table = aw200xx_match_table,
}, },
.probe = aw200xx_probe, .probe = aw200xx_probe,
.remove = aw200xx_remove,
.id_table = aw200xx_id, .id_table = aw200xx_id,
}; };
module_i2c_driver(aw200xx_driver); module_i2c_driver(aw200xx_driver);
......
...@@ -320,6 +320,11 @@ static int aw2013_probe_dt(struct aw2013 *chip) ...@@ -320,6 +320,11 @@ static int aw2013_probe_dt(struct aw2013 *chip)
return 0; return 0;
} }
static void aw2013_chip_disable_action(void *data)
{
aw2013_chip_disable(data);
}
static const struct regmap_config aw2013_regmap_config = { static const struct regmap_config aw2013_regmap_config = {
.reg_bits = 8, .reg_bits = 8,
.val_bits = 8, .val_bits = 8,
...@@ -336,7 +341,10 @@ static int aw2013_probe(struct i2c_client *client) ...@@ -336,7 +341,10 @@ static int aw2013_probe(struct i2c_client *client)
if (!chip) if (!chip)
return -ENOMEM; return -ENOMEM;
mutex_init(&chip->mutex); ret = devm_mutex_init(&client->dev, &chip->mutex);
if (ret)
return ret;
mutex_lock(&chip->mutex); mutex_lock(&chip->mutex);
chip->client = client; chip->client = client;
...@@ -384,6 +392,10 @@ static int aw2013_probe(struct i2c_client *client) ...@@ -384,6 +392,10 @@ static int aw2013_probe(struct i2c_client *client)
goto error_reg; goto error_reg;
} }
ret = devm_add_action(&client->dev, aw2013_chip_disable_action, chip);
if (ret)
goto error_reg;
ret = aw2013_probe_dt(chip); ret = aw2013_probe_dt(chip);
if (ret < 0) if (ret < 0)
goto error_reg; goto error_reg;
...@@ -406,19 +418,9 @@ static int aw2013_probe(struct i2c_client *client) ...@@ -406,19 +418,9 @@ static int aw2013_probe(struct i2c_client *client)
error: error:
mutex_unlock(&chip->mutex); mutex_unlock(&chip->mutex);
mutex_destroy(&chip->mutex);
return ret; return ret;
} }
static void aw2013_remove(struct i2c_client *client)
{
struct aw2013 *chip = i2c_get_clientdata(client);
aw2013_chip_disable(chip);
mutex_destroy(&chip->mutex);
}
static const struct of_device_id aw2013_match_table[] = { static const struct of_device_id aw2013_match_table[] = {
{ .compatible = "awinic,aw2013", }, { .compatible = "awinic,aw2013", },
{ /* sentinel */ }, { /* sentinel */ },
...@@ -432,7 +434,6 @@ static struct i2c_driver aw2013_driver = { ...@@ -432,7 +434,6 @@ static struct i2c_driver aw2013_driver = {
.of_match_table = aw2013_match_table, .of_match_table = aw2013_match_table,
}, },
.probe = aw2013_probe, .probe = aw2013_probe,
.remove = aw2013_remove,
}; };
module_i2c_driver(aw2013_driver); module_i2c_driver(aw2013_driver);
......
...@@ -542,6 +542,13 @@ static int lm3532_parse_als(struct lm3532_data *priv) ...@@ -542,6 +542,13 @@ static int lm3532_parse_als(struct lm3532_data *priv)
return ret; return ret;
} }
static void gpio_set_low_action(void *data)
{
struct lm3532_data *priv = data;
gpiod_direction_output(priv->enable_gpio, 0);
}
static int lm3532_parse_node(struct lm3532_data *priv) static int lm3532_parse_node(struct lm3532_data *priv)
{ {
struct fwnode_handle *child = NULL; struct fwnode_handle *child = NULL;
...@@ -556,6 +563,12 @@ static int lm3532_parse_node(struct lm3532_data *priv) ...@@ -556,6 +563,12 @@ static int lm3532_parse_node(struct lm3532_data *priv)
if (IS_ERR(priv->enable_gpio)) if (IS_ERR(priv->enable_gpio))
priv->enable_gpio = NULL; priv->enable_gpio = NULL;
if (priv->enable_gpio) {
ret = devm_add_action(&priv->client->dev, gpio_set_low_action, priv);
if (ret)
return ret;
}
priv->regulator = devm_regulator_get(&priv->client->dev, "vin"); priv->regulator = devm_regulator_get(&priv->client->dev, "vin");
if (IS_ERR(priv->regulator)) if (IS_ERR(priv->regulator))
priv->regulator = NULL; priv->regulator = NULL;
...@@ -691,7 +704,10 @@ static int lm3532_probe(struct i2c_client *client) ...@@ -691,7 +704,10 @@ static int lm3532_probe(struct i2c_client *client)
return ret; return ret;
} }
mutex_init(&drvdata->lock); ret = devm_mutex_init(&client->dev, &drvdata->lock);
if (ret)
return ret;
i2c_set_clientdata(client, drvdata); i2c_set_clientdata(client, drvdata);
ret = lm3532_parse_node(drvdata); ret = lm3532_parse_node(drvdata);
...@@ -703,16 +719,6 @@ static int lm3532_probe(struct i2c_client *client) ...@@ -703,16 +719,6 @@ static int lm3532_probe(struct i2c_client *client)
return ret; return ret;
} }
static void lm3532_remove(struct i2c_client *client)
{
struct lm3532_data *drvdata = i2c_get_clientdata(client);
mutex_destroy(&drvdata->lock);
if (drvdata->enable_gpio)
gpiod_direction_output(drvdata->enable_gpio, 0);
}
static const struct of_device_id of_lm3532_leds_match[] = { static const struct of_device_id of_lm3532_leds_match[] = {
{ .compatible = "ti,lm3532", }, { .compatible = "ti,lm3532", },
{}, {},
...@@ -727,7 +733,6 @@ MODULE_DEVICE_TABLE(i2c, lm3532_id); ...@@ -727,7 +733,6 @@ MODULE_DEVICE_TABLE(i2c, lm3532_id);
static struct i2c_driver lm3532_i2c_driver = { static struct i2c_driver lm3532_i2c_driver = {
.probe = lm3532_probe, .probe = lm3532_probe,
.remove = lm3532_remove,
.id_table = lm3532_id, .id_table = lm3532_id,
.driver = { .driver = {
.name = LM3532_NAME, .name = LM3532_NAME,
......
...@@ -207,6 +207,13 @@ static const struct regmap_config lp3952_regmap = { ...@@ -207,6 +207,13 @@ static const struct regmap_config lp3952_regmap = {
.cache_type = REGCACHE_MAPLE, .cache_type = REGCACHE_MAPLE,
}; };
static void gpio_set_low_action(void *data)
{
struct lp3952_led_array *priv = data;
gpiod_set_value(priv->enable_gpio, 0);
}
static int lp3952_probe(struct i2c_client *client) static int lp3952_probe(struct i2c_client *client)
{ {
int status; int status;
...@@ -226,6 +233,10 @@ static int lp3952_probe(struct i2c_client *client) ...@@ -226,6 +233,10 @@ static int lp3952_probe(struct i2c_client *client)
return status; return status;
} }
status = devm_add_action(&client->dev, gpio_set_low_action, priv);
if (status)
return status;
priv->regmap = devm_regmap_init_i2c(client, &lp3952_regmap); priv->regmap = devm_regmap_init_i2c(client, &lp3952_regmap);
if (IS_ERR(priv->regmap)) { if (IS_ERR(priv->regmap)) {
int err = PTR_ERR(priv->regmap); int err = PTR_ERR(priv->regmap);
...@@ -254,15 +265,6 @@ static int lp3952_probe(struct i2c_client *client) ...@@ -254,15 +265,6 @@ static int lp3952_probe(struct i2c_client *client)
return 0; return 0;
} }
static void lp3952_remove(struct i2c_client *client)
{
struct lp3952_led_array *priv;
priv = i2c_get_clientdata(client);
lp3952_on_off(priv, LP3952_LED_ALL, false);
gpiod_set_value(priv->enable_gpio, 0);
}
static const struct i2c_device_id lp3952_id[] = { static const struct i2c_device_id lp3952_id[] = {
{LP3952_NAME, 0}, {LP3952_NAME, 0},
{} {}
...@@ -274,7 +276,6 @@ static struct i2c_driver lp3952_i2c_driver = { ...@@ -274,7 +276,6 @@ static struct i2c_driver lp3952_i2c_driver = {
.name = LP3952_NAME, .name = LP3952_NAME,
}, },
.probe = lp3952_probe, .probe = lp3952_probe,
.remove = lp3952_remove,
.id_table = lp3952_id, .id_table = lp3952_id,
}; };
......
...@@ -256,6 +256,7 @@ static int mlxreg_led_probe(struct platform_device *pdev) ...@@ -256,6 +256,7 @@ static int mlxreg_led_probe(struct platform_device *pdev)
{ {
struct mlxreg_core_platform_data *led_pdata; struct mlxreg_core_platform_data *led_pdata;
struct mlxreg_led_priv_data *priv; struct mlxreg_led_priv_data *priv;
int err;
led_pdata = dev_get_platdata(&pdev->dev); led_pdata = dev_get_platdata(&pdev->dev);
if (!led_pdata) { if (!led_pdata) {
...@@ -267,26 +268,21 @@ static int mlxreg_led_probe(struct platform_device *pdev) ...@@ -267,26 +268,21 @@ static int mlxreg_led_probe(struct platform_device *pdev)
if (!priv) if (!priv)
return -ENOMEM; return -ENOMEM;
mutex_init(&priv->access_lock); err = devm_mutex_init(&pdev->dev, &priv->access_lock);
if (err)
return err;
priv->pdev = pdev; priv->pdev = pdev;
priv->pdata = led_pdata; priv->pdata = led_pdata;
return mlxreg_led_config(priv); return mlxreg_led_config(priv);
} }
static void mlxreg_led_remove(struct platform_device *pdev)
{
struct mlxreg_led_priv_data *priv = dev_get_drvdata(&pdev->dev);
mutex_destroy(&priv->access_lock);
}
static struct platform_driver mlxreg_led_driver = { static struct platform_driver mlxreg_led_driver = {
.driver = { .driver = {
.name = "leds-mlxreg", .name = "leds-mlxreg",
}, },
.probe = mlxreg_led_probe, .probe = mlxreg_led_probe,
.remove_new = mlxreg_led_remove,
}; };
module_platform_driver(mlxreg_led_driver); module_platform_driver(mlxreg_led_driver);
......
...@@ -118,6 +118,15 @@ static struct nic78bx_led nic78bx_leds[] = { ...@@ -118,6 +118,15 @@ static struct nic78bx_led nic78bx_leds[] = {
} }
}; };
static void lock_led_reg_action(void *data)
{
struct nic78bx_led_data *led_data = data;
/* Lock LED register */
outb(NIC78BX_LOCK_VALUE,
led_data->io_base + NIC78BX_LOCK_REG_OFFSET);
}
static int nic78bx_probe(struct platform_device *pdev) static int nic78bx_probe(struct platform_device *pdev)
{ {
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
...@@ -152,6 +161,10 @@ static int nic78bx_probe(struct platform_device *pdev) ...@@ -152,6 +161,10 @@ static int nic78bx_probe(struct platform_device *pdev)
led_data->io_base = io_rc->start; led_data->io_base = io_rc->start;
spin_lock_init(&led_data->lock); spin_lock_init(&led_data->lock);
ret = devm_add_action(dev, lock_led_reg_action, led_data);
if (ret)
return ret;
for (i = 0; i < ARRAY_SIZE(nic78bx_leds); i++) { for (i = 0; i < ARRAY_SIZE(nic78bx_leds); i++) {
nic78bx_leds[i].data = led_data; nic78bx_leds[i].data = led_data;
...@@ -167,15 +180,6 @@ static int nic78bx_probe(struct platform_device *pdev) ...@@ -167,15 +180,6 @@ static int nic78bx_probe(struct platform_device *pdev)
return ret; return ret;
} }
static void nic78bx_remove(struct platform_device *pdev)
{
struct nic78bx_led_data *led_data = platform_get_drvdata(pdev);
/* Lock LED register */
outb(NIC78BX_LOCK_VALUE,
led_data->io_base + NIC78BX_LOCK_REG_OFFSET);
}
static const struct acpi_device_id led_device_ids[] = { static const struct acpi_device_id led_device_ids[] = {
{"NIC78B3", 0}, {"NIC78B3", 0},
{"", 0}, {"", 0},
...@@ -184,7 +188,6 @@ MODULE_DEVICE_TABLE(acpi, led_device_ids); ...@@ -184,7 +188,6 @@ MODULE_DEVICE_TABLE(acpi, led_device_ids);
static struct platform_driver led_driver = { static struct platform_driver led_driver = {
.probe = nic78bx_probe, .probe = nic78bx_probe,
.remove_new = nic78bx_remove,
.driver = { .driver = {
.name = KBUILD_MODNAME, .name = KBUILD_MODNAME,
.acpi_match_table = ACPI_PTR(led_device_ids), .acpi_match_table = ACPI_PTR(led_device_ids),
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include <linux/cleanup.h> #include <linux/cleanup.h>
#include <linux/mutex_types.h> #include <linux/mutex_types.h>
struct device;
#ifdef CONFIG_DEBUG_LOCK_ALLOC #ifdef CONFIG_DEBUG_LOCK_ALLOC
# define __DEP_MAP_MUTEX_INITIALIZER(lockname) \ # define __DEP_MAP_MUTEX_INITIALIZER(lockname) \
, .dep_map = { \ , .dep_map = { \
...@@ -117,6 +119,31 @@ do { \ ...@@ -117,6 +119,31 @@ do { \
} while (0) } while (0)
#endif /* CONFIG_PREEMPT_RT */ #endif /* CONFIG_PREEMPT_RT */
#ifdef CONFIG_DEBUG_MUTEXES
int __devm_mutex_init(struct device *dev, struct mutex *lock);
#else
static inline int __devm_mutex_init(struct device *dev, struct mutex *lock)
{
/*
* When CONFIG_DEBUG_MUTEXES is off mutex_destroy() is just a nop so
* no really need to register it in the devm subsystem.
*/
return 0;
}
#endif
#define devm_mutex_init(dev, mutex) \
({ \
typeof(mutex) mutex_ = (mutex); \
\
mutex_init(mutex_); \
__devm_mutex_init(dev, mutex_); \
})
/* /*
* See kernel/locking/mutex.c for detailed documentation of these APIs. * See kernel/locking/mutex.c for detailed documentation of these APIs.
* Also see Documentation/locking/mutex-design.rst. * Also see Documentation/locking/mutex-design.rst.
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
*/ */
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/device.h>
#include <linux/export.h> #include <linux/export.h>
#include <linux/poison.h> #include <linux/poison.h>
#include <linux/sched.h> #include <linux/sched.h>
...@@ -89,6 +90,17 @@ void debug_mutex_init(struct mutex *lock, const char *name, ...@@ -89,6 +90,17 @@ void debug_mutex_init(struct mutex *lock, const char *name,
lock->magic = lock; lock->magic = lock;
} }
static void devm_mutex_release(void *res)
{
mutex_destroy(res);
}
int __devm_mutex_init(struct device *dev, struct mutex *lock)
{
return devm_add_action_or_reset(dev, devm_mutex_release, lock);
}
EXPORT_SYMBOL_GPL(__devm_mutex_init);
/*** /***
* mutex_destroy - mark a mutex unusable * mutex_destroy - mark a mutex unusable
* @lock: the mutex to be destroyed * @lock: the mutex to be destroyed
......
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