90
90
* @led_dev: led class device pointer
91
91
* @regmap: Devices register map
92
92
* @eeprom_regmap: EEPROM register map
93
- * @enable_gpio: VDDIO/EN gpio to enable communication interface
94
93
*/
95
94
struct lp8860_led {
96
95
struct mutex lock ;
97
96
struct i2c_client * client ;
98
97
struct led_classdev led_dev ;
99
98
struct regmap * regmap ;
100
99
struct regmap * eeprom_regmap ;
101
- struct gpio_desc * enable_gpio ;
102
100
};
103
101
104
102
static const struct reg_sequence lp8860_eeprom_disp_regs [] = {
@@ -218,8 +216,6 @@ static int lp8860_init(struct lp8860_led *led)
218
216
unsigned int read_buf ;
219
217
int ret , reg_count ;
220
218
221
- gpiod_direction_output (led -> enable_gpio , 1 );
222
-
223
219
ret = lp8860_fault_check (led );
224
220
if (ret )
225
221
goto out ;
@@ -256,9 +252,6 @@ static int lp8860_init(struct lp8860_led *led)
256
252
return ret ;
257
253
258
254
out :
259
- if (ret )
260
- gpiod_direction_output (led -> enable_gpio , 0 );
261
-
262
255
return ret ;
263
256
}
264
257
@@ -276,13 +269,21 @@ static const struct regmap_config lp8860_eeprom_regmap_config = {
276
269
.max_register = LP8860_EEPROM_REG_24 ,
277
270
};
278
271
272
+ static void lp8860_disable_gpio (void * data )
273
+ {
274
+ struct gpio_desc * gpio = data ;
275
+
276
+ gpiod_set_value (gpio , 0 );
277
+ }
278
+
279
279
static int lp8860_probe (struct i2c_client * client )
280
280
{
281
281
int ret ;
282
282
struct lp8860_led * led ;
283
283
struct device_node * np = dev_of_node (& client -> dev );
284
284
struct device_node * child_node ;
285
285
struct led_init_data init_data = {};
286
+ struct gpio_desc * enable_gpio ;
286
287
287
288
led = devm_kzalloc (& client -> dev , sizeof (* led ), GFP_KERNEL );
288
289
if (!led )
@@ -292,13 +293,11 @@ static int lp8860_probe(struct i2c_client *client)
292
293
if (!child_node )
293
294
return - EINVAL ;
294
295
295
- led -> enable_gpio = devm_gpiod_get_optional (& client -> dev ,
296
- "enable" , GPIOD_OUT_LOW );
297
- if (IS_ERR (led -> enable_gpio )) {
298
- ret = PTR_ERR (led -> enable_gpio );
299
- dev_err (& client -> dev , "Failed to get enable gpio: %d\n" , ret );
300
- return ret ;
301
- }
296
+ enable_gpio = devm_gpiod_get_optional (& client -> dev , "enable" , GPIOD_OUT_LOW );
297
+ if (IS_ERR (enable_gpio ))
298
+ return dev_err_probe (& client -> dev , PTR_ERR (enable_gpio ),
299
+ "Failed to get enable GPIO\n" );
300
+ devm_add_action_or_reset (& client -> dev , lp8860_disable_gpio , enable_gpio );
302
301
303
302
ret = devm_regulator_get_enable_optional (& client -> dev , "vled" );
304
303
if (ret && ret != - ENODEV )
@@ -310,8 +309,6 @@ static int lp8860_probe(struct i2c_client *client)
310
309
311
310
devm_mutex_init (& client -> dev , & led -> lock );
312
311
313
- i2c_set_clientdata (client , led );
314
-
315
312
led -> regmap = devm_regmap_init_i2c (client , & lp8860_regmap_config );
316
313
if (IS_ERR (led -> regmap )) {
317
314
ret = PTR_ERR (led -> regmap );
@@ -346,14 +343,6 @@ static int lp8860_probe(struct i2c_client *client)
346
343
return 0 ;
347
344
}
348
345
349
- static void lp8860_remove (struct i2c_client * client )
350
- {
351
- struct lp8860_led * led = i2c_get_clientdata (client );
352
- int ret ;
353
-
354
- gpiod_direction_output (led -> enable_gpio , 0 );
355
- }
356
-
357
346
static const struct i2c_device_id lp8860_id [] = {
358
347
{ "lp8860" },
359
348
{ }
@@ -372,7 +361,6 @@ static struct i2c_driver lp8860_driver = {
372
361
.of_match_table = of_lp8860_leds_match ,
373
362
},
374
363
.probe = lp8860_probe ,
375
- .remove = lp8860_remove ,
376
364
.id_table = lp8860_id ,
377
365
};
378
366
module_i2c_driver (lp8860_driver );
0 commit comments