>From 652251115033be83c3626b260d9f1fdf0e479b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan-Simon=20M=C3=B6ller?= Date: Wed, 9 Jul 2014 14:26:53 +0200 Subject: [PATCH] Enhance error-checking and remove sequence handling. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Jan-Simon Möller --- drivers/leds/leds-blinkm.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/leds/leds-blinkm.c b/drivers/leds/leds-blinkm.c index d0452b0..9e7b988 100644 --- a/drivers/leds/leds-blinkm.c +++ b/drivers/leds/leds-blinkm.c @@ -449,6 +449,8 @@ static void led_work(struct work_struct *work) led = blm_work->blinkm_led; data = i2c_get_clientdata(led->i2c_client); ret = blinkm_transfer_hw(led->i2c_client, BLM_GO_RGB); + if(ret) + dev_err(&led->i2c_client->dev, "BlinkM: HW transfer error\n"); atomic_dec(&led->active); dev_dbg(&led->i2c_client->dev, "# DONE # next_red = %d, next_green = %d," @@ -548,7 +550,11 @@ static void blinkm_init_hw(struct i2c_client *client) { int ret; ret = blinkm_transfer_hw(client, BLM_STOP_SCRIPT); + if(ret) + dev_err(&client->dev, "BlinkM: HW transfer error\n"); ret = blinkm_transfer_hw(client, BLM_GO_RGB); + if(ret) + dev_err(&client->dev, "BlinkM: HW transfer error\n"); } static int blinkm_test_run(struct i2c_client *client) @@ -747,6 +753,8 @@ static int blinkm_remove(struct i2c_client *client) /* make sure no workqueue entries are pending */ for (i = 0; i < 3; i++) { + //imbalance active counter to prevent further work + atomic_inc(&data->blinkm_leds[i].active); flush_scheduled_work(); led_classdev_unregister(&data->blinkm_leds[i].led_cdev); } @@ -780,6 +788,10 @@ static int blinkm_remove(struct i2c_client *client) dev_err(&client->dev, "Failure in blinkm_remove ignored. Continuing.\n"); sysfs_remove_group(&client->dev.kobj, &blinkm_group); + + // make sure all is done before returning + flush_scheduled_work(); + return 0; } -- 1.8.4.5