mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-03 17:14:14 +08:00
OMAPDSS: VENC: Maintain our own timings field in driver data
The VENC driver currently relies on the timings in omap_dss_device struct to configure the DISPC and VENC blocks accordingly. This makes the VENC interface driver dependent on the omap_dss_device struct. Make the VENC driver data maintain it's own timings field. The panel driver is expected to call omapdss_venc_set_timings() to set these timings before the panel is enabled. Call omapdss_venc_set_timings() before enabling venc output, this is done to atleast have the venc output configured to the panel's default timings if the DSS user didn't explicitly call the venc panel driver's set_timings op. Make the VENC panel driver configure the new timings is the omap_dss_device struct(dssdev->panel.timings). The VENC driver is responsible for maintaining only it's own copy of timings. Signed-off-by: Archit Taneja <archit@ti.com>
This commit is contained in:
parent
156fd99e92
commit
a5abf4721b
@ -300,6 +300,8 @@ static struct {
|
||||
struct regulator *vdda_dac_reg;
|
||||
|
||||
struct clk *tv_dac_clk;
|
||||
|
||||
struct omap_video_timings timings;
|
||||
} venc;
|
||||
|
||||
static inline void venc_write_reg(int idx, u32 val)
|
||||
@ -432,7 +434,7 @@ static int venc_power_on(struct omap_dss_device *dssdev)
|
||||
goto err0;
|
||||
|
||||
venc_reset();
|
||||
venc_write_config(venc_timings_to_config(&dssdev->panel.timings));
|
||||
venc_write_config(venc_timings_to_config(&venc.timings));
|
||||
|
||||
dss_set_venc_output(dssdev->phy.venc.type);
|
||||
dss_set_dac_pwrdn_bgz(1);
|
||||
@ -449,7 +451,7 @@ static int venc_power_on(struct omap_dss_device *dssdev)
|
||||
|
||||
venc_write_reg(VENC_OUTPUT_CONTROL, l);
|
||||
|
||||
dss_mgr_set_timings(dssdev->manager, &dssdev->panel.timings);
|
||||
dss_mgr_set_timings(dssdev->manager, &venc.timings);
|
||||
|
||||
r = regulator_enable(venc.vdda_dac_reg);
|
||||
if (r)
|
||||
@ -556,10 +558,10 @@ void omapdss_venc_set_timings(struct omap_dss_device *dssdev,
|
||||
mutex_lock(&venc.venc_lock);
|
||||
|
||||
/* Reset WSS data when the TV standard changes. */
|
||||
if (memcmp(&dssdev->panel.timings, timings, sizeof(*timings)))
|
||||
if (memcmp(&venc.timings, timings, sizeof(*timings)))
|
||||
venc.wss_data = 0;
|
||||
|
||||
dssdev->panel.timings = *timings;
|
||||
venc.timings = *timings;
|
||||
|
||||
if (dssdev->state == OMAP_DSS_DISPLAY_ACTIVE) {
|
||||
int r;
|
||||
@ -606,7 +608,7 @@ int omapdss_venc_set_wss(struct omap_dss_device *dssdev, u32 wss)
|
||||
|
||||
mutex_lock(&venc.venc_lock);
|
||||
|
||||
config = venc_timings_to_config(&dssdev->panel.timings);
|
||||
config = venc_timings_to_config(&venc.timings);
|
||||
|
||||
/* Invert due to VENC_L21_WC_CTL:INV=1 */
|
||||
venc.wss_data = (wss ^ 0xfffff) << 8;
|
||||
|
@ -127,6 +127,8 @@ static int venc_panel_enable(struct omap_dss_device *dssdev)
|
||||
goto err;
|
||||
}
|
||||
|
||||
omapdss_venc_set_timings(dssdev, &dssdev->panel.timings);
|
||||
|
||||
r = omapdss_venc_display_enable(dssdev);
|
||||
if (r)
|
||||
goto err;
|
||||
@ -183,6 +185,7 @@ static void venc_panel_set_timings(struct omap_dss_device *dssdev,
|
||||
mutex_lock(&venc_panel.lock);
|
||||
|
||||
omapdss_venc_set_timings(dssdev, timings);
|
||||
dssdev->panel.timings = *timings;
|
||||
|
||||
mutex_unlock(&venc_panel.lock);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user