linux/drivers/mfd/twl6040.c
<<
>>
Prefs
   1/*
   2 * MFD driver for TWL6040 audio device
   3 *
   4 * Authors:     Misael Lopez Cruz <misael.lopez@ti.com>
   5 *              Jorge Eduardo Candelaria <jorge.candelaria@ti.com>
   6 *              Peter Ujfalusi <peter.ujfalusi@ti.com>
   7 *
   8 * Copyright:   (C) 2011 Texas Instruments, Inc.
   9 *
  10 * This program is free software; you can redistribute it and/or modify
  11 * it under the terms of the GNU General Public License version 2 as
  12 * published by the Free Software Foundation.
  13 *
  14 * This program is distributed in the hope that it will be useful, but
  15 * WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17 * General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program; if not, write to the Free Software
  21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
  22 * 02110-1301 USA
  23 *
  24 */
  25
  26#include <linux/module.h>
  27#include <linux/types.h>
  28#include <linux/slab.h>
  29#include <linux/kernel.h>
  30#include <linux/err.h>
  31#include <linux/platform_device.h>
  32#include <linux/of.h>
  33#include <linux/of_irq.h>
  34#include <linux/of_gpio.h>
  35#include <linux/of_platform.h>
  36#include <linux/gpio.h>
  37#include <linux/delay.h>
  38#include <linux/i2c.h>
  39#include <linux/regmap.h>
  40#include <linux/mfd/core.h>
  41#include <linux/mfd/twl6040.h>
  42#include <linux/regulator/consumer.h>
  43
  44#define VIBRACTRL_MEMBER(reg) ((reg == TWL6040_REG_VIBCTLL) ? 0 : 1)
  45#define TWL6040_NUM_SUPPLIES    (2)
  46
  47static const struct reg_default twl6040_defaults[] = {
  48        { 0x01, 0x4B }, /* REG_ASICID   (ro) */
  49        { 0x02, 0x00 }, /* REG_ASICREV  (ro) */
  50        { 0x03, 0x00 }, /* REG_INTID    */
  51        { 0x04, 0x00 }, /* REG_INTMR    */
  52        { 0x05, 0x00 }, /* REG_NCPCTRL  */
  53        { 0x06, 0x00 }, /* REG_LDOCTL   */
  54        { 0x07, 0x60 }, /* REG_HPPLLCTL */
  55        { 0x08, 0x00 }, /* REG_LPPLLCTL */
  56        { 0x09, 0x4A }, /* REG_LPPLLDIV */
  57        { 0x0A, 0x00 }, /* REG_AMICBCTL */
  58        { 0x0B, 0x00 }, /* REG_DMICBCTL */
  59        { 0x0C, 0x00 }, /* REG_MICLCTL  */
  60        { 0x0D, 0x00 }, /* REG_MICRCTL  */
  61        { 0x0E, 0x00 }, /* REG_MICGAIN  */
  62        { 0x0F, 0x1B }, /* REG_LINEGAIN */
  63        { 0x10, 0x00 }, /* REG_HSLCTL   */
  64        { 0x11, 0x00 }, /* REG_HSRCTL   */
  65        { 0x12, 0x00 }, /* REG_HSGAIN   */
  66        { 0x13, 0x00 }, /* REG_EARCTL   */
  67        { 0x14, 0x00 }, /* REG_HFLCTL   */
  68        { 0x15, 0x00 }, /* REG_HFLGAIN  */
  69        { 0x16, 0x00 }, /* REG_HFRCTL   */
  70        { 0x17, 0x00 }, /* REG_HFRGAIN  */
  71        { 0x18, 0x00 }, /* REG_VIBCTLL  */
  72        { 0x19, 0x00 }, /* REG_VIBDATL  */
  73        { 0x1A, 0x00 }, /* REG_VIBCTLR  */
  74        { 0x1B, 0x00 }, /* REG_VIBDATR  */
  75        { 0x1C, 0x00 }, /* REG_HKCTL1   */
  76        { 0x1D, 0x00 }, /* REG_HKCTL2   */
  77        { 0x1E, 0x00 }, /* REG_GPOCTL   */
  78        { 0x1F, 0x00 }, /* REG_ALB      */
  79        { 0x20, 0x00 }, /* REG_DLB      */
  80        /* 0x28, REG_TRIM1 */
  81        /* 0x29, REG_TRIM2 */
  82        /* 0x2A, REG_TRIM3 */
  83        /* 0x2B, REG_HSOTRIM */
  84        /* 0x2C, REG_HFOTRIM */
  85        { 0x2D, 0x08 }, /* REG_ACCCTL   */
  86        { 0x2E, 0x00 }, /* REG_STATUS   (ro) */
  87};
  88
  89static struct reg_sequence twl6040_patch[] = {
  90        /*
  91         * Select I2C bus access to dual access registers
  92         * Interrupt register is cleared on read
  93         * Select fast mode for i2c (400KHz)
  94         */
  95        { TWL6040_REG_ACCCTL,
  96                TWL6040_I2CSEL | TWL6040_INTCLRMODE | TWL6040_I2CMODE(1) },
  97};
  98
  99
 100static bool twl6040_has_vibra(struct device_node *parent)
 101{
 102        struct device_node *node;
 103
 104        node = of_get_child_by_name(parent, "vibra");
 105        if (node) {
 106                of_node_put(node);
 107                return true;
 108        }
 109
 110        return false;
 111}
 112
 113int twl6040_reg_read(struct twl6040 *twl6040, unsigned int reg)
 114{
 115        int ret;
 116        unsigned int val;
 117
 118        ret = regmap_read(twl6040->regmap, reg, &val);
 119        if (ret < 0)
 120                return ret;
 121
 122        return val;
 123}
 124EXPORT_SYMBOL(twl6040_reg_read);
 125
 126int twl6040_reg_write(struct twl6040 *twl6040, unsigned int reg, u8 val)
 127{
 128        int ret;
 129
 130        ret = regmap_write(twl6040->regmap, reg, val);
 131
 132        return ret;
 133}
 134EXPORT_SYMBOL(twl6040_reg_write);
 135
 136int twl6040_set_bits(struct twl6040 *twl6040, unsigned int reg, u8 mask)
 137{
 138        return regmap_update_bits(twl6040->regmap, reg, mask, mask);
 139}
 140EXPORT_SYMBOL(twl6040_set_bits);
 141
 142int twl6040_clear_bits(struct twl6040 *twl6040, unsigned int reg, u8 mask)
 143{
 144        return regmap_update_bits(twl6040->regmap, reg, mask, 0);
 145}
 146EXPORT_SYMBOL(twl6040_clear_bits);
 147
 148/* twl6040 codec manual power-up sequence */
 149static int twl6040_power_up_manual(struct twl6040 *twl6040)
 150{
 151        u8 ldoctl, ncpctl, lppllctl;
 152        int ret;
 153
 154        /* enable high-side LDO, reference system and internal oscillator */
 155        ldoctl = TWL6040_HSLDOENA | TWL6040_REFENA | TWL6040_OSCENA;
 156        ret = twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
 157        if (ret)
 158                return ret;
 159        usleep_range(10000, 10500);
 160
 161        /* enable negative charge pump */
 162        ncpctl = TWL6040_NCPENA;
 163        ret = twl6040_reg_write(twl6040, TWL6040_REG_NCPCTL, ncpctl);
 164        if (ret)
 165                goto ncp_err;
 166        usleep_range(1000, 1500);
 167
 168        /* enable low-side LDO */
 169        ldoctl |= TWL6040_LSLDOENA;
 170        ret = twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
 171        if (ret)
 172                goto lsldo_err;
 173        usleep_range(1000, 1500);
 174
 175        /* enable low-power PLL */
 176        lppllctl = TWL6040_LPLLENA;
 177        ret = twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl);
 178        if (ret)
 179                goto lppll_err;
 180        usleep_range(5000, 5500);
 181
 182        /* disable internal oscillator */
 183        ldoctl &= ~TWL6040_OSCENA;
 184        ret = twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
 185        if (ret)
 186                goto osc_err;
 187
 188        return 0;
 189
 190osc_err:
 191        lppllctl &= ~TWL6040_LPLLENA;
 192        twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl);
 193lppll_err:
 194        ldoctl &= ~TWL6040_LSLDOENA;
 195        twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
 196lsldo_err:
 197        ncpctl &= ~TWL6040_NCPENA;
 198        twl6040_reg_write(twl6040, TWL6040_REG_NCPCTL, ncpctl);
 199ncp_err:
 200        ldoctl &= ~(TWL6040_HSLDOENA | TWL6040_REFENA | TWL6040_OSCENA);
 201        twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
 202
 203        dev_err(twl6040->dev, "manual power-up failed\n");
 204        return ret;
 205}
 206
 207/* twl6040 manual power-down sequence */
 208static void twl6040_power_down_manual(struct twl6040 *twl6040)
 209{
 210        u8 ncpctl, ldoctl, lppllctl;
 211
 212        ncpctl = twl6040_reg_read(twl6040, TWL6040_REG_NCPCTL);
 213        ldoctl = twl6040_reg_read(twl6040, TWL6040_REG_LDOCTL);
 214        lppllctl = twl6040_reg_read(twl6040, TWL6040_REG_LPPLLCTL);
 215
 216        /* enable internal oscillator */
 217        ldoctl |= TWL6040_OSCENA;
 218        twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
 219        usleep_range(1000, 1500);
 220
 221        /* disable low-power PLL */
 222        lppllctl &= ~TWL6040_LPLLENA;
 223        twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL, lppllctl);
 224
 225        /* disable low-side LDO */
 226        ldoctl &= ~TWL6040_LSLDOENA;
 227        twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
 228
 229        /* disable negative charge pump */
 230        ncpctl &= ~TWL6040_NCPENA;
 231        twl6040_reg_write(twl6040, TWL6040_REG_NCPCTL, ncpctl);
 232
 233        /* disable high-side LDO, reference system and internal oscillator */
 234        ldoctl &= ~(TWL6040_HSLDOENA | TWL6040_REFENA | TWL6040_OSCENA);
 235        twl6040_reg_write(twl6040, TWL6040_REG_LDOCTL, ldoctl);
 236}
 237
 238static irqreturn_t twl6040_readyint_handler(int irq, void *data)
 239{
 240        struct twl6040 *twl6040 = data;
 241
 242        complete(&twl6040->ready);
 243
 244        return IRQ_HANDLED;
 245}
 246
 247static irqreturn_t twl6040_thint_handler(int irq, void *data)
 248{
 249        struct twl6040 *twl6040 = data;
 250        u8 status;
 251
 252        status = twl6040_reg_read(twl6040, TWL6040_REG_STATUS);
 253        if (status & TWL6040_TSHUTDET) {
 254                dev_warn(twl6040->dev, "Thermal shutdown, powering-off");
 255                twl6040_power(twl6040, 0);
 256        } else {
 257                dev_warn(twl6040->dev, "Leaving thermal shutdown, powering-on");
 258                twl6040_power(twl6040, 1);
 259        }
 260
 261        return IRQ_HANDLED;
 262}
 263
 264static int twl6040_power_up_automatic(struct twl6040 *twl6040)
 265{
 266        int time_left;
 267
 268        gpio_set_value(twl6040->audpwron, 1);
 269
 270        time_left = wait_for_completion_timeout(&twl6040->ready,
 271                                                msecs_to_jiffies(144));
 272        if (!time_left) {
 273                u8 intid;
 274
 275                dev_warn(twl6040->dev, "timeout waiting for READYINT\n");
 276                intid = twl6040_reg_read(twl6040, TWL6040_REG_INTID);
 277                if (!(intid & TWL6040_READYINT)) {
 278                        dev_err(twl6040->dev, "automatic power-up failed\n");
 279                        gpio_set_value(twl6040->audpwron, 0);
 280                        return -ETIMEDOUT;
 281                }
 282        }
 283
 284        return 0;
 285}
 286
 287int twl6040_power(struct twl6040 *twl6040, int on)
 288{
 289        int ret = 0;
 290
 291        mutex_lock(&twl6040->mutex);
 292
 293        if (on) {
 294                /* already powered-up */
 295                if (twl6040->power_count++)
 296                        goto out;
 297
 298                ret = clk_prepare_enable(twl6040->clk32k);
 299                if (ret) {
 300                        twl6040->power_count = 0;
 301                        goto out;
 302                }
 303
 304                /* Allow writes to the chip */
 305                regcache_cache_only(twl6040->regmap, false);
 306
 307                if (gpio_is_valid(twl6040->audpwron)) {
 308                        /* use automatic power-up sequence */
 309                        ret = twl6040_power_up_automatic(twl6040);
 310                        if (ret) {
 311                                clk_disable_unprepare(twl6040->clk32k);
 312                                twl6040->power_count = 0;
 313                                goto out;
 314                        }
 315                } else {
 316                        /* use manual power-up sequence */
 317                        ret = twl6040_power_up_manual(twl6040);
 318                        if (ret) {
 319                                clk_disable_unprepare(twl6040->clk32k);
 320                                twl6040->power_count = 0;
 321                                goto out;
 322                        }
 323                }
 324
 325                /* Sync with the HW */
 326                regcache_sync(twl6040->regmap);
 327
 328                /* Default PLL configuration after power up */
 329                twl6040->pll = TWL6040_SYSCLK_SEL_LPPLL;
 330                twl6040->sysclk_rate = 19200000;
 331        } else {
 332                /* already powered-down */
 333                if (!twl6040->power_count) {
 334                        dev_err(twl6040->dev,
 335                                "device is already powered-off\n");
 336                        ret = -EPERM;
 337                        goto out;
 338                }
 339
 340                if (--twl6040->power_count)
 341                        goto out;
 342
 343                if (gpio_is_valid(twl6040->audpwron)) {
 344                        /* use AUDPWRON line */
 345                        gpio_set_value(twl6040->audpwron, 0);
 346
 347                        /* power-down sequence latency */
 348                        usleep_range(500, 700);
 349                } else {
 350                        /* use manual power-down sequence */
 351                        twl6040_power_down_manual(twl6040);
 352                }
 353
 354                /* Set regmap to cache only and mark it as dirty */
 355                regcache_cache_only(twl6040->regmap, true);
 356                regcache_mark_dirty(twl6040->regmap);
 357
 358                twl6040->sysclk_rate = 0;
 359
 360                if (twl6040->pll == TWL6040_SYSCLK_SEL_HPPLL) {
 361                        clk_disable_unprepare(twl6040->mclk);
 362                        twl6040->mclk_rate = 0;
 363                }
 364
 365                clk_disable_unprepare(twl6040->clk32k);
 366        }
 367
 368out:
 369        mutex_unlock(&twl6040->mutex);
 370        return ret;
 371}
 372EXPORT_SYMBOL(twl6040_power);
 373
 374int twl6040_set_pll(struct twl6040 *twl6040, int pll_id,
 375                    unsigned int freq_in, unsigned int freq_out)
 376{
 377        u8 hppllctl, lppllctl;
 378        int ret = 0;
 379
 380        mutex_lock(&twl6040->mutex);
 381
 382        hppllctl = twl6040_reg_read(twl6040, TWL6040_REG_HPPLLCTL);
 383        lppllctl = twl6040_reg_read(twl6040, TWL6040_REG_LPPLLCTL);
 384
 385        /* Force full reconfiguration when switching between PLL */
 386        if (pll_id != twl6040->pll) {
 387                twl6040->sysclk_rate = 0;
 388                twl6040->mclk_rate = 0;
 389        }
 390
 391        switch (pll_id) {
 392        case TWL6040_SYSCLK_SEL_LPPLL:
 393                /* low-power PLL divider */
 394                /* Change the sysclk configuration only if it has been canged */
 395                if (twl6040->sysclk_rate != freq_out) {
 396                        switch (freq_out) {
 397                        case 17640000:
 398                                lppllctl |= TWL6040_LPLLFIN;
 399                                break;
 400                        case 19200000:
 401                                lppllctl &= ~TWL6040_LPLLFIN;
 402                                break;
 403                        default:
 404                                dev_err(twl6040->dev,
 405                                        "freq_out %d not supported\n",
 406                                        freq_out);
 407                                ret = -EINVAL;
 408                                goto pll_out;
 409                        }
 410                        twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL,
 411                                          lppllctl);
 412                }
 413
 414                /* The PLL in use has not been change, we can exit */
 415                if (twl6040->pll == pll_id)
 416                        break;
 417
 418                switch (freq_in) {
 419                case 32768:
 420                        lppllctl |= TWL6040_LPLLENA;
 421                        twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL,
 422                                          lppllctl);
 423                        mdelay(5);
 424                        lppllctl &= ~TWL6040_HPLLSEL;
 425                        twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL,
 426                                          lppllctl);
 427                        hppllctl &= ~TWL6040_HPLLENA;
 428                        twl6040_reg_write(twl6040, TWL6040_REG_HPPLLCTL,
 429                                          hppllctl);
 430                        break;
 431                default:
 432                        dev_err(twl6040->dev,
 433                                "freq_in %d not supported\n", freq_in);
 434                        ret = -EINVAL;
 435                        goto pll_out;
 436                }
 437
 438                clk_disable_unprepare(twl6040->mclk);
 439                break;
 440        case TWL6040_SYSCLK_SEL_HPPLL:
 441                /* high-performance PLL can provide only 19.2 MHz */
 442                if (freq_out != 19200000) {
 443                        dev_err(twl6040->dev,
 444                                "freq_out %d not supported\n", freq_out);
 445                        ret = -EINVAL;
 446                        goto pll_out;
 447                }
 448
 449                if (twl6040->mclk_rate != freq_in) {
 450                        hppllctl &= ~TWL6040_MCLK_MSK;
 451
 452                        switch (freq_in) {
 453                        case 12000000:
 454                                /* PLL enabled, active mode */
 455                                hppllctl |= TWL6040_MCLK_12000KHZ |
 456                                            TWL6040_HPLLENA;
 457                                break;
 458                        case 19200000:
 459                                /* PLL enabled, bypass mode */
 460                                hppllctl |= TWL6040_MCLK_19200KHZ |
 461                                            TWL6040_HPLLBP | TWL6040_HPLLENA;
 462                                break;
 463                        case 26000000:
 464                                /* PLL enabled, active mode */
 465                                hppllctl |= TWL6040_MCLK_26000KHZ |
 466                                            TWL6040_HPLLENA;
 467                                break;
 468                        case 38400000:
 469                                /* PLL enabled, bypass mode */
 470                                hppllctl |= TWL6040_MCLK_38400KHZ |
 471                                            TWL6040_HPLLBP | TWL6040_HPLLENA;
 472                                break;
 473                        default:
 474                                dev_err(twl6040->dev,
 475                                        "freq_in %d not supported\n", freq_in);
 476                                ret = -EINVAL;
 477                                goto pll_out;
 478                        }
 479
 480                        /* When switching to HPPLL, enable the mclk first */
 481                        if (pll_id != twl6040->pll)
 482                                clk_prepare_enable(twl6040->mclk);
 483                        /*
 484                         * enable clock slicer to ensure input waveform is
 485                         * square
 486                         */
 487                        hppllctl |= TWL6040_HPLLSQRENA;
 488
 489                        twl6040_reg_write(twl6040, TWL6040_REG_HPPLLCTL,
 490                                          hppllctl);
 491                        usleep_range(500, 700);
 492                        lppllctl |= TWL6040_HPLLSEL;
 493                        twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL,
 494                                          lppllctl);
 495                        lppllctl &= ~TWL6040_LPLLENA;
 496                        twl6040_reg_write(twl6040, TWL6040_REG_LPPLLCTL,
 497                                          lppllctl);
 498
 499                        twl6040->mclk_rate = freq_in;
 500                }
 501                break;
 502        default:
 503                dev_err(twl6040->dev, "unknown pll id %d\n", pll_id);
 504                ret = -EINVAL;
 505                goto pll_out;
 506        }
 507
 508        twl6040->sysclk_rate = freq_out;
 509        twl6040->pll = pll_id;
 510
 511pll_out:
 512        mutex_unlock(&twl6040->mutex);
 513        return ret;
 514}
 515EXPORT_SYMBOL(twl6040_set_pll);
 516
 517int twl6040_get_pll(struct twl6040 *twl6040)
 518{
 519        if (twl6040->power_count)
 520                return twl6040->pll;
 521        else
 522                return -ENODEV;
 523}
 524EXPORT_SYMBOL(twl6040_get_pll);
 525
 526unsigned int twl6040_get_sysclk(struct twl6040 *twl6040)
 527{
 528        return twl6040->sysclk_rate;
 529}
 530EXPORT_SYMBOL(twl6040_get_sysclk);
 531
 532/* Get the combined status of the vibra control register */
 533int twl6040_get_vibralr_status(struct twl6040 *twl6040)
 534{
 535        unsigned int reg;
 536        int ret;
 537        u8 status;
 538
 539        ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLL, &reg);
 540        if (ret != 0)
 541                return ret;
 542        status = reg;
 543
 544        ret = regmap_read(twl6040->regmap, TWL6040_REG_VIBCTLR, &reg);
 545        if (ret != 0)
 546                return ret;
 547        status |= reg;
 548
 549        status &= (TWL6040_VIBENA | TWL6040_VIBSEL);
 550
 551        return status;
 552}
 553EXPORT_SYMBOL(twl6040_get_vibralr_status);
 554
 555static struct resource twl6040_vibra_rsrc[] = {
 556        {
 557                .flags = IORESOURCE_IRQ,
 558        },
 559};
 560
 561static struct resource twl6040_codec_rsrc[] = {
 562        {
 563                .flags = IORESOURCE_IRQ,
 564        },
 565};
 566
 567static bool twl6040_readable_reg(struct device *dev, unsigned int reg)
 568{
 569        /* Register 0 is not readable */
 570        if (!reg)
 571                return false;
 572        return true;
 573}
 574
 575static bool twl6040_volatile_reg(struct device *dev, unsigned int reg)
 576{
 577        switch (reg) {
 578        case TWL6040_REG_ASICID:
 579        case TWL6040_REG_ASICREV:
 580        case TWL6040_REG_INTID:
 581        case TWL6040_REG_LPPLLCTL:
 582        case TWL6040_REG_HPPLLCTL:
 583        case TWL6040_REG_STATUS:
 584                return true;
 585        default:
 586                return false;
 587        }
 588}
 589
 590static bool twl6040_writeable_reg(struct device *dev, unsigned int reg)
 591{
 592        switch (reg) {
 593        case TWL6040_REG_ASICID:
 594        case TWL6040_REG_ASICREV:
 595        case TWL6040_REG_STATUS:
 596                return false;
 597        default:
 598                return true;
 599        }
 600}
 601
 602static const struct regmap_config twl6040_regmap_config = {
 603        .reg_bits = 8,
 604        .val_bits = 8,
 605
 606        .reg_defaults = twl6040_defaults,
 607        .num_reg_defaults = ARRAY_SIZE(twl6040_defaults),
 608
 609        .max_register = TWL6040_REG_STATUS, /* 0x2e */
 610
 611        .readable_reg = twl6040_readable_reg,
 612        .volatile_reg = twl6040_volatile_reg,
 613        .writeable_reg = twl6040_writeable_reg,
 614
 615        .cache_type = REGCACHE_RBTREE,
 616        .use_single_rw = true,
 617};
 618
 619static const struct regmap_irq twl6040_irqs[] = {
 620        { .reg_offset = 0, .mask = TWL6040_THINT, },
 621        { .reg_offset = 0, .mask = TWL6040_PLUGINT | TWL6040_UNPLUGINT, },
 622        { .reg_offset = 0, .mask = TWL6040_HOOKINT, },
 623        { .reg_offset = 0, .mask = TWL6040_HFINT, },
 624        { .reg_offset = 0, .mask = TWL6040_VIBINT, },
 625        { .reg_offset = 0, .mask = TWL6040_READYINT, },
 626};
 627
 628static struct regmap_irq_chip twl6040_irq_chip = {
 629        .name = "twl6040",
 630        .irqs = twl6040_irqs,
 631        .num_irqs = ARRAY_SIZE(twl6040_irqs),
 632
 633        .num_regs = 1,
 634        .status_base = TWL6040_REG_INTID,
 635        .mask_base = TWL6040_REG_INTMR,
 636};
 637
 638static int twl6040_probe(struct i2c_client *client,
 639                         const struct i2c_device_id *id)
 640{
 641        struct device_node *node = client->dev.of_node;
 642        struct twl6040 *twl6040;
 643        struct mfd_cell *cell = NULL;
 644        int irq, ret, children = 0;
 645
 646        if (!node) {
 647                dev_err(&client->dev, "of node is missing\n");
 648                return -EINVAL;
 649        }
 650
 651        /* In order to operate correctly we need valid interrupt config */
 652        if (!client->irq) {
 653                dev_err(&client->dev, "Invalid IRQ configuration\n");
 654                return -EINVAL;
 655        }
 656
 657        twl6040 = devm_kzalloc(&client->dev, sizeof(struct twl6040),
 658                               GFP_KERNEL);
 659        if (!twl6040)
 660                return -ENOMEM;
 661
 662        twl6040->regmap = devm_regmap_init_i2c(client, &twl6040_regmap_config);
 663        if (IS_ERR(twl6040->regmap))
 664                return PTR_ERR(twl6040->regmap);
 665
 666        i2c_set_clientdata(client, twl6040);
 667
 668        twl6040->clk32k = devm_clk_get(&client->dev, "clk32k");
 669        if (IS_ERR(twl6040->clk32k)) {
 670                if (PTR_ERR(twl6040->clk32k) == -EPROBE_DEFER)
 671                        return -EPROBE_DEFER;
 672                dev_dbg(&client->dev, "clk32k is not handled\n");
 673                twl6040->clk32k = NULL;
 674        }
 675
 676        twl6040->mclk = devm_clk_get(&client->dev, "mclk");
 677        if (IS_ERR(twl6040->mclk)) {
 678                if (PTR_ERR(twl6040->mclk) == -EPROBE_DEFER)
 679                        return -EPROBE_DEFER;
 680                dev_dbg(&client->dev, "mclk is not handled\n");
 681                twl6040->mclk = NULL;
 682        }
 683
 684        twl6040->supplies[0].supply = "vio";
 685        twl6040->supplies[1].supply = "v2v1";
 686        ret = devm_regulator_bulk_get(&client->dev, TWL6040_NUM_SUPPLIES,
 687                                      twl6040->supplies);
 688        if (ret != 0) {
 689                dev_err(&client->dev, "Failed to get supplies: %d\n", ret);
 690                return ret;
 691        }
 692
 693        ret = regulator_bulk_enable(TWL6040_NUM_SUPPLIES, twl6040->supplies);
 694        if (ret != 0) {
 695                dev_err(&client->dev, "Failed to enable supplies: %d\n", ret);
 696                return ret;
 697        }
 698
 699        twl6040->dev = &client->dev;
 700        twl6040->irq = client->irq;
 701
 702        mutex_init(&twl6040->mutex);
 703        init_completion(&twl6040->ready);
 704
 705        regmap_register_patch(twl6040->regmap, twl6040_patch,
 706                              ARRAY_SIZE(twl6040_patch));
 707
 708        twl6040->rev = twl6040_reg_read(twl6040, TWL6040_REG_ASICREV);
 709        if (twl6040->rev < 0) {
 710                dev_err(&client->dev, "Failed to read revision register: %d\n",
 711                        twl6040->rev);
 712                ret = twl6040->rev;
 713                goto gpio_err;
 714        }
 715
 716        /* ERRATA: Automatic power-up is not possible in ES1.0 */
 717        if (twl6040_get_revid(twl6040) > TWL6040_REV_ES1_0)
 718                twl6040->audpwron = of_get_named_gpio(node,
 719                                                      "ti,audpwron-gpio", 0);
 720        else
 721                twl6040->audpwron = -EINVAL;
 722
 723        if (gpio_is_valid(twl6040->audpwron)) {
 724                ret = devm_gpio_request_one(&client->dev, twl6040->audpwron,
 725                                            GPIOF_OUT_INIT_LOW, "audpwron");
 726                if (ret)
 727                        goto gpio_err;
 728
 729                /* Clear any pending interrupt */
 730                twl6040_reg_read(twl6040, TWL6040_REG_INTID);
 731        }
 732
 733        ret = regmap_add_irq_chip(twl6040->regmap, twl6040->irq, IRQF_ONESHOT,
 734                                  0, &twl6040_irq_chip, &twl6040->irq_data);
 735        if (ret < 0)
 736                goto gpio_err;
 737
 738        twl6040->irq_ready = regmap_irq_get_virq(twl6040->irq_data,
 739                                                 TWL6040_IRQ_READY);
 740        twl6040->irq_th = regmap_irq_get_virq(twl6040->irq_data,
 741                                              TWL6040_IRQ_TH);
 742
 743        ret = devm_request_threaded_irq(twl6040->dev, twl6040->irq_ready, NULL,
 744                                        twl6040_readyint_handler, IRQF_ONESHOT,
 745                                        "twl6040_irq_ready", twl6040);
 746        if (ret) {
 747                dev_err(twl6040->dev, "READY IRQ request failed: %d\n", ret);
 748                goto readyirq_err;
 749        }
 750
 751        ret = devm_request_threaded_irq(twl6040->dev, twl6040->irq_th, NULL,
 752                                        twl6040_thint_handler, IRQF_ONESHOT,
 753                                        "twl6040_irq_th", twl6040);
 754        if (ret) {
 755                dev_err(twl6040->dev, "Thermal IRQ request failed: %d\n", ret);
 756                goto readyirq_err;
 757        }
 758
 759        /*
 760         * The main functionality of twl6040 to provide audio on OMAP4+ systems.
 761         * We can add the ASoC codec child whenever this driver has been loaded.
 762         */
 763        irq = regmap_irq_get_virq(twl6040->irq_data, TWL6040_IRQ_PLUG);
 764        cell = &twl6040->cells[children];
 765        cell->name = "twl6040-codec";
 766        twl6040_codec_rsrc[0].start = irq;
 767        twl6040_codec_rsrc[0].end = irq;
 768        cell->resources = twl6040_codec_rsrc;
 769        cell->num_resources = ARRAY_SIZE(twl6040_codec_rsrc);
 770        children++;
 771
 772        /* Vibra input driver support */
 773        if (twl6040_has_vibra(node)) {
 774                irq = regmap_irq_get_virq(twl6040->irq_data, TWL6040_IRQ_VIB);
 775
 776                cell = &twl6040->cells[children];
 777                cell->name = "twl6040-vibra";
 778                twl6040_vibra_rsrc[0].start = irq;
 779                twl6040_vibra_rsrc[0].end = irq;
 780                cell->resources = twl6040_vibra_rsrc;
 781                cell->num_resources = ARRAY_SIZE(twl6040_vibra_rsrc);
 782                children++;
 783        }
 784
 785        /* GPO support */
 786        cell = &twl6040->cells[children];
 787        cell->name = "twl6040-gpo";
 788        children++;
 789
 790        /* PDM clock support  */
 791        cell = &twl6040->cells[children];
 792        cell->name = "twl6040-pdmclk";
 793        children++;
 794
 795        /* The chip is powered down so mark regmap to cache only and dirty */
 796        regcache_cache_only(twl6040->regmap, true);
 797        regcache_mark_dirty(twl6040->regmap);
 798
 799        ret = mfd_add_devices(&client->dev, -1, twl6040->cells, children,
 800                              NULL, 0, NULL);
 801        if (ret)
 802                goto readyirq_err;
 803
 804        return 0;
 805
 806readyirq_err:
 807        regmap_del_irq_chip(twl6040->irq, twl6040->irq_data);
 808gpio_err:
 809        regulator_bulk_disable(TWL6040_NUM_SUPPLIES, twl6040->supplies);
 810        return ret;
 811}
 812
 813static int twl6040_remove(struct i2c_client *client)
 814{
 815        struct twl6040 *twl6040 = i2c_get_clientdata(client);
 816
 817        if (twl6040->power_count)
 818                twl6040_power(twl6040, 0);
 819
 820        regmap_del_irq_chip(twl6040->irq, twl6040->irq_data);
 821
 822        mfd_remove_devices(&client->dev);
 823
 824        regulator_bulk_disable(TWL6040_NUM_SUPPLIES, twl6040->supplies);
 825
 826        return 0;
 827}
 828
 829static const struct i2c_device_id twl6040_i2c_id[] = {
 830        { "twl6040", 0, },
 831        { "twl6041", 0, },
 832        { },
 833};
 834MODULE_DEVICE_TABLE(i2c, twl6040_i2c_id);
 835
 836static struct i2c_driver twl6040_driver = {
 837        .driver = {
 838                .name = "twl6040",
 839        },
 840        .probe          = twl6040_probe,
 841        .remove         = twl6040_remove,
 842        .id_table       = twl6040_i2c_id,
 843};
 844
 845module_i2c_driver(twl6040_driver);
 846
 847MODULE_DESCRIPTION("TWL6040 MFD");
 848MODULE_AUTHOR("Misael Lopez Cruz <misael.lopez@ti.com>");
 849MODULE_AUTHOR("Jorge Eduardo Candelaria <jorge.candelaria@ti.com>");
 850MODULE_LICENSE("GPL");
 851