root/drivers/leds/leds-lp5523.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. lp5523_wait_opmode_done
  2. lp5523_set_led_current
  3. lp5523_post_init_device
  4. lp5523_load_engine
  5. lp5523_load_engine_and_select_page
  6. lp5523_stop_all_engines
  7. lp5523_stop_engine
  8. lp5523_turn_off_channels
  9. lp5523_run_engine
  10. lp5523_init_program_engine
  11. lp5523_update_program_memory
  12. lp5523_firmware_loaded
  13. show_engine_mode
  14. show_mode
  15. store_mode
  16. lp5523_mux_to_array
  17. show_engine_leds
  18. show_leds
  19. store_engine_leds
  20. store_leds
  21. store_load
  22. show_master_fader
  23. show_fader
  24. store_fader
  25. store_master_fader_leds
  26. lp5523_led_brightness
  27. lp5523_probe
  28. lp5523_remove

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * lp5523.c - LP5523, LP55231 LED Driver
   4  *
   5  * Copyright (C) 2010 Nokia Corporation
   6  * Copyright (C) 2012 Texas Instruments
   7  *
   8  * Contact: Samu Onkalo <samu.p.onkalo@nokia.com>
   9  *          Milo(Woogyom) Kim <milo.kim@ti.com>
  10  */
  11 
  12 #include <linux/delay.h>
  13 #include <linux/firmware.h>
  14 #include <linux/i2c.h>
  15 #include <linux/leds.h>
  16 #include <linux/module.h>
  17 #include <linux/mutex.h>
  18 #include <linux/of.h>
  19 #include <linux/platform_data/leds-lp55xx.h>
  20 #include <linux/slab.h>
  21 
  22 #include "leds-lp55xx-common.h"
  23 
  24 #define LP5523_PROGRAM_LENGTH           32      /* bytes */
  25 /* Memory is used like this:
  26    0x00 engine 1 program
  27    0x10 engine 2 program
  28    0x20 engine 3 program
  29    0x30 engine 1 muxing info
  30    0x40 engine 2 muxing info
  31    0x50 engine 3 muxing info
  32 */
  33 #define LP5523_MAX_LEDS                 9
  34 
  35 /* Registers */
  36 #define LP5523_REG_ENABLE               0x00
  37 #define LP5523_REG_OP_MODE              0x01
  38 #define LP5523_REG_ENABLE_LEDS_MSB      0x04
  39 #define LP5523_REG_ENABLE_LEDS_LSB      0x05
  40 #define LP5523_REG_LED_CTRL_BASE        0x06
  41 #define LP5523_REG_LED_PWM_BASE         0x16
  42 #define LP5523_REG_LED_CURRENT_BASE     0x26
  43 #define LP5523_REG_CONFIG               0x36
  44 #define LP5523_REG_STATUS               0x3A
  45 #define LP5523_REG_RESET                0x3D
  46 #define LP5523_REG_LED_TEST_CTRL        0x41
  47 #define LP5523_REG_LED_TEST_ADC         0x42
  48 #define LP5523_REG_MASTER_FADER_BASE    0x48
  49 #define LP5523_REG_CH1_PROG_START       0x4C
  50 #define LP5523_REG_CH2_PROG_START       0x4D
  51 #define LP5523_REG_CH3_PROG_START       0x4E
  52 #define LP5523_REG_PROG_PAGE_SEL        0x4F
  53 #define LP5523_REG_PROG_MEM             0x50
  54 
  55 /* Bit description in registers */
  56 #define LP5523_ENABLE                   0x40
  57 #define LP5523_AUTO_INC                 0x40
  58 #define LP5523_PWR_SAVE                 0x20
  59 #define LP5523_PWM_PWR_SAVE             0x04
  60 #define LP5523_CP_AUTO                  0x18
  61 #define LP5523_AUTO_CLK                 0x02
  62 
  63 #define LP5523_EN_LEDTEST               0x80
  64 #define LP5523_LEDTEST_DONE             0x80
  65 #define LP5523_RESET                    0xFF
  66 #define LP5523_ADC_SHORTCIRC_LIM        80
  67 #define LP5523_EXT_CLK_USED             0x08
  68 #define LP5523_ENG_STATUS_MASK          0x07
  69 
  70 #define LP5523_FADER_MAPPING_MASK       0xC0
  71 #define LP5523_FADER_MAPPING_SHIFT      6
  72 
  73 /* Memory Page Selection */
  74 #define LP5523_PAGE_ENG1                0
  75 #define LP5523_PAGE_ENG2                1
  76 #define LP5523_PAGE_ENG3                2
  77 #define LP5523_PAGE_MUX1                3
  78 #define LP5523_PAGE_MUX2                4
  79 #define LP5523_PAGE_MUX3                5
  80 
  81 /* Program Memory Operations */
  82 #define LP5523_MODE_ENG1_M              0x30    /* Operation Mode Register */
  83 #define LP5523_MODE_ENG2_M              0x0C
  84 #define LP5523_MODE_ENG3_M              0x03
  85 #define LP5523_LOAD_ENG1                0x10
  86 #define LP5523_LOAD_ENG2                0x04
  87 #define LP5523_LOAD_ENG3                0x01
  88 
  89 #define LP5523_ENG1_IS_LOADING(mode)    \
  90         ((mode & LP5523_MODE_ENG1_M) == LP5523_LOAD_ENG1)
  91 #define LP5523_ENG2_IS_LOADING(mode)    \
  92         ((mode & LP5523_MODE_ENG2_M) == LP5523_LOAD_ENG2)
  93 #define LP5523_ENG3_IS_LOADING(mode)    \
  94         ((mode & LP5523_MODE_ENG3_M) == LP5523_LOAD_ENG3)
  95 
  96 #define LP5523_EXEC_ENG1_M              0x30    /* Enable Register */
  97 #define LP5523_EXEC_ENG2_M              0x0C
  98 #define LP5523_EXEC_ENG3_M              0x03
  99 #define LP5523_EXEC_M                   0x3F
 100 #define LP5523_RUN_ENG1                 0x20
 101 #define LP5523_RUN_ENG2                 0x08
 102 #define LP5523_RUN_ENG3                 0x02
 103 
 104 #define LED_ACTIVE(mux, led)            (!!(mux & (0x0001 << led)))
 105 
 106 enum lp5523_chip_id {
 107         LP5523,
 108         LP55231,
 109 };
 110 
 111 static int lp5523_init_program_engine(struct lp55xx_chip *chip);
 112 
 113 static inline void lp5523_wait_opmode_done(void)
 114 {
 115         usleep_range(1000, 2000);
 116 }
 117 
 118 static void lp5523_set_led_current(struct lp55xx_led *led, u8 led_current)
 119 {
 120         led->led_current = led_current;
 121         lp55xx_write(led->chip, LP5523_REG_LED_CURRENT_BASE + led->chan_nr,
 122                 led_current);
 123 }
 124 
 125 static int lp5523_post_init_device(struct lp55xx_chip *chip)
 126 {
 127         int ret;
 128 
 129         ret = lp55xx_write(chip, LP5523_REG_ENABLE, LP5523_ENABLE);
 130         if (ret)
 131                 return ret;
 132 
 133         /* Chip startup time is 500 us, 1 - 2 ms gives some margin */
 134         usleep_range(1000, 2000);
 135 
 136         ret = lp55xx_write(chip, LP5523_REG_CONFIG,
 137                             LP5523_AUTO_INC | LP5523_PWR_SAVE |
 138                             LP5523_CP_AUTO | LP5523_AUTO_CLK |
 139                             LP5523_PWM_PWR_SAVE);
 140         if (ret)
 141                 return ret;
 142 
 143         /* turn on all leds */
 144         ret = lp55xx_write(chip, LP5523_REG_ENABLE_LEDS_MSB, 0x01);
 145         if (ret)
 146                 return ret;
 147 
 148         ret = lp55xx_write(chip, LP5523_REG_ENABLE_LEDS_LSB, 0xff);
 149         if (ret)
 150                 return ret;
 151 
 152         return lp5523_init_program_engine(chip);
 153 }
 154 
 155 static void lp5523_load_engine(struct lp55xx_chip *chip)
 156 {
 157         enum lp55xx_engine_index idx = chip->engine_idx;
 158         static const u8 mask[] = {
 159                 [LP55XX_ENGINE_1] = LP5523_MODE_ENG1_M,
 160                 [LP55XX_ENGINE_2] = LP5523_MODE_ENG2_M,
 161                 [LP55XX_ENGINE_3] = LP5523_MODE_ENG3_M,
 162         };
 163 
 164         static const u8 val[] = {
 165                 [LP55XX_ENGINE_1] = LP5523_LOAD_ENG1,
 166                 [LP55XX_ENGINE_2] = LP5523_LOAD_ENG2,
 167                 [LP55XX_ENGINE_3] = LP5523_LOAD_ENG3,
 168         };
 169 
 170         lp55xx_update_bits(chip, LP5523_REG_OP_MODE, mask[idx], val[idx]);
 171 
 172         lp5523_wait_opmode_done();
 173 }
 174 
 175 static void lp5523_load_engine_and_select_page(struct lp55xx_chip *chip)
 176 {
 177         enum lp55xx_engine_index idx = chip->engine_idx;
 178         static const u8 page_sel[] = {
 179                 [LP55XX_ENGINE_1] = LP5523_PAGE_ENG1,
 180                 [LP55XX_ENGINE_2] = LP5523_PAGE_ENG2,
 181                 [LP55XX_ENGINE_3] = LP5523_PAGE_ENG3,
 182         };
 183 
 184         lp5523_load_engine(chip);
 185 
 186         lp55xx_write(chip, LP5523_REG_PROG_PAGE_SEL, page_sel[idx]);
 187 }
 188 
 189 static void lp5523_stop_all_engines(struct lp55xx_chip *chip)
 190 {
 191         lp55xx_write(chip, LP5523_REG_OP_MODE, 0);
 192         lp5523_wait_opmode_done();
 193 }
 194 
 195 static void lp5523_stop_engine(struct lp55xx_chip *chip)
 196 {
 197         enum lp55xx_engine_index idx = chip->engine_idx;
 198         static const u8 mask[] = {
 199                 [LP55XX_ENGINE_1] = LP5523_MODE_ENG1_M,
 200                 [LP55XX_ENGINE_2] = LP5523_MODE_ENG2_M,
 201                 [LP55XX_ENGINE_3] = LP5523_MODE_ENG3_M,
 202         };
 203 
 204         lp55xx_update_bits(chip, LP5523_REG_OP_MODE, mask[idx], 0);
 205 
 206         lp5523_wait_opmode_done();
 207 }
 208 
 209 static void lp5523_turn_off_channels(struct lp55xx_chip *chip)
 210 {
 211         int i;
 212 
 213         for (i = 0; i < LP5523_MAX_LEDS; i++)
 214                 lp55xx_write(chip, LP5523_REG_LED_PWM_BASE + i, 0);
 215 }
 216 
 217 static void lp5523_run_engine(struct lp55xx_chip *chip, bool start)
 218 {
 219         int ret;
 220         u8 mode;
 221         u8 exec;
 222 
 223         /* stop engine */
 224         if (!start) {
 225                 lp5523_stop_engine(chip);
 226                 lp5523_turn_off_channels(chip);
 227                 return;
 228         }
 229 
 230         /*
 231          * To run the engine,
 232          * operation mode and enable register should updated at the same time
 233          */
 234 
 235         ret = lp55xx_read(chip, LP5523_REG_OP_MODE, &mode);
 236         if (ret)
 237                 return;
 238 
 239         ret = lp55xx_read(chip, LP5523_REG_ENABLE, &exec);
 240         if (ret)
 241                 return;
 242 
 243         /* change operation mode to RUN only when each engine is loading */
 244         if (LP5523_ENG1_IS_LOADING(mode)) {
 245                 mode = (mode & ~LP5523_MODE_ENG1_M) | LP5523_RUN_ENG1;
 246                 exec = (exec & ~LP5523_EXEC_ENG1_M) | LP5523_RUN_ENG1;
 247         }
 248 
 249         if (LP5523_ENG2_IS_LOADING(mode)) {
 250                 mode = (mode & ~LP5523_MODE_ENG2_M) | LP5523_RUN_ENG2;
 251                 exec = (exec & ~LP5523_EXEC_ENG2_M) | LP5523_RUN_ENG2;
 252         }
 253 
 254         if (LP5523_ENG3_IS_LOADING(mode)) {
 255                 mode = (mode & ~LP5523_MODE_ENG3_M) | LP5523_RUN_ENG3;
 256                 exec = (exec & ~LP5523_EXEC_ENG3_M) | LP5523_RUN_ENG3;
 257         }
 258 
 259         lp55xx_write(chip, LP5523_REG_OP_MODE, mode);
 260         lp5523_wait_opmode_done();
 261 
 262         lp55xx_update_bits(chip, LP5523_REG_ENABLE, LP5523_EXEC_M, exec);
 263 }
 264 
 265 static int lp5523_init_program_engine(struct lp55xx_chip *chip)
 266 {
 267         int i;
 268         int j;
 269         int ret;
 270         u8 status;
 271         /* one pattern per engine setting LED MUX start and stop addresses */
 272         static const u8 pattern[][LP5523_PROGRAM_LENGTH] =  {
 273                 { 0x9c, 0x30, 0x9c, 0xb0, 0x9d, 0x80, 0xd8, 0x00, 0},
 274                 { 0x9c, 0x40, 0x9c, 0xc0, 0x9d, 0x80, 0xd8, 0x00, 0},
 275                 { 0x9c, 0x50, 0x9c, 0xd0, 0x9d, 0x80, 0xd8, 0x00, 0},
 276         };
 277 
 278         /* hardcode 32 bytes of memory for each engine from program memory */
 279         ret = lp55xx_write(chip, LP5523_REG_CH1_PROG_START, 0x00);
 280         if (ret)
 281                 return ret;
 282 
 283         ret = lp55xx_write(chip, LP5523_REG_CH2_PROG_START, 0x10);
 284         if (ret)
 285                 return ret;
 286 
 287         ret = lp55xx_write(chip, LP5523_REG_CH3_PROG_START, 0x20);
 288         if (ret)
 289                 return ret;
 290 
 291         /* write LED MUX address space for each engine */
 292         for (i = LP55XX_ENGINE_1; i <= LP55XX_ENGINE_3; i++) {
 293                 chip->engine_idx = i;
 294                 lp5523_load_engine_and_select_page(chip);
 295 
 296                 for (j = 0; j < LP5523_PROGRAM_LENGTH; j++) {
 297                         ret = lp55xx_write(chip, LP5523_REG_PROG_MEM + j,
 298                                         pattern[i - 1][j]);
 299                         if (ret)
 300                                 goto out;
 301                 }
 302         }
 303 
 304         lp5523_run_engine(chip, true);
 305 
 306         /* Let the programs run for couple of ms and check the engine status */
 307         usleep_range(3000, 6000);
 308         ret = lp55xx_read(chip, LP5523_REG_STATUS, &status);
 309         if (ret)
 310                 return ret;
 311         status &= LP5523_ENG_STATUS_MASK;
 312 
 313         if (status != LP5523_ENG_STATUS_MASK) {
 314                 dev_err(&chip->cl->dev,
 315                         "could not configure LED engine, status = 0x%.2x\n",
 316                         status);
 317                 ret = -1;
 318         }
 319 
 320 out:
 321         lp5523_stop_all_engines(chip);
 322         return ret;
 323 }
 324 
 325 static int lp5523_update_program_memory(struct lp55xx_chip *chip,
 326                                         const u8 *data, size_t size)
 327 {
 328         u8 pattern[LP5523_PROGRAM_LENGTH] = {0};
 329         unsigned cmd;
 330         char c[3];
 331         int nrchars;
 332         int ret;
 333         int offset = 0;
 334         int i = 0;
 335 
 336         while ((offset < size - 1) && (i < LP5523_PROGRAM_LENGTH)) {
 337                 /* separate sscanfs because length is working only for %s */
 338                 ret = sscanf(data + offset, "%2s%n ", c, &nrchars);
 339                 if (ret != 1)
 340                         goto err;
 341 
 342                 ret = sscanf(c, "%2x", &cmd);
 343                 if (ret != 1)
 344                         goto err;
 345 
 346                 pattern[i] = (u8)cmd;
 347                 offset += nrchars;
 348                 i++;
 349         }
 350 
 351         /* Each instruction is 16bit long. Check that length is even */
 352         if (i % 2)
 353                 goto err;
 354 
 355         for (i = 0; i < LP5523_PROGRAM_LENGTH; i++) {
 356                 ret = lp55xx_write(chip, LP5523_REG_PROG_MEM + i, pattern[i]);
 357                 if (ret)
 358                         return -EINVAL;
 359         }
 360 
 361         return size;
 362 
 363 err:
 364         dev_err(&chip->cl->dev, "wrong pattern format\n");
 365         return -EINVAL;
 366 }
 367 
 368 static void lp5523_firmware_loaded(struct lp55xx_chip *chip)
 369 {
 370         const struct firmware *fw = chip->fw;
 371 
 372         if (fw->size > LP5523_PROGRAM_LENGTH) {
 373                 dev_err(&chip->cl->dev, "firmware data size overflow: %zu\n",
 374                         fw->size);
 375                 return;
 376         }
 377 
 378         /*
 379          * Program memory sequence
 380          *  1) set engine mode to "LOAD"
 381          *  2) write firmware data into program memory
 382          */
 383 
 384         lp5523_load_engine_and_select_page(chip);
 385         lp5523_update_program_memory(chip, fw->data, fw->size);
 386 }
 387 
 388 static ssize_t show_engine_mode(struct device *dev,
 389                                 struct device_attribute *attr,
 390                                 char *buf, int nr)
 391 {
 392         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 393         struct lp55xx_chip *chip = led->chip;
 394         enum lp55xx_engine_mode mode = chip->engines[nr - 1].mode;
 395 
 396         switch (mode) {
 397         case LP55XX_ENGINE_RUN:
 398                 return sprintf(buf, "run\n");
 399         case LP55XX_ENGINE_LOAD:
 400                 return sprintf(buf, "load\n");
 401         case LP55XX_ENGINE_DISABLED:
 402         default:
 403                 return sprintf(buf, "disabled\n");
 404         }
 405 }
 406 show_mode(1)
 407 show_mode(2)
 408 show_mode(3)
 409 
 410 static ssize_t store_engine_mode(struct device *dev,
 411                                  struct device_attribute *attr,
 412                                  const char *buf, size_t len, int nr)
 413 {
 414         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 415         struct lp55xx_chip *chip = led->chip;
 416         struct lp55xx_engine *engine = &chip->engines[nr - 1];
 417 
 418         mutex_lock(&chip->lock);
 419 
 420         chip->engine_idx = nr;
 421 
 422         if (!strncmp(buf, "run", 3)) {
 423                 lp5523_run_engine(chip, true);
 424                 engine->mode = LP55XX_ENGINE_RUN;
 425         } else if (!strncmp(buf, "load", 4)) {
 426                 lp5523_stop_engine(chip);
 427                 lp5523_load_engine(chip);
 428                 engine->mode = LP55XX_ENGINE_LOAD;
 429         } else if (!strncmp(buf, "disabled", 8)) {
 430                 lp5523_stop_engine(chip);
 431                 engine->mode = LP55XX_ENGINE_DISABLED;
 432         }
 433 
 434         mutex_unlock(&chip->lock);
 435 
 436         return len;
 437 }
 438 store_mode(1)
 439 store_mode(2)
 440 store_mode(3)
 441 
 442 static int lp5523_mux_parse(const char *buf, u16 *mux, size_t len)
 443 {
 444         u16 tmp_mux = 0;
 445         int i;
 446 
 447         len = min_t(int, len, LP5523_MAX_LEDS);
 448 
 449         for (i = 0; i < len; i++) {
 450                 switch (buf[i]) {
 451                 case '1':
 452                         tmp_mux |= (1 << i);
 453                         break;
 454                 case '0':
 455                         break;
 456                 case '\n':
 457                         i = len;
 458                         break;
 459                 default:
 460                         return -1;
 461                 }
 462         }
 463         *mux = tmp_mux;
 464 
 465         return 0;
 466 }
 467 
 468 static void lp5523_mux_to_array(u16 led_mux, char *array)
 469 {
 470         int i, pos = 0;
 471         for (i = 0; i < LP5523_MAX_LEDS; i++)
 472                 pos += sprintf(array + pos, "%x", LED_ACTIVE(led_mux, i));
 473 
 474         array[pos] = '\0';
 475 }
 476 
 477 static ssize_t show_engine_leds(struct device *dev,
 478                             struct device_attribute *attr,
 479                             char *buf, int nr)
 480 {
 481         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 482         struct lp55xx_chip *chip = led->chip;
 483         char mux[LP5523_MAX_LEDS + 1];
 484 
 485         lp5523_mux_to_array(chip->engines[nr - 1].led_mux, mux);
 486 
 487         return sprintf(buf, "%s\n", mux);
 488 }
 489 show_leds(1)
 490 show_leds(2)
 491 show_leds(3)
 492 
 493 static int lp5523_load_mux(struct lp55xx_chip *chip, u16 mux, int nr)
 494 {
 495         struct lp55xx_engine *engine = &chip->engines[nr - 1];
 496         int ret;
 497         static const u8 mux_page[] = {
 498                 [LP55XX_ENGINE_1] = LP5523_PAGE_MUX1,
 499                 [LP55XX_ENGINE_2] = LP5523_PAGE_MUX2,
 500                 [LP55XX_ENGINE_3] = LP5523_PAGE_MUX3,
 501         };
 502 
 503         lp5523_load_engine(chip);
 504 
 505         ret = lp55xx_write(chip, LP5523_REG_PROG_PAGE_SEL, mux_page[nr]);
 506         if (ret)
 507                 return ret;
 508 
 509         ret = lp55xx_write(chip, LP5523_REG_PROG_MEM , (u8)(mux >> 8));
 510         if (ret)
 511                 return ret;
 512 
 513         ret = lp55xx_write(chip, LP5523_REG_PROG_MEM + 1, (u8)(mux));
 514         if (ret)
 515                 return ret;
 516 
 517         engine->led_mux = mux;
 518         return 0;
 519 }
 520 
 521 static ssize_t store_engine_leds(struct device *dev,
 522                              struct device_attribute *attr,
 523                              const char *buf, size_t len, int nr)
 524 {
 525         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 526         struct lp55xx_chip *chip = led->chip;
 527         struct lp55xx_engine *engine = &chip->engines[nr - 1];
 528         u16 mux = 0;
 529         ssize_t ret;
 530 
 531         if (lp5523_mux_parse(buf, &mux, len))
 532                 return -EINVAL;
 533 
 534         mutex_lock(&chip->lock);
 535 
 536         chip->engine_idx = nr;
 537         ret = -EINVAL;
 538 
 539         if (engine->mode != LP55XX_ENGINE_LOAD)
 540                 goto leave;
 541 
 542         if (lp5523_load_mux(chip, mux, nr))
 543                 goto leave;
 544 
 545         ret = len;
 546 leave:
 547         mutex_unlock(&chip->lock);
 548         return ret;
 549 }
 550 store_leds(1)
 551 store_leds(2)
 552 store_leds(3)
 553 
 554 static ssize_t store_engine_load(struct device *dev,
 555                              struct device_attribute *attr,
 556                              const char *buf, size_t len, int nr)
 557 {
 558         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 559         struct lp55xx_chip *chip = led->chip;
 560         int ret;
 561 
 562         mutex_lock(&chip->lock);
 563 
 564         chip->engine_idx = nr;
 565         lp5523_load_engine_and_select_page(chip);
 566         ret = lp5523_update_program_memory(chip, buf, len);
 567 
 568         mutex_unlock(&chip->lock);
 569 
 570         return ret;
 571 }
 572 store_load(1)
 573 store_load(2)
 574 store_load(3)
 575 
 576 static ssize_t lp5523_selftest(struct device *dev,
 577                                struct device_attribute *attr,
 578                                char *buf)
 579 {
 580         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 581         struct lp55xx_chip *chip = led->chip;
 582         struct lp55xx_platform_data *pdata = chip->pdata;
 583         int i, ret, pos = 0;
 584         u8 status, adc, vdd;
 585 
 586         mutex_lock(&chip->lock);
 587 
 588         ret = lp55xx_read(chip, LP5523_REG_STATUS, &status);
 589         if (ret < 0)
 590                 goto fail;
 591 
 592         /* Check that ext clock is really in use if requested */
 593         if (pdata->clock_mode == LP55XX_CLOCK_EXT) {
 594                 if  ((status & LP5523_EXT_CLK_USED) == 0)
 595                         goto fail;
 596         }
 597 
 598         /* Measure VDD (i.e. VBAT) first (channel 16 corresponds to VDD) */
 599         lp55xx_write(chip, LP5523_REG_LED_TEST_CTRL, LP5523_EN_LEDTEST | 16);
 600         usleep_range(3000, 6000); /* ADC conversion time is typically 2.7 ms */
 601         ret = lp55xx_read(chip, LP5523_REG_STATUS, &status);
 602         if (ret < 0)
 603                 goto fail;
 604 
 605         if (!(status & LP5523_LEDTEST_DONE))
 606                 usleep_range(3000, 6000); /* Was not ready. Wait little bit */
 607 
 608         ret = lp55xx_read(chip, LP5523_REG_LED_TEST_ADC, &vdd);
 609         if (ret < 0)
 610                 goto fail;
 611 
 612         vdd--;  /* There may be some fluctuation in measurement */
 613 
 614         for (i = 0; i < LP5523_MAX_LEDS; i++) {
 615                 /* Skip non-existing channels */
 616                 if (pdata->led_config[i].led_current == 0)
 617                         continue;
 618 
 619                 /* Set default current */
 620                 lp55xx_write(chip, LP5523_REG_LED_CURRENT_BASE + i,
 621                         pdata->led_config[i].led_current);
 622 
 623                 lp55xx_write(chip, LP5523_REG_LED_PWM_BASE + i, 0xff);
 624                 /* let current stabilize 2 - 4ms before measurements start */
 625                 usleep_range(2000, 4000);
 626                 lp55xx_write(chip, LP5523_REG_LED_TEST_CTRL,
 627                              LP5523_EN_LEDTEST | i);
 628                 /* ADC conversion time is 2.7 ms typically */
 629                 usleep_range(3000, 6000);
 630                 ret = lp55xx_read(chip, LP5523_REG_STATUS, &status);
 631                 if (ret < 0)
 632                         goto fail;
 633 
 634                 if (!(status & LP5523_LEDTEST_DONE))
 635                         usleep_range(3000, 6000);/* Was not ready. Wait. */
 636 
 637                 ret = lp55xx_read(chip, LP5523_REG_LED_TEST_ADC, &adc);
 638                 if (ret < 0)
 639                         goto fail;
 640 
 641                 if (adc >= vdd || adc < LP5523_ADC_SHORTCIRC_LIM)
 642                         pos += sprintf(buf + pos, "LED %d FAIL\n", i);
 643 
 644                 lp55xx_write(chip, LP5523_REG_LED_PWM_BASE + i, 0x00);
 645 
 646                 /* Restore current */
 647                 lp55xx_write(chip, LP5523_REG_LED_CURRENT_BASE + i,
 648                         led->led_current);
 649                 led++;
 650         }
 651         if (pos == 0)
 652                 pos = sprintf(buf, "OK\n");
 653         goto release_lock;
 654 fail:
 655         pos = sprintf(buf, "FAIL\n");
 656 
 657 release_lock:
 658         mutex_unlock(&chip->lock);
 659 
 660         return pos;
 661 }
 662 
 663 #define show_fader(nr)                                          \
 664 static ssize_t show_master_fader##nr(struct device *dev,        \
 665                             struct device_attribute *attr,      \
 666                             char *buf)                          \
 667 {                                                               \
 668         return show_master_fader(dev, attr, buf, nr);           \
 669 }
 670 
 671 #define store_fader(nr)                                         \
 672 static ssize_t store_master_fader##nr(struct device *dev,       \
 673                              struct device_attribute *attr,     \
 674                              const char *buf, size_t len)       \
 675 {                                                               \
 676         return store_master_fader(dev, attr, buf, len, nr);     \
 677 }
 678 
 679 static ssize_t show_master_fader(struct device *dev,
 680                                  struct device_attribute *attr,
 681                                  char *buf, int nr)
 682 {
 683         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 684         struct lp55xx_chip *chip = led->chip;
 685         int ret;
 686         u8 val;
 687 
 688         mutex_lock(&chip->lock);
 689         ret = lp55xx_read(chip, LP5523_REG_MASTER_FADER_BASE + nr - 1, &val);
 690         mutex_unlock(&chip->lock);
 691 
 692         if (ret == 0)
 693                 ret = sprintf(buf, "%u\n", val);
 694 
 695         return ret;
 696 }
 697 show_fader(1)
 698 show_fader(2)
 699 show_fader(3)
 700 
 701 static ssize_t store_master_fader(struct device *dev,
 702                                   struct device_attribute *attr,
 703                                   const char *buf, size_t len, int nr)
 704 {
 705         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 706         struct lp55xx_chip *chip = led->chip;
 707         int ret;
 708         unsigned long val;
 709 
 710         if (kstrtoul(buf, 0, &val))
 711                 return -EINVAL;
 712 
 713         if (val > 0xff)
 714                 return -EINVAL;
 715 
 716         mutex_lock(&chip->lock);
 717         ret = lp55xx_write(chip, LP5523_REG_MASTER_FADER_BASE + nr - 1,
 718                            (u8)val);
 719         mutex_unlock(&chip->lock);
 720 
 721         if (ret == 0)
 722                 ret = len;
 723 
 724         return ret;
 725 }
 726 store_fader(1)
 727 store_fader(2)
 728 store_fader(3)
 729 
 730 static ssize_t show_master_fader_leds(struct device *dev,
 731                                       struct device_attribute *attr,
 732                                       char *buf)
 733 {
 734         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 735         struct lp55xx_chip *chip = led->chip;
 736         int i, ret, pos = 0;
 737         u8 val;
 738 
 739         mutex_lock(&chip->lock);
 740 
 741         for (i = 0; i < LP5523_MAX_LEDS; i++) {
 742                 ret = lp55xx_read(chip, LP5523_REG_LED_CTRL_BASE + i, &val);
 743                 if (ret)
 744                         goto leave;
 745 
 746                 val = (val & LP5523_FADER_MAPPING_MASK)
 747                         >> LP5523_FADER_MAPPING_SHIFT;
 748                 if (val > 3) {
 749                         ret = -EINVAL;
 750                         goto leave;
 751                 }
 752                 buf[pos++] = val + '0';
 753         }
 754         buf[pos++] = '\n';
 755         ret = pos;
 756 leave:
 757         mutex_unlock(&chip->lock);
 758         return ret;
 759 }
 760 
 761 static ssize_t store_master_fader_leds(struct device *dev,
 762                                        struct device_attribute *attr,
 763                                        const char *buf, size_t len)
 764 {
 765         struct lp55xx_led *led = i2c_get_clientdata(to_i2c_client(dev));
 766         struct lp55xx_chip *chip = led->chip;
 767         int i, n, ret;
 768         u8 val;
 769 
 770         n = min_t(int, len, LP5523_MAX_LEDS);
 771 
 772         mutex_lock(&chip->lock);
 773 
 774         for (i = 0; i < n; i++) {
 775                 if (buf[i] >= '0' && buf[i] <= '3') {
 776                         val = (buf[i] - '0') << LP5523_FADER_MAPPING_SHIFT;
 777                         ret = lp55xx_update_bits(chip,
 778                                                  LP5523_REG_LED_CTRL_BASE + i,
 779                                                  LP5523_FADER_MAPPING_MASK,
 780                                                  val);
 781                         if (ret)
 782                                 goto leave;
 783                 } else {
 784                         ret = -EINVAL;
 785                         goto leave;
 786                 }
 787         }
 788         ret = len;
 789 leave:
 790         mutex_unlock(&chip->lock);
 791         return ret;
 792 }
 793 
 794 static int lp5523_led_brightness(struct lp55xx_led *led)
 795 {
 796         struct lp55xx_chip *chip = led->chip;
 797         int ret;
 798 
 799         mutex_lock(&chip->lock);
 800         ret = lp55xx_write(chip, LP5523_REG_LED_PWM_BASE + led->chan_nr,
 801                      led->brightness);
 802         mutex_unlock(&chip->lock);
 803         return ret;
 804 }
 805 
 806 static LP55XX_DEV_ATTR_RW(engine1_mode, show_engine1_mode, store_engine1_mode);
 807 static LP55XX_DEV_ATTR_RW(engine2_mode, show_engine2_mode, store_engine2_mode);
 808 static LP55XX_DEV_ATTR_RW(engine3_mode, show_engine3_mode, store_engine3_mode);
 809 static LP55XX_DEV_ATTR_RW(engine1_leds, show_engine1_leds, store_engine1_leds);
 810 static LP55XX_DEV_ATTR_RW(engine2_leds, show_engine2_leds, store_engine2_leds);
 811 static LP55XX_DEV_ATTR_RW(engine3_leds, show_engine3_leds, store_engine3_leds);
 812 static LP55XX_DEV_ATTR_WO(engine1_load, store_engine1_load);
 813 static LP55XX_DEV_ATTR_WO(engine2_load, store_engine2_load);
 814 static LP55XX_DEV_ATTR_WO(engine3_load, store_engine3_load);
 815 static LP55XX_DEV_ATTR_RO(selftest, lp5523_selftest);
 816 static LP55XX_DEV_ATTR_RW(master_fader1, show_master_fader1,
 817                           store_master_fader1);
 818 static LP55XX_DEV_ATTR_RW(master_fader2, show_master_fader2,
 819                           store_master_fader2);
 820 static LP55XX_DEV_ATTR_RW(master_fader3, show_master_fader3,
 821                           store_master_fader3);
 822 static LP55XX_DEV_ATTR_RW(master_fader_leds, show_master_fader_leds,
 823                           store_master_fader_leds);
 824 
 825 static struct attribute *lp5523_attributes[] = {
 826         &dev_attr_engine1_mode.attr,
 827         &dev_attr_engine2_mode.attr,
 828         &dev_attr_engine3_mode.attr,
 829         &dev_attr_engine1_load.attr,
 830         &dev_attr_engine2_load.attr,
 831         &dev_attr_engine3_load.attr,
 832         &dev_attr_engine1_leds.attr,
 833         &dev_attr_engine2_leds.attr,
 834         &dev_attr_engine3_leds.attr,
 835         &dev_attr_selftest.attr,
 836         &dev_attr_master_fader1.attr,
 837         &dev_attr_master_fader2.attr,
 838         &dev_attr_master_fader3.attr,
 839         &dev_attr_master_fader_leds.attr,
 840         NULL,
 841 };
 842 
 843 static const struct attribute_group lp5523_group = {
 844         .attrs = lp5523_attributes,
 845 };
 846 
 847 /* Chip specific configurations */
 848 static struct lp55xx_device_config lp5523_cfg = {
 849         .reset = {
 850                 .addr = LP5523_REG_RESET,
 851                 .val  = LP5523_RESET,
 852         },
 853         .enable = {
 854                 .addr = LP5523_REG_ENABLE,
 855                 .val  = LP5523_ENABLE,
 856         },
 857         .max_channel  = LP5523_MAX_LEDS,
 858         .post_init_device   = lp5523_post_init_device,
 859         .brightness_fn      = lp5523_led_brightness,
 860         .set_led_current    = lp5523_set_led_current,
 861         .firmware_cb        = lp5523_firmware_loaded,
 862         .run_engine         = lp5523_run_engine,
 863         .dev_attr_group     = &lp5523_group,
 864 };
 865 
 866 static int lp5523_probe(struct i2c_client *client,
 867                         const struct i2c_device_id *id)
 868 {
 869         int ret;
 870         struct lp55xx_chip *chip;
 871         struct lp55xx_led *led;
 872         struct lp55xx_platform_data *pdata = dev_get_platdata(&client->dev);
 873         struct device_node *np = client->dev.of_node;
 874 
 875         if (!pdata) {
 876                 if (np) {
 877                         pdata = lp55xx_of_populate_pdata(&client->dev, np);
 878                         if (IS_ERR(pdata))
 879                                 return PTR_ERR(pdata);
 880                 } else {
 881                         dev_err(&client->dev, "no platform data\n");
 882                         return -EINVAL;
 883                 }
 884         }
 885 
 886         chip = devm_kzalloc(&client->dev, sizeof(*chip), GFP_KERNEL);
 887         if (!chip)
 888                 return -ENOMEM;
 889 
 890         led = devm_kcalloc(&client->dev,
 891                         pdata->num_channels, sizeof(*led), GFP_KERNEL);
 892         if (!led)
 893                 return -ENOMEM;
 894 
 895         chip->cl = client;
 896         chip->pdata = pdata;
 897         chip->cfg = &lp5523_cfg;
 898 
 899         mutex_init(&chip->lock);
 900 
 901         i2c_set_clientdata(client, led);
 902 
 903         ret = lp55xx_init_device(chip);
 904         if (ret)
 905                 goto err_init;
 906 
 907         dev_info(&client->dev, "%s Programmable led chip found\n", id->name);
 908 
 909         ret = lp55xx_register_leds(led, chip);
 910         if (ret)
 911                 goto err_register_leds;
 912 
 913         ret = lp55xx_register_sysfs(chip);
 914         if (ret) {
 915                 dev_err(&client->dev, "registering sysfs failed\n");
 916                 goto err_register_sysfs;
 917         }
 918 
 919         return 0;
 920 
 921 err_register_sysfs:
 922         lp55xx_unregister_leds(led, chip);
 923 err_register_leds:
 924         lp55xx_deinit_device(chip);
 925 err_init:
 926         return ret;
 927 }
 928 
 929 static int lp5523_remove(struct i2c_client *client)
 930 {
 931         struct lp55xx_led *led = i2c_get_clientdata(client);
 932         struct lp55xx_chip *chip = led->chip;
 933 
 934         lp5523_stop_all_engines(chip);
 935         lp55xx_unregister_sysfs(chip);
 936         lp55xx_unregister_leds(led, chip);
 937         lp55xx_deinit_device(chip);
 938 
 939         return 0;
 940 }
 941 
 942 static const struct i2c_device_id lp5523_id[] = {
 943         { "lp5523",  LP5523 },
 944         { "lp55231", LP55231 },
 945         { }
 946 };
 947 
 948 MODULE_DEVICE_TABLE(i2c, lp5523_id);
 949 
 950 #ifdef CONFIG_OF
 951 static const struct of_device_id of_lp5523_leds_match[] = {
 952         { .compatible = "national,lp5523", },
 953         { .compatible = "ti,lp55231", },
 954         {},
 955 };
 956 
 957 MODULE_DEVICE_TABLE(of, of_lp5523_leds_match);
 958 #endif
 959 
 960 static struct i2c_driver lp5523_driver = {
 961         .driver = {
 962                 .name   = "lp5523x",
 963                 .of_match_table = of_match_ptr(of_lp5523_leds_match),
 964         },
 965         .probe          = lp5523_probe,
 966         .remove         = lp5523_remove,
 967         .id_table       = lp5523_id,
 968 };
 969 
 970 module_i2c_driver(lp5523_driver);
 971 
 972 MODULE_AUTHOR("Mathias Nyman <mathias.nyman@nokia.com>");
 973 MODULE_AUTHOR("Milo Kim <milo.kim@ti.com>");
 974 MODULE_DESCRIPTION("LP5523 LED engine");
 975 MODULE_LICENSE("GPL");

/* [<][>][^][v][top][bottom][index][help] */