khadas: drivers/leds
- squashed, scripts/packaging/etc removed, grouped by directory
- source
- https://github.com/khadas/linux/commits/khadas-edges-5.10.y
- 85a8b25939
This commit is contained in:
parent
d5c5392ffd
commit
1b54ee2f63
1 changed files with 38 additions and 2 deletions
|
|
@ -79,6 +79,25 @@ static int create_gpio_led(const struct gpio_led *template,
|
||||||
struct led_init_data init_data = {};
|
struct led_init_data init_data = {};
|
||||||
int ret, state;
|
int ret, state;
|
||||||
|
|
||||||
|
led_dat->gpiod = template->gpiod;
|
||||||
|
if (!led_dat->gpiod) {
|
||||||
|
unsigned long flags = GPIOF_OUT_INIT_LOW;
|
||||||
|
if (!gpio_is_valid(template->gpio)) {
|
||||||
|
dev_info(parent, "Skipping unavailable LED gpio %d (%s)\n",
|
||||||
|
template->gpio, template->name);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (template->active_low)
|
||||||
|
flags |= GPIOF_ACTIVE_LOW;
|
||||||
|
ret = devm_gpio_request_one(parent, template->gpio, flags,
|
||||||
|
template->name);
|
||||||
|
if (ret < 0)
|
||||||
|
return ret;
|
||||||
|
led_dat->gpiod = gpio_to_desc(template->gpio);
|
||||||
|
if (!led_dat->gpiod)
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
led_dat->cdev.name = template->name;
|
||||||
led_dat->cdev.default_trigger = template->default_trigger;
|
led_dat->cdev.default_trigger = template->default_trigger;
|
||||||
led_dat->can_sleep = gpiod_cansleep(led_dat->gpiod);
|
led_dat->can_sleep = gpiod_cansleep(led_dat->gpiod);
|
||||||
if (!led_dat->can_sleep)
|
if (!led_dat->can_sleep)
|
||||||
|
|
@ -127,6 +146,12 @@ struct gpio_leds_priv {
|
||||||
struct gpio_led_data leds[];
|
struct gpio_led_data leds[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static inline int sizeof_gpio_leds_priv(int num_leds)
|
||||||
|
{
|
||||||
|
return sizeof(struct gpio_leds_priv) +
|
||||||
|
(sizeof(struct gpio_led_data) * num_leds);
|
||||||
|
}
|
||||||
|
|
||||||
static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
|
static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct device *dev = &pdev->dev;
|
struct device *dev = &pdev->dev;
|
||||||
|
|
@ -146,19 +171,30 @@ static struct gpio_leds_priv *gpio_leds_create(struct platform_device *pdev)
|
||||||
struct gpio_led_data *led_dat = &priv->leds[priv->num_leds];
|
struct gpio_led_data *led_dat = &priv->leds[priv->num_leds];
|
||||||
struct gpio_led led = {};
|
struct gpio_led led = {};
|
||||||
|
|
||||||
|
struct device_node *np = to_of_node(child);
|
||||||
|
ret = fwnode_property_read_string(child, "label", &led.name);
|
||||||
|
if (ret && IS_ENABLED(CONFIG_OF) && np)
|
||||||
|
led.name = np->name;
|
||||||
|
if (!led.name) {
|
||||||
|
fwnode_handle_put(child);
|
||||||
|
return ERR_PTR(-EINVAL);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Acquire gpiod from DT with uninitialized label, which
|
* Acquire gpiod from DT with uninitialized label, which
|
||||||
* will be updated after LED class device is registered,
|
* will be updated after LED class device is registered,
|
||||||
* Only then the final LED name is known.
|
* Only then the final LED name is known.
|
||||||
*/
|
*/
|
||||||
led.gpiod = devm_fwnode_get_gpiod_from_child(dev, NULL, child,
|
led.gpiod = devm_fwnode_get_gpiod_from_child(dev, NULL, child,
|
||||||
GPIOD_ASIS,
|
GPIOD_ASIS,led.name);
|
||||||
NULL);
|
|
||||||
if (IS_ERR(led.gpiod)) {
|
if (IS_ERR(led.gpiod)) {
|
||||||
fwnode_handle_put(child);
|
fwnode_handle_put(child);
|
||||||
return ERR_CAST(led.gpiod);
|
return ERR_CAST(led.gpiod);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fwnode_property_read_string(child, "linux,default-trigger",
|
||||||
|
&led.default_trigger);
|
||||||
|
|
||||||
led_dat->gpiod = led.gpiod;
|
led_dat->gpiod = led.gpiod;
|
||||||
|
|
||||||
led.default_state = led_init_default_state_get(child);
|
led.default_state = led_init_default_state_get(child);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue