aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pinctrl/sirf
diff options
context:
space:
mode:
authorBarry Song <Baohua.Song@csr.com>2013-05-15 23:17:09 -0400
committerLinus Walleij <linus.walleij@linaro.org>2013-06-16 05:56:50 -0400
commitbc8d25a40577a74afd61d7a5782e0f8393c52b43 (patch)
tree68383247aed19d37d49bd61d2830ca282933e10a /drivers/pinctrl/sirf
parent44d5f7bbead9e7fbc8731322d5f595d28ad219e9 (diff)
pinctrl: sirf: save the status in suspend and restore after resuming
this patch saves the status of pinctrl registers and restore them while resuming. this makes all drivers have coherent status for pinmux after suspending and resuming. Signed-off-by: Barry Song <Baohua.Song@csr.com> Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl/sirf')
-rw-r--r--drivers/pinctrl/sirf/pinctrl-sirf.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/drivers/pinctrl/sirf/pinctrl-sirf.c b/drivers/pinctrl/sirf/pinctrl-sirf.c
index b4727db65504..0677e198db60 100644
--- a/drivers/pinctrl/sirf/pinctrl-sirf.c
+++ b/drivers/pinctrl/sirf/pinctrl-sirf.c
@@ -390,11 +390,67 @@ out_no_rsc_remap:
390 return ret; 390 return ret;
391} 391}
392 392
393#ifdef CONFIG_PM_SLEEP
394static int sirfsoc_pinmux_suspend_noirq(struct device *dev)
395{
396 int i, j;
397 struct sirfsoc_pmx *spmx = dev_get_drvdata(dev);
398
399 for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) {
400 for (j = 0; j < SIRFSOC_GPIO_BANK_SIZE; j++) {
401 spmx->gpio_regs[i][j] = readl(spmx->gpio_virtbase +
402 SIRFSOC_GPIO_CTRL(i, j));
403 }
404 spmx->ints_regs[i] = readl(spmx->gpio_virtbase +
405 SIRFSOC_GPIO_INT_STATUS(i));
406 spmx->paden_regs[i] = readl(spmx->gpio_virtbase +
407 SIRFSOC_GPIO_PAD_EN(i));
408 }
409 spmx->dspen_regs = readl(spmx->gpio_virtbase + SIRFSOC_GPIO_DSP_EN0);
410
411 for (i = 0; i < 3; i++)
412 spmx->rsc_regs[i] = readl(spmx->rsc_virtbase + 4 * i);
413
414 return 0;
415}
416
417static int sirfsoc_pinmux_resume_noirq(struct device *dev)
418{
419 int i, j;
420 struct sirfsoc_pmx *spmx = dev_get_drvdata(dev);
421
422 for (i = 0; i < SIRFSOC_GPIO_NO_OF_BANKS; i++) {
423 for (j = 0; j < SIRFSOC_GPIO_BANK_SIZE; j++) {
424 writel(spmx->gpio_regs[i][j], spmx->gpio_virtbase +
425 SIRFSOC_GPIO_CTRL(i, j));
426 }
427 writel(spmx->ints_regs[i], spmx->gpio_virtbase +
428 SIRFSOC_GPIO_INT_STATUS(i));
429 writel(spmx->paden_regs[i], spmx->gpio_virtbase +
430 SIRFSOC_GPIO_PAD_EN(i));
431 }
432 writel(spmx->dspen_regs, spmx->gpio_virtbase + SIRFSOC_GPIO_DSP_EN0);
433
434 for (i = 0; i < 3; i++)
435 writel(spmx->rsc_regs[i], spmx->rsc_virtbase + 4 * i);
436
437 return 0;
438}
439
440static const struct dev_pm_ops sirfsoc_pinmux_pm_ops = {
441 .suspend_noirq = sirfsoc_pinmux_suspend_noirq,
442 .resume_noirq = sirfsoc_pinmux_resume_noirq,
443};
444#endif
445
393static struct platform_driver sirfsoc_pinmux_driver = { 446static struct platform_driver sirfsoc_pinmux_driver = {
394 .driver = { 447 .driver = {
395 .name = DRIVER_NAME, 448 .name = DRIVER_NAME,
396 .owner = THIS_MODULE, 449 .owner = THIS_MODULE,
397 .of_match_table = pinmux_ids, 450 .of_match_table = pinmux_ids,
451#ifdef CONFIG_PM_SLEEP
452 .pm = &sirfsoc_pinmux_pm_ops,
453#endif
398 }, 454 },
399 .probe = sirfsoc_pinmux_probe, 455 .probe = sirfsoc_pinmux_probe,
400}; 456};