Commit 48368395 authored by Tomi Valkeinen's avatar Tomi Valkeinen

OMAPDSS: DSI: Use new lane config in dsi_set_lane_config

Use the new lane config in dsi_set_lane_config().
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent 739a7f46
...@@ -2154,59 +2154,53 @@ static int dsi_parse_lane_config(struct omap_dss_device *dssdev) ...@@ -2154,59 +2154,53 @@ static int dsi_parse_lane_config(struct omap_dss_device *dssdev)
return 0; return 0;
} }
static void dsi_set_lane_config(struct omap_dss_device *dssdev) static int dsi_set_lane_config(struct omap_dss_device *dssdev)
{ {
struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev);
static const u8 offsets[] = { 0, 4, 8, 12, 16 };
static const enum dsi_lane_function functions[] = {
DSI_LANE_CLK,
DSI_LANE_DATA1,
DSI_LANE_DATA2,
DSI_LANE_DATA3,
DSI_LANE_DATA4,
};
u32 r; u32 r;
int num_lanes_used = dsi_get_num_lanes_used(dssdev); int i;
int clk_lane = dssdev->phy.dsi.clk_lane;
int data1_lane = dssdev->phy.dsi.data1_lane;
int data2_lane = dssdev->phy.dsi.data2_lane;
int clk_pol = dssdev->phy.dsi.clk_pol;
int data1_pol = dssdev->phy.dsi.data1_pol;
int data2_pol = dssdev->phy.dsi.data2_pol;
r = dsi_read_reg(dsidev, DSI_COMPLEXIO_CFG1); r = dsi_read_reg(dsidev, DSI_COMPLEXIO_CFG1);
r = FLD_MOD(r, clk_lane, 2, 0);
r = FLD_MOD(r, clk_pol, 3, 3); for (i = 0; i < dsi->num_lanes_used; ++i) {
r = FLD_MOD(r, data1_lane, 6, 4); unsigned offset = offsets[i];
r = FLD_MOD(r, data1_pol, 7, 7); unsigned polarity, lane_number;
r = FLD_MOD(r, data2_lane, 10, 8); unsigned t;
r = FLD_MOD(r, data2_pol, 11, 11);
if (num_lanes_used > 3) { for (t = 0; t < dsi->num_lanes_supported; ++t)
int data3_lane = dssdev->phy.dsi.data3_lane; if (dsi->lanes[t].function == functions[i])
int data3_pol = dssdev->phy.dsi.data3_pol; break;
r = FLD_MOD(r, data3_lane, 14, 12); if (t == dsi->num_lanes_supported)
r = FLD_MOD(r, data3_pol, 15, 15); return -EINVAL;
lane_number = t;
polarity = dsi->lanes[t].polarity;
r = FLD_MOD(r, lane_number + 1, offset + 2, offset);
r = FLD_MOD(r, polarity, offset + 3, offset + 3);
} }
if (num_lanes_used > 4) {
int data4_lane = dssdev->phy.dsi.data4_lane;
int data4_pol = dssdev->phy.dsi.data4_pol;
r = FLD_MOD(r, data4_lane, 18, 16); /* clear the unused lanes */
r = FLD_MOD(r, data4_pol, 19, 19); for (; i < dsi->num_lanes_supported; ++i) {
unsigned offset = offsets[i];
r = FLD_MOD(r, 0, offset + 2, offset);
r = FLD_MOD(r, 0, offset + 3, offset + 3);
} }
dsi_write_reg(dsidev, DSI_COMPLEXIO_CFG1, r);
/* The configuration of the DSI complex I/O (number of data lanes, dsi_write_reg(dsidev, DSI_COMPLEXIO_CFG1, r);
position, differential order) should not be changed while
DSS.DSI_CLK_CRTRL[20] LP_CLK_ENABLE bit is set to 1. In order for
the hardware to take into account a new configuration of the complex
I/O (done in DSS.DSI_COMPLEXIO_CFG1 register), it is recommended to
follow this sequence: First set the DSS.DSI_CTRL[0] IF_EN bit to 1,
then reset the DSS.DSI_CTRL[0] IF_EN to 0, then set
DSS.DSI_CLK_CTRL[20] LP_CLK_ENABLE to 1 and finally set again the
DSS.DSI_CTRL[0] IF_EN bit to 1. If the sequence is not followed, the
DSI complex I/O configuration is unknown. */
/* return 0;
REG_FLD_MOD(dsidev, DSI_CTRL, 1, 0, 0);
REG_FLD_MOD(dsidev, DSI_CTRL, 0, 0, 0);
REG_FLD_MOD(dsidev, DSI_CLK_CTRL, 1, 20, 20);
REG_FLD_MOD(dsidev, DSI_CTRL, 1, 0, 0);
*/
} }
static inline unsigned ns2ddr(struct platform_device *dsidev, unsigned ns) static inline unsigned ns2ddr(struct platform_device *dsidev, unsigned ns)
...@@ -2473,7 +2467,9 @@ static int dsi_cio_init(struct omap_dss_device *dssdev) ...@@ -2473,7 +2467,9 @@ static int dsi_cio_init(struct omap_dss_device *dssdev)
goto err_scp_clk_dom; goto err_scp_clk_dom;
} }
dsi_set_lane_config(dssdev); r = dsi_set_lane_config(dssdev);
if (r)
goto err_scp_clk_dom;
/* set TX STOP MODE timer to maximum for this operation */ /* set TX STOP MODE timer to maximum for this operation */
l = dsi_read_reg(dsidev, DSI_TIMING1); l = dsi_read_reg(dsidev, DSI_TIMING1);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment