diff options
Diffstat (limited to 'drivers/media/platform/omap3isp/isp.c')
-rw-r--r-- | drivers/media/platform/omap3isp/isp.c | 74 |
1 files changed, 12 insertions, 62 deletions
diff --git a/drivers/media/platform/omap3isp/isp.c b/drivers/media/platform/omap3isp/isp.c index e4aaee91201d..383a727b8aa0 100644 --- a/drivers/media/platform/omap3isp/isp.c +++ b/drivers/media/platform/omap3isp/isp.c | |||
@@ -1406,28 +1406,15 @@ static const char *isp_clocks[] = { | |||
1406 | "l3_ick", | 1406 | "l3_ick", |
1407 | }; | 1407 | }; |
1408 | 1408 | ||
1409 | static void isp_put_clocks(struct isp_device *isp) | ||
1410 | { | ||
1411 | unsigned int i; | ||
1412 | |||
1413 | for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) { | ||
1414 | if (isp->clock[i]) { | ||
1415 | clk_put(isp->clock[i]); | ||
1416 | isp->clock[i] = NULL; | ||
1417 | } | ||
1418 | } | ||
1419 | } | ||
1420 | |||
1421 | static int isp_get_clocks(struct isp_device *isp) | 1409 | static int isp_get_clocks(struct isp_device *isp) |
1422 | { | 1410 | { |
1423 | struct clk *clk; | 1411 | struct clk *clk; |
1424 | unsigned int i; | 1412 | unsigned int i; |
1425 | 1413 | ||
1426 | for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) { | 1414 | for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) { |
1427 | clk = clk_get(isp->dev, isp_clocks[i]); | 1415 | clk = devm_clk_get(isp->dev, isp_clocks[i]); |
1428 | if (IS_ERR(clk)) { | 1416 | if (IS_ERR(clk)) { |
1429 | dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]); | 1417 | dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]); |
1430 | isp_put_clocks(isp); | ||
1431 | return PTR_ERR(clk); | 1418 | return PTR_ERR(clk); |
1432 | } | 1419 | } |
1433 | 1420 | ||
@@ -1993,7 +1980,6 @@ error_csiphy: | |||
1993 | static int isp_remove(struct platform_device *pdev) | 1980 | static int isp_remove(struct platform_device *pdev) |
1994 | { | 1981 | { |
1995 | struct isp_device *isp = platform_get_drvdata(pdev); | 1982 | struct isp_device *isp = platform_get_drvdata(pdev); |
1996 | int i; | ||
1997 | 1983 | ||
1998 | isp_unregister_entities(isp); | 1984 | isp_unregister_entities(isp); |
1999 | isp_cleanup_modules(isp); | 1985 | isp_cleanup_modules(isp); |
@@ -2004,26 +1990,6 @@ static int isp_remove(struct platform_device *pdev) | |||
2004 | isp->domain = NULL; | 1990 | isp->domain = NULL; |
2005 | omap3isp_put(isp); | 1991 | omap3isp_put(isp); |
2006 | 1992 | ||
2007 | free_irq(isp->irq_num, isp); | ||
2008 | isp_put_clocks(isp); | ||
2009 | |||
2010 | for (i = 0; i < OMAP3_ISP_IOMEM_LAST; i++) { | ||
2011 | if (isp->mmio_base[i]) { | ||
2012 | iounmap(isp->mmio_base[i]); | ||
2013 | isp->mmio_base[i] = NULL; | ||
2014 | } | ||
2015 | |||
2016 | if (isp->mmio_base_phys[i]) { | ||
2017 | release_mem_region(isp->mmio_base_phys[i], | ||
2018 | isp->mmio_size[i]); | ||
2019 | isp->mmio_base_phys[i] = 0; | ||
2020 | } | ||
2021 | } | ||
2022 | |||
2023 | regulator_put(isp->isp_csiphy1.vdd); | ||
2024 | regulator_put(isp->isp_csiphy2.vdd); | ||
2025 | kfree(isp); | ||
2026 | |||
2027 | return 0; | 1993 | return 0; |
2028 | } | 1994 | } |
2029 | 1995 | ||
@@ -2041,7 +2007,8 @@ static int isp_map_mem_resource(struct platform_device *pdev, | |||
2041 | return -ENODEV; | 2007 | return -ENODEV; |
2042 | } | 2008 | } |
2043 | 2009 | ||
2044 | if (!request_mem_region(mem->start, resource_size(mem), pdev->name)) { | 2010 | if (!devm_request_mem_region(isp->dev, mem->start, resource_size(mem), |
2011 | pdev->name)) { | ||
2045 | dev_err(isp->dev, | 2012 | dev_err(isp->dev, |
2046 | "cannot reserve camera register I/O region\n"); | 2013 | "cannot reserve camera register I/O region\n"); |
2047 | return -ENODEV; | 2014 | return -ENODEV; |
@@ -2050,8 +2017,9 @@ static int isp_map_mem_resource(struct platform_device *pdev, | |||
2050 | isp->mmio_size[res] = resource_size(mem); | 2017 | isp->mmio_size[res] = resource_size(mem); |
2051 | 2018 | ||
2052 | /* map the region */ | 2019 | /* map the region */ |
2053 | isp->mmio_base[res] = ioremap_nocache(isp->mmio_base_phys[res], | 2020 | isp->mmio_base[res] = devm_ioremap_nocache(isp->dev, |
2054 | isp->mmio_size[res]); | 2021 | isp->mmio_base_phys[res], |
2022 | isp->mmio_size[res]); | ||
2055 | if (!isp->mmio_base[res]) { | 2023 | if (!isp->mmio_base[res]) { |
2056 | dev_err(isp->dev, "cannot map camera register I/O region\n"); | 2024 | dev_err(isp->dev, "cannot map camera register I/O region\n"); |
2057 | return -ENODEV; | 2025 | return -ENODEV; |
@@ -2081,7 +2049,7 @@ static int isp_probe(struct platform_device *pdev) | |||
2081 | if (pdata == NULL) | 2049 | if (pdata == NULL) |
2082 | return -EINVAL; | 2050 | return -EINVAL; |
2083 | 2051 | ||
2084 | isp = kzalloc(sizeof(*isp), GFP_KERNEL); | 2052 | isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL); |
2085 | if (!isp) { | 2053 | if (!isp) { |
2086 | dev_err(&pdev->dev, "could not allocate memory\n"); | 2054 | dev_err(&pdev->dev, "could not allocate memory\n"); |
2087 | return -ENOMEM; | 2055 | return -ENOMEM; |
@@ -2104,8 +2072,8 @@ static int isp_probe(struct platform_device *pdev) | |||
2104 | platform_set_drvdata(pdev, isp); | 2072 | platform_set_drvdata(pdev, isp); |
2105 | 2073 | ||
2106 | /* Regulators */ | 2074 | /* Regulators */ |
2107 | isp->isp_csiphy1.vdd = regulator_get(&pdev->dev, "VDD_CSIPHY1"); | 2075 | isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY1"); |
2108 | isp->isp_csiphy2.vdd = regulator_get(&pdev->dev, "VDD_CSIPHY2"); | 2076 | isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY2"); |
2109 | 2077 | ||
2110 | /* Clocks | 2078 | /* Clocks |
2111 | * | 2079 | * |
@@ -2180,7 +2148,8 @@ static int isp_probe(struct platform_device *pdev) | |||
2180 | goto detach_dev; | 2148 | goto detach_dev; |
2181 | } | 2149 | } |
2182 | 2150 | ||
2183 | if (request_irq(isp->irq_num, isp_isr, IRQF_SHARED, "OMAP3 ISP", isp)) { | 2151 | if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED, |
2152 | "OMAP3 ISP", isp)) { | ||
2184 | dev_err(isp->dev, "Unable to request IRQ\n"); | 2153 | dev_err(isp->dev, "Unable to request IRQ\n"); |
2185 | ret = -EINVAL; | 2154 | ret = -EINVAL; |
2186 | goto detach_dev; | 2155 | goto detach_dev; |
@@ -2189,7 +2158,7 @@ static int isp_probe(struct platform_device *pdev) | |||
2189 | /* Entities */ | 2158 | /* Entities */ |
2190 | ret = isp_initialize_modules(isp); | 2159 | ret = isp_initialize_modules(isp); |
2191 | if (ret < 0) | 2160 | if (ret < 0) |
2192 | goto error_irq; | 2161 | goto detach_dev; |
2193 | 2162 | ||
2194 | ret = isp_register_entities(isp); | 2163 | ret = isp_register_entities(isp); |
2195 | if (ret < 0) | 2164 | if (ret < 0) |
@@ -2202,8 +2171,6 @@ static int isp_probe(struct platform_device *pdev) | |||
2202 | 2171 | ||
2203 | error_modules: | 2172 | error_modules: |
2204 | isp_cleanup_modules(isp); | 2173 | isp_cleanup_modules(isp); |
2205 | error_irq: | ||
2206 | free_irq(isp->irq_num, isp); | ||
2207 | detach_dev: | 2174 | detach_dev: |
2208 | iommu_detach_device(isp->domain, &pdev->dev); | 2175 | iommu_detach_device(isp->domain, &pdev->dev); |
2209 | free_domain: | 2176 | free_domain: |
@@ -2211,26 +2178,9 @@ free_domain: | |||
2211 | error_isp: | 2178 | error_isp: |
2212 | omap3isp_put(isp); | 2179 | omap3isp_put(isp); |
2213 | error: | 2180 | error: |
2214 | isp_put_clocks(isp); | ||
2215 | |||
2216 | for (i = 0; i < OMAP3_ISP_IOMEM_LAST; i++) { | ||
2217 | if (isp->mmio_base[i]) { | ||
2218 | iounmap(isp->mmio_base[i]); | ||
2219 | isp->mmio_base[i] = NULL; | ||
2220 | } | ||
2221 | |||
2222 | if (isp->mmio_base_phys[i]) { | ||
2223 | release_mem_region(isp->mmio_base_phys[i], | ||
2224 | isp->mmio_size[i]); | ||
2225 | isp->mmio_base_phys[i] = 0; | ||
2226 | } | ||
2227 | } | ||
2228 | regulator_put(isp->isp_csiphy2.vdd); | ||
2229 | regulator_put(isp->isp_csiphy1.vdd); | ||
2230 | platform_set_drvdata(pdev, NULL); | 2181 | platform_set_drvdata(pdev, NULL); |
2231 | 2182 | ||
2232 | mutex_destroy(&isp->isp_mutex); | 2183 | mutex_destroy(&isp->isp_mutex); |
2233 | kfree(isp); | ||
2234 | 2184 | ||
2235 | return ret; | 2185 | return ret; |
2236 | } | 2186 | } |