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 41 struct 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 */ 65 struct 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 */ 80 static 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 89 static 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 98 static 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 */ 108 static 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 127 static 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 160 static 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 177 static 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 197 static 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 241 err1: 242 if (!IS_ERR(plgpio->clk)) 243 clk_disable(plgpio->clk); 244 err0: 245 pinctrl_gpio_free(gpio); 246 return ret; 247 } 248 249 static 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 272 disable_clk: 273 if (!IS_ERR(plgpio->clk)) 274 clk_disable(plgpio->clk); 275 276 pinctrl_gpio_free(gpio); 277 } 278 279 /* PLGPIO IRQ */ 280 static 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 299 static 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 318 static 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 352 static 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 359 static 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 */ 416 static 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 434 static 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 444 static 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 511 end: 512 return ret; 513 } 514 static 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 598 unprepare_clk: 599 if (!IS_ERR(plgpio->clk)) 600 clk_unprepare(plgpio->clk); 601 602 return ret; 603 } 604 605 #ifdef CONFIG_PM_SLEEP 606 static 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 645 static 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 690 static SIMPLE_DEV_PM_OPS(plgpio_dev_pm_ops, plgpio_suspend, plgpio_resume); 691 692 static const struct of_device_id plgpio_of_match[] = { 693 { .compatible = "st,spear-plgpio" }, 694 {} 695 }; 696 697 static 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 706 static int __init plgpio_init(void) 707 { 708 return platform_driver_register(&plgpio_driver); 709 } 710 subsys_initcall(plgpio_init); 711