aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/arm/mach-omap2/display.c14
-rw-r--r--drivers/video/omap2/dss/dsi.c42
-rw-r--r--include/video/omapdss.h3
3 files changed, 47 insertions, 12 deletions
diff --git a/arch/arm/mach-omap2/display.c b/arch/arm/mach-omap2/display.c
index c42df111c9d2..7c6011df80a8 100644
--- a/arch/arm/mach-omap2/display.c
+++ b/arch/arm/mach-omap2/display.c
@@ -74,6 +74,15 @@ static const struct omap_dss_hwmod_data omap4_dss_hwmod_data[] __initdata = {
74 { "dss_hdmi", "omapdss_hdmi", -1 }, 74 { "dss_hdmi", "omapdss_hdmi", -1 },
75}; 75};
76 76
77static int omap_dsi_enable_pads(int dsi_id, unsigned lane_mask)
78{
79 return 0;
80}
81
82static void omap_dsi_disable_pads(int dsi_id, unsigned lane_mask)
83{
84}
85
77int __init omap_display_init(struct omap_dss_board_info *board_data) 86int __init omap_display_init(struct omap_dss_board_info *board_data)
78{ 87{
79 int r = 0; 88 int r = 0;
@@ -96,6 +105,11 @@ int __init omap_display_init(struct omap_dss_board_info *board_data)
96 oh_count = ARRAY_SIZE(omap4_dss_hwmod_data); 105 oh_count = ARRAY_SIZE(omap4_dss_hwmod_data);
97 } 106 }
98 107
108 if (board_data->dsi_enable_pads == NULL)
109 board_data->dsi_enable_pads = omap_dsi_enable_pads;
110 if (board_data->dsi_disable_pads == NULL)
111 board_data->dsi_disable_pads = omap_dsi_disable_pads;
112
99 pdata.board_data = board_data; 113 pdata.board_data = board_data;
100 pdata.board_data->get_context_loss_count = 114 pdata.board_data->get_context_loss_count =
101 omap_pm_get_dev_context_loss_count; 115 omap_pm_get_dev_context_loss_count;
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
index 713e1d9ac0ec..ae6bf1d46c97 100644
--- a/drivers/video/omap2/dss/dsi.c
+++ b/drivers/video/omap2/dss/dsi.c
@@ -274,7 +274,8 @@ struct dsi_data {
274 struct clk *dss_clk; 274 struct clk *dss_clk;
275 struct clk *sys_clk; 275 struct clk *sys_clk;
276 276
277 void (*dsi_mux_pads)(bool enable); 277 int (*enable_pads)(int dsi_id, unsigned lane_mask);
278 void (*disable_pads)(int dsi_id, unsigned lane_mask);
278 279
279 struct dsi_clock_info current_cinfo; 280 struct dsi_clock_info current_cinfo;
280 281
@@ -2355,6 +2356,24 @@ static int dsi_cio_wait_tx_clk_esc_reset(struct omap_dss_device *dssdev)
2355 return 0; 2356 return 0;
2356} 2357}
2357 2358
2359static unsigned dsi_get_lane_mask(struct omap_dss_device *dssdev)
2360{
2361 unsigned lanes = 0;
2362
2363 if (dssdev->phy.dsi.clk_lane != 0)
2364 lanes |= 1 << (dssdev->phy.dsi.clk_lane - 1);
2365 if (dssdev->phy.dsi.data1_lane != 0)
2366 lanes |= 1 << (dssdev->phy.dsi.data1_lane - 1);
2367 if (dssdev->phy.dsi.data2_lane != 0)
2368 lanes |= 1 << (dssdev->phy.dsi.data2_lane - 1);
2369 if (dssdev->phy.dsi.data3_lane != 0)
2370 lanes |= 1 << (dssdev->phy.dsi.data3_lane - 1);
2371 if (dssdev->phy.dsi.data4_lane != 0)
2372 lanes |= 1 << (dssdev->phy.dsi.data4_lane - 1);
2373
2374 return lanes;
2375}
2376
2358static int dsi_cio_init(struct omap_dss_device *dssdev) 2377static int dsi_cio_init(struct omap_dss_device *dssdev)
2359{ 2378{
2360 struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 2379 struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
@@ -2365,8 +2384,9 @@ static int dsi_cio_init(struct omap_dss_device *dssdev)
2365 2384
2366 DSSDBGF(); 2385 DSSDBGF();
2367 2386
2368 if (dsi->dsi_mux_pads) 2387 r = dsi->enable_pads(dsidev->id, dsi_get_lane_mask(dssdev));
2369 dsi->dsi_mux_pads(true); 2388 if (r)
2389 return r;
2370 2390
2371 dsi_enable_scp_clk(dsidev); 2391 dsi_enable_scp_clk(dsidev);
2372 2392
@@ -2462,19 +2482,18 @@ err_cio_pwr:
2462 dsi_cio_disable_lane_override(dsidev); 2482 dsi_cio_disable_lane_override(dsidev);
2463err_scp_clk_dom: 2483err_scp_clk_dom:
2464 dsi_disable_scp_clk(dsidev); 2484 dsi_disable_scp_clk(dsidev);
2465 if (dsi->dsi_mux_pads) 2485 dsi->disable_pads(dsidev->id, dsi_get_lane_mask(dssdev));
2466 dsi->dsi_mux_pads(false);
2467 return r; 2486 return r;
2468} 2487}
2469 2488
2470static void dsi_cio_uninit(struct platform_device *dsidev) 2489static void dsi_cio_uninit(struct omap_dss_device *dssdev)
2471{ 2490{
2491 struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
2472 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 2492 struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
2473 2493
2474 dsi_cio_power(dsidev, DSI_COMPLEXIO_POWER_OFF); 2494 dsi_cio_power(dsidev, DSI_COMPLEXIO_POWER_OFF);
2475 dsi_disable_scp_clk(dsidev); 2495 dsi_disable_scp_clk(dsidev);
2476 if (dsi->dsi_mux_pads) 2496 dsi->disable_pads(dsidev->id, dsi_get_lane_mask(dssdev));
2477 dsi->dsi_mux_pads(false);
2478} 2497}
2479 2498
2480static void dsi_config_tx_fifo(struct platform_device *dsidev, 2499static void dsi_config_tx_fifo(struct platform_device *dsidev,
@@ -4161,7 +4180,7 @@ static int dsi_display_init_dsi(struct omap_dss_device *dssdev)
4161 4180
4162 return 0; 4181 return 0;
4163err3: 4182err3:
4164 dsi_cio_uninit(dsidev); 4183 dsi_cio_uninit(dssdev);
4165err2: 4184err2:
4166 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); 4185 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
4167 dss_select_dsi_clk_source(dsi_module, OMAP_DSS_CLK_SRC_FCK); 4186 dss_select_dsi_clk_source(dsi_module, OMAP_DSS_CLK_SRC_FCK);
@@ -4190,7 +4209,7 @@ static void dsi_display_uninit_dsi(struct omap_dss_device *dssdev,
4190 4209
4191 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); 4210 dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
4192 dss_select_dsi_clk_source(dsi_module, OMAP_DSS_CLK_SRC_FCK); 4211 dss_select_dsi_clk_source(dsi_module, OMAP_DSS_CLK_SRC_FCK);
4193 dsi_cio_uninit(dsidev); 4212 dsi_cio_uninit(dssdev);
4194 dsi_pll_uninit(dsidev, disconnect_lanes); 4213 dsi_pll_uninit(dsidev, disconnect_lanes);
4195} 4214}
4196 4215
@@ -4481,7 +4500,8 @@ static int omap_dsihw_probe(struct platform_device *dsidev)
4481 4500
4482 dss_plat_data = dsidev->dev.platform_data; 4501 dss_plat_data = dsidev->dev.platform_data;
4483 board_info = dss_plat_data->board_data; 4502 board_info = dss_plat_data->board_data;
4484 dsi->dsi_mux_pads = board_info->dsi_mux_pads; 4503 dsi->enable_pads = board_info->dsi_enable_pads;
4504 dsi->disable_pads = board_info->dsi_disable_pads;
4485 4505
4486 spin_lock_init(&dsi->irq_lock); 4506 spin_lock_init(&dsi->irq_lock);
4487 spin_lock_init(&dsi->errors_lock); 4507 spin_lock_init(&dsi->errors_lock);
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index 3b55ef22f8db..c4d1d4ed909f 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -242,7 +242,8 @@ struct omap_dss_board_info {
242 int num_devices; 242 int num_devices;
243 struct omap_dss_device **devices; 243 struct omap_dss_device **devices;
244 struct omap_dss_device *default_device; 244 struct omap_dss_device *default_device;
245 void (*dsi_mux_pads)(bool enable); 245 int (*dsi_enable_pads)(int dsi_id, unsigned lane_mask);
246 void (*dsi_disable_pads)(int dsi_id, unsigned lane_mask);
246}; 247};
247 248
248#if defined(CONFIG_OMAP2_DSS_MODULE) || defined(CONFIG_OMAP2_DSS) 249#if defined(CONFIG_OMAP2_DSS_MODULE) || defined(CONFIG_OMAP2_DSS)