diff options
author | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2011-09-19 05:40:31 -0400 |
---|---|---|
committer | Laurent Pinchart <laurent.pinchart@ideasonboard.com> | 2012-03-12 17:41:07 -0400 |
commit | e1d1144eb92e69394958e59ff2a0fd22d58094d4 (patch) | |
tree | ecd8b64099c6e1f8b375d74db976a819f0a1543a /drivers/video/sh_mobile_meram.c | |
parent | e71504d579945932e283b7d4ea07b4942248bc20 (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.c | 53 |
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 | ||
599 | static int sh_mobile_meram_remove(struct platform_device *pdev); | ||
600 | |||
601 | static int __devinit sh_mobile_meram_probe(struct platform_device *pdev) | 599 | static 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 | ||
649 | err: | 662 | err_ioremap: |
650 | sh_mobile_meram_remove(pdev); | 663 | release_mem_region(meram->start, resource_size(meram)); |
664 | err_req_meram: | ||
665 | release_mem_region(regs->start, resource_size(regs)); | ||
666 | err_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: | |||
656 | static int sh_mobile_meram_remove(struct platform_device *pdev) | 674 | static 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 | ||