Skip to contentSkip to conversation

LEDs: power_supply: Add ability to blink via simple trigger

RFC PATCH In review Vasily Khoruzhick 2 participants 6 messages Jan 7, 2011 – Jan 31, 2011

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

cover LEDs: power_supply: Add ability to blink via simple trigger

LEDs blinking API is now available, so it's possible to add ability to blink via simple trigger and add blinking support to power supply LEDs. It can be usefull if there's only one LED available, but you want to indicate if battery is charging or fully charged.

Anton, if it's possible, I'd like these patches to be merged via your battery-2.6 tree, because cross-tree dependencies is evil.

#1 lore raw

RFC PATCH 1/2 LEDs: Add ability to blink via simple trigger

As blink API is now available, it's possible to add ability to blink via simple trigger.

---
 drivers/leds/led-triggers.c |   20 ++++++++++++++++++++
 include/linux/leds.h        |    3 +++
 2 files changed, 23 insertions(+), 0 deletions(-)
drivers/leds/led-triggers.c +20 -0
index c41eb61..45f92ec 100644
@@ -231,6 +231,26 @@ void led_trigger_event(struct led_trigger *trigger,
 }
 EXPORT_SYMBOL_GPL(led_trigger_event);
 
+void led_trigger_blink(struct led_trigger *trigger,
+			unsigned long *delay_on,
+			unsigned long *delay_off)
+{
+	struct list_head *entry;
+
+	if (!trigger)
+		return;
+
+	read_lock(&trigger->leddev_list_lock);
+	list_for_each(entry, &trigger->led_cdevs) {
+		struct led_classdev *led_cdev;
+
+		led_cdev = list_entry(entry, struct led_classdev, trig_list);
+		led_blink_set(led_cdev, delay_on, delay_off);
+	}
+	read_unlock(&trigger->leddev_list_lock);
+}
+EXPORT_SYMBOL_GPL(led_trigger_blink);
+
 void led_trigger_register_simple(const char *name, struct led_trigger **tp)
 {
 	struct led_trigger *trigger;
include/linux/leds.h +3 -0
index 0f19df9..a1591e8 100644
@@ -145,6 +145,9 @@ extern void led_trigger_register_simple(const char *name,
 extern void led_trigger_unregister_simple(struct led_trigger *trigger);
 extern void led_trigger_event(struct led_trigger *trigger,
 				enum led_brightness event);
+extern void led_trigger_blink(struct led_trigger *trigger,
+			unsigned long *delay_on,
+			unsigned long *delay_off);
 
 #else
 
Signature · 1 line
1.7.3.2
#2 lore raw

RFC PATCH 2/2 power_supply: Add new LED trigger charging-blink-solid-full

In reply to Vasily Khoruzhick

Add new trigger to power_supply LEDs. It will blink when battery is charging, and stay solid when battery is charged. It's usefull to indicate battery state when there's only one LED available.

---
 drivers/power/power_supply_leds.c |   18 ++++++++++++++++++
 include/linux/power_supply.h      |    2 ++
 2 files changed, 20 insertions(+), 0 deletions(-)
drivers/power/power_supply_leds.c +18 -0
index 031a554..b640bbf 100644
@@ -21,6 +21,7 @@
 static void power_supply_update_bat_leds(struct power_supply *psy)
 {
 	union power_supply_propval status;
+	unsigned long delay_on = 0, delay_off = 0;
 
 	if (psy->get_property(psy, POWER_SUPPLY_PROP_STATUS, &status))
 		return;
@@ -32,16 +33,22 @@ static void power_supply_update_bat_leds(struct power_supply *psy)
 		led_trigger_event(psy->charging_full_trig, LED_FULL);
 		led_trigger_event(psy->charging_trig, LED_OFF);
 		led_trigger_event(psy->full_trig, LED_FULL);
+		led_trigger_event(psy->charging_blink_full_solid_trig,
+			LED_FULL);
 		break;
 	case POWER_SUPPLY_STATUS_CHARGING:
 		led_trigger_event(psy->charging_full_trig, LED_FULL);
 		led_trigger_event(psy->charging_trig, LED_FULL);
 		led_trigger_event(psy->full_trig, LED_OFF);
+		led_trigger_blink(psy->charging_blink_full_solid_trig,
+			&delay_on, &delay_off);
 		break;
 	default:
 		led_trigger_event(psy->charging_full_trig, LED_OFF);
 		led_trigger_event(psy->charging_trig, LED_OFF);
 		led_trigger_event(psy->full_trig, LED_OFF);
+		led_trigger_event(psy->charging_blink_full_solid_trig,
+			LED_OFF);
 		break;
 	}
 }
@@ -64,15 +71,24 @@ static int power_supply_create_bat_triggers(struct power_supply *psy)
 	if (!psy->full_trig_name)
 		goto full_failed;
 
+	psy->charging_blink_full_solid_trig_name = kasprintf(GFP_KERNEL,
+		"%s-charging-blink-full-solid", psy->name);
+	if (!psy->charging_blink_full_solid_trig_name)
+		goto charging_blink_full_solid_failed;
+
 	led_trigger_register_simple(psy->charging_full_trig_name,
 				    &psy->charging_full_trig);
 	led_trigger_register_simple(psy->charging_trig_name,
 				    &psy->charging_trig);
 	led_trigger_register_simple(psy->full_trig_name,
 				    &psy->full_trig);
+	led_trigger_register_simple(psy->charging_blink_full_solid_trig_name,
+				    &psy->charging_blink_full_solid_trig);
 
 	goto success;
 
+charging_blink_full_solid_failed:
+	kfree(psy->full_trig_name);
 full_failed:
 	kfree(psy->charging_trig_name);
 charging_failed:
@@ -88,6 +104,8 @@ static void power_supply_remove_bat_triggers(struct power_supply *psy)
 	led_trigger_unregister_simple(psy->charging_full_trig);
 	led_trigger_unregister_simple(psy->charging_trig);
 	led_trigger_unregister_simple(psy->full_trig);
+	led_trigger_unregister_simple(psy->charging_blink_full_solid_trig);
+	kfree(psy->charging_blink_full_solid_trig_name);
 	kfree(psy->full_trig_name);
 	kfree(psy->charging_trig_name);
 	kfree(psy->charging_full_trig_name);
include/linux/power_supply.h +2 -0
index 7d73256..32a1e50 100644
@@ -173,6 +173,8 @@ struct power_supply {
 	char *full_trig_name;
 	struct led_trigger *online_trig;
 	char *online_trig_name;
+	struct led_trigger *charging_blink_full_solid_trig;
+	char *charging_blink_full_solid_trig_name;
 #endif
 };
 
Signature · 1 line
1.7.3.2
#3 lore raw

Re: [RFC PATCH 2/2] power_supply: Add new LED trigger charging-blink-solid-full

Quoted 6 lines · Vasily Khoruzhick

Add new trigger to power_supply LEDs. It will blink when battery is charging, and stay solid when battery is charged. It's usefull to indicate battery state when there's only one LED available.

Strange, I got neither 0/2 nor 1/2.

Anyway, I'm fine with this particular patch, but to take 1/2 via battery-2.6.git I need Richard's Acked-by tag.

A note wrt the new LEDs API...

Quoted 14 lines
---
 drivers/power/power_supply_leds.c |   18 ++++++++++++++++++
 include/linux/power_supply.h      |    2 ++
 2 files changed, 20 insertions(+), 0 deletions(-)
drivers/power/power_supply_leds.c +1 -0
index 031a554..b640bbf 100644
@@ -21,6 +21,7 @@
 static void power_supply_update_bat_leds(struct power_supply *psy)
 {
 	union power_supply_propval status;
+	unsigned long delay_on = 0, delay_off = 0;

[...]

drivers/power/power_supply_leds.c static void power_supply_update_bat_leds(struct power_supply *psy) · line 44

Quoted 2 lines
drivers/power/power_supply_leds.c +2 -0
+		led_trigger_blink(psy->charging_blink_full_solid_trig,
+			&delay_on, &delay_off);

I think it's better to allow passing NULL to led_trigger_blink() and thus avoid delay_{on,off} dummy variables.

Thanks,

Signature · 2 lines
Anton Vorontsov
Email: [email protected]
#4 lore raw

Re: [RFC PATCH 2/2] power_supply: Add new LED trigger charging-blink-solid-full

Quoted 1 line · On Friday 14 January 2011 18:18:51 Anton Vorontsov wrote:

Strange, I got neither 0/2 nor 1/2.

Hmm, patches are definitely on ML, here's link to 1st patch on patchwork:
https://patchwork.kernel.org/patch/464481/

However, if you want, I can forward copy of 0/2 and 1/2 to you directly, but check your 'spam' folder first ;)

Quoted 2 lines

Anyway, I'm fine with this particular patch, but to take 1/2 via battery-2.6.git I need Richard's Acked-by tag.

Ok

Quoted 5 lines

drivers/power/power_supply_leds.c static void power_supply_update_bat_leds(struct power_supply *psy) · line 44

Quoted 2 lines
drivers/power/power_supply_leds.c +2 -0
+		led_trigger_blink(psy->charging_blink_full_solid_trig,
+			&delay_on, &delay_off);

I think it's better to allow passing NULL to led_trigger_blink() and thus avoid delay_{on,off} dummy variables.

It mimics led_blink_set function, and I prefer to keep it this way (just to keep consistency), or change led_blink_set behavior.

Regards
Vasily

#5 lore raw

Re: [RFC PATCH 2/2] power_supply: Add new LED trigger charging-blink-solid-full

In reply to Vasily Khoruzhick
Quoted 7 lines · Vasily Khoruzhick

Add new trigger to power_supply LEDs. It will blink when battery is charging, and stay solid when battery is charged. It's usefull to indicate battery state when there's only one LED available.

---

Appled both patches to battery-2.6.git, thanks!

drivers/power/power_supply_leds.c line 24

Quoted 13 lines
 drivers/power/power_supply_leds.c |   18 ++++++++++++++++++
 include/linux/power_supply.h      |    2 ++
 2 files changed, 20 insertions(+), 0 deletions(-)
drivers/power/power_supply_leds.c +1 -0
index 031a554..b640bbf 100644
@@ -21,6 +21,7 @@
 static void power_supply_update_bat_leds(struct power_supply *psy)
 {
 	union power_supply_propval status;
+	unsigned long delay_on = 0, delay_off = 0;

Changed this to

	unsigned long delay_on = 0;
	unsigned long delay_off = 0;

Thanks!

Signature · 2 lines
Anton Vorontsov
Email: [email protected]