Skip to content

Commit

Permalink
Merge "Apply LCD manager related parameters" from Archit
Browse files Browse the repository at this point in the history
The LCD interface drivers(DPI, DSI, RFBI, SDI) do some direct DISPC register
writes to configure LCD manager related fields. This series groups these fields
into a single struct, and let's the interface driver apply these parameters.

This allows us to:

- Check the LCD manager related parameters before applying them.
- Remove some omap_dss_device references as APPLY holds the applied parameters.

Signed-off-by: Tomi Valkeinen <tomi.valkeinen@ti.com>
  • Loading branch information
Tomi Valkeinen committed Jun 29, 2012
2 parents 465698e + 6c6f510 commit 974a658
Show file tree
Hide file tree
Showing 10 changed files with 271 additions and 146 deletions.
85 changes: 81 additions & 4 deletions drivers/video/omap2/dss/apply.c
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ struct mgr_priv_data {
bool shadow_extra_info_dirty;

struct omap_video_timings timings;
struct dss_lcd_mgr_config lcd_config;
};

static struct {
Expand Down Expand Up @@ -137,6 +138,7 @@ static struct mgr_priv_data *get_mgr_priv(struct omap_overlay_manager *mgr)
void dss_apply_init(void)
{
const int num_ovls = dss_feat_get_num_ovls();
struct mgr_priv_data *mp;
int i;

spin_lock_init(&data_lock);
Expand Down Expand Up @@ -168,16 +170,35 @@ void dss_apply_init(void)

op->user_info = op->info;
}

/*
* Initialize some of the lcd_config fields for TV manager, this lets
* us prevent checking if the manager is LCD or TV at some places
*/
mp = &dss_data.mgr_priv_data_array[OMAP_DSS_CHANNEL_DIGIT];

mp->lcd_config.video_port_width = 24;
mp->lcd_config.clock_info.lck_div = 1;
mp->lcd_config.clock_info.pck_div = 1;
}

/*
* A LCD manager's stallmode decides whether it is in manual or auto update. TV
* manager is always auto update, stallmode field for TV manager is false by
* default
*/
static bool ovl_manual_update(struct omap_overlay *ovl)
{
return ovl->manager->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
struct mgr_priv_data *mp = get_mgr_priv(ovl->manager);

return mp->lcd_config.stallmode;
}

static bool mgr_manual_update(struct omap_overlay_manager *mgr)
{
return mgr->device->caps & OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE;
struct mgr_priv_data *mp = get_mgr_priv(mgr);

return mp->lcd_config.stallmode;
}

static int dss_check_settings_low(struct omap_overlay_manager *mgr,
Expand Down Expand Up @@ -214,7 +235,7 @@ static int dss_check_settings_low(struct omap_overlay_manager *mgr,
ois[ovl->id] = oi;
}

return dss_mgr_check(mgr, mi, &mp->timings, ois);
return dss_mgr_check(mgr, mi, &mp->timings, &mp->lcd_config, ois);
}

/*
Expand Down Expand Up @@ -550,7 +571,7 @@ static void dss_ovl_write_regs(struct omap_overlay *ovl)

mp = get_mgr_priv(ovl->manager);

replication = dss_use_replication(ovl->manager->device, oi->color_mode);
replication = dss_ovl_use_replication(mp->lcd_config, oi->color_mode);

r = dispc_ovl_setup(ovl->id, oi, replication, &mp->timings);
if (r) {
Expand Down Expand Up @@ -633,6 +654,24 @@ static void dss_mgr_write_regs_extra(struct omap_overlay_manager *mgr)

dispc_mgr_set_timings(mgr->id, &mp->timings);

/* lcd_config parameters */
if (dss_mgr_is_lcd(mgr->id)) {
dispc_mgr_set_io_pad_mode(mp->lcd_config.io_pad_mode);

dispc_mgr_enable_stallmode(mgr->id, mp->lcd_config.stallmode);
dispc_mgr_enable_fifohandcheck(mgr->id,
mp->lcd_config.fifohandcheck);

dispc_mgr_set_clock_div(mgr->id, &mp->lcd_config.clock_info);

dispc_mgr_set_tft_data_lines(mgr->id,
mp->lcd_config.video_port_width);

dispc_lcd_enable_signal_polarity(mp->lcd_config.lcden_sig_polarity);

dispc_mgr_set_lcd_type_tft(mgr->id);
}

mp->extra_info_dirty = false;
if (mp->updating)
mp->shadow_extra_info_dirty = true;
Expand Down Expand Up @@ -1292,6 +1331,44 @@ void dss_mgr_set_timings(struct omap_overlay_manager *mgr,
mutex_unlock(&apply_lock);
}

static void dss_apply_mgr_lcd_config(struct omap_overlay_manager *mgr,
const struct dss_lcd_mgr_config *config)
{
struct mgr_priv_data *mp = get_mgr_priv(mgr);

mp->lcd_config = *config;
mp->extra_info_dirty = true;
}

