mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-22 20:23:57 +08:00
leds: netxbig: convert to use the devm_ functions
This patch converts the leds-netxbig driver to use the devres functions devm_gpio_request_one() and devm_led_classdev_register(). This allows to simplify the code a bit. Signed-off-by: Simon Guinot <simon.guinot@sequanux.org> Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
This commit is contained in:
parent
ebc278f157
commit
cd0109555b
@ -71,7 +71,8 @@ static void gpio_ext_set_value(struct netxbig_gpio_ext *gpio_ext,
|
|||||||
spin_unlock_irqrestore(&gpio_ext_lock, flags);
|
spin_unlock_irqrestore(&gpio_ext_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int gpio_ext_init(struct netxbig_gpio_ext *gpio_ext)
|
static int gpio_ext_init(struct platform_device *pdev,
|
||||||
|
struct netxbig_gpio_ext *gpio_ext)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
int i;
|
int i;
|
||||||
@ -81,46 +82,28 @@ static int gpio_ext_init(struct netxbig_gpio_ext *gpio_ext)
|
|||||||
|
|
||||||
/* Configure address GPIOs. */
|
/* Configure address GPIOs. */
|
||||||
for (i = 0; i < gpio_ext->num_addr; i++) {
|
for (i = 0; i < gpio_ext->num_addr; i++) {
|
||||||
err = gpio_request_one(gpio_ext->addr[i], GPIOF_OUT_INIT_LOW,
|
err = devm_gpio_request_one(&pdev->dev, gpio_ext->addr[i],
|
||||||
"GPIO extension addr");
|
GPIOF_OUT_INIT_LOW,
|
||||||
|
"GPIO extension addr");
|
||||||
if (err)
|
if (err)
|
||||||
goto err_free_addr;
|
return err;
|
||||||
}
|
}
|
||||||
/* Configure data GPIOs. */
|
/* Configure data GPIOs. */
|
||||||
for (i = 0; i < gpio_ext->num_data; i++) {
|
for (i = 0; i < gpio_ext->num_data; i++) {
|
||||||
err = gpio_request_one(gpio_ext->data[i], GPIOF_OUT_INIT_LOW,
|
err = devm_gpio_request_one(&pdev->dev, gpio_ext->data[i],
|
||||||
"GPIO extension data");
|
GPIOF_OUT_INIT_LOW,
|
||||||
|
"GPIO extension data");
|
||||||
if (err)
|
if (err)
|
||||||
goto err_free_data;
|
return err;
|
||||||
}
|
}
|
||||||
/* Configure "enable select" GPIO. */
|
/* Configure "enable select" GPIO. */
|
||||||
err = gpio_request_one(gpio_ext->enable, GPIOF_OUT_INIT_LOW,
|
err = devm_gpio_request_one(&pdev->dev, gpio_ext->enable,
|
||||||
"GPIO extension enable");
|
GPIOF_OUT_INIT_LOW,
|
||||||
|
"GPIO extension enable");
|
||||||
if (err)
|
if (err)
|
||||||
goto err_free_data;
|
return err;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err_free_data:
|
|
||||||
for (i = i - 1; i >= 0; i--)
|
|
||||||
gpio_free(gpio_ext->data[i]);
|
|
||||||
i = gpio_ext->num_addr;
|
|
||||||
err_free_addr:
|
|
||||||
for (i = i - 1; i >= 0; i--)
|
|
||||||
gpio_free(gpio_ext->addr[i]);
|
|
||||||
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void gpio_ext_free(struct netxbig_gpio_ext *gpio_ext)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
gpio_free(gpio_ext->enable);
|
|
||||||
for (i = gpio_ext->num_addr - 1; i >= 0; i--)
|
|
||||||
gpio_free(gpio_ext->addr[i]);
|
|
||||||
for (i = gpio_ext->num_data - 1; i >= 0; i--)
|
|
||||||
gpio_free(gpio_ext->data[i]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -141,11 +124,6 @@ struct netxbig_led_data {
|
|||||||
spinlock_t lock;
|
spinlock_t lock;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct netxbig_led_priv {
|
|
||||||
struct netxbig_led_platform_data *pdata;
|
|
||||||
struct netxbig_led_data leds_data[];
|
|
||||||
};
|
|
||||||
|
|
||||||
static int netxbig_led_get_timer_mode(enum netxbig_led_mode *mode,
|
static int netxbig_led_get_timer_mode(enum netxbig_led_mode *mode,
|
||||||
unsigned long delay_on,
|
unsigned long delay_on,
|
||||||
unsigned long delay_off,
|
unsigned long delay_off,
|
||||||
@ -305,18 +283,11 @@ static struct attribute *netxbig_led_attrs[] = {
|
|||||||
};
|
};
|
||||||
ATTRIBUTE_GROUPS(netxbig_led);
|
ATTRIBUTE_GROUPS(netxbig_led);
|
||||||
|
|
||||||
static void delete_netxbig_led(struct netxbig_led_data *led_dat)
|
static int create_netxbig_led(struct platform_device *pdev,
|
||||||
|
struct netxbig_led_platform_data *pdata,
|
||||||
|
struct netxbig_led_data *led_dat,
|
||||||
|
const struct netxbig_led *template)
|
||||||
{
|
{
|
||||||
led_classdev_unregister(&led_dat->cdev);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int create_netxbig_led(struct platform_device *pdev, int led,
|
|
||||||
struct netxbig_led_priv *priv)
|
|
||||||
{
|
|
||||||
struct netxbig_led_platform_data *pdata = priv->pdata;
|
|
||||||
struct netxbig_led_data *led_dat = &priv->leds_data[led];
|
|
||||||
const struct netxbig_led *template = &priv->pdata->leds[led];
|
|
||||||
|
|
||||||
spin_lock_init(&led_dat->lock);
|
spin_lock_init(&led_dat->lock);
|
||||||
led_dat->gpio_ext = pdata->gpio_ext;
|
led_dat->gpio_ext = pdata->gpio_ext;
|
||||||
led_dat->cdev.name = template->name;
|
led_dat->cdev.name = template->name;
|
||||||
@ -349,7 +320,7 @@ static int create_netxbig_led(struct platform_device *pdev, int led,
|
|||||||
if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE)
|
if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE)
|
||||||
led_dat->cdev.groups = netxbig_led_groups;
|
led_dat->cdev.groups = netxbig_led_groups;
|
||||||
|
|
||||||
return led_classdev_register(&pdev->dev, &led_dat->cdev);
|
return devm_led_classdev_register(&pdev->dev, &led_dat->cdev);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_OF_GPIO
|
#ifdef CONFIG_OF_GPIO
|
||||||
@ -579,7 +550,7 @@ netxbig_leds_get_of_pdata(struct device *dev,
|
|||||||
static int netxbig_led_probe(struct platform_device *pdev)
|
static int netxbig_led_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct netxbig_led_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
struct netxbig_led_platform_data *pdata = dev_get_platdata(&pdev->dev);
|
||||||
struct netxbig_led_priv *priv;
|
struct netxbig_led_data *leds_data;
|
||||||
int i;
|
int i;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -592,51 +563,28 @@ static int netxbig_led_probe(struct platform_device *pdev)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv = devm_kzalloc(&pdev->dev, sizeof(*priv) +
|
leds_data = devm_kzalloc(&pdev->dev,
|
||||||
pdata->num_leds * sizeof(struct netxbig_led_data),
|
pdata->num_leds * sizeof(*leds_data),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!priv)
|
if (!leds_data)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
priv->pdata = pdata;
|
|
||||||
|
|
||||||
ret = gpio_ext_init(pdata->gpio_ext);
|
ret = gpio_ext_init(pdev, pdata->gpio_ext);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
for (i = 0; i < pdata->num_leds; i++) {
|
for (i = 0; i < pdata->num_leds; i++) {
|
||||||
ret = create_netxbig_led(pdev, i, priv);
|
ret = create_netxbig_led(pdev, pdata,
|
||||||
|
&leds_data[i], &pdata->leds[i]);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto err_free_leds;
|
return ret;
|
||||||
}
|
}
|
||||||
platform_set_drvdata(pdev, priv);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
err_free_leds:
|
|
||||||
for (i = i - 1; i >= 0; i--)
|
|
||||||
delete_netxbig_led(&priv->leds_data[i]);
|
|
||||||
|
|
||||||
gpio_ext_free(pdata->gpio_ext);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int netxbig_led_remove(struct platform_device *pdev)
|
|
||||||
{
|
|
||||||
struct netxbig_led_priv *priv = platform_get_drvdata(pdev);
|
|
||||||
struct netxbig_led_platform_data *pdata = priv->pdata;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < pdata->num_leds; i++)
|
|
||||||
delete_netxbig_led(&priv->leds_data[i]);
|
|
||||||
|
|
||||||
gpio_ext_free(pdata->gpio_ext);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct platform_driver netxbig_led_driver = {
|
static struct platform_driver netxbig_led_driver = {
|
||||||
.probe = netxbig_led_probe,
|
.probe = netxbig_led_probe,
|
||||||
.remove = netxbig_led_remove,
|
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "leds-netxbig",
|
.name = "leds-netxbig",
|
||||||
.of_match_table = of_match_ptr(of_netxbig_leds_match),
|
.of_match_table = of_match_ptr(of_netxbig_leds_match),
|
||||||
|
Loading…
Reference in New Issue
Block a user