linux/drivers/mfd/da903x.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * Base driver for Dialog Semiconductor DA9030/DA9034
   4 *
   5 * Copyright (C) 2008 Compulab, Ltd.
   6 *      Mike Rapoport <mike@compulab.co.il>
   7 *
   8 * Copyright (C) 2006-2008 Marvell International Ltd.
   9 *      Eric Miao <eric.miao@marvell.com>
  10 */
  11
  12#include <linux/kernel.h>
  13#include <linux/module.h>
  14#include <linux/interrupt.h>
  15#include <linux/platform_device.h>
  16#include <linux/i2c.h>
  17#include <linux/mfd/da903x.h>
  18#include <linux/slab.h>
  19
  20#define DA9030_CHIP_ID          0x00
  21#define DA9030_EVENT_A          0x01
  22#define DA9030_EVENT_B          0x02
  23#define DA9030_EVENT_C          0x03
  24#define DA9030_STATUS           0x04
  25#define DA9030_IRQ_MASK_A       0x05
  26#define DA9030_IRQ_MASK_B       0x06
  27#define DA9030_IRQ_MASK_C       0x07
  28#define DA9030_SYS_CTRL_A       0x08
  29#define DA9030_SYS_CTRL_B       0x09
  30#define DA9030_FAULT_LOG        0x0a
  31
  32#define DA9034_CHIP_ID          0x00
  33#define DA9034_EVENT_A          0x01
  34#define DA9034_EVENT_B          0x02
  35#define DA9034_EVENT_C          0x03
  36#define DA9034_EVENT_D          0x04
  37#define DA9034_STATUS_A         0x05
  38#define DA9034_STATUS_B         0x06
  39#define DA9034_IRQ_MASK_A       0x07
  40#define DA9034_IRQ_MASK_B       0x08
  41#define DA9034_IRQ_MASK_C       0x09
  42#define DA9034_IRQ_MASK_D       0x0a
  43#define DA9034_SYS_CTRL_A       0x0b
  44#define DA9034_SYS_CTRL_B       0x0c
  45#define DA9034_FAULT_LOG        0x0d
  46
  47struct da903x_chip;
  48
  49struct da903x_chip_ops {
  50        int     (*init_chip)(struct da903x_chip *);
  51        int     (*unmask_events)(struct da903x_chip *, unsigned int events);
  52        int     (*mask_events)(struct da903x_chip *, unsigned int events);
  53        int     (*read_events)(struct da903x_chip *, unsigned int *events);
  54        int     (*read_status)(struct da903x_chip *, unsigned int *status);
  55};
  56
  57struct da903x_chip {
  58        struct i2c_client       *client;
  59        struct device           *dev;
  60        const struct da903x_chip_ops *ops;
  61
  62        int                     type;
  63        uint32_t                events_mask;
  64
  65        struct mutex            lock;
  66        struct work_struct      irq_work;
  67
  68        struct blocking_notifier_head notifier_list;
  69};
  70
  71static inline int __da903x_read(struct i2c_client *client,
  72                                int reg, uint8_t *val)
  73{
  74        int ret;
  75
  76        ret = i2c_smbus_read_byte_data(client, reg);
  77        if (ret < 0) {
  78                dev_err(&client->dev, "failed reading at 0x%02x\n", reg);
  79                return ret;
  80        }
  81
  82        *val = (uint8_t)ret;
  83        return 0;
  84}
  85
  86static inline int __da903x_reads(struct i2c_client *client, int reg,
  87                                 int len, uint8_t *val)
  88{
  89        int ret;
  90
  91        ret = i2c_smbus_read_i2c_block_data(client, reg, len, val);
  92        if (ret < 0) {
  93                dev_err(&client->dev, "failed reading from 0x%02x\n", reg);
  94                return ret;
  95        }
  96        return 0;
  97}
  98
  99static inline int __da903x_write(struct i2c_client *client,
 100                                 int reg, uint8_t val)
 101{
 102        int ret;
 103
 104        ret = i2c_smbus_write_byte_data(client, reg, val);
 105        if (ret < 0) {
 106                dev_err(&client->dev, "failed writing 0x%02x to 0x%02x\n",
 107                                val, reg);
 108                return ret;
 109        }
 110        return 0;
 111}
 112
 113static inline int __da903x_writes(struct i2c_client *client, int reg,
 114                                  int len, uint8_t *val)
 115{
 116        int ret;
 117
 118        ret = i2c_smbus_write_i2c_block_data(client, reg, len, val);
 119        if (ret < 0) {
 120                dev_err(&client->dev, "failed writings to 0x%02x\n", reg);
 121                return ret;
 122        }
 123        return 0;
 124}
 125
 126int da903x_register_notifier(struct device *dev, struct notifier_block *nb,
 127                                unsigned int events)
 128{
 129        struct da903x_chip *chip = dev_get_drvdata(dev);
 130
 131        chip->ops->unmask_events(chip, events);
 132        return blocking_notifier_chain_register(&chip->notifier_list, nb);
 133}
 134EXPORT_SYMBOL_GPL(da903x_register_notifier);
 135
 136int da903x_unregister_notifier(struct device *dev, struct notifier_block *nb,
 137                                unsigned int events)
 138{
 139        struct da903x_chip *chip = dev_get_drvdata(dev);
 140
 141        chip->ops->mask_events(chip, events);
 142        return blocking_notifier_chain_unregister(&chip->notifier_list, nb);
 143}
 144EXPORT_SYMBOL_GPL(da903x_unregister_notifier);
 145
 146int da903x_write(struct device *dev, int reg, uint8_t val)
 147{
 148        return __da903x_write(to_i2c_client(dev), reg, val);
 149}
 150EXPORT_SYMBOL_GPL(da903x_write);
 151
 152int da903x_writes(struct device *dev, int reg, int len, uint8_t *val)
 153{
 154        return __da903x_writes(to_i2c_client(dev), reg, len, val);
 155}
 156EXPORT_SYMBOL_GPL(da903x_writes);
 157
 158int da903x_read(struct device *dev, int reg, uint8_t *val)
 159{
 160        return __da903x_read(to_i2c_client(dev), reg, val);
 161}
 162EXPORT_SYMBOL_GPL(da903x_read);
 163
 164int da903x_reads(struct device *dev, int reg, int len, uint8_t *val)
 165{
 166        return __da903x_reads(to_i2c_client(dev), reg, len, val);
 167}
 168EXPORT_SYMBOL_GPL(da903x_reads);
 169
 170int da903x_set_bits(struct device *dev, int reg, uint8_t bit_mask)
 171{
 172        struct da903x_chip *chip = dev_get_drvdata(dev);
 173        uint8_t reg_val;
 174        int ret = 0;
 175
 176        mutex_lock(&chip->lock);
 177
 178        ret = __da903x_read(chip->client, reg, &reg_val);
 179        if (ret)
 180                goto out;
 181
 182        if ((reg_val & bit_mask) != bit_mask) {
 183                reg_val |= bit_mask;
 184                ret = __da903x_write(chip->client, reg, reg_val);
 185        }
 186out:
 187        mutex_unlock(&chip->lock);
 188        return ret;
 189}
 190EXPORT_SYMBOL_GPL(da903x_set_bits);
 191
 192int da903x_clr_bits(struct device *dev, int reg, uint8_t bit_mask)
 193{
 194        struct da903x_chip *chip = dev_get_drvdata(dev);
 195        uint8_t reg_val;
 196        int ret = 0;
 197
 198        mutex_lock(&chip->lock);
 199
 200        ret = __da903x_read(chip->client, reg, &reg_val);
 201        if (ret)
 202                goto out;
 203
 204        if (reg_val & bit_mask) {
 205                reg_val &= ~bit_mask;
 206                ret = __da903x_write(chip->client, reg, reg_val);
 207        }
 208out:
 209        mutex_unlock(&chip->lock);
 210        return ret;
 211}
 212EXPORT_SYMBOL_GPL(da903x_clr_bits);
 213
 214int da903x_update(struct device *dev, int reg, uint8_t val, uint8_t mask)
 215{
 216        struct da903x_chip *chip = dev_get_drvdata(dev);
 217        uint8_t reg_val;
 218        int ret = 0;
 219
 220        mutex_lock(&chip->lock);
 221
 222        ret = __da903x_read(chip->client, reg, &reg_val);
 223        if (ret)
 224                goto out;
 225
 226        if ((reg_val & mask) != val) {
 227                reg_val = (reg_val & ~mask) | val;
 228                ret = __da903x_write(chip->client, reg, reg_val);
 229        }
 230out:
 231        mutex_unlock(&chip->lock);
 232        return ret;
 233}
 234EXPORT_SYMBOL_GPL(da903x_update);
 235
 236int da903x_query_status(struct device *dev, unsigned int sbits)
 237{
 238        struct da903x_chip *chip = dev_get_drvdata(dev);
 239        unsigned int status = 0;
 240
 241        chip->ops->read_status(chip, &status);
 242        return ((status & sbits) == sbits);
 243}
 244EXPORT_SYMBOL(da903x_query_status);
 245
 246static int da9030_init_chip(struct da903x_chip *chip)
 247{
 248        uint8_t chip_id;
 249        int err;
 250
 251        err = __da903x_read(chip->client, DA9030_CHIP_ID, &chip_id);
 252        if (err)
 253                return err;
 254
 255        err = __da903x_write(chip->client, DA9030_SYS_CTRL_A, 0xE8);
 256        if (err)
 257                return err;
 258
 259        dev_info(chip->dev, "DA9030 (CHIP ID: 0x%02x) detected\n", chip_id);
 260        return 0;
 261}
 262
 263static int da9030_unmask_events(struct da903x_chip *chip, unsigned int events)
 264{
 265        uint8_t v[3];
 266
 267        chip->events_mask &= ~events;
 268
 269        v[0] = (chip->events_mask & 0xff);
 270        v[1] = (chip->events_mask >> 8) & 0xff;
 271        v[2] = (chip->events_mask >> 16) & 0xff;
 272
 273        return __da903x_writes(chip->client, DA9030_IRQ_MASK_A, 3, v);
 274}
 275
 276static int da9030_mask_events(struct da903x_chip *chip, unsigned int events)
 277{
 278        uint8_t v[3];
 279
 280        chip->events_mask |= events;
 281
 282        v[0] = (chip->events_mask & 0xff);
 283        v[1] = (chip->events_mask >> 8) & 0xff;
 284        v[2] = (chip->events_mask >> 16) & 0xff;
 285
 286        return __da903x_writes(chip->client, DA9030_IRQ_MASK_A, 3, v);
 287}
 288
 289static int da9030_read_events(struct da903x_chip *chip, unsigned int *events)
 290{
 291        uint8_t v[3] = {0, 0, 0};
 292        int ret;
 293
 294        ret = __da903x_reads(chip->client, DA9030_EVENT_A, 3, v);
 295        if (ret < 0)
 296                return ret;
 297
 298        *events = (v[2] << 16) | (v[1] << 8) | v[0];
 299        return 0;
 300}
 301
 302static int da9030_read_status(struct da903x_chip *chip, unsigned int *status)
 303{
 304        return __da903x_read(chip->client, DA9030_STATUS, (uint8_t *)status);
 305}
 306
 307static int da9034_init_chip(struct da903x_chip *chip)
 308{
 309        uint8_t chip_id;
 310        int err;
 311
 312        err = __da903x_read(chip->client, DA9034_CHIP_ID, &chip_id);
 313        if (err)
 314                return err;
 315
 316        err = __da903x_write(chip->client, DA9034_SYS_CTRL_A, 0xE8);
 317        if (err)
 318                return err;
 319
 320        /* avoid SRAM power off during sleep*/
 321        __da903x_write(chip->client, 0x10, 0x07);
 322        __da903x_write(chip->client, 0x11, 0xff);
 323        __da903x_write(chip->client, 0x12, 0xff);
 324
 325        /* Enable the ONKEY power down functionality */
 326        __da903x_write(chip->client, DA9034_SYS_CTRL_B, 0x20);
 327        __da903x_write(chip->client, DA9034_SYS_CTRL_A, 0x60);
 328
 329        /* workaround to make LEDs work */
 330        __da903x_write(chip->client, 0x90, 0x01);
 331        __da903x_write(chip->client, 0xB0, 0x08);
 332
 333        /* make ADTV1 and SDTV1 effective */
 334        __da903x_write(chip->client, 0x20, 0x00);
 335
 336        dev_info(chip->dev, "DA9034 (CHIP ID: 0x%02x) detected\n", chip_id);
 337        return 0;
 338}
 339
 340static int da9034_unmask_events(struct da903x_chip *chip, unsigned int events)
 341{
 342        uint8_t v[4];
 343
 344        chip->events_mask &= ~events;
 345
 346        v[0] = (chip->events_mask & 0xff);
 347        v[1] = (chip->events_mask >> 8) & 0xff;
 348        v[2] = (chip->events_mask >> 16) & 0xff;
 349        v[3] = (chip->events_mask >> 24) & 0xff;
 350
 351        return __da903x_writes(chip->client, DA9034_IRQ_MASK_A, 4, v);
 352}
 353
 354static int da9034_mask_events(struct da903x_chip *chip, unsigned int events)
 355{
 356        uint8_t v[4];
 357
 358        chip->events_mask |= events;
 359
 360        v[0] = (chip->events_mask & 0xff);
 361        v[1] = (chip->events_mask >> 8) & 0xff;
 362        v[2] = (chip->events_mask >> 16) & 0xff;
 363        v[3] = (chip->events_mask >> 24) & 0xff;
 364
 365        return __da903x_writes(chip->client, DA9034_IRQ_MASK_A, 4, v);
 366}
 367
 368static int da9034_read_events(struct da903x_chip *chip, unsigned int *events)
 369{
 370        uint8_t v[4] = {0, 0, 0, 0};
 371        int ret;
 372
 373        ret = __da903x_reads(chip->client, DA9034_EVENT_A, 4, v);
 374        if (ret < 0)
 375                return ret;
 376
 377        *events = (v[3] << 24) | (v[2] << 16) | (v[1] << 8) | v[0];
 378        return 0;
 379}
 380
 381static int da9034_read_status(struct da903x_chip *chip, unsigned int *status)
 382{
 383        uint8_t v[2] = {0, 0};
 384        int ret = 0;
 385
 386        ret = __da903x_reads(chip->client, DA9034_STATUS_A, 2, v);
 387        if (ret)
 388                return ret;
 389
 390        *status = (v[1] << 8) | v[0];
 391        return 0;
 392}
 393
 394static void da903x_irq_work(struct work_struct *work)
 395{
 396        struct da903x_chip *chip =
 397                container_of(work, struct da903x_chip, irq_work);
 398        unsigned int events = 0;
 399
 400        while (1) {
 401                if (chip->ops->read_events(chip, &events))
 402                        break;
 403
 404                events &= ~chip->events_mask;
 405                if (events == 0)
 406                        break;
 407
 408                blocking_notifier_call_chain(
 409                                &chip->notifier_list, events, NULL);
 410        }
 411        enable_irq(chip->client->irq);
 412}
 413
 414static irqreturn_t da903x_irq_handler(int irq, void *data)
 415{
 416        struct da903x_chip *chip = data;
 417
 418        disable_irq_nosync(irq);
 419        (void)schedule_work(&chip->irq_work);
 420
 421        return IRQ_HANDLED;
 422}
 423
 424static const struct da903x_chip_ops da903x_ops[] = {
 425        [0] = {
 426                .init_chip      = da9030_init_chip,
 427                .unmask_events  = da9030_unmask_events,
 428                .mask_events    = da9030_mask_events,
 429                .read_events    = da9030_read_events,
 430                .read_status    = da9030_read_status,
 431        },
 432        [1] = {
 433                .init_chip      = da9034_init_chip,
 434                .unmask_events  = da9034_unmask_events,
 435                .mask_events    = da9034_mask_events,
 436                .read_events    = da9034_read_events,
 437                .read_status    = da9034_read_status,
 438        }
 439};
 440
 441static const struct i2c_device_id da903x_id_table[] = {
 442        { "da9030", 0 },
 443        { "da9034", 1 },
 444        { },
 445};
 446MODULE_DEVICE_TABLE(i2c, da903x_id_table);
 447
 448static int __remove_subdev(struct device *dev, void *unused)
 449{
 450        platform_device_unregister(to_platform_device(dev));
 451        return 0;
 452}
 453
 454static int da903x_remove_subdevs(struct da903x_chip *chip)
 455{
 456        return device_for_each_child(chip->dev, NULL, __remove_subdev);
 457}
 458
 459static int da903x_add_subdevs(struct da903x_chip *chip,
 460                                        struct da903x_platform_data *pdata)
 461{
 462        struct da903x_subdev_info *subdev;
 463        struct platform_device *pdev;
 464        int i, ret = 0;
 465
 466        for (i = 0; i < pdata->num_subdevs; i++) {
 467                subdev = &pdata->subdevs[i];
 468
 469                pdev = platform_device_alloc(subdev->name, subdev->id);
 470                if (!pdev) {
 471                        ret = -ENOMEM;
 472                        goto failed;
 473                }
 474
 475                pdev->dev.parent = chip->dev;
 476                pdev->dev.platform_data = subdev->platform_data;
 477
 478                ret = platform_device_add(pdev);
 479                if (ret) {
 480                        platform_device_put(pdev);
 481                        goto failed;
 482                }
 483        }
 484        return 0;
 485
 486failed:
 487        da903x_remove_subdevs(chip);
 488        return ret;
 489}
 490
 491static int da903x_probe(struct i2c_client *client,
 492                                  const struct i2c_device_id *id)
 493{
 494        struct da903x_platform_data *pdata = dev_get_platdata(&client->dev);
 495        struct da903x_chip *chip;
 496        unsigned int tmp;
 497        int ret;
 498
 499        chip = devm_kzalloc(&client->dev, sizeof(struct da903x_chip),
 500                                GFP_KERNEL);
 501        if (chip == NULL)
 502                return -ENOMEM;
 503
 504        chip->client = client;
 505        chip->dev = &client->dev;
 506        chip->ops = &da903x_ops[id->driver_data];
 507
 508        mutex_init(&chip->lock);
 509        INIT_WORK(&chip->irq_work, da903x_irq_work);
 510        BLOCKING_INIT_NOTIFIER_HEAD(&chip->notifier_list);
 511
 512        i2c_set_clientdata(client, chip);
 513
 514        ret = chip->ops->init_chip(chip);
 515        if (ret)
 516                return ret;
 517
 518        /* mask and clear all IRQs */
 519        chip->events_mask = 0xffffffff;
 520        chip->ops->mask_events(chip, chip->events_mask);
 521        chip->ops->read_events(chip, &tmp);
 522
 523        ret = devm_request_irq(&client->dev, client->irq, da903x_irq_handler,
 524                        IRQF_TRIGGER_FALLING,
 525                        "da903x", chip);
 526        if (ret) {
 527                dev_err(&client->dev, "failed to request irq %d\n",
 528                                client->irq);
 529                return ret;
 530        }
 531
 532        return da903x_add_subdevs(chip, pdata);
 533}
 534
 535static int da903x_remove(struct i2c_client *client)
 536{
 537        struct da903x_chip *chip = i2c_get_clientdata(client);
 538
 539        da903x_remove_subdevs(chip);
 540        return 0;
 541}
 542
 543static struct i2c_driver da903x_driver = {
 544        .driver = {
 545                .name   = "da903x",
 546        },
 547        .probe          = da903x_probe,
 548        .remove         = da903x_remove,
 549        .id_table       = da903x_id_table,
 550};
 551
 552static int __init da903x_init(void)
 553{
 554        return i2c_add_driver(&da903x_driver);
 555}
 556subsys_initcall(da903x_init);
 557
 558static void __exit da903x_exit(void)
 559{
 560        i2c_del_driver(&da903x_driver);
 561}
 562module_exit(da903x_exit);
 563
 564MODULE_DESCRIPTION("PMIC Driver for Dialog Semiconductor DA9034");
 565MODULE_AUTHOR("Eric Miao <eric.miao@marvell.com>");
 566MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
 567MODULE_LICENSE("GPL v2");
 568