From fe0393d949ec2396b93e9d3667fa2b4796559ffb Mon Sep 17 00:00:00 2001 From: Cai YiWei Date: Thu, 19 Mar 2020 17:10:51 +0800 Subject: [PATCH] media: rockchip: isp and ispp try to ioremap try to ioremap when ioremap resource busy that device reg range include device's iommu reg range. Change-Id: Ie701d0a70f443404f49d658916c0dbb4f6cbe06d Signed-off-by: Cai YiWei --- drivers/media/platform/rockchip/isp/dev.c | 15 ++++++++++++++- drivers/media/platform/rockchip/ispp/dev.c | 15 +++++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/drivers/media/platform/rockchip/isp/dev.c b/drivers/media/platform/rockchip/isp/dev.c index fb9816b83135..27253a83b25f 100644 --- a/drivers/media/platform/rockchip/isp/dev.c +++ b/drivers/media/platform/rockchip/isp/dev.c @@ -34,6 +34,7 @@ #include #include +#include #include #include #include @@ -992,9 +993,21 @@ static int rkisp_plat_probe(struct platform_device *pdev) dev_warn(dev, "Missing rockchip,grf property\n"); res = platform_get_resource(pdev, IORESOURCE_MEM, 0); + if (!res) { + dev_err(dev, "get resource failed\n"); + return -EINVAL; + } isp_dev->base_addr = devm_ioremap_resource(dev, res); - if (IS_ERR(isp_dev->base_addr)) + if (PTR_ERR(isp_dev->base_addr) == -EBUSY) { + resource_size_t offset = res->start; + resource_size_t size = resource_size(res); + + isp_dev->base_addr = devm_ioremap(dev, offset, size); + } + if (IS_ERR(isp_dev->base_addr)) { + dev_err(dev, "ioremap failed\n"); return PTR_ERR(isp_dev->base_addr); + } match_data = match->data; isp_dev->mipi_irq = -1; diff --git a/drivers/media/platform/rockchip/ispp/dev.c b/drivers/media/platform/rockchip/ispp/dev.c index 63e737b6ebd0..124dc024b892 100644 --- a/drivers/media/platform/rockchip/ispp/dev.c +++ b/drivers/media/platform/rockchip/ispp/dev.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -324,9 +325,19 @@ static int rkispp_plat_probe(struct platform_device *pdev) match_data = match->data; res = platform_get_resource(pdev, IORESOURCE_MEM, 0); - ispp_dev->base_addr = devm_ioremap_resource(dev, res); - if (IS_ERR(ispp_dev->base_addr)) { + if (!res) { dev_err(dev, "get resource failed\n"); + return -EINVAL; + } + ispp_dev->base_addr = devm_ioremap_resource(dev, res); + if (PTR_ERR(ispp_dev->base_addr) == -EBUSY) { + resource_size_t offset = res->start; + resource_size_t size = resource_size(res); + + ispp_dev->base_addr = devm_ioremap(dev, offset, size); + } + if (IS_ERR(ispp_dev->base_addr)) { + dev_err(dev, "ioremap failed\n"); return PTR_ERR(ispp_dev->base_addr); }