linux/drivers/pinctrl/spear/pinctrl-plgpio.c
<<
>>
Prefs
   1/*
   2 * SPEAr platform PLGPIO driver
   3 *
   4 * Copyright (C) 2012 ST Microelectronics
   5 * Viresh Kumar <viresh.kumar@linaro.org>
   6 *
   7 * This file is licensed under the terms of the GNU General Public
   8 * License version 2. This program is licensed "as is" without any
   9 * warranty of any kind, whether express or implied.
  10 */
  11
  12#include <linux/clk.h>
  13#include <linux/err.h>
  14#include <linux/gpio.h>
  15#include <linux/io.h>
  16#include <linux/irq.h>
  17#include <linux/irqdomain.h>
  18#include <linux/irqchip/chained_irq.h>
  19#include <linux/module.h>
  20#include <linux/pinctrl/consumer.h>
  21#include <linux/platform_device.h>
  22#include <linux/pm.h>
  23#include <linux/spinlock.h>
  24
  25#define MAX_GPIO_PER_REG                32
  26#define PIN_OFFSET(pin)                 (pin % MAX_GPIO_PER_REG)
  27#define REG_OFFSET(base, reg, pin)      (base + reg + (pin / MAX_GPIO_PER_REG) \
  28                                                        * sizeof(int *))
  29
  30/*
  31 * plgpio pins in all machines are not one to one mapped, bitwise with registers
  32 * bits. These set of macros define register masks for which below functions
  33 * (pin_to_offset and offset_to_pin) are required to be called.
  34 */
  35#define PTO_ENB_REG             0x001
  36#define PTO_WDATA_REG           0x002
  37#define PTO_DIR_REG             0x004
  38#define PTO_IE_REG              0x008
  39#define PTO_RDATA_REG           0x010
  40#define PTO_MIS_REG             0x020
  41
  42struct plgpio_regs {
  43        u32 enb;                /* enable register */
  44        u32 wdata;              /* write data register */
  45        u32 dir;                /* direction set register */
  46        u32 rdata;              /* read data register */
  47        u32 ie;                 /* interrupt enable register */
  48        u32 mis;                /* mask interrupt status register */
  49        u32 eit;                /* edge interrupt type */
  50};
  51
  52/*
  53 * struct plgpio: plgpio driver specific structure
  54 *
  55 * lock: lock for guarding gpio registers
  56 * base: base address of plgpio block
  57 * irq_base: irq number of plgpio0
  58 * chip: gpio framework specific chip information structure
  59 * p2o: function ptr for pin to offset conversion. This is required only for
  60 *      machines where mapping b/w pin and offset is not 1-to-1.
  61 * o2p: function ptr for offset to pin conversion. This is required only for
  62 *      machines where mapping b/w pin and offset is not 1-to-1.
  63 * p2o_regs: mask of registers for which p2o and o2p are applicable
  64 * regs: register offsets
  65 * csave_regs: context save registers for standby/sleep/hibernate cases
  66 */
  67struct plgpio {
  68        spinlock_t              lock;
  69        void __iomem            *base;
  70        struct clk              *clk;
  71        unsigned                irq_base;
  72        struct irq_domain       *irq_domain;
  73        struct gpio_chip        chip;
  74        int                     (*p2o)(int pin);        /* pin_to_offset */
  75        int                     (*o2p)(int offset);     /* offset_to_pin */
  76        u32                     p2o_regs;
  77        struct plgpio_regs      regs;
  78#ifdef CONFIG_PM_SLEEP
  79        struct plgpio_regs      *csave_regs;
  80#endif
  81};
  82
  83/* register manipulation inline functions */
  84static inline u32 is_plgpio_set(void __iomem *base, u32 pin, u32 reg)
  85{
  86        u32 offset = PIN_OFFSET(pin);
  87        void __iomem *reg_off = REG_OFFSET(base, reg, pin);
  88        u32 val = readl_relaxed(reg_off);
  89
  90        return !!(val & (1 << offset));
  91}
  92
  93static inline void plgpio_reg_set(void __iomem *base, u32 pin, u32 reg)
  94{
  95        u32 offset = PIN_OFFSET(pin);
  96        void __iomem *reg_off = REG_OFFSET(base, reg, pin);
  97        u32 val = readl_relaxed(reg_off);
  98
  99        writel_relaxed(val | (1 << offset), reg_off);
 100}
 101
 102static inline void plgpio_reg_reset(void __iomem *base, u32 pin, u32 reg)
 103{
 104        u32 offset = PIN_OFFSET(pin);
 105        void __iomem *reg_off = REG_OFFSET(base, reg, pin);
 106        u32 val = readl_relaxed(reg_off);
 107
 108        writel_relaxed(val & ~(1 << offset), reg_off);
 109}
 110
 111/* gpio framework specific routines */
 112static int plgpio_direction_input(struct gpio_chip *chip, unsigned offset)
 113{
 114        struct plgpio *plgpio = container_of(chip, struct plgpio, chip);
 115        unsigned long flags;
 116
 117        /* get correct offset for "offset" pin */
 118        if (plgpio->p2o && (plgpio->p2o_regs & PTO_DIR_REG)) {
 119                offset = plgpio->p2o(offset);
 120                if (offset == -1)
 121                        return -EINVAL;
 122        }
 123
 124        spin_lock_irqsave(&plgpio->lock, flags);
 125        plgpio_reg_set(plgpio->base, offset, plgpio->regs.dir);
 126        spin_unlock_irqrestore(&plgpio->lock, flags);
 127
 128        return 0;
 129}
 130
 131static int plgpio_direction_output(struct gpio_chip *chip, unsigned offset,
 132                int value)
 133{
 134        struct plgpio *plgpio = container_of(chip, struct plgpio, chip);
 135        unsigned long flags;
 136        unsigned dir_offset = offset, wdata_offset = offset, tmp;
 137
 138        /* get correct offset for "offset" pin */
 139        if (plgpio->p2o && (plgpio->p2o_regs & (PTO_DIR_REG | PTO_WDATA_REG))) {
 140                tmp = plgpio->p2o(offset);
 141                if (tmp == -1)
 142                        return -EINVAL;
 143
 144                if (plgpio->p2o_regs & PTO_DIR_REG)
 145                        dir_offset = tmp;
 146                if (plgpio->p2o_regs & PTO_WDATA_REG)
 147                        wdata_offset = tmp;
 148        }
 149
 150        spin_lock_irqsave(&plgpio->lock, flags);
 151        if (value)
 152                plgpio_reg_set(plgpio->base, wdata_offset,
 153                                plgpio->regs.wdata);
 154        else
 155                plgpio_reg_reset(plgpio->base, wdata_offset,
 156                                plgpio->regs.wdata);
 157
 158        plgpio_reg_reset(plgpio->base, dir_offset, plgpio->regs.dir);
 159        spin_unlock_irqrestore(&plgpio->lock, flags);
 160
 161        return 0;
 162}
 163
 164static int plgpio_get_value(struct gpio_chip *chip, unsigned offset)
 165{
 166        struct plgpio *plgpio = container_of(chip, struct plgpio, chip);
 167
 168        if (offset >= chip->ngpio)
 169                return -EINVAL;
 170
 171        /* get correct offset for "offset" pin */
 172        if (plgpio->p2o && (plgpio->p2o_regs & PTO_RDATA_REG)) {
 173                offset = plgpio->p2o(offset);
 174                if (offset == -1)
 175                        return -EINVAL;
 176        }
 177
 178        return is_plgpio_set(plgpio->base, offset, plgpio->regs.rdata);
 179}
 180
 181static void plgpio_set_value(struct gpio_chip *chip, unsigned offset, int value)
 182{
 183        struct plgpio *plgpio = container_of(chip, struct plgpio, chip);
 184
 185        if (offset >= chip->ngpio)
 186                return;
 187
 188        /* get correct offset for "offset" pin */
 189        if (plgpio->p2o && (plgpio->p2o_regs & PTO_WDATA_REG)) {
 190                offset = plgpio->p2o(offset);
 191                if (offset == -1)
 192                        return;
 193        }
 194
 195        if (value)
 196                plgpio_reg_set(plgpio->base, offset, plgpio->regs.wdata);
 197        else
 198                plgpio_reg_reset(plgpio->base, offset, plgpio->regs.wdata);
 199}
 200
 201static int plgpio_request(struct gpio_chip *chip, unsigned offset)
 202{
 203        struct plgpio *plgpio = container_of(chip, struct plgpio, chip);
 204        int gpio = chip->base + offset;
 205        unsigned long flags;
 206        int ret = 0;
 207
 208        if (offset >= chip->ngpio)
 209                return -EINVAL;
 210
 211        ret = pinctrl_request_gpio(gpio);
 212        if (ret)
 213                return ret;
 214
 215        if (!IS_ERR(plgpio->clk)) {
 216                ret = clk_enable(plgpio->clk);
 217                if (ret)
 218                        goto err0;
 219        }
 220
 221        if (plgpio->regs.enb == -1)
 222                return 0;
 223
 224        /*
 225         * put gpio in IN mode before enabling it. This make enabling gpio safe
 226         */
 227        ret = plgpio_direction_input(chip, offset);
 228        if (ret)
 229                goto err1;
 230
 231        /* get correct offset for "offset" pin */
 232        if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) {
 233                offset = plgpio->p2o(offset);
 234                if (offset == -1) {
 235                        ret = -EINVAL;
 236                        goto err1;
 237                }
 238        }
 239
 240        spin_lock_irqsave(&plgpio->lock, flags);
 241        plgpio_reg_set(plgpio->base, offset, plgpio->regs.enb);
 242        spin_unlock_irqrestore(&plgpio->lock, flags);
 243        return 0;
 244
 245err1:
 246        if (!IS_ERR(plgpio->clk))
 247                clk_disable(plgpio->clk);
 248err0:
 249        pinctrl_free_gpio(gpio);
 250        return ret;
 251}
 252
 253static void plgpio_free(struct gpio_chip *chip, unsigned offset)
 254{
 255        struct plgpio *plgpio = container_of(chip, struct plgpio, chip);
 256        int gpio = chip->base + offset;
 257        unsigned long flags;
 258
 259        if (offset >= chip->ngpio)
 260                return;
 261
 262        if (plgpio->regs.enb == -1)
 263                goto disable_clk;
 264
 265        /* get correct offset for "offset" pin */
 266        if (plgpio->p2o && (plgpio->p2o_regs & PTO_ENB_REG)) {
 267                offset = plgpio->p2o(offset);
 268                if (offset == -1)
 269                        return;
 270        }
 271
 272        spin_lock_irqsave(&plgpio->lock, flags);
 273        plgpio_reg_reset(plgpio->base, offset, plgpio->regs.enb);
 274        spin_unlock_irqrestore(&plgpio->lock, flags);
 275
 276disable_clk:
 277        if (!IS_ERR(plgpio->clk))
 278                clk_disable(plgpio->clk);
 279
 280        pinctrl_free_gpio(gpio);
 281}
 282
 283static int plgpio_to_irq(struct gpio_chip *chip, unsigned offset)
 284{
 285        struct plgpio *plgpio = container_of(chip, struct plgpio, chip);
 286
 287        if (IS_ERR_VALUE(plgpio->irq_base))
 288                return -EINVAL;
 289
 290        return irq_find_mapping(plgpio->irq_domain, offset);
 291}
 292
 293/* PLGPIO IRQ */
 294static void plgpio_irq_disable(struct irq_data *d)
 295{
 296        struct plgpio *plgpio = irq_data_get_irq_chip_data(d);
 297        int offset = d->irq - plgpio->irq_base;
 298        unsigned long flags;
 299
 300        /* get correct offset for "offset" pin */
 301        if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) {
 302                offset = plgpio->p2o(offset);
 303                if (offset == -1)
 304                        return;
 305        }
 306
 307        spin_lock_irqsave(&plgpio->lock, flags);
 308        plgpio_reg_set(plgpio->base, offset, plgpio->regs.ie);
 309        spin_unlock_irqrestore(&plgpio->lock, flags);
 310}
 311
 312static void plgpio_irq_enable(struct irq_data *d)
 313{
 314        struct plgpio *plgpio = irq_data_get_irq_chip_data(d);
 315        int offset = d->irq - plgpio->irq_base;
 316        unsigned long flags;
 317
 318        /* get correct offset for "offset" pin */
 319        if (plgpio->p2o && (plgpio->p2o_regs & PTO_IE_REG)) {
 320                offset = plgpio->p2o(offset);
 321                if (offset == -1)
 322                        return;
 323        }
 324
 325        spin_lock_irqsave(&plgpio->lock, flags);
 326        plgpio_reg_reset(plgpio->base, offset, plgpio->regs.ie);
 327        spin_unlock_irqrestore(&plgpio->lock, flags);
 328}
 329
 330static int plgpio_irq_set_type(struct irq_data *d, unsigned trigger)
 331{
 332        struct plgpio *plgpio = irq_data_get_irq_chip_data(d);
 333        int offset = d->irq - plgpio->irq_base;
 334        void __iomem *reg_off;
 335        unsigned int supported_type = 0, val;
 336
 337        if (offset >= plgpio->chip.ngpio)
 338                return -EINVAL;
 339
 340        if (plgpio->regs.eit == -1)
 341                supported_type = IRQ_TYPE_LEVEL_HIGH;
 342        else
 343                supported_type = IRQ_TYPE_EDGE_RISING | IRQ_TYPE_EDGE_FALLING;
 344
 345        if (!(trigger & supported_type))
 346                return -EINVAL;
 347
 348        if (plgpio->regs.eit == -1)
 349                return 0;
 350
 351        reg_off = REG_OFFSET(plgpio->base, plgpio->regs.eit, offset);
 352        val = readl_relaxed(reg_off);
 353
 354        offset = PIN_OFFSET(offset);
 355        if (trigger & IRQ_TYPE_EDGE_RISING)
 356                writel_relaxed(val | (1 << offset), reg_off);
 357        else
 358                writel_relaxed(val & ~(1 << offset), reg_off);
 359
 360        return 0;
 361}
 362
 363static struct irq_chip plgpio_irqchip = {
 364        .name           = "PLGPIO",
 365        .irq_enable     = plgpio_irq_enable,
 366        .irq_disable    = plgpio_irq_disable,
 367        .irq_set_type   = plgpio_irq_set_type,
 368};
 369
 370static void plgpio_irq_handler(unsigned irq, struct irq_desc *desc)
 371{
 372        struct plgpio *plgpio = irq_get_handler_data(irq);
 373        struct irq_chip *irqchip = irq_desc_get_chip(desc);
 374        int regs_count, count, pin, offset, i = 0;
 375        unsigned long pending;
 376
 377        count = plgpio->chip.ngpio;
 378        regs_count = DIV_ROUND_UP(count, MAX_GPIO_PER_REG);
 379
 380        chained_irq_enter(irqchip, desc);
 381        /* check all plgpio MIS registers for a possible interrupt */
 382        for (; i < regs_count; i++) {
 383                pending = readl_relaxed(plgpio->base + plgpio->regs.mis +
 384                                i * sizeof(int *));
 385                if (!pending)
 386                        continue;
 387
 388                /* clear interrupts */
 389                writel_relaxed(~pending, plgpio->base + plgpio->regs.mis +
 390                                i * sizeof(int *));
 391                /*
 392                 * clear extra bits in last register having gpios < MAX/REG
 393                 * ex: Suppose there are max 102 plgpios. then last register
 394                 * must have only (102 - MAX_GPIO_PER_REG * 3) = 6 relevant bits
 395                 * so, we must not take other 28 bits into consideration for
 396                 * checking interrupt. so clear those bits.
 397                 */
 398                count = count - i * MAX_GPIO_PER_REG;
 399                if (count < MAX_GPIO_PER_REG)
 400                        pending &= (1 << count) - 1;
 401
 402                for_each_set_bit(offset, &pending, MAX_GPIO_PER_REG) {
 403                        /* get correct pin for "offset" */
 404                        if (plgpio->o2p && (plgpio->p2o_regs & PTO_MIS_REG)) {
 405                                pin = plgpio->o2p(offset);
 406                                if (pin == -1)
 407                                        continue;
 408                        } else
 409                                pin = offset;
 410
 411                        /* get correct irq line number */
 412                        pin = i * MAX_GPIO_PER_REG + pin;
 413                        generic_handle_irq(plgpio_to_irq(&plgpio->chip, pin));
 414                }
 415        }
 416        chained_irq_exit(irqchip, desc);
 417}
 418
 419/*
 420 * pin to offset and offset to pin converter functions
 421 *
 422 * In spear310 there is inconsistency among bit positions in plgpio regiseters,
 423 * for different plgpio pins. For example: for pin 27, bit offset is 23, pin
 424 * 28-33 are not supported, pin 95 has offset bit 95, bit 100 has offset bit 1
 425 */
 426static int spear310_p2o(int pin)
 427{
 428        int offset = pin;
 429
 430        if (pin <= 27)
 431                offset += 4;
 432        else if (pin <= 33)
 433                offset = -1;
 434        else if (pin <= 97)
 435                offset -= 2;
 436        else if (pin <= 101)
 437                offset = 101 - pin;
 438        else
 439                offset = -1;
 440
 441        return offset;
 442}
 443
 444int spear310_o2p(int offset)
 445{
 446        if (offset <= 3)
 447                return 101 - offset;
 448        else if (offset <= 31)
 449                return offset - 4;
 450        else
 451                return offset + 2;
 452}
 453
 454static int plgpio_probe_dt(struct platform_device *pdev, struct plgpio *plgpio)
 455{
 456        struct device_node *np = pdev->dev.of_node;
 457        int ret = -EINVAL;
 458        u32 val;
 459
 460        if (of_machine_is_compatible("st,spear310")) {
 461                plgpio->p2o = spear310_p2o;
 462                plgpio->o2p = spear310_o2p;
 463                plgpio->p2o_regs = PTO_WDATA_REG | PTO_DIR_REG | PTO_IE_REG |
 464                        PTO_RDATA_REG | PTO_MIS_REG;
 465        }
 466
 467        if (!of_property_read_u32(np, "st-plgpio,ngpio", &val)) {
 468                plgpio->chip.ngpio = val;
 469        } else {
 470                dev_err(&pdev->dev, "DT: Invalid ngpio field\n");
 471                goto end;
 472        }
 473
 474        if (!of_property_read_u32(np, "st-plgpio,enb-reg", &val))
 475                plgpio->regs.enb = val;
 476        else
 477                plgpio->regs.enb = -1;
 478
 479        if (!of_property_read_u32(np, "st-plgpio,wdata-reg", &val)) {
 480                plgpio->regs.wdata = val;
 481        } else {
 482                dev_err(&pdev->dev, "DT: Invalid wdata reg\n");
 483                goto end;
 484        }
 485
 486        if (!of_property_read_u32(np, "st-plgpio,dir-reg", &val)) {
 487                plgpio->regs.dir = val;
 488        } else {
 489                dev_err(&pdev->dev, "DT: Invalid dir reg\n");
 490                goto end;
 491        }
 492
 493        if (!of_property_read_u32(np, "st-plgpio,ie-reg", &val)) {
 494                plgpio->regs.ie = val;
 495        } else {
 496                dev_err(&pdev->dev, "DT: Invalid ie reg\n");
 497                goto end;
 498        }
 499
 500        if (!of_property_read_u32(np, "st-plgpio,rdata-reg", &val)) {
 501                plgpio->regs.rdata = val;
 502        } else {
 503                dev_err(&pdev->dev, "DT: Invalid rdata reg\n");
 504                goto end;
 505        }
 506
 507        if (!of_property_read_u32(np, "st-plgpio,mis-reg", &val)) {
 508                plgpio->regs.mis = val;
 509        } else {
 510                dev_err(&pdev->dev, "DT: Invalid mis reg\n");
 511                goto end;
 512        }
 513
 514        if (!of_property_read_u32(np, "st-plgpio,eit-reg", &val))
 515                plgpio->regs.eit = val;
 516        else
 517                plgpio->regs.eit = -1;
 518
 519        return 0;
 520
 521end:
 522        return ret;
 523}
 524static int plgpio_probe(struct platform_device *pdev)
 525{
 526        struct device_node *np = pdev->dev.of_node;
 527        struct plgpio *plgpio;
 528        struct resource *res;
 529        int ret, irq, i;
 530
 531        res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
 532        if (!res) {
 533                dev_err(&pdev->dev, "invalid IORESOURCE_MEM\n");
 534                return -EBUSY;
 535        }
 536
 537        plgpio = devm_kzalloc(&pdev->dev, sizeof(*plgpio), GFP_KERNEL);
 538        if (!plgpio) {
 539                dev_err(&pdev->dev, "memory allocation fail\n");
 540                return -ENOMEM;
 541        }
 542
 543        plgpio->base = devm_ioremap_resource(&pdev->dev, res);
 544        if (IS_ERR(plgpio->base))
 545                return PTR_ERR(plgpio->base);
 546
 547        ret = plgpio_probe_dt(pdev, plgpio);
 548        if (ret) {
 549                dev_err(&pdev->dev, "DT probe failed\n");
 550                return ret;
 551        }
 552
 553        plgpio->clk = devm_clk_get(&pdev->dev, NULL);
 554        if (IS_ERR(plgpio->clk))
 555                dev_warn(&pdev->dev, "clk_get() failed, work without it\n");
 556
 557#ifdef CONFIG_PM_SLEEP
 558        plgpio->csave_regs = devm_kzalloc(&pdev->dev,
 559                        sizeof(*plgpio->csave_regs) *
 560                        DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG),
 561                        GFP_KERNEL);
 562        if (!plgpio->csave_regs) {
 563                dev_err(&pdev->dev, "csave registers memory allocation fail\n");
 564                return -ENOMEM;
 565        }
 566#endif
 567
 568        platform_set_drvdata(pdev, plgpio);
 569        spin_lock_init(&plgpio->lock);
 570
 571        plgpio->irq_base = -1;
 572        plgpio->chip.base = -1;
 573        plgpio->chip.request = plgpio_request;
 574        plgpio->chip.free = plgpio_free;
 575        plgpio->chip.direction_input = plgpio_direction_input;
 576        plgpio->chip.direction_output = plgpio_direction_output;
 577        plgpio->chip.get = plgpio_get_value;
 578        plgpio->chip.set = plgpio_set_value;
 579        plgpio->chip.to_irq = plgpio_to_irq;
 580        plgpio->chip.label = dev_name(&pdev->dev);
 581        plgpio->chip.dev = &pdev->dev;
 582        plgpio->chip.owner = THIS_MODULE;
 583
 584        if (!IS_ERR(plgpio->clk)) {
 585                ret = clk_prepare(plgpio->clk);
 586                if (ret) {
 587                        dev_err(&pdev->dev, "clk prepare failed\n");
 588                        return ret;
 589                }
 590        }
 591
 592        ret = gpiochip_add(&plgpio->chip);
 593        if (ret) {
 594                dev_err(&pdev->dev, "unable to add gpio chip\n");
 595                goto unprepare_clk;
 596        }
 597
 598        irq = platform_get_irq(pdev, 0);
 599        if (irq < 0) {
 600                dev_info(&pdev->dev, "irqs not supported\n");
 601                return 0;
 602        }
 603
 604        plgpio->irq_base = irq_alloc_descs(-1, 0, plgpio->chip.ngpio, 0);
 605        if (IS_ERR_VALUE(plgpio->irq_base)) {
 606                /* we would not support irq for gpio */
 607                dev_warn(&pdev->dev, "couldn't allocate irq base\n");
 608                return 0;
 609        }
 610
 611        plgpio->irq_domain = irq_domain_add_legacy(np, plgpio->chip.ngpio,
 612                        plgpio->irq_base, 0, &irq_domain_simple_ops, NULL);
 613        if (WARN_ON(!plgpio->irq_domain)) {
 614                dev_err(&pdev->dev, "irq domain init failed\n");
 615                irq_free_descs(plgpio->irq_base, plgpio->chip.ngpio);
 616                ret = -ENXIO;
 617                goto remove_gpiochip;
 618        }
 619
 620        irq_set_chained_handler(irq, plgpio_irq_handler);
 621        for (i = 0; i < plgpio->chip.ngpio; i++) {
 622                irq_set_chip_and_handler(i + plgpio->irq_base, &plgpio_irqchip,
 623                                handle_simple_irq);
 624                set_irq_flags(i + plgpio->irq_base, IRQF_VALID);
 625                irq_set_chip_data(i + plgpio->irq_base, plgpio);
 626        }
 627
 628        irq_set_handler_data(irq, plgpio);
 629        dev_info(&pdev->dev, "PLGPIO registered with IRQs\n");
 630
 631        return 0;
 632
 633remove_gpiochip:
 634        dev_info(&pdev->dev, "Remove gpiochip\n");
 635        if (gpiochip_remove(&plgpio->chip))
 636                dev_err(&pdev->dev, "unable to remove gpiochip\n");
 637unprepare_clk:
 638        if (!IS_ERR(plgpio->clk))
 639                clk_unprepare(plgpio->clk);
 640
 641        return ret;
 642}
 643
 644#ifdef CONFIG_PM_SLEEP
 645static int plgpio_suspend(struct device *dev)
 646{
 647        struct plgpio *plgpio = dev_get_drvdata(dev);
 648        int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG);
 649        void __iomem *off;
 650
 651        for (i = 0; i < reg_count; i++) {
 652                off = plgpio->base + i * sizeof(int *);
 653
 654                if (plgpio->regs.enb != -1)
 655                        plgpio->csave_regs[i].enb =
 656                                readl_relaxed(plgpio->regs.enb + off);
 657                if (plgpio->regs.eit != -1)
 658                        plgpio->csave_regs[i].eit =
 659                                readl_relaxed(plgpio->regs.eit + off);
 660                plgpio->csave_regs[i].wdata = readl_relaxed(plgpio->regs.wdata +
 661                                off);
 662                plgpio->csave_regs[i].dir = readl_relaxed(plgpio->regs.dir +
 663                                off);
 664                plgpio->csave_regs[i].ie = readl_relaxed(plgpio->regs.ie + off);
 665        }
 666
 667        return 0;
 668}
 669
 670/*
 671 * This is used to correct the values in end registers. End registers contain
 672 * extra bits that might be used for other purpose in platform. So, we shouldn't
 673 * overwrite these bits. This macro, reads given register again, preserves other
 674 * bit values (non-plgpio bits), and retain captured value (plgpio bits).
 675 */
 676#define plgpio_prepare_reg(__reg, _off, _mask, _tmp)            \
 677{                                                               \
 678        _tmp = readl_relaxed(plgpio->regs.__reg + _off);                \
 679        _tmp &= ~_mask;                                         \
 680        plgpio->csave_regs[i].__reg =                           \
 681                _tmp | (plgpio->csave_regs[i].__reg & _mask);   \
 682}
 683
 684static int plgpio_resume(struct device *dev)
 685{
 686        struct plgpio *plgpio = dev_get_drvdata(dev);
 687        int i, reg_count = DIV_ROUND_UP(plgpio->chip.ngpio, MAX_GPIO_PER_REG);
 688        void __iomem *off;
 689        u32 mask, tmp;
 690
 691        for (i = 0; i < reg_count; i++) {
 692                off = plgpio->base + i * sizeof(int *);
 693
 694                if (i == reg_count - 1) {
 695                        mask = (1 << (plgpio->chip.ngpio - i *
 696                                                MAX_GPIO_PER_REG)) - 1;
 697
 698                        if (plgpio->regs.enb != -1)
 699                                plgpio_prepare_reg(enb, off, mask, tmp);
 700
 701                        if (plgpio->regs.eit != -1)
 702                                plgpio_prepare_reg(eit, off, mask, tmp);
 703
 704                        plgpio_prepare_reg(wdata, off, mask, tmp);
 705                        plgpio_prepare_reg(dir, off, mask, tmp);
 706                        plgpio_prepare_reg(ie, off, mask, tmp);
 707                }
 708
 709                writel_relaxed(plgpio->csave_regs[i].wdata, plgpio->regs.wdata +
 710                                off);
 711                writel_relaxed(plgpio->csave_regs[i].dir, plgpio->regs.dir +
 712                                off);
 713
 714                if (plgpio->regs.eit != -1)
 715                        writel_relaxed(plgpio->csave_regs[i].eit,
 716                                        plgpio->regs.eit + off);
 717
 718                writel_relaxed(plgpio->csave_regs[i].ie, plgpio->regs.ie + off);
 719
 720                if (plgpio->regs.enb != -1)
 721                        writel_relaxed(plgpio->csave_regs[i].enb,
 722                                        plgpio->regs.enb + off);
 723        }
 724
 725        return 0;
 726}
 727#endif
 728
 729static SIMPLE_DEV_PM_OPS(plgpio_dev_pm_ops, plgpio_suspend, plgpio_resume);
 730
 731static const struct of_device_id plgpio_of_match[] = {
 732        { .compatible = "st,spear-plgpio" },
 733        {}
 734};
 735MODULE_DEVICE_TABLE(of, plgpio_of_match);
 736
 737static struct platform_driver plgpio_driver = {
 738        .probe = plgpio_probe,
 739        .driver = {
 740                .owner = THIS_MODULE,
 741                .name = "spear-plgpio",
 742                .pm = &plgpio_dev_pm_ops,
 743                .of_match_table = of_match_ptr(plgpio_of_match),
 744        },
 745};
 746
 747static int __init plgpio_init(void)
 748{
 749        return platform_driver_register(&plgpio_driver);
 750}
 751subsys_initcall(plgpio_init);
 752
 753MODULE_AUTHOR("Viresh Kumar <viresh.kumar@linaro.org>");
 754MODULE_DESCRIPTION("ST Microlectronics SPEAr PLGPIO driver");
 755MODULE_LICENSE("GPL");
 756