|
|
|
@ -1406,28 +1406,15 @@ static const char *isp_clocks[] = { |
|
|
|
|
"l3_ick", |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static void isp_put_clocks(struct isp_device *isp) |
|
|
|
|
{ |
|
|
|
|
unsigned int i; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) { |
|
|
|
|
if (isp->clock[i]) { |
|
|
|
|
clk_put(isp->clock[i]); |
|
|
|
|
isp->clock[i] = NULL; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int isp_get_clocks(struct isp_device *isp) |
|
|
|
|
{ |
|
|
|
|
struct clk *clk; |
|
|
|
|
unsigned int i; |
|
|
|
|
|
|
|
|
|
for (i = 0; i < ARRAY_SIZE(isp_clocks); ++i) { |
|
|
|
|
clk = clk_get(isp->dev, isp_clocks[i]); |
|
|
|
|
clk = devm_clk_get(isp->dev, isp_clocks[i]); |
|
|
|
|
if (IS_ERR(clk)) { |
|
|
|
|
dev_err(isp->dev, "clk_get %s failed\n", isp_clocks[i]); |
|
|
|
|
isp_put_clocks(isp); |
|
|
|
|
return PTR_ERR(clk); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -1993,7 +1980,6 @@ error_csiphy: |
|
|
|
|
static int isp_remove(struct platform_device *pdev) |
|
|
|
|
{ |
|
|
|
|
struct isp_device *isp = platform_get_drvdata(pdev); |
|
|
|
|
int i; |
|
|
|
|
|
|
|
|
|
isp_unregister_entities(isp); |
|
|
|
|
isp_cleanup_modules(isp); |
|
|
|
@ -2004,26 +1990,6 @@ static int isp_remove(struct platform_device *pdev) |
|
|
|
|
isp->domain = NULL; |
|
|
|
|
omap3isp_put(isp); |
|
|
|
|
|
|
|
|
|
free_irq(isp->irq_num, isp); |
|
|
|
|
isp_put_clocks(isp); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < OMAP3_ISP_IOMEM_LAST; i++) { |
|
|
|
|
if (isp->mmio_base[i]) { |
|
|
|
|
iounmap(isp->mmio_base[i]); |
|
|
|
|
isp->mmio_base[i] = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (isp->mmio_base_phys[i]) { |
|
|
|
|
release_mem_region(isp->mmio_base_phys[i], |
|
|
|
|
isp->mmio_size[i]); |
|
|
|
|
isp->mmio_base_phys[i] = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
regulator_put(isp->isp_csiphy1.vdd); |
|
|
|
|
regulator_put(isp->isp_csiphy2.vdd); |
|
|
|
|
kfree(isp); |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -2041,7 +2007,8 @@ static int isp_map_mem_resource(struct platform_device *pdev, |
|
|
|
|
return -ENODEV; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (!request_mem_region(mem->start, resource_size(mem), pdev->name)) { |
|
|
|
|
if (!devm_request_mem_region(isp->dev, mem->start, resource_size(mem), |
|
|
|
|
pdev->name)) { |
|
|
|
|
dev_err(isp->dev, |
|
|
|
|
"cannot reserve camera register I/O region\n"); |
|
|
|
|
return -ENODEV; |
|
|
|
@ -2050,8 +2017,9 @@ static int isp_map_mem_resource(struct platform_device *pdev, |
|
|
|
|
isp->mmio_size[res] = resource_size(mem); |
|
|
|
|
|
|
|
|
|
/* map the region */ |
|
|
|
|
isp->mmio_base[res] = ioremap_nocache(isp->mmio_base_phys[res], |
|
|
|
|
isp->mmio_size[res]); |
|
|
|
|
isp->mmio_base[res] = devm_ioremap_nocache(isp->dev, |
|
|
|
|
isp->mmio_base_phys[res], |
|
|
|
|
isp->mmio_size[res]); |
|
|
|
|
if (!isp->mmio_base[res]) { |
|
|
|
|
dev_err(isp->dev, "cannot map camera register I/O region\n"); |
|
|
|
|
return -ENODEV; |
|
|
|
@ -2081,7 +2049,7 @@ static int isp_probe(struct platform_device *pdev) |
|
|
|
|
if (pdata == NULL) |
|
|
|
|
return -EINVAL; |
|
|
|
|
|
|
|
|
|
isp = kzalloc(sizeof(*isp), GFP_KERNEL); |
|
|
|
|
isp = devm_kzalloc(&pdev->dev, sizeof(*isp), GFP_KERNEL); |
|
|
|
|
if (!isp) { |
|
|
|
|
dev_err(&pdev->dev, "could not allocate memory\n"); |
|
|
|
|
return -ENOMEM; |
|
|
|
@ -2104,8 +2072,8 @@ static int isp_probe(struct platform_device *pdev) |
|
|
|
|
platform_set_drvdata(pdev, isp); |
|
|
|
|
|
|
|
|
|
/* Regulators */ |
|
|
|
|
isp->isp_csiphy1.vdd = regulator_get(&pdev->dev, "VDD_CSIPHY1"); |
|
|
|
|
isp->isp_csiphy2.vdd = regulator_get(&pdev->dev, "VDD_CSIPHY2"); |
|
|
|
|
isp->isp_csiphy1.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY1"); |
|
|
|
|
isp->isp_csiphy2.vdd = devm_regulator_get(&pdev->dev, "VDD_CSIPHY2"); |
|
|
|
|
|
|
|
|
|
/* Clocks
|
|
|
|
|
* |
|
|
|
@ -2180,7 +2148,8 @@ static int isp_probe(struct platform_device *pdev) |
|
|
|
|
goto detach_dev; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (request_irq(isp->irq_num, isp_isr, IRQF_SHARED, "OMAP3 ISP", isp)) { |
|
|
|
|
if (devm_request_irq(isp->dev, isp->irq_num, isp_isr, IRQF_SHARED, |
|
|
|
|
"OMAP3 ISP", isp)) { |
|
|
|
|
dev_err(isp->dev, "Unable to request IRQ\n"); |
|
|
|
|
ret = -EINVAL; |
|
|
|
|
goto detach_dev; |
|
|
|
@ -2189,7 +2158,7 @@ static int isp_probe(struct platform_device *pdev) |
|
|
|
|
/* Entities */ |
|
|
|
|
ret = isp_initialize_modules(isp); |
|
|
|
|
if (ret < 0) |
|
|
|
|
goto error_irq; |
|
|
|
|
goto detach_dev; |
|
|
|
|
|
|
|
|
|
ret = isp_register_entities(isp); |
|
|
|
|
if (ret < 0) |
|
|
|
@ -2202,8 +2171,6 @@ static int isp_probe(struct platform_device *pdev) |
|
|
|
|
|
|
|
|
|
error_modules: |
|
|
|
|
isp_cleanup_modules(isp); |
|
|
|
|
error_irq: |
|
|
|
|
free_irq(isp->irq_num, isp); |
|
|
|
|
detach_dev: |
|
|
|
|
iommu_detach_device(isp->domain, &pdev->dev); |
|
|
|
|
free_domain: |
|
|
|
@ -2211,26 +2178,9 @@ free_domain: |
|
|
|
|
error_isp: |
|
|
|
|
omap3isp_put(isp); |
|
|
|
|
error: |
|
|
|
|
isp_put_clocks(isp); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < OMAP3_ISP_IOMEM_LAST; i++) { |
|
|
|
|
if (isp->mmio_base[i]) { |
|
|
|
|
iounmap(isp->mmio_base[i]); |
|
|
|
|
isp->mmio_base[i] = NULL; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (isp->mmio_base_phys[i]) { |
|
|
|
|
release_mem_region(isp->mmio_base_phys[i], |
|
|
|
|
isp->mmio_size[i]); |
|
|
|
|
isp->mmio_base_phys[i] = 0; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
regulator_put(isp->isp_csiphy2.vdd); |
|
|
|
|
regulator_put(isp->isp_csiphy1.vdd); |
|
|
|
|
platform_set_drvdata(pdev, NULL); |
|
|
|
|
|
|
|
|
|
mutex_destroy(&isp->isp_mutex); |
|
|
|
|
kfree(isp); |
|
|
|
|
|
|
|
|
|
return ret; |
|
|
|
|
} |
|
|
|
|