linux/drivers/mfd/wm8350-core.c
<<
>>
Prefs
   1/*
   2 * wm8350-core.c  --  Device access for Wolfson WM8350
   3 *
   4 * Copyright 2007, 2008 Wolfson Microelectronics PLC.
   5 *
   6 * Author: Liam Girdwood, Mark Brown
   7 *
   8 *  This program is free software; you can redistribute  it and/or modify it
   9 *  under  the terms of  the GNU General  Public License as published by the
  10 *  Free Software Foundation;  either version 2 of the  License, or (at your
  11 *  option) any later version.
  12 *
  13 */
  14
  15#include <linux/kernel.h>
  16#include <linux/module.h>
  17#include <linux/init.h>
  18#include <linux/bug.h>
  19#include <linux/device.h>
  20#include <linux/delay.h>
  21#include <linux/interrupt.h>
  22#include <linux/workqueue.h>
  23
  24#include <linux/mfd/wm8350/core.h>
  25#include <linux/mfd/wm8350/audio.h>
  26#include <linux/mfd/wm8350/comparator.h>
  27#include <linux/mfd/wm8350/gpio.h>
  28#include <linux/mfd/wm8350/pmic.h>
  29#include <linux/mfd/wm8350/rtc.h>
  30#include <linux/mfd/wm8350/supply.h>
  31#include <linux/mfd/wm8350/wdt.h>
  32
  33#define WM8350_UNLOCK_KEY               0x0013
  34#define WM8350_LOCK_KEY                 0x0000
  35
  36#define WM8350_CLOCK_CONTROL_1          0x28
  37#define WM8350_AIF_TEST                 0x74
  38
  39/* debug */
  40#define WM8350_BUS_DEBUG 0
  41#if WM8350_BUS_DEBUG
  42#define dump(regs, src) do { \
  43        int i_; \
  44        u16 *src_ = src; \
  45        printk(KERN_DEBUG); \
  46        for (i_ = 0; i_ < regs; i_++) \
  47                printk(" 0x%4.4x", *src_++); \
  48        printk("\n"); \
  49} while (0);
  50#else
  51#define dump(bytes, src)
  52#endif
  53
  54#define WM8350_LOCK_DEBUG 0
  55#if WM8350_LOCK_DEBUG
  56#define ldbg(format, arg...) printk(format, ## arg)
  57#else
  58#define ldbg(format, arg...)
  59#endif
  60
  61/*
  62 * WM8350 Device IO
  63 */
  64static DEFINE_MUTEX(io_mutex);
  65static DEFINE_MUTEX(reg_lock_mutex);
  66
  67/* Perform a physical read from the device.
  68 */
  69static int wm8350_phys_read(struct wm8350 *wm8350, u8 reg, int num_regs,
  70                            u16 *dest)
  71{
  72        int i, ret;
  73        int bytes = num_regs * 2;
  74
  75        dev_dbg(wm8350->dev, "volatile read\n");
  76        ret = wm8350->read_dev(wm8350, reg, bytes, (char *)dest);
  77
  78        for (i = reg; i < reg + num_regs; i++) {
  79                /* Cache is CPU endian */
  80                dest[i - reg] = be16_to_cpu(dest[i - reg]);
  81
  82                /* Mask out non-readable bits */
  83                dest[i - reg] &= wm8350_reg_io_map[i].readable;
  84        }
  85
  86        dump(num_regs, dest);
  87
  88        return ret;
  89}
  90
  91static int wm8350_read(struct wm8350 *wm8350, u8 reg, int num_regs, u16 *dest)
  92{
  93        int i;
  94        int end = reg + num_regs;
  95        int ret = 0;
  96        int bytes = num_regs * 2;
  97
  98        if (wm8350->read_dev == NULL)
  99                return -ENODEV;
 100
 101        if ((reg + num_regs - 1) > WM8350_MAX_REGISTER) {
 102                dev_err(wm8350->dev, "invalid reg %x\n",
 103                        reg + num_regs - 1);
 104                return -EINVAL;
 105        }
 106
 107        dev_dbg(wm8350->dev,
 108                "%s R%d(0x%2.2x) %d regs\n", __func__, reg, reg, num_regs);
 109
 110#if WM8350_BUS_DEBUG
 111        /* we can _safely_ read any register, but warn if read not supported */
 112        for (i = reg; i < end; i++) {
 113                if (!wm8350_reg_io_map[i].readable)
 114                        dev_warn(wm8350->dev,
 115                                "reg R%d is not readable\n", i);
 116        }
 117#endif
 118
 119        /* if any volatile registers are required, then read back all */
 120        for (i = reg; i < end; i++)
 121                if (wm8350_reg_io_map[i].vol)
 122                        return wm8350_phys_read(wm8350, reg, num_regs, dest);
 123
 124        /* no volatiles, then cache is good */
 125        dev_dbg(wm8350->dev, "cache read\n");
 126        memcpy(dest, &wm8350->reg_cache[reg], bytes);
 127        dump(num_regs, dest);
 128        return ret;
 129}
 130
 131static inline int is_reg_locked(struct wm8350 *wm8350, u8 reg)
 132{
 133        if (reg == WM8350_SECURITY ||
 134            wm8350->reg_cache[WM8350_SECURITY] == WM8350_UNLOCK_KEY)
 135                return 0;
 136
 137        if ((reg == WM8350_GPIO_CONFIGURATION_I_O) ||
 138            (reg >= WM8350_GPIO_FUNCTION_SELECT_1 &&
 139             reg <= WM8350_GPIO_FUNCTION_SELECT_4) ||
 140            (reg >= WM8350_BATTERY_CHARGER_CONTROL_1 &&
 141             reg <= WM8350_BATTERY_CHARGER_CONTROL_3))
 142                return 1;
 143        return 0;
 144}
 145
 146static int wm8350_write(struct wm8350 *wm8350, u8 reg, int num_regs, u16 *src)
 147{
 148        int i;
 149        int end = reg + num_regs;
 150        int bytes = num_regs * 2;
 151
 152        if (wm8350->write_dev == NULL)
 153                return -ENODEV;
 154
 155        if ((reg + num_regs - 1) > WM8350_MAX_REGISTER) {
 156                dev_err(wm8350->dev, "invalid reg %x\n",
 157                        reg + num_regs - 1);
 158                return -EINVAL;
 159        }
 160
 161        /* it's generally not a good idea to write to RO or locked registers */
 162        for (i = reg; i < end; i++) {
 163                if (!wm8350_reg_io_map[i].writable) {
 164                        dev_err(wm8350->dev,
 165                                "attempted write to read only reg R%d\n", i);
 166                        return -EINVAL;
 167                }
 168
 169                if (is_reg_locked(wm8350, i)) {
 170                        dev_err(wm8350->dev,
 171                               "attempted write to locked reg R%d\n", i);
 172                        return -EINVAL;
 173                }
 174
 175                src[i - reg] &= wm8350_reg_io_map[i].writable;
 176
 177                wm8350->reg_cache[i] =
 178                        (wm8350->reg_cache[i] & ~wm8350_reg_io_map[i].writable)
 179                        | src[i - reg];
 180
 181                src[i - reg] = cpu_to_be16(src[i - reg]);
 182        }
 183
 184        /* Actually write it out */
 185        return wm8350->write_dev(wm8350, reg, bytes, (char *)src);
 186}
 187
 188/*
 189 * Safe read, modify, write methods
 190 */
 191int wm8350_clear_bits(struct wm8350 *wm8350, u16 reg, u16 mask)
 192{
 193        u16 data;
 194        int err;
 195
 196        mutex_lock(&io_mutex);
 197        err = wm8350_read(wm8350, reg, 1, &data);
 198        if (err) {
 199                dev_err(wm8350->dev, "read from reg R%d failed\n", reg);
 200                goto out;
 201        }
 202
 203        data &= ~mask;
 204        err = wm8350_write(wm8350, reg, 1, &data);
 205        if (err)
 206                dev_err(wm8350->dev, "write to reg R%d failed\n", reg);
 207out:
 208        mutex_unlock(&io_mutex);
 209        return err;
 210}
 211EXPORT_SYMBOL_GPL(wm8350_clear_bits);
 212
 213int wm8350_set_bits(struct wm8350 *wm8350, u16 reg, u16 mask)
 214{
 215        u16 data;
 216        int err;
 217
 218        mutex_lock(&io_mutex);
 219        err = wm8350_read(wm8350, reg, 1, &data);
 220        if (err) {
 221                dev_err(wm8350->dev, "read from reg R%d failed\n", reg);
 222                goto out;
 223        }
 224
 225        data |= mask;
 226        err = wm8350_write(wm8350, reg, 1, &data);
 227        if (err)
 228                dev_err(wm8350->dev, "write to reg R%d failed\n", reg);
 229out:
 230        mutex_unlock(&io_mutex);
 231        return err;
 232}
 233EXPORT_SYMBOL_GPL(wm8350_set_bits);
 234
 235u16 wm8350_reg_read(struct wm8350 *wm8350, int reg)
 236{
 237        u16 data;
 238        int err;
 239
 240        mutex_lock(&io_mutex);
 241        err = wm8350_read(wm8350, reg, 1, &data);
 242        if (err)
 243                dev_err(wm8350->dev, "read from reg R%d failed\n", reg);
 244
 245        mutex_unlock(&io_mutex);
 246        return data;
 247}
 248EXPORT_SYMBOL_GPL(wm8350_reg_read);
 249
 250int wm8350_reg_write(struct wm8350 *wm8350, int reg, u16 val)
 251{
 252        int ret;
 253        u16 data = val;
 254
 255        mutex_lock(&io_mutex);
 256        ret = wm8350_write(wm8350, reg, 1, &data);
 257        if (ret)
 258                dev_err(wm8350->dev, "write to reg R%d failed\n", reg);
 259        mutex_unlock(&io_mutex);
 260        return ret;
 261}
 262EXPORT_SYMBOL_GPL(wm8350_reg_write);
 263
 264int wm8350_block_read(struct wm8350 *wm8350, int start_reg, int regs,
 265                      u16 *dest)
 266{
 267        int err = 0;
 268
 269        mutex_lock(&io_mutex);
 270        err = wm8350_read(wm8350, start_reg, regs, dest);
 271        if (err)
 272                dev_err(wm8350->dev, "block read starting from R%d failed\n",
 273                        start_reg);
 274        mutex_unlock(&io_mutex);
 275        return err;
 276}
 277EXPORT_SYMBOL_GPL(wm8350_block_read);
 278
 279int wm8350_block_write(struct wm8350 *wm8350, int start_reg, int regs,
 280                       u16 *src)
 281{
 282        int ret = 0;
 283
 284        mutex_lock(&io_mutex);
 285        ret = wm8350_write(wm8350, start_reg, regs, src);
 286        if (ret)
 287                dev_err(wm8350->dev, "block write starting at R%d failed\n",
 288                        start_reg);
 289        mutex_unlock(&io_mutex);
 290        return ret;
 291}
 292EXPORT_SYMBOL_GPL(wm8350_block_write);
 293
 294/**
 295 * wm8350_reg_lock()
 296 *
 297 * The WM8350 has a hardware lock which can be used to prevent writes to
 298 * some registers (generally those which can cause particularly serious
 299 * problems if misused).  This function enables that lock.
 300 */
 301int wm8350_reg_lock(struct wm8350 *wm8350)
 302{
 303        u16 key = WM8350_LOCK_KEY;
 304        int ret;
 305
 306        ldbg(__func__);
 307        mutex_lock(&io_mutex);
 308        ret = wm8350_write(wm8350, WM8350_SECURITY, 1, &key);
 309        if (ret)
 310                dev_err(wm8350->dev, "lock failed\n");
 311        mutex_unlock(&io_mutex);
 312        return ret;
 313}
 314EXPORT_SYMBOL_GPL(wm8350_reg_lock);
 315
 316/**
 317 * wm8350_reg_unlock()
 318 *
 319 * The WM8350 has a hardware lock which can be used to prevent writes to
 320 * some registers (generally those which can cause particularly serious
 321 * problems if misused).  This function disables that lock so updates
 322 * can be performed.  For maximum safety this should be done only when
 323 * required.
 324 */
 325int wm8350_reg_unlock(struct wm8350 *wm8350)
 326{
 327        u16 key = WM8350_UNLOCK_KEY;
 328        int ret;
 329
 330        ldbg(__func__);
 331        mutex_lock(&io_mutex);
 332        ret = wm8350_write(wm8350, WM8350_SECURITY, 1, &key);
 333        if (ret)
 334                dev_err(wm8350->dev, "unlock failed\n");
 335        mutex_unlock(&io_mutex);
 336        return ret;
 337}
 338EXPORT_SYMBOL_GPL(wm8350_reg_unlock);
 339
 340static void wm8350_irq_call_handler(struct wm8350 *wm8350, int irq)
 341{
 342        mutex_lock(&wm8350->irq_mutex);
 343
 344        if (wm8350->irq[irq].handler)
 345                wm8350->irq[irq].handler(wm8350, irq, wm8350->irq[irq].data);
 346        else {
 347                dev_err(wm8350->dev, "irq %d nobody cared. now masked.\n",
 348                        irq);
 349                wm8350_mask_irq(wm8350, irq);
 350        }
 351
 352        mutex_unlock(&wm8350->irq_mutex);
 353}
 354
 355/*
 356 * This is a threaded IRQ handler so can access I2C/SPI.  Since all
 357 * interrupts are clear on read the IRQ line will be reasserted and
 358 * the physical IRQ will be handled again if another interrupt is
 359 * asserted while we run - in the normal course of events this is a
 360 * rare occurrence so we save I2C/SPI reads.
 361 */
 362static irqreturn_t wm8350_irq(int irq, void *data)
 363{
 364        struct wm8350 *wm8350 = data;
 365        u16 level_one, status1, status2, comp;
 366
 367        /* TODO: Use block reads to improve performance? */
 368        level_one = wm8350_reg_read(wm8350, WM8350_SYSTEM_INTERRUPTS)
 369                & ~wm8350_reg_read(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK);
 370        status1 = wm8350_reg_read(wm8350, WM8350_INT_STATUS_1)
 371                & ~wm8350_reg_read(wm8350, WM8350_INT_STATUS_1_MASK);
 372        status2 = wm8350_reg_read(wm8350, WM8350_INT_STATUS_2)
 373                & ~wm8350_reg_read(wm8350, WM8350_INT_STATUS_2_MASK);
 374        comp = wm8350_reg_read(wm8350, WM8350_COMPARATOR_INT_STATUS)
 375                & ~wm8350_reg_read(wm8350, WM8350_COMPARATOR_INT_STATUS_MASK);
 376
 377        /* over current */
 378        if (level_one & WM8350_OC_INT) {
 379                u16 oc;
 380
 381                oc = wm8350_reg_read(wm8350, WM8350_OVER_CURRENT_INT_STATUS);
 382                oc &= ~wm8350_reg_read(wm8350,
 383                                       WM8350_OVER_CURRENT_INT_STATUS_MASK);
 384
 385                if (oc & WM8350_OC_LS_EINT)     /* limit switch */
 386                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_OC_LS);
 387        }
 388
 389        /* under voltage */
 390        if (level_one & WM8350_UV_INT) {
 391                u16 uv;
 392
 393                uv = wm8350_reg_read(wm8350, WM8350_UNDER_VOLTAGE_INT_STATUS);
 394                uv &= ~wm8350_reg_read(wm8350,
 395                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK);
 396
 397                if (uv & WM8350_UV_DC1_EINT)
 398                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC1);
 399                if (uv & WM8350_UV_DC2_EINT)
 400                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC2);
 401                if (uv & WM8350_UV_DC3_EINT)
 402                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC3);
 403                if (uv & WM8350_UV_DC4_EINT)
 404                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC4);
 405                if (uv & WM8350_UV_DC5_EINT)
 406                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC5);
 407                if (uv & WM8350_UV_DC6_EINT)
 408                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_DC6);
 409                if (uv & WM8350_UV_LDO1_EINT)
 410                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_LDO1);
 411                if (uv & WM8350_UV_LDO2_EINT)
 412                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_LDO2);
 413                if (uv & WM8350_UV_LDO3_EINT)
 414                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_LDO3);
 415                if (uv & WM8350_UV_LDO4_EINT)
 416                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_UV_LDO4);
 417        }
 418
 419        /* charger, RTC */
 420        if (status1) {
 421                if (status1 & WM8350_CHG_BAT_HOT_EINT)
 422                        wm8350_irq_call_handler(wm8350,
 423                                                WM8350_IRQ_CHG_BAT_HOT);
 424                if (status1 & WM8350_CHG_BAT_COLD_EINT)
 425                        wm8350_irq_call_handler(wm8350,
 426                                                WM8350_IRQ_CHG_BAT_COLD);
 427                if (status1 & WM8350_CHG_BAT_FAIL_EINT)
 428                        wm8350_irq_call_handler(wm8350,
 429                                                WM8350_IRQ_CHG_BAT_FAIL);
 430                if (status1 & WM8350_CHG_TO_EINT)
 431                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_CHG_TO);
 432                if (status1 & WM8350_CHG_END_EINT)
 433                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_CHG_END);
 434                if (status1 & WM8350_CHG_START_EINT)
 435                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_CHG_START);
 436                if (status1 & WM8350_CHG_FAST_RDY_EINT)
 437                        wm8350_irq_call_handler(wm8350,
 438                                                WM8350_IRQ_CHG_FAST_RDY);
 439                if (status1 & WM8350_CHG_VBATT_LT_3P9_EINT)
 440                        wm8350_irq_call_handler(wm8350,
 441                                                WM8350_IRQ_CHG_VBATT_LT_3P9);
 442                if (status1 & WM8350_CHG_VBATT_LT_3P1_EINT)
 443                        wm8350_irq_call_handler(wm8350,
 444                                                WM8350_IRQ_CHG_VBATT_LT_3P1);
 445                if (status1 & WM8350_CHG_VBATT_LT_2P85_EINT)
 446                        wm8350_irq_call_handler(wm8350,
 447                                                WM8350_IRQ_CHG_VBATT_LT_2P85);
 448                if (status1 & WM8350_RTC_ALM_EINT)
 449                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_RTC_ALM);
 450                if (status1 & WM8350_RTC_SEC_EINT)
 451                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_RTC_SEC);
 452                if (status1 & WM8350_RTC_PER_EINT)
 453                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_RTC_PER);
 454        }
 455
 456        /* current sink, system, aux adc */
 457        if (status2) {
 458                if (status2 & WM8350_CS1_EINT)
 459                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_CS1);
 460                if (status2 & WM8350_CS2_EINT)
 461                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_CS2);
 462
 463                if (status2 & WM8350_SYS_HYST_COMP_FAIL_EINT)
 464                        wm8350_irq_call_handler(wm8350,
 465                                                WM8350_IRQ_SYS_HYST_COMP_FAIL);
 466                if (status2 & WM8350_SYS_CHIP_GT115_EINT)
 467                        wm8350_irq_call_handler(wm8350,
 468                                                WM8350_IRQ_SYS_CHIP_GT115);
 469                if (status2 & WM8350_SYS_CHIP_GT140_EINT)
 470                        wm8350_irq_call_handler(wm8350,
 471                                                WM8350_IRQ_SYS_CHIP_GT140);
 472                if (status2 & WM8350_SYS_WDOG_TO_EINT)
 473                        wm8350_irq_call_handler(wm8350,
 474                                                WM8350_IRQ_SYS_WDOG_TO);
 475
 476                if (status2 & WM8350_AUXADC_DATARDY_EINT)
 477                        wm8350_irq_call_handler(wm8350,
 478                                                WM8350_IRQ_AUXADC_DATARDY);
 479                if (status2 & WM8350_AUXADC_DCOMP4_EINT)
 480                        wm8350_irq_call_handler(wm8350,
 481                                                WM8350_IRQ_AUXADC_DCOMP4);
 482                if (status2 & WM8350_AUXADC_DCOMP3_EINT)
 483                        wm8350_irq_call_handler(wm8350,
 484                                                WM8350_IRQ_AUXADC_DCOMP3);
 485                if (status2 & WM8350_AUXADC_DCOMP2_EINT)
 486                        wm8350_irq_call_handler(wm8350,
 487                                                WM8350_IRQ_AUXADC_DCOMP2);
 488                if (status2 & WM8350_AUXADC_DCOMP1_EINT)
 489                        wm8350_irq_call_handler(wm8350,
 490                                                WM8350_IRQ_AUXADC_DCOMP1);
 491
 492                if (status2 & WM8350_USB_LIMIT_EINT)
 493                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_USB_LIMIT);
 494        }
 495
 496        /* wake, codec, ext */
 497        if (comp) {
 498                if (comp & WM8350_WKUP_OFF_STATE_EINT)
 499                        wm8350_irq_call_handler(wm8350,
 500                                                WM8350_IRQ_WKUP_OFF_STATE);
 501                if (comp & WM8350_WKUP_HIB_STATE_EINT)
 502                        wm8350_irq_call_handler(wm8350,
 503                                                WM8350_IRQ_WKUP_HIB_STATE);
 504                if (comp & WM8350_WKUP_CONV_FAULT_EINT)
 505                        wm8350_irq_call_handler(wm8350,
 506                                                WM8350_IRQ_WKUP_CONV_FAULT);
 507                if (comp & WM8350_WKUP_WDOG_RST_EINT)
 508                        wm8350_irq_call_handler(wm8350,
 509                                                WM8350_IRQ_WKUP_WDOG_RST);
 510                if (comp & WM8350_WKUP_GP_PWR_ON_EINT)
 511                        wm8350_irq_call_handler(wm8350,
 512                                                WM8350_IRQ_WKUP_GP_PWR_ON);
 513                if (comp & WM8350_WKUP_ONKEY_EINT)
 514                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_WKUP_ONKEY);
 515                if (comp & WM8350_WKUP_GP_WAKEUP_EINT)
 516                        wm8350_irq_call_handler(wm8350,
 517                                                WM8350_IRQ_WKUP_GP_WAKEUP);
 518
 519                if (comp & WM8350_CODEC_JCK_DET_L_EINT)
 520                        wm8350_irq_call_handler(wm8350,
 521                                                WM8350_IRQ_CODEC_JCK_DET_L);
 522                if (comp & WM8350_CODEC_JCK_DET_R_EINT)
 523                        wm8350_irq_call_handler(wm8350,
 524                                                WM8350_IRQ_CODEC_JCK_DET_R);
 525                if (comp & WM8350_CODEC_MICSCD_EINT)
 526                        wm8350_irq_call_handler(wm8350,
 527                                                WM8350_IRQ_CODEC_MICSCD);
 528                if (comp & WM8350_CODEC_MICD_EINT)
 529                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_CODEC_MICD);
 530
 531                if (comp & WM8350_EXT_USB_FB_EINT)
 532                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_EXT_USB_FB);
 533                if (comp & WM8350_EXT_WALL_FB_EINT)
 534                        wm8350_irq_call_handler(wm8350,
 535                                                WM8350_IRQ_EXT_WALL_FB);
 536                if (comp & WM8350_EXT_BAT_FB_EINT)
 537                        wm8350_irq_call_handler(wm8350, WM8350_IRQ_EXT_BAT_FB);
 538        }
 539
 540        if (level_one & WM8350_GP_INT) {
 541                int i;
 542                u16 gpio;
 543
 544                gpio = wm8350_reg_read(wm8350, WM8350_GPIO_INT_STATUS);
 545                gpio &= ~wm8350_reg_read(wm8350,
 546                                         WM8350_GPIO_INT_STATUS_MASK);
 547
 548                for (i = 0; i < 12; i++) {
 549                        if (gpio & (1 << i))
 550                                wm8350_irq_call_handler(wm8350,
 551                                                        WM8350_IRQ_GPIO(i));
 552                }
 553        }
 554
 555        return IRQ_HANDLED;
 556}
 557
 558int wm8350_register_irq(struct wm8350 *wm8350, int irq,
 559                        void (*handler) (struct wm8350 *, int, void *),
 560                        void *data)
 561{
 562        if (irq < 0 || irq > WM8350_NUM_IRQ || !handler)
 563                return -EINVAL;
 564
 565        if (wm8350->irq[irq].handler)
 566                return -EBUSY;
 567
 568        mutex_lock(&wm8350->irq_mutex);
 569        wm8350->irq[irq].handler = handler;
 570        wm8350->irq[irq].data = data;
 571        mutex_unlock(&wm8350->irq_mutex);
 572
 573        return 0;
 574}
 575EXPORT_SYMBOL_GPL(wm8350_register_irq);
 576
 577int wm8350_free_irq(struct wm8350 *wm8350, int irq)
 578{
 579        if (irq < 0 || irq > WM8350_NUM_IRQ)
 580                return -EINVAL;
 581
 582        mutex_lock(&wm8350->irq_mutex);
 583        wm8350->irq[irq].handler = NULL;
 584        mutex_unlock(&wm8350->irq_mutex);
 585        return 0;
 586}
 587EXPORT_SYMBOL_GPL(wm8350_free_irq);
 588
 589int wm8350_mask_irq(struct wm8350 *wm8350, int irq)
 590{
 591        switch (irq) {
 592        case WM8350_IRQ_CHG_BAT_HOT:
 593                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 594                                       WM8350_IM_CHG_BAT_HOT_EINT);
 595        case WM8350_IRQ_CHG_BAT_COLD:
 596                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 597                                       WM8350_IM_CHG_BAT_COLD_EINT);
 598        case WM8350_IRQ_CHG_BAT_FAIL:
 599                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 600                                       WM8350_IM_CHG_BAT_FAIL_EINT);
 601        case WM8350_IRQ_CHG_TO:
 602                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 603                                       WM8350_IM_CHG_TO_EINT);
 604        case WM8350_IRQ_CHG_END:
 605                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 606                                       WM8350_IM_CHG_END_EINT);
 607        case WM8350_IRQ_CHG_START:
 608                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 609                                       WM8350_IM_CHG_START_EINT);
 610        case WM8350_IRQ_CHG_FAST_RDY:
 611                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 612                                       WM8350_IM_CHG_FAST_RDY_EINT);
 613        case WM8350_IRQ_RTC_PER:
 614                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 615                                       WM8350_IM_RTC_PER_EINT);
 616        case WM8350_IRQ_RTC_SEC:
 617                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 618                                       WM8350_IM_RTC_SEC_EINT);
 619        case WM8350_IRQ_RTC_ALM:
 620                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 621                                       WM8350_IM_RTC_ALM_EINT);
 622        case WM8350_IRQ_CHG_VBATT_LT_3P9:
 623                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 624                                       WM8350_IM_CHG_VBATT_LT_3P9_EINT);
 625        case WM8350_IRQ_CHG_VBATT_LT_3P1:
 626                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 627                                       WM8350_IM_CHG_VBATT_LT_3P1_EINT);
 628        case WM8350_IRQ_CHG_VBATT_LT_2P85:
 629                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 630                                       WM8350_IM_CHG_VBATT_LT_2P85_EINT);
 631        case WM8350_IRQ_CS1:
 632                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 633                                       WM8350_IM_CS1_EINT);
 634        case WM8350_IRQ_CS2:
 635                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 636                                       WM8350_IM_CS2_EINT);
 637        case WM8350_IRQ_USB_LIMIT:
 638                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 639                                       WM8350_IM_USB_LIMIT_EINT);
 640        case WM8350_IRQ_AUXADC_DATARDY:
 641                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 642                                       WM8350_IM_AUXADC_DATARDY_EINT);
 643        case WM8350_IRQ_AUXADC_DCOMP4:
 644                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 645                                       WM8350_IM_AUXADC_DCOMP4_EINT);
 646        case WM8350_IRQ_AUXADC_DCOMP3:
 647                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 648                                       WM8350_IM_AUXADC_DCOMP3_EINT);
 649        case WM8350_IRQ_AUXADC_DCOMP2:
 650                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 651                                       WM8350_IM_AUXADC_DCOMP2_EINT);
 652        case WM8350_IRQ_AUXADC_DCOMP1:
 653                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 654                                       WM8350_IM_AUXADC_DCOMP1_EINT);
 655        case WM8350_IRQ_SYS_HYST_COMP_FAIL:
 656                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 657                                       WM8350_IM_SYS_HYST_COMP_FAIL_EINT);
 658        case WM8350_IRQ_SYS_CHIP_GT115:
 659                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 660                                       WM8350_IM_SYS_CHIP_GT115_EINT);
 661        case WM8350_IRQ_SYS_CHIP_GT140:
 662                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 663                                       WM8350_IM_SYS_CHIP_GT140_EINT);
 664        case WM8350_IRQ_SYS_WDOG_TO:
 665                return wm8350_set_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 666                                       WM8350_IM_SYS_WDOG_TO_EINT);
 667        case WM8350_IRQ_UV_LDO4:
 668                return wm8350_set_bits(wm8350,
 669                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 670                                       WM8350_IM_UV_LDO4_EINT);
 671        case WM8350_IRQ_UV_LDO3:
 672                return wm8350_set_bits(wm8350,
 673                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 674                                       WM8350_IM_UV_LDO3_EINT);
 675        case WM8350_IRQ_UV_LDO2:
 676                return wm8350_set_bits(wm8350,
 677                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 678                                       WM8350_IM_UV_LDO2_EINT);
 679        case WM8350_IRQ_UV_LDO1:
 680                return wm8350_set_bits(wm8350,
 681                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 682                                       WM8350_IM_UV_LDO1_EINT);
 683        case WM8350_IRQ_UV_DC6:
 684                return wm8350_set_bits(wm8350,
 685                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 686                                       WM8350_IM_UV_DC6_EINT);
 687        case WM8350_IRQ_UV_DC5:
 688                return wm8350_set_bits(wm8350,
 689                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 690                                       WM8350_IM_UV_DC5_EINT);
 691        case WM8350_IRQ_UV_DC4:
 692                return wm8350_set_bits(wm8350,
 693                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 694                                       WM8350_IM_UV_DC4_EINT);
 695        case WM8350_IRQ_UV_DC3:
 696                return wm8350_set_bits(wm8350,
 697                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 698                                       WM8350_IM_UV_DC3_EINT);
 699        case WM8350_IRQ_UV_DC2:
 700                return wm8350_set_bits(wm8350,
 701                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 702                                       WM8350_IM_UV_DC2_EINT);
 703        case WM8350_IRQ_UV_DC1:
 704                return wm8350_set_bits(wm8350,
 705                                       WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 706                                       WM8350_IM_UV_DC1_EINT);
 707        case WM8350_IRQ_OC_LS:
 708                return wm8350_set_bits(wm8350,
 709                                       WM8350_OVER_CURRENT_INT_STATUS_MASK,
 710                                       WM8350_IM_OC_LS_EINT);
 711        case WM8350_IRQ_EXT_USB_FB:
 712                return wm8350_set_bits(wm8350,
 713                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 714                                       WM8350_IM_EXT_USB_FB_EINT);
 715        case WM8350_IRQ_EXT_WALL_FB:
 716                return wm8350_set_bits(wm8350,
 717                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 718                                       WM8350_IM_EXT_WALL_FB_EINT);
 719        case WM8350_IRQ_EXT_BAT_FB:
 720                return wm8350_set_bits(wm8350,
 721                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 722                                       WM8350_IM_EXT_BAT_FB_EINT);
 723        case WM8350_IRQ_CODEC_JCK_DET_L:
 724                return wm8350_set_bits(wm8350,
 725                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 726                                       WM8350_IM_CODEC_JCK_DET_L_EINT);
 727        case WM8350_IRQ_CODEC_JCK_DET_R:
 728                return wm8350_set_bits(wm8350,
 729                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 730                                       WM8350_IM_CODEC_JCK_DET_R_EINT);
 731        case WM8350_IRQ_CODEC_MICSCD:
 732                return wm8350_set_bits(wm8350,
 733                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 734                                       WM8350_IM_CODEC_MICSCD_EINT);
 735        case WM8350_IRQ_CODEC_MICD:
 736                return wm8350_set_bits(wm8350,
 737                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 738                                       WM8350_IM_CODEC_MICD_EINT);
 739        case WM8350_IRQ_WKUP_OFF_STATE:
 740                return wm8350_set_bits(wm8350,
 741                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 742                                       WM8350_IM_WKUP_OFF_STATE_EINT);
 743        case WM8350_IRQ_WKUP_HIB_STATE:
 744                return wm8350_set_bits(wm8350,
 745                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 746                                       WM8350_IM_WKUP_HIB_STATE_EINT);
 747        case WM8350_IRQ_WKUP_CONV_FAULT:
 748                return wm8350_set_bits(wm8350,
 749                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 750                                       WM8350_IM_WKUP_CONV_FAULT_EINT);
 751        case WM8350_IRQ_WKUP_WDOG_RST:
 752                return wm8350_set_bits(wm8350,
 753                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 754                                       WM8350_IM_WKUP_OFF_STATE_EINT);
 755        case WM8350_IRQ_WKUP_GP_PWR_ON:
 756                return wm8350_set_bits(wm8350,
 757                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 758                                       WM8350_IM_WKUP_GP_PWR_ON_EINT);
 759        case WM8350_IRQ_WKUP_ONKEY:
 760                return wm8350_set_bits(wm8350,
 761                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 762                                       WM8350_IM_WKUP_ONKEY_EINT);
 763        case WM8350_IRQ_WKUP_GP_WAKEUP:
 764                return wm8350_set_bits(wm8350,
 765                                       WM8350_COMPARATOR_INT_STATUS_MASK,
 766                                       WM8350_IM_WKUP_GP_WAKEUP_EINT);
 767        case WM8350_IRQ_GPIO(0):
 768                return wm8350_set_bits(wm8350,
 769                                       WM8350_GPIO_INT_STATUS_MASK,
 770                                       WM8350_IM_GP0_EINT);
 771        case WM8350_IRQ_GPIO(1):
 772                return wm8350_set_bits(wm8350,
 773                                       WM8350_GPIO_INT_STATUS_MASK,
 774                                       WM8350_IM_GP1_EINT);
 775        case WM8350_IRQ_GPIO(2):
 776                return wm8350_set_bits(wm8350,
 777                                       WM8350_GPIO_INT_STATUS_MASK,
 778                                       WM8350_IM_GP2_EINT);
 779        case WM8350_IRQ_GPIO(3):
 780                return wm8350_set_bits(wm8350,
 781                                       WM8350_GPIO_INT_STATUS_MASK,
 782                                       WM8350_IM_GP3_EINT);
 783        case WM8350_IRQ_GPIO(4):
 784                return wm8350_set_bits(wm8350,
 785                                       WM8350_GPIO_INT_STATUS_MASK,
 786                                       WM8350_IM_GP4_EINT);
 787        case WM8350_IRQ_GPIO(5):
 788                return wm8350_set_bits(wm8350,
 789                                       WM8350_GPIO_INT_STATUS_MASK,
 790                                       WM8350_IM_GP5_EINT);
 791        case WM8350_IRQ_GPIO(6):
 792                return wm8350_set_bits(wm8350,
 793                                       WM8350_GPIO_INT_STATUS_MASK,
 794                                       WM8350_IM_GP6_EINT);
 795        case WM8350_IRQ_GPIO(7):
 796                return wm8350_set_bits(wm8350,
 797                                       WM8350_GPIO_INT_STATUS_MASK,
 798                                       WM8350_IM_GP7_EINT);
 799        case WM8350_IRQ_GPIO(8):
 800                return wm8350_set_bits(wm8350,
 801                                       WM8350_GPIO_INT_STATUS_MASK,
 802                                       WM8350_IM_GP8_EINT);
 803        case WM8350_IRQ_GPIO(9):
 804                return wm8350_set_bits(wm8350,
 805                                       WM8350_GPIO_INT_STATUS_MASK,
 806                                       WM8350_IM_GP9_EINT);
 807        case WM8350_IRQ_GPIO(10):
 808                return wm8350_set_bits(wm8350,
 809                                       WM8350_GPIO_INT_STATUS_MASK,
 810                                       WM8350_IM_GP10_EINT);
 811        case WM8350_IRQ_GPIO(11):
 812                return wm8350_set_bits(wm8350,
 813                                       WM8350_GPIO_INT_STATUS_MASK,
 814                                       WM8350_IM_GP11_EINT);
 815        case WM8350_IRQ_GPIO(12):
 816                return wm8350_set_bits(wm8350,
 817                                       WM8350_GPIO_INT_STATUS_MASK,
 818                                       WM8350_IM_GP12_EINT);
 819        default:
 820                dev_warn(wm8350->dev, "Attempting to mask unknown IRQ %d\n",
 821                         irq);
 822                return -EINVAL;
 823        }
 824        return 0;
 825}
 826EXPORT_SYMBOL_GPL(wm8350_mask_irq);
 827
 828int wm8350_unmask_irq(struct wm8350 *wm8350, int irq)
 829{
 830        switch (irq) {
 831        case WM8350_IRQ_CHG_BAT_HOT:
 832                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 833                                         WM8350_IM_CHG_BAT_HOT_EINT);
 834        case WM8350_IRQ_CHG_BAT_COLD:
 835                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 836                                         WM8350_IM_CHG_BAT_COLD_EINT);
 837        case WM8350_IRQ_CHG_BAT_FAIL:
 838                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 839                                         WM8350_IM_CHG_BAT_FAIL_EINT);
 840        case WM8350_IRQ_CHG_TO:
 841                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 842                                         WM8350_IM_CHG_TO_EINT);
 843        case WM8350_IRQ_CHG_END:
 844                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 845                                         WM8350_IM_CHG_END_EINT);
 846        case WM8350_IRQ_CHG_START:
 847                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 848                                         WM8350_IM_CHG_START_EINT);
 849        case WM8350_IRQ_CHG_FAST_RDY:
 850                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 851                                         WM8350_IM_CHG_FAST_RDY_EINT);
 852        case WM8350_IRQ_RTC_PER:
 853                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 854                                         WM8350_IM_RTC_PER_EINT);
 855        case WM8350_IRQ_RTC_SEC:
 856                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 857                                         WM8350_IM_RTC_SEC_EINT);
 858        case WM8350_IRQ_RTC_ALM:
 859                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 860                                         WM8350_IM_RTC_ALM_EINT);
 861        case WM8350_IRQ_CHG_VBATT_LT_3P9:
 862                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 863                                         WM8350_IM_CHG_VBATT_LT_3P9_EINT);
 864        case WM8350_IRQ_CHG_VBATT_LT_3P1:
 865                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 866                                         WM8350_IM_CHG_VBATT_LT_3P1_EINT);
 867        case WM8350_IRQ_CHG_VBATT_LT_2P85:
 868                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_1_MASK,
 869                                         WM8350_IM_CHG_VBATT_LT_2P85_EINT);
 870        case WM8350_IRQ_CS1:
 871                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 872                                         WM8350_IM_CS1_EINT);
 873        case WM8350_IRQ_CS2:
 874                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 875                                         WM8350_IM_CS2_EINT);
 876        case WM8350_IRQ_USB_LIMIT:
 877                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 878                                         WM8350_IM_USB_LIMIT_EINT);
 879        case WM8350_IRQ_AUXADC_DATARDY:
 880                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 881                                         WM8350_IM_AUXADC_DATARDY_EINT);
 882        case WM8350_IRQ_AUXADC_DCOMP4:
 883                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 884                                         WM8350_IM_AUXADC_DCOMP4_EINT);
 885        case WM8350_IRQ_AUXADC_DCOMP3:
 886                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 887                                         WM8350_IM_AUXADC_DCOMP3_EINT);
 888        case WM8350_IRQ_AUXADC_DCOMP2:
 889                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 890                                         WM8350_IM_AUXADC_DCOMP2_EINT);
 891        case WM8350_IRQ_AUXADC_DCOMP1:
 892                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 893                                         WM8350_IM_AUXADC_DCOMP1_EINT);
 894        case WM8350_IRQ_SYS_HYST_COMP_FAIL:
 895                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 896                                         WM8350_IM_SYS_HYST_COMP_FAIL_EINT);
 897        case WM8350_IRQ_SYS_CHIP_GT115:
 898                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 899                                         WM8350_IM_SYS_CHIP_GT115_EINT);
 900        case WM8350_IRQ_SYS_CHIP_GT140:
 901                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 902                                         WM8350_IM_SYS_CHIP_GT140_EINT);
 903        case WM8350_IRQ_SYS_WDOG_TO:
 904                return wm8350_clear_bits(wm8350, WM8350_INT_STATUS_2_MASK,
 905                                         WM8350_IM_SYS_WDOG_TO_EINT);
 906        case WM8350_IRQ_UV_LDO4:
 907                return wm8350_clear_bits(wm8350,
 908                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 909                                         WM8350_IM_UV_LDO4_EINT);
 910        case WM8350_IRQ_UV_LDO3:
 911                return wm8350_clear_bits(wm8350,
 912                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 913                                         WM8350_IM_UV_LDO3_EINT);
 914        case WM8350_IRQ_UV_LDO2:
 915                return wm8350_clear_bits(wm8350,
 916                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 917                                         WM8350_IM_UV_LDO2_EINT);
 918        case WM8350_IRQ_UV_LDO1:
 919                return wm8350_clear_bits(wm8350,
 920                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 921                                         WM8350_IM_UV_LDO1_EINT);
 922        case WM8350_IRQ_UV_DC6:
 923                return wm8350_clear_bits(wm8350,
 924                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 925                                         WM8350_IM_UV_DC6_EINT);
 926        case WM8350_IRQ_UV_DC5:
 927                return wm8350_clear_bits(wm8350,
 928                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 929                                         WM8350_IM_UV_DC5_EINT);
 930        case WM8350_IRQ_UV_DC4:
 931                return wm8350_clear_bits(wm8350,
 932                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 933                                         WM8350_IM_UV_DC4_EINT);
 934        case WM8350_IRQ_UV_DC3:
 935                return wm8350_clear_bits(wm8350,
 936                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 937                                         WM8350_IM_UV_DC3_EINT);
 938        case WM8350_IRQ_UV_DC2:
 939                return wm8350_clear_bits(wm8350,
 940                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 941                                         WM8350_IM_UV_DC2_EINT);
 942        case WM8350_IRQ_UV_DC1:
 943                return wm8350_clear_bits(wm8350,
 944                                         WM8350_UNDER_VOLTAGE_INT_STATUS_MASK,
 945                                         WM8350_IM_UV_DC1_EINT);
 946        case WM8350_IRQ_OC_LS:
 947                return wm8350_clear_bits(wm8350,
 948                                         WM8350_OVER_CURRENT_INT_STATUS_MASK,
 949                                         WM8350_IM_OC_LS_EINT);
 950        case WM8350_IRQ_EXT_USB_FB:
 951                return wm8350_clear_bits(wm8350,
 952                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 953                                         WM8350_IM_EXT_USB_FB_EINT);
 954        case WM8350_IRQ_EXT_WALL_FB:
 955                return wm8350_clear_bits(wm8350,
 956                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 957                                         WM8350_IM_EXT_WALL_FB_EINT);
 958        case WM8350_IRQ_EXT_BAT_FB:
 959                return wm8350_clear_bits(wm8350,
 960                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 961                                         WM8350_IM_EXT_BAT_FB_EINT);
 962        case WM8350_IRQ_CODEC_JCK_DET_L:
 963                return wm8350_clear_bits(wm8350,
 964                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 965                                         WM8350_IM_CODEC_JCK_DET_L_EINT);
 966        case WM8350_IRQ_CODEC_JCK_DET_R:
 967                return wm8350_clear_bits(wm8350,
 968                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 969                                         WM8350_IM_CODEC_JCK_DET_R_EINT);
 970        case WM8350_IRQ_CODEC_MICSCD:
 971                return wm8350_clear_bits(wm8350,
 972                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 973                                         WM8350_IM_CODEC_MICSCD_EINT);
 974        case WM8350_IRQ_CODEC_MICD:
 975                return wm8350_clear_bits(wm8350,
 976                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 977                                         WM8350_IM_CODEC_MICD_EINT);
 978        case WM8350_IRQ_WKUP_OFF_STATE:
 979                return wm8350_clear_bits(wm8350,
 980                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 981                                         WM8350_IM_WKUP_OFF_STATE_EINT);
 982        case WM8350_IRQ_WKUP_HIB_STATE:
 983                return wm8350_clear_bits(wm8350,
 984                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 985                                         WM8350_IM_WKUP_HIB_STATE_EINT);
 986        case WM8350_IRQ_WKUP_CONV_FAULT:
 987                return wm8350_clear_bits(wm8350,
 988                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 989                                         WM8350_IM_WKUP_CONV_FAULT_EINT);
 990        case WM8350_IRQ_WKUP_WDOG_RST:
 991                return wm8350_clear_bits(wm8350,
 992                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 993                                         WM8350_IM_WKUP_OFF_STATE_EINT);
 994        case WM8350_IRQ_WKUP_GP_PWR_ON:
 995                return wm8350_clear_bits(wm8350,
 996                                         WM8350_COMPARATOR_INT_STATUS_MASK,
 997                                         WM8350_IM_WKUP_GP_PWR_ON_EINT);
 998        case WM8350_IRQ_WKUP_ONKEY:
 999                return wm8350_clear_bits(wm8350,
1000                                         WM8350_COMPARATOR_INT_STATUS_MASK,
1001                                         WM8350_IM_WKUP_ONKEY_EINT);
1002        case WM8350_IRQ_WKUP_GP_WAKEUP:
1003                return wm8350_clear_bits(wm8350,
1004                                         WM8350_COMPARATOR_INT_STATUS_MASK,
1005                                         WM8350_IM_WKUP_GP_WAKEUP_EINT);
1006        case WM8350_IRQ_GPIO(0):
1007                return wm8350_clear_bits(wm8350,
1008                                         WM8350_GPIO_INT_STATUS_MASK,
1009                                         WM8350_IM_GP0_EINT);
1010        case WM8350_IRQ_GPIO(1):
1011                return wm8350_clear_bits(wm8350,
1012                                         WM8350_GPIO_INT_STATUS_MASK,
1013                                         WM8350_IM_GP1_EINT);
1014        case WM8350_IRQ_GPIO(2):
1015                return wm8350_clear_bits(wm8350,
1016                                         WM8350_GPIO_INT_STATUS_MASK,
1017                                         WM8350_IM_GP2_EINT);
1018        case WM8350_IRQ_GPIO(3):
1019                return wm8350_clear_bits(wm8350,
1020                                         WM8350_GPIO_INT_STATUS_MASK,
1021                                         WM8350_IM_GP3_EINT);
1022        case WM8350_IRQ_GPIO(4):
1023                return wm8350_clear_bits(wm8350,
1024                                         WM8350_GPIO_INT_STATUS_MASK,
1025                                         WM8350_IM_GP4_EINT);
1026        case WM8350_IRQ_GPIO(5):
1027                return wm8350_clear_bits(wm8350,
1028                                         WM8350_GPIO_INT_STATUS_MASK,
1029                                         WM8350_IM_GP5_EINT);
1030        case WM8350_IRQ_GPIO(6):
1031                return wm8350_clear_bits(wm8350,
1032                                         WM8350_GPIO_INT_STATUS_MASK,
1033                                         WM8350_IM_GP6_EINT);
1034        case WM8350_IRQ_GPIO(7):
1035                return wm8350_clear_bits(wm8350,
1036                                         WM8350_GPIO_INT_STATUS_MASK,
1037                                         WM8350_IM_GP7_EINT);
1038        case WM8350_IRQ_GPIO(8):
1039                return wm8350_clear_bits(wm8350,
1040                                         WM8350_GPIO_INT_STATUS_MASK,
1041                                         WM8350_IM_GP8_EINT);
1042        case WM8350_IRQ_GPIO(9):
1043                return wm8350_clear_bits(wm8350,
1044                                         WM8350_GPIO_INT_STATUS_MASK,
1045                                         WM8350_IM_GP9_EINT);
1046        case WM8350_IRQ_GPIO(10):
1047                return wm8350_clear_bits(wm8350,
1048                                         WM8350_GPIO_INT_STATUS_MASK,
1049                                         WM8350_IM_GP10_EINT);
1050        case WM8350_IRQ_GPIO(11):
1051                return wm8350_clear_bits(wm8350,
1052                                         WM8350_GPIO_INT_STATUS_MASK,
1053                                         WM8350_IM_GP11_EINT);
1054        case WM8350_IRQ_GPIO(12):
1055                return wm8350_clear_bits(wm8350,
1056                                         WM8350_GPIO_INT_STATUS_MASK,
1057                                         WM8350_IM_GP12_EINT);
1058        default:
1059                dev_warn(wm8350->dev, "Attempting to unmask unknown IRQ %d\n",
1060                         irq);
1061                return -EINVAL;
1062        }
1063        return 0;
1064}
1065EXPORT_SYMBOL_GPL(wm8350_unmask_irq);
1066
1067int wm8350_read_auxadc(struct wm8350 *wm8350, int channel, int scale, int vref)
1068{
1069        u16 reg, result = 0;
1070        int tries = 5;
1071
1072        if (channel < WM8350_AUXADC_AUX1 || channel > WM8350_AUXADC_TEMP)
1073                return -EINVAL;
1074        if (channel >= WM8350_AUXADC_USB && channel <= WM8350_AUXADC_TEMP
1075            && (scale != 0 || vref != 0))
1076                return -EINVAL;
1077
1078        mutex_lock(&wm8350->auxadc_mutex);
1079
1080        /* Turn on the ADC */
1081        reg = wm8350_reg_read(wm8350, WM8350_POWER_MGMT_5);
1082        wm8350_reg_write(wm8350, WM8350_POWER_MGMT_5, reg | WM8350_AUXADC_ENA);
1083
1084        if (scale || vref) {
1085                reg = scale << 13;
1086                reg |= vref << 12;
1087                wm8350_reg_write(wm8350, WM8350_AUX1_READBACK + channel, reg);
1088        }
1089
1090        reg = wm8350_reg_read(wm8350, WM8350_DIGITISER_CONTROL_1);
1091        reg |= 1 << channel | WM8350_AUXADC_POLL;
1092        wm8350_reg_write(wm8350, WM8350_DIGITISER_CONTROL_1, reg);
1093
1094        do {
1095                schedule_timeout_interruptible(1);
1096                reg = wm8350_reg_read(wm8350, WM8350_DIGITISER_CONTROL_1);
1097        } while ((reg & WM8350_AUXADC_POLL) && --tries);
1098
1099        if (!tries)
1100                dev_err(wm8350->dev, "adc chn %d read timeout\n", channel);
1101        else
1102                result = wm8350_reg_read(wm8350,
1103                                         WM8350_AUX1_READBACK + channel);
1104
1105        /* Turn off the ADC */
1106        reg = wm8350_reg_read(wm8350, WM8350_POWER_MGMT_5);
1107        wm8350_reg_write(wm8350, WM8350_POWER_MGMT_5,
1108                         reg & ~WM8350_AUXADC_ENA);
1109
1110        mutex_unlock(&wm8350->auxadc_mutex);
1111
1112        return result & WM8350_AUXADC_DATA1_MASK;
1113}
1114EXPORT_SYMBOL_GPL(wm8350_read_auxadc);
1115
1116/*
1117 * Cache is always host endian.
1118 */
1119static int wm8350_create_cache(struct wm8350 *wm8350, int type, int mode)
1120{
1121        int i, ret = 0;
1122        u16 value;
1123        const u16 *reg_map;
1124
1125        switch (type) {
1126        case 0:
1127                switch (mode) {
1128#ifdef CONFIG_MFD_WM8350_CONFIG_MODE_0
1129                case 0:
1130                        reg_map = wm8350_mode0_defaults;
1131                        break;
1132#endif
1133#ifdef CONFIG_MFD_WM8350_CONFIG_MODE_1
1134                case 1:
1135                        reg_map = wm8350_mode1_defaults;
1136                        break;
1137#endif
1138#ifdef CONFIG_MFD_WM8350_CONFIG_MODE_2
1139                case 2:
1140                        reg_map = wm8350_mode2_defaults;
1141                        break;
1142#endif
1143#ifdef CONFIG_MFD_WM8350_CONFIG_MODE_3
1144                case 3:
1145                        reg_map = wm8350_mode3_defaults;
1146                        break;
1147#endif
1148                default:
1149                        dev_err(wm8350->dev,
1150                                "WM8350 configuration mode %d not supported\n",
1151                                mode);
1152                        return -EINVAL;
1153                }
1154                break;
1155
1156        case 1:
1157                switch (mode) {
1158#ifdef CONFIG_MFD_WM8351_CONFIG_MODE_0
1159                case 0:
1160                        reg_map = wm8351_mode0_defaults;
1161                        break;
1162#endif
1163#ifdef CONFIG_MFD_WM8351_CONFIG_MODE_1
1164                case 1:
1165                        reg_map = wm8351_mode1_defaults;
1166                        break;
1167#endif
1168#ifdef CONFIG_MFD_WM8351_CONFIG_MODE_2
1169                case 2:
1170                        reg_map = wm8351_mode2_defaults;
1171                        break;
1172#endif
1173#ifdef CONFIG_MFD_WM8351_CONFIG_MODE_3
1174                case 3:
1175                        reg_map = wm8351_mode3_defaults;
1176                        break;
1177#endif
1178                default:
1179                        dev_err(wm8350->dev,
1180                                "WM8351 configuration mode %d not supported\n",
1181                                mode);
1182                        return -EINVAL;
1183                }
1184                break;
1185
1186        case 2:
1187                switch (mode) {
1188#ifdef CONFIG_MFD_WM8352_CONFIG_MODE_0
1189                case 0:
1190                        reg_map = wm8352_mode0_defaults;
1191                        break;
1192#endif
1193#ifdef CONFIG_MFD_WM8352_CONFIG_MODE_1
1194                case 1:
1195                        reg_map = wm8352_mode1_defaults;
1196                        break;
1197#endif
1198#ifdef CONFIG_MFD_WM8352_CONFIG_MODE_2
1199                case 2:
1200                        reg_map = wm8352_mode2_defaults;
1201                        break;
1202#endif
1203#ifdef CONFIG_MFD_WM8352_CONFIG_MODE_3
1204                case 3:
1205                        reg_map = wm8352_mode3_defaults;
1206                        break;
1207#endif
1208                default:
1209                        dev_err(wm8350->dev,
1210                                "WM8352 configuration mode %d not supported\n",
1211                                mode);
1212                        return -EINVAL;
1213                }
1214                break;
1215
1216        default:
1217                dev_err(wm8350->dev,
1218                        "WM835x configuration mode %d not supported\n",
1219                        mode);
1220                return -EINVAL;
1221        }
1222
1223        wm8350->reg_cache =
1224                kmalloc(sizeof(u16) * (WM8350_MAX_REGISTER + 1), GFP_KERNEL);
1225        if (wm8350->reg_cache == NULL)
1226                return -ENOMEM;
1227
1228        /* Read the initial cache state back from the device - this is
1229         * a PMIC so the device many not be in a virgin state and we
1230         * can't rely on the silicon values.
1231         */
1232        ret = wm8350->read_dev(wm8350, 0,
1233                               sizeof(u16) * (WM8350_MAX_REGISTER + 1),
1234                               wm8350->reg_cache);
1235        if (ret < 0) {
1236                dev_err(wm8350->dev,
1237                        "failed to read initial cache values\n");
1238                goto out;
1239        }
1240
1241        /* Mask out uncacheable/unreadable bits and the audio. */
1242        for (i = 0; i < WM8350_MAX_REGISTER; i++) {
1243                if (wm8350_reg_io_map[i].readable &&
1244                    (i < WM8350_CLOCK_CONTROL_1 || i > WM8350_AIF_TEST)) {
1245                        value = be16_to_cpu(wm8350->reg_cache[i]);
1246                        value &= wm8350_reg_io_map[i].readable;
1247                        wm8350->reg_cache[i] = value;
1248                } else
1249                        wm8350->reg_cache[i] = reg_map[i];
1250        }
1251
1252out:
1253        return ret;
1254}
1255
1256/*
1257 * Register a client device.  This is non-fatal since there is no need to
1258 * fail the entire device init due to a single platform device failing.
1259 */
1260static void wm8350_client_dev_register(struct wm8350 *wm8350,
1261                                       const char *name,
1262                                       struct platform_device **pdev)
1263{
1264        int ret;
1265
1266        *pdev = platform_device_alloc(name, -1);
1267        if (pdev == NULL) {
1268                dev_err(wm8350->dev, "Failed to allocate %s\n", name);
1269                return;
1270        }
1271
1272        (*pdev)->dev.parent = wm8350->dev;
1273        platform_set_drvdata(*pdev, wm8350);
1274        ret = platform_device_add(*pdev);
1275        if (ret != 0) {
1276                dev_err(wm8350->dev, "Failed to register %s: %d\n", name, ret);
1277                platform_device_put(*pdev);
1278                *pdev = NULL;
1279        }
1280}
1281
1282int wm8350_device_init(struct wm8350 *wm8350, int irq,
1283                       struct wm8350_platform_data *pdata)
1284{
1285        int ret;
1286        u16 id1, id2, mask_rev;
1287        u16 cust_id, mode, chip_rev;
1288
1289        /* get WM8350 revision and config mode */
1290        ret = wm8350->read_dev(wm8350, WM8350_RESET_ID, sizeof(id1), &id1);
1291        if (ret != 0) {
1292                dev_err(wm8350->dev, "Failed to read ID: %d\n", ret);
1293                goto err;
1294        }
1295
1296        ret = wm8350->read_dev(wm8350, WM8350_ID, sizeof(id2), &id2);
1297        if (ret != 0) {
1298                dev_err(wm8350->dev, "Failed to read ID: %d\n", ret);
1299                goto err;
1300        }
1301
1302        ret = wm8350->read_dev(wm8350, WM8350_REVISION, sizeof(mask_rev),
1303                               &mask_rev);
1304        if (ret != 0) {
1305                dev_err(wm8350->dev, "Failed to read revision: %d\n", ret);
1306                goto err;
1307        }
1308
1309        id1 = be16_to_cpu(id1);
1310        id2 = be16_to_cpu(id2);
1311        mask_rev = be16_to_cpu(mask_rev);
1312
1313        if (id1 != 0x6143) {
1314                dev_err(wm8350->dev,
1315                        "Device with ID %x is not a WM8350\n", id1);
1316                ret = -ENODEV;
1317                goto err;
1318        }
1319
1320        mode = id2 & WM8350_CONF_STS_MASK >> 10;
1321        cust_id = id2 & WM8350_CUST_ID_MASK;
1322        chip_rev = (id2 & WM8350_CHIP_REV_MASK) >> 12;
1323        dev_info(wm8350->dev,
1324                 "CONF_STS %d, CUST_ID %d, MASK_REV %d, CHIP_REV %d\n",
1325                 mode, cust_id, mask_rev, chip_rev);
1326
1327        if (cust_id != 0) {
1328                dev_err(wm8350->dev, "Unsupported CUST_ID\n");
1329                ret = -ENODEV;
1330                goto err;
1331        }
1332
1333        switch (mask_rev) {
1334        case 0:
1335                wm8350->pmic.max_dcdc = WM8350_DCDC_6;
1336                wm8350->pmic.max_isink = WM8350_ISINK_B;
1337
1338                switch (chip_rev) {
1339                case WM8350_REV_E:
1340                        dev_info(wm8350->dev, "WM8350 Rev E\n");
1341                        break;
1342                case WM8350_REV_F:
1343                        dev_info(wm8350->dev, "WM8350 Rev F\n");
1344                        break;
1345                case WM8350_REV_G:
1346                        dev_info(wm8350->dev, "WM8350 Rev G\n");
1347                        wm8350->power.rev_g_coeff = 1;
1348                        break;
1349                case WM8350_REV_H:
1350                        dev_info(wm8350->dev, "WM8350 Rev H\n");
1351                        wm8350->power.rev_g_coeff = 1;
1352                        break;
1353                default:
1354                        /* For safety we refuse to run on unknown hardware */
1355                        dev_err(wm8350->dev, "Unknown WM8350 CHIP_REV\n");
1356                        ret = -ENODEV;
1357                        goto err;
1358                }
1359                break;
1360
1361        case 1:
1362                wm8350->pmic.max_dcdc = WM8350_DCDC_4;
1363                wm8350->pmic.max_isink = WM8350_ISINK_A;
1364
1365                switch (chip_rev) {
1366                case 0:
1367                        dev_info(wm8350->dev, "WM8351 Rev A\n");
1368                        wm8350->power.rev_g_coeff = 1;
1369                        break;
1370
1371                case 1:
1372                        dev_info(wm8350->dev, "WM8351 Rev B\n");
1373                        wm8350->power.rev_g_coeff = 1;
1374                        break;
1375
1376                default:
1377                        dev_err(wm8350->dev, "Unknown WM8351 CHIP_REV\n");
1378                        ret = -ENODEV;
1379                        goto err;
1380                }
1381                break;
1382
1383        case 2:
1384                wm8350->pmic.max_dcdc = WM8350_DCDC_6;
1385                wm8350->pmic.max_isink = WM8350_ISINK_B;
1386
1387                switch (chip_rev) {
1388                case 0:
1389                        dev_info(wm8350->dev, "WM8352 Rev A\n");
1390                        wm8350->power.rev_g_coeff = 1;
1391                        break;
1392
1393                default:
1394                        dev_err(wm8350->dev, "Unknown WM8352 CHIP_REV\n");
1395                        ret = -ENODEV;
1396                        goto err;
1397                }
1398                break;
1399
1400        default:
1401                dev_err(wm8350->dev, "Unknown MASK_REV\n");
1402                ret = -ENODEV;
1403                goto err;
1404        }
1405
1406        ret = wm8350_create_cache(wm8350, mask_rev, mode);
1407        if (ret < 0) {
1408                dev_err(wm8350->dev, "Failed to create register cache\n");
1409                return ret;
1410        }
1411
1412        wm8350_reg_write(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK, 0xFFFF);
1413        wm8350_reg_write(wm8350, WM8350_INT_STATUS_1_MASK, 0xFFFF);
1414        wm8350_reg_write(wm8350, WM8350_INT_STATUS_2_MASK, 0xFFFF);
1415        wm8350_reg_write(wm8350, WM8350_UNDER_VOLTAGE_INT_STATUS_MASK, 0xFFFF);
1416        wm8350_reg_write(wm8350, WM8350_GPIO_INT_STATUS_MASK, 0xFFFF);
1417        wm8350_reg_write(wm8350, WM8350_COMPARATOR_INT_STATUS_MASK, 0xFFFF);
1418
1419        mutex_init(&wm8350->auxadc_mutex);
1420        mutex_init(&wm8350->irq_mutex);
1421        if (irq) {
1422                int flags = IRQF_ONESHOT;
1423
1424                if (pdata && pdata->irq_high) {
1425                        flags |= IRQF_TRIGGER_HIGH;
1426
1427                        wm8350_set_bits(wm8350, WM8350_SYSTEM_CONTROL_1,
1428                                        WM8350_IRQ_POL);
1429                } else {
1430                        flags |= IRQF_TRIGGER_LOW;
1431
1432                        wm8350_clear_bits(wm8350, WM8350_SYSTEM_CONTROL_1,
1433                                          WM8350_IRQ_POL);
1434                }
1435
1436                ret = request_threaded_irq(irq, NULL, wm8350_irq, flags,
1437                                           "wm8350", wm8350);
1438                if (ret != 0) {
1439                        dev_err(wm8350->dev, "Failed to request IRQ: %d\n",
1440                                ret);
1441                        goto err;
1442                }
1443        } else {
1444                dev_err(wm8350->dev, "No IRQ configured\n");
1445                goto err;
1446        }
1447        wm8350->chip_irq = irq;
1448
1449        if (pdata && pdata->init) {
1450                ret = pdata->init(wm8350);
1451                if (ret != 0) {
1452                        dev_err(wm8350->dev, "Platform init() failed: %d\n",
1453                                ret);
1454                        goto err;
1455                }
1456        }
1457
1458        wm8350_reg_write(wm8350, WM8350_SYSTEM_INTERRUPTS_MASK, 0x0);
1459
1460        wm8350_client_dev_register(wm8350, "wm8350-codec",
1461                                   &(wm8350->codec.pdev));
1462        wm8350_client_dev_register(wm8350, "wm8350-gpio",
1463                                   &(wm8350->gpio.pdev));
1464        wm8350_client_dev_register(wm8350, "wm8350-hwmon",
1465                                   &(wm8350->hwmon.pdev));
1466        wm8350_client_dev_register(wm8350, "wm8350-power",
1467                                   &(wm8350->power.pdev));
1468        wm8350_client_dev_register(wm8350, "wm8350-rtc", &(wm8350->rtc.pdev));
1469        wm8350_client_dev_register(wm8350, "wm8350-wdt", &(wm8350->wdt.pdev));
1470
1471        return 0;
1472
1473err:
1474        kfree(wm8350->reg_cache);
1475        return ret;
1476}
1477EXPORT_SYMBOL_GPL(wm8350_device_init);
1478
1479void wm8350_device_exit(struct wm8350 *wm8350)
1480{
1481        int i;
1482
1483        for (i = 0; i < ARRAY_SIZE(wm8350->pmic.led); i++)
1484                platform_device_unregister(wm8350->pmic.led[i].pdev);
1485
1486        for (i = 0; i < ARRAY_SIZE(wm8350->pmic.pdev); i++)
1487                platform_device_unregister(wm8350->pmic.pdev[i]);
1488
1489        platform_device_unregister(wm8350->wdt.pdev);
1490        platform_device_unregister(wm8350->rtc.pdev);
1491        platform_device_unregister(wm8350->power.pdev);
1492        platform_device_unregister(wm8350->hwmon.pdev);
1493        platform_device_unregister(wm8350->gpio.pdev);
1494        platform_device_unregister(wm8350->codec.pdev);
1495
1496        free_irq(wm8350->chip_irq, wm8350);
1497        kfree(wm8350->reg_cache);
1498}
1499EXPORT_SYMBOL_GPL(wm8350_device_exit);
1500
1501MODULE_DESCRIPTION("WM8350 AudioPlus PMIC core driver");
1502MODULE_LICENSE("GPL");
1503
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.