void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr,
const struct dss_lcd_mgr_config *config)
{
unsigned long flags;
struct mgr_priv_data *mp = get_mgr_priv(mgr);

mutex_lock(&apply_lock);

if (mp->enabled) {
DSSERR("cannot apply lcd config for %s: manager needs to be disabled\n",
mgr->name);
goto out;
}

spin_lock_irqsave(&data_lock, flags);

dss_apply_mgr_lcd_config(mgr, config);

dss_write_regs();
dss_set_go_bits();

spin_unlock_irqrestore(&data_lock, flags);

wait_pending_extra_info_updates();

out:
mutex_unlock(&apply_lock);
}

int dss_ovl_set_info(struct omap_overlay *ovl,
struct omap_overlay_info *info)
{
Expand Down
26 changes: 7 additions & 19 deletions drivers/video/omap2/dss/dispc.c
Original file line number Diff line number Diff line change
Expand Up @@ -498,16 +498,6 @@ void dispc_runtime_put(void)
WARN_ON(r < 0 && r != -ENOSYS);
}

static inline bool dispc_mgr_is_lcd(enum omap_channel channel)
{
if (channel == OMAP_DSS_CHANNEL_LCD ||
channel == OMAP_DSS_CHANNEL_LCD2 ||
channel == OMAP_DSS_CHANNEL_LCD3)
return true;
else
return false;
}

