提交 a2faee84 编写于 作者: T Tomi Valkeinen

OMAP: DSS2: move enable/disable_channel to overlay manager

Move enable/disable_channel() from omap_dss_device to overlay manager.

This is part of a larger patch-set, which moves the control from omapdss
driver to the display driver.
Signed-off-by: NTomi Valkeinen <tomi.valkeinen@nokia.com>
上级 3f71cbe7
...@@ -371,6 +371,9 @@ struct omap_overlay_manager { ...@@ -371,6 +371,9 @@ struct omap_overlay_manager {
int (*apply)(struct omap_overlay_manager *mgr); int (*apply)(struct omap_overlay_manager *mgr);
int (*wait_for_go)(struct omap_overlay_manager *mgr); int (*wait_for_go)(struct omap_overlay_manager *mgr);
int (*wait_for_vsync)(struct omap_overlay_manager *mgr); int (*wait_for_vsync)(struct omap_overlay_manager *mgr);
int (*enable)(struct omap_overlay_manager *mgr);
int (*disable)(struct omap_overlay_manager *mgr);
}; };
struct omap_dss_device { struct omap_dss_device {
......
...@@ -1725,7 +1725,7 @@ static void _enable_lcd_out(bool enable) ...@@ -1725,7 +1725,7 @@ static void _enable_lcd_out(bool enable)
REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 0, 0); REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 0, 0);
} }
void dispc_enable_lcd_out(bool enable) static void dispc_enable_lcd_out(bool enable)
{ {
struct completion frame_done_completion; struct completion frame_done_completion;
bool is_on; bool is_on;
...@@ -1772,7 +1772,7 @@ static void _enable_digit_out(bool enable) ...@@ -1772,7 +1772,7 @@ static void _enable_digit_out(bool enable)
REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 1, 1); REG_FLD_MOD(DISPC_CONTROL, enable ? 1 : 0, 1, 1);
} }
void dispc_enable_digit_out(bool enable) static void dispc_enable_digit_out(bool enable)
{ {
struct completion frame_done_completion; struct completion frame_done_completion;
int r; int r;
...@@ -1836,6 +1836,26 @@ void dispc_enable_digit_out(bool enable) ...@@ -1836,6 +1836,26 @@ void dispc_enable_digit_out(bool enable)
enable_clocks(0); enable_clocks(0);
} }
bool dispc_is_channel_enabled(enum omap_channel channel)
{
if (channel == OMAP_DSS_CHANNEL_LCD)
return !!REG_GET(DISPC_CONTROL, 0, 0);
else if (channel == OMAP_DSS_CHANNEL_DIGIT)
return !!REG_GET(DISPC_CONTROL, 1, 1);
else
BUG();
}
void dispc_enable_channel(enum omap_channel channel, bool enable)
{
if (channel == OMAP_DSS_CHANNEL_LCD)
dispc_enable_lcd_out(enable);
else if (channel == OMAP_DSS_CHANNEL_DIGIT)
dispc_enable_digit_out(enable);
else
BUG();
}
void dispc_lcd_enable_signal_polarity(bool act_high) void dispc_lcd_enable_signal_polarity(bool act_high)
{ {
enable_clocks(1); enable_clocks(1);
......
...@@ -194,7 +194,7 @@ static int dpi_display_enable(struct omap_dss_device *dssdev) ...@@ -194,7 +194,7 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
mdelay(2); mdelay(2);
dispc_enable_lcd_out(1); dssdev->manager->enable(dssdev->manager);
r = dssdev->driver->enable(dssdev); r = dssdev->driver->enable(dssdev);
if (r) if (r)
...@@ -205,7 +205,7 @@ static int dpi_display_enable(struct omap_dss_device *dssdev) ...@@ -205,7 +205,7 @@ static int dpi_display_enable(struct omap_dss_device *dssdev)
return 0; return 0;
err6: err6:
dispc_enable_lcd_out(0); dssdev->manager->disable(dssdev->manager);
err5: err5:
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
dsi_pll_uninit(); dsi_pll_uninit();
...@@ -235,7 +235,7 @@ static void dpi_display_disable(struct omap_dss_device *dssdev) ...@@ -235,7 +235,7 @@ static void dpi_display_disable(struct omap_dss_device *dssdev)
dssdev->driver->disable(dssdev); dssdev->driver->disable(dssdev);
dispc_enable_lcd_out(0); dssdev->manager->disable(dssdev->manager);
#ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL #ifdef CONFIG_OMAP2_DSS_USE_DSI_PLL
dss_select_dispc_clk_source(DSS_SRC_DSS1_ALWON_FCLK); dss_select_dispc_clk_source(DSS_SRC_DSS1_ALWON_FCLK);
...@@ -263,7 +263,7 @@ static int dpi_display_suspend(struct omap_dss_device *dssdev) ...@@ -263,7 +263,7 @@ static int dpi_display_suspend(struct omap_dss_device *dssdev)
if (dssdev->driver->suspend) if (dssdev->driver->suspend)
dssdev->driver->suspend(dssdev); dssdev->driver->suspend(dssdev);
dispc_enable_lcd_out(0); dssdev->manager->disable(dssdev->manager);
dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
...@@ -292,7 +292,7 @@ static int dpi_display_resume(struct omap_dss_device *dssdev) ...@@ -292,7 +292,7 @@ static int dpi_display_resume(struct omap_dss_device *dssdev)
dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1); dss_clk_enable(DSS_CLK_ICK | DSS_CLK_FCK1);
dispc_enable_lcd_out(1); dssdev->manager->enable(dssdev->manager);
if (dssdev->driver->resume) if (dssdev->driver->resume)
dssdev->driver->resume(dssdev); dssdev->driver->resume(dssdev);
...@@ -383,10 +383,10 @@ static int dpi_display_set_update_mode(struct omap_dss_device *dssdev, ...@@ -383,10 +383,10 @@ static int dpi_display_set_update_mode(struct omap_dss_device *dssdev,
return -EINVAL; return -EINVAL;
if (mode == OMAP_DSS_UPDATE_DISABLED) { if (mode == OMAP_DSS_UPDATE_DISABLED) {
dispc_enable_lcd_out(0); dssdev->manager->disable(dssdev->manager);
dpi.update_enabled = 0; dpi.update_enabled = 0;
} else { } else {
dispc_enable_lcd_out(1); dssdev->manager->enable(dssdev->manager);
dpi.update_enabled = 1; dpi.update_enabled = 1;
} }
......
...@@ -3013,7 +3013,7 @@ static int dsi_update_thread(void *data) ...@@ -3013,7 +3013,7 @@ static int dsi_update_thread(void *data)
x, y, w, h); x, y, w, h);
dispc_enable_sidle(); dispc_enable_sidle();
dispc_enable_lcd_out(0); device->manager->disable(device->manager);
dsi_reset_tx_fifo(0); dsi_reset_tx_fifo(0);
} else { } else {
......
...@@ -324,8 +324,8 @@ int dispc_setup_plane(enum omap_plane plane, ...@@ -324,8 +324,8 @@ int dispc_setup_plane(enum omap_plane plane,
bool dispc_go_busy(enum omap_channel channel); bool dispc_go_busy(enum omap_channel channel);
void dispc_go(enum omap_channel channel); void dispc_go(enum omap_channel channel);
void dispc_enable_lcd_out(bool enable); void dispc_enable_channel(enum omap_channel channel, bool enable);
void dispc_enable_digit_out(bool enable); bool dispc_is_channel_enabled(enum omap_channel channel);
int dispc_enable_plane(enum omap_plane plane, bool enable); int dispc_enable_plane(enum omap_plane plane, bool enable);
void dispc_enable_replication(enum omap_plane plane, bool enable); void dispc_enable_replication(enum omap_plane plane, bool enable);
......
...@@ -1077,7 +1077,7 @@ void dss_start_update(struct omap_dss_device *dssdev) ...@@ -1077,7 +1077,7 @@ void dss_start_update(struct omap_dss_device *dssdev)
mc->shadow_dirty = false; mc->shadow_dirty = false;
} }
dispc_enable_lcd_out(1); dssdev->manager->enable(dssdev->manager);
} }
static void dss_apply_irq_handler(void *data, u32 mask) static void dss_apply_irq_handler(void *data, u32 mask)
...@@ -1364,6 +1364,18 @@ static void omap_dss_mgr_get_info(struct omap_overlay_manager *mgr, ...@@ -1364,6 +1364,18 @@ static void omap_dss_mgr_get_info(struct omap_overlay_manager *mgr,
*info = mgr->info; *info = mgr->info;
} }
static int dss_mgr_enable(struct omap_overlay_manager *mgr)
{
dispc_enable_channel(mgr->id, 1);
return 0;
}
static int dss_mgr_disable(struct omap_overlay_manager *mgr)
{
dispc_enable_channel(mgr->id, 0);
return 0;
}
static void omap_dss_add_overlay_manager(struct omap_overlay_manager *manager) static void omap_dss_add_overlay_manager(struct omap_overlay_manager *manager)
{ {
++num_managers; ++num_managers;
...@@ -1409,6 +1421,9 @@ int dss_init_overlay_managers(struct platform_device *pdev) ...@@ -1409,6 +1421,9 @@ int dss_init_overlay_managers(struct platform_device *pdev)
mgr->wait_for_go = &dss_mgr_wait_for_go; mgr->wait_for_go = &dss_mgr_wait_for_go;
mgr->wait_for_vsync = &dss_mgr_wait_for_vsync; mgr->wait_for_vsync = &dss_mgr_wait_for_vsync;
mgr->enable = &dss_mgr_enable;
mgr->disable = &dss_mgr_disable;
mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC; mgr->caps = OMAP_DSS_OVL_MGR_CAP_DISPC;
dss_overlay_setup_dispc_manager(mgr); dss_overlay_setup_dispc_manager(mgr);
......
...@@ -382,7 +382,7 @@ void rfbi_transfer_area(u16 width, u16 height, ...@@ -382,7 +382,7 @@ void rfbi_transfer_area(u16 width, u16 height,
dispc_set_lcd_size(width, height); dispc_set_lcd_size(width, height);
dispc_enable_lcd_out(1); dispc_enable_channel(OMAP_DSS_CHANNEL_LCD, true);
rfbi.framedone_callback = callback; rfbi.framedone_callback = callback;
rfbi.framedone_callback_data = data; rfbi.framedone_callback_data = data;
......
...@@ -119,7 +119,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev) ...@@ -119,7 +119,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
mdelay(2); mdelay(2);
} }
dispc_enable_lcd_out(1); dssdev->manager->enable(dssdev->manager);
if (dssdev->driver->enable) { if (dssdev->driver->enable) {
r = dssdev->driver->enable(dssdev); r = dssdev->driver->enable(dssdev);
...@@ -133,7 +133,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev) ...@@ -133,7 +133,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
return 0; return 0;
err3: err3:
dispc_enable_lcd_out(0); dssdev->manager->disable(dssdev->manager);
err2: err2:
dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1); dss_clk_disable(DSS_CLK_ICK | DSS_CLK_FCK1);
err1: err1:
...@@ -156,7 +156,7 @@ static void sdi_display_disable(struct omap_dss_device *dssdev) ...@@ -156,7 +156,7 @@ static void sdi_display_disable(struct omap_dss_device *dssdev)
if (dssdev->driver->disable) if (dssdev->driver->disable)
dssdev->driver->disable(dssdev); dssdev->driver->disable(dssdev);
dispc_enable_lcd_out(0); dssdev->manager->disable(dssdev->manager);
dss_sdi_disable(); dss_sdi_disable();
...@@ -175,7 +175,7 @@ static int sdi_display_suspend(struct omap_dss_device *dssdev) ...@@ -175,7 +175,7 @@ static int sdi_display_suspend(struct omap_dss_device *dssdev)
if (dssdev->driver->suspend) if (dssdev->driver->suspend)
dssdev->driver->suspend(dssdev); dssdev->driver->suspend(dssdev);
dispc_enable_lcd_out(0); dssdev->manager->disable(dssdev->manager);
dss_sdi_disable(); dss_sdi_disable();
...@@ -200,7 +200,7 @@ static int sdi_display_resume(struct omap_dss_device *dssdev) ...@@ -200,7 +200,7 @@ static int sdi_display_resume(struct omap_dss_device *dssdev)
goto err; goto err;
mdelay(2); mdelay(2);
dispc_enable_lcd_out(1); dssdev->manager->enable(dssdev->manager);
if (dssdev->driver->resume) if (dssdev->driver->resume)
dssdev->driver->resume(dssdev); dssdev->driver->resume(dssdev);
...@@ -220,10 +220,10 @@ static int sdi_display_set_update_mode(struct omap_dss_device *dssdev, ...@@ -220,10 +220,10 @@ static int sdi_display_set_update_mode(struct omap_dss_device *dssdev,
return -EINVAL; return -EINVAL;
if (mode == OMAP_DSS_UPDATE_DISABLED) { if (mode == OMAP_DSS_UPDATE_DISABLED) {
dispc_enable_lcd_out(0); dssdev->manager->disable(dssdev->manager);
sdi.update_enabled = 0; sdi.update_enabled = 0;
} else { } else {
dispc_enable_lcd_out(1); dssdev->manager->enable(dssdev->manager);
sdi.update_enabled = 1; sdi.update_enabled = 1;
} }
......
...@@ -538,7 +538,7 @@ static void venc_power_on(struct omap_dss_device *dssdev) ...@@ -538,7 +538,7 @@ static void venc_power_on(struct omap_dss_device *dssdev)
if (dssdev->platform_enable) if (dssdev->platform_enable)
dssdev->platform_enable(dssdev); dssdev->platform_enable(dssdev);
dispc_enable_digit_out(1); dssdev->manager->enable(dssdev->manager);
} }
static void venc_power_off(struct omap_dss_device *dssdev) static void venc_power_off(struct omap_dss_device *dssdev)
...@@ -546,7 +546,7 @@ static void venc_power_off(struct omap_dss_device *dssdev) ...@@ -546,7 +546,7 @@ static void venc_power_off(struct omap_dss_device *dssdev)
venc_write_reg(VENC_OUTPUT_CONTROL, 0); venc_write_reg(VENC_OUTPUT_CONTROL, 0);
dss_set_dac_pwrdn_bgz(0); dss_set_dac_pwrdn_bgz(0);
dispc_enable_digit_out(0); dssdev->manager->disable(dssdev->manager);
if (dssdev->platform_disable) if (dssdev->platform_disable)
dssdev->platform_disable(dssdev); dssdev->platform_disable(dssdev);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册