mirror of
https://gitee.com/openharmony/kernel_linux
synced 2025-04-16 06:10:42 +00:00
leds: pca9532: Extend pca9532 device tree support
This patch extends the device tree support for the pca9532 by adding the leds 'default-state' property. Signed-off-by: Felix Brack <fb@ltec.ch> Signed-off-by: Jacek Anaszewski <jacek.anaszewski@gmail.com>
This commit is contained in:
parent
cd3b0b0532
commit
28c5fe9901
@ -17,6 +17,8 @@ Optional sub-node properties:
|
|||||||
- label: see Documentation/devicetree/bindings/leds/common.txt
|
- label: see Documentation/devicetree/bindings/leds/common.txt
|
||||||
- type: Output configuration, see dt-bindings/leds/leds-pca9532.h (default NONE)
|
- type: Output configuration, see dt-bindings/leds/leds-pca9532.h (default NONE)
|
||||||
- linux,default-trigger: see Documentation/devicetree/bindings/leds/common.txt
|
- linux,default-trigger: see Documentation/devicetree/bindings/leds/common.txt
|
||||||
|
- default-state: see Documentation/devicetree/bindings/leds/common.txt
|
||||||
|
This property is only valid for sub-nodes of type <PCA9532_TYPE_LED>.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
#include <dt-bindings/leds/leds-pca9532.h>
|
#include <dt-bindings/leds/leds-pca9532.h>
|
||||||
@ -33,6 +35,14 @@ Example:
|
|||||||
label = "pca:green:power";
|
label = "pca:green:power";
|
||||||
type = <PCA9532_TYPE_LED>;
|
type = <PCA9532_TYPE_LED>;
|
||||||
};
|
};
|
||||||
|
kernel-booting {
|
||||||
|
type = <PCA9532_TYPE_LED>;
|
||||||
|
default-state = "on";
|
||||||
|
};
|
||||||
|
sys-stat {
|
||||||
|
type = <PCA9532_TYPE_LED>;
|
||||||
|
default-state = "keep"; // don't touch, was set by U-Boot
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
For more product information please see the link below:
|
For more product information please see the link below:
|
||||||
|
@ -254,6 +254,21 @@ static void pca9532_input_work(struct work_struct *work)
|
|||||||
mutex_unlock(&data->update_lock);
|
mutex_unlock(&data->update_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static enum pca9532_state pca9532_getled(struct pca9532_led *led)
|
||||||
|
{
|
||||||
|
struct i2c_client *client = led->client;
|
||||||
|
struct pca9532_data *data = i2c_get_clientdata(client);
|
||||||
|
u8 maxleds = data->chip_info->num_leds;
|
||||||
|
char reg;
|
||||||
|
enum pca9532_state ret;
|
||||||
|
|
||||||
|
mutex_lock(&data->update_lock);
|
||||||
|
reg = i2c_smbus_read_byte_data(client, LED_REG(maxleds, led->id));
|
||||||
|
ret = reg >> LED_NUM(led->id)/2;
|
||||||
|
mutex_unlock(&data->update_lock);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_LEDS_PCA9532_GPIO
|
#ifdef CONFIG_LEDS_PCA9532_GPIO
|
||||||
static int pca9532_gpio_request_pin(struct gpio_chip *gc, unsigned offset)
|
static int pca9532_gpio_request_pin(struct gpio_chip *gc, unsigned offset)
|
||||||
{
|
{
|
||||||
@ -366,6 +381,9 @@ static int pca9532_configure(struct i2c_client *client,
|
|||||||
gpios++;
|
gpios++;
|
||||||
break;
|
break;
|
||||||
case PCA9532_TYPE_LED:
|
case PCA9532_TYPE_LED:
|
||||||
|
if (pled->state == PCA9532_KEEP)
|
||||||
|
led->state = pca9532_getled(led);
|
||||||
|
else
|
||||||
led->state = pled->state;
|
led->state = pled->state;
|
||||||
led->name = pled->name;
|
led->name = pled->name;
|
||||||
led->ldev.name = led->name;
|
led->ldev.name = led->name;
|
||||||
@ -456,6 +474,7 @@ pca9532_of_populate_pdata(struct device *dev, struct device_node *np)
|
|||||||
const struct of_device_id *match;
|
const struct of_device_id *match;
|
||||||
int devid, maxleds;
|
int devid, maxleds;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
const char *state;
|
||||||
|
|
||||||
match = of_match_device(of_pca9532_leds_match, dev);
|
match = of_match_device(of_pca9532_leds_match, dev);
|
||||||
if (!match)
|
if (!match)
|
||||||
@ -475,6 +494,12 @@ pca9532_of_populate_pdata(struct device *dev, struct device_node *np)
|
|||||||
of_property_read_u32(child, "type", &pdata->leds[i].type);
|
of_property_read_u32(child, "type", &pdata->leds[i].type);
|
||||||
of_property_read_string(child, "linux,default-trigger",
|
of_property_read_string(child, "linux,default-trigger",
|
||||||
&pdata->leds[i].default_trigger);
|
&pdata->leds[i].default_trigger);
|
||||||
|
if (!of_property_read_string(child, "default-state", &state)) {
|
||||||
|
if (!strcmp(state, "on"))
|
||||||
|
pdata->leds[i].state = PCA9532_ON;
|
||||||
|
else if (!strcmp(state, "keep"))
|
||||||
|
pdata->leds[i].state = PCA9532_KEEP;
|
||||||
|
}
|
||||||
if (++i >= maxleds) {
|
if (++i >= maxleds) {
|
||||||
of_node_put(child);
|
of_node_put(child);
|
||||||
break;
|
break;
|
||||||
|
@ -22,7 +22,8 @@ enum pca9532_state {
|
|||||||
PCA9532_OFF = 0x0,
|
PCA9532_OFF = 0x0,
|
||||||
PCA9532_ON = 0x1,
|
PCA9532_ON = 0x1,
|
||||||
PCA9532_PWM0 = 0x2,
|
PCA9532_PWM0 = 0x2,
|
||||||
PCA9532_PWM1 = 0x3
|
PCA9532_PWM1 = 0x3,
|
||||||
|
PCA9532_KEEP = 0xff,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct pca9532_led {
|
struct pca9532_led {
|
||||||
@ -44,4 +45,3 @@ struct pca9532_platform_data {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#endif /* __LINUX_PCA9532_H */
|
#endif /* __LINUX_PCA9532_H */
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user