mfd: ti-lmu: switch to gpiod
PATCH 1/3 mfd: ti-lmu: switch to gpiod
Use new descriptor based API instead of the legacy one.
drivers/mfd/ti-lmu.c +12 -16
@@ -12,7 +12,7 @@#include <linux/delay.h> #include <linux/err.h> -#include <linux/gpio.h> +#include <linux/gpio/consumer.h> #include <linux/i2c.h> #include <linux/kernel.h> #include <linux/mfd/core.h>
@@ -21,7 +21,6 @@#include <linux/module.h> #include <linux/of.h> #include <linux/of_device.h> -#include <linux/of_gpio.h> #include <linux/slab.h> struct ti_lmu_data {
@@ -32,17 +31,8 @@ struct ti_lmu_data {static int ti_lmu_enable_hw (struct ti_lmu *lmu,enum ti_lmu_id id) { -int ret; - -if (gpio_is_valid (lmu->en_gpio)) { - ret =devm_gpio_request_one (lmu->dev, lmu->en_gpio, -GPIOF_OUT_INIT_HIGH ,"lmu_hwen" ); -if (ret) { -dev_err (lmu->dev,"Can not request enable GPIO: %d\n" , - ret); -return ret; - } - } +if (lmu->en_gpio) +gpiod_set_value (lmu->en_gpio,1 );/* Delay about 1ms after HW enable pin control */ usleep_range (1000 ,1500 );
@@ -59,8 +49,8 @@ static int ti_lmu_enable_hw(struct ti_lmu *lmu, enum ti_lmu_id id)static void ti_lmu_disable_hw (struct ti_lmu *lmu) { -if (gpio_is_valid (lmu->en_gpio)) -gpio_set_value (lmu->en_gpio,0 ); +if (lmu->en_gpio) +gpiod_set_value (lmu->en_gpio,0 ); }static const struct mfd_cell lm3532_devices[] = {
@@ -204,7 +194,13 @@ static int ti_lmu_probe(struct i2c_client *cl, const struct i2c_device_id *id)return PTR_ERR (lmu->regmap);/* HW enable pin control and additional power up sequence if required */ - lmu->en_gpio =of_get_named_gpio (dev->of_node,"enable-gpios" ,0 ); + lmu->en_gpio =devm_gpiod_get_optional (dev,"enable" ,GPIOD_OUT_HIGH ); +if (IS_ERR (lmu->en_gpio)) { + ret =PTR_ERR (lmu->en_gpio); +dev_err (dev,"Can not request enable GPIO: %d\n" , ret); +return ret; + } + ret =ti_lmu_enable_hw (lmu, id->driver_data);if (ret)return ret;
include/linux/mfd/ti-lmu.h +2 -1
@@ -16,6 +16,7 @@#include <linux/gpio.h> #include <linux/notifier.h> #include <linux/regmap.h> +#include <linux/gpio/consumer.h> /* Notifier event */ #define LMU_EVENT_MONITOR_DONE 0x01
@@ -81,7 +82,7 @@ enum lm363x_regulator_id {struct ti_lmu {struct device *dev;struct regmap *regmap; -int en_gpio; +struct gpio_desc *en_gpio;struct blocking_notifier_head notifier; };#endif
Signature · 9 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 181 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20180911/22c2b6f5/attachment.sig>
PATCH 2/3 mfd: ti-lmu: use managed resource for everything
This replaces all remaining unmanaged resources with device managed ones, so that the remove function is no longer needed. This makes the code slightly shorter and fixes two problems:
1. The hardware is disabled after the child devices have been removed. Previously there was a potential race condition.
2. The hardware is disabled when mfd_add_devices fails during probe.
drivers/mfd/ti-lmu.c +8 -13
@@ -47,8 +47,9 @@ static int ti_lmu_enable_hw(struct ti_lmu *lmu, enum ti_lmu_id id)return 0 ; } -static void ti_lmu_disable_hw (struct ti_lmu *lmu) +static void ti_lmu_disable_hw (void *data) { +struct ti_lmu *lmu = data;if (lmu->en_gpio)gpiod_set_value (lmu->en_gpio,0 ); }
@@ -205,6 +206,10 @@ static int ti_lmu_probe(struct i2c_client *cl, const struct i2c_device_id *id)if (ret)return ret; + ret =devm_add_action_or_reset (dev, ti_lmu_disable_hw, lmu); +if (ret) +return ret; +/* * Fault circuit(open/short) can be detected by ti-lmu-fault-monitor. * After fault detection is done, some devices should re-initialize
@@ -214,17 +219,8 @@ static int ti_lmu_probe(struct i2c_client *cl, const struct i2c_device_id *id)i2c_set_clientdata (cl, lmu); -return mfd_add_devices (lmu->dev,0 , data->cells, - data->num_cells,NULL ,0 ,NULL ); -} - -static int ti_lmu_remove (struct i2c_client *cl) -{ -struct ti_lmu *lmu =i2c_get_clientdata (cl); - -ti_lmu_disable_hw (lmu); -mfd_remove_devices (lmu->dev); -return 0 ; +return devm_mfd_add_devices (lmu->dev,0 , data->cells, + data->num_cells,NULL ,0 ,NULL ); }static const struct i2c_device_id ti_lmu_ids[] = {
@@ -240,7 +236,6 @@ MODULE_DEVICE_TABLE(i2c, ti_lmu_ids);static struct i2c_driver ti_lmu_driver = { .probe = ti_lmu_probe, - .remove = ti_lmu_remove, .driver = { .name ="ti-lmu" , .of_match_table = ti_lmu_of_match,
Signature · 9 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 181 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20180911/46051cfa/attachment-0001.sig>
PATCH 3/3 mfd: ti-lmu: use of_device_get_match_data() helper
Replace of_match_device() with of_device_get_match_data(), which slightly decreases lines of code and allows to move the DT table next to the I2C table.
drivers/mfd/ti-lmu.c +14 -16
@@ -142,34 +142,21 @@ TI_LMU_DATA(lm3633, LM3633_MAX_REG);TI_LMU_DATA (lm3695,LM3695_MAX_REG );TI_LMU_DATA (lm3697,LM3697_MAX_REG ); -static const struct of_device_id ti_lmu_of_match[] = { - { .compatible ="ti,lm3532" , .data = &lm3532_data }, - { .compatible ="ti,lm3631" , .data = &lm3631_data }, - { .compatible ="ti,lm3632" , .data = &lm3632_data }, - { .compatible ="ti,lm3633" , .data = &lm3633_data }, - { .compatible ="ti,lm3695" , .data = &lm3695_data }, - { .compatible ="ti,lm3697" , .data = &lm3697_data }, - { } -}; -MODULE_DEVICE_TABLE (of, ti_lmu_of_match); -static int ti_lmu_probe (struct i2c_client *cl,const struct i2c_device_id *id) {struct device *dev = &cl->dev; -const struct of_device_id *match;const struct ti_lmu_data *data;struct regmap_config regmap_cfg;struct ti_lmu *lmu;int ret; - match =of_match_device (ti_lmu_of_match, dev); -if (!match) -return -ENODEV ;/* * Get device specific data from of_match table. * This data is defined by using TI_LMU_DATA() macro. */ - data = (struct ti_lmu_data *)match->data; + data =of_device_get_match_data (dev); +if (!data) +return -ENODEV ; lmu =devm_kzalloc (dev,sizeof (*lmu),GFP_KERNEL );if (!lmu)
@@ -217,6 +204,17 @@ static int ti_lmu_probe(struct i2c_client *cl, const struct i2c_device_id *id) data->num_cells, NULL, 0, NULL); } +static const struct of_device_id ti_lmu_of_match[] = { + { .compatible ="ti,lm3532" , .data = &lm3532_data }, + { .compatible ="ti,lm3631" , .data = &lm3631_data }, + { .compatible ="ti,lm3632" , .data = &lm3632_data }, + { .compatible ="ti,lm3633" , .data = &lm3633_data }, + { .compatible ="ti,lm3695" , .data = &lm3695_data }, + { .compatible ="ti,lm3697" , .data = &lm3697_data }, + { } +}; +MODULE_DEVICE_TABLE (of, ti_lmu_of_match); +static const struct i2c_device_id ti_lmu_ids[] = { {"lm3532" ,LM3532 }, {"lm3631" ,LM3631 },
Signature · 9 lines
(english) http://www.livejournal.com/~pavelmachek (cesky, pictures) http://atrey.karlin.mff.cuni.cz/~pavel/picture/horses/blog.html -------------- next part -------------- A non-text attachment was scrubbed... Name: signature.asc Type: application/pgp-signature Size: 181 bytes Desc: Digital signature URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20180911/a58e887f/attachment.sig>
Lee Jones
AppliedRe: [PATCH 3/3] mfd: ti-lmu: use of_device_get_match_data() helper
Quoted 6 lines · Pavel Machek
Replace
of_match_device()withof_device_get_match_data(), which slightly decreases lines of code and allows to move the DT table next to the I2C table.Signed-off-by Sebastian Reichel <[email protected]>Signed-off-by Pavel Machek <[email protected]>
Not sure how you're sending these patches, but for future reference git send-email is usually preferred.
Applied, thanks.
Signature · 4 lines
Lee Jones [???] Linaro Services Technical Lead Linaro.org ? Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog
Lee Jones
AppliedRe: [PATCH 2/3] mfd: ti-lmu: use managed resource for everything
In reply to Pavel MachekQuoted 4 lines · Pavel Machek
This replaces all remaining unmanaged resources with device managed ones, so that the remove function is no longer needed. This makes the code slightly shorter and fixes two problems:
Quoted 8 lines
1. The hardware is disabled after the child devices have been removed. Previously there was a potential race condition.
2. The hardware is disabled whenmfd_add_devicesfails during probe.Signed-off-by Sebastian Reichel <[email protected]>Signed-off-by Pavel Machek <[email protected]>
Applied, thanks.
Signature · 4 lines
Lee Jones [???] Linaro Services Technical Lead Linaro.org ? Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog
Lee Jones
AppliedQuoted 4 lines · Pavel Machek
Use new descriptor based API instead of the legacy one.
Signed-off-by Sebastian Reichel <[email protected]>Signed-off-by Pavel Machek <[email protected]>
Applied, thanks.
Signature · 4 lines
Lee Jones [???] Linaro Services Technical Lead Linaro.org ? Open source software for ARM SoCs Follow Linaro: Facebook | Twitter | Blog