aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomi Valkeinen <tomi.valkeinen@ti.com>2013-02-22 05:58:35 -0500
committerTomi Valkeinen <tomi.valkeinen@ti.com>2013-04-03 08:19:01 -0400
commitb7dec9b66f49304470291a95ea3855c9c9fe193b (patch)
tree5c807c91f0dec47e650227f4c1c915b22dc43039
parent2eea5ae6c102a5088e39733115ff7762a4674887 (diff)
OMAPDSS: DSI: delay dispc initialization
We currently setup both DSI and DISPC related things when the DSI bus is enabled. There's no need for DISPC related thing at that point, though, but only later when the video output is enabled. To make it possible to use the DSI bus before DISPC overlay manager is selected, this patch moves DSI's DISPC initialization to dsi_enable_video_output(), from omapdss_dsi_display_enable(). We also move the selection of DISPC's LCD clock to dsi_enable_video_output. This way there are no DISPC dependencies until the video output is enabled. Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com> Reviewed-by: Archit Taneja <archit@ti.com>
-rw-r--r--drivers/video/omap2/dss/dsi.c75
1 files changed, 40 insertions, 35 deletions
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
index d13e77c01d7e..c9f9d0faf8e3 100644
--- a/drivers/video/omap2/dss/dsi.c
+++ b/drivers/video/omap2/dss/dsi.c
@@ -200,6 +200,11 @@ struct dsi_reg { u16 idx; };
200 200
201typedef void (*omap_dsi_isr_t) (void *arg, u32 mask); 201typedef void (*omap_dsi_isr_t) (void *arg, u32 mask);
202 202
203static int dsi_display_init_dispc(struct platform_device *dsidev,
204 struct omap_overlay_manager *mgr);
205static void dsi_display_uninit_dispc(struct platform_device *dsidev,
206 struct omap_overlay_manager *mgr);
207
203#define DSI_MAX_NR_ISRS 2 208#define DSI_MAX_NR_ISRS 2
204#define DSI_MAX_NR_LANES 5 209#define DSI_MAX_NR_LANES 5
205 210
@@ -4342,10 +4347,20 @@ int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
4342 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4347 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
4343 struct omap_overlay_manager *mgr = dsi->output.manager; 4348 struct omap_overlay_manager *mgr = dsi->output.manager;
4344 int bpp = dsi_get_pixel_size(dsi->pix_fmt); 4349 int bpp = dsi_get_pixel_size(dsi->pix_fmt);
4350 struct omap_dss_output *out = &dsi->output;
4345 u8 data_type; 4351 u8 data_type;
4346 u16 word_count; 4352 u16 word_count;
4347 int r; 4353 int r;
4348 4354
4355 if (out == NULL || out->manager == NULL) {
4356 DSSERR("failed to enable display: no output/manager\n");
4357 return -ENODEV;
4358 }
4359
4360 r = dsi_display_init_dispc(dsidev, mgr);
4361 if (r)
4362 goto err_init_dispc;
4363
4349 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { 4364 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
4350 switch (dsi->pix_fmt) { 4365 switch (dsi->pix_fmt) {
4351 case OMAP_DSS_DSI_FMT_RGB888: 4366 case OMAP_DSS_DSI_FMT_RGB888:
@@ -4361,8 +4376,8 @@ int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
4361 data_type = MIPI_DSI_PACKED_PIXEL_STREAM_16; 4376 data_type = MIPI_DSI_PACKED_PIXEL_STREAM_16;
4362 break; 4377 break;
4363 default: 4378 default:
4364 BUG(); 4379 r = -EINVAL;
4365 return -EINVAL; 4380 goto err_pix_fmt;
4366 }; 4381 };
4367 4382
4368 dsi_if_enable(dsidev, false); 4383 dsi_if_enable(dsidev, false);
@@ -4381,16 +4396,20 @@ int dsi_enable_video_output(struct omap_dss_device *dssdev, int channel)
4381 } 4396 }
4382 4397
4383 r = dss_mgr_enable(mgr); 4398 r = dss_mgr_enable(mgr);
4384 if (r) { 4399 if (r)
4385 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) { 4400 goto err_mgr_enable;
4386 dsi_if_enable(dsidev, false);
4387 dsi_vc_enable(dsidev, channel, false);
4388 }
4389
4390 return r;
4391 }
4392 4401
4393 return 0; 4402 return 0;
4403
4404err_mgr_enable:
4405 if (dsi->mode == OMAP_DSS_DSI_VIDEO_MODE) {
4406 dsi_if_enable(dsidev, false);
4407 dsi_vc_enable(dsidev, channel, false);
4408 }
4409err_pix_fmt:
4410 dsi_display_uninit_dispc(dsidev, mgr);
4411err_init_dispc:
4412 return r;
4394} 4413}
4395EXPORT_SYMBOL(dsi_enable_video_output); 4414EXPORT_SYMBOL(dsi_enable_video_output);
4396 4415
@@ -4412,6 +4431,8 @@ void dsi_disable_video_output(struct omap_dss_device *dssdev, int channel)
4412 } 4431 }
4413 4432
4414 dss_mgr_disable(mgr); 4433 dss_mgr_disable(mgr);
4434
4435 dsi_display_uninit_dispc(dsidev, mgr);
4415} 4436}
4416EXPORT_SYMBOL(dsi_disable_video_output); 4437EXPORT_SYMBOL(dsi_disable_video_output);
4417 4438
@@ -4605,12 +4626,14 @@ static int dsi_configure_dispc_clocks(struct platform_device *dsidev)
4605 return 0; 4626 return 0;
4606} 4627}
4607 4628
4608static int dsi_display_init_dispc(struct platform_device *dsidev) 4629static int dsi_display_init_dispc(struct platform_device *dsidev,
4630 struct omap_overlay_manager *mgr)
4609{ 4631{
4610 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4632 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
4611 struct omap_overlay_manager *mgr = dsi->output.manager;
4612 int r; 4633 int r;
4613 4634
4635 dss_select_lcd_clk_source(mgr->id, dsi->user_lcd_clk_src);
4636
4614 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) { 4637 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) {
4615 dsi->timings.hsw = 1; 4638 dsi->timings.hsw = 1;
4616 dsi->timings.hfp = 1; 4639 dsi->timings.hfp = 1;
@@ -4663,17 +4686,20 @@ err1:
4663 dss_mgr_unregister_framedone_handler(mgr, 4686 dss_mgr_unregister_framedone_handler(mgr,
4664 dsi_framedone_irq_callback, dsidev); 4687 dsi_framedone_irq_callback, dsidev);
4665err: 4688err:
4689 dss_select_lcd_clk_source(mgr->id, OMAP_DSS_CLK_SRC_FCK);
4666 return r; 4690 return r;
4667} 4691}
4668 4692
4669static void dsi_display_uninit_dispc(struct platform_device *dsidev) 4693static void dsi_display_uninit_dispc(struct platform_device *dsidev,
4694 struct omap_overlay_manager *mgr)
4670{ 4695{
4671 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4696 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
4672 struct omap_overlay_manager *mgr = dsi->output.manager;
4673 4697
4674 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE) 4698 if (dsi->mode == OMAP_DSS_DSI_CMD_MODE)
4675 dss_mgr_unregister_framedone_handler(mgr, 4699 dss_mgr_unregister_framedone_handler(mgr,
4676 dsi_framedone_irq_callback, dsidev); 4700 dsi_framedone_irq_callback, dsidev);
4701
4702 dss_select_lcd_clk_source(mgr->id, OMAP_DSS_CLK_SRC_FCK);
4677} 4703}
4678 4704
4679static int dsi_configure_dsi_clocks(struct platform_device *dsidev) 4705static int dsi_configure_dsi_clocks(struct platform_device *dsidev)
@@ -4702,7 +4728,6 @@ static int dsi_configure_dsi_clocks(struct platform_device *dsidev)
4702static int dsi_display_init_dsi(struct platform_device *dsidev) 4728static int dsi_display_init_dsi(struct platform_device *dsidev)
4703{ 4729{
4704 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4730 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
4705 struct omap_overlay_manager *mgr = dsi->output.manager;
4706 int r; 4731 int r;
4707 4732
4708 r = dsi_pll_init(dsidev, true, true); 4733 r = dsi_pll_init(dsidev, true, true);
@@ -4714,7 +4739,6 @@ static int dsi_display_init_dsi(struct platform_device *dsidev)
4714 goto err1; 4739 goto err1;
4715 4740
4716 dss_select_dsi_clk_source(dsi->module_id, dsi->user_dsi_fclk_src); 4741 dss_select_dsi_clk_source(dsi->module_id, dsi->user_dsi_fclk_src);
4717 dss_select_lcd_clk_source(mgr->id, dsi->user_lcd_clk_src);
4718 4742
4719 DSSDBG("PLL OK\n"); 4743 DSSDBG("PLL OK\n");
4720 4744
@@ -4747,8 +4771,6 @@ err3:
4747 dsi_cio_uninit(dsidev); 4771 dsi_cio_uninit(dsidev);
4748err2: 4772err2:
4749 dss_select_dsi_clk_source(dsi->module_id, OMAP_DSS_CLK_SRC_FCK); 4773 dss_select_dsi_clk_source(dsi->module_id, OMAP_DSS_CLK_SRC_FCK);
4750 dss_select_lcd_clk_source(mgr->id, OMAP_DSS_CLK_SRC_FCK);
4751
4752err1: 4774err1:
4753 dsi_pll_uninit(dsidev, true); 4775 dsi_pll_uninit(dsidev, true);
4754err0: 4776err0:
@@ -4759,7 +4781,6 @@ static void dsi_display_uninit_dsi(struct platform_device *dsidev,
4759 bool disconnect_lanes, bool enter_ulps) 4781 bool disconnect_lanes, bool enter_ulps)
4760{ 4782{
4761 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4783 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
4762 struct omap_overlay_manager *mgr = dsi->output.manager;
4763 4784
4764 if (enter_ulps && !dsi->ulps_enabled) 4785 if (enter_ulps && !dsi->ulps_enabled)
4765 dsi_enter_ulps(dsidev); 4786 dsi_enter_ulps(dsidev);
@@ -4772,7 +4793,6 @@ static void dsi_display_uninit_dsi(struct platform_device *dsidev,
4772 dsi_vc_enable(dsidev, 3, 0); 4793 dsi_vc_enable(dsidev, 3, 0);
4773 4794
4774 dss_select_dsi_clk_source(dsi->module_id, OMAP_DSS_CLK_SRC_FCK); 4795 dss_select_dsi_clk_source(dsi->module_id, OMAP_DSS_CLK_SRC_FCK);
4775 dss_select_lcd_clk_source(mgr->id, OMAP_DSS_CLK_SRC_FCK);
4776 dsi_cio_uninit(dsidev); 4796 dsi_cio_uninit(dsidev);
4777 dsi_pll_uninit(dsidev, disconnect_lanes); 4797 dsi_pll_uninit(dsidev, disconnect_lanes);
4778} 4798}
@@ -4781,7 +4801,6 @@ int omapdss_dsi_display_enable(struct omap_dss_device *dssdev)
4781{ 4801{
4782 struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4802 struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
4783 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4803 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
4784 struct omap_dss_output *out = &dsi->output;
4785 int r = 0; 4804 int r = 0;
4786 4805
4787 DSSDBG("dsi_display_enable\n"); 4806 DSSDBG("dsi_display_enable\n");
@@ -4790,12 +4809,6 @@ int omapdss_dsi_display_enable(struct omap_dss_device *dssdev)
4790 4809
4791 mutex_lock(&dsi->lock); 4810 mutex_lock(&dsi->lock);
4792 4811
4793 if (out == NULL || out->manager == NULL) {
4794 DSSERR("failed to enable display: no output/manager\n");
4795 r = -ENODEV;
4796 goto err_start_dev;
4797 }
4798
4799 r = omap_dss_start_device(dssdev); 4812 r = omap_dss_start_device(dssdev);
4800 if (r) { 4813 if (r) {
4801 DSSERR("failed to start device\n"); 4814 DSSERR("failed to start device\n");
@@ -4810,10 +4823,6 @@ int omapdss_dsi_display_enable(struct omap_dss_device *dssdev)
4810 4823
4811 _dsi_initialize_irq(dsidev); 4824 _dsi_initialize_irq(dsidev);
4812 4825
4813 r = dsi_display_init_dispc(dsidev);
4814 if (r)
4815 goto err_init_dispc;
4816
4817 r = dsi_display_init_dsi(dsidev); 4826 r = dsi_display_init_dsi(dsidev);
4818 if (r) 4827 if (r)
4819 goto err_init_dsi; 4828 goto err_init_dsi;
@@ -4823,8 +4832,6 @@ int omapdss_dsi_display_enable(struct omap_dss_device *dssdev)
4823 return 0; 4832 return 0;
4824 4833
4825err_init_dsi: 4834err_init_dsi:
4826 dsi_display_uninit_dispc(dsidev);
4827err_init_dispc:
4828 dsi_enable_pll_clock(dsidev, 0); 4835 dsi_enable_pll_clock(dsidev, 0);
4829 dsi_runtime_put(dsidev); 4836 dsi_runtime_put(dsidev);
4830err_get_dsi: 4837err_get_dsi:
@@ -4853,8 +4860,6 @@ void omapdss_dsi_display_disable(struct omap_dss_device *dssdev,
4853 dsi_sync_vc(dsidev, 2); 4860 dsi_sync_vc(dsidev, 2);
4854 dsi_sync_vc(dsidev, 3); 4861 dsi_sync_vc(dsidev, 3);
4855 4862
4856 dsi_display_uninit_dispc(dsidev);
4857
4858 dsi_display_uninit_dsi(dsidev, disconnect_lanes, enter_ulps); 4863 dsi_display_uninit_dsi(dsidev, disconnect_lanes, enter_ulps);
4859 4864
4860 dsi_runtime_put(dsidev); 4865 dsi_runtime_put(dsidev);