aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Lunn <andrew@lunn.ch>2015-08-20 06:27:05 -0400
committerJacek Anaszewski <j.anaszewski@samsung.com>2016-01-04 03:57:33 -0500
commit64998371e008c718094a0fcb1e073570111a658f (patch)
tree62684508bb15d3ddd22fd994d743096994680230
parent95b2af637e283e3d549c8a6af9f182b0bd972a2e (diff)
leds: lp8788: Remove work queue
Now the core implements the work queue, remove it from the drivers, and switch to using brightness_set_blocking op. Signed-off-by: Andrew Lunn <andrew@lunn.ch> Cc: Milo Kim <milo.kim@ti.com> Signed-off-by: Jacek Anaszewski <j.anaszewski@samsung.com>
-rw-r--r--drivers/leds/leds-lp8788.c48
1 files changed, 21 insertions, 27 deletions
diff --git a/drivers/leds/leds-lp8788.c b/drivers/leds/leds-lp8788.c
index 3409f03c1fa8..0eee38fc0565 100644
--- a/drivers/leds/leds-lp8788.c
+++ b/drivers/leds/leds-lp8788.c
@@ -26,10 +26,8 @@
26struct lp8788_led { 26struct lp8788_led {
27 struct lp8788 *lp; 27 struct lp8788 *lp;
28 struct mutex lock; 28 struct mutex lock;
29 struct work_struct work;
30 struct led_classdev led_dev; 29 struct led_classdev led_dev;
31 enum lp8788_isink_number isink_num; 30 enum lp8788_isink_number isink_num;
32 enum led_brightness brightness;
33 int on; 31 int on;
34}; 32};
35 33
@@ -76,24 +74,29 @@ static int lp8788_led_init_device(struct lp8788_led *led,
76 return lp8788_update_bits(led->lp, addr, mask, val); 74 return lp8788_update_bits(led->lp, addr, mask, val);
77} 75}
78 76
79static void lp8788_led_enable(struct lp8788_led *led, 77static int lp8788_led_enable(struct lp8788_led *led,
80 enum lp8788_isink_number num, int on) 78 enum lp8788_isink_number num, int on)
81{ 79{
80 int ret;
81
82 u8 mask = 1 << num; 82 u8 mask = 1 << num;
83 u8 val = on << num; 83 u8 val = on << num;
84 84
85 if (lp8788_update_bits(led->lp, LP8788_ISINK_CTRL, mask, val)) 85 ret = lp8788_update_bits(led->lp, LP8788_ISINK_CTRL, mask, val);
86 return; 86 if (ret == 0)
87 led->on = on;
87 88
88 led->on = on; 89 return ret;
89} 90}
90 91
91static void lp8788_led_work(struct work_struct *work) 92static int lp8788_brightness_set(struct led_classdev *led_cdev,
93 enum led_brightness val)
92{ 94{
93 struct lp8788_led *led = container_of(work, struct lp8788_led, work); 95 struct lp8788_led *led =
96 container_of(led_cdev, struct lp8788_led, led_dev);
97
94 enum lp8788_isink_number num = led->isink_num; 98 enum lp8788_isink_number num = led->isink_num;
95 int enable; 99 int enable, ret;
96 u8 val = led->brightness;
97 100
98 mutex_lock(&led->lock); 101 mutex_lock(&led->lock);
99 102
@@ -101,28 +104,21 @@ static void lp8788_led_work(struct work_struct *work)
101 case LP8788_ISINK_1: 104 case LP8788_ISINK_1:
102 case LP8788_ISINK_2: 105 case LP8788_ISINK_2:
103 case LP8788_ISINK_3: 106 case LP8788_ISINK_3:
104 lp8788_write_byte(led->lp, lp8788_pwm_addr[num], val); 107 ret = lp8788_write_byte(led->lp, lp8788_pwm_addr[num], val);
108 if (ret < 0)
109 goto unlock;
105 break; 110 break;
106 default: 111 default:
107 mutex_unlock(&led->lock); 112 mutex_unlock(&led->lock);
108 return; 113 return -EINVAL;
109 } 114 }
110 115
111 enable = (val > 0) ? 1 : 0; 116 enable = (val > 0) ? 1 : 0;
112 if (enable != led->on) 117 if (enable != led->on)
113 lp8788_led_enable(led, num, enable); 118 ret = lp8788_led_enable(led, num, enable);
114 119unlock:
115 mutex_unlock(&led->lock); 120 mutex_unlock(&led->lock);
116} 121 return ret;
117
118static void lp8788_brightness_set(struct led_classdev *led_cdev,
119 enum led_brightness brt_val)
120{
121 struct lp8788_led *led =
122 container_of(led_cdev, struct lp8788_led, led_dev);
123
124 led->brightness = brt_val;
125 schedule_work(&led->work);
126} 122}
127 123
128static int lp8788_led_probe(struct platform_device *pdev) 124static int lp8788_led_probe(struct platform_device *pdev)
@@ -139,7 +135,7 @@ static int lp8788_led_probe(struct platform_device *pdev)
139 135
140 led->lp = lp; 136 led->lp = lp;
141 led->led_dev.max_brightness = MAX_BRIGHTNESS; 137 led->led_dev.max_brightness = MAX_BRIGHTNESS;
142 led->led_dev.brightness_set = lp8788_brightness_set; 138 led->led_dev.brightness_set_blocking = lp8788_brightness_set;
143 139
144 led_pdata = lp->pdata ? lp->pdata->led_pdata : NULL; 140 led_pdata = lp->pdata ? lp->pdata->led_pdata : NULL;
145 141
@@ -149,7 +145,6 @@ static int lp8788_led_probe(struct platform_device *pdev)
149 led->led_dev.name = led_pdata->name; 145 led->led_dev.name = led_pdata->name;
150 146
151 mutex_init(&led->lock); 147 mutex_init(&led->lock);
152 INIT_WORK(&led->work, lp8788_led_work);
153 148
154 platform_set_drvdata(pdev, led); 149 platform_set_drvdata(pdev, led);
155 150
@@ -173,7 +168,6 @@ static int lp8788_led_remove(struct platform_device *pdev)
173 struct lp8788_led *led = platform_get_drvdata(pdev); 168 struct lp8788_led *led = platform_get_drvdata(pdev);
174 169
175 led_classdev_unregister(&led->led_dev); 170 led_classdev_unregister(&led->led_dev);
176 flush_work(&led->work);
177 171
178 return 0; 172 return 0;
179} 173}