@@ -58,10 +58,9 @@ static unsigned char qt2160_key2code[] = {
58
58
struct qt2160_led {
59
59
struct qt2160_data * qt2160 ;
60
60
struct led_classdev cdev ;
61
- struct work_struct work ;
62
61
char name [32 ];
63
62
int id ;
64
- enum led_brightness new_brightness ;
63
+ enum led_brightness brightness ;
65
64
};
66
65
#endif
67
66
@@ -74,7 +73,6 @@ struct qt2160_data {
74
73
u16 key_matrix ;
75
74
#ifdef CONFIG_LEDS_CLASS
76
75
struct qt2160_led leds [QT2160_NUM_LEDS_X ];
77
- struct mutex led_lock ;
78
76
#endif
79
77
};
80
78
@@ -83,46 +81,39 @@ static int qt2160_write(struct i2c_client *client, u8 reg, u8 data);
83
81
84
82
#ifdef CONFIG_LEDS_CLASS
85
83
86
- static void qt2160_led_work (struct work_struct * work )
84
+ static int qt2160_led_set (struct led_classdev * cdev ,
85
+ enum led_brightness value )
87
86
{
88
- struct qt2160_led * led = container_of (work , struct qt2160_led , work );
87
+ struct qt2160_led * led = container_of (cdev , struct qt2160_led , cdev );
89
88
struct qt2160_data * qt2160 = led -> qt2160 ;
90
89
struct i2c_client * client = qt2160 -> client ;
91
- int value = led -> new_brightness ;
92
90
u32 drive , pwmen ;
93
91
94
- mutex_lock (& qt2160 -> led_lock );
95
-
96
- drive = qt2160_read (client , QT2160_CMD_DRIVE_X );
97
- pwmen = qt2160_read (client , QT2160_CMD_PWMEN_X );
98
- if (value != LED_OFF ) {
99
- drive |= (1 << led -> id );
100
- pwmen |= (1 << led -> id );
101
-
102
- } else {
103
- drive &= ~(1 << led -> id );
104
- pwmen &= ~(1 << led -> id );
105
- }
106
- qt2160_write (client , QT2160_CMD_DRIVE_X , drive );
107
- qt2160_write (client , QT2160_CMD_PWMEN_X , pwmen );
92
+ if (value != led -> brightness ) {
93
+ drive = qt2160_read (client , QT2160_CMD_DRIVE_X );
94
+ pwmen = qt2160_read (client , QT2160_CMD_PWMEN_X );
95
+ if (value != LED_OFF ) {
96
+ drive |= BIT (led -> id );
97
+ pwmen |= BIT (led -> id );
108
98
109
- /*
110
- * Changing this register will change the brightness
111
- * of every LED in the qt2160. It's a HW limitation.
112
- */
113
- if ( value != LED_OFF )
114
- qt2160_write (client , QT2160_CMD_PWM_DUTY , value );
99
+ } else {
100
+ drive &= ~ BIT ( led -> id );
101
+ pwmen &= ~ BIT ( led -> id );
102
+ }
103
+ qt2160_write ( client , QT2160_CMD_DRIVE_X , drive );
104
+ qt2160_write (client , QT2160_CMD_PWMEN_X , pwmen );
115
105
116
- mutex_unlock (& qt2160 -> led_lock );
117
- }
106
+ /*
107
+ * Changing this register will change the brightness
108
+ * of every LED in the qt2160. It's a HW limitation.
109
+ */
110
+ if (value != LED_OFF )
111
+ qt2160_write (client , QT2160_CMD_PWM_DUTY , value );
118
112
119
- static void qt2160_led_set (struct led_classdev * cdev ,
120
- enum led_brightness value )
121
- {
122
- struct qt2160_led * led = container_of (cdev , struct qt2160_led , cdev );
113
+ led -> brightness = value ;
114
+ }
123
115
124
- led -> new_brightness = value ;
125
- schedule_work (& led -> work );
116
+ return 0 ;
126
117
}
127
118
128
119
#endif /* CONFIG_LEDS_CLASS */
@@ -293,20 +284,16 @@ static int qt2160_register_leds(struct qt2160_data *qt2160)
293
284
int ret ;
294
285
int i ;
295
286
296
- mutex_init (& qt2160 -> led_lock );
297
-
298
287
for (i = 0 ; i < QT2160_NUM_LEDS_X ; i ++ ) {
299
288
struct qt2160_led * led = & qt2160 -> leds [i ];
300
289
301
290
snprintf (led -> name , sizeof (led -> name ), "qt2160:x%d" , i );
302
291
led -> cdev .name = led -> name ;
303
- led -> cdev .brightness_set = qt2160_led_set ;
292
+ led -> cdev .brightness_set_blocking = qt2160_led_set ;
304
293
led -> cdev .brightness = LED_OFF ;
305
294
led -> id = i ;
306
295
led -> qt2160 = qt2160 ;
307
296
308
- INIT_WORK (& led -> work , qt2160_led_work );
309
-
310
297
ret = led_classdev_register (& client -> dev , & led -> cdev );
311
298
if (ret < 0 )
312
299
return ret ;
@@ -324,10 +311,8 @@ static void qt2160_unregister_leds(struct qt2160_data *qt2160)
324
311
{
325
312
int i ;
326
313
327
- for (i = 0 ; i < QT2160_NUM_LEDS_X ; i ++ ) {
314
+ for (i = 0 ; i < QT2160_NUM_LEDS_X ; i ++ )
328
315
led_classdev_unregister (& qt2160 -> leds [i ].cdev );
329
- cancel_work_sync (& qt2160 -> leds [i ].work );
330
- }
331
316
}
332
317
333
318
#else
0 commit comments