blob: 053e1f8b6c0b747a7f4849950266060e17ddad72 [file] [log] [blame]
Samu Onkalo0efba162010-11-11 14:05:22 -08001/*
2 * lp5523.c - LP5523 LED Driver
3 *
4 * Copyright (C) 2010 Nokia Corporation
5 *
6 * Contact: Samu Onkalo <samu.p.onkalo@nokia.com>
7 *
8 * This program is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU General Public License
10 * version 2 as published by the Free Software Foundation.
11 *
12 * This program is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
20 * 02110-1301 USA
21 */
22
23#include <linux/module.h>
24#include <linux/init.h>
25#include <linux/i2c.h>
26#include <linux/mutex.h>
27#include <linux/gpio.h>
28#include <linux/interrupt.h>
29#include <linux/delay.h>
30#include <linux/ctype.h>
31#include <linux/spinlock.h>
32#include <linux/wait.h>
33#include <linux/leds.h>
34#include <linux/leds-lp5523.h>
35#include <linux/workqueue.h>
36#include <linux/slab.h>
37
38#define LP5523_REG_ENABLE 0x00
39#define LP5523_REG_OP_MODE 0x01
40#define LP5523_REG_RATIOMETRIC_MSB 0x02
41#define LP5523_REG_RATIOMETRIC_LSB 0x03
42#define LP5523_REG_ENABLE_LEDS_MSB 0x04
43#define LP5523_REG_ENABLE_LEDS_LSB 0x05
44#define LP5523_REG_LED_CNTRL_BASE 0x06
45#define LP5523_REG_LED_PWM_BASE 0x16
46#define LP5523_REG_LED_CURRENT_BASE 0x26
47#define LP5523_REG_CONFIG 0x36
48#define LP5523_REG_CHANNEL1_PC 0x37
49#define LP5523_REG_CHANNEL2_PC 0x38
50#define LP5523_REG_CHANNEL3_PC 0x39
51#define LP5523_REG_STATUS 0x3a
52#define LP5523_REG_GPO 0x3b
53#define LP5523_REG_VARIABLE 0x3c
54#define LP5523_REG_RESET 0x3d
55#define LP5523_REG_TEMP_CTRL 0x3e
56#define LP5523_REG_TEMP_READ 0x3f
57#define LP5523_REG_TEMP_WRITE 0x40
58#define LP5523_REG_LED_TEST_CTRL 0x41
59#define LP5523_REG_LED_TEST_ADC 0x42
60#define LP5523_REG_ENG1_VARIABLE 0x45
61#define LP5523_REG_ENG2_VARIABLE 0x46
62#define LP5523_REG_ENG3_VARIABLE 0x47
63#define LP5523_REG_MASTER_FADER1 0x48
64#define LP5523_REG_MASTER_FADER2 0x49
65#define LP5523_REG_MASTER_FADER3 0x4a
66#define LP5523_REG_CH1_PROG_START 0x4c
67#define LP5523_REG_CH2_PROG_START 0x4d
68#define LP5523_REG_CH3_PROG_START 0x4e
69#define LP5523_REG_PROG_PAGE_SEL 0x4f
70#define LP5523_REG_PROG_MEM 0x50
71
72#define LP5523_CMD_LOAD 0x15 /* 00010101 */
73#define LP5523_CMD_RUN 0x2a /* 00101010 */
74#define LP5523_CMD_DISABLED 0x00 /* 00000000 */
75
76#define LP5523_ENABLE 0x40
77#define LP5523_AUTO_INC 0x40
78#define LP5523_PWR_SAVE 0x20
79#define LP5523_PWM_PWR_SAVE 0x04
80#define LP5523_CP_1 0x08
81#define LP5523_CP_1_5 0x10
82#define LP5523_CP_AUTO 0x18
83#define LP5523_INT_CLK 0x01
84#define LP5523_AUTO_CLK 0x02
85#define LP5523_EN_LEDTEST 0x80
86#define LP5523_LEDTEST_DONE 0x80
87
88#define LP5523_DEFAULT_CURRENT 50 /* microAmps */
89#define LP5523_PROGRAM_LENGTH 32 /* in bytes */
90#define LP5523_PROGRAM_PAGES 6
91#define LP5523_ADC_SHORTCIRC_LIM 80
92
93#define LP5523_LEDS 9
94#define LP5523_ENGINES 3
95
96#define LP5523_ENG_MASK_BASE 0x30 /* 00110000 */
97
98#define LP5523_ENG_STATUS_MASK 0x07 /* 00000111 */
99
100#define LP5523_IRQ_FLAGS IRQF_TRIGGER_FALLING
101
102#define LP5523_EXT_CLK_USED 0x08
103
104#define LED_ACTIVE(mux, led) (!!(mux & (0x0001 << led)))
105#define SHIFT_MASK(id) (((id) - 1) * 2)
106
107struct lp5523_engine {
108 const struct attribute_group *attributes;
109 int id;
110 u8 mode;
111 u8 prog_page;
112 u8 mux_page;
113 u16 led_mux;
114 u8 engine_mask;
115};
116
117struct lp5523_led {
118 int id;
119 u8 chan_nr;
120 u8 led_current;
121 u8 max_current;
122 struct led_classdev cdev;
123 struct work_struct brightness_work;
124 u8 brightness;
125};
126
127struct lp5523_chip {
128 struct mutex lock; /* Serialize control */
129 struct i2c_client *client;
130 struct lp5523_engine engines[LP5523_ENGINES];
131 struct lp5523_led leds[LP5523_LEDS];
132 struct lp5523_platform_data *pdata;
133 u8 num_channels;
134 u8 num_leds;
135};
136
Samu Onkalo87dbf622010-11-24 12:57:03 -0800137static inline struct lp5523_led *cdev_to_led(struct led_classdev *cdev)
138{
139 return container_of(cdev, struct lp5523_led, cdev);
140}
Samu Onkalo0efba162010-11-11 14:05:22 -0800141
Samu Onkalo87dbf622010-11-24 12:57:03 -0800142static inline struct lp5523_chip *engine_to_lp5523(struct lp5523_engine *engine)
Samu Onkalo0efba162010-11-11 14:05:22 -0800143{
144 return container_of(engine, struct lp5523_chip,
145 engines[engine->id - 1]);
146}
147
Samu Onkalo87dbf622010-11-24 12:57:03 -0800148static inline struct lp5523_chip *led_to_lp5523(struct lp5523_led *led)
Samu Onkalo0efba162010-11-11 14:05:22 -0800149{
150 return container_of(led, struct lp5523_chip,
151 leds[led->id]);
152}
153
154static int lp5523_set_mode(struct lp5523_engine *engine, u8 mode);
155static int lp5523_set_engine_mode(struct lp5523_engine *engine, u8 mode);
156static int lp5523_load_program(struct lp5523_engine *engine, u8 *pattern);
157
158static void lp5523_led_brightness_work(struct work_struct *work);
159
160static int lp5523_write(struct i2c_client *client, u8 reg, u8 value)
161{
162 return i2c_smbus_write_byte_data(client, reg, value);
163}
164
165static int lp5523_read(struct i2c_client *client, u8 reg, u8 *buf)
166{
167 s32 ret = i2c_smbus_read_byte_data(client, reg);
168
169 if (ret < 0)
170 return -EIO;
171
172 *buf = ret;
173 return 0;
174}
175
176static int lp5523_detect(struct i2c_client *client)
177{
178 int ret;
179 u8 buf;
180
181 ret = lp5523_write(client, LP5523_REG_ENABLE, 0x40);
182 if (ret)
183 return ret;
184 ret = lp5523_read(client, LP5523_REG_ENABLE, &buf);
185 if (ret)
186 return ret;
187 if (buf == 0x40)
188 return 0;
189 else
190 return -ENODEV;
191}
192
193static int lp5523_configure(struct i2c_client *client)
194{
195 struct lp5523_chip *chip = i2c_get_clientdata(client);
196 int ret = 0;
197 u8 status;
198
199 /* one pattern per engine setting led mux start and stop addresses */
200 u8 pattern[][LP5523_PROGRAM_LENGTH] = {
201 { 0x9c, 0x30, 0x9c, 0xb0, 0x9d, 0x80, 0xd8, 0x00, 0},
202 { 0x9c, 0x40, 0x9c, 0xc0, 0x9d, 0x80, 0xd8, 0x00, 0},
203 { 0x9c, 0x50, 0x9c, 0xd0, 0x9d, 0x80, 0xd8, 0x00, 0},
204 };
205
206 lp5523_write(client, LP5523_REG_RESET, 0xff);
207
208 usleep_range(10000, 100000);
209
210 ret |= lp5523_write(client, LP5523_REG_ENABLE, LP5523_ENABLE);
211 /* Chip startup time after reset is 500 us */
212 usleep_range(1000, 10000);
213
214 ret |= lp5523_write(client, LP5523_REG_CONFIG,
215 LP5523_AUTO_INC | LP5523_PWR_SAVE |
216 LP5523_CP_AUTO | LP5523_AUTO_CLK |
217 LP5523_PWM_PWR_SAVE);
218
219 /* turn on all leds */
220 ret |= lp5523_write(client, LP5523_REG_ENABLE_LEDS_MSB, 0x01);
221 ret |= lp5523_write(client, LP5523_REG_ENABLE_LEDS_LSB, 0xff);
222
223 /* hardcode 32 bytes of memory for each engine from program memory */
224 ret |= lp5523_write(client, LP5523_REG_CH1_PROG_START, 0x00);
225 ret |= lp5523_write(client, LP5523_REG_CH2_PROG_START, 0x10);
226 ret |= lp5523_write(client, LP5523_REG_CH3_PROG_START, 0x20);
227
228 /* write led mux address space for each channel */
229 ret |= lp5523_load_program(&chip->engines[0], pattern[0]);
230 ret |= lp5523_load_program(&chip->engines[1], pattern[1]);
231 ret |= lp5523_load_program(&chip->engines[2], pattern[2]);
232
233 if (ret) {
234 dev_err(&client->dev, "could not load mux programs\n");
235 return -1;
236 }
237
238 /* set all engines exec state and mode to run 00101010 */
239 ret |= lp5523_write(client, LP5523_REG_ENABLE,
240 (LP5523_CMD_RUN | LP5523_ENABLE));
241
242 ret |= lp5523_write(client, LP5523_REG_OP_MODE, LP5523_CMD_RUN);
243
244 if (ret) {
245 dev_err(&client->dev, "could not start mux programs\n");
246 return -1;
247 }
248
249 /* Wait 3ms and check the engine status */
250 usleep_range(3000, 20000);
251 lp5523_read(client, LP5523_REG_STATUS, &status);
252 status &= LP5523_ENG_STATUS_MASK;
253
254 if (status == LP5523_ENG_STATUS_MASK) {
255 dev_dbg(&client->dev, "all engines configured\n");
256 } else {
257 dev_info(&client->dev, "status == %x\n", status);
258 dev_err(&client->dev, "cound not configure LED engine\n");
259 return -1;
260 }
261
262 dev_info(&client->dev, "disabling engines\n");
263
264 ret |= lp5523_write(client, LP5523_REG_OP_MODE, LP5523_CMD_DISABLED);
265
266 return ret;
267}
268
269static int lp5523_set_engine_mode(struct lp5523_engine *engine, u8 mode)
270{
271 struct lp5523_chip *chip = engine_to_lp5523(engine);
272 struct i2c_client *client = chip->client;
273 int ret;
274 u8 engine_state;
275
276 ret = lp5523_read(client, LP5523_REG_OP_MODE, &engine_state);
277 if (ret)
278 goto fail;
279
280 engine_state &= ~(engine->engine_mask);
281
282 /* set mode only for this engine */
283 mode &= engine->engine_mask;
284
285 engine_state |= mode;
286
287 ret |= lp5523_write(client, LP5523_REG_OP_MODE, engine_state);
288fail:
289 return ret;
290}
291
292static int lp5523_load_mux(struct lp5523_engine *engine, u16 mux)
293{
294 struct lp5523_chip *chip = engine_to_lp5523(engine);
295 struct i2c_client *client = chip->client;
296 int ret = 0;
297
298 ret |= lp5523_set_engine_mode(engine, LP5523_CMD_LOAD);
299
300 ret |= lp5523_write(client, LP5523_REG_PROG_PAGE_SEL, engine->mux_page);
301 ret |= lp5523_write(client, LP5523_REG_PROG_MEM,
302 (u8)(mux >> 8));
303 ret |= lp5523_write(client, LP5523_REG_PROG_MEM + 1, (u8)(mux));
304 engine->led_mux = mux;
305
306 return ret;
307}
308
309static int lp5523_load_program(struct lp5523_engine *engine, u8 *pattern)
310{
311 struct lp5523_chip *chip = engine_to_lp5523(engine);
312 struct i2c_client *client = chip->client;
313
314 int ret = 0;
315
316 ret |= lp5523_set_engine_mode(engine, LP5523_CMD_LOAD);
317
318 ret |= lp5523_write(client, LP5523_REG_PROG_PAGE_SEL,
319 engine->prog_page);
320 ret |= i2c_smbus_write_i2c_block_data(client, LP5523_REG_PROG_MEM,
321 LP5523_PROGRAM_LENGTH, pattern);
322
323 return ret;
324}
325
326static int lp5523_run_program(struct lp5523_engine *engine)
327{
328 struct lp5523_chip *chip = engine_to_lp5523(engine);
329 struct i2c_client *client = chip->client;
330 int ret;
331
332 ret = lp5523_write(client, LP5523_REG_ENABLE,
333 LP5523_CMD_RUN | LP5523_ENABLE);
334 if (ret)
335 goto fail;
336
337 ret = lp5523_set_engine_mode(engine, LP5523_CMD_RUN);
338fail:
339 return ret;
340}
341
342static int lp5523_mux_parse(const char *buf, u16 *mux, size_t len)
343{
344 int i;
345 u16 tmp_mux = 0;
346 len = len < LP5523_LEDS ? len : LP5523_LEDS;
347 for (i = 0; i < len; i++) {
348 switch (buf[i]) {
349 case '1':
350 tmp_mux |= (1 << i);
351 break;
352 case '0':
353 break;
354 case '\n':
355 i = len;
356 break;
357 default:
358 return -1;
359 }
360 }
361 *mux = tmp_mux;
362
363 return 0;
364}
365
366static void lp5523_mux_to_array(u16 led_mux, char *array)
367{
368 int i, pos = 0;
369 for (i = 0; i < LP5523_LEDS; i++)
370 pos += sprintf(array + pos, "%x", LED_ACTIVE(led_mux, i));
371
372 array[pos] = '\0';
373}
374
375/*--------------------------------------------------------------*/
376/* Sysfs interface */
377/*--------------------------------------------------------------*/
378
379static ssize_t show_engine_leds(struct device *dev,
380 struct device_attribute *attr,
381 char *buf, int nr)
382{
383 struct i2c_client *client = to_i2c_client(dev);
384 struct lp5523_chip *chip = i2c_get_clientdata(client);
385 char mux[LP5523_LEDS + 1];
386
387 lp5523_mux_to_array(chip->engines[nr - 1].led_mux, mux);
388
389 return sprintf(buf, "%s\n", mux);
390}
391
392#define show_leds(nr) \
393static ssize_t show_engine##nr##_leds(struct device *dev, \
394 struct device_attribute *attr, \
395 char *buf) \
396{ \
397 return show_engine_leds(dev, attr, buf, nr); \
398}
399show_leds(1)
400show_leds(2)
401show_leds(3)
402
403static ssize_t store_engine_leds(struct device *dev,
404 struct device_attribute *attr,
405 const char *buf, size_t len, int nr)
406{
407 struct i2c_client *client = to_i2c_client(dev);
408 struct lp5523_chip *chip = i2c_get_clientdata(client);
409 u16 mux = 0;
410
411 if (lp5523_mux_parse(buf, &mux, len))
412 return -EINVAL;
413
414 if (lp5523_load_mux(&chip->engines[nr - 1], mux))
415 return -EINVAL;
416
417 return len;
418}
419
420#define store_leds(nr) \
421static ssize_t store_engine##nr##_leds(struct device *dev, \
422 struct device_attribute *attr, \
423 const char *buf, size_t len) \
424{ \
425 return store_engine_leds(dev, attr, buf, len, nr); \
426}
427store_leds(1)
428store_leds(2)
429store_leds(3)
430
431static ssize_t lp5523_selftest(struct device *dev,
432 struct device_attribute *attr,
433 char *buf)
434{
435 struct i2c_client *client = to_i2c_client(dev);
436 struct lp5523_chip *chip = i2c_get_clientdata(client);
437 int i, ret, pos = 0;
438 int led = 0;
439 u8 status, adc, vdd;
440
441 mutex_lock(&chip->lock);
442
443 ret = lp5523_read(chip->client, LP5523_REG_STATUS, &status);
444 if (ret < 0)
445 goto fail;
446
447 /* Check that ext clock is really in use if requested */
448 if ((chip->pdata) && (chip->pdata->clock_mode == LP5523_CLOCK_EXT))
449 if ((status & LP5523_EXT_CLK_USED) == 0)
450 goto fail;
451
452 /* Measure VDD (i.e. VBAT) first (channel 16 corresponds to VDD) */
453 lp5523_write(chip->client, LP5523_REG_LED_TEST_CTRL,
454 LP5523_EN_LEDTEST | 16);
455 usleep_range(3000, 10000);
456 ret = lp5523_read(chip->client, LP5523_REG_STATUS, &status);
457 if (!(status & LP5523_LEDTEST_DONE))
458 usleep_range(3000, 10000);
459
460 ret |= lp5523_read(chip->client, LP5523_REG_LED_TEST_ADC, &vdd);
461 vdd--; /* There may be some fluctuation in measurement */
462
463 for (i = 0; i < LP5523_LEDS; i++) {
464 /* Skip non-existing channels */
465 if (chip->pdata->led_config[i].led_current == 0)
466 continue;
467
468 /* Set default current */
469 lp5523_write(chip->client,
470 LP5523_REG_LED_CURRENT_BASE + i,
471 chip->pdata->led_config[i].led_current);
472
473 lp5523_write(chip->client, LP5523_REG_LED_PWM_BASE + i, 0xff);
474 /* let current stabilize 2ms before measurements start */
475 usleep_range(2000, 10000);
476 lp5523_write(chip->client,
477 LP5523_REG_LED_TEST_CTRL,
478 LP5523_EN_LEDTEST | i);
479 /* ledtest takes 2.7ms */
480 usleep_range(3000, 10000);
481 ret = lp5523_read(chip->client, LP5523_REG_STATUS, &status);
482 if (!(status & LP5523_LEDTEST_DONE))
483 usleep_range(3000, 10000);
484 ret |= lp5523_read(chip->client, LP5523_REG_LED_TEST_ADC, &adc);
485
486 if (adc >= vdd || adc < LP5523_ADC_SHORTCIRC_LIM)
487 pos += sprintf(buf + pos, "LED %d FAIL\n", i);
488
489 lp5523_write(chip->client, LP5523_REG_LED_PWM_BASE + i, 0x00);
490
491 /* Restore current */
492 lp5523_write(chip->client,
493 LP5523_REG_LED_CURRENT_BASE + i,
494 chip->leds[led].led_current);
495 led++;
496 }
497 if (pos == 0)
498 pos = sprintf(buf, "OK\n");
499 goto release_lock;
500fail:
501 pos = sprintf(buf, "FAIL\n");
502
503release_lock:
504 mutex_unlock(&chip->lock);
505
506 return pos;
507}
508
509static void lp5523_set_brightness(struct led_classdev *cdev,
510 enum led_brightness brightness)
511{
512 struct lp5523_led *led = cdev_to_led(cdev);
513
514 led->brightness = (u8)brightness;
515
516 schedule_work(&led->brightness_work);
517}
518
519static void lp5523_led_brightness_work(struct work_struct *work)
520{
521 struct lp5523_led *led = container_of(work,
522 struct lp5523_led,
523 brightness_work);
524 struct lp5523_chip *chip = led_to_lp5523(led);
525 struct i2c_client *client = chip->client;
526
527 mutex_lock(&chip->lock);
528
529 lp5523_write(client, LP5523_REG_LED_PWM_BASE + led->chan_nr,
530 led->brightness);
531
532 mutex_unlock(&chip->lock);
533}
534
535static int lp5523_do_store_load(struct lp5523_engine *engine,
536 const char *buf, size_t len)
537{
538 struct lp5523_chip *chip = engine_to_lp5523(engine);
539 struct i2c_client *client = chip->client;
540 int ret, nrchars, offset = 0, i = 0;
541 char c[3];
542 unsigned cmd;
543 u8 pattern[LP5523_PROGRAM_LENGTH] = {0};
544
545 while ((offset < len - 1) && (i < LP5523_PROGRAM_LENGTH)) {
546 /* separate sscanfs because length is working only for %s */
547 ret = sscanf(buf + offset, "%2s%n ", c, &nrchars);
548 ret = sscanf(c, "%2x", &cmd);
549 if (ret != 1)
550 goto fail;
551 pattern[i] = (u8)cmd;
552
553 offset += nrchars;
554 i++;
555 }
556
557 /* Each instruction is 16bit long. Check that length is even */
558 if (i % 2)
559 goto fail;
560
561 mutex_lock(&chip->lock);
562
563 ret = lp5523_load_program(engine, pattern);
564 mutex_unlock(&chip->lock);
565
566 if (ret) {
567 dev_err(&client->dev, "failed loading pattern\n");
568 return ret;
569 }
570
571 return len;
572fail:
573 dev_err(&client->dev, "wrong pattern format\n");
574 return -EINVAL;
575}
576
577static ssize_t store_engine_load(struct device *dev,
578 struct device_attribute *attr,
579 const char *buf, size_t len, int nr)
580{
581 struct i2c_client *client = to_i2c_client(dev);
582 struct lp5523_chip *chip = i2c_get_clientdata(client);
583 return lp5523_do_store_load(&chip->engines[nr - 1], buf, len);
584}
585
586#define store_load(nr) \
587static ssize_t store_engine##nr##_load(struct device *dev, \
588 struct device_attribute *attr, \
589 const char *buf, size_t len) \
590{ \
591 return store_engine_load(dev, attr, buf, len, nr); \
592}
593store_load(1)
594store_load(2)
595store_load(3)
596
597static ssize_t show_engine_mode(struct device *dev,
598 struct device_attribute *attr,
599 char *buf, int nr)
600{
601 struct i2c_client *client = to_i2c_client(dev);
602 struct lp5523_chip *chip = i2c_get_clientdata(client);
603 switch (chip->engines[nr - 1].mode) {
604 case LP5523_CMD_RUN:
605 return sprintf(buf, "run\n");
606 case LP5523_CMD_LOAD:
607 return sprintf(buf, "load\n");
608 case LP5523_CMD_DISABLED:
609 return sprintf(buf, "disabled\n");
610 default:
611 return sprintf(buf, "disabled\n");
612 }
613}
614
615#define show_mode(nr) \
616static ssize_t show_engine##nr##_mode(struct device *dev, \
617 struct device_attribute *attr, \
618 char *buf) \
619{ \
620 return show_engine_mode(dev, attr, buf, nr); \
621}
622show_mode(1)
623show_mode(2)
624show_mode(3)
625
626static ssize_t store_engine_mode(struct device *dev,
627 struct device_attribute *attr,
628 const char *buf, size_t len, int nr)
629{
630 struct i2c_client *client = to_i2c_client(dev);
631 struct lp5523_chip *chip = i2c_get_clientdata(client);
632 struct lp5523_engine *engine = &chip->engines[nr - 1];
633 mutex_lock(&chip->lock);
634
635 if (!strncmp(buf, "run", 3))
636 lp5523_set_mode(engine, LP5523_CMD_RUN);
637 else if (!strncmp(buf, "load", 4))
638 lp5523_set_mode(engine, LP5523_CMD_LOAD);
639 else if (!strncmp(buf, "disabled", 8))
640 lp5523_set_mode(engine, LP5523_CMD_DISABLED);
641
642 mutex_unlock(&chip->lock);
643 return len;
644}
645
646#define store_mode(nr) \
647static ssize_t store_engine##nr##_mode(struct device *dev, \
648 struct device_attribute *attr, \
649 const char *buf, size_t len) \
650{ \
651 return store_engine_mode(dev, attr, buf, len, nr); \
652}
653store_mode(1)
654store_mode(2)
655store_mode(3)
656
657static ssize_t show_max_current(struct device *dev,
658 struct device_attribute *attr,
659 char *buf)
660{
661 struct led_classdev *led_cdev = dev_get_drvdata(dev);
662 struct lp5523_led *led = cdev_to_led(led_cdev);
663
664 return sprintf(buf, "%d\n", led->max_current);
665}
666
667static ssize_t show_current(struct device *dev,
668 struct device_attribute *attr,
669 char *buf)
670{
671 struct led_classdev *led_cdev = dev_get_drvdata(dev);
672 struct lp5523_led *led = cdev_to_led(led_cdev);
673
674 return sprintf(buf, "%d\n", led->led_current);
675}
676
677static ssize_t store_current(struct device *dev,
678 struct device_attribute *attr,
679 const char *buf, size_t len)
680{
681 struct led_classdev *led_cdev = dev_get_drvdata(dev);
682 struct lp5523_led *led = cdev_to_led(led_cdev);
683 struct lp5523_chip *chip = led_to_lp5523(led);
684 ssize_t ret;
685 unsigned long curr;
686
687 if (strict_strtoul(buf, 0, &curr))
688 return -EINVAL;
689
690 if (curr > led->max_current)
691 return -EINVAL;
692
693 mutex_lock(&chip->lock);
694 ret = lp5523_write(chip->client,
695 LP5523_REG_LED_CURRENT_BASE + led->chan_nr,
696 (u8)curr);
697 mutex_unlock(&chip->lock);
698
699 if (ret < 0)
700 return ret;
701
702 led->led_current = (u8)curr;
703
704 return len;
705}
706
707/* led class device attributes */
708static DEVICE_ATTR(led_current, S_IRUGO | S_IWUGO, show_current, store_current);
709static DEVICE_ATTR(max_current, S_IRUGO , show_max_current, NULL);
710
711static struct attribute *lp5523_led_attributes[] = {
712 &dev_attr_led_current.attr,
713 &dev_attr_max_current.attr,
714 NULL,
715};
716
717static struct attribute_group lp5523_led_attribute_group = {
718 .attrs = lp5523_led_attributes
719};
720
721/* device attributes */
722static DEVICE_ATTR(engine1_mode, S_IRUGO | S_IWUGO,
723 show_engine1_mode, store_engine1_mode);
724static DEVICE_ATTR(engine2_mode, S_IRUGO | S_IWUGO,
725 show_engine2_mode, store_engine2_mode);
726static DEVICE_ATTR(engine3_mode, S_IRUGO | S_IWUGO,
727 show_engine3_mode, store_engine3_mode);
728static DEVICE_ATTR(engine1_leds, S_IRUGO | S_IWUGO,
729 show_engine1_leds, store_engine1_leds);
730static DEVICE_ATTR(engine2_leds, S_IRUGO | S_IWUGO,
731 show_engine2_leds, store_engine2_leds);
732static DEVICE_ATTR(engine3_leds, S_IRUGO | S_IWUGO,
733 show_engine3_leds, store_engine3_leds);
734static DEVICE_ATTR(engine1_load, S_IWUGO, NULL, store_engine1_load);
735static DEVICE_ATTR(engine2_load, S_IWUGO, NULL, store_engine2_load);
736static DEVICE_ATTR(engine3_load, S_IWUGO, NULL, store_engine3_load);
737static DEVICE_ATTR(selftest, S_IRUGO, lp5523_selftest, NULL);
738
739static struct attribute *lp5523_attributes[] = {
740 &dev_attr_engine1_mode.attr,
741 &dev_attr_engine2_mode.attr,
742 &dev_attr_engine3_mode.attr,
743 &dev_attr_selftest.attr,
744 NULL
745};
746
747static struct attribute *lp5523_engine1_attributes[] = {
748 &dev_attr_engine1_load.attr,
749 &dev_attr_engine1_leds.attr,
750 NULL
751};
752
753static struct attribute *lp5523_engine2_attributes[] = {
754 &dev_attr_engine2_load.attr,
755 &dev_attr_engine2_leds.attr,
756 NULL
757};
758
759static struct attribute *lp5523_engine3_attributes[] = {
760 &dev_attr_engine3_load.attr,
761 &dev_attr_engine3_leds.attr,
762 NULL
763};
764
765static const struct attribute_group lp5523_group = {
766 .attrs = lp5523_attributes,
767};
768
769static const struct attribute_group lp5523_engine_group[] = {
770 {.attrs = lp5523_engine1_attributes },
771 {.attrs = lp5523_engine2_attributes },
772 {.attrs = lp5523_engine3_attributes },
773};
774
775static int lp5523_register_sysfs(struct i2c_client *client)
776{
777 struct device *dev = &client->dev;
778 int ret;
779
780 ret = sysfs_create_group(&dev->kobj, &lp5523_group);
781 if (ret < 0)
782 return ret;
783
784 return 0;
785}
786
787static void lp5523_unregister_sysfs(struct i2c_client *client)
788{
789 struct lp5523_chip *chip = i2c_get_clientdata(client);
790 struct device *dev = &client->dev;
791 int i;
792
793 sysfs_remove_group(&dev->kobj, &lp5523_group);
794
795 for (i = 0; i < ARRAY_SIZE(chip->engines); i++)
796 if (chip->engines[i].mode == LP5523_CMD_LOAD)
797 sysfs_remove_group(&dev->kobj, &lp5523_engine_group[i]);
798
799 for (i = 0; i < chip->num_leds; i++)
800 sysfs_remove_group(&chip->leds[i].cdev.dev->kobj,
801 &lp5523_led_attribute_group);
802}
803
804/*--------------------------------------------------------------*/
805/* Set chip operating mode */
806/*--------------------------------------------------------------*/
807static int lp5523_set_mode(struct lp5523_engine *engine, u8 mode)
808{
809 /* engine to chip */
810 struct lp5523_chip *chip = engine_to_lp5523(engine);
811 struct i2c_client *client = chip->client;
812 struct device *dev = &client->dev;
813 int ret = 0;
814
815 /* if in that mode already do nothing, except for run */
816 if (mode == engine->mode && mode != LP5523_CMD_RUN)
817 return 0;
818
819 if (mode == LP5523_CMD_RUN) {
820 ret = lp5523_run_program(engine);
821 } else if (mode == LP5523_CMD_LOAD) {
822 lp5523_set_engine_mode(engine, LP5523_CMD_DISABLED);
823 lp5523_set_engine_mode(engine, LP5523_CMD_LOAD);
824
825 ret = sysfs_create_group(&dev->kobj, engine->attributes);
826 if (ret)
827 return ret;
828 } else if (mode == LP5523_CMD_DISABLED) {
829 lp5523_set_engine_mode(engine, LP5523_CMD_DISABLED);
830 }
831
832 /* remove load attribute from sysfs if not in load mode */
833 if (engine->mode == LP5523_CMD_LOAD && mode != LP5523_CMD_LOAD)
834 sysfs_remove_group(&dev->kobj, engine->attributes);
835
836 engine->mode = mode;
837
838 return ret;
839}
840
841/*--------------------------------------------------------------*/
842/* Probe, Attach, Remove */
843/*--------------------------------------------------------------*/
844static int __init lp5523_init_engine(struct lp5523_engine *engine, int id)
845{
846 if (id < 1 || id > LP5523_ENGINES)
847 return -1;
848 engine->id = id;
849 engine->engine_mask = LP5523_ENG_MASK_BASE >> SHIFT_MASK(id);
850 engine->prog_page = id - 1;
851 engine->mux_page = id + 2;
852 engine->attributes = &lp5523_engine_group[id - 1];
853
854 return 0;
855}
856
857static int __init lp5523_init_led(struct lp5523_led *led, struct device *dev,
858 int chan, struct lp5523_platform_data *pdata)
859{
860 char name[32];
861 int res;
862
863 if (chan >= LP5523_LEDS)
864 return -EINVAL;
865
866 if (pdata->led_config[chan].led_current) {
867 led->led_current = pdata->led_config[chan].led_current;
868 led->max_current = pdata->led_config[chan].max_current;
869 led->chan_nr = pdata->led_config[chan].chan_nr;
870
871 if (led->chan_nr >= LP5523_LEDS) {
872 dev_err(dev, "Use channel numbers between 0 and %d\n",
873 LP5523_LEDS - 1);
874 return -EINVAL;
875 }
876
877 snprintf(name, 32, "lp5523:channel%d", chan);
878
879 led->cdev.name = name;
880 led->cdev.brightness_set = lp5523_set_brightness;
881 res = led_classdev_register(dev, &led->cdev);
882 if (res < 0) {
883 dev_err(dev, "couldn't register led on channel %d\n",
884 chan);
885 return res;
886 }
887 res = sysfs_create_group(&led->cdev.dev->kobj,
888 &lp5523_led_attribute_group);
889 if (res < 0) {
890 dev_err(dev, "couldn't register current attribute\n");
891 led_classdev_unregister(&led->cdev);
892 return res;
893 }
894 } else {
895 led->led_current = 0;
896 }
897 return 0;
898}
899
900static struct i2c_driver lp5523_driver;
901
902static int lp5523_probe(struct i2c_client *client,
903 const struct i2c_device_id *id)
904{
905 struct lp5523_chip *chip;
906 struct lp5523_platform_data *pdata;
907 int ret, i, led;
908
909 chip = kzalloc(sizeof(*chip), GFP_KERNEL);
910 if (!chip)
911 return -ENOMEM;
912
913 i2c_set_clientdata(client, chip);
914 chip->client = client;
915
916 pdata = client->dev.platform_data;
917
918 if (!pdata) {
919 dev_err(&client->dev, "no platform data\n");
920 ret = -EINVAL;
921 goto fail1;
922 }
923
924 mutex_init(&chip->lock);
925
926 chip->pdata = pdata;
927
928 if (pdata->setup_resources) {
929 ret = pdata->setup_resources();
930 if (ret < 0)
931 goto fail1;
932 }
933
934 if (pdata->enable) {
935 pdata->enable(0);
936 usleep_range(1000, 10000);
937 pdata->enable(1);
938 usleep_range(1000, 10000); /* Spec says min 500us */
939 }
940
941 ret = lp5523_detect(client);
942 if (ret)
943 goto fail2;
944
945 dev_info(&client->dev, "LP5523 Programmable led chip found\n");
946
947 /* Initialize engines */
948 for (i = 0; i < ARRAY_SIZE(chip->engines); i++) {
949 ret = lp5523_init_engine(&chip->engines[i], i + 1);
950 if (ret) {
951 dev_err(&client->dev, "error initializing engine\n");
952 goto fail2;
953 }
954 }
955 ret = lp5523_configure(client);
956 if (ret < 0) {
957 dev_err(&client->dev, "error configuring chip\n");
958 goto fail2;
959 }
960
961 /* Initialize leds */
962 chip->num_channels = pdata->num_channels;
963 chip->num_leds = 0;
964 led = 0;
965 for (i = 0; i < pdata->num_channels; i++) {
966 /* Do not initialize channels that are not connected */
967 if (pdata->led_config[i].led_current == 0)
968 continue;
969
970 ret = lp5523_init_led(&chip->leds[led], &client->dev, i, pdata);
971 if (ret) {
972 dev_err(&client->dev, "error initializing leds\n");
973 goto fail3;
974 }
975 chip->num_leds++;
976
977 chip->leds[led].id = led;
978 /* Set LED current */
979 lp5523_write(client,
980 LP5523_REG_LED_CURRENT_BASE + chip->leds[led].chan_nr,
981 chip->leds[led].led_current);
982
983 INIT_WORK(&(chip->leds[led].brightness_work),
984 lp5523_led_brightness_work);
985
986 led++;
987 }
988
989 ret = lp5523_register_sysfs(client);
990 if (ret) {
991 dev_err(&client->dev, "registering sysfs failed\n");
992 goto fail3;
993 }
994 return ret;
995fail3:
996 for (i = 0; i < chip->num_leds; i++) {
997 led_classdev_unregister(&chip->leds[i].cdev);
998 cancel_work_sync(&chip->leds[i].brightness_work);
999 }
1000fail2:
1001 if (pdata->enable)
1002 pdata->enable(0);
1003 if (pdata->release_resources)
1004 pdata->release_resources();
1005fail1:
1006 kfree(chip);
1007 return ret;
1008}
1009
1010static int lp5523_remove(struct i2c_client *client)
1011{
1012 struct lp5523_chip *chip = i2c_get_clientdata(client);
1013 int i;
1014
1015 lp5523_unregister_sysfs(client);
1016
1017 for (i = 0; i < chip->num_leds; i++) {
1018 led_classdev_unregister(&chip->leds[i].cdev);
1019 cancel_work_sync(&chip->leds[i].brightness_work);
1020 }
1021
1022 if (chip->pdata->enable)
1023 chip->pdata->enable(0);
1024 if (chip->pdata->release_resources)
1025 chip->pdata->release_resources();
1026 kfree(chip);
1027 return 0;
1028}
1029
1030static const struct i2c_device_id lp5523_id[] = {
1031 { "lp5523", 0 },
1032 { }
1033};
1034
1035MODULE_DEVICE_TABLE(i2c, lp5523_id);
1036
1037static struct i2c_driver lp5523_driver = {
1038 .driver = {
1039 .name = "lp5523",
1040 },
1041 .probe = lp5523_probe,
1042 .remove = lp5523_remove,
1043 .id_table = lp5523_id,
1044};
1045
1046static int __init lp5523_init(void)
1047{
1048 int ret;
1049
1050 ret = i2c_add_driver(&lp5523_driver);
1051
1052 if (ret < 0)
1053 printk(KERN_ALERT "Adding lp5523 driver failed\n");
1054
1055 return ret;
1056}
1057
1058static void __exit lp5523_exit(void)
1059{
1060 i2c_del_driver(&lp5523_driver);
1061}
1062
1063module_init(lp5523_init);
1064module_exit(lp5523_exit);
1065
1066MODULE_AUTHOR("Mathias Nyman <mathias.nyman@nokia.com>");
1067MODULE_DESCRIPTION("LP5523 LED engine");
1068MODULE_LICENSE("GPL");