aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/video/sh_mobile_meram.c
diff options
context:
space:
mode:
authorLaurent Pinchart <laurent.pinchart@ideasonboard.com>2011-09-19 05:40:31 -0400
committerLaurent Pinchart <laurent.pinchart@ideasonboard.com>2012-03-12 17:41:07 -0400
commite1d1144eb92e69394958e59ff2a0fd22d58094d4 (patch)
treeecd8b64099c6e1f8b375d74db976a819f0a1543a /drivers/video/sh_mobile_meram.c
parente71504d579945932e283b7d4ea07b4942248bc20 (diff)
fbdev: sh_mobile_meram: Request memory regions for memory resources
Make sure the registers and MERAM spaces are reserved before using them. Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Diffstat (limited to 'drivers/video/sh_mobile_meram.c')
-rw-r--r--drivers/video/sh_mobile_meram.c53
1 files changed, 37 insertions, 16 deletions
diff --git a/drivers/video/sh_mobile_meram.c b/drivers/video/sh_mobile_meram.c
index f45d83ecfd21..dbf5c43852bb 100644
--- a/drivers/video/sh_mobile_meram.c
+++ b/drivers/video/sh_mobile_meram.c
@@ -596,13 +596,12 @@ static struct sh_mobile_meram_ops sh_mobile_meram_ops = {
596 * initialize MERAM 596 * initialize MERAM
597 */ 597 */
598 598
599static int sh_mobile_meram_remove(struct platform_device *pdev);
600
601static int __devinit sh_mobile_meram_probe(struct platform_device *pdev) 599static int __devinit sh_mobile_meram_probe(struct platform_device *pdev)
602{ 600{
603 struct sh_mobile_meram_priv *priv; 601 struct sh_mobile_meram_priv *priv;
604 struct sh_mobile_meram_info *pdata = pdev->dev.platform_data; 602 struct sh_mobile_meram_info *pdata = pdev->dev.platform_data;
605 struct resource *res; 603 struct resource *regs;
604 struct resource *meram;
606 int error; 605 int error;
607 606
608 if (!pdata) { 607 if (!pdata) {
@@ -610,8 +609,9 @@ static int __devinit sh_mobile_meram_probe(struct platform_device *pdev)
610 return -EINVAL; 609 return -EINVAL;
611 } 610 }
612 611
613 res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 612 regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
614 if (!res) { 613 meram = platform_get_resource(pdev, IORESOURCE_MEM, 1);
614 if (regs == NULL || meram == NULL) {
615 dev_err(&pdev->dev, "cannot get platform resources\n"); 615 dev_err(&pdev->dev, "cannot get platform resources\n");
616 return -ENOENT; 616 return -ENOENT;
617 } 617 }
@@ -622,32 +622,50 @@ static int __devinit sh_mobile_meram_probe(struct platform_device *pdev)
622 return -ENOMEM; 622 return -ENOMEM;
623 } 623 }
624 624
625 platform_set_drvdata(pdev, priv);
626
627 /* initialize private data */ 625 /* initialize private data */
628 mutex_init(&priv->lock); 626 mutex_init(&priv->lock);
629 priv->base = ioremap_nocache(res->start, resource_size(res)); 627 pdata->ops = &sh_mobile_meram_ops;
628 pdata->priv = priv;
629 pdata->pdev = pdev;
630
631 if (!request_mem_region(regs->start, resource_size(regs), pdev->name)) {
632 dev_err(&pdev->dev, "MERAM registers region already claimed\n");
633 error = -EBUSY;
634 goto err_req_regs;
635 }
636
637 if (!request_mem_region(meram->start, resource_size(meram),
638 pdev->name)) {
639 dev_err(&pdev->dev, "MERAM memory region already claimed\n");
640 error = -EBUSY;
641 goto err_req_meram;
642 }
643
644 priv->base = ioremap_nocache(regs->start, resource_size(regs));
630 if (!priv->base) { 645 if (!priv->base) {
631 dev_err(&pdev->dev, "ioremap failed\n"); 646 dev_err(&pdev->dev, "ioremap failed\n");
632 error = -EFAULT; 647 error = -EFAULT;
633 goto err; 648 goto err_ioremap;
634 } 649 }
635 pdata->ops = &sh_mobile_meram_ops;
636 pdata->priv = priv;
637 pdata->pdev = pdev;
638 650
639 /* initialize ICB addressing mode */ 651 /* initialize ICB addressing mode */
640 if (pdata->addr_mode == SH_MOBILE_MERAM_MODE1) 652 if (pdata->addr_mode == SH_MOBILE_MERAM_MODE1)
641 meram_write_reg(priv->base, MEVCR1, MEVCR1_AMD1); 653 meram_write_reg(priv->base, MEVCR1, MEVCR1_AMD1);
642 654
655 platform_set_drvdata(pdev, priv);
643 pm_runtime_enable(&pdev->dev); 656 pm_runtime_enable(&pdev->dev);
644 657
645 dev_info(&pdev->dev, "sh_mobile_meram initialized."); 658 dev_info(&pdev->dev, "sh_mobile_meram initialized.");
646 659
647 return 0; 660 return 0;
648 661
649err: 662err_ioremap:
650 sh_mobile_meram_remove(pdev); 663 release_mem_region(meram->start, resource_size(meram));
664err_req_meram:
665 release_mem_region(regs->start, resource_size(regs));
666err_req_regs:
667 mutex_destroy(&priv->lock);
668 kfree(priv);
651 669
652 return error; 670 return error;
653} 671}
@@ -656,11 +674,14 @@ err:
656static int sh_mobile_meram_remove(struct platform_device *pdev) 674static int sh_mobile_meram_remove(struct platform_device *pdev)
657{ 675{
658 struct sh_mobile_meram_priv *priv = platform_get_drvdata(pdev); 676 struct sh_mobile_meram_priv *priv = platform_get_drvdata(pdev);
677 struct resource *regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
678 struct resource *meram = platform_get_resource(pdev, IORESOURCE_MEM, 1);
659 679
660 pm_runtime_disable(&pdev->dev); 680 pm_runtime_disable(&pdev->dev);
661 681
662 if (priv->base) 682 iounmap(priv->base);
663 iounmap(priv->base); 683 release_mem_region(meram->start, resource_size(meram));
684 release_mem_region(regs->start, resource_size(regs));
664 685
665 mutex_destroy(&priv->lock); 686 mutex_destroy(&priv->lock);
666 687