diff options
author | Archit Taneja <archit@ti.com> | 2012-07-05 03:22:46 -0400 |
---|---|---|
committer | Archit Taneja <archit@ti.com> | 2012-08-13 06:14:39 -0400 |
commit | c8a5e4e86d998274306dc906f5a24bb0e96aa14c (patch) | |
tree | 4d1e0b02c44337372db9ec571de06ed4b2d07289 | |
parent | 27dfddc7fe3bbc87935c078f3d078a9ed69dbf4a (diff) |
OMAPDSS: DPI: Add locking for DPI interface
The DPI interface driver currently relies on the panel driver to ensure calls
like omapdss_dpi_display_enable() and omapdss_dpi_display_disable() are executed
sequentially. Also, currently, there is no way to protect the DPI driver data.
All DPI panel drivers don't ensure this, and in general, a DPI panel driver
should use it's lock to that ensure it's own driver data and omap_dss_device
states are taken care of, and not worry about the DPI interface.
Add mutex locking in the DPI enable/disable/set_timings ops.
Signed-off-by: Archit Taneja <archit@ti.com>
-rw-r--r-- | drivers/video/omap2/dss/dpi.c | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c index 3266be23fc0d..15c2c3301f48 100644 --- a/drivers/video/omap2/dss/dpi.c +++ b/drivers/video/omap2/dss/dpi.c | |||
@@ -39,6 +39,8 @@ static struct { | |||
39 | struct regulator *vdds_dsi_reg; | 39 | struct regulator *vdds_dsi_reg; |
40 | struct platform_device *dsidev; | 40 | struct platform_device *dsidev; |
41 | 41 | ||
42 | struct mutex lock; | ||
43 | |||
42 | struct dss_lcd_mgr_config mgr_config; | 44 | struct dss_lcd_mgr_config mgr_config; |
43 | } dpi; | 45 | } dpi; |
44 | 46 | ||
@@ -169,14 +171,18 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev) | |||
169 | { | 171 | { |
170 | int r; | 172 | int r; |
171 | 173 | ||
174 | mutex_lock(&dpi.lock); | ||
175 | |||
172 | if (cpu_is_omap34xx() && !dpi.vdds_dsi_reg) { | 176 | if (cpu_is_omap34xx() && !dpi.vdds_dsi_reg) { |
173 | DSSERR("no VDSS_DSI regulator\n"); | 177 | DSSERR("no VDSS_DSI regulator\n"); |
174 | return -ENODEV; | 178 | r = -ENODEV; |
179 | goto err_no_reg; | ||
175 | } | 180 | } |
176 | 181 | ||
177 | if (dssdev->manager == NULL) { | 182 | if (dssdev->manager == NULL) { |
178 | DSSERR("failed to enable display: no manager\n"); | 183 | DSSERR("failed to enable display: no manager\n"); |
179 | return -ENODEV; | 184 | r = -ENODEV; |
185 | goto err_no_mgr; | ||
180 | } | 186 | } |
181 | 187 | ||
182 | r = omap_dss_start_device(dssdev); | 188 | r = omap_dss_start_device(dssdev); |
@@ -217,6 +223,8 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev) | |||
217 | if (r) | 223 | if (r) |
218 | goto err_mgr_enable; | 224 | goto err_mgr_enable; |
219 | 225 | ||
226 | mutex_unlock(&dpi.lock); | ||
227 | |||
220 | return 0; | 228 | return 0; |
221 | 229 | ||
222 | err_mgr_enable: | 230 | err_mgr_enable: |
@@ -234,12 +242,17 @@ err_get_dispc: | |||
234 | err_reg_enable: | 242 | err_reg_enable: |
235 | omap_dss_stop_device(dssdev); | 243 | omap_dss_stop_device(dssdev); |
236 | err_start_dev: | 244 | err_start_dev: |
245 | err_no_mgr: | ||
246 | err_no_reg: | ||
247 | mutex_unlock(&dpi.lock); | ||
237 | return r; | 248 | return r; |
238 | } | 249 | } |
239 | EXPORT_SYMBOL(omapdss_dpi_display_enable); | 250 | EXPORT_SYMBOL(omapdss_dpi_display_enable); |
240 | 251 | ||
241 | void omapdss_dpi_display_disable(struct omap_dss_device *dssdev) | 252 | void omapdss_dpi_display_disable(struct omap_dss_device *dssdev) |
242 | { | 253 | { |
254 | mutex_lock(&dpi.lock); | ||
255 | |||
243 | dss_mgr_disable(dssdev->manager); | 256 | dss_mgr_disable(dssdev->manager); |
244 | 257 | ||
245 | if (dpi_use_dsi_pll(dssdev)) { | 258 | if (dpi_use_dsi_pll(dssdev)) { |
@@ -254,6 +267,8 @@ void omapdss_dpi_display_disable(struct omap_dss_device *dssdev) | |||
254 | regulator_disable(dpi.vdds_dsi_reg); | 267 | regulator_disable(dpi.vdds_dsi_reg); |
255 | 268 | ||
256 | omap_dss_stop_device(dssdev); | 269 | omap_dss_stop_device(dssdev); |
270 | |||
271 | mutex_unlock(&dpi.lock); | ||
257 | } | 272 | } |
258 | EXPORT_SYMBOL(omapdss_dpi_display_disable); | 273 | EXPORT_SYMBOL(omapdss_dpi_display_disable); |
259 | 274 | ||
@@ -263,6 +278,9 @@ void dpi_set_timings(struct omap_dss_device *dssdev, | |||
263 | int r; | 278 | int r; |
264 | 279 | ||
265 | DSSDBG("dpi_set_timings\n"); | 280 | DSSDBG("dpi_set_timings\n"); |
281 | |||
282 | mutex_lock(&dpi.lock); | ||
283 | |||
266 | dssdev->panel.timings = *timings; | 284 | dssdev->panel.timings = *timings; |
267 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) { | 285 | if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) { |
268 | r = dispc_runtime_get(); | 286 | r = dispc_runtime_get(); |
@@ -275,6 +293,8 @@ void dpi_set_timings(struct omap_dss_device *dssdev, | |||
275 | } else { | 293 | } else { |
276 | dss_mgr_set_timings(dssdev->manager, timings); | 294 | dss_mgr_set_timings(dssdev->manager, timings); |
277 | } | 295 | } |
296 | |||
297 | mutex_unlock(&dpi.lock); | ||
278 | } | 298 | } |
279 | EXPORT_SYMBOL(dpi_set_timings); | 299 | EXPORT_SYMBOL(dpi_set_timings); |
280 | 300 | ||
@@ -377,6 +397,8 @@ static void __init dpi_probe_pdata(struct platform_device *pdev) | |||
377 | 397 | ||
378 | static int __init omap_dpi_probe(struct platform_device *pdev) | 398 | static int __init omap_dpi_probe(struct platform_device *pdev) |
379 | { | 399 | { |
400 | mutex_init(&dpi.lock); | ||
401 | |||
380 | dpi_probe_pdata(pdev); | 402 | dpi_probe_pdata(pdev); |
381 | 403 | ||
382 | return 0; | 404 | return 0; |