aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mfd/tc6393xb.c
diff options
context:
space:
mode:
authorDmitry Baryshkov <dbaryshkov@gmail.com>2008-09-24 17:46:10 -0400
committerSamuel Ortiz <samuel@sortiz.org>2008-10-19 16:54:10 -0400
commitf98a0bd0e4b77b12e49ce01f4c9f04503931c291 (patch)
tree6197077b24c880eb79d7d2864b60372c358df1b0 /drivers/mfd/tc6393xb.c
parent1c1b6ffce5737d764cc474b9bd6677bb9a344094 (diff)
mfd: do tcb6393xb state restore on resume only if requested
As requested by Ian make state restore only if it's requested by platform data: some platforms do correctly save the state of the chip during suspend/resume, but some (like tosa) incorrectly power off the chip at suspend, so the driver supports restoring some bits of the tc6393xb state (not full, merely enough to support resume on tosa). With this patch this code is disabled by default. Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com> Acked-by: Ian Molton <spyro@f2s.com> Signed-off-by: Samuel Ortiz <sameo@openedhand.com>
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