Commit 569969d6 authored by Archit Taneja's avatar Archit Taneja Committed by Tomi Valkeinen

OMAP: DSS2: Clean up stallmode and io pad mode selection

Split the function dispc_set_parallel_interface_mode() into 2 separate
functions called dispc_mgr_set_io_pad_mode() and dispc_mgr_enable_stallmode().
The current function tries to set 2 different modes(io pad mode and stall mode)
based on a parameter omap_parallel_interface_mode which loosely corresponds to
the panel interface type.

This isn't correct because a) these 2 modes are independent to some extent,
b) we are currently configuring gpout0/gpout1 for DSI panels which is
unnecessary, c) a DSI Video mode panel won't get configured correctly.

Splitting the functions allows the interface driver to set these modes
independently and hence allow more flexibility.
Signed-off-by: default avatarArchit Taneja <archit@ti.com>
Signed-off-by: default avatarTomi Valkeinen <tomi.valkeinen@ti.com>
parent b3b89c05
...@@ -2205,46 +2205,41 @@ void dispc_mgr_set_tft_data_lines(enum omap_channel channel, u8 data_lines) ...@@ -2205,46 +2205,41 @@ void dispc_mgr_set_tft_data_lines(enum omap_channel channel, u8 data_lines)
REG_FLD_MOD(DISPC_CONTROL, code, 9, 8); REG_FLD_MOD(DISPC_CONTROL, code, 9, 8);
} }
void dispc_mgr_set_parallel_interface_mode(enum omap_channel channel, void dispc_mgr_set_io_pad_mode(enum dss_io_pad_mode mode)
enum omap_parallel_interface_mode mode)
{ {
u32 l; u32 l;
int stallmode; int gpout0, gpout1;
int gpout0 = 1;
int gpout1;
switch (mode) { switch (mode) {
case OMAP_DSS_PARALLELMODE_BYPASS: case DSS_IO_PAD_MODE_RESET:
stallmode = 0; gpout0 = 0;
gpout1 = 1; gpout1 = 0;
break; break;
case DSS_IO_PAD_MODE_RFBI:
case OMAP_DSS_PARALLELMODE_RFBI: gpout0 = 1;
stallmode = 1;
gpout1 = 0; gpout1 = 0;
break; break;
case DSS_IO_PAD_MODE_BYPASS:
case OMAP_DSS_PARALLELMODE_DSI: gpout0 = 1;
stallmode = 1;
gpout1 = 1; gpout1 = 1;
break; break;
default: default:
BUG(); BUG();
return; return;
} }
if (channel == OMAP_DSS_CHANNEL_LCD2) { l = dispc_read_reg(DISPC_CONTROL);
l = dispc_read_reg(DISPC_CONTROL2); l = FLD_MOD(l, gpout0, 15, 15);
l = FLD_MOD(l, stallmode, 11, 11); l = FLD_MOD(l, gpout1, 16, 16);
dispc_write_reg(DISPC_CONTROL2, l); dispc_write_reg(DISPC_CONTROL, l);
} else { }
l = dispc_read_reg(DISPC_CONTROL);
l = FLD_MOD(l, stallmode, 11, 11); void dispc_mgr_enable_stallmode(enum omap_channel channel, bool enable)
l = FLD_MOD(l, gpout0, 15, 15); {
l = FLD_MOD(l, gpout1, 16, 16); if (channel == OMAP_DSS_CHANNEL_LCD2)
dispc_write_reg(DISPC_CONTROL, l); REG_FLD_MOD(DISPC_CONTROL2, enable, 11, 11);
} else
REG_FLD_MOD(DISPC_CONTROL, enable, 11, 11);
} }
static bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp, static bool _dispc_lcd_timings_ok(int hsw, int hfp, int hbp,
......
...@@ -166,8 +166,9 @@ static void dpi_basic_init(struct omap_dss_device *dssdev) ...@@ -166,8 +166,9 @@ static void dpi_basic_init(struct omap_dss_device *dssdev)
is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0; is_tft = (dssdev->panel.config & OMAP_DSS_LCD_TFT) != 0;
dispc_mgr_set_parallel_interface_mode(dssdev->manager->id, dispc_mgr_set_io_pad_mode(DSS_IO_PAD_MODE_BYPASS);
OMAP_DSS_PARALLELMODE_BYPASS); dispc_mgr_enable_stallmode(dssdev->manager->id, false);
dispc_mgr_set_lcd_display_type(dssdev->manager->id, is_tft ? dispc_mgr_set_lcd_display_type(dssdev->manager->id, is_tft ?
OMAP_DSS_LCD_DISPLAY_TFT : OMAP_DSS_LCD_DISPLAY_STN); OMAP_DSS_LCD_DISPLAY_TFT : OMAP_DSS_LCD_DISPLAY_STN);
dispc_mgr_set_tft_data_lines(dssdev->manager->id, dispc_mgr_set_tft_data_lines(dssdev->manager->id,
......
...@@ -4019,8 +4019,7 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev) ...@@ -4019,8 +4019,7 @@ static int dsi_display_init_dispc(struct omap_dss_device *dssdev)
dispc_mgr_set_lcd_display_type(dssdev->manager->id, dispc_mgr_set_lcd_display_type(dssdev->manager->id,
OMAP_DSS_LCD_DISPLAY_TFT); OMAP_DSS_LCD_DISPLAY_TFT);
dispc_mgr_set_parallel_interface_mode(dssdev->manager->id, dispc_mgr_enable_stallmode(dssdev->manager->id, true);
OMAP_DSS_PARALLELMODE_DSI);
dispc_mgr_enable_fifohandcheck(dssdev->manager->id, 1); dispc_mgr_enable_fifohandcheck(dssdev->manager->id, 1);
dispc_mgr_set_tft_data_lines(dssdev->manager->id, dispc_mgr_set_tft_data_lines(dssdev->manager->id,
......
...@@ -97,10 +97,10 @@ extern unsigned int dss_debug; ...@@ -97,10 +97,10 @@ extern unsigned int dss_debug;
#define FLD_MOD(orig, val, start, end) \ #define FLD_MOD(orig, val, start, end) \
(((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end)) (((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end))
enum omap_parallel_interface_mode { enum dss_io_pad_mode {
OMAP_DSS_PARALLELMODE_BYPASS, /* MIPI DPI */ DSS_IO_PAD_MODE_RESET,
OMAP_DSS_PARALLELMODE_RFBI, /* MIPI DBI */ DSS_IO_PAD_MODE_RFBI,
OMAP_DSS_PARALLELMODE_DSI, DSS_IO_PAD_MODE_BYPASS,
}; };
enum dss_hdmi_venc_clk_source_select { enum dss_hdmi_venc_clk_source_select {
...@@ -429,8 +429,8 @@ bool dispc_mgr_go_busy(enum omap_channel channel); ...@@ -429,8 +429,8 @@ bool dispc_mgr_go_busy(enum omap_channel channel);
void dispc_mgr_go(enum omap_channel channel); void dispc_mgr_go(enum omap_channel channel);
void dispc_mgr_enable(enum omap_channel channel, bool enable); void dispc_mgr_enable(enum omap_channel channel, bool enable);
bool dispc_mgr_is_channel_enabled(enum omap_channel channel); bool dispc_mgr_is_channel_enabled(enum omap_channel channel);
void dispc_mgr_set_parallel_interface_mode(enum omap_channel channel, void dispc_mgr_set_io_pad_mode(enum dss_io_pad_mode mode);
enum omap_parallel_interface_mode mode); void dispc_mgr_enable_stallmode(enum omap_channel channel, bool enable);
void dispc_mgr_set_tft_data_lines(enum omap_channel channel, u8 data_lines); void dispc_mgr_set_tft_data_lines(enum omap_channel channel, u8 data_lines);
void dispc_mgr_set_lcd_display_type(enum omap_channel channel, void dispc_mgr_set_lcd_display_type(enum omap_channel channel,
enum omap_lcd_display_type type); enum omap_lcd_display_type type);
......
...@@ -868,8 +868,8 @@ int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev) ...@@ -868,8 +868,8 @@ int omapdss_rfbi_display_enable(struct omap_dss_device *dssdev)
dispc_mgr_set_lcd_display_type(dssdev->manager->id, dispc_mgr_set_lcd_display_type(dssdev->manager->id,
OMAP_DSS_LCD_DISPLAY_TFT); OMAP_DSS_LCD_DISPLAY_TFT);
dispc_mgr_set_parallel_interface_mode(dssdev->manager->id, dispc_mgr_set_io_pad_mode(DSS_IO_PAD_MODE_RFBI);
OMAP_DSS_PARALLELMODE_RFBI); dispc_mgr_enable_stallmode(dssdev->manager->id, true);
dispc_mgr_set_tft_data_lines(dssdev->manager->id, dssdev->ctrl.pixel_size); dispc_mgr_set_tft_data_lines(dssdev->manager->id, dssdev->ctrl.pixel_size);
......
...@@ -35,8 +35,8 @@ static struct { ...@@ -35,8 +35,8 @@ static struct {
static void sdi_basic_init(struct omap_dss_device *dssdev) static void sdi_basic_init(struct omap_dss_device *dssdev)
{ {
dispc_mgr_set_parallel_interface_mode(dssdev->manager->id, dispc_mgr_set_io_pad_mode(DSS_IO_PAD_MODE_BYPASS);
OMAP_DSS_PARALLELMODE_BYPASS); dispc_mgr_enable_stallmode(dssdev->manager->id, false);
dispc_mgr_set_lcd_display_type(dssdev->manager->id, dispc_mgr_set_lcd_display_type(dssdev->manager->id,
OMAP_DSS_LCD_DISPLAY_TFT); OMAP_DSS_LCD_DISPLAY_TFT);
......
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