19
19
20
20
/* Battery specific LEDs triggers. */
21
21
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
+
22
81
static void power_supply_update_bat_leds (struct power_supply * psy )
23
82
{
24
83
union power_supply_propval status ;
@@ -65,69 +124,33 @@ static void power_supply_update_bat_leds(struct power_supply *psy)
65
124
}
66
125
}
67
126
68
- static int power_supply_create_bat_triggers (struct power_supply * psy )
127
+ static void power_supply_remove_bat_triggers (struct power_supply * psy )
69
128
{
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 );
117
134
}
118
135
119
- static void power_supply_remove_bat_triggers (struct power_supply * psy )
136
+ static int power_supply_create_bat_triggers (struct power_supply * psy )
120
137
{
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 ;
131
154
}
132
155
133
156
/* Generated power specific LEDs triggers. */
@@ -149,20 +172,12 @@ static void power_supply_update_gen_leds(struct power_supply *psy)
149
172
150
173
static int power_supply_create_gen_triggers (struct power_supply * psy )
151
174
{
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 );
160
176
}
161
177
162
178
static void power_supply_remove_gen_triggers (struct power_supply * psy )
163
179
{
164
- led_trigger_unregister_simple (psy -> online_trig );
165
- kfree (psy -> online_trig_name );
180
+ power_supply_unregister_led_trigger (psy -> online_trig );
166
181
}
167
182
168
183
/* Choice what triggers to create&update. */
0 commit comments