linux/drivers/leds/leds-pca963x.c
<<
>>
Prefs
   1/*
   2 * Copyright 2011 bct electronic GmbH
   3 * Copyright 2013 Qtechnology/AS
   4 *
   5 * Author: Peter Meerwald <p.meerwald@bct-electronic.com>
   6 * Author: Ricardo Ribalda <ricardo.ribalda@gmail.com>
   7 *
   8 * Based on leds-pca955x.c
   9 *
  10 * This file is subject to the terms and conditions of version 2 of
  11 * the GNU General Public License.  See the file COPYING in the main
  12 * directory of this archive for more details.
  13 *
  14 * LED driver for the PCA9633 I2C LED driver (7-bit slave address 0x62)
  15 * LED driver for the PCA9634/5 I2C LED driver (7-bit slave address set by hw.)
  16 *
  17 * Note that hardware blinking violates the leds infrastructure driver
  18 * interface since the hardware only supports blinking all LEDs with the
  19 * same delay_on/delay_off rates.  That is, only the LEDs that are set to
  20 * blink will actually blink but all LEDs that are set to blink will blink
  21 * in identical fashion.  The delay_on/delay_off values of the last LED
  22 * that is set to blink will be used for all of the blinking LEDs.
  23 * Hardware blinking is disabled by default but can be enabled by setting
  24 * the 'blink_type' member in the platform_data struct to 'PCA963X_HW_BLINK'
  25 * or by adding the 'nxp,hw-blink' property to the DTS.
  26 */
  27
  28#include <linux/module.h>
  29#include <linux/delay.h>
  30#include <linux/string.h>
  31#include <linux/ctype.h>
  32#include <linux/leds.h>
  33#include <linux/err.h>
  34#include <linux/i2c.h>
  35#include <linux/slab.h>
  36#include <linux/of.h>
  37#include <linux/platform_data/leds-pca963x.h>
  38
  39/* LED select registers determine the source that drives LED outputs */
  40#define PCA963X_LED_OFF         0x0     /* LED driver off */
  41#define PCA963X_LED_ON          0x1     /* LED driver on */
  42#define PCA963X_LED_PWM         0x2     /* Controlled through PWM */
  43#define PCA963X_LED_GRP_PWM     0x3     /* Controlled through PWM/GRPPWM */
  44
  45#define PCA963X_MODE2_DMBLNK    0x20    /* Enable blinking */
  46
  47#define PCA963X_MODE1           0x00
  48#define PCA963X_MODE2           0x01
  49#define PCA963X_PWM_BASE        0x02
  50
  51enum pca963x_type {
  52        pca9633,
  53        pca9634,
  54        pca9635,
  55};
  56
  57struct pca963x_chipdef {
  58        u8                      grppwm;
  59        u8                      grpfreq;
  60        u8                      ledout_base;
  61        int                     n_leds;
  62};
  63
  64static struct pca963x_chipdef pca963x_chipdefs[] = {
  65        [pca9633] = {
  66                .grppwm         = 0x6,
  67                .grpfreq        = 0x7,
  68                .ledout_base    = 0x8,
  69                .n_leds         = 4,
  70        },
  71        [pca9634] = {
  72                .grppwm         = 0xa,
  73                .grpfreq        = 0xb,
  74                .ledout_base    = 0xc,
  75                .n_leds         = 8,
  76        },
  77        [pca9635] = {
  78                .grppwm         = 0x12,
  79                .grpfreq        = 0x13,
  80                .ledout_base    = 0x14,
  81                .n_leds         = 16,
  82        },
  83};
  84
  85/* Total blink period in milliseconds */
  86#define PCA963X_BLINK_PERIOD_MIN        42
  87#define PCA963X_BLINK_PERIOD_MAX        10667
  88
  89static const struct i2c_device_id pca963x_id[] = {
  90        { "pca9632", pca9633 },
  91        { "pca9633", pca9633 },
  92        { "pca9634", pca9634 },
  93        { "pca9635", pca9635 },
  94        { }
  95};
  96MODULE_DEVICE_TABLE(i2c, pca963x_id);
  97
  98struct pca963x_led;
  99
 100struct pca963x {
 101        struct pca963x_chipdef *chipdef;
 102        struct mutex mutex;
 103        struct i2c_client *client;
 104        struct pca963x_led *leds;
 105};
 106
 107struct pca963x_led {
 108        struct pca963x *chip;
 109        struct led_classdev led_cdev;
 110        int led_num; /* 0 .. 15 potentially */
 111        char name[32];
 112        u8 gdc;
 113        u8 gfrq;
 114};
 115
 116static int pca963x_brightness(struct pca963x_led *pca963x,
 117                               enum led_brightness brightness)
 118{
 119        u8 ledout_addr = pca963x->chip->chipdef->ledout_base
 120                + (pca963x->led_num / 4);
 121        u8 ledout;
 122        int shift = 2 * (pca963x->led_num % 4);
 123        u8 mask = 0x3 << shift;
 124        int ret;
 125
 126        mutex_lock(&pca963x->chip->mutex);
 127        ledout = i2c_smbus_read_byte_data(pca963x->chip->client, ledout_addr);
 128        switch (brightness) {
 129        case LED_FULL:
 130                ret = i2c_smbus_write_byte_data(pca963x->chip->client,
 131                        ledout_addr,
 132                        (ledout & ~mask) | (PCA963X_LED_ON << shift));
 133                break;
 134        case LED_OFF:
 135                ret = i2c_smbus_write_byte_data(pca963x->chip->client,
 136                        ledout_addr, ledout & ~mask);
 137                break;
 138        default:
 139                ret = i2c_smbus_write_byte_data(pca963x->chip->client,
 140                        PCA963X_PWM_BASE + pca963x->led_num,
 141                        brightness);
 142                if (ret < 0)
 143                        goto unlock;
 144                ret = i2c_smbus_write_byte_data(pca963x->chip->client,
 145                        ledout_addr,
 146                        (ledout & ~mask) | (PCA963X_LED_PWM << shift));
 147                break;
 148        }
 149unlock:
 150        mutex_unlock(&pca963x->chip->mutex);
 151        return ret;
 152}
 153
 154static void pca963x_blink(struct pca963x_led *pca963x)
 155{
 156        u8 ledout_addr = pca963x->chip->chipdef->ledout_base +
 157                (pca963x->led_num / 4);
 158        u8 ledout;
 159        u8 mode2 = i2c_smbus_read_byte_data(pca963x->chip->client,
 160                                                        PCA963X_MODE2);
 161        int shift = 2 * (pca963x->led_num % 4);
 162        u8 mask = 0x3 << shift;
 163
 164        i2c_smbus_write_byte_data(pca963x->chip->client,
 165                        pca963x->chip->chipdef->grppwm, pca963x->gdc);
 166
 167        i2c_smbus_write_byte_data(pca963x->chip->client,
 168                        pca963x->chip->chipdef->grpfreq, pca963x->gfrq);
 169
 170        if (!(mode2 & PCA963X_MODE2_DMBLNK))
 171                i2c_smbus_write_byte_data(pca963x->chip->client, PCA963X_MODE2,
 172                        mode2 | PCA963X_MODE2_DMBLNK);
 173
 174        mutex_lock(&pca963x->chip->mutex);
 175        ledout = i2c_smbus_read_byte_data(pca963x->chip->client, ledout_addr);
 176        if ((ledout & mask) != (PCA963X_LED_GRP_PWM << shift))
 177                i2c_smbus_write_byte_data(pca963x->chip->client, ledout_addr,
 178                        (ledout & ~mask) | (PCA963X_LED_GRP_PWM << shift));
 179        mutex_unlock(&pca963x->chip->mutex);
 180}
 181
 182static int pca963x_led_set(struct led_classdev *led_cdev,
 183        enum led_brightness value)
 184{
 185        struct pca963x_led *pca963x;
 186
 187        pca963x = container_of(led_cdev, struct pca963x_led, led_cdev);
 188
 189        return pca963x_brightness(pca963x, value);
 190}
 191
 192static int pca963x_blink_set(struct led_classdev *led_cdev,
 193                unsigned long *delay_on, unsigned long *delay_off)
 194{
 195        struct pca963x_led *pca963x;
 196        unsigned long time_on, time_off, period;
 197        u8 gdc, gfrq;
 198
 199        pca963x = container_of(led_cdev, struct pca963x_led, led_cdev);
 200
 201        time_on = *delay_on;
 202        time_off = *delay_off;
 203
 204        /* If both zero, pick reasonable defaults of 500ms each */
 205        if (!time_on && !time_off) {
 206                time_on = 500;
 207                time_off = 500;
 208        }
 209
 210        period = time_on + time_off;
 211
 212        /* If period not supported by hardware, default to someting sane. */
 213        if ((period < PCA963X_BLINK_PERIOD_MIN) ||
 214            (period > PCA963X_BLINK_PERIOD_MAX)) {
 215                time_on = 500;
 216                time_off = 500;
 217                period = time_on + time_off;
 218        }
 219
 220        /*
 221         * From manual: duty cycle = (GDC / 256) ->
 222         *      (time_on / period) = (GDC / 256) ->
 223         *              GDC = ((time_on * 256) / period)
 224         */
 225        gdc = (time_on * 256) / period;
 226
 227        /*
 228         * From manual: period = ((GFRQ + 1) / 24) in seconds.
 229         * So, period (in ms) = (((GFRQ + 1) / 24) * 1000) ->
 230         *              GFRQ = ((period * 24 / 1000) - 1)
 231         */
 232        gfrq = (period * 24 / 1000) - 1;
 233
 234        pca963x->gdc = gdc;
 235        pca963x->gfrq = gfrq;
 236
 237        pca963x_blink(pca963x);
 238
 239        *delay_on = time_on;
 240        *delay_off = time_off;
 241
 242        return 0;
 243}
 244
 245#if IS_ENABLED(CONFIG_OF)
 246static struct pca963x_platform_data *
 247pca963x_dt_init(struct i2c_client *client, struct pca963x_chipdef *chip)
 248{
 249        struct device_node *np = client->dev.of_node, *child;
 250        struct pca963x_platform_data *pdata;
 251        struct led_info *pca963x_leds;
 252        int count;
 253
 254        count = of_get_child_count(np);
 255        if (!count || count > chip->n_leds)
 256                return ERR_PTR(-ENODEV);
 257
 258        pca963x_leds = devm_kzalloc(&client->dev,
 259                        sizeof(struct led_info) * chip->n_leds, GFP_KERNEL);
 260        if (!pca963x_leds)
 261                return ERR_PTR(-ENOMEM);
 262
 263        for_each_child_of_node(np, child) {
 264                struct led_info led = {};
 265                u32 reg;
 266                int res;
 267
 268                res = of_property_read_u32(child, "reg", &reg);
 269                if ((res != 0) || (reg >= chip->n_leds))
 270                        continue;
 271                led.name =
 272                        of_get_property(child, "label", NULL) ? : child->name;
 273                led.default_trigger =
 274                        of_get_property(child, "linux,default-trigger", NULL);
 275                pca963x_leds[reg] = led;
 276        }
 277        pdata = devm_kzalloc(&client->dev,
 278                             sizeof(struct pca963x_platform_data), GFP_KERNEL);
 279        if (!pdata)
 280                return ERR_PTR(-ENOMEM);
 281
 282        pdata->leds.leds = pca963x_leds;
 283        pdata->leds.num_leds = chip->n_leds;
 284
 285        /* default to open-drain unless totem pole (push-pull) is specified */
 286        if (of_property_read_bool(np, "nxp,totem-pole"))
 287                pdata->outdrv = PCA963X_TOTEM_POLE;
 288        else
 289                pdata->outdrv = PCA963X_OPEN_DRAIN;
 290
 291        /* default to software blinking unless hardware blinking is specified */
 292        if (of_property_read_bool(np, "nxp,hw-blink"))
 293                pdata->blink_type = PCA963X_HW_BLINK;
 294        else
 295                pdata->blink_type = PCA963X_SW_BLINK;
 296
 297        return pdata;
 298}
 299
 300static const struct of_device_id of_pca963x_match[] = {
 301        { .compatible = "nxp,pca9632", },
 302        { .compatible = "nxp,pca9633", },
 303        { .compatible = "nxp,pca9634", },
 304        { .compatible = "nxp,pca9635", },
 305        {},
 306};
 307MODULE_DEVICE_TABLE(of, of_pca963x_match);
 308#else
 309static struct pca963x_platform_data *
 310pca963x_dt_init(struct i2c_client *client, struct pca963x_chipdef *chip)
 311{
 312        return ERR_PTR(-ENODEV);
 313}
 314#endif
 315
 316static int pca963x_probe(struct i2c_client *client,
 317                                        const struct i2c_device_id *id)
 318{
 319        struct pca963x *pca963x_chip;
 320        struct pca963x_led *pca963x;
 321        struct pca963x_platform_data *pdata;
 322        struct pca963x_chipdef *chip;
 323        int i, err;
 324
 325        chip = &pca963x_chipdefs[id->driver_data];
 326        pdata = dev_get_platdata(&client->dev);
 327
 328        if (!pdata) {
 329                pdata = pca963x_dt_init(client, chip);
 330                if (IS_ERR(pdata)) {
 331                        dev_warn(&client->dev, "could not parse configuration\n");
 332                        pdata = NULL;
 333                }
 334        }
 335
 336        if (pdata && (pdata->leds.num_leds < 1 ||
 337                                 pdata->leds.num_leds > chip->n_leds)) {
 338                dev_err(&client->dev, "board info must claim 1-%d LEDs",
 339                                                                chip->n_leds);
 340                return -EINVAL;
 341        }
 342
 343        pca963x_chip = devm_kzalloc(&client->dev, sizeof(*pca963x_chip),
 344                                                                GFP_KERNEL);
 345        if (!pca963x_chip)
 346                return -ENOMEM;
 347        pca963x = devm_kzalloc(&client->dev, chip->n_leds * sizeof(*pca963x),
 348                                                                GFP_KERNEL);
 349        if (!pca963x)
 350                return -ENOMEM;
 351
 352        i2c_set_clientdata(client, pca963x_chip);
 353
 354        mutex_init(&pca963x_chip->mutex);
 355        pca963x_chip->chipdef = chip;
 356        pca963x_chip->client = client;
 357        pca963x_chip->leds = pca963x;
 358
 359        /* Turn off LEDs by default*/
 360        for (i = 0; i < chip->n_leds / 4; i++)
 361                i2c_smbus_write_byte_data(client, chip->ledout_base + i, 0x00);
 362
 363        for (i = 0; i < chip->n_leds; i++) {
 364                pca963x[i].led_num = i;
 365                pca963x[i].chip = pca963x_chip;
 366
 367                /* Platform data can specify LED names and default triggers */
 368                if (pdata && i < pdata->leds.num_leds) {
 369                        if (pdata->leds.leds[i].name)
 370                                snprintf(pca963x[i].name,
 371                                         sizeof(pca963x[i].name), "pca963x:%s",
 372                                         pdata->leds.leds[i].name);
 373                        if (pdata->leds.leds[i].default_trigger)
 374                                pca963x[i].led_cdev.default_trigger =
 375                                        pdata->leds.leds[i].default_trigger;
 376                }
 377                if (!pdata || i >= pdata->leds.num_leds ||
 378                                                !pdata->leds.leds[i].name)
 379                        snprintf(pca963x[i].name, sizeof(pca963x[i].name),
 380                                 "pca963x:%d:%.2x:%d", client->adapter->nr,
 381                                 client->addr, i);
 382
 383                pca963x[i].led_cdev.name = pca963x[i].name;
 384                pca963x[i].led_cdev.brightness_set_blocking = pca963x_led_set;
 385
 386                if (pdata && pdata->blink_type == PCA963X_HW_BLINK)
 387                        pca963x[i].led_cdev.blink_set = pca963x_blink_set;
 388
 389                err = led_classdev_register(&client->dev, &pca963x[i].led_cdev);
 390                if (err < 0)
 391                        goto exit;
 392        }
 393
 394        /* Disable LED all-call address and set normal mode */
 395        i2c_smbus_write_byte_data(client, PCA963X_MODE1, 0x00);
 396
 397        if (pdata) {
 398                /* Configure output: open-drain or totem pole (push-pull) */
 399                if (pdata->outdrv == PCA963X_OPEN_DRAIN)
 400                        i2c_smbus_write_byte_data(client, PCA963X_MODE2, 0x01);
 401                else
 402                        i2c_smbus_write_byte_data(client, PCA963X_MODE2, 0x05);
 403        }
 404
 405        return 0;
 406
 407exit:
 408        while (i--)
 409                led_classdev_unregister(&pca963x[i].led_cdev);
 410
 411        return err;
 412}
 413
 414static int pca963x_remove(struct i2c_client *client)
 415{
 416        struct pca963x *pca963x = i2c_get_clientdata(client);
 417        int i;
 418
 419        for (i = 0; i < pca963x->chipdef->n_leds; i++)
 420                led_classdev_unregister(&pca963x->leds[i].led_cdev);
 421
 422        return 0;
 423}
 424
 425static struct i2c_driver pca963x_driver = {
 426        .driver = {
 427                .name   = "leds-pca963x",
 428                .of_match_table = of_match_ptr(of_pca963x_match),
 429        },
 430        .probe  = pca963x_probe,
 431        .remove = pca963x_remove,
 432        .id_table = pca963x_id,
 433};
 434
 435module_i2c_driver(pca963x_driver);
 436
 437MODULE_AUTHOR("Peter Meerwald <p.meerwald@bct-electronic.com>");
 438MODULE_DESCRIPTION("PCA963X LED driver");
 439MODULE_LICENSE("GPL v2");
 440