u32 dispc_mgr_get_vsync_irq(enum omap_channel channel)
{
return mgr_desc[channel].vsync_irq;
Expand Down Expand Up @@ -1010,7 +1000,7 @@ static void dispc_mgr_set_cpr_coef(enum omap_channel channel,
{
u32 coef_r, coef_g, coef_b;

if (!dispc_mgr_is_lcd(channel))
if (!dss_mgr_is_lcd(channel))
return;

coef_r = FLD_VAL(coefs->rr, 31, 22) | FLD_VAL(coefs->rg, 20, 11) |
Expand Down Expand Up @@ -1869,7 +1859,7 @@ static int check_horiz_timing_omap3(enum omap_channel channel,

nonactive = t->x_res + t->hfp + t->hsw + t->hbp - out_width;
pclk = dispc_mgr_pclk_rate(channel);
if (dispc_mgr_is_lcd(channel))
if (dss_mgr_is_lcd(channel))
lclk = dispc_mgr_lclk_rate(channel);
else
lclk = dispc_fclk_rate();
Expand Down Expand Up @@ -2452,7 +2442,7 @@ bool dispc_mgr_is_enabled(enum omap_channel channel)

void dispc_mgr_enable(enum omap_channel channel, bool enable)
{
if (dispc_mgr_is_lcd(channel))
if (dss_mgr_is_lcd(channel))
dispc_mgr_enable_lcd_out(channel, enable);
else if (channel == OMAP_DSS_CHANNEL_DIGIT)
dispc_mgr_enable_digit_out(enable);
Expand Down Expand Up @@ -2642,7 +2632,7 @@ bool dispc_mgr_timings_ok(enum omap_channel channel,

timings_ok = _dispc_mgr_size_ok(timings->x_res, timings->y_res);

if (dispc_mgr_is_lcd(channel))
if (dss_mgr_is_lcd(channel))
timings_ok = timings_ok && _dispc_lcd_timings_ok(timings->hsw,
timings->hfp, timings->hbp,
timings->vsw, timings->vfp,
Expand Down Expand Up @@ -2734,7 +2724,7 @@ void dispc_mgr_set_timings(enum omap_channel channel,
return;
}

if (dispc_mgr_is_lcd(channel)) {
if (dss_mgr_is_lcd(channel)) {
_dispc_mgr_set_lcd_timings(channel, t.hsw, t.hfp, t.hbp, t.vsw,
t.vfp, t.vbp, t.vsync_level, t.hsync_level,
t.data_pclk_edge, t.de_level, t.sync_pclk_edge);
Expand Down Expand Up @@ -2840,7 +2830,7 @@ unsigned long dispc_mgr_pclk_rate(enum omap_channel channel)
{
unsigned long r;

if (dispc_mgr_is_lcd(channel)) {
if (dss_mgr_is_lcd(channel)) {
int pcd;
u32 l;

Expand Down Expand Up @@ -3224,15 +3214,13 @@ int dispc_calc_clock_rates(unsigned long dispc_fclk_rate,
return 0;
}

int dispc_mgr_set_clock_div(enum omap_channel channel,
void dispc_mgr_set_clock_div(enum omap_channel channel,
struct dispc_clock_info *cinfo)
{
DSSDBG("lck = %lu (%u)\n", cinfo->lck, cinfo->lck_div);
DSSDBG("pck = %lu (%u)\n", cinfo->pck, cinfo->pck_div);

dispc_mgr_set_lcd_divisor(channel, cinfo->lck_div, cinfo->pck_div);

return 0;
}

int dispc_mgr_get_clock_div(enum omap_channel channel,
Expand Down
34 changes: 0 additions & 34 deletions drivers/video/omap2/dss/display.c
Original file line number Diff line number Diff line change
Expand Up @@ -316,40 +316,6 @@ void omapdss_default_get_timings(struct omap_dss_device *dssdev,
}
EXPORT_SYMBOL(omapdss_default_get_timings);

/* Checks if replication logic should be used. Only use for active matrix,
* when overlay is in RGB12U or RGB16 mode, and LCD interface is
* 18bpp or 24bpp */
bool dss_use_replication(struct omap_dss_device *dssdev,
enum omap_color_mode mode)
{
int bpp;

if (mode != OMAP_DSS_COLOR_RGB12U && mode != OMAP_DSS_COLOR_RGB16)
return false;

switch (dssdev->type) {
case OMAP_DISPLAY_TYPE_DPI:
bpp = dssdev->phy.dpi.data_lines;
break;
case OMAP_DISPLAY_TYPE_HDMI:
case OMAP_DISPLAY_TYPE_VENC:
case OMAP_DISPLAY_TYPE_SDI:
bpp = 24;
break;
case OMAP_DISPLAY_TYPE_DBI:
bpp = dssdev->ctrl.pixel_size;
break;
case OMAP_DISPLAY_TYPE_DSI:
bpp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt);
break;
default:
BUG();
return false;
}

return bpp > 16;
}

void dss_init_device(struct platform_device *pdev,
struct omap_dss_device *dssdev)
{
Expand Down
31 changes: 15 additions & 16 deletions drivers/video/omap2/dss/dpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,8 @@
static struct {
struct regulator *vdds_dsi_reg;
struct platform_device *dsidev;

struct dss_lcd_mgr_config mgr_config;
} dpi;

static struct platform_device *dpi_get_dsidev(enum omap_dss_clk_source clk)
Expand Down Expand Up @@ -83,11 +85,7 @@ static int dpi_set_dsi_clk(struct omap_dss_device *dssdev,

dss_select_dispc_clk_source(dssdev->clocks.dispc.dispc_fclk_src);

r = dispc_mgr_set_clock_div(dssdev->manager->id, &dispc_cinfo);
if (r) {
dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK);
return r;
}
dpi.mgr_config.clock_info = dispc_cinfo;

*fck = dsi_cinfo.dsi_pll_hsdiv_dispc_clk;
*lck_div = dispc_cinfo.lck_div;
Expand All @@ -112,9 +110,7 @@ static int dpi_set_dispc_clk(struct omap_dss_device *dssdev,
if (r)
return r;

r = dispc_mgr_set_clock_div(dssdev->manager->id, &dispc_cinfo);
if (r)
return r;
dpi.mgr_config.clock_info = dispc_cinfo;

*fck = dss_cinfo.fck;
*lck_div = dispc_cinfo.lck_div;
Expand Down Expand Up @@ -155,15 +151,18 @@ static int dpi_set_mode(struct omap_dss_device *dssdev)
return 0;
}

static void dpi_basic_init(struct omap_dss_device *dssdev)
static void dpi_config_lcd_manager(struct omap_dss_device *dssdev)
{
dispc_mgr_set_io_pad_mode(DSS_IO_PAD_MODE_BYPASS);
dispc_mgr_enable_stallmode(dssdev->manager->id, false);
dpi.mgr_config.io_pad_mode = DSS_IO_PAD_MODE_BYPASS;

dpi.mgr_config.stallmode = false;
dpi.mgr_config.fifohandcheck = false;

dpi.mgr_config.video_port_width = dssdev->phy.dpi.data_lines;

dispc_mgr_set_lcd_type_tft(dssdev->manager->id);
dpi.mgr_config.lcden_sig_polarity = 0;

dispc_mgr_set_tft_data_lines(dssdev->manager->id,
dssdev->phy.dpi.data_lines);
dss_mgr_set_lcd_config(dssdev->manager, &dpi.mgr_config);
}

int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
Expand Down Expand Up @@ -196,8 +195,6 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
if (r)
goto err_get_dispc;

dpi_basic_init(dssdev);

if (dpi_use_dsi_pll(dssdev)) {
r = dsi_runtime_get(dpi.dsidev);
if (r)
Expand All @@ -212,6 +209,8 @@ int omapdss_dpi_display_enable(struct omap_dss_device *dssdev)
if (r)
goto err_set_mode;

dpi_config_lcd_manager(dssdev);

mdelay(2);

r = dss_mgr_enable(dssdev->manager);
Expand Down
Loading

0 comments on commit 974a658

Please sign in to comment.