linux/drivers/pinctrl/qcom/pinctrl-msm.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2013, Sony Mobile Communications AB.
   3 * Copyright (c) 2013, The Linux Foundation. All rights reserved.
   4 *
   5 * This program is free software; you can redistribute it and/or modify
   6 * it under the terms of the GNU General Public License version 2 and
   7 * only version 2 as published by the Free Software Foundation.
   8 *
   9 * This program is distributed in the hope that it will be useful,
  10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12 * GNU General Public License for more details.
  13 */
  14
  15#include <linux/delay.h>
  16#include <linux/err.h>
  17#include <linux/io.h>
  18#include <linux/module.h>
  19#include <linux/of.h>
  20#include <linux/platform_device.h>
  21#include <linux/pinctrl/machine.h>
  22#include <linux/pinctrl/pinctrl.h>
  23#include <linux/pinctrl/pinmux.h>
  24#include <linux/pinctrl/pinconf.h>
  25#include <linux/pinctrl/pinconf-generic.h>
  26#include <linux/slab.h>
  27#include <linux/gpio.h>
  28#include <linux/interrupt.h>
  29#include <linux/spinlock.h>
  30#include <linux/reboot.h>
  31#include <linux/pm.h>
  32
  33#include "../core.h"
  34#include "../pinconf.h"
  35#include "pinctrl-msm.h"
  36#include "../pinctrl-utils.h"
  37
  38#define MAX_NR_GPIO 300
  39#define PS_HOLD_OFFSET 0x820
  40
  41/**
  42 * struct msm_pinctrl - state for a pinctrl-msm device
  43 * @dev:            device handle.
  44 * @pctrl:          pinctrl handle.
  45 * @chip:           gpiochip handle.
  46 * @restart_nb:     restart notifier block.
  47 * @irq:            parent irq for the TLMM irq_chip.
  48 * @lock:           Spinlock to protect register resources as well
  49 *                  as msm_pinctrl data structures.
  50 * @enabled_irqs:   Bitmap of currently enabled irqs.
  51 * @dual_edge_irqs: Bitmap of irqs that need sw emulated dual edge
  52 *                  detection.
  53 * @soc;            Reference to soc_data of platform specific data.
  54 * @regs:           Base address for the TLMM register map.
  55 */
  56struct msm_pinctrl {
  57        struct device *dev;
  58        struct pinctrl_dev *pctrl;
  59        struct gpio_chip chip;
  60        struct notifier_block restart_nb;
  61        int irq;
  62
  63        spinlock_t lock;
  64
  65        DECLARE_BITMAP(dual_edge_irqs, MAX_NR_GPIO);
  66        DECLARE_BITMAP(enabled_irqs, MAX_NR_GPIO);
  67
  68        const struct msm_pinctrl_soc_data *soc;
  69        void __iomem *regs;
  70};
  71
  72static int msm_get_groups_count(struct pinctrl_dev *pctldev)
  73{
  74        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  75
  76        return pctrl->soc->ngroups;
  77}
  78
  79static const char *msm_get_group_name(struct pinctrl_dev *pctldev,
  80                                      unsigned group)
  81{
  82        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  83
  84        return pctrl->soc->groups[group].name;
  85}
  86
  87static int msm_get_group_pins(struct pinctrl_dev *pctldev,
  88                              unsigned group,
  89                              const unsigned **pins,
  90                              unsigned *num_pins)
  91{
  92        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
  93
  94        *pins = pctrl->soc->groups[group].pins;
  95        *num_pins = pctrl->soc->groups[group].npins;
  96        return 0;
  97}
  98
  99static const struct pinctrl_ops msm_pinctrl_ops = {
 100        .get_groups_count       = msm_get_groups_count,
 101        .get_group_name         = msm_get_group_name,
 102        .get_group_pins         = msm_get_group_pins,
 103        .dt_node_to_map         = pinconf_generic_dt_node_to_map_group,
 104        .dt_free_map            = pinctrl_utils_free_map,
 105};
 106
 107static int msm_get_functions_count(struct pinctrl_dev *pctldev)
 108{
 109        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
 110
 111        return pctrl->soc->nfunctions;
 112}
 113
 114static const char *msm_get_function_name(struct pinctrl_dev *pctldev,
 115                                         unsigned function)
 116{
 117        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
 118
 119        return pctrl->soc->functions[function].name;
 120}
 121
 122static int msm_get_function_groups(struct pinctrl_dev *pctldev,
 123                                   unsigned function,
 124                                   const char * const **groups,
 125                                   unsigned * const num_groups)
 126{
 127        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
 128
 129        *groups = pctrl->soc->functions[function].groups;
 130        *num_groups = pctrl->soc->functions[function].ngroups;
 131        return 0;
 132}
 133
 134static int msm_pinmux_set_mux(struct pinctrl_dev *pctldev,
 135                              unsigned function,
 136                              unsigned group)
 137{
 138        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
 139        const struct msm_pingroup *g;
 140        unsigned long flags;
 141        u32 val;
 142        int i;
 143
 144        g = &pctrl->soc->groups[group];
 145
 146        for (i = 0; i < g->nfuncs; i++) {
 147                if (g->funcs[i] == function)
 148                        break;
 149        }
 150
 151        if (WARN_ON(i == g->nfuncs))
 152                return -EINVAL;
 153
 154        spin_lock_irqsave(&pctrl->lock, flags);
 155
 156        val = readl(pctrl->regs + g->ctl_reg);
 157        val &= ~(0x7 << g->mux_bit);
 158        val |= i << g->mux_bit;
 159        writel(val, pctrl->regs + g->ctl_reg);
 160
 161        spin_unlock_irqrestore(&pctrl->lock, flags);
 162
 163        return 0;
 164}
 165
 166static const struct pinmux_ops msm_pinmux_ops = {
 167        .get_functions_count    = msm_get_functions_count,
 168        .get_function_name      = msm_get_function_name,
 169        .get_function_groups    = msm_get_function_groups,
 170        .set_mux                = msm_pinmux_set_mux,
 171};
 172
 173static int msm_config_reg(struct msm_pinctrl *pctrl,
 174                          const struct msm_pingroup *g,
 175                          unsigned param,
 176                          unsigned *mask,
 177                          unsigned *bit)
 178{
 179        switch (param) {
 180        case PIN_CONFIG_BIAS_DISABLE:
 181        case PIN_CONFIG_BIAS_PULL_DOWN:
 182        case PIN_CONFIG_BIAS_BUS_HOLD:
 183        case PIN_CONFIG_BIAS_PULL_UP:
 184                *bit = g->pull_bit;
 185                *mask = 3;
 186                break;
 187        case PIN_CONFIG_DRIVE_STRENGTH:
 188                *bit = g->drv_bit;
 189                *mask = 7;
 190                break;
 191        case PIN_CONFIG_OUTPUT:
 192        case PIN_CONFIG_INPUT_ENABLE:
 193                *bit = g->oe_bit;
 194                *mask = 1;
 195                break;
 196        default:
 197                return -ENOTSUPP;
 198        }
 199
 200        return 0;
 201}
 202
 203#define MSM_NO_PULL     0
 204#define MSM_PULL_DOWN   1
 205#define MSM_KEEPER      2
 206#define MSM_PULL_UP     3
 207
 208static unsigned msm_regval_to_drive(u32 val)
 209{
 210        return (val + 1) * 2;
 211}
 212
 213static int msm_config_group_get(struct pinctrl_dev *pctldev,
 214                                unsigned int group,
 215                                unsigned long *config)
 216{
 217        const struct msm_pingroup *g;
 218        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
 219        unsigned param = pinconf_to_config_param(*config);
 220        unsigned mask;
 221        unsigned arg;
 222        unsigned bit;
 223        int ret;
 224        u32 val;
 225
 226        g = &pctrl->soc->groups[group];
 227
 228        ret = msm_config_reg(pctrl, g, param, &mask, &bit);
 229        if (ret < 0)
 230                return ret;
 231
 232        val = readl(pctrl->regs + g->ctl_reg);
 233        arg = (val >> bit) & mask;
 234
 235        /* Convert register value to pinconf value */
 236        switch (param) {
 237        case PIN_CONFIG_BIAS_DISABLE:
 238                arg = arg == MSM_NO_PULL;
 239                break;
 240        case PIN_CONFIG_BIAS_PULL_DOWN:
 241                arg = arg == MSM_PULL_DOWN;
 242                break;
 243        case PIN_CONFIG_BIAS_BUS_HOLD:
 244                arg = arg == MSM_KEEPER;
 245                break;
 246        case PIN_CONFIG_BIAS_PULL_UP:
 247                arg = arg == MSM_PULL_UP;
 248                break;
 249        case PIN_CONFIG_DRIVE_STRENGTH:
 250                arg = msm_regval_to_drive(arg);
 251                break;
 252        case PIN_CONFIG_OUTPUT:
 253                /* Pin is not output */
 254                if (!arg)
 255                        return -EINVAL;
 256
 257                val = readl(pctrl->regs + g->io_reg);
 258                arg = !!(val & BIT(g->in_bit));
 259                break;
 260        case PIN_CONFIG_INPUT_ENABLE:
 261                /* Pin is output */
 262                if (arg)
 263                        return -EINVAL;
 264                arg = 1;
 265                break;
 266        default:
 267                return -ENOTSUPP;
 268        }
 269
 270        *config = pinconf_to_config_packed(param, arg);
 271
 272        return 0;
 273}
 274
 275static int msm_config_group_set(struct pinctrl_dev *pctldev,
 276                                unsigned group,
 277                                unsigned long *configs,
 278                                unsigned num_configs)
 279{
 280        const struct msm_pingroup *g;
 281        struct msm_pinctrl *pctrl = pinctrl_dev_get_drvdata(pctldev);
 282        unsigned long flags;
 283        unsigned param;
 284        unsigned mask;
 285        unsigned arg;
 286        unsigned bit;
 287        int ret;
 288        u32 val;
 289        int i;
 290
 291        g = &pctrl->soc->groups[group];
 292
 293        for (i = 0; i < num_configs; i++) {
 294                param = pinconf_to_config_param(configs[i]);
 295                arg = pinconf_to_config_argument(configs[i]);
 296
 297                ret = msm_config_reg(pctrl, g, param, &mask, &bit);
 298                if (ret < 0)
 299                        return ret;
 300
 301                /* Convert pinconf values to register values */
 302                switch (param) {
 303                case PIN_CONFIG_BIAS_DISABLE:
 304                        arg = MSM_NO_PULL;
 305                        break;
 306                case PIN_CONFIG_BIAS_PULL_DOWN:
 307                        arg = MSM_PULL_DOWN;
 308                        break;
 309                case PIN_CONFIG_BIAS_BUS_HOLD:
 310                        arg = MSM_KEEPER;
 311                        break;
 312                case PIN_CONFIG_BIAS_PULL_UP:
 313                        arg = MSM_PULL_UP;
 314                        break;
 315                case PIN_CONFIG_DRIVE_STRENGTH:
 316                        /* Check for invalid values */
 317                        if (arg > 16 || arg < 2 || (arg % 2) != 0)
 318                                arg = -1;
 319                        else
 320                                arg = (arg / 2) - 1;
 321                        break;
 322                case PIN_CONFIG_OUTPUT:
 323                        /* set output value */
 324                        spin_lock_irqsave(&pctrl->lock, flags);
 325                        val = readl(pctrl->regs + g->io_reg);
 326                        if (arg)
 327                                val |= BIT(g->out_bit);
 328                        else
 329                                val &= ~BIT(g->out_bit);
 330                        writel(val, pctrl->regs + g->io_reg);
 331                        spin_unlock_irqrestore(&pctrl->lock, flags);
 332
 333                        /* enable output */
 334                        arg = 1;
 335                        break;
 336                case PIN_CONFIG_INPUT_ENABLE:
 337                        /* disable output */
 338                        arg = 0;
 339                        break;
 340                default:
 341                        dev_err(pctrl->dev, "Unsupported config parameter: %x\n",
 342                                param);
 343                        return -EINVAL;
 344                }
 345
 346                /* Range-check user-supplied value */
 347                if (arg & ~mask) {
 348                        dev_err(pctrl->dev, "config %x: %x is invalid\n", param, arg);
 349                        return -EINVAL;
 350                }
 351
 352                spin_lock_irqsave(&pctrl->lock, flags);
 353                val = readl(pctrl->regs + g->ctl_reg);
 354                val &= ~(mask << bit);
 355                val |= arg << bit;
 356                writel(val, pctrl->regs + g->ctl_reg);
 357                spin_unlock_irqrestore(&pctrl->lock, flags);
 358        }
 359
 360        return 0;
 361}
 362
 363static const struct pinconf_ops msm_pinconf_ops = {
 364        .is_generic             = true,
 365        .pin_config_group_get   = msm_config_group_get,
 366        .pin_config_group_set   = msm_config_group_set,
 367};
 368
 369static struct pinctrl_desc msm_pinctrl_desc = {
 370        .pctlops = &msm_pinctrl_ops,
 371        .pmxops = &msm_pinmux_ops,
 372        .confops = &msm_pinconf_ops,
 373        .owner = THIS_MODULE,
 374};
 375
 376static int msm_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
 377{
 378        const struct msm_pingroup *g;
 379        struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
 380        unsigned long flags;
 381        u32 val;
 382
 383        g = &pctrl->soc->groups[offset];
 384
 385        spin_lock_irqsave(&pctrl->lock, flags);
 386
 387        val = readl(pctrl->regs + g->ctl_reg);
 388        val &= ~BIT(g->oe_bit);
 389        writel(val, pctrl->regs + g->ctl_reg);
 390
 391        spin_unlock_irqrestore(&pctrl->lock, flags);
 392
 393        return 0;
 394}
 395
 396static int msm_gpio_direction_output(struct gpio_chip *chip, unsigned offset, int value)
 397{
 398        const struct msm_pingroup *g;
 399        struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
 400        unsigned long flags;
 401        u32 val;
 402
 403        g = &pctrl->soc->groups[offset];
 404
 405        spin_lock_irqsave(&pctrl->lock, flags);
 406
 407        val = readl(pctrl->regs + g->io_reg);
 408        if (value)
 409                val |= BIT(g->out_bit);
 410        else
 411                val &= ~BIT(g->out_bit);
 412        writel(val, pctrl->regs + g->io_reg);
 413
 414        val = readl(pctrl->regs + g->ctl_reg);
 415        val |= BIT(g->oe_bit);
 416        writel(val, pctrl->regs + g->ctl_reg);
 417
 418        spin_unlock_irqrestore(&pctrl->lock, flags);
 419
 420        return 0;
 421}
 422
 423static int msm_gpio_get(struct gpio_chip *chip, unsigned offset)
 424{
 425        const struct msm_pingroup *g;
 426        struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
 427        u32 val;
 428
 429        g = &pctrl->soc->groups[offset];
 430
 431        val = readl(pctrl->regs + g->io_reg);
 432        return !!(val & BIT(g->in_bit));
 433}
 434
 435static void msm_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
 436{
 437        const struct msm_pingroup *g;
 438        struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
 439        unsigned long flags;
 440        u32 val;
 441
 442        g = &pctrl->soc->groups[offset];
 443
 444        spin_lock_irqsave(&pctrl->lock, flags);
 445
 446        val = readl(pctrl->regs + g->io_reg);
 447        if (value)
 448                val |= BIT(g->out_bit);
 449        else
 450                val &= ~BIT(g->out_bit);
 451        writel(val, pctrl->regs + g->io_reg);
 452
 453        spin_unlock_irqrestore(&pctrl->lock, flags);
 454}
 455
 456#ifdef CONFIG_DEBUG_FS
 457#include <linux/seq_file.h>
 458
 459static void msm_gpio_dbg_show_one(struct seq_file *s,
 460                                  struct pinctrl_dev *pctldev,
 461                                  struct gpio_chip *chip,
 462                                  unsigned offset,
 463                                  unsigned gpio)
 464{
 465        const struct msm_pingroup *g;
 466        struct msm_pinctrl *pctrl = gpiochip_get_data(chip);
 467        unsigned func;
 468        int is_out;
 469        int drive;
 470        int pull;
 471        u32 ctl_reg;
 472
 473        static const char * const pulls[] = {
 474                "no pull",
 475                "pull down",
 476                "keeper",
 477                "pull up"
 478        };
 479
 480        g = &pctrl->soc->groups[offset];
 481        ctl_reg = readl(pctrl->regs + g->ctl_reg);
 482
 483        is_out = !!(ctl_reg & BIT(g->oe_bit));
 484        func = (ctl_reg >> g->mux_bit) & 7;
 485        drive = (ctl_reg >> g->drv_bit) & 7;
 486        pull = (ctl_reg >> g->pull_bit) & 3;
 487
 488        seq_printf(s, " %-8s: %-3s %d", g->name, is_out ? "out" : "in", func);
 489        seq_printf(s, " %dmA", msm_regval_to_drive(drive));
 490        seq_printf(s, " %s", pulls[pull]);
 491}
 492
 493static void msm_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
 494{
 495        unsigned gpio = chip->base;
 496        unsigned i;
 497
 498        for (i = 0; i < chip->ngpio; i++, gpio++) {
 499                msm_gpio_dbg_show_one(s, NULL, chip, i, gpio);
 500                seq_puts(s, "\n");
 501        }
 502}
 503
 504#else
 505#define msm_gpio_dbg_show NULL
 506#endif
 507
 508static struct gpio_chip msm_gpio_template = {
 509        .direction_input  = msm_gpio_direction_input,
 510        .direction_output = msm_gpio_direction_output,
 511        .get              = msm_gpio_get,
 512        .set              = msm_gpio_set,
 513        .request          = gpiochip_generic_request,
 514        .free             = gpiochip_generic_free,
 515        .dbg_show         = msm_gpio_dbg_show,
 516};
 517
 518/* For dual-edge interrupts in software, since some hardware has no
 519 * such support:
 520 *
 521 * At appropriate moments, this function may be called to flip the polarity
 522 * settings of both-edge irq lines to try and catch the next edge.
 523 *
 524 * The attempt is considered successful if:
 525 * - the status bit goes high, indicating that an edge was caught, or
 526 * - the input value of the gpio doesn't change during the attempt.
 527 * If the value changes twice during the process, that would cause the first
 528 * test to fail but would force the second, as two opposite
 529 * transitions would cause a detection no matter the polarity setting.
 530 *
 531 * The do-loop tries to sledge-hammer closed the timing hole between
 532 * the initial value-read and the polarity-write - if the line value changes
 533 * during that window, an interrupt is lost, the new polarity setting is
 534 * incorrect, and the first success test will fail, causing a retry.
 535 *
 536 * Algorithm comes from Google's msmgpio driver.
 537 */
 538static void msm_gpio_update_dual_edge_pos(struct msm_pinctrl *pctrl,
 539                                          const struct msm_pingroup *g,
 540                                          struct irq_data *d)
 541{
 542        int loop_limit = 100;
 543        unsigned val, val2, intstat;
 544        unsigned pol;
 545
 546        do {
 547                val = readl(pctrl->regs + g->io_reg) & BIT(g->in_bit);
 548
 549                pol = readl(pctrl->regs + g->intr_cfg_reg);
 550                pol ^= BIT(g->intr_polarity_bit);
 551                writel(pol, pctrl->regs + g->intr_cfg_reg);
 552
 553                val2 = readl(pctrl->regs + g->io_reg) & BIT(g->in_bit);
 554                intstat = readl(pctrl->regs + g->intr_status_reg);
 555                if (intstat || (val == val2))
 556                        return;
 557        } while (loop_limit-- > 0);
 558        dev_err(pctrl->dev, "dual-edge irq failed to stabilize, %#08x != %#08x\n",
 559                val, val2);
 560}
 561
 562static void msm_gpio_irq_mask(struct irq_data *d)
 563{
 564        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
 565        struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
 566        const struct msm_pingroup *g;
 567        unsigned long flags;
 568        u32 val;
 569
 570        g = &pctrl->soc->groups[d->hwirq];
 571
 572        spin_lock_irqsave(&pctrl->lock, flags);
 573
 574        val = readl(pctrl->regs + g->intr_cfg_reg);
 575        val &= ~BIT(g->intr_enable_bit);
 576        writel(val, pctrl->regs + g->intr_cfg_reg);
 577
 578        clear_bit(d->hwirq, pctrl->enabled_irqs);
 579
 580        spin_unlock_irqrestore(&pctrl->lock, flags);
 581}
 582
 583static void msm_gpio_irq_unmask(struct irq_data *d)
 584{
 585        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
 586        struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
 587        const struct msm_pingroup *g;
 588        unsigned long flags;
 589        u32 val;
 590
 591        g = &pctrl->soc->groups[d->hwirq];
 592
 593        spin_lock_irqsave(&pctrl->lock, flags);
 594
 595        val = readl(pctrl->regs + g->intr_status_reg);
 596        val &= ~BIT(g->intr_status_bit);
 597        writel(val, pctrl->regs + g->intr_status_reg);
 598
 599        val = readl(pctrl->regs + g->intr_cfg_reg);
 600        val |= BIT(g->intr_enable_bit);
 601        writel(val, pctrl->regs + g->intr_cfg_reg);
 602
 603        set_bit(d->hwirq, pctrl->enabled_irqs);
 604
 605        spin_unlock_irqrestore(&pctrl->lock, flags);
 606}
 607
 608static void msm_gpio_irq_ack(struct irq_data *d)
 609{
 610        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
 611        struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
 612        const struct msm_pingroup *g;
 613        unsigned long flags;
 614        u32 val;
 615
 616        g = &pctrl->soc->groups[d->hwirq];
 617
 618        spin_lock_irqsave(&pctrl->lock, flags);
 619
 620        val = readl(pctrl->regs + g->intr_status_reg);
 621        if (g->intr_ack_high)
 622                val |= BIT(g->intr_status_bit);
 623        else
 624                val &= ~BIT(g->intr_status_bit);
 625        writel(val, pctrl->regs + g->intr_status_reg);
 626
 627        if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
 628                msm_gpio_update_dual_edge_pos(pctrl, g, d);
 629
 630        spin_unlock_irqrestore(&pctrl->lock, flags);
 631}
 632
 633static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)
 634{
 635        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
 636        struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
 637        const struct msm_pingroup *g;
 638        unsigned long flags;
 639        u32 val;
 640
 641        g = &pctrl->soc->groups[d->hwirq];
 642
 643        spin_lock_irqsave(&pctrl->lock, flags);
 644
 645        /*
 646         * For hw without possibility of detecting both edges
 647         */
 648        if (g->intr_detection_width == 1 && type == IRQ_TYPE_EDGE_BOTH)
 649                set_bit(d->hwirq, pctrl->dual_edge_irqs);
 650        else
 651                clear_bit(d->hwirq, pctrl->dual_edge_irqs);
 652
 653        /* Route interrupts to application cpu */
 654        val = readl(pctrl->regs + g->intr_target_reg);
 655        val &= ~(7 << g->intr_target_bit);
 656        val |= g->intr_target_kpss_val << g->intr_target_bit;
 657        writel(val, pctrl->regs + g->intr_target_reg);
 658
 659        /* Update configuration for gpio.
 660         * RAW_STATUS_EN is left on for all gpio irqs. Due to the
 661         * internal circuitry of TLMM, toggling the RAW_STATUS
 662         * could cause the INTR_STATUS to be set for EDGE interrupts.
 663         */
 664        val = readl(pctrl->regs + g->intr_cfg_reg);
 665        val |= BIT(g->intr_raw_status_bit);
 666        if (g->intr_detection_width == 2) {
 667                val &= ~(3 << g->intr_detection_bit);
 668                val &= ~(1 << g->intr_polarity_bit);
 669                switch (type) {
 670                case IRQ_TYPE_EDGE_RISING:
 671                        val |= 1 << g->intr_detection_bit;
 672                        val |= BIT(g->intr_polarity_bit);
 673                        break;
 674                case IRQ_TYPE_EDGE_FALLING:
 675                        val |= 2 << g->intr_detection_bit;
 676                        val |= BIT(g->intr_polarity_bit);
 677                        break;
 678                case IRQ_TYPE_EDGE_BOTH:
 679                        val |= 3 << g->intr_detection_bit;
 680                        val |= BIT(g->intr_polarity_bit);
 681                        break;
 682                case IRQ_TYPE_LEVEL_LOW:
 683                        break;
 684                case IRQ_TYPE_LEVEL_HIGH:
 685                        val |= BIT(g->intr_polarity_bit);
 686                        break;
 687                }
 688        } else if (g->intr_detection_width == 1) {
 689                val &= ~(1 << g->intr_detection_bit);
 690                val &= ~(1 << g->intr_polarity_bit);
 691                switch (type) {
 692                case IRQ_TYPE_EDGE_RISING:
 693                        val |= BIT(g->intr_detection_bit);
 694                        val |= BIT(g->intr_polarity_bit);
 695                        break;
 696                case IRQ_TYPE_EDGE_FALLING:
 697                        val |= BIT(g->intr_detection_bit);
 698                        break;
 699                case IRQ_TYPE_EDGE_BOTH:
 700                        val |= BIT(g->intr_detection_bit);
 701                        val |= BIT(g->intr_polarity_bit);
 702                        break;
 703                case IRQ_TYPE_LEVEL_LOW:
 704                        break;
 705                case IRQ_TYPE_LEVEL_HIGH:
 706                        val |= BIT(g->intr_polarity_bit);
 707                        break;
 708                }
 709        } else {
 710                BUG();
 711        }
 712        writel(val, pctrl->regs + g->intr_cfg_reg);
 713
 714        if (test_bit(d->hwirq, pctrl->dual_edge_irqs))
 715                msm_gpio_update_dual_edge_pos(pctrl, g, d);
 716
 717        spin_unlock_irqrestore(&pctrl->lock, flags);
 718
 719        if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
 720                irq_set_handler_locked(d, handle_level_irq);
 721        else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
 722                irq_set_handler_locked(d, handle_edge_irq);
 723
 724        return 0;
 725}
 726
 727static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on)
 728{
 729        struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
 730        struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
 731        unsigned long flags;
 732
 733        spin_lock_irqsave(&pctrl->lock, flags);
 734
 735        irq_set_irq_wake(pctrl->irq, on);
 736
 737        spin_unlock_irqrestore(&pctrl->lock, flags);
 738
 739        return 0;
 740}
 741
 742static struct irq_chip msm_gpio_irq_chip = {
 743        .name           = "msmgpio",
 744        .irq_mask       = msm_gpio_irq_mask,
 745        .irq_unmask     = msm_gpio_irq_unmask,
 746        .irq_ack        = msm_gpio_irq_ack,
 747        .irq_set_type   = msm_gpio_irq_set_type,
 748        .irq_set_wake   = msm_gpio_irq_set_wake,
 749};
 750
 751static void msm_gpio_irq_handler(struct irq_desc *desc)
 752{
 753        struct gpio_chip *gc = irq_desc_get_handler_data(desc);
 754        const struct msm_pingroup *g;
 755        struct msm_pinctrl *pctrl = gpiochip_get_data(gc);
 756        struct irq_chip *chip = irq_desc_get_chip(desc);
 757        int irq_pin;
 758        int handled = 0;
 759        u32 val;
 760        int i;
 761
 762        chained_irq_enter(chip, desc);
 763
 764        /*
 765         * Each pin has it's own IRQ status register, so use
 766         * enabled_irq bitmap to limit the number of reads.
 767         */
 768        for_each_set_bit(i, pctrl->enabled_irqs, pctrl->chip.ngpio) {
 769                g = &pctrl->soc->groups[i];
 770                val = readl(pctrl->regs + g->intr_status_reg);
 771                if (val & BIT(g->intr_status_bit)) {
 772                        irq_pin = irq_find_mapping(gc->irqdomain, i);
 773                        generic_handle_irq(irq_pin);
 774                        handled++;
 775                }
 776        }
 777
 778        /* No interrupts were flagged */
 779        if (handled == 0)
 780                handle_bad_irq(desc);
 781
 782        chained_irq_exit(chip, desc);
 783}
 784
 785static int msm_gpio_init(struct msm_pinctrl *pctrl)
 786{
 787        struct gpio_chip *chip;
 788        int ret;
 789        unsigned ngpio = pctrl->soc->ngpios;
 790
 791        if (WARN_ON(ngpio > MAX_NR_GPIO))
 792                return -EINVAL;
 793
 794        chip = &pctrl->chip;
 795        chip->base = 0;
 796        chip->ngpio = ngpio;
 797        chip->label = dev_name(pctrl->dev);
 798        chip->parent = pctrl->dev;
 799        chip->owner = THIS_MODULE;
 800        chip->of_node = pctrl->dev->of_node;
 801
 802        ret = gpiochip_add_data(&pctrl->chip, pctrl);
 803        if (ret) {
 804                dev_err(pctrl->dev, "Failed register gpiochip\n");
 805                return ret;
 806        }
 807
 808        ret = gpiochip_add_pin_range(&pctrl->chip, dev_name(pctrl->dev), 0, 0, chip->ngpio);
 809        if (ret) {
 810                dev_err(pctrl->dev, "Failed to add pin range\n");
 811                gpiochip_remove(&pctrl->chip);
 812                return ret;
 813        }
 814
 815        ret = gpiochip_irqchip_add(chip,
 816                                   &msm_gpio_irq_chip,
 817                                   0,
 818                                   handle_edge_irq,
 819                                   IRQ_TYPE_NONE);
 820        if (ret) {
 821                dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n");
 822                gpiochip_remove(&pctrl->chip);
 823                return -ENOSYS;
 824        }
 825
 826        gpiochip_set_chained_irqchip(chip, &msm_gpio_irq_chip, pctrl->irq,
 827                                     msm_gpio_irq_handler);
 828
 829        return 0;
 830}
 831
 832static int msm_ps_hold_restart(struct notifier_block *nb, unsigned long action,
 833                               void *data)
 834{
 835        struct msm_pinctrl *pctrl = container_of(nb, struct msm_pinctrl, restart_nb);
 836
 837        writel(0, pctrl->regs + PS_HOLD_OFFSET);
 838        mdelay(1000);
 839        return NOTIFY_DONE;
 840}
 841
 842static struct msm_pinctrl *poweroff_pctrl;
 843
 844static void msm_ps_hold_poweroff(void)
 845{
 846        msm_ps_hold_restart(&poweroff_pctrl->restart_nb, 0, NULL);
 847}
 848
 849static void msm_pinctrl_setup_pm_reset(struct msm_pinctrl *pctrl)
 850{
 851        int i;
 852        const struct msm_function *func = pctrl->soc->functions;
 853
 854        for (i = 0; i < pctrl->soc->nfunctions; i++)
 855                if (!strcmp(func[i].name, "ps_hold")) {
 856                        pctrl->restart_nb.notifier_call = msm_ps_hold_restart;
 857                        pctrl->restart_nb.priority = 128;
 858                        if (register_restart_handler(&pctrl->restart_nb))
 859                                dev_err(pctrl->dev,
 860                                        "failed to setup restart handler.\n");
 861                        poweroff_pctrl = pctrl;
 862                        pm_power_off = msm_ps_hold_poweroff;
 863                        break;
 864                }
 865}
 866
 867int msm_pinctrl_probe(struct platform_device *pdev,
 868                      const struct msm_pinctrl_soc_data *soc_data)
 869{
 870        struct msm_pinctrl *pctrl;
 871        struct resource *res;
 872        int ret;
 873
 874        pctrl = devm_kzalloc(&pdev->dev, sizeof(*pctrl), GFP_KERNEL);
 875        if (!pctrl) {
 876                dev_err(&pdev->dev, "Can't allocate msm_pinctrl\n");
 877                return -ENOMEM;
 878        }
 879        pctrl->dev = &pdev->dev;
 880        pctrl->soc = soc_data;
 881        pctrl->chip = msm_gpio_template;
 882
 883        spin_lock_init(&pctrl->lock);
 884
 885        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 886        pctrl->regs = devm_ioremap_resource(&pdev->dev, res);
 887        if (IS_ERR(pctrl->regs))
 888                return PTR_ERR(pctrl->regs);
 889
 890        msm_pinctrl_setup_pm_reset(pctrl);
 891
 892        pctrl->irq = platform_get_irq(pdev, 0);
 893        if (pctrl->irq < 0) {
 894                dev_err(&pdev->dev, "No interrupt defined for msmgpio\n");
 895                return pctrl->irq;
 896        }
 897
 898        msm_pinctrl_desc.name = dev_name(&pdev->dev);
 899        msm_pinctrl_desc.pins = pctrl->soc->pins;
 900        msm_pinctrl_desc.npins = pctrl->soc->npins;
 901        pctrl->pctrl = devm_pinctrl_register(&pdev->dev, &msm_pinctrl_desc,
 902                                             pctrl);
 903        if (IS_ERR(pctrl->pctrl)) {
 904                dev_err(&pdev->dev, "Couldn't register pinctrl driver\n");
 905                return PTR_ERR(pctrl->pctrl);
 906        }
 907
 908        ret = msm_gpio_init(pctrl);
 909        if (ret)
 910                return ret;
 911
 912        platform_set_drvdata(pdev, pctrl);
 913
 914        dev_dbg(&pdev->dev, "Probed Qualcomm pinctrl driver\n");
 915
 916        return 0;
 917}
 918EXPORT_SYMBOL(msm_pinctrl_probe);
 919
 920int msm_pinctrl_remove(struct platform_device *pdev)
 921{
 922        struct msm_pinctrl *pctrl = platform_get_drvdata(pdev);
 923
 924        gpiochip_remove(&pctrl->chip);
 925
 926        unregister_restart_handler(&pctrl->restart_nb);
 927
 928        return 0;
 929}
 930EXPORT_SYMBOL(msm_pinctrl_remove);
 931
 932