diff options
Diffstat (limited to 'drivers/media/video/omap3isp/isp.c')
-rw-r--r-- | drivers/media/video/omap3isp/isp.c | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/drivers/media/video/omap3isp/isp.c b/drivers/media/video/omap3isp/isp.c index 5cea2bbd7014..a7ed98596883 100644 --- a/drivers/media/video/omap3isp/isp.c +++ b/drivers/media/video/omap3isp/isp.c | |||
@@ -80,6 +80,13 @@ | |||
80 | #include "isph3a.h" | 80 | #include "isph3a.h" |
81 | #include "isphist.h" | 81 | #include "isphist.h" |
82 | 82 | ||
83 | /* | ||
84 | * this is provided as an interim solution until omap3isp doesn't need | ||
85 | * any omap-specific iommu API | ||
86 | */ | ||
87 | #define to_iommu(dev) \ | ||
88 | (struct omap_iommu *)platform_get_drvdata(to_platform_device(dev)) | ||
89 | |||
83 | static unsigned int autoidle; | 90 | static unsigned int autoidle; |
84 | module_param(autoidle, int, 0444); | 91 | module_param(autoidle, int, 0444); |
85 | MODULE_PARM_DESC(autoidle, "Enable OMAP3ISP AUTOIDLE support"); | 92 | MODULE_PARM_DESC(autoidle, "Enable OMAP3ISP AUTOIDLE support"); |
@@ -1108,7 +1115,7 @@ static void isp_save_ctx(struct isp_device *isp) | |||
1108 | { | 1115 | { |
1109 | isp_save_context(isp, isp_reg_list); | 1116 | isp_save_context(isp, isp_reg_list); |
1110 | if (isp->iommu) | 1117 | if (isp->iommu) |
1111 | iommu_save_ctx(isp->iommu); | 1118 | omap_iommu_save_ctx(isp->iommu); |
1112 | } | 1119 | } |
1113 | 1120 | ||
1114 | /* | 1121 | /* |
@@ -1122,7 +1129,7 @@ static void isp_restore_ctx(struct isp_device *isp) | |||
1122 | { | 1129 | { |
1123 | isp_restore_context(isp, isp_reg_list); | 1130 | isp_restore_context(isp, isp_reg_list); |
1124 | if (isp->iommu) | 1131 | if (isp->iommu) |
1125 | iommu_restore_ctx(isp->iommu); | 1132 | omap_iommu_restore_ctx(isp->iommu); |
1126 | omap3isp_ccdc_restore_context(isp); | 1133 | omap3isp_ccdc_restore_context(isp); |
1127 | omap3isp_preview_restore_context(isp); | 1134 | omap3isp_preview_restore_context(isp); |
1128 | } | 1135 | } |
@@ -1975,7 +1982,8 @@ static int isp_remove(struct platform_device *pdev) | |||
1975 | isp_cleanup_modules(isp); | 1982 | isp_cleanup_modules(isp); |
1976 | 1983 | ||
1977 | omap3isp_get(isp); | 1984 | omap3isp_get(isp); |
1978 | iommu_put(isp->iommu); | 1985 | iommu_detach_device(isp->domain, isp->iommu_dev); |
1986 | iommu_domain_free(isp->domain); | ||
1979 | omap3isp_put(isp); | 1987 | omap3isp_put(isp); |
1980 | 1988 | ||
1981 | free_irq(isp->irq_num, isp); | 1989 | free_irq(isp->irq_num, isp); |
@@ -2123,25 +2131,41 @@ static int isp_probe(struct platform_device *pdev) | |||
2123 | } | 2131 | } |
2124 | 2132 | ||
2125 | /* IOMMU */ | 2133 | /* IOMMU */ |
2126 | isp->iommu = iommu_get("isp"); | 2134 | isp->iommu_dev = omap_find_iommu_device("isp"); |
2127 | if (IS_ERR_OR_NULL(isp->iommu)) { | 2135 | if (!isp->iommu_dev) { |
2128 | isp->iommu = NULL; | 2136 | dev_err(isp->dev, "omap_find_iommu_device failed\n"); |
2129 | ret = -ENODEV; | 2137 | ret = -ENODEV; |
2130 | goto error_isp; | 2138 | goto error_isp; |
2131 | } | 2139 | } |
2132 | 2140 | ||
2141 | /* to be removed once iommu migration is complete */ | ||
2142 | isp->iommu = to_iommu(isp->iommu_dev); | ||
2143 | |||
2144 | isp->domain = iommu_domain_alloc(pdev->dev.bus); | ||
2145 | if (!isp->domain) { | ||
2146 | dev_err(isp->dev, "can't alloc iommu domain\n"); | ||
2147 | ret = -ENOMEM; | ||
2148 | goto error_isp; | ||
2149 | } | ||
2150 | |||
2151 | ret = iommu_attach_device(isp->domain, isp->iommu_dev); | ||
2152 | if (ret) { | ||
2153 | dev_err(&pdev->dev, "can't attach iommu device: %d\n", ret); | ||
2154 | goto free_domain; | ||
2155 | } | ||
2156 | |||
2133 | /* Interrupt */ | 2157 | /* Interrupt */ |
2134 | isp->irq_num = platform_get_irq(pdev, 0); | 2158 | isp->irq_num = platform_get_irq(pdev, 0); |
2135 | if (isp->irq_num <= 0) { | 2159 | if (isp->irq_num <= 0) { |
2136 | dev_err(isp->dev, "No IRQ resource\n"); | 2160 | dev_err(isp->dev, "No IRQ resource\n"); |
2137 | ret = -ENODEV; | 2161 | ret = -ENODEV; |
2138 | goto error_isp; | 2162 | goto detach_dev; |
2139 | } | 2163 | } |
2140 | 2164 | ||
2141 | if (request_irq(isp->irq_num, isp_isr, IRQF_SHARED, "OMAP3 ISP", isp)) { | 2165 | if (request_irq(isp->irq_num, isp_isr, IRQF_SHARED, "OMAP3 ISP", isp)) { |
2142 | dev_err(isp->dev, "Unable to request IRQ\n"); | 2166 | dev_err(isp->dev, "Unable to request IRQ\n"); |
2143 | ret = -EINVAL; | 2167 | ret = -EINVAL; |
2144 | goto error_isp; | 2168 | goto detach_dev; |
2145 | } | 2169 | } |
2146 | 2170 | ||
2147 | /* Entities */ | 2171 | /* Entities */ |
@@ -2162,8 +2186,11 @@ error_modules: | |||
2162 | isp_cleanup_modules(isp); | 2186 | isp_cleanup_modules(isp); |
2163 | error_irq: | 2187 | error_irq: |
2164 | free_irq(isp->irq_num, isp); | 2188 | free_irq(isp->irq_num, isp); |
2189 | detach_dev: | ||
2190 | iommu_detach_device(isp->domain, isp->iommu_dev); | ||
2191 | free_domain: | ||
2192 | iommu_domain_free(isp->domain); | ||
2165 | error_isp: | 2193 | error_isp: |
2166 | iommu_put(isp->iommu); | ||
2167 | omap3isp_put(isp); | 2194 | omap3isp_put(isp); |
2168 | error: | 2195 | error: |
2169 | isp_put_clocks(isp); | 2196 | isp_put_clocks(isp); |