@@ -124,13 +124,15 @@ struct pca955x_led {
124
124
struct fwnode_handle * fwnode ;
125
125
};
126
126
127
+ #define led_to_pca955x (l ) container_of(l, struct pca955x_led, led_cdev)
128
+
127
129
struct pca955x_platform_data {
128
130
struct pca955x_led * leds ;
129
131
int num_leds ;
130
132
};
131
133
132
134
/* 8 bits per input register */
133
- static inline int pca95xx_num_input_regs (int bits )
135
+ static inline int pca955x_num_input_regs (int bits )
134
136
{
135
137
return (bits + 7 ) / 8 ;
136
138
}
@@ -145,14 +147,19 @@ static inline u8 pca955x_ledsel(u8 oldval, int led_num, int state)
145
147
((state & 0x3 ) << (led_num << 1 ));
146
148
}
147
149
150
+ static inline int pca955x_ledstate (u8 ls , int led_num )
151
+ {
152
+ return (ls >> (led_num << 1 )) & 0x3 ;
153
+ }
154
+
148
155
/*
149
156
* Write to frequency prescaler register, used to program the
150
157
* period of the PWM output. period = (PSCx + 1) / 38
151
158
*/
152
159
static int pca955x_write_psc (struct i2c_client * client , int n , u8 val )
153
160
{
154
161
struct pca955x * pca955x = i2c_get_clientdata (client );
155
- u8 cmd = pca95xx_num_input_regs (pca955x -> chipdef -> bits ) + (2 * n );
162
+ u8 cmd = pca955x_num_input_regs (pca955x -> chipdef -> bits ) + (2 * n );
156
163
int ret ;
157
164
158
165
ret = i2c_smbus_write_byte_data (client , cmd , val );
@@ -172,7 +179,7 @@ static int pca955x_write_psc(struct i2c_client *client, int n, u8 val)
172
179
static int pca955x_write_pwm (struct i2c_client * client , int n , u8 val )
173
180
{
174
181
struct pca955x * pca955x = i2c_get_clientdata (client );
175
- u8 cmd = pca95xx_num_input_regs (pca955x -> chipdef -> bits ) + 1 + (2 * n );
182
+ u8 cmd = pca955x_num_input_regs (pca955x -> chipdef -> bits ) + 1 + (2 * n );
176
183
int ret ;
177
184
178
185
ret = i2c_smbus_write_byte_data (client , cmd , val );
@@ -189,7 +196,7 @@ static int pca955x_write_pwm(struct i2c_client *client, int n, u8 val)
189
196
static int pca955x_write_ls (struct i2c_client * client , int n , u8 val )
190
197
{
191
198
struct pca955x * pca955x = i2c_get_clientdata (client );
192
- u8 cmd = pca95xx_num_input_regs (pca955x -> chipdef -> bits ) + 4 + n ;
199
+ u8 cmd = pca955x_num_input_regs (pca955x -> chipdef -> bits ) + 4 + n ;
193
200
int ret ;
194
201
195
202
ret = i2c_smbus_write_byte_data (client , cmd , val );
@@ -206,7 +213,7 @@ static int pca955x_write_ls(struct i2c_client *client, int n, u8 val)
206
213
static int pca955x_read_ls (struct i2c_client * client , int n , u8 * val )
207
214
{
208
215
struct pca955x * pca955x = i2c_get_clientdata (client );
209
- u8 cmd = pca95xx_num_input_regs (pca955x -> chipdef -> bits ) + 4 + n ;
216
+ u8 cmd = pca955x_num_input_regs (pca955x -> chipdef -> bits ) + 4 + n ;
210
217
int ret ;
211
218
212
219
ret = i2c_smbus_read_byte_data (client , cmd );
@@ -222,7 +229,7 @@ static int pca955x_read_ls(struct i2c_client *client, int n, u8 *val)
222
229
static int pca955x_read_pwm (struct i2c_client * client , int n , u8 * val )
223
230
{
224
231
struct pca955x * pca955x = i2c_get_clientdata (client );
225
- u8 cmd = pca95xx_num_input_regs (pca955x -> chipdef -> bits ) + 1 + (2 * n );
232
+ u8 cmd = pca955x_num_input_regs (pca955x -> chipdef -> bits ) + 1 + (2 * n );
226
233
int ret ;
227
234
228
235
ret = i2c_smbus_read_byte_data (client , cmd );
@@ -237,9 +244,7 @@ static int pca955x_read_pwm(struct i2c_client *client, int n, u8 *val)
237
244
238
245
static enum led_brightness pca955x_led_get (struct led_classdev * led_cdev )
239
246
{
240
- struct pca955x_led * pca955x_led = container_of (led_cdev ,
241
- struct pca955x_led ,
242
- led_cdev );
247
+ struct pca955x_led * pca955x_led = led_to_pca955x (led_cdev );
243
248
struct pca955x * pca955x = pca955x_led -> pca955x ;
244
249
u8 ls , pwm ;
245
250
int ret ;
@@ -248,8 +253,7 @@ static enum led_brightness pca955x_led_get(struct led_classdev *led_cdev)
248
253
if (ret )
249
254
return ret ;
250
255
251
- ls = (ls >> ((pca955x_led -> led_num % 4 ) << 1 )) & 0x3 ;
252
- switch (ls ) {
256
+ switch (pca955x_ledstate (ls , pca955x_led -> led_num % 4 )) {
253
257
case PCA955X_LS_LED_ON :
254
258
ret = LED_FULL ;
255
259
break ;
@@ -273,34 +277,28 @@ static enum led_brightness pca955x_led_get(struct led_classdev *led_cdev)
273
277
static int pca955x_led_set (struct led_classdev * led_cdev ,
274
278
enum led_brightness value )
275
279
{
276
- struct pca955x_led * pca955x_led ;
277
- struct pca955x * pca955x ;
280
+ struct pca955x_led * pca955x_led = led_to_pca955x (led_cdev );
281
+ struct pca955x * pca955x = pca955x_led -> pca955x ;
282
+ int reg = pca955x_led -> led_num / 4 ;
283
+ int bit = pca955x_led -> led_num % 4 ;
278
284
u8 ls ;
279
- int chip_ls ; /* which LSx to use (0-3 potentially) */
280
- int ls_led ; /* which set of bits within LSx to use (0-3) */
281
285
int ret ;
282
286
283
- pca955x_led = container_of (led_cdev , struct pca955x_led , led_cdev );
284
- pca955x = pca955x_led -> pca955x ;
285
-
286
- chip_ls = pca955x_led -> led_num / 4 ;
287
- ls_led = pca955x_led -> led_num % 4 ;
288
-
289
287
mutex_lock (& pca955x -> lock );
290
288
291
- ret = pca955x_read_ls (pca955x -> client , chip_ls , & ls );
289
+ ret = pca955x_read_ls (pca955x -> client , reg , & ls );
292
290
if (ret )
293
291
goto out ;
294
292
295
293
switch (value ) {
296
294
case LED_FULL :
297
- ls = pca955x_ledsel (ls , ls_led , PCA955X_LS_LED_ON );
295
+ ls = pca955x_ledsel (ls , bit , PCA955X_LS_LED_ON );
298
296
break ;
299
297
case LED_OFF :
300
- ls = pca955x_ledsel (ls , ls_led , PCA955X_LS_LED_OFF );
298
+ ls = pca955x_ledsel (ls , bit , PCA955X_LS_LED_OFF );
301
299
break ;
302
300
case LED_HALF :
303
- ls = pca955x_ledsel (ls , ls_led , PCA955X_LS_BLINK0 );
301
+ ls = pca955x_ledsel (ls , bit , PCA955X_LS_BLINK0 );
304
302
break ;
305
303
default :
306
304
/*
@@ -313,11 +311,11 @@ static int pca955x_led_set(struct led_classdev *led_cdev,
313
311
ret = pca955x_write_pwm (pca955x -> client , 1 , 255 - value );
314
312
if (ret )
315
313
goto out ;
316
- ls = pca955x_ledsel (ls , ls_led , PCA955X_LS_BLINK1 );
314
+ ls = pca955x_ledsel (ls , bit , PCA955X_LS_BLINK1 );
317
315
break ;
318
316
}
319
317
320
- ret = pca955x_write_ls (pca955x -> client , chip_ls , ls );
318
+ ret = pca955x_write_ls (pca955x -> client , reg , ls );
321
319
322
320
out :
323
321
mutex_unlock (& pca955x -> lock );
0 commit comments