linux/drivers/mfd/stmpe.c
<<
>>
Prefs
   1/*
   2 * ST Microelectronics MFD: stmpe's driver
   3 *
   4 * Copyright (C) ST-Ericsson SA 2010
   5 *
   6 * License Terms: GNU General Public License, version 2
   7 * Author: Rabin Vincent <rabin.vincent@stericsson.com> for ST-Ericsson
   8 */
   9
  10#include <linux/gpio.h>
  11#include <linux/export.h>
  12#include <linux/kernel.h>
  13#include <linux/interrupt.h>
  14#include <linux/irq.h>
  15#include <linux/pm.h>
  16#include <linux/slab.h>
  17#include <linux/mfd/core.h>
  18#include "stmpe.h"
  19
  20static int __stmpe_enable(struct stmpe *stmpe, unsigned int blocks)
  21{
  22        return stmpe->variant->enable(stmpe, blocks, true);
  23}
  24
  25static int __stmpe_disable(struct stmpe *stmpe, unsigned int blocks)
  26{
  27        return stmpe->variant->enable(stmpe, blocks, false);
  28}
  29
  30static int __stmpe_reg_read(struct stmpe *stmpe, u8 reg)
  31{
  32        int ret;
  33
  34        ret = stmpe->ci->read_byte(stmpe, reg);
  35        if (ret < 0)
  36                dev_err(stmpe->dev, "failed to read reg %#x: %d\n", reg, ret);
  37
  38        dev_vdbg(stmpe->dev, "rd: reg %#x => data %#x\n", reg, ret);
  39
  40        return ret;
  41}
  42
  43static int __stmpe_reg_write(struct stmpe *stmpe, u8 reg, u8 val)
  44{
  45        int ret;
  46
  47        dev_vdbg(stmpe->dev, "wr: reg %#x <= %#x\n", reg, val);
  48
  49        ret = stmpe->ci->write_byte(stmpe, reg, val);
  50        if (ret < 0)
  51                dev_err(stmpe->dev, "failed to write reg %#x: %d\n", reg, ret);
  52
  53        return ret;
  54}
  55
  56static int __stmpe_set_bits(struct stmpe *stmpe, u8 reg, u8 mask, u8 val)
  57{
  58        int ret;
  59
  60        ret = __stmpe_reg_read(stmpe, reg);
  61        if (ret < 0)
  62                return ret;
  63
  64        ret &= ~mask;
  65        ret |= val;
  66
  67        return __stmpe_reg_write(stmpe, reg, ret);
  68}
  69
  70static int __stmpe_block_read(struct stmpe *stmpe, u8 reg, u8 length,
  71                              u8 *values)
  72{
  73        int ret;
  74
  75        ret = stmpe->ci->read_block(stmpe, reg, length, values);
  76        if (ret < 0)
  77                dev_err(stmpe->dev, "failed to read regs %#x: %d\n", reg, ret);
  78
  79        dev_vdbg(stmpe->dev, "rd: reg %#x (%d) => ret %#x\n", reg, length, ret);
  80        stmpe_dump_bytes("stmpe rd: ", values, length);
  81
  82        return ret;
  83}
  84
  85static int __stmpe_block_write(struct stmpe *stmpe, u8 reg, u8 length,
  86                        const u8 *values)
  87{
  88        int ret;
  89
  90        dev_vdbg(stmpe->dev, "wr: regs %#x (%d)\n", reg, length);
  91        stmpe_dump_bytes("stmpe wr: ", values, length);
  92
  93        ret = stmpe->ci->write_block(stmpe, reg, length, values);
  94        if (ret < 0)
  95                dev_err(stmpe->dev, "failed to write regs %#x: %d\n", reg, ret);
  96
  97        return ret;
  98}
  99
 100/**
 101 * stmpe_enable - enable blocks on an STMPE device
 102 * @stmpe:      Device to work on
 103 * @blocks:     Mask of blocks (enum stmpe_block values) to enable
 104 */
 105int stmpe_enable(struct stmpe *stmpe, unsigned int blocks)
 106{
 107        int ret;
 108
 109        mutex_lock(&stmpe->lock);
 110        ret = __stmpe_enable(stmpe, blocks);
 111        mutex_unlock(&stmpe->lock);
 112
 113        return ret;
 114}
 115EXPORT_SYMBOL_GPL(stmpe_enable);
 116
 117/**
 118 * stmpe_disable - disable blocks on an STMPE device
 119 * @stmpe:      Device to work on
 120 * @blocks:     Mask of blocks (enum stmpe_block values) to enable
 121 */
 122int stmpe_disable(struct stmpe *stmpe, unsigned int blocks)
 123{
 124        int ret;
 125
 126        mutex_lock(&stmpe->lock);
 127        ret = __stmpe_disable(stmpe, blocks);
 128        mutex_unlock(&stmpe->lock);
 129
 130        return ret;
 131}
 132EXPORT_SYMBOL_GPL(stmpe_disable);
 133
 134/**
 135 * stmpe_reg_read() - read a single STMPE register
 136 * @stmpe:      Device to read from
 137 * @reg:        Register to read
 138 */
 139int stmpe_reg_read(struct stmpe *stmpe, u8 reg)
 140{
 141        int ret;
 142
 143        mutex_lock(&stmpe->lock);
 144        ret = __stmpe_reg_read(stmpe, reg);
 145        mutex_unlock(&stmpe->lock);
 146
 147        return ret;
 148}
 149EXPORT_SYMBOL_GPL(stmpe_reg_read);
 150
 151/**
 152 * stmpe_reg_write() - write a single STMPE register
 153 * @stmpe:      Device to write to
 154 * @reg:        Register to write
 155 * @val:        Value to write
 156 */
 157int stmpe_reg_write(struct stmpe *stmpe, u8 reg, u8 val)
 158{
 159        int ret;
 160
 161        mutex_lock(&stmpe->lock);
 162        ret = __stmpe_reg_write(stmpe, reg, val);
 163        mutex_unlock(&stmpe->lock);
 164
 165        return ret;
 166}
 167EXPORT_SYMBOL_GPL(stmpe_reg_write);
 168
 169/**
 170 * stmpe_set_bits() - set the value of a bitfield in a STMPE register
 171 * @stmpe:      Device to write to
 172 * @reg:        Register to write
 173 * @mask:       Mask of bits to set
 174 * @val:        Value to set
 175 */
 176int stmpe_set_bits(struct stmpe *stmpe, u8 reg, u8 mask, u8 val)
 177{
 178        int ret;
 179
 180        mutex_lock(&stmpe->lock);
 181        ret = __stmpe_set_bits(stmpe, reg, mask, val);
 182        mutex_unlock(&stmpe->lock);
 183
 184        return ret;
 185}
 186EXPORT_SYMBOL_GPL(stmpe_set_bits);
 187
 188/**
 189 * stmpe_block_read() - read multiple STMPE registers
 190 * @stmpe:      Device to read from
 191 * @reg:        First register
 192 * @length:     Number of registers
 193 * @values:     Buffer to write to
 194 */
 195int stmpe_block_read(struct stmpe *stmpe, u8 reg, u8 length, u8 *values)
 196{
 197        int ret;
 198
 199        mutex_lock(&stmpe->lock);
 200        ret = __stmpe_block_read(stmpe, reg, length, values);
 201        mutex_unlock(&stmpe->lock);
 202
 203        return ret;
 204}
 205EXPORT_SYMBOL_GPL(stmpe_block_read);
 206
 207/**
 208 * stmpe_block_write() - write multiple STMPE registers
 209 * @stmpe:      Device to write to
 210 * @reg:        First register
 211 * @length:     Number of registers
 212 * @values:     Values to write
 213 */
 214int stmpe_block_write(struct stmpe *stmpe, u8 reg, u8 length,
 215                      const u8 *values)
 216{
 217        int ret;
 218
 219        mutex_lock(&stmpe->lock);
 220        ret = __stmpe_block_write(stmpe, reg, length, values);
 221        mutex_unlock(&stmpe->lock);
 222
 223        return ret;
 224}
 225EXPORT_SYMBOL_GPL(stmpe_block_write);
 226
 227/**
 228 * stmpe_set_altfunc()- set the alternate function for STMPE pins
 229 * @stmpe:      Device to configure
 230 * @pins:       Bitmask of pins to affect
 231 * @block:      block to enable alternate functions for
 232 *
 233 * @pins is assumed to have a bit set for each of the bits whose alternate
 234 * function is to be changed, numbered according to the GPIOXY numbers.
 235 *
 236 * If the GPIO module is not enabled, this function automatically enables it in
 237 * order to perform the change.
 238 */
 239int stmpe_set_altfunc(struct stmpe *stmpe, u32 pins, enum stmpe_block block)
 240{
 241        struct stmpe_variant_info *variant = stmpe->variant;
 242        u8 regaddr = stmpe->regs[STMPE_IDX_GPAFR_U_MSB];
 243        int af_bits = variant->af_bits;
 244        int numregs = DIV_ROUND_UP(stmpe->num_gpios * af_bits, 8);
 245        int mask = (1 << af_bits) - 1;
 246        u8 regs[numregs];
 247        int af, afperreg, ret;
 248
 249        if (!variant->get_altfunc)
 250                return 0;
 251
 252        afperreg = 8 / af_bits;
 253        mutex_lock(&stmpe->lock);
 254
 255        ret = __stmpe_enable(stmpe, STMPE_BLOCK_GPIO);
 256        if (ret < 0)
 257                goto out;
 258
 259        ret = __stmpe_block_read(stmpe, regaddr, numregs, regs);
 260        if (ret < 0)
 261                goto out;
 262
 263        af = variant->get_altfunc(stmpe, block);
 264
 265        while (pins) {
 266                int pin = __ffs(pins);
 267                int regoffset = numregs - (pin / afperreg) - 1;
 268                int pos = (pin % afperreg) * (8 / afperreg);
 269
 270                regs[regoffset] &= ~(mask << pos);
 271                regs[regoffset] |= af << pos;
 272
 273                pins &= ~(1 << pin);
 274        }
 275
 276        ret = __stmpe_block_write(stmpe, regaddr, numregs, regs);
 277
 278out:
 279        mutex_unlock(&stmpe->lock);
 280        return ret;
 281}
 282EXPORT_SYMBOL_GPL(stmpe_set_altfunc);
 283
 284/*
 285 * GPIO (all variants)
 286 */
 287
 288static struct resource stmpe_gpio_resources[] = {
 289        /* Start and end filled dynamically */
 290        {
 291                .flags  = IORESOURCE_IRQ,
 292        },
 293};
 294
 295static struct mfd_cell stmpe_gpio_cell = {
 296        .name           = "stmpe-gpio",
 297        .resources      = stmpe_gpio_resources,
 298        .num_resources  = ARRAY_SIZE(stmpe_gpio_resources),
 299};
 300
 301static struct mfd_cell stmpe_gpio_cell_noirq = {
 302        .name           = "stmpe-gpio",
 303        /* gpio cell resources consist of an irq only so no resources here */
 304};
 305
 306/*
 307 * Keypad (1601, 2401, 2403)
 308 */
 309
 310static struct resource stmpe_keypad_resources[] = {
 311        {
 312                .name   = "KEYPAD",
 313                .start  = 0,
 314                .end    = 0,
 315                .flags  = IORESOURCE_IRQ,
 316        },
 317        {
 318                .name   = "KEYPAD_OVER",
 319                .start  = 1,
 320                .end    = 1,
 321                .flags  = IORESOURCE_IRQ,
 322        },
 323};
 324
 325static struct mfd_cell stmpe_keypad_cell = {
 326        .name           = "stmpe-keypad",
 327        .resources      = stmpe_keypad_resources,
 328        .num_resources  = ARRAY_SIZE(stmpe_keypad_resources),
 329};
 330
 331/*
 332 * STMPE801
 333 */
 334static const u8 stmpe801_regs[] = {
 335        [STMPE_IDX_CHIP_ID]     = STMPE801_REG_CHIP_ID,
 336        [STMPE_IDX_ICR_LSB]     = STMPE801_REG_SYS_CTRL,
 337        [STMPE_IDX_GPMR_LSB]    = STMPE801_REG_GPIO_MP_STA,
 338        [STMPE_IDX_GPSR_LSB]    = STMPE801_REG_GPIO_SET_PIN,
 339        [STMPE_IDX_GPCR_LSB]    = STMPE801_REG_GPIO_SET_PIN,
 340        [STMPE_IDX_GPDR_LSB]    = STMPE801_REG_GPIO_DIR,
 341        [STMPE_IDX_IEGPIOR_LSB] = STMPE801_REG_GPIO_INT_EN,
 342        [STMPE_IDX_ISGPIOR_MSB] = STMPE801_REG_GPIO_INT_STA,
 343
 344};
 345
 346static struct stmpe_variant_block stmpe801_blocks[] = {
 347        {
 348                .cell   = &stmpe_gpio_cell,
 349                .irq    = 0,
 350                .block  = STMPE_BLOCK_GPIO,
 351        },
 352};
 353
 354static struct stmpe_variant_block stmpe801_blocks_noirq[] = {
 355        {
 356                .cell   = &stmpe_gpio_cell_noirq,
 357                .block  = STMPE_BLOCK_GPIO,
 358        },
 359};
 360
 361static int stmpe801_enable(struct stmpe *stmpe, unsigned int blocks,
 362                           bool enable)
 363{
 364        if (blocks & STMPE_BLOCK_GPIO)
 365                return 0;
 366        else
 367                return -EINVAL;
 368}
 369
 370static struct stmpe_variant_info stmpe801 = {
 371        .name           = "stmpe801",
 372        .id_val         = STMPE801_ID,
 373        .id_mask        = 0xffff,
 374        .num_gpios      = 8,
 375        .regs           = stmpe801_regs,
 376        .blocks         = stmpe801_blocks,
 377        .num_blocks     = ARRAY_SIZE(stmpe801_blocks),
 378        .num_irqs       = STMPE801_NR_INTERNAL_IRQS,
 379        .enable         = stmpe801_enable,
 380};
 381
 382static struct stmpe_variant_info stmpe801_noirq = {
 383        .name           = "stmpe801",
 384        .id_val         = STMPE801_ID,
 385        .id_mask        = 0xffff,
 386        .num_gpios      = 8,
 387        .regs           = stmpe801_regs,
 388        .blocks         = stmpe801_blocks_noirq,
 389        .num_blocks     = ARRAY_SIZE(stmpe801_blocks_noirq),
 390        .enable         = stmpe801_enable,
 391};
 392
 393/*
 394 * Touchscreen (STMPE811 or STMPE610)
 395 */
 396
 397static struct resource stmpe_ts_resources[] = {
 398        {
 399                .name   = "TOUCH_DET",
 400                .start  = 0,
 401                .end    = 0,
 402                .flags  = IORESOURCE_IRQ,
 403        },
 404        {
 405                .name   = "FIFO_TH",
 406                .start  = 1,
 407                .end    = 1,
 408                .flags  = IORESOURCE_IRQ,
 409        },
 410};
 411
 412static struct mfd_cell stmpe_ts_cell = {
 413        .name           = "stmpe-ts",
 414        .resources      = stmpe_ts_resources,
 415        .num_resources  = ARRAY_SIZE(stmpe_ts_resources),
 416};
 417
 418/*
 419 * STMPE811 or STMPE610
 420 */
 421
 422static const u8 stmpe811_regs[] = {
 423        [STMPE_IDX_CHIP_ID]     = STMPE811_REG_CHIP_ID,
 424        [STMPE_IDX_ICR_LSB]     = STMPE811_REG_INT_CTRL,
 425        [STMPE_IDX_IER_LSB]     = STMPE811_REG_INT_EN,
 426        [STMPE_IDX_ISR_MSB]     = STMPE811_REG_INT_STA,
 427        [STMPE_IDX_GPMR_LSB]    = STMPE811_REG_GPIO_MP_STA,
 428        [STMPE_IDX_GPSR_LSB]    = STMPE811_REG_GPIO_SET_PIN,
 429        [STMPE_IDX_GPCR_LSB]    = STMPE811_REG_GPIO_CLR_PIN,
 430        [STMPE_IDX_GPDR_LSB]    = STMPE811_REG_GPIO_DIR,
 431        [STMPE_IDX_GPRER_LSB]   = STMPE811_REG_GPIO_RE,
 432        [STMPE_IDX_GPFER_LSB]   = STMPE811_REG_GPIO_FE,
 433        [STMPE_IDX_GPAFR_U_MSB] = STMPE811_REG_GPIO_AF,
 434        [STMPE_IDX_IEGPIOR_LSB] = STMPE811_REG_GPIO_INT_EN,
 435        [STMPE_IDX_ISGPIOR_MSB] = STMPE811_REG_GPIO_INT_STA,
 436        [STMPE_IDX_GPEDR_MSB]   = STMPE811_REG_GPIO_ED,
 437};
 438
 439static struct stmpe_variant_block stmpe811_blocks[] = {
 440        {
 441                .cell   = &stmpe_gpio_cell,
 442                .irq    = STMPE811_IRQ_GPIOC,
 443                .block  = STMPE_BLOCK_GPIO,
 444        },
 445        {
 446                .cell   = &stmpe_ts_cell,
 447                .irq    = STMPE811_IRQ_TOUCH_DET,
 448                .block  = STMPE_BLOCK_TOUCHSCREEN,
 449        },
 450};
 451
 452static int stmpe811_enable(struct stmpe *stmpe, unsigned int blocks,
 453                           bool enable)
 454{
 455        unsigned int mask = 0;
 456
 457        if (blocks & STMPE_BLOCK_GPIO)
 458                mask |= STMPE811_SYS_CTRL2_GPIO_OFF;
 459
 460        if (blocks & STMPE_BLOCK_ADC)
 461                mask |= STMPE811_SYS_CTRL2_ADC_OFF;
 462
 463        if (blocks & STMPE_BLOCK_TOUCHSCREEN)
 464                mask |= STMPE811_SYS_CTRL2_TSC_OFF;
 465
 466        return __stmpe_set_bits(stmpe, STMPE811_REG_SYS_CTRL2, mask,
 467                                enable ? 0 : mask);
 468}
 469
 470static int stmpe811_get_altfunc(struct stmpe *stmpe, enum stmpe_block block)
 471{
 472        /* 0 for touchscreen, 1 for GPIO */
 473        return block != STMPE_BLOCK_TOUCHSCREEN;
 474}
 475
 476static struct stmpe_variant_info stmpe811 = {
 477        .name           = "stmpe811",
 478        .id_val         = 0x0811,
 479        .id_mask        = 0xffff,
 480        .num_gpios      = 8,
 481        .af_bits        = 1,
 482        .regs           = stmpe811_regs,
 483        .blocks         = stmpe811_blocks,
 484        .num_blocks     = ARRAY_SIZE(stmpe811_blocks),
 485        .num_irqs       = STMPE811_NR_INTERNAL_IRQS,
 486        .enable         = stmpe811_enable,
 487        .get_altfunc    = stmpe811_get_altfunc,
 488};
 489
 490/* Similar to 811, except number of gpios */
 491static struct stmpe_variant_info stmpe610 = {
 492        .name           = "stmpe610",
 493        .id_val         = 0x0811,
 494        .id_mask        = 0xffff,
 495        .num_gpios      = 6,
 496        .af_bits        = 1,
 497        .regs           = stmpe811_regs,
 498        .blocks         = stmpe811_blocks,
 499        .num_blocks     = ARRAY_SIZE(stmpe811_blocks),
 500        .num_irqs       = STMPE811_NR_INTERNAL_IRQS,
 501        .enable         = stmpe811_enable,
 502        .get_altfunc    = stmpe811_get_altfunc,
 503};
 504
 505/*
 506 * STMPE1601
 507 */
 508
 509static const u8 stmpe1601_regs[] = {
 510        [STMPE_IDX_CHIP_ID]     = STMPE1601_REG_CHIP_ID,
 511        [STMPE_IDX_ICR_LSB]     = STMPE1601_REG_ICR_LSB,
 512        [STMPE_IDX_IER_LSB]     = STMPE1601_REG_IER_LSB,
 513        [STMPE_IDX_ISR_MSB]     = STMPE1601_REG_ISR_MSB,
 514        [STMPE_IDX_GPMR_LSB]    = STMPE1601_REG_GPIO_MP_LSB,
 515        [STMPE_IDX_GPSR_LSB]    = STMPE1601_REG_GPIO_SET_LSB,
 516        [STMPE_IDX_GPCR_LSB]    = STMPE1601_REG_GPIO_CLR_LSB,
 517        [STMPE_IDX_GPDR_LSB]    = STMPE1601_REG_GPIO_SET_DIR_LSB,
 518        [STMPE_IDX_GPRER_LSB]   = STMPE1601_REG_GPIO_RE_LSB,
 519        [STMPE_IDX_GPFER_LSB]   = STMPE1601_REG_GPIO_FE_LSB,
 520        [STMPE_IDX_GPAFR_U_MSB] = STMPE1601_REG_GPIO_AF_U_MSB,
 521        [STMPE_IDX_IEGPIOR_LSB] = STMPE1601_REG_INT_EN_GPIO_MASK_LSB,
 522        [STMPE_IDX_ISGPIOR_MSB] = STMPE1601_REG_INT_STA_GPIO_MSB,
 523        [STMPE_IDX_GPEDR_MSB]   = STMPE1601_REG_GPIO_ED_MSB,
 524};
 525
 526static struct stmpe_variant_block stmpe1601_blocks[] = {
 527        {
 528                .cell   = &stmpe_gpio_cell,
 529                .irq    = STMPE24XX_IRQ_GPIOC,
 530                .block  = STMPE_BLOCK_GPIO,
 531        },
 532        {
 533                .cell   = &stmpe_keypad_cell,
 534                .irq    = STMPE24XX_IRQ_KEYPAD,
 535                .block  = STMPE_BLOCK_KEYPAD,
 536        },
 537};
 538
 539/* supported autosleep timeout delay (in msecs) */
 540static const int stmpe_autosleep_delay[] = {
 541        4, 16, 32, 64, 128, 256, 512, 1024,
 542};
 543
 544static int stmpe_round_timeout(int timeout)
 545{
 546        int i;
 547
 548        for (i = 0; i < ARRAY_SIZE(stmpe_autosleep_delay); i++) {
 549                if (stmpe_autosleep_delay[i] >= timeout)
 550                        return i;
 551        }
 552
 553        /*
 554         * requests for delays longer than supported should not return the
 555         * longest supported delay
 556         */
 557        return -EINVAL;
 558}
 559
 560static int stmpe_autosleep(struct stmpe *stmpe, int autosleep_timeout)
 561{
 562        int ret;
 563
 564        if (!stmpe->variant->enable_autosleep)
 565                return -ENOSYS;
 566
 567        mutex_lock(&stmpe->lock);
 568        ret = stmpe->variant->enable_autosleep(stmpe, autosleep_timeout);
 569        mutex_unlock(&stmpe->lock);
 570
 571        return ret;
 572}
 573
 574/*
 575 * Both stmpe 1601/2403 support same layout for autosleep
 576 */
 577static int stmpe1601_autosleep(struct stmpe *stmpe,
 578                int autosleep_timeout)
 579{
 580        int ret, timeout;
 581
 582        /* choose the best available timeout */
 583        timeout = stmpe_round_timeout(autosleep_timeout);
 584        if (timeout < 0) {
 585                dev_err(stmpe->dev, "invalid timeout\n");
 586                return timeout;
 587        }
 588
 589        ret = __stmpe_set_bits(stmpe, STMPE1601_REG_SYS_CTRL2,
 590                        STMPE1601_AUTOSLEEP_TIMEOUT_MASK,
 591                        timeout);
 592        if (ret < 0)
 593                return ret;
 594
 595        return __stmpe_set_bits(stmpe, STMPE1601_REG_SYS_CTRL2,
 596                        STPME1601_AUTOSLEEP_ENABLE,
 597                        STPME1601_AUTOSLEEP_ENABLE);
 598}
 599
 600static int stmpe1601_enable(struct stmpe *stmpe, unsigned int blocks,
 601                            bool enable)
 602{
 603        unsigned int mask = 0;
 604
 605        if (blocks & STMPE_BLOCK_GPIO)
 606                mask |= STMPE1601_SYS_CTRL_ENABLE_GPIO;
 607
 608        if (blocks & STMPE_BLOCK_KEYPAD)
 609                mask |= STMPE1601_SYS_CTRL_ENABLE_KPC;
 610
 611        return __stmpe_set_bits(stmpe, STMPE1601_REG_SYS_CTRL, mask,
 612                                enable ? mask : 0);
 613}
 614
 615static int stmpe1601_get_altfunc(struct stmpe *stmpe, enum stmpe_block block)
 616{
 617        switch (block) {
 618        case STMPE_BLOCK_PWM:
 619                return 2;
 620
 621        case STMPE_BLOCK_KEYPAD:
 622                return 1;
 623
 624        case STMPE_BLOCK_GPIO:
 625        default:
 626                return 0;
 627        }
 628}
 629
 630static struct stmpe_variant_info stmpe1601 = {
 631        .name           = "stmpe1601",
 632        .id_val         = 0x0210,
 633        .id_mask        = 0xfff0,       /* at least 0x0210 and 0x0212 */
 634        .num_gpios      = 16,
 635        .af_bits        = 2,
 636        .regs           = stmpe1601_regs,
 637        .blocks         = stmpe1601_blocks,
 638        .num_blocks     = ARRAY_SIZE(stmpe1601_blocks),
 639        .num_irqs       = STMPE1601_NR_INTERNAL_IRQS,
 640        .enable         = stmpe1601_enable,
 641        .get_altfunc    = stmpe1601_get_altfunc,
 642        .enable_autosleep       = stmpe1601_autosleep,
 643};
 644
 645/*
 646 * STMPE24XX
 647 */
 648
 649static const u8 stmpe24xx_regs[] = {
 650        [STMPE_IDX_CHIP_ID]     = STMPE24XX_REG_CHIP_ID,
 651        [STMPE_IDX_ICR_LSB]     = STMPE24XX_REG_ICR_LSB,
 652        [STMPE_IDX_IER_LSB]     = STMPE24XX_REG_IER_LSB,
 653        [STMPE_IDX_ISR_MSB]     = STMPE24XX_REG_ISR_MSB,
 654        [STMPE_IDX_GPMR_LSB]    = STMPE24XX_REG_GPMR_LSB,
 655        [STMPE_IDX_GPSR_LSB]    = STMPE24XX_REG_GPSR_LSB,
 656        [STMPE_IDX_GPCR_LSB]    = STMPE24XX_REG_GPCR_LSB,
 657        [STMPE_IDX_GPDR_LSB]    = STMPE24XX_REG_GPDR_LSB,
 658        [STMPE_IDX_GPRER_LSB]   = STMPE24XX_REG_GPRER_LSB,
 659        [STMPE_IDX_GPFER_LSB]   = STMPE24XX_REG_GPFER_LSB,
 660        [STMPE_IDX_GPAFR_U_MSB] = STMPE24XX_REG_GPAFR_U_MSB,
 661        [STMPE_IDX_IEGPIOR_LSB] = STMPE24XX_REG_IEGPIOR_LSB,
 662        [STMPE_IDX_ISGPIOR_MSB] = STMPE24XX_REG_ISGPIOR_MSB,
 663        [STMPE_IDX_GPEDR_MSB]   = STMPE24XX_REG_GPEDR_MSB,
 664};
 665
 666static struct stmpe_variant_block stmpe24xx_blocks[] = {
 667        {
 668                .cell   = &stmpe_gpio_cell,
 669                .irq    = STMPE24XX_IRQ_GPIOC,
 670                .block  = STMPE_BLOCK_GPIO,
 671        },
 672        {
 673                .cell   = &stmpe_keypad_cell,
 674                .irq    = STMPE24XX_IRQ_KEYPAD,
 675                .block  = STMPE_BLOCK_KEYPAD,
 676        },
 677};
 678
 679static int stmpe24xx_enable(struct stmpe *stmpe, unsigned int blocks,
 680                            bool enable)
 681{
 682        unsigned int mask = 0;
 683
 684        if (blocks & STMPE_BLOCK_GPIO)
 685                mask |= STMPE24XX_SYS_CTRL_ENABLE_GPIO;
 686
 687        if (blocks & STMPE_BLOCK_KEYPAD)
 688                mask |= STMPE24XX_SYS_CTRL_ENABLE_KPC;
 689
 690        return __stmpe_set_bits(stmpe, STMPE24XX_REG_SYS_CTRL, mask,
 691                                enable ? mask : 0);
 692}
 693
 694static int stmpe24xx_get_altfunc(struct stmpe *stmpe, enum stmpe_block block)
 695{
 696        switch (block) {
 697        case STMPE_BLOCK_ROTATOR:
 698                return 2;
 699
 700        case STMPE_BLOCK_KEYPAD:
 701                return 1;
 702
 703        case STMPE_BLOCK_GPIO:
 704        default:
 705                return 0;
 706        }
 707}
 708
 709static struct stmpe_variant_info stmpe2401 = {
 710        .name           = "stmpe2401",
 711        .id_val         = 0x0101,
 712        .id_mask        = 0xffff,
 713        .num_gpios      = 24,
 714        .af_bits        = 2,
 715        .regs           = stmpe24xx_regs,
 716        .blocks         = stmpe24xx_blocks,
 717        .num_blocks     = ARRAY_SIZE(stmpe24xx_blocks),
 718        .num_irqs       = STMPE24XX_NR_INTERNAL_IRQS,
 719        .enable         = stmpe24xx_enable,
 720        .get_altfunc    = stmpe24xx_get_altfunc,
 721};
 722
 723static struct stmpe_variant_info stmpe2403 = {
 724        .name           = "stmpe2403",
 725        .id_val         = 0x0120,
 726        .id_mask        = 0xffff,
 727        .num_gpios      = 24,
 728        .af_bits        = 2,
 729        .regs           = stmpe24xx_regs,
 730        .blocks         = stmpe24xx_blocks,
 731        .num_blocks     = ARRAY_SIZE(stmpe24xx_blocks),
 732        .num_irqs       = STMPE24XX_NR_INTERNAL_IRQS,
 733        .enable         = stmpe24xx_enable,
 734        .get_altfunc    = stmpe24xx_get_altfunc,
 735        .enable_autosleep       = stmpe1601_autosleep, /* same as stmpe1601 */
 736};
 737
 738static struct stmpe_variant_info *stmpe_variant_info[STMPE_NBR_PARTS] = {
 739        [STMPE610]      = &stmpe610,
 740        [STMPE801]      = &stmpe801,
 741        [STMPE811]      = &stmpe811,
 742        [STMPE1601]     = &stmpe1601,
 743        [STMPE2401]     = &stmpe2401,
 744        [STMPE2403]     = &stmpe2403,
 745};
 746
 747/*
 748 * These devices can be connected in a 'no-irq' configuration - the irq pin
 749 * is not used and the device cannot interrupt the CPU. Here we only list
 750 * devices which support this configuration - the driver will fail probing
 751 * for any devices not listed here which are configured in this way.
 752 */
 753static struct stmpe_variant_info *stmpe_noirq_variant_info[STMPE_NBR_PARTS] = {
 754        [STMPE801]      = &stmpe801_noirq,
 755};
 756
 757static irqreturn_t stmpe_irq(int irq, void *data)
 758{
 759        struct stmpe *stmpe = data;
 760        struct stmpe_variant_info *variant = stmpe->variant;
 761        int num = DIV_ROUND_UP(variant->num_irqs, 8);
 762        u8 israddr = stmpe->regs[STMPE_IDX_ISR_MSB];
 763        u8 isr[num];
 764        int ret;
 765        int i;
 766
 767        if (variant->id_val == STMPE801_ID) {
 768                handle_nested_irq(stmpe->irq_base);
 769                return IRQ_HANDLED;
 770        }
 771
 772        ret = stmpe_block_read(stmpe, israddr, num, isr);
 773        if (ret < 0)
 774                return IRQ_NONE;
 775
 776        for (i = 0; i < num; i++) {
 777                int bank = num - i - 1;
 778                u8 status = isr[i];
 779                u8 clear;
 780
 781                status &= stmpe->ier[bank];
 782                if (!status)
 783                        continue;
 784
 785                clear = status;
 786                while (status) {
 787                        int bit = __ffs(status);
 788                        int line = bank * 8 + bit;
 789
 790                        handle_nested_irq(stmpe->irq_base + line);
 791                        status &= ~(1 << bit);
 792                }
 793
 794                stmpe_reg_write(stmpe, israddr + i, clear);
 795        }
 796
 797        return IRQ_HANDLED;
 798}
 799
 800static void stmpe_irq_lock(struct irq_data *data)
 801{
 802        struct stmpe *stmpe = irq_data_get_irq_chip_data(data);
 803
 804        mutex_lock(&stmpe->irq_lock);
 805}
 806
 807static void stmpe_irq_sync_unlock(struct irq_data *data)
 808{
 809        struct stmpe *stmpe = irq_data_get_irq_chip_data(data);
 810        struct stmpe_variant_info *variant = stmpe->variant;
 811        int num = DIV_ROUND_UP(variant->num_irqs, 8);
 812        int i;
 813
 814        for (i = 0; i < num; i++) {
 815                u8 new = stmpe->ier[i];
 816                u8 old = stmpe->oldier[i];
 817
 818                if (new == old)
 819                        continue;
 820
 821                stmpe->oldier[i] = new;
 822                stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_IER_LSB] - i, new);
 823        }
 824
 825        mutex_unlock(&stmpe->irq_lock);
 826}
 827
 828static void stmpe_irq_mask(struct irq_data *data)
 829{
 830        struct stmpe *stmpe = irq_data_get_irq_chip_data(data);
 831        int offset = data->irq - stmpe->irq_base;
 832        int regoffset = offset / 8;
 833        int mask = 1 << (offset % 8);
 834
 835        stmpe->ier[regoffset] &= ~mask;
 836}
 837
 838static void stmpe_irq_unmask(struct irq_data *data)
 839{
 840        struct stmpe *stmpe = irq_data_get_irq_chip_data(data);
 841        int offset = data->irq - stmpe->irq_base;
 842        int regoffset = offset / 8;
 843        int mask = 1 << (offset % 8);
 844
 845        stmpe->ier[regoffset] |= mask;
 846}
 847
 848static struct irq_chip stmpe_irq_chip = {
 849        .name                   = "stmpe",
 850        .irq_bus_lock           = stmpe_irq_lock,
 851        .irq_bus_sync_unlock    = stmpe_irq_sync_unlock,
 852        .irq_mask               = stmpe_irq_mask,
 853        .irq_unmask             = stmpe_irq_unmask,
 854};
 855
 856static int __devinit stmpe_irq_init(struct stmpe *stmpe)
 857{
 858        struct irq_chip *chip = NULL;
 859        int num_irqs = stmpe->variant->num_irqs;
 860        int base = stmpe->irq_base;
 861        int irq;
 862
 863        if (stmpe->variant->id_val != STMPE801_ID)
 864                chip = &stmpe_irq_chip;
 865
 866        for (irq = base; irq < base + num_irqs; irq++) {
 867                irq_set_chip_data(irq, stmpe);
 868                irq_set_chip_and_handler(irq, chip, handle_edge_irq);
 869                irq_set_nested_thread(irq, 1);
 870#ifdef CONFIG_ARM
 871                set_irq_flags(irq, IRQF_VALID);
 872#else
 873                irq_set_noprobe(irq);
 874#endif
 875        }
 876
 877        return 0;
 878}
 879
 880static void stmpe_irq_remove(struct stmpe *stmpe)
 881{
 882        int num_irqs = stmpe->variant->num_irqs;
 883        int base = stmpe->irq_base;
 884        int irq;
 885
 886        for (irq = base; irq < base + num_irqs; irq++) {
 887#ifdef CONFIG_ARM
 888                set_irq_flags(irq, 0);
 889#endif
 890                irq_set_chip_and_handler(irq, NULL, NULL);
 891                irq_set_chip_data(irq, NULL);
 892        }
 893}
 894
 895static int __devinit stmpe_chip_init(struct stmpe *stmpe)
 896{
 897        unsigned int irq_trigger = stmpe->pdata->irq_trigger;
 898        int autosleep_timeout = stmpe->pdata->autosleep_timeout;
 899        struct stmpe_variant_info *variant = stmpe->variant;
 900        u8 icr = 0;
 901        unsigned int id;
 902        u8 data[2];
 903        int ret;
 904
 905        ret = stmpe_block_read(stmpe, stmpe->regs[STMPE_IDX_CHIP_ID],
 906                               ARRAY_SIZE(data), data);
 907        if (ret < 0)
 908                return ret;
 909
 910        id = (data[0] << 8) | data[1];
 911        if ((id & variant->id_mask) != variant->id_val) {
 912                dev_err(stmpe->dev, "unknown chip id: %#x\n", id);
 913                return -EINVAL;
 914        }
 915
 916        dev_info(stmpe->dev, "%s detected, chip id: %#x\n", variant->name, id);
 917
 918        /* Disable all modules -- subdrivers should enable what they need. */
 919        ret = stmpe_disable(stmpe, ~0);
 920        if (ret)
 921                return ret;
 922
 923        if (stmpe->irq >= 0) {
 924                if (id == STMPE801_ID)
 925                        icr = STMPE801_REG_SYS_CTRL_INT_EN;
 926                else
 927                        icr = STMPE_ICR_LSB_GIM;
 928
 929                /* STMPE801 doesn't support Edge interrupts */
 930                if (id != STMPE801_ID) {
 931                        if (irq_trigger == IRQF_TRIGGER_FALLING ||
 932                                        irq_trigger == IRQF_TRIGGER_RISING)
 933                                icr |= STMPE_ICR_LSB_EDGE;
 934                }
 935
 936                if (irq_trigger == IRQF_TRIGGER_RISING ||
 937                                irq_trigger == IRQF_TRIGGER_HIGH) {
 938                        if (id == STMPE801_ID)
 939                                icr |= STMPE801_REG_SYS_CTRL_INT_HI;
 940                        else
 941                                icr |= STMPE_ICR_LSB_HIGH;
 942                }
 943
 944                if (stmpe->pdata->irq_invert_polarity) {
 945                        if (id == STMPE801_ID)
 946                                icr ^= STMPE801_REG_SYS_CTRL_INT_HI;
 947                        else
 948                                icr ^= STMPE_ICR_LSB_HIGH;
 949                }
 950        }
 951
 952        if (stmpe->pdata->autosleep) {
 953                ret = stmpe_autosleep(stmpe, autosleep_timeout);
 954                if (ret)
 955                        return ret;
 956        }
 957
 958        return stmpe_reg_write(stmpe, stmpe->regs[STMPE_IDX_ICR_LSB], icr);
 959}
 960
 961static int __devinit stmpe_add_device(struct stmpe *stmpe,
 962                                      struct mfd_cell *cell, int irq)
 963{
 964        return mfd_add_devices(stmpe->dev, stmpe->pdata->id, cell, 1,
 965                               NULL, stmpe->irq_base + irq, NULL);
 966}
 967
 968static int __devinit stmpe_devices_init(struct stmpe *stmpe)
 969{
 970        struct stmpe_variant_info *variant = stmpe->variant;
 971        unsigned int platform_blocks = stmpe->pdata->blocks;
 972        int ret = -EINVAL;
 973        int i;
 974
 975        for (i = 0; i < variant->num_blocks; i++) {
 976                struct stmpe_variant_block *block = &variant->blocks[i];
 977
 978                if (!(platform_blocks & block->block))
 979                        continue;
 980
 981                platform_blocks &= ~block->block;
 982                ret = stmpe_add_device(stmpe, block->cell, block->irq);
 983                if (ret)
 984                        return ret;
 985        }
 986
 987        if (platform_blocks)
 988                dev_warn(stmpe->dev,
 989                         "platform wants blocks (%#x) not present on variant",
 990                         platform_blocks);
 991
 992        return ret;
 993}
 994
 995/* Called from client specific probe routines */
 996int __devinit stmpe_probe(struct stmpe_client_info *ci, int partnum)
 997{
 998        struct stmpe_platform_data *pdata = dev_get_platdata(ci->dev);
 999        struct stmpe *stmpe;
1000        int ret;
1001
1002        if (!pdata)
1003                return -EINVAL;
1004
1005        stmpe = kzalloc(sizeof(struct stmpe), GFP_KERNEL);
1006        if (!stmpe)
1007                return -ENOMEM;
1008
1009        mutex_init(&stmpe->irq_lock);
1010        mutex_init(&stmpe->lock);
1011
1012        stmpe->dev = ci->dev;
1013        stmpe->client = ci->client;
1014        stmpe->pdata = pdata;
1015        stmpe->irq_base = pdata->irq_base;
1016        stmpe->ci = ci;
1017        stmpe->partnum = partnum;
1018        stmpe->variant = stmpe_variant_info[partnum];
1019        stmpe->regs = stmpe->variant->regs;
1020        stmpe->num_gpios = stmpe->variant->num_gpios;
1021        dev_set_drvdata(stmpe->dev, stmpe);
1022
1023        if (ci->init)
1024                ci->init(stmpe);
1025
1026        if (pdata->irq_over_gpio) {
1027                ret = gpio_request_one(pdata->irq_gpio, GPIOF_DIR_IN, "stmpe");
1028                if (ret) {
1029                        dev_err(stmpe->dev, "failed to request IRQ GPIO: %d\n",
1030                                        ret);
1031                        goto out_free;
1032                }
1033
1034                stmpe->irq = gpio_to_irq(pdata->irq_gpio);
1035        } else {
1036                stmpe->irq = ci->irq;
1037        }
1038
1039        if (stmpe->irq < 0) {
1040                /* use alternate variant info for no-irq mode, if supported */
1041                dev_info(stmpe->dev,
1042                        "%s configured in no-irq mode by platform data\n",
1043                        stmpe->variant->name);
1044                if (!stmpe_noirq_variant_info[stmpe->partnum]) {
1045                        dev_err(stmpe->dev,
1046                                "%s does not support no-irq mode!\n",
1047                                stmpe->variant->name);
1048                        ret = -ENODEV;
1049                        goto free_gpio;
1050                }
1051                stmpe->variant = stmpe_noirq_variant_info[stmpe->partnum];
1052        }
1053
1054        ret = stmpe_chip_init(stmpe);
1055        if (ret)
1056                goto free_gpio;
1057
1058        if (stmpe->irq >= 0) {
1059                ret = stmpe_irq_init(stmpe);
1060                if (ret)
1061                        goto free_gpio;
1062
1063                ret = request_threaded_irq(stmpe->irq, NULL, stmpe_irq,
1064                                pdata->irq_trigger | IRQF_ONESHOT,
1065                                "stmpe", stmpe);
1066                if (ret) {
1067                        dev_err(stmpe->dev, "failed to request IRQ: %d\n",
1068                                        ret);
1069                        goto out_removeirq;
1070                }
1071        }
1072
1073        ret = stmpe_devices_init(stmpe);
1074        if (ret) {
1075                dev_err(stmpe->dev, "failed to add children\n");
1076                goto out_removedevs;
1077        }
1078
1079        return 0;
1080
1081out_removedevs:
1082        mfd_remove_devices(stmpe->dev);
1083        if (stmpe->irq >= 0)
1084                free_irq(stmpe->irq, stmpe);
1085out_removeirq:
1086        if (stmpe->irq >= 0)
1087                stmpe_irq_remove(stmpe);
1088free_gpio:
1089        if (pdata->irq_over_gpio)
1090                gpio_free(pdata->irq_gpio);
1091out_free:
1092        kfree(stmpe);
1093        return ret;
1094}
1095
1096int stmpe_remove(struct stmpe *stmpe)
1097{
1098        mfd_remove_devices(stmpe->dev);
1099
1100        if (stmpe->irq >= 0) {
1101                free_irq(stmpe->irq, stmpe);
1102                stmpe_irq_remove(stmpe);
1103        }
1104
1105        if (stmpe->pdata->irq_over_gpio)
1106                gpio_free(stmpe->pdata->irq_gpio);
1107
1108        kfree(stmpe);
1109
1110        return 0;
1111}
1112
1113#ifdef CONFIG_PM
1114static int stmpe_suspend(struct device *dev)
1115{
1116        struct stmpe *stmpe = dev_get_drvdata(dev);
1117
1118        if (stmpe->irq >= 0 && device_may_wakeup(dev))
1119                enable_irq_wake(stmpe->irq);
1120
1121        return 0;
1122}
1123
1124static int stmpe_resume(struct device *dev)
1125{
1126        struct stmpe *stmpe = dev_get_drvdata(dev);
1127
1128        if (stmpe->irq >= 0 && device_may_wakeup(dev))
1129                disable_irq_wake(stmpe->irq);
1130
1131        return 0;
1132}
1133
1134const struct dev_pm_ops stmpe_dev_pm_ops = {
1135        .suspend        = stmpe_suspend,
1136        .resume         = stmpe_resume,
1137};
1138#endif
1139
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.