1919
2020/* Battery specific LEDs triggers. */
2121
22+ struct power_supply_led_trigger {
23+ struct led_trigger trig ;
24+ struct power_supply * psy ;
25+ };
26+
27+ #define trigger_to_psy_trigger (trigger ) \
28+ container_of(trigger, struct power_supply_led_trigger, trig)
29+
30+ static int power_supply_register_led_trigger (struct power_supply * psy ,
31+ const char * name_template ,
32+ struct led_trigger * * tp , int * err )
33+ {
34+ struct power_supply_led_trigger * psy_trig ;
35+ int ret = - ENOMEM ;
36+
37+ /* Bail on previous errors */
38+ if (err && * err )
39+ return * err ;
40+
41+ psy_trig = kzalloc (sizeof (* psy_trig ), GFP_KERNEL );
42+ if (!psy_trig )
43+ goto err_free_trigger ;
44+
45+ psy_trig -> trig .name = kasprintf (GFP_KERNEL , name_template , psy -> desc -> name );
46+ if (!psy_trig -> trig .name )
47+ goto err_free_trigger ;
48+
49+ psy_trig -> psy = psy ;
50+
51+ ret = led_trigger_register (& psy_trig -> trig );
52+ if (ret )
53+ goto err_free_name ;
54+
55+ * tp = & psy_trig -> trig ;
56+ return 0 ;
57+
58+ err_free_name :
59+ kfree (psy_trig -> trig .name );
60+ err_free_trigger :
61+ kfree (psy_trig );
62+ if (err )
63+ * err = ret ;
64+
65+ return ret ;
66+ }
67+
68+ static void power_supply_unregister_led_trigger (struct led_trigger * trig )
69+ {
70+ struct power_supply_led_trigger * psy_trig ;
71+
72+ if (!trig )
73+ return ;
74+
75+ psy_trig = trigger_to_psy_trigger (trig );
76+ led_trigger_unregister (& psy_trig -> trig );
77+ kfree (psy_trig -> trig .name );
78+ kfree (psy_trig );
79+ }
80+
2281static void power_supply_update_bat_leds (struct power_supply * psy )
2382{
2483 union power_supply_propval status ;
@@ -65,69 +124,33 @@ static void power_supply_update_bat_leds(struct power_supply *psy)
65124 }
66125}
67126
68- static int power_supply_create_bat_triggers (struct power_supply * psy )
127+ static void power_supply_remove_bat_triggers (struct power_supply * psy )
69128{
70- psy -> charging_full_trig_name = kasprintf (GFP_KERNEL ,
71- "%s-charging-or-full" , psy -> desc -> name );
72- if (!psy -> charging_full_trig_name )
73- goto charging_full_failed ;
74-
75- psy -> charging_trig_name = kasprintf (GFP_KERNEL ,
76- "%s-charging" , psy -> desc -> name );
77- if (!psy -> charging_trig_name )
78- goto charging_failed ;
79-
80- psy -> full_trig_name = kasprintf (GFP_KERNEL , "%s-full" , psy -> desc -> name );
81- if (!psy -> full_trig_name )
82- goto full_failed ;
83-
84- psy -> charging_blink_full_solid_trig_name = kasprintf (GFP_KERNEL ,
85- "%s-charging-blink-full-solid" , psy -> desc -> name );
86- if (!psy -> charging_blink_full_solid_trig_name )
87- goto charging_blink_full_solid_failed ;
88-
89- psy -> charging_orange_full_green_trig_name = kasprintf (GFP_KERNEL ,
90- "%s-charging-orange-full-green" , psy -> desc -> name );
91- if (!psy -> charging_orange_full_green_trig_name )
92- goto charging_red_full_green_failed ;
93-
94- led_trigger_register_simple (psy -> charging_full_trig_name ,
95- & psy -> charging_full_trig );
96- led_trigger_register_simple (psy -> charging_trig_name ,
97- & psy -> charging_trig );
98- led_trigger_register_simple (psy -> full_trig_name ,
99- & psy -> full_trig );
100- led_trigger_register_simple (psy -> charging_blink_full_solid_trig_name ,
101- & psy -> charging_blink_full_solid_trig );
102- led_trigger_register_simple (psy -> charging_orange_full_green_trig_name ,
103- & psy -> charging_orange_full_green_trig );
104-
105- return 0 ;
106-
107- charging_red_full_green_failed :
108- kfree (psy -> charging_blink_full_solid_trig_name );
109- charging_blink_full_solid_failed :
110- kfree (psy -> full_trig_name );
111- full_failed :
112- kfree (psy -> charging_trig_name );
113- charging_failed :
114- kfree (psy -> charging_full_trig_name );
115- charging_full_failed :
116- return - ENOMEM ;
129+ power_supply_unregister_led_trigger (psy -> charging_full_trig );
130+ power_supply_unregister_led_trigger (psy -> charging_trig );
131+ power_supply_unregister_led_trigger (psy -> full_trig );
132+ power_supply_unregister_led_trigger (psy -> charging_blink_full_solid_trig );
133+ power_supply_unregister_led_trigger (psy -> charging_orange_full_green_trig );
117134}
118135
119- static void power_supply_remove_bat_triggers (struct power_supply * psy )
136+ static int power_supply_create_bat_triggers (struct power_supply * psy )
120137{
121- led_trigger_unregister_simple (psy -> charging_full_trig );
122- led_trigger_unregister_simple (psy -> charging_trig );
123- led_trigger_unregister_simple (psy -> full_trig );
124- led_trigger_unregister_simple (psy -> charging_blink_full_solid_trig );
125- led_trigger_unregister_simple (psy -> charging_orange_full_green_trig );
126- kfree (psy -> charging_blink_full_solid_trig_name );
127- kfree (psy -> full_trig_name );
128- kfree (psy -> charging_trig_name );
129- kfree (psy -> charging_full_trig_name );
130- kfree (psy -> charging_orange_full_green_trig_name );
138+ int err = 0 ;
139+
140+ power_supply_register_led_trigger (psy , "%s-charging-or-full" ,
141+ & psy -> charging_full_trig , & err );
142+ power_supply_register_led_trigger (psy , "%s-charging" ,
143+ & psy -> charging_trig , & err );
144+ power_supply_register_led_trigger (psy , "%s-full" ,
145+ & psy -> full_trig , & err );
146+ power_supply_register_led_trigger (psy , "%s-charging-blink-full-solid" ,
147+ & psy -> charging_blink_full_solid_trig , & err );
148+ power_supply_register_led_trigger (psy , "%s-charging-orange-full-green" ,
149+ & psy -> charging_orange_full_green_trig , & err );
150+ if (err )
151+ power_supply_remove_bat_triggers (psy );
152+
153+ return err ;
131154}
132155
133156/* Generated power specific LEDs triggers. */
@@ -149,20 +172,12 @@ static void power_supply_update_gen_leds(struct power_supply *psy)
149172
150173static int power_supply_create_gen_triggers (struct power_supply * psy )
151174{
152- psy -> online_trig_name = kasprintf (GFP_KERNEL , "%s-online" ,
153- psy -> desc -> name );
154- if (!psy -> online_trig_name )
155- return - ENOMEM ;
156-
157- led_trigger_register_simple (psy -> online_trig_name , & psy -> online_trig );
158-
159- return 0 ;
175+ return power_supply_register_led_trigger (psy , "%s-online" , & psy -> online_trig , NULL );
160176}
161177
162178static void power_supply_remove_gen_triggers (struct power_supply * psy )
163179{
164- led_trigger_unregister_simple (psy -> online_trig );
165- kfree (psy -> online_trig_name );
180+ power_supply_unregister_led_trigger (psy -> online_trig );
166181}
167182
168183/* Choice what triggers to create&update. */
0 commit comments