diff options
-rw-r--r-- | drivers/video/omap2/dss/core.c | 66 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dpi.c | 55 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dsi.c | 4 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dss.h | 5 | ||||
-rw-r--r-- | drivers/video/omap2/dss/venc.c | 4 |
5 files changed, 117 insertions, 17 deletions
diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c index 82918eec6d2e..791e1cb7c0bc 100644 --- a/drivers/video/omap2/dss/core.c +++ b/drivers/video/omap2/dss/core.c | |||
@@ -31,6 +31,7 @@ | |||
31 | #include <linux/debugfs.h> | 31 | #include <linux/debugfs.h> |
32 | #include <linux/io.h> | 32 | #include <linux/io.h> |
33 | #include <linux/device.h> | 33 | #include <linux/device.h> |
34 | #include <linux/regulator/consumer.h> | ||
34 | 35 | ||
35 | #include <plat/display.h> | 36 | #include <plat/display.h> |
36 | #include <plat/clock.h> | 37 | #include <plat/clock.h> |
@@ -47,6 +48,10 @@ static struct { | |||
47 | struct clk *dss_54m_fck; | 48 | struct clk *dss_54m_fck; |
48 | struct clk *dss_96m_fck; | 49 | struct clk *dss_96m_fck; |
49 | unsigned num_clks_enabled; | 50 | unsigned num_clks_enabled; |
51 | |||
52 | struct regulator *vdds_dsi_reg; | ||
53 | struct regulator *vdds_sdi_reg; | ||
54 | struct regulator *vdda_dac_reg; | ||
50 | } core; | 55 | } core; |
51 | 56 | ||
52 | static void dss_clk_enable_all_no_ctx(void); | 57 | static void dss_clk_enable_all_no_ctx(void); |
@@ -352,6 +357,50 @@ static void dss_clk_disable_all(void) | |||
352 | dss_clk_disable(clks); | 357 | dss_clk_disable(clks); |
353 | } | 358 | } |
354 | 359 | ||
360 | /* REGULATORS */ | ||
361 | |||
362 | struct regulator *dss_get_vdds_dsi(void) | ||
363 | { | ||
364 | struct regulator *reg; | ||
365 | |||
366 | if (core.vdds_dsi_reg != NULL) | ||
367 | return core.vdds_dsi_reg; | ||
368 | |||
369 | reg = regulator_get(&core.pdev->dev, "vdds_dsi"); | ||
370 | if (!IS_ERR(reg)) | ||
371 | core.vdds_dsi_reg = reg; | ||
372 | |||
373 | return reg; | ||
374 | } | ||
375 | |||
376 | struct regulator *dss_get_vdds_sdi(void) | ||
377 | { | ||
378 | struct regulator *reg; | ||
379 | |||
380 | if (core.vdds_sdi_reg != NULL) | ||
381 | return core.vdds_sdi_reg; | ||
382 | |||
383 | reg = regulator_get(&core.pdev->dev, "vdds_sdi"); | ||
384 | if (!IS_ERR(reg)) | ||
385 | core.vdds_sdi_reg = reg; | ||
386 | |||
387 | return reg; | ||
388 | } | ||
389 | |||
390 | struct regulator *dss_get_vdda_dac(void) | ||
391 | { | ||
392 | struct regulator *reg; | ||
393 | |||
394 | if (core.vdda_dac_reg != NULL) | ||
395 | return core.vdda_dac_reg; | ||
396 | |||
397 | reg = regulator_get(&core.pdev->dev, "vdda_dac"); | ||
398 | if (!IS_ERR(reg)) | ||
399 | core.vdda_dac_reg = reg; | ||
400 | |||
401 | return reg; | ||
402 | } | ||
403 | |||
355 | /* DEBUGFS */ | 404 | /* DEBUGFS */ |
356 | #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) | 405 | #if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) |
357 | static void dss_debug_dump_clocks(struct seq_file *s) | 406 | static void dss_debug_dump_clocks(struct seq_file *s) |
@@ -473,7 +522,7 @@ static int omap_dss_probe(struct platform_device *pdev) | |||
473 | } | 522 | } |
474 | #endif | 523 | #endif |
475 | 524 | ||
476 | r = dpi_init(); | 525 | r = dpi_init(pdev); |
477 | if (r) { | 526 | if (r) { |
478 | DSSERR("Failed to initialize dpi\n"); | 527 | DSSERR("Failed to initialize dpi\n"); |
479 | goto fail0; | 528 | goto fail0; |
@@ -901,6 +950,21 @@ static int __init omap_dss_init(void) | |||
901 | 950 | ||
902 | static void __exit omap_dss_exit(void) | 951 | static void __exit omap_dss_exit(void) |
903 | { | 952 | { |
953 | if (core.vdds_dsi_reg != NULL) { | ||
954 | regulator_put(core.vdds_dsi_reg); | ||
955 | core.vdds_dsi_reg = NULL; | ||
956 | } | ||
957 | |||
958 | if (core.vdds_sdi_reg != NULL) { | ||
959 | regulator_put(core.vdds_sdi_reg); | ||
960 | core.vdds_sdi_reg = NULL; | ||
961 | } | ||
962 | |||
963 | if (core.vdda_dac_reg != NULL) { | ||
964 | regulator_put(core.vdda_dac_reg); | ||
965 | core.vdda_dac_reg = NULL; | ||
966 | } | ||
967 | |||
904 | platform_driver_unregister(&omap_dss_driver); | 968 | platform_driver_unregister(&omap_dss_driver); |
905 | 969 | ||
906 | omap_dss_bus_unregister(); | 970 | omap_dss_bus_unregister(); |
diff --git a/drivers/video/omap2/dss/dpi.c b/drivers/video/omap2/dss/dpi.c index 2d71031baa25..69ce31ae2a2f 100644 --- a/drivers/video/omap2/dss/dpi.c +++ b/drivers/video/omap2/dss/dpi.c | |||
@@ -25,7 +25,10 @@ | |||
25 | #include <linux/kernel.h> | 25 | #include <linux/kernel.h> |
26 | #include <linux/clk.h> | 26 | #include <linux/clk.h> |
27 | #include <linux/delay.h> | 27 | #include <linux/delay.h> |
28 | #include <linux/err.h> | ||
28 | #include <linux/errno.h> | 29 | #include <linux/errno.h> |
30 | #include <linux/platform_device.h> | ||
31 | #include <linux/regulator/consumer.h> | ||
29 | 32 | ||
30 | #include <plat/display.h> | 33 | #include <plat/display.h> |
31 | #include <plat/cpu.h> | 34 | #include <plat/cpu.h> |
@@ -34,6 +37,7 @@ | |||
34 | 37 | ||
35 | static struct { | 38 | static struct { |
36 | int update_enabled; | 39 | int update_enabled; |
40 | struct regulator *vdds_dsi_reg; | ||
37 | } dpi; | 41 | } dpi; |
38 | 42 | ||
39 | #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL | 43 | #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL |
@@ -166,21 +170,27 @@ static int dpi_display_enable(struct omap_dss_device *dssdev) | |||
166 | goto err1; | 170 | goto err1; |
167 | } | 171 | } |
168 | 172 | ||
173 | if (cpu_is_omap34xx()) { | ||
174 | r = regulator_enable(dpi.vdds_dsi_reg); | ||
175 | if (r) | ||
176 | goto err2; | ||
177 | } | ||
178 | |||
169 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); | 179 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); |
170 | 180 | ||
171 | r = dpi_basic_init(dssdev); | 181 | r = dpi_basic_init(dssdev); |
172 | if (r) | 182 | if (r) |
173 | goto err2; | 183 | goto err3; |
174 | 184 | ||
175 | #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL | 185 | #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL |
176 | dss_clk_enable(DSS_CLK_FCK2); | 186 | dss_clk_enable(DSS_CLK_FCK2); |
177 | r = dsi_pll_init(dssdev, 0, 1); | 187 | r = dsi_pll_init(dssdev, 0, 1); |
178 | if (r) | 188 | if (r) |
179 | goto err3; | 189 | goto err4; |
180 | #endif | 190 | #endif |
181 | r = dpi_set_mode(dssdev); | 191 | r = dpi_set_mode(dssdev); |
182 | if (r) | 192 | if (r) |
183 | goto err4; | 193 | goto err5; |
184 | 194 | ||
185 | mdelay(2); | 195 | mdelay(2); |
186 | 196 | ||
@@ -188,22 +198,25 @@ static int dpi_display_enable(struct omap_dss_device *dssdev) | |||
188 | 198 | ||
189 | r = dssdev->driver->enable(dssdev); | 199 | r = dssdev->driver->enable(dssdev); |
190 | if (r) | 200 | if (r) |
191 | goto err5; | 201 | goto err6; |
192 | 202 | ||
193 | dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; | 203 | dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; |
194 | 204 | ||
195 | return 0; | 205 | return 0; |
196 | 206 | ||
197 | err5: | 207 | err6: |
198 | dispc_enable_lcd_out(0); | 208 | dispc_enable_lcd_out(0); |
199 | err4: | 209 | err5: |
200 | #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL | 210 | #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL |
201 | dsi_pll_uninit(); | 211 | dsi_pll_uninit(); |
202 | err3: | 212 | err4: |
203 | dss_clk_disable(DSS_CLK_FCK2); | 213 | dss_clk_disable(DSS_CLK_FCK2); |
204 | #endif | 214 | #endif |
205 | err2: | 215 | err3: |
206 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); | 216 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); |
217 | err2: | ||
218 | if (cpu_is_omap34xx()) | ||
219 | regulator_disable(dpi.vdds_dsi_reg); | ||
207 | err1: | 220 | err1: |
208 | omap_dss_stop_device(dssdev); | 221 | omap_dss_stop_device(dssdev); |
209 | err0: | 222 | err0: |
@@ -232,6 +245,9 @@ static void dpi_display_disable(struct omap_dss_device *dssdev) | |||
232 | 245 | ||
233 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); | 246 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); |
234 | 247 | ||
248 | if (cpu_is_omap34xx()) | ||
249 | regulator_disable(dpi.vdds_dsi_reg); | ||
250 | |||
235 | dssdev->state = OMAP_DSS_DISPLAY_DISABLED; | 251 | dssdev->state = OMAP_DSS_DISPLAY_DISABLED; |
236 | 252 | ||
237 | omap_dss_stop_device(dssdev); | 253 | omap_dss_stop_device(dssdev); |
@@ -251,6 +267,9 @@ static int dpi_display_suspend(struct omap_dss_device *dssdev) | |||
251 | 267 | ||
252 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); | 268 | dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); |
253 | 269 | ||
270 | if (cpu_is_omap34xx()) | ||
271 | regulator_disable(dpi.vdds_dsi_reg); | ||
272 | |||
254 | dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED; | 273 | dssdev->state = OMAP_DSS_DISPLAY_SUSPENDED; |
255 | 274 | ||
256 | return 0; | 275 | return 0; |
@@ -258,11 +277,19 @@ static int dpi_display_suspend(struct omap_dss_device *dssdev) | |||
258 | 277 | ||
259 | static int dpi_display_resume(struct omap_dss_device *dssdev) | 278 | static int dpi_display_resume(struct omap_dss_device *dssdev) |
260 | { | 279 | { |
280 | int r; | ||
281 | |||
261 | if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED) | 282 | if (dssdev->state != OMAP_DSS_DISPLAY_SUSPENDED) |
262 | return -EINVAL; | 283 | return -EINVAL; |
263 | 284 | ||
264 | DSSDBG("dpi_display_resume\n"); | 285 | DSSDBG("dpi_display_resume\n"); |
265 | 286 | ||
287 | if (cpu_is_omap34xx()) { | ||
288 | r = regulator_enable(dpi.vdds_dsi_reg); | ||
289 | if (r) | ||
290 | goto err0; | ||
291 | } | ||
292 | |||
266 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); | 293 | dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); |
267 | 294 | ||
268 | dispc_enable_lcd_out(1); | 295 | dispc_enable_lcd_out(1); |
@@ -273,6 +300,8 @@ static int dpi_display_resume(struct omap_dss_device *dssdev) | |||
273 | dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; | 300 | dssdev->state = OMAP_DSS_DISPLAY_ACTIVE; |
274 | 301 | ||
275 | return 0; | 302 | return 0; |
303 | err0: | ||
304 | return r; | ||
276 | } | 305 | } |
277 | 306 | ||
278 | static void dpi_set_timings(struct omap_dss_device *dssdev, | 307 | static void dpi_set_timings(struct omap_dss_device *dssdev, |
@@ -388,8 +417,16 @@ int dpi_init_display(struct omap_dss_device *dssdev) | |||
388 | return 0; | 417 | return 0; |
389 | } | 418 | } |
390 | 419 | ||
391 | int dpi_init(void) | 420 | int dpi_init(struct platform_device *pdev) |
392 | { | 421 | { |
422 | if (cpu_is_omap34xx()) { | ||
423 | dpi.vdds_dsi_reg = dss_get_vdds_dsi(); | ||
424 | if (IS_ERR(dpi.vdds_dsi_reg)) { | ||
425 | DSSERR("can't get VDDS_DSI regulator\n"); | ||
426 | return PTR_ERR(dpi.vdds_dsi_reg); | ||
427 | } | ||
428 | } | ||
429 | |||
393 | return 0; | 430 | return 0; |
394 | } | 431 | } |
395 | 432 | ||
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c index 6122178f5f85..036f4221e3df 100644 --- a/drivers/video/omap2/dss/dsi.c +++ b/drivers/video/omap2/dss/dsi.c | |||
@@ -3799,7 +3799,7 @@ int dsi_init(struct platform_device *pdev) | |||
3799 | goto err1; | 3799 | goto err1; |
3800 | } | 3800 | } |
3801 | 3801 | ||
3802 | dsi.vdds_dsi_reg = regulator_get(&pdev->dev, "vdds_dsi"); | 3802 | dsi.vdds_dsi_reg = dss_get_vdds_dsi(); |
3803 | if (IS_ERR(dsi.vdds_dsi_reg)) { | 3803 | if (IS_ERR(dsi.vdds_dsi_reg)) { |
3804 | iounmap(dsi.base); | 3804 | iounmap(dsi.base); |
3805 | DSSERR("can't get VDDS_DSI regulator\n"); | 3805 | DSSERR("can't get VDDS_DSI regulator\n"); |
@@ -3830,8 +3830,6 @@ void dsi_exit(void) | |||
3830 | { | 3830 | { |
3831 | kthread_stop(dsi.thread); | 3831 | kthread_stop(dsi.thread); |
3832 | 3832 | ||
3833 | regulator_put(dsi.vdds_dsi_reg); | ||
3834 | |||
3835 | iounmap(dsi.base); | 3833 | iounmap(dsi.base); |
3836 | 3834 | ||
3837 | DSSDBG("omap_dsi_exit\n"); | 3835 | DSSDBG("omap_dsi_exit\n"); |
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h index 2bcb1245d6c2..41145af36353 100644 --- a/drivers/video/omap2/dss/dss.h +++ b/drivers/video/omap2/dss/dss.h | |||
@@ -169,6 +169,9 @@ unsigned long dss_clk_get_rate(enum dss_clock clk); | |||
169 | int dss_need_ctx_restore(void); | 169 | int dss_need_ctx_restore(void); |
170 | void dss_dump_clocks(struct seq_file *s); | 170 | void dss_dump_clocks(struct seq_file *s); |
171 | struct bus_type *dss_get_bus(void); | 171 | struct bus_type *dss_get_bus(void); |
172 | struct regulator *dss_get_vdds_dsi(void); | ||
173 | struct regulator *dss_get_vdds_sdi(void); | ||
174 | struct regulator *dss_get_vdda_dac(void); | ||
172 | 175 | ||
173 | /* display */ | 176 | /* display */ |
174 | int dss_suspend_all_devices(void); | 177 | int dss_suspend_all_devices(void); |
@@ -261,7 +264,7 @@ void dsi_get_overlay_fifo_thresholds(enum omap_plane plane, | |||
261 | u32 *fifo_low, u32 *fifo_high); | 264 | u32 *fifo_low, u32 *fifo_high); |
262 | 265 | ||
263 | /* DPI */ | 266 | /* DPI */ |
264 | int dpi_init(void); | 267 | int dpi_init(struct platform_device *pdev); |
265 | void dpi_exit(void); | 268 | void dpi_exit(void); |
266 | int dpi_init_display(struct omap_dss_device *dssdev); | 269 | int dpi_init_display(struct omap_dss_device *dssdev); |
267 | 270 | ||
diff --git a/drivers/video/omap2/dss/venc.c b/drivers/video/omap2/dss/venc.c index 749a5a0f5be4..44b4998c2052 100644 --- a/drivers/video/omap2/dss/venc.c +++ b/drivers/video/omap2/dss/venc.c | |||
@@ -482,7 +482,7 @@ int venc_init(struct platform_device *pdev) | |||
482 | return -ENOMEM; | 482 | return -ENOMEM; |
483 | } | 483 | } |
484 | 484 | ||
485 | venc.vdda_dac_reg = regulator_get(&pdev->dev, "vdda_dac"); | 485 | venc.vdda_dac_reg = dss_get_vdda_dac(); |
486 | if (IS_ERR(venc.vdda_dac_reg)) { | 486 | if (IS_ERR(venc.vdda_dac_reg)) { |
487 | iounmap(venc.base); | 487 | iounmap(venc.base); |
488 | DSSERR("can't get VDDA_DAC regulator\n"); | 488 | DSSERR("can't get VDDA_DAC regulator\n"); |
@@ -503,8 +503,6 @@ void venc_exit(void) | |||
503 | { | 503 | { |
504 | omap_dss_unregister_driver(&venc_driver); | 504 | omap_dss_unregister_driver(&venc_driver); |
505 | 505 | ||
506 | regulator_put(venc.vdda_dac_reg); | ||
507 | |||
508 | iounmap(venc.base); | 506 | iounmap(venc.base); |
509 | } | 507 | } |
510 | 508 | ||