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