aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/tc6393xb.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mfd/tc6393xb.c')
-rw-r--r--drivers/mfd/tc6393xb.c74
1 files changed, 34 insertions, 40 deletions
diff --git a/drivers/mfd/tc6393xb.c b/drivers/mfd/tc6393xb.c
index 83dc703f3767..c3c64aeeb12a 100644
--- a/drivers/mfd/tc6393xb.c
+++ b/drivers/mfd/tc6393xb.c
@@ -369,41 +369,12 @@ static void tc6393xb_detach_irq(struct platform_device *dev)
369 369
370/*--------------------------------------------------------------------------*/ 370/*--------------------------------------------------------------------------*/
371 371
372static int tc6393xb_hw_init(struct platform_device *dev)
373{
374 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data;
375 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
376 int i;
377
378 iowrite8(tc6393xb->suspend_state.fer, tc6393xb->scr + SCR_FER);
379 iowrite16(tcpd->scr_pll2cr, tc6393xb->scr + SCR_PLL2CR);
380 iowrite16(tc6393xb->suspend_state.ccr, tc6393xb->scr + SCR_CCR);
381 iowrite16(SCR_MCR_RDY_OPENDRAIN | SCR_MCR_RDY_UNK | SCR_MCR_RDY_EN |
382 SCR_MCR_INT_OPENDRAIN | SCR_MCR_INT_UNK | SCR_MCR_INT_EN |
383 BIT(15), tc6393xb->scr + SCR_MCR);
384 iowrite16(tcpd->scr_gper, tc6393xb->scr + SCR_GPER);
385 iowrite8(0, tc6393xb->scr + SCR_IRR);
386 iowrite8(0xbf, tc6393xb->scr + SCR_IMR);
387
388 for (i = 0; i < 3; i++) {
389 iowrite8(tc6393xb->suspend_state.gpo_dsr[i],
390 tc6393xb->scr + SCR_GPO_DSR(i));
391 iowrite8(tc6393xb->suspend_state.gpo_doecr[i],
392 tc6393xb->scr + SCR_GPO_DOECR(i));
393 iowrite8(tc6393xb->suspend_state.gpi_bcr[i],
394 tc6393xb->scr + SCR_GPI_BCR(i));
395 }
396
397 return 0;
398}
399
400static int __devinit tc6393xb_probe(struct platform_device *dev) 372static int __devinit tc6393xb_probe(struct platform_device *dev)
401{ 373{
402 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data; 374 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data;
403 struct tc6393xb *tc6393xb; 375 struct tc6393xb *tc6393xb;
404 struct resource *iomem, *rscr; 376 struct resource *iomem, *rscr;
405 int ret, temp; 377 int ret, temp;
406 int i;
407 378
408 iomem = platform_get_resource(dev, IORESOURCE_MEM, 0); 379 iomem = platform_get_resource(dev, IORESOURCE_MEM, 0);
409 if (!iomem) 380 if (!iomem)
@@ -458,14 +429,16 @@ static int __devinit tc6393xb_probe(struct platform_device *dev)
458 if (ret) 429 if (ret)
459 goto err_enable; 430 goto err_enable;
460 431
461 tc6393xb->suspend_state.fer = 0; 432 iowrite8(0, tc6393xb->scr + SCR_FER);
462 433 iowrite16(tcpd->scr_pll2cr, tc6393xb->scr + SCR_PLL2CR);
463 tc6393xb->suspend_state.ccr = SCR_CCR_UNK1 | 434 iowrite16(SCR_CCR_UNK1 | SCR_CCR_HCLK_48,
464 SCR_CCR_HCLK_48; 435 tc6393xb->scr + SCR_CCR);
465 436 iowrite16(SCR_MCR_RDY_OPENDRAIN | SCR_MCR_RDY_UNK | SCR_MCR_RDY_EN |
466 ret = tc6393xb_hw_init(dev); 437 SCR_MCR_INT_OPENDRAIN | SCR_MCR_INT_UNK | SCR_MCR_INT_EN |
467 if (ret) 438 BIT(15), tc6393xb->scr + SCR_MCR);
468 goto err_hw_init; 439 iowrite16(tcpd->scr_gper, tc6393xb->scr + SCR_GPER);
440 iowrite8(0, tc6393xb->scr + SCR_IRR);
441 iowrite8(0xbf, tc6393xb->scr + SCR_IMR);
469 442
470 printk(KERN_INFO "Toshiba tc6393xb revision %d at 0x%08lx, irq %d\n", 443 printk(KERN_INFO "Toshiba tc6393xb revision %d at 0x%08lx, irq %d\n",
471 tmio_ioread8(tc6393xb->scr + SCR_REVID), 444 tmio_ioread8(tc6393xb->scr + SCR_REVID),
@@ -514,7 +487,6 @@ err_setup:
514err_gpio_add: 487err_gpio_add:
515 if (tc6393xb->gpio.base != -1) 488 if (tc6393xb->gpio.base != -1)
516 temp = gpiochip_remove(&tc6393xb->gpio); 489 temp = gpiochip_remove(&tc6393xb->gpio);
517err_hw_init:
518 tcpd->disable(dev); 490 tcpd->disable(dev);
519err_clk_enable: 491err_clk_enable:
520 clk_disable(tc6393xb->clk); 492 clk_disable(tc6393xb->clk);
@@ -592,15 +564,37 @@ static int tc6393xb_resume(struct platform_device *dev)
592 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data; 564 struct tc6393xb_platform_data *tcpd = dev->dev.platform_data;
593 struct tc6393xb *tc6393xb = platform_get_drvdata(dev); 565 struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
594 int ret; 566 int ret;
567 int i;
595 568
596 clk_enable(tc6393xb->clk); 569 clk_enable(tc6393xb->clk);
597 570
598 ret = tcpd->resume(dev); 571 ret = tcpd->resume(dev);
599
600 if (ret) 572 if (ret)
601 return ret; 573 return ret;
602 574
603 return tc6393xb_hw_init(dev); 575 if (!tcpd->resume_restore)
576 return 0;
577
578 iowrite8(tc6393xb->suspend_state.fer, tc6393xb->scr + SCR_FER);
579 iowrite16(tcpd->scr_pll2cr, tc6393xb->scr + SCR_PLL2CR);
580 iowrite16(tc6393xb->suspend_state.ccr, tc6393xb->scr + SCR_CCR);
581 iowrite16(SCR_MCR_RDY_OPENDRAIN | SCR_MCR_RDY_UNK | SCR_MCR_RDY_EN |
582 SCR_MCR_INT_OPENDRAIN | SCR_MCR_INT_UNK | SCR_MCR_INT_EN |
583 BIT(15), tc6393xb->scr + SCR_MCR);
584 iowrite16(tcpd->scr_gper, tc6393xb->scr + SCR_GPER);
585 iowrite8(0, tc6393xb->scr + SCR_IRR);
586 iowrite8(0xbf, tc6393xb->scr + SCR_IMR);
587
588 for (i = 0; i < 3; i++) {
589 iowrite8(tc6393xb->suspend_state.gpo_dsr[i],
590 tc6393xb->scr + SCR_GPO_DSR(i));
591 iowrite8(tc6393xb->suspend_state.gpo_doecr[i],
592 tc6393xb->scr + SCR_GPO_DOECR(i));
593 iowrite8(tc6393xb->suspend_state.gpi_bcr[i],
594 tc6393xb->scr + SCR_GPI_BCR(i));
595 }
596
597 return 0;
604} 598}
605#else 599#else
606#define tc6393xb_suspend NULL 600#define tc6393xb_suspend NULL