Commit cb1fbad7 authored by Tomi Valkeinen's avatar Tomi Valkeinen

Merge branches '3.14/fbdev', '3.14/dss-misc' and '3.14/dss-fclk' into for-next

Merge fbdev topic branches
...@@ -346,28 +346,22 @@ static int acx565akm_get_actual_brightness(struct panel_drv_data *ddata) ...@@ -346,28 +346,22 @@ static int acx565akm_get_actual_brightness(struct panel_drv_data *ddata)
static int acx565akm_bl_update_status(struct backlight_device *dev) static int acx565akm_bl_update_status(struct backlight_device *dev)
{ {
struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev); struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
int r;
int level; int level;
dev_dbg(&ddata->spi->dev, "%s\n", __func__); dev_dbg(&ddata->spi->dev, "%s\n", __func__);
mutex_lock(&ddata->mutex);
if (dev->props.fb_blank == FB_BLANK_UNBLANK && if (dev->props.fb_blank == FB_BLANK_UNBLANK &&
dev->props.power == FB_BLANK_UNBLANK) dev->props.power == FB_BLANK_UNBLANK)
level = dev->props.brightness; level = dev->props.brightness;
else else
level = 0; level = 0;
r = 0;
if (ddata->has_bc) if (ddata->has_bc)
acx565akm_set_brightness(ddata, level); acx565akm_set_brightness(ddata, level);
else else
r = -ENODEV; return -ENODEV;
mutex_unlock(&ddata->mutex);
return r; return 0;
} }
static int acx565akm_bl_get_intensity(struct backlight_device *dev) static int acx565akm_bl_get_intensity(struct backlight_device *dev)
...@@ -390,9 +384,33 @@ static int acx565akm_bl_get_intensity(struct backlight_device *dev) ...@@ -390,9 +384,33 @@ static int acx565akm_bl_get_intensity(struct backlight_device *dev)
return 0; return 0;
} }
static int acx565akm_bl_update_status_locked(struct backlight_device *dev)
{
struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
int r;
mutex_lock(&ddata->mutex);
r = acx565akm_bl_update_status(dev);
mutex_unlock(&ddata->mutex);
return r;
}
static int acx565akm_bl_get_intensity_locked(struct backlight_device *dev)
{
struct panel_drv_data *ddata = dev_get_drvdata(&dev->dev);
int r;
mutex_lock(&ddata->mutex);
r = acx565akm_bl_get_intensity(dev);
mutex_unlock(&ddata->mutex);
return r;
}
static const struct backlight_ops acx565akm_bl_ops = { static const struct backlight_ops acx565akm_bl_ops = {
.get_brightness = acx565akm_bl_get_intensity, .get_brightness = acx565akm_bl_get_intensity_locked,
.update_status = acx565akm_bl_update_status, .update_status = acx565akm_bl_update_status_locked,
}; };
/*--------------------Auto Brightness control via Sysfs---------------------*/ /*--------------------Auto Brightness control via Sysfs---------------------*/
...@@ -526,8 +544,6 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev) ...@@ -526,8 +544,6 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
struct omap_dss_device *in = ddata->in; struct omap_dss_device *in = ddata->in;
int r; int r;
mutex_lock(&ddata->mutex);
dev_dbg(&ddata->spi->dev, "%s\n", __func__); dev_dbg(&ddata->spi->dev, "%s\n", __func__);
in->ops.sdi->set_timings(in, &ddata->videomode); in->ops.sdi->set_timings(in, &ddata->videomode);
...@@ -568,8 +584,6 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev) ...@@ -568,8 +584,6 @@ static int acx565akm_panel_power_on(struct omap_dss_device *dssdev)
set_display_state(ddata, 1); set_display_state(ddata, 1);
set_cabc_mode(ddata, ddata->cabc_mode); set_cabc_mode(ddata, ddata->cabc_mode);
mutex_unlock(&ddata->mutex);
return acx565akm_bl_update_status(ddata->bl_dev); return acx565akm_bl_update_status(ddata->bl_dev);
} }
...@@ -616,7 +630,9 @@ static int acx565akm_enable(struct omap_dss_device *dssdev) ...@@ -616,7 +630,9 @@ static int acx565akm_enable(struct omap_dss_device *dssdev)
if (omapdss_device_is_enabled(dssdev)) if (omapdss_device_is_enabled(dssdev))
return 0; return 0;
mutex_lock(&ddata->mutex);
r = acx565akm_panel_power_on(dssdev); r = acx565akm_panel_power_on(dssdev);
mutex_unlock(&ddata->mutex);
if (r) if (r)
return r; return r;
......
...@@ -149,6 +149,9 @@ static void apply_init_priv(void) ...@@ -149,6 +149,9 @@ static void apply_init_priv(void)
op = &dss_data.ovl_priv_data_array[i]; op = &dss_data.ovl_priv_data_array[i];
op->info.color_mode = OMAP_DSS_COLOR_RGB16;
op->info.rotation_type = OMAP_DSS_ROT_DMA;
op->info.global_alpha = 255; op->info.global_alpha = 255;
switch (i) { switch (i) {
...@@ -629,7 +632,7 @@ static void dss_ovl_write_regs(struct omap_overlay *ovl) ...@@ -629,7 +632,7 @@ static void dss_ovl_write_regs(struct omap_overlay *ovl)
struct mgr_priv_data *mp; struct mgr_priv_data *mp;
int r; int r;
DSSDBG("writing ovl %d regs", ovl->id); DSSDBG("writing ovl %d regs\n", ovl->id);
if (!op->enabled || !op->info_dirty) if (!op->enabled || !op->info_dirty)
return; return;
...@@ -664,7 +667,7 @@ static void dss_ovl_write_regs_extra(struct omap_overlay *ovl) ...@@ -664,7 +667,7 @@ static void dss_ovl_write_regs_extra(struct omap_overlay *ovl)
struct ovl_priv_data *op = get_ovl_priv(ovl); struct ovl_priv_data *op = get_ovl_priv(ovl);
struct mgr_priv_data *mp; struct mgr_priv_data *mp;
DSSDBG("writing ovl %d regs extra", ovl->id); DSSDBG("writing ovl %d regs extra\n", ovl->id);
if (!op->extra_info_dirty) if (!op->extra_info_dirty)
return; return;
...@@ -687,7 +690,7 @@ static void dss_mgr_write_regs(struct omap_overlay_manager *mgr) ...@@ -687,7 +690,7 @@ static void dss_mgr_write_regs(struct omap_overlay_manager *mgr)
struct mgr_priv_data *mp = get_mgr_priv(mgr); struct mgr_priv_data *mp = get_mgr_priv(mgr);
struct omap_overlay *ovl; struct omap_overlay *ovl;
DSSDBG("writing mgr %d regs", mgr->id); DSSDBG("writing mgr %d regs\n", mgr->id);
if (!mp->enabled) if (!mp->enabled)
return; return;
...@@ -713,7 +716,7 @@ static void dss_mgr_write_regs_extra(struct omap_overlay_manager *mgr) ...@@ -713,7 +716,7 @@ static void dss_mgr_write_regs_extra(struct omap_overlay_manager *mgr)
{ {
struct mgr_priv_data *mp = get_mgr_priv(mgr); struct mgr_priv_data *mp = get_mgr_priv(mgr);
DSSDBG("writing mgr %d regs extra", mgr->id); DSSDBG("writing mgr %d regs extra\n", mgr->id);
if (!mp->extra_info_dirty) if (!mp->extra_info_dirty)
return; return;
......
...@@ -90,6 +90,8 @@ struct dispc_features { ...@@ -90,6 +90,8 @@ struct dispc_features {
/* revert to the OMAP4 mechanism of DISPC Smart Standby operation */ /* revert to the OMAP4 mechanism of DISPC Smart Standby operation */
bool mstandby_workaround:1; bool mstandby_workaround:1;
bool set_max_preload:1;
}; };
#define DISPC_MAX_NR_FIFOS 5 #define DISPC_MAX_NR_FIFOS 5
...@@ -1200,7 +1202,17 @@ void dispc_ovl_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high) ...@@ -1200,7 +1202,17 @@ void dispc_ovl_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high)
dispc_write_reg(DISPC_OVL_FIFO_THRESHOLD(plane), dispc_write_reg(DISPC_OVL_FIFO_THRESHOLD(plane),
FLD_VAL(high, hi_start, hi_end) | FLD_VAL(high, hi_start, hi_end) |
FLD_VAL(low, lo_start, lo_end)); FLD_VAL(low, lo_start, lo_end));
/*
* configure the preload to the pipeline's high threhold, if HT it's too
* large for the preload field, set the threshold to the maximum value
* that can be held by the preload register
*/
if (dss_has_feature(FEAT_PRELOAD) && dispc.feat->set_max_preload &&
plane != OMAP_DSS_WB)
dispc_write_reg(DISPC_OVL_PRELOAD(plane), min(high, 0xfffu));
} }
EXPORT_SYMBOL(dispc_ovl_set_fifo_threshold);
void dispc_enable_fifomerge(bool enable) void dispc_enable_fifomerge(bool enable)
{ {
...@@ -1259,6 +1271,7 @@ void dispc_ovl_compute_fifo_thresholds(enum omap_plane plane, ...@@ -1259,6 +1271,7 @@ void dispc_ovl_compute_fifo_thresholds(enum omap_plane plane,
*fifo_high = total_fifo_size - buf_unit; *fifo_high = total_fifo_size - buf_unit;
} }
} }
EXPORT_SYMBOL(dispc_ovl_compute_fifo_thresholds);
static void dispc_ovl_set_fir(enum omap_plane plane, static void dispc_ovl_set_fir(enum omap_plane plane,
int hinc, int vinc, int hinc, int vinc,
...@@ -1988,7 +2001,8 @@ static void calc_tiler_rotation_offset(u16 screen_width, u16 width, ...@@ -1988,7 +2001,8 @@ static void calc_tiler_rotation_offset(u16 screen_width, u16 width,
*/ */
static int check_horiz_timing_omap3(unsigned long pclk, unsigned long lclk, static int check_horiz_timing_omap3(unsigned long pclk, unsigned long lclk,
const struct omap_video_timings *t, u16 pos_x, const struct omap_video_timings *t, u16 pos_x,
u16 width, u16 height, u16 out_width, u16 out_height) u16 width, u16 height, u16 out_width, u16 out_height,
bool five_taps)
{ {
const int ds = DIV_ROUND_UP(height, out_height); const int ds = DIV_ROUND_UP(height, out_height);
unsigned long nonactive; unsigned long nonactive;
...@@ -2008,6 +2022,10 @@ static int check_horiz_timing_omap3(unsigned long pclk, unsigned long lclk, ...@@ -2008,6 +2022,10 @@ static int check_horiz_timing_omap3(unsigned long pclk, unsigned long lclk,
if (blank <= limits[i]) if (blank <= limits[i])
return -EINVAL; return -EINVAL;
/* FIXME add checks for 3-tap filter once the limitations are known */
if (!five_taps)
return 0;
/* /*
* Pixel data should be prepared before visible display point starts. * Pixel data should be prepared before visible display point starts.
* So, atleast DS-2 lines must have already been fetched by DISPC * So, atleast DS-2 lines must have already been fetched by DISPC
...@@ -2183,22 +2201,30 @@ static int dispc_ovl_calc_scaling_34xx(unsigned long pclk, unsigned long lclk, ...@@ -2183,22 +2201,30 @@ static int dispc_ovl_calc_scaling_34xx(unsigned long pclk, unsigned long lclk,
do { do {
in_height = DIV_ROUND_UP(height, *decim_y); in_height = DIV_ROUND_UP(height, *decim_y);
in_width = DIV_ROUND_UP(width, *decim_x); in_width = DIV_ROUND_UP(width, *decim_x);
*core_clk = calc_core_clk_five_taps(pclk, mgr_timings, *five_taps = in_height > out_height;
in_width, in_height, out_width, out_height, color_mode);
error = check_horiz_timing_omap3(pclk, lclk, mgr_timings,
pos_x, in_width, in_height, out_width,
out_height);
if (in_width > maxsinglelinewidth) if (in_width > maxsinglelinewidth)
if (in_height > out_height && if (in_height > out_height &&
in_height < out_height * 2) in_height < out_height * 2)
*five_taps = false; *five_taps = false;
if (!*five_taps) again:
if (*five_taps)
*core_clk = calc_core_clk_five_taps(pclk, mgr_timings,
in_width, in_height, out_width,
out_height, color_mode);
else
*core_clk = dispc.feat->calc_core_clk(pclk, in_width, *core_clk = dispc.feat->calc_core_clk(pclk, in_width,
in_height, out_width, out_height, in_height, out_width, out_height,
mem_to_mem); mem_to_mem);
error = check_horiz_timing_omap3(pclk, lclk, mgr_timings,
pos_x, in_width, in_height, out_width,
out_height, *five_taps);
if (error && *five_taps) {
*five_taps = false;
goto again;
}
error = (error || in_width > maxsinglelinewidth * 2 || error = (error || in_width > maxsinglelinewidth * 2 ||
(in_width > maxsinglelinewidth && *five_taps) || (in_width > maxsinglelinewidth && *five_taps) ||
!*core_clk || *core_clk > dispc_core_clk_rate()); !*core_clk || *core_clk > dispc_core_clk_rate());
...@@ -2215,7 +2241,7 @@ static int dispc_ovl_calc_scaling_34xx(unsigned long pclk, unsigned long lclk, ...@@ -2215,7 +2241,7 @@ static int dispc_ovl_calc_scaling_34xx(unsigned long pclk, unsigned long lclk,
} while (*decim_x <= *x_predecim && *decim_y <= *y_predecim && error); } while (*decim_x <= *x_predecim && *decim_y <= *y_predecim && error);
if (check_horiz_timing_omap3(pclk, lclk, mgr_timings, pos_x, width, if (check_horiz_timing_omap3(pclk, lclk, mgr_timings, pos_x, width,
height, out_width, out_height)){ height, out_width, out_height, *five_taps)) {
DSSERR("horizontal timing too tight\n"); DSSERR("horizontal timing too tight\n");
return -EINVAL; return -EINVAL;
} }
...@@ -3211,6 +3237,8 @@ static void dispc_dump_regs(struct seq_file *s) ...@@ -3211,6 +3237,8 @@ static void dispc_dump_regs(struct seq_file *s)
DUMPREG(DISPC_CONTROL3); DUMPREG(DISPC_CONTROL3);
DUMPREG(DISPC_CONFIG3); DUMPREG(DISPC_CONFIG3);
} }
if (dss_has_feature(FEAT_MFLAG))
DUMPREG(DISPC_GLOBAL_MFLAG_ATTRIBUTE);
#undef DUMPREG #undef DUMPREG
...@@ -3285,6 +3313,8 @@ static void dispc_dump_regs(struct seq_file *s) ...@@ -3285,6 +3313,8 @@ static void dispc_dump_regs(struct seq_file *s)
DUMPREG(i, DISPC_OVL_ATTRIBUTES2); DUMPREG(i, DISPC_OVL_ATTRIBUTES2);
if (dss_has_feature(FEAT_PRELOAD)) if (dss_has_feature(FEAT_PRELOAD))
DUMPREG(i, DISPC_OVL_PRELOAD); DUMPREG(i, DISPC_OVL_PRELOAD);
if (dss_has_feature(FEAT_MFLAG))
DUMPREG(i, DISPC_OVL_MFLAG_THRESHOLD);
} }
#undef DISPC_REG #undef DISPC_REG
...@@ -3520,6 +3550,7 @@ static const struct dispc_features omap24xx_dispc_feats __initconst = { ...@@ -3520,6 +3550,7 @@ static const struct dispc_features omap24xx_dispc_feats __initconst = {
.calc_core_clk = calc_core_clk_24xx, .calc_core_clk = calc_core_clk_24xx,
.num_fifos = 3, .num_fifos = 3,
.no_framedone_tv = true, .no_framedone_tv = true,
.set_max_preload = false,
}; };
static const struct dispc_features omap34xx_rev1_0_dispc_feats __initconst = { static const struct dispc_features omap34xx_rev1_0_dispc_feats __initconst = {
...@@ -3539,6 +3570,7 @@ static const struct dispc_features omap34xx_rev1_0_dispc_feats __initconst = { ...@@ -3539,6 +3570,7 @@ static const struct dispc_features omap34xx_rev1_0_dispc_feats __initconst = {
.calc_core_clk = calc_core_clk_34xx, .calc_core_clk = calc_core_clk_34xx,
.num_fifos = 3, .num_fifos = 3,
.no_framedone_tv = true, .no_framedone_tv = true,
.set_max_preload = false,
}; };
static const struct dispc_features omap34xx_rev3_0_dispc_feats __initconst = { static const struct dispc_features omap34xx_rev3_0_dispc_feats __initconst = {
...@@ -3558,6 +3590,7 @@ static const struct dispc_features omap34xx_rev3_0_dispc_feats __initconst = { ...@@ -3558,6 +3590,7 @@ static const struct dispc_features omap34xx_rev3_0_dispc_feats __initconst = {
.calc_core_clk = calc_core_clk_34xx, .calc_core_clk = calc_core_clk_34xx,
.num_fifos = 3, .num_fifos = 3,
.no_framedone_tv = true, .no_framedone_tv = true,
.set_max_preload = false,
}; };
static const struct dispc_features omap44xx_dispc_feats __initconst = { static const struct dispc_features omap44xx_dispc_feats __initconst = {
...@@ -3577,6 +3610,7 @@ static const struct dispc_features omap44xx_dispc_feats __initconst = { ...@@ -3577,6 +3610,7 @@ static const struct dispc_features omap44xx_dispc_feats __initconst = {
.calc_core_clk = calc_core_clk_44xx, .calc_core_clk = calc_core_clk_44xx,
.num_fifos = 5, .num_fifos = 5,
.gfx_fifo_workaround = true, .gfx_fifo_workaround = true,
.set_max_preload = true,
}; };
static const struct dispc_features omap54xx_dispc_feats __initconst = { static const struct dispc_features omap54xx_dispc_feats __initconst = {
...@@ -3597,6 +3631,7 @@ static const struct dispc_features omap54xx_dispc_feats __initconst = { ...@@ -3597,6 +3631,7 @@ static const struct dispc_features omap54xx_dispc_feats __initconst = {
.num_fifos = 5, .num_fifos = 5,
.gfx_fifo_workaround = true, .gfx_fifo_workaround = true,
.mstandby_workaround = true, .mstandby_workaround = true,
.set_max_preload = true,
}; };
static int __init dispc_init_features(struct platform_device *pdev) static int __init dispc_init_features(struct platform_device *pdev)
...@@ -3734,6 +3769,8 @@ static int dispc_runtime_suspend(struct device *dev) ...@@ -3734,6 +3769,8 @@ static int dispc_runtime_suspend(struct device *dev)
static int dispc_runtime_resume(struct device *dev) static int dispc_runtime_resume(struct device *dev)
{ {
_omap_dispc_initial_config();
dispc_restore_context(); dispc_restore_context();
return 0; return 0;
......
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
#define DISPC_CONTROL3 0x0848 #define DISPC_CONTROL3 0x0848
#define DISPC_CONFIG3 0x084C #define DISPC_CONFIG3 0x084C
#define DISPC_MSTANDBY_CTRL 0x0858 #define DISPC_MSTANDBY_CTRL 0x0858
#define DISPC_GLOBAL_MFLAG_ATTRIBUTE 0x085C
/* DISPC overlay registers */ /* DISPC overlay registers */
#define DISPC_OVL_BA0(n) (DISPC_OVL_BASE(n) + \ #define DISPC_OVL_BA0(n) (DISPC_OVL_BASE(n) + \
...@@ -100,6 +101,8 @@ ...@@ -100,6 +101,8 @@
DISPC_FIR_COEF_V2_OFFSET(n, i)) DISPC_FIR_COEF_V2_OFFSET(n, i))
#define DISPC_OVL_PRELOAD(n) (DISPC_OVL_BASE(n) + \ #define DISPC_OVL_PRELOAD(n) (DISPC_OVL_BASE(n) + \
DISPC_PRELOAD_OFFSET(n)) DISPC_PRELOAD_OFFSET(n))
#define DISPC_OVL_MFLAG_THRESHOLD(n) (DISPC_OVL_BASE(n) + \
DISPC_MFLAG_THRESHOLD_OFFSET(n))
/* DISPC up/downsampling FIR filter coefficient structure */ /* DISPC up/downsampling FIR filter coefficient structure */
struct dispc_coef { struct dispc_coef {
...@@ -894,4 +897,21 @@ static inline u16 DISPC_PRELOAD_OFFSET(enum omap_plane plane) ...@@ -894,4 +897,21 @@ static inline u16 DISPC_PRELOAD_OFFSET(enum omap_plane plane)
return 0; return 0;
} }
} }
static inline u16 DISPC_MFLAG_THRESHOLD_OFFSET(enum omap_plane plane)
{
switch (plane) {
case OMAP_DSS_GFX:
return 0x0860;
case OMAP_DSS_VIDEO1:
return 0x0864;
case OMAP_DSS_VIDEO2:
return 0x0868;
case OMAP_DSS_VIDEO3:
return 0x086c;
default:
BUG();
return 0;
}
}
#endif #endif
...@@ -277,7 +277,7 @@ static ssize_t display_wss_store(struct device *dev, ...@@ -277,7 +277,7 @@ static ssize_t display_wss_store(struct device *dev,
return size; return size;
} }
static DEVICE_ATTR(name, S_IRUGO, display_name_show, NULL); static DEVICE_ATTR(display_name, S_IRUGO, display_name_show, NULL);
static DEVICE_ATTR(enabled, S_IRUGO|S_IWUSR, static DEVICE_ATTR(enabled, S_IRUGO|S_IWUSR,
display_enabled_show, display_enabled_store); display_enabled_show, display_enabled_store);
static DEVICE_ATTR(tear_elim, S_IRUGO|S_IWUSR, static DEVICE_ATTR(tear_elim, S_IRUGO|S_IWUSR,
...@@ -292,7 +292,7 @@ static DEVICE_ATTR(wss, S_IRUGO|S_IWUSR, ...@@ -292,7 +292,7 @@ static DEVICE_ATTR(wss, S_IRUGO|S_IWUSR,
display_wss_show, display_wss_store); display_wss_show, display_wss_store);
static const struct attribute *display_sysfs_attrs[] = { static const struct attribute *display_sysfs_attrs[] = {
&dev_attr_name.attr, &dev_attr_display_name.attr,
&dev_attr_enabled.attr, &dev_attr_enabled.attr,
&dev_attr_tear_elim.attr, &dev_attr_tear_elim.attr,
&dev_attr_timings.attr, &dev_attr_timings.attr,
......
...@@ -117,7 +117,7 @@ struct dpi_clk_calc_ctx { ...@@ -117,7 +117,7 @@ struct dpi_clk_calc_ctx {
/* outputs */ /* outputs */
struct dsi_clock_info dsi_cinfo; struct dsi_clock_info dsi_cinfo;
struct dss_clock_info dss_cinfo; unsigned long long fck;
struct dispc_clock_info dispc_cinfo; struct dispc_clock_info dispc_cinfo;
}; };
...@@ -184,12 +184,11 @@ static bool dpi_calc_pll_cb(int regn, int regm, unsigned long fint, ...@@ -184,12 +184,11 @@ static bool dpi_calc_pll_cb(int regn, int regm, unsigned long fint,
dpi_calc_hsdiv_cb, ctx); dpi_calc_hsdiv_cb, ctx);
} }
static bool dpi_calc_dss_cb(int fckd, unsigned long fck, void *data) static bool dpi_calc_dss_cb(unsigned long fck, void *data)
{ {
struct dpi_clk_calc_ctx *ctx = data; struct dpi_clk_calc_ctx *ctx = data;
ctx->dss_cinfo.fck = fck; ctx->fck = fck;
ctx->dss_cinfo.fck_div = fckd;
return dispc_div_calc(fck, ctx->pck_min, ctx->pck_max, return dispc_div_calc(fck, ctx->pck_min, ctx->pck_max,
dpi_calc_dispc_cb, ctx); dpi_calc_dispc_cb, ctx);
...@@ -237,7 +236,7 @@ static bool dpi_dss_clk_calc(unsigned long pck, struct dpi_clk_calc_ctx *ctx) ...@@ -237,7 +236,7 @@ static bool dpi_dss_clk_calc(unsigned long pck, struct dpi_clk_calc_ctx *ctx)
ctx->pck_min = 0; ctx->pck_min = 0;
ctx->pck_max = pck + 1000 * i * i * i; ctx->pck_max = pck + 1000 * i * i * i;
ok = dss_div_calc(ctx->pck_min, dpi_calc_dss_cb, ctx); ok = dss_div_calc(pck, ctx->pck_min, dpi_calc_dss_cb, ctx);
if (ok) if (ok)
return ok; return ok;
} }
...@@ -286,13 +285,13 @@ static int dpi_set_dispc_clk(unsigned long pck_req, unsigned long *fck, ...@@ -286,13 +285,13 @@ static int dpi_set_dispc_clk(unsigned long pck_req, unsigned long *fck,
if (!ok) if (!ok)
return -EINVAL; return -EINVAL;
r = dss_set_clock_div(&ctx.dss_cinfo); r = dss_set_fck_rate(ctx.fck);
if (r) if (r)
return r; return r;
dpi.mgr_config.clock_info = ctx.dispc_cinfo; dpi.mgr_config.clock_info = ctx.dispc_cinfo;
*fck = ctx.dss_cinfo.fck; *fck = ctx.fck;
*lck_div = ctx.dispc_cinfo.lck_div; *lck_div = ctx.dispc_cinfo.lck_div;
*pck_div = ctx.dispc_cinfo.pck_div; *pck_div = ctx.dispc_cinfo.pck_div;
...@@ -495,7 +494,7 @@ static int dpi_check_timings(struct omap_dss_device *dssdev, ...@@ -495,7 +494,7 @@ static int dpi_check_timings(struct omap_dss_device *dssdev,
if (!ok) if (!ok)
return -EINVAL; return -EINVAL;
fck = ctx.dss_cinfo.fck; fck = ctx.fck;
} }
lck_div = ctx.dispc_cinfo.lck_div; lck_div = ctx.dispc_cinfo.lck_div;
...@@ -551,7 +550,8 @@ static int dpi_init_regulator(void) ...@@ -551,7 +550,8 @@ static int dpi_init_regulator(void)
vdds_dsi = devm_regulator_get(&dpi.pdev->dev, "vdds_dsi"); vdds_dsi = devm_regulator_get(&dpi.pdev->dev, "vdds_dsi");
if (IS_ERR(vdds_dsi)) { if (IS_ERR(vdds_dsi)) {
DSSERR("can't get VDDS_DSI regulator\n"); if (PTR_ERR(vdds_dsi) != -EPROBE_DEFER)
DSSERR("can't get VDDS_DSI regulator\n");
return PTR_ERR(vdds_dsi); return PTR_ERR(vdds_dsi);
} }
......
This diff is collapsed.
...@@ -67,7 +67,7 @@ static void dss_runtime_put(void); ...@@ -67,7 +67,7 @@ static void dss_runtime_put(void);
struct dss_features { struct dss_features {
u8 fck_div_max; u8 fck_div_max;
u8 dss_fck_multiplier; u8 dss_fck_multiplier;
const char *clk_name; const char *parent_clk_name;
int (*dpi_select_source)(enum omap_channel channel); int (*dpi_select_source)(enum omap_channel channel);
}; };
...@@ -75,13 +75,12 @@ static struct { ...@@ -75,13 +75,12 @@ static struct {
struct platform_device *pdev; struct platform_device *pdev;
void __iomem *base; void __iomem *base;
struct clk *dpll4_m4_ck; struct clk *parent_clk;
struct clk *dss_clk; struct clk *dss_clk;
unsigned long dss_clk_rate; unsigned long dss_clk_rate;
unsigned long cache_req_pck; unsigned long cache_req_pck;
unsigned long cache_prate; unsigned long cache_prate;
struct dss_clock_info cache_dss_cinfo;
struct dispc_clock_info cache_dispc_cinfo; struct dispc_clock_info cache_dispc_cinfo;
enum omap_dss_clk_source dsi_clk_source[MAX_NUM_DSI]; enum omap_dss_clk_source dsi_clk_source[MAX_NUM_DSI];
...@@ -265,8 +264,6 @@ const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src) ...@@ -265,8 +264,6 @@ const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src)
void dss_dump_clocks(struct seq_file *s) void dss_dump_clocks(struct seq_file *s)
{ {
unsigned long dpll4_ck_rate;
unsigned long dpll4_m4_ck_rate;
const char *fclk_name, *fclk_real_name; const char *fclk_name, *fclk_real_name;
unsigned long fclk_rate; unsigned long fclk_rate;
...@@ -279,21 +276,9 @@ void dss_dump_clocks(struct seq_file *s) ...@@ -279,21 +276,9 @@ void dss_dump_clocks(struct seq_file *s)
fclk_real_name = dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_FCK); fclk_real_name = dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_FCK);
fclk_rate = clk_get_rate(dss.dss_clk); fclk_rate = clk_get_rate(dss.dss_clk);
if (dss.dpll4_m4_ck) { seq_printf(s, "%s (%s) = %lu\n",
dpll4_ck_rate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); fclk_name, fclk_real_name,
dpll4_m4_ck_rate = clk_get_rate(dss.dpll4_m4_ck); fclk_rate);
seq_printf(s, "dpll4_ck %lu\n", dpll4_ck_rate);
seq_printf(s, "%s (%s) = %lu / %lu * %d = %lu\n",
fclk_name, fclk_real_name, dpll4_ck_rate,
dpll4_ck_rate / dpll4_m4_ck_rate,
dss.feat->dss_fck_multiplier, fclk_rate);
} else {
seq_printf(s, "%s (%s) = %lu\n",
fclk_name, fclk_real_name,
fclk_rate);
}
dss_runtime_put(); dss_runtime_put();
} }
...@@ -451,30 +436,8 @@ enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel) ...@@ -451,30 +436,8 @@ enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel)
} }
} }
/* calculate clock rates using dividers in cinfo */ bool dss_div_calc(unsigned long pck, unsigned long fck_min,
int dss_calc_clock_rates(struct dss_clock_info *cinfo) dss_div_calc_func func, void *data)
{
if (dss.dpll4_m4_ck) {
unsigned long prate;
if (cinfo->fck_div > dss.feat->fck_div_max ||
cinfo->fck_div == 0)
return -EINVAL;
prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck));
cinfo->fck = prate / cinfo->fck_div *
dss.feat->dss_fck_multiplier;
} else {
if (cinfo->fck_div != 0)
return -EINVAL;
cinfo->fck = clk_get_rate(dss.dss_clk);
}
return 0;
}
bool dss_div_calc(unsigned long fck_min, dss_div_calc_func func, void *data)
{ {
int fckd, fckd_start, fckd_stop; int fckd, fckd_start, fckd_stop;
unsigned long fck; unsigned long fck;
...@@ -483,22 +446,24 @@ bool dss_div_calc(unsigned long fck_min, dss_div_calc_func func, void *data) ...@@ -483,22 +446,24 @@ bool dss_div_calc(unsigned long fck_min, dss_div_calc_func func, void *data)
unsigned long prate; unsigned long prate;
unsigned m; unsigned m;
if (dss.dpll4_m4_ck == NULL) { fck_hw_max = dss_feat_get_param_max(FEAT_PARAM_DSS_FCK);
/*
* TODO: dss1_fclk can be changed on OMAP2, but the available if (dss.parent_clk == NULL) {
* dividers are not continuous. We just use the pre-set rate for unsigned pckd;
* now.
*/ pckd = fck_hw_max / pck;
fck = clk_get_rate(dss.dss_clk);
fckd = 1; fck = pck * pckd;
return func(fckd, fck, data);
fck = clk_round_rate(dss.dss_clk, fck);
return func(fck, data);
} }
fck_hw_max = dss_feat_get_param_max(FEAT_PARAM_DSS_FCK);
fckd_hw_max = dss.feat->fck_div_max; fckd_hw_max = dss.feat->fck_div_max;
m = dss.feat->dss_fck_multiplier; m = dss.feat->dss_fck_multiplier;
prate = dss_get_dpll4_rate(); prate = clk_get_rate(dss.parent_clk);
fck_min = fck_min ? fck_min : 1; fck_min = fck_min ? fck_min : 1;
...@@ -508,50 +473,32 @@ bool dss_div_calc(unsigned long fck_min, dss_div_calc_func func, void *data) ...@@ -508,50 +473,32 @@ bool dss_div_calc(unsigned long fck_min, dss_div_calc_func func, void *data)
for (fckd = fckd_start; fckd >= fckd_stop; --fckd) { for (fckd = fckd_start; fckd >= fckd_stop; --fckd) {
fck = prate / fckd * m; fck = prate / fckd * m;
if (func(fckd, fck, data)) if (func(fck, data))
return true; return true;
} }
return false; return false;
} }
int dss_set_clock_div(struct dss_clock_info *cinfo) int dss_set_fck_rate(unsigned long rate)
{ {
if (dss.dpll4_m4_ck) { int r;
unsigned long prate;
int r;
prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); DSSDBG("set fck to %lu\n", rate);
DSSDBG("dpll4_m4 = %ld\n", prate);
r = clk_set_rate(dss.dpll4_m4_ck, r = clk_set_rate(dss.dss_clk, rate);
DIV_ROUND_UP(prate, cinfo->fck_div)); if (r)
if (r) return r;
return r;
} else {
if (cinfo->fck_div != 0)
return -EINVAL;
}
dss.dss_clk_rate = clk_get_rate(dss.dss_clk); dss.dss_clk_rate = clk_get_rate(dss.dss_clk);
WARN_ONCE(dss.dss_clk_rate != cinfo->fck, WARN_ONCE(dss.dss_clk_rate != rate,
"clk rate mismatch: %lu != %lu", dss.dss_clk_rate, "clk rate mismatch: %lu != %lu", dss.dss_clk_rate,
cinfo->fck); rate);
DSSDBG("fck = %ld (%d)\n", cinfo->fck, cinfo->fck_div);
return 0; return 0;
} }
unsigned long dss_get_dpll4_rate(void)
{
if (dss.dpll4_m4_ck)
return clk_get_rate(clk_get_parent(dss.dpll4_m4_ck));
else
return 0;
}
unsigned long dss_get_dispc_clk_rate(void) unsigned long dss_get_dispc_clk_rate(void)
{ {
return dss.dss_clk_rate; return dss.dss_clk_rate;
...@@ -560,27 +507,23 @@ unsigned long dss_get_dispc_clk_rate(void) ...@@ -560,27 +507,23 @@ unsigned long dss_get_dispc_clk_rate(void)
static int dss_setup_default_clock(void) static int dss_setup_default_clock(void)
{ {
unsigned long max_dss_fck, prate; unsigned long max_dss_fck, prate;
unsigned long fck;
unsigned fck_div; unsigned fck_div;
struct dss_clock_info dss_cinfo = { 0 };
int r; int r;
if (dss.dpll4_m4_ck == NULL)
return 0;
max_dss_fck = dss_feat_get_param_max(FEAT_PARAM_DSS_FCK); max_dss_fck = dss_feat_get_param_max(FEAT_PARAM_DSS_FCK);
prate = dss_get_dpll4_rate(); if (dss.parent_clk == NULL) {
fck = clk_round_rate(dss.dss_clk, max_dss_fck);
fck_div = DIV_ROUND_UP(prate * dss.feat->dss_fck_multiplier, } else {
max_dss_fck); prate = clk_get_rate(dss.parent_clk);
dss_cinfo.fck_div = fck_div;
r = dss_calc_clock_rates(&dss_cinfo); fck_div = DIV_ROUND_UP(prate * dss.feat->dss_fck_multiplier,
if (r) max_dss_fck);
return r; fck = prate / fck_div * dss.feat->dss_fck_multiplier;
}
r = dss_set_clock_div(&dss_cinfo); r = dss_set_fck_rate(fck);
if (r) if (r)
return r; return r;
...@@ -706,25 +649,25 @@ static int dss_get_clocks(void) ...@@ -706,25 +649,25 @@ static int dss_get_clocks(void)
dss.dss_clk = clk; dss.dss_clk = clk;
if (dss.feat->clk_name) { if (dss.feat->parent_clk_name) {
clk = clk_get(NULL, dss.feat->clk_name); clk = clk_get(NULL, dss.feat->parent_clk_name);
if (IS_ERR(clk)) { if (IS_ERR(clk)) {
DSSERR("Failed to get %s\n", dss.feat->clk_name); DSSERR("Failed to get %s\n", dss.feat->parent_clk_name);
return PTR_ERR(clk); return PTR_ERR(clk);
} }
} else { } else {
clk = NULL; clk = NULL;
} }
dss.dpll4_m4_ck = clk; dss.parent_clk = clk;
return 0; return 0;
} }
static void dss_put_clocks(void) static void dss_put_clocks(void)
{ {
if (dss.dpll4_m4_ck) if (dss.parent_clk)
clk_put(dss.dpll4_m4_ck); clk_put(dss.parent_clk);
} }
static int dss_runtime_get(void) static int dss_runtime_get(void)
...@@ -761,37 +704,41 @@ void dss_debug_dump_clocks(struct seq_file *s) ...@@ -761,37 +704,41 @@ void dss_debug_dump_clocks(struct seq_file *s)
#endif #endif
static const struct dss_features omap24xx_dss_feats __initconst = { static const struct dss_features omap24xx_dss_feats __initconst = {
.fck_div_max = 16, /*
* fck div max is really 16, but the divider range has gaps. The range
* from 1 to 6 has no gaps, so let's use that as a max.
*/
.fck_div_max = 6,
.dss_fck_multiplier = 2, .dss_fck_multiplier = 2,
.clk_name = NULL, .parent_clk_name = "core_ck",
.dpi_select_source = &dss_dpi_select_source_omap2_omap3, .dpi_select_source = &dss_dpi_select_source_omap2_omap3,
}; };
static const struct dss_features omap34xx_dss_feats __initconst = { static const struct dss_features omap34xx_dss_feats __initconst = {
.fck_div_max = 16, .fck_div_max = 16,
.dss_fck_multiplier = 2, .dss_fck_multiplier = 2,
.clk_name = "dpll4_m4_ck", .parent_clk_name = "dpll4_ck",
.dpi_select_source = &dss_dpi_select_source_omap2_omap3, .dpi_select_source = &dss_dpi_select_source_omap2_omap3,
}; };
static const struct dss_features omap3630_dss_feats __initconst = { static const struct dss_features omap3630_dss_feats __initconst = {
.fck_div_max = 32, .fck_div_max = 32,
.dss_fck_multiplier = 1, .dss_fck_multiplier = 1,
.clk_name = "dpll4_m4_ck", .parent_clk_name = "dpll4_ck",
.dpi_select_source = &dss_dpi_select_source_omap2_omap3, .dpi_select_source = &dss_dpi_select_source_omap2_omap3,
}; };
static const struct dss_features omap44xx_dss_feats __initconst = { static const struct dss_features omap44xx_dss_feats __initconst = {
.fck_div_max = 32, .fck_div_max = 32,
.dss_fck_multiplier = 1, .dss_fck_multiplier = 1,
.clk_name = "dpll_per_m5x2_ck", .parent_clk_name = "dpll_per_x2_ck",
.dpi_select_source = &dss_dpi_select_source_omap4, .dpi_select_source = &dss_dpi_select_source_omap4,
}; };
static const struct dss_features omap54xx_dss_feats __initconst = { static const struct dss_features omap54xx_dss_feats __initconst = {
.fck_div_max = 64, .fck_div_max = 64,
.dss_fck_multiplier = 1, .dss_fck_multiplier = 1,
.clk_name = "dpll_per_h12x2_ck", .parent_clk_name = "dpll_per_x2_ck",
.dpi_select_source = &dss_dpi_select_source_omap5, .dpi_select_source = &dss_dpi_select_source_omap5,
}; };
......
...@@ -100,14 +100,6 @@ enum dss_writeback_channel { ...@@ -100,14 +100,6 @@ enum dss_writeback_channel {
DSS_WB_LCD3_MGR = 7, DSS_WB_LCD3_MGR = 7,
}; };
struct dss_clock_info {
/* rates that we get with dividers below */
unsigned long fck;
/* dividers */
u16 fck_div;
};
struct dispc_clock_info { struct dispc_clock_info {
/* rates that we get with dividers below */ /* rates that we get with dividers below */
unsigned long lck; unsigned long lck;
...@@ -250,12 +242,11 @@ enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel); ...@@ -250,12 +242,11 @@ enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel);
void dss_set_venc_output(enum omap_dss_venc_type type); void dss_set_venc_output(enum omap_dss_venc_type type);
void dss_set_dac_pwrdn_bgz(bool enable); void dss_set_dac_pwrdn_bgz(bool enable);
unsigned long dss_get_dpll4_rate(void); int dss_set_fck_rate(unsigned long rate);
int dss_calc_clock_rates(struct dss_clock_info *cinfo);
int dss_set_clock_div(struct dss_clock_info *cinfo);
typedef bool (*dss_div_calc_func)(int fckd, unsigned long fck, void *data); typedef bool (*dss_div_calc_func)(unsigned long fck, void *data);
bool dss_div_calc(unsigned long fck_min, dss_div_calc_func func, void *data); bool dss_div_calc(unsigned long pck, unsigned long fck_min,
dss_div_calc_func func, void *data);
/* SDI */ /* SDI */
int sdi_init_platform_driver(void) __init; int sdi_init_platform_driver(void) __init;
......
...@@ -613,6 +613,7 @@ static const enum dss_feat_id omap5_dss_feat_list[] = { ...@@ -613,6 +613,7 @@ static const enum dss_feat_id omap5_dss_feat_list[] = {
FEAT_DSI_PLL_SELFREQDCO, FEAT_DSI_PLL_SELFREQDCO,
FEAT_DSI_PLL_REFSEL, FEAT_DSI_PLL_REFSEL,
FEAT_DSI_PHY_DCC, FEAT_DSI_PHY_DCC,
FEAT_MFLAG,
}; };
/* OMAP2 DSS Features */ /* OMAP2 DSS Features */
......
...@@ -64,6 +64,7 @@ enum dss_feat_id { ...@@ -64,6 +64,7 @@ enum dss_feat_id {
FEAT_DSI_PLL_SELFREQDCO, FEAT_DSI_PLL_SELFREQDCO,
FEAT_DSI_PLL_REFSEL, FEAT_DSI_PLL_REFSEL,
FEAT_DSI_PHY_DCC, FEAT_DSI_PHY_DCC,
FEAT_MFLAG,
}; };
/* DSS register field id */ /* DSS register field id */
......
...@@ -41,14 +41,14 @@ ...@@ -41,14 +41,14 @@
#define HDMI_WP_VIDEO_SIZE 0x60 #define HDMI_WP_VIDEO_SIZE 0x60
#define HDMI_WP_VIDEO_TIMING_H 0x68 #define HDMI_WP_VIDEO_TIMING_H 0x68
#define HDMI_WP_VIDEO_TIMING_V 0x6C #define HDMI_WP_VIDEO_TIMING_V 0x6C
#define HDMI_WP_WP_CLK 0x70 #define HDMI_WP_CLK 0x70
#define HDMI_WP_AUDIO_CFG 0x80 #define HDMI_WP_AUDIO_CFG 0x80
#define HDMI_WP_AUDIO_CFG2 0x84 #define HDMI_WP_AUDIO_CFG2 0x84
#define HDMI_WP_AUDIO_CTRL 0x88 #define HDMI_WP_AUDIO_CTRL 0x88
#define HDMI_WP_AUDIO_DATA 0x8C #define HDMI_WP_AUDIO_DATA 0x8C
/* HDMI WP IRQ flags */ /* HDMI WP IRQ flags */
#define HDMI_IRQ_CORE (1 << 0)
#define HDMI_IRQ_OCP_TIMEOUT (1 << 4) #define HDMI_IRQ_OCP_TIMEOUT (1 << 4)
#define HDMI_IRQ_AUDIO_FIFO_UNDERFLOW (1 << 8) #define HDMI_IRQ_AUDIO_FIFO_UNDERFLOW (1 << 8)
#define HDMI_IRQ_AUDIO_FIFO_OVERFLOW (1 << 9) #define HDMI_IRQ_AUDIO_FIFO_OVERFLOW (1 << 9)
...@@ -378,15 +378,15 @@ static inline u32 hdmi_read_reg(void __iomem *base_addr, const u16 idx) ...@@ -378,15 +378,15 @@ static inline u32 hdmi_read_reg(void __iomem *base_addr, const u16 idx)
FLD_GET(hdmi_read_reg(base, idx), start, end) FLD_GET(hdmi_read_reg(base, idx), start, end)
static inline int hdmi_wait_for_bit_change(void __iomem *base_addr, static inline int hdmi_wait_for_bit_change(void __iomem *base_addr,
const u16 idx, int b2, int b1, u32 val) const u32 idx, int b2, int b1, u32 val)
{ {
u32 t = 0; u32 t = 0, v;
while (val != REG_GET(base_addr, idx, b2, b1)) { while (val != (v = REG_GET(base_addr, idx, b2, b1))) {
udelay(1);
if (t++ > 10000) if (t++ > 10000)
return !val; return v;
udelay(1);
} }
return val; return v;
} }
/* HDMI wrapper funcs */ /* HDMI wrapper funcs */
......
...@@ -95,7 +95,8 @@ static int hdmi_init_regulator(void) ...@@ -95,7 +95,8 @@ static int hdmi_init_regulator(void)
reg = devm_regulator_get(&hdmi.pdev->dev, "VDAC"); reg = devm_regulator_get(&hdmi.pdev->dev, "VDAC");
if (IS_ERR(reg)) { if (IS_ERR(reg)) {
DSSERR("can't get VDDA_HDMI_DAC regulator\n"); if (PTR_ERR(reg) != -EPROBE_DEFER)
DSSERR("can't get VDDA_HDMI_DAC regulator\n");
return PTR_ERR(reg); return PTR_ERR(reg);
} }
...@@ -148,8 +149,6 @@ static int hdmi_power_on_full(struct omap_dss_device *dssdev) ...@@ -148,8 +149,6 @@ static int hdmi_power_on_full(struct omap_dss_device *dssdev)
if (r) if (r)
return r; return r;
dss_mgr_disable(mgr);
p = &hdmi.cfg.timings; p = &hdmi.cfg.timings;
DSSDBG("hdmi_power_on x_res= %d y_res = %d\n", p->x_res, p->y_res); DSSDBG("hdmi_power_on x_res= %d y_res = %d\n", p->x_res, p->y_res);
...@@ -158,8 +157,6 @@ static int hdmi_power_on_full(struct omap_dss_device *dssdev) ...@@ -158,8 +157,6 @@ static int hdmi_power_on_full(struct omap_dss_device *dssdev)
hdmi_pll_compute(&hdmi.pll, clk_get_rate(hdmi.sys_clk), phy); hdmi_pll_compute(&hdmi.pll, clk_get_rate(hdmi.sys_clk), phy);
hdmi_wp_video_stop(&hdmi.wp);
/* config the PLL and PHY hdmi_set_pll_pwrfirst */ /* config the PLL and PHY hdmi_set_pll_pwrfirst */
r = hdmi_pll_enable(&hdmi.pll, &hdmi.wp); r = hdmi_pll_enable(&hdmi.pll, &hdmi.wp);
if (r) { if (r) {
...@@ -218,14 +215,12 @@ static void hdmi_power_off_full(struct omap_dss_device *dssdev) ...@@ -218,14 +215,12 @@ static void hdmi_power_off_full(struct omap_dss_device *dssdev)
static int hdmi_display_check_timing(struct omap_dss_device *dssdev, static int hdmi_display_check_timing(struct omap_dss_device *dssdev,
struct omap_video_timings *timings) struct omap_video_timings *timings)
{ {
struct hdmi_cm cm; struct omap_dss_device *out = &hdmi.output;
cm = hdmi_get_code(timings); if (!dispc_mgr_timings_ok(out->dispc_channel, timings))
if (cm.code == -1)
return -EINVAL; return -EINVAL;
return 0; return 0;
} }
static void hdmi_display_set_timing(struct omap_dss_device *dssdev, static void hdmi_display_set_timing(struct omap_dss_device *dssdev,
...@@ -244,8 +239,17 @@ static void hdmi_display_set_timing(struct omap_dss_device *dssdev, ...@@ -244,8 +239,17 @@ static void hdmi_display_set_timing(struct omap_dss_device *dssdev,
hdmi.cfg = *t; hdmi.cfg = *t;
dispc_set_tv_pclk(t->timings.pixel_clock * 1000); dispc_set_tv_pclk(t->timings.pixel_clock * 1000);
} else {
hdmi.cfg.timings = *timings;
hdmi.cfg.cm.code = 0;
hdmi.cfg.cm.mode = HDMI_DVI;
dispc_set_tv_pclk(timings->pixel_clock * 1000);
} }
DSSDBG("using mode: %s, code %d\n", hdmi.cfg.cm.mode == HDMI_DVI ?
"DVI" : "HDMI", hdmi.cfg.cm.code);
mutex_unlock(&hdmi.lock); mutex_unlock(&hdmi.lock);
} }
......
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
* this program. If not, see <http://www.gnu.org/licenses/>. * this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#define DSS_SUBSYS_NAME "HDMICORE"
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/err.h> #include <linux/err.h>
...@@ -125,12 +127,12 @@ static int hdmi_core_ddc_edid(struct hdmi_core_data *core, ...@@ -125,12 +127,12 @@ static int hdmi_core_ddc_edid(struct hdmi_core_data *core,
/* HDMI_CORE_DDC_STATUS_BUS_LOW */ /* HDMI_CORE_DDC_STATUS_BUS_LOW */
if (REG_GET(base, HDMI_CORE_DDC_STATUS, 6, 6) == 1) { if (REG_GET(base, HDMI_CORE_DDC_STATUS, 6, 6) == 1) {
pr_err("I2C Bus Low?\n"); DSSERR("I2C Bus Low?\n");
return -EIO; return -EIO;
} }
/* HDMI_CORE_DDC_STATUS_NO_ACK */ /* HDMI_CORE_DDC_STATUS_NO_ACK */
if (REG_GET(base, HDMI_CORE_DDC_STATUS, 5, 5) == 1) { if (REG_GET(base, HDMI_CORE_DDC_STATUS, 5, 5) == 1) {
pr_err("I2C No Ack\n"); DSSERR("I2C No Ack\n");
return -EIO; return -EIO;
} }
...@@ -161,7 +163,7 @@ static int hdmi_core_ddc_edid(struct hdmi_core_data *core, ...@@ -161,7 +163,7 @@ static int hdmi_core_ddc_edid(struct hdmi_core_data *core,
checksum += pedid[i]; checksum += pedid[i];
if (checksum != 0) { if (checksum != 0) {
pr_err("E-EDID checksum failed!!\n"); DSSERR("E-EDID checksum failed!!\n");
return -EIO; return -EIO;
} }
...@@ -199,7 +201,7 @@ static void hdmi_core_init(struct hdmi_core_video_config *video_cfg, ...@@ -199,7 +201,7 @@ static void hdmi_core_init(struct hdmi_core_video_config *video_cfg,
struct hdmi_core_infoframe_avi *avi_cfg, struct hdmi_core_infoframe_avi *avi_cfg,
struct hdmi_core_packet_enable_repeat *repeat_cfg) struct hdmi_core_packet_enable_repeat *repeat_cfg)
{ {
pr_debug("Enter hdmi_core_init\n"); DSSDBG("Enter hdmi_core_init\n");
/* video core */ /* video core */
video_cfg->ip_bus_width = HDMI_INPUT_8BIT; video_cfg->ip_bus_width = HDMI_INPUT_8BIT;
...@@ -241,19 +243,19 @@ static void hdmi_core_init(struct hdmi_core_video_config *video_cfg, ...@@ -241,19 +243,19 @@ static void hdmi_core_init(struct hdmi_core_video_config *video_cfg,
static void hdmi_core_powerdown_disable(struct hdmi_core_data *core) static void hdmi_core_powerdown_disable(struct hdmi_core_data *core)
{ {
pr_debug("Enter hdmi_core_powerdown_disable\n"); DSSDBG("Enter hdmi_core_powerdown_disable\n");
REG_FLD_MOD(core->base, HDMI_CORE_SYS_SYS_CTRL1, 0x0, 0, 0); REG_FLD_MOD(core->base, HDMI_CORE_SYS_SYS_CTRL1, 0x0, 0, 0);
} }
static void hdmi_core_swreset_release(struct hdmi_core_data *core) static void hdmi_core_swreset_release(struct hdmi_core_data *core)
{ {
pr_debug("Enter hdmi_core_swreset_release\n"); DSSDBG("Enter hdmi_core_swreset_release\n");
REG_FLD_MOD(core->base, HDMI_CORE_SYS_SRST, 0x0, 0, 0); REG_FLD_MOD(core->base, HDMI_CORE_SYS_SRST, 0x0, 0, 0);
} }
static void hdmi_core_swreset_assert(struct hdmi_core_data *core) static void hdmi_core_swreset_assert(struct hdmi_core_data *core)
{ {
pr_debug("Enter hdmi_core_swreset_assert\n"); DSSDBG("Enter hdmi_core_swreset_assert\n");
REG_FLD_MOD(core->base, HDMI_CORE_SYS_SRST, 0x1, 0, 0); REG_FLD_MOD(core->base, HDMI_CORE_SYS_SRST, 0x1, 0, 0);
} }
...@@ -1004,7 +1006,7 @@ int hdmi4_core_init(struct platform_device *pdev, struct hdmi_core_data *core) ...@@ -1004,7 +1006,7 @@ int hdmi4_core_init(struct platform_device *pdev, struct hdmi_core_data *core)
struct resource *res; struct resource *res;
struct resource temp_res; struct resource temp_res;
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi_core"); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "core");
if (!res) { if (!res) {
DSSDBG("can't get CORE mem resource by name\n"); DSSDBG("can't get CORE mem resource by name\n");
/* /*
......
...@@ -13,6 +13,8 @@ ...@@ -13,6 +13,8 @@
* map it to corresponding CEA or VESA index. * map it to corresponding CEA or VESA index.
*/ */
#define DSS_SUBSYS_NAME "HDMI"
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/err.h> #include <linux/err.h>
#include <video/omapdss.h> #include <video/omapdss.h>
......
...@@ -124,7 +124,7 @@ int hdmi_phy_init(struct platform_device *pdev, struct hdmi_phy_data *phy) ...@@ -124,7 +124,7 @@ int hdmi_phy_init(struct platform_device *pdev, struct hdmi_phy_data *phy)
struct resource *res; struct resource *res;
struct resource temp_res; struct resource temp_res;
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi_txphy"); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "phy");
if (!res) { if (!res) {
DSSDBG("can't get PHY mem resource by name\n"); DSSDBG("can't get PHY mem resource by name\n");
/* /*
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
* the Free Software Foundation. * the Free Software Foundation.
*/ */
#define DSS_SUBSYS_NAME "HDMIPLL"
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/err.h> #include <linux/err.h>
...@@ -127,24 +129,24 @@ static int hdmi_pll_config(struct hdmi_pll_data *pll) ...@@ -127,24 +129,24 @@ static int hdmi_pll_config(struct hdmi_pll_data *pll)
/* wait for bit change */ /* wait for bit change */
if (hdmi_wait_for_bit_change(pll->base, PLLCTRL_PLL_GO, if (hdmi_wait_for_bit_change(pll->base, PLLCTRL_PLL_GO,
0, 0, 1) != 1) { 0, 0, 1) != 1) {
pr_err("PLL GO bit not set\n"); DSSERR("PLL GO bit not set\n");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
/* Wait till the lock bit is set in PLL status */ /* Wait till the lock bit is set in PLL status */
if (hdmi_wait_for_bit_change(pll->base, if (hdmi_wait_for_bit_change(pll->base,
PLLCTRL_PLL_STATUS, 1, 1, 1) != 1) { PLLCTRL_PLL_STATUS, 1, 1, 1) != 1) {
pr_err("cannot lock PLL\n"); DSSERR("cannot lock PLL\n");
pr_err("CFG1 0x%x\n", DSSERR("CFG1 0x%x\n",
hdmi_read_reg(pll->base, PLLCTRL_CFG1)); hdmi_read_reg(pll->base, PLLCTRL_CFG1));
pr_err("CFG2 0x%x\n", DSSERR("CFG2 0x%x\n",
hdmi_read_reg(pll->base, PLLCTRL_CFG2)); hdmi_read_reg(pll->base, PLLCTRL_CFG2));
pr_err("CFG4 0x%x\n", DSSERR("CFG4 0x%x\n",
hdmi_read_reg(pll->base, PLLCTRL_CFG4)); hdmi_read_reg(pll->base, PLLCTRL_CFG4));
return -ETIMEDOUT; return -ETIMEDOUT;
} }
pr_debug("PLL locked!\n"); DSSDBG("PLL locked!\n");
return 0; return 0;
} }
...@@ -157,7 +159,7 @@ static int hdmi_pll_reset(struct hdmi_pll_data *pll) ...@@ -157,7 +159,7 @@ static int hdmi_pll_reset(struct hdmi_pll_data *pll)
/* READ 0x0 reset is in progress */ /* READ 0x0 reset is in progress */
if (hdmi_wait_for_bit_change(pll->base, PLLCTRL_PLL_STATUS, 0, 0, 1) if (hdmi_wait_for_bit_change(pll->base, PLLCTRL_PLL_STATUS, 0, 0, 1)
!= 1) { != 1) {
pr_err("Failed to sysreset PLL\n"); DSSERR("Failed to sysreset PLL\n");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
...@@ -200,7 +202,7 @@ int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll) ...@@ -200,7 +202,7 @@ int hdmi_pll_init(struct platform_device *pdev, struct hdmi_pll_data *pll)
struct resource *res; struct resource *res;
struct resource temp_res; struct resource temp_res;
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi_pllctrl"); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "pll");
if (!res) { if (!res) {
DSSDBG("can't get PLL mem resource by name\n"); DSSDBG("can't get PLL mem resource by name\n");
/* /*
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
* the Free Software Foundation. * the Free Software Foundation.
*/ */
#define DSS_SUBSYS_NAME "HDMIWP"
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/err.h> #include <linux/err.h>
#include <linux/io.h> #include <linux/io.h>
...@@ -34,7 +36,7 @@ void hdmi_wp_dump(struct hdmi_wp_data *wp, struct seq_file *s) ...@@ -34,7 +36,7 @@ void hdmi_wp_dump(struct hdmi_wp_data *wp, struct seq_file *s)
DUMPREG(HDMI_WP_VIDEO_SIZE); DUMPREG(HDMI_WP_VIDEO_SIZE);
DUMPREG(HDMI_WP_VIDEO_TIMING_H); DUMPREG(HDMI_WP_VIDEO_TIMING_H);
DUMPREG(HDMI_WP_VIDEO_TIMING_V); DUMPREG(HDMI_WP_VIDEO_TIMING_V);
DUMPREG(HDMI_WP_WP_CLK); DUMPREG(HDMI_WP_CLK);
DUMPREG(HDMI_WP_AUDIO_CFG); DUMPREG(HDMI_WP_AUDIO_CFG);
DUMPREG(HDMI_WP_AUDIO_CFG2); DUMPREG(HDMI_WP_AUDIO_CFG2);
DUMPREG(HDMI_WP_AUDIO_CTRL); DUMPREG(HDMI_WP_AUDIO_CTRL);
...@@ -76,7 +78,7 @@ int hdmi_wp_set_phy_pwr(struct hdmi_wp_data *wp, enum hdmi_phy_pwr val) ...@@ -76,7 +78,7 @@ int hdmi_wp_set_phy_pwr(struct hdmi_wp_data *wp, enum hdmi_phy_pwr val)
/* Status of the power control of HDMI PHY */ /* Status of the power control of HDMI PHY */
if (hdmi_wait_for_bit_change(wp->base, HDMI_WP_PWR_CTRL, 5, 4, val) if (hdmi_wait_for_bit_change(wp->base, HDMI_WP_PWR_CTRL, 5, 4, val)
!= val) { != val) {
pr_err("Failed to set PHY power mode to %d\n", val); DSSERR("Failed to set PHY power mode to %d\n", val);
return -ETIMEDOUT; return -ETIMEDOUT;
} }
...@@ -92,7 +94,7 @@ int hdmi_wp_set_pll_pwr(struct hdmi_wp_data *wp, enum hdmi_pll_pwr val) ...@@ -92,7 +94,7 @@ int hdmi_wp_set_pll_pwr(struct hdmi_wp_data *wp, enum hdmi_pll_pwr val)
/* wait till PHY_PWR_STATUS is set */ /* wait till PHY_PWR_STATUS is set */
if (hdmi_wait_for_bit_change(wp->base, HDMI_WP_PWR_CTRL, 1, 0, val) if (hdmi_wait_for_bit_change(wp->base, HDMI_WP_PWR_CTRL, 1, 0, val)
!= val) { != val) {
pr_err("Failed to set PLL_PWR_STATUS\n"); DSSERR("Failed to set PLL_PWR_STATUS\n");
return -ETIMEDOUT; return -ETIMEDOUT;
} }
...@@ -129,7 +131,7 @@ void hdmi_wp_video_config_interface(struct hdmi_wp_data *wp, ...@@ -129,7 +131,7 @@ void hdmi_wp_video_config_interface(struct hdmi_wp_data *wp,
{ {
u32 r; u32 r;
bool vsync_pol, hsync_pol; bool vsync_pol, hsync_pol;
pr_debug("Enter hdmi_wp_video_config_interface\n"); DSSDBG("Enter hdmi_wp_video_config_interface\n");
vsync_pol = timings->vsync_level == OMAPDSS_SIG_ACTIVE_HIGH; vsync_pol = timings->vsync_level == OMAPDSS_SIG_ACTIVE_HIGH;
hsync_pol = timings->hsync_level == OMAPDSS_SIG_ACTIVE_HIGH; hsync_pol = timings->hsync_level == OMAPDSS_SIG_ACTIVE_HIGH;
...@@ -148,7 +150,7 @@ void hdmi_wp_video_config_timing(struct hdmi_wp_data *wp, ...@@ -148,7 +150,7 @@ void hdmi_wp_video_config_timing(struct hdmi_wp_data *wp,
u32 timing_h = 0; u32 timing_h = 0;
u32 timing_v = 0; u32 timing_v = 0;
pr_debug("Enter hdmi_wp_video_config_timing\n"); DSSDBG("Enter hdmi_wp_video_config_timing\n");
timing_h |= FLD_VAL(timings->hbp, 31, 20); timing_h |= FLD_VAL(timings->hbp, 31, 20);
timing_h |= FLD_VAL(timings->hfp, 19, 8); timing_h |= FLD_VAL(timings->hfp, 19, 8);
...@@ -164,7 +166,7 @@ void hdmi_wp_video_config_timing(struct hdmi_wp_data *wp, ...@@ -164,7 +166,7 @@ void hdmi_wp_video_config_timing(struct hdmi_wp_data *wp,
void hdmi_wp_init_vid_fmt_timings(struct hdmi_video_format *video_fmt, void hdmi_wp_init_vid_fmt_timings(struct hdmi_video_format *video_fmt,
struct omap_video_timings *timings, struct hdmi_config *param) struct omap_video_timings *timings, struct hdmi_config *param)
{ {
pr_debug("Enter hdmi_wp_video_init_format\n"); DSSDBG("Enter hdmi_wp_video_init_format\n");
video_fmt->packing_mode = HDMI_PACK_10b_RGB_YUV444; video_fmt->packing_mode = HDMI_PACK_10b_RGB_YUV444;
video_fmt->y_res = param->timings.y_res; video_fmt->y_res = param->timings.y_res;
...@@ -241,7 +243,7 @@ int hdmi_wp_init(struct platform_device *pdev, struct hdmi_wp_data *wp) ...@@ -241,7 +243,7 @@ int hdmi_wp_init(struct platform_device *pdev, struct hdmi_wp_data *wp)
struct resource *res; struct resource *res;
struct resource temp_res; struct resource temp_res;
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "hdmi_wp"); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "wp");
if (!res) { if (!res) {
DSSDBG("can't get WP mem resource by name\n"); DSSDBG("can't get WP mem resource by name\n");
/* /*
......
...@@ -113,11 +113,6 @@ void dss_uninit_overlays(struct platform_device *pdev) ...@@ -113,11 +113,6 @@ void dss_uninit_overlays(struct platform_device *pdev)
int dss_ovl_simple_check(struct omap_overlay *ovl, int dss_ovl_simple_check(struct omap_overlay *ovl,
const struct omap_overlay_info *info) const struct omap_overlay_info *info)
{ {
if (info->paddr == 0) {
DSSERR("check_overlay: paddr cannot be 0\n");
return -EINVAL;
}
if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) { if ((ovl->caps & OMAP_DSS_OVL_CAP_SCALE) == 0) {
if (info->out_width != 0 && info->width != info->out_width) { if (info->out_width != 0 && info->width != info->out_width) {
DSSERR("check_overlay: overlay %d doesn't support " DSSERR("check_overlay: overlay %d doesn't support "
......
...@@ -46,7 +46,7 @@ static struct { ...@@ -46,7 +46,7 @@ static struct {
struct sdi_clk_calc_ctx { struct sdi_clk_calc_ctx {
unsigned long pck_min, pck_max; unsigned long pck_min, pck_max;
struct dss_clock_info dss_cinfo; unsigned long long fck;
struct dispc_clock_info dispc_cinfo; struct dispc_clock_info dispc_cinfo;
}; };
...@@ -63,19 +63,18 @@ static bool dpi_calc_dispc_cb(int lckd, int pckd, unsigned long lck, ...@@ -63,19 +63,18 @@ static bool dpi_calc_dispc_cb(int lckd, int pckd, unsigned long lck,
return true; return true;
} }
static bool dpi_calc_dss_cb(int fckd, unsigned long fck, void *data) static bool dpi_calc_dss_cb(unsigned long fck, void *data)
{ {
struct sdi_clk_calc_ctx *ctx = data; struct sdi_clk_calc_ctx *ctx = data;
ctx->dss_cinfo.fck = fck; ctx->fck = fck;
ctx->dss_cinfo.fck_div = fckd;
return dispc_div_calc(fck, ctx->pck_min, ctx->pck_max, return dispc_div_calc(fck, ctx->pck_min, ctx->pck_max,
dpi_calc_dispc_cb, ctx); dpi_calc_dispc_cb, ctx);
} }
static int sdi_calc_clock_div(unsigned long pclk, static int sdi_calc_clock_div(unsigned long pclk,
struct dss_clock_info *dss_cinfo, unsigned long *fck,
struct dispc_clock_info *dispc_cinfo) struct dispc_clock_info *dispc_cinfo)
{ {
int i; int i;
...@@ -98,9 +97,9 @@ static int sdi_calc_clock_div(unsigned long pclk, ...@@ -98,9 +97,9 @@ static int sdi_calc_clock_div(unsigned long pclk,
ctx.pck_min = 0; ctx.pck_min = 0;
ctx.pck_max = pclk + 1000 * i * i * i; ctx.pck_max = pclk + 1000 * i * i * i;
ok = dss_div_calc(ctx.pck_min, dpi_calc_dss_cb, &ctx); ok = dss_div_calc(pclk, ctx.pck_min, dpi_calc_dss_cb, &ctx);
if (ok) { if (ok) {
*dss_cinfo = ctx.dss_cinfo; *fck = ctx.fck;
*dispc_cinfo = ctx.dispc_cinfo; *dispc_cinfo = ctx.dispc_cinfo;
return 0; return 0;
} }
...@@ -128,7 +127,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev) ...@@ -128,7 +127,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
{ {
struct omap_dss_device *out = &sdi.output; struct omap_dss_device *out = &sdi.output;
struct omap_video_timings *t = &sdi.timings; struct omap_video_timings *t = &sdi.timings;
struct dss_clock_info dss_cinfo; unsigned long fck;
struct dispc_clock_info dispc_cinfo; struct dispc_clock_info dispc_cinfo;
unsigned long pck; unsigned long pck;
int r; int r;
...@@ -150,13 +149,13 @@ static int sdi_display_enable(struct omap_dss_device *dssdev) ...@@ -150,13 +149,13 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
t->data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE; t->data_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE;
t->sync_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE; t->sync_pclk_edge = OMAPDSS_DRIVE_SIG_RISING_EDGE;
r = sdi_calc_clock_div(t->pixel_clock * 1000, &dss_cinfo, &dispc_cinfo); r = sdi_calc_clock_div(t->pixel_clock * 1000, &fck, &dispc_cinfo);
if (r) if (r)
goto err_calc_clock_div; goto err_calc_clock_div;
sdi.mgr_config.clock_info = dispc_cinfo; sdi.mgr_config.clock_info = dispc_cinfo;
pck = dss_cinfo.fck / dispc_cinfo.lck_div / dispc_cinfo.pck_div / 1000; pck = fck / dispc_cinfo.lck_div / dispc_cinfo.pck_div / 1000;
if (pck != t->pixel_clock) { if (pck != t->pixel_clock) {
DSSWARN("Could not find exact pixel clock. Requested %d kHz, " DSSWARN("Could not find exact pixel clock. Requested %d kHz, "
...@@ -169,7 +168,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev) ...@@ -169,7 +168,7 @@ static int sdi_display_enable(struct omap_dss_device *dssdev)
dss_mgr_set_timings(out->manager, t); dss_mgr_set_timings(out->manager, t);
r = dss_set_clock_div(&dss_cinfo); r = dss_set_fck_rate(fck);
if (r) if (r)
goto err_set_dss_clock_div; goto err_set_dss_clock_div;
...@@ -265,7 +264,8 @@ static int sdi_init_regulator(void) ...@@ -265,7 +264,8 @@ static int sdi_init_regulator(void)
vdds_sdi = devm_regulator_get(&sdi.pdev->dev, "vdds_sdi"); vdds_sdi = devm_regulator_get(&sdi.pdev->dev, "vdds_sdi");
if (IS_ERR(vdds_sdi)) { if (IS_ERR(vdds_sdi)) {
DSSERR("can't get VDDS_SDI regulator\n"); if (PTR_ERR(vdds_sdi) != -EPROBE_DEFER)
DSSERR("can't get VDDS_SDI regulator\n");
return PTR_ERR(vdds_sdi); return PTR_ERR(vdds_sdi);
} }
......
...@@ -639,7 +639,8 @@ static int venc_init_regulator(void) ...@@ -639,7 +639,8 @@ static int venc_init_regulator(void)
vdda_dac = devm_regulator_get(&venc.pdev->dev, "vdda_dac"); vdda_dac = devm_regulator_get(&venc.pdev->dev, "vdda_dac");
if (IS_ERR(vdda_dac)) { if (IS_ERR(vdda_dac)) {
DSSERR("can't get VDDA_DAC regulator\n"); if (PTR_ERR(vdda_dac) != -EPROBE_DEFER)
DSSERR("can't get VDDA_DAC regulator\n");
return PTR_ERR(vdda_dac); return PTR_ERR(vdda_dac);
} }
......
...@@ -1833,6 +1833,16 @@ static void omapfb_free_resources(struct omapfb2_device *fbdev) ...@@ -1833,6 +1833,16 @@ static void omapfb_free_resources(struct omapfb2_device *fbdev)
if (fbdev == NULL) if (fbdev == NULL)
return; return;
for (i = 0; i < fbdev->num_fbs; i++) {
struct omapfb_info *ofbi = FB2OFB(fbdev->fbs[i]);
int j;
for (j = 0; j < ofbi->num_overlays; j++) {
struct omap_overlay *ovl = ofbi->overlays[j];
ovl->disable(ovl);
}
}
for (i = 0; i < fbdev->num_fbs; i++) for (i = 0; i < fbdev->num_fbs; i++)
unregister_framebuffer(fbdev->fbs[i]); unregister_framebuffer(fbdev->fbs[i]);
...@@ -2557,6 +2567,15 @@ static int omapfb_probe(struct platform_device *pdev) ...@@ -2557,6 +2567,15 @@ static int omapfb_probe(struct platform_device *pdev)
goto cleanup; goto cleanup;
} }
if (def_display) {
u16 w, h;
def_display->driver->get_resolution(def_display, &w, &h);
dev_info(fbdev->dev, "using display '%s' mode %dx%d\n",
def_display->name, w, h);
}
return 0; return 0;
cleanup: cleanup:
......
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