diff options
Diffstat (limited to 'drivers/video/omap2')
-rw-r--r-- | drivers/video/omap2/dss/core.c | 1 | ||||
-rw-r--r-- | drivers/video/omap2/dss/dispc.c | 358 | ||||
-rw-r--r-- | drivers/video/omap2/dss/display.c | 12 | ||||
-rw-r--r-- | drivers/video/omap2/dss/hdmi_panel.c | 4 | ||||
-rw-r--r-- | drivers/video/omap2/dss/manager.c | 11 | ||||
-rw-r--r-- | drivers/video/omap2/dsscomp/device.c | 5 | ||||
-rw-r--r-- | drivers/video/omap2/omapfb/omapfb-ioctl.c | 13 | ||||
-rw-r--r-- | drivers/video/omap2/omapfb/omapfb-main.c | 8 |
8 files changed, 283 insertions, 129 deletions
diff --git a/drivers/video/omap2/dss/core.c b/drivers/video/omap2/dss/core.c index 20a55d0..2a1e6ed 100644 --- a/drivers/video/omap2/dss/core.c +++ b/drivers/video/omap2/dss/core.c @@ -427,6 +427,7 @@ static void omap_dss_driver_disable(struct omap_dss_device *dssdev) blocking_notifier_call_chain(&dssdev->state_notifiers, OMAP_DSS_DISPLAY_DISABLED, dssdev); dssdev->driver->disable_orig(dssdev); + dssdev->first_vsync = false; } static int omap_dss_driver_enable(struct omap_dss_device *dssdev) diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c index 0e7ded0..3fa7cf5 100644 --- a/drivers/video/omap2/dss/dispc.c +++ b/drivers/video/omap2/dss/dispc.c @@ -65,20 +65,12 @@ struct omap_dispc_isr_data { u32 mask; }; -struct dispc_h_coef { - s8 hc4; - s8 hc3; - u8 hc2; - s8 hc1; - s8 hc0; -}; - -struct dispc_v_coef { - s8 vc22; - s8 vc2; - u8 vc1; - s8 vc0; - s8 vc00; +struct dispc_hv_coef { + s8 hc0_vc00; + s8 hc1_vc0; + u8 hc2_vc1; + s8 hc3_vc2; + s8 hc4_vc22; }; #define REG_GET(idx, start, end) \ @@ -618,105 +610,227 @@ static void _dispc_write_firv2_reg(enum omap_plane plane, int reg, u32 value) dispc_write_reg(DISPC_OVL_FIR_COEF_V2(plane, reg), value); } -static void _dispc_set_scale_coef(enum omap_plane plane, int hscaleup, - int vscaleup, int five_taps, - enum omap_color_component color_comp) +static const struct dispc_hv_coef * +dispc_get_scaling_coef(u32 inc, bool five_taps) { - /* Coefficients for horizontal up-sampling */ - static const struct dispc_h_coef coef_hup[8] = { - { 0, 0, 128, 0, 0 }, - { -1, 13, 124, -8, 0 }, - { -2, 30, 112, -11, -1 }, - { -5, 51, 95, -11, -2 }, - { 0, -9, 73, 73, -9 }, - { -2, -11, 95, 51, -5 }, - { -1, -11, 112, 30, -2 }, - { 0, -8, 124, 13, -1 }, + static const struct dispc_hv_coef coef3_M8[8] = { + { 0, 0, 128, 0, 0 }, + { 0, 2, 123, 3, 0 }, + { 0, 5, 111, 12, 0 }, + { 0, 7, 89, 32, 0 }, + { 0, 64, 64, 0, 0 }, + { 0, 32, 89, 7, 0 }, + { 0, 12, 111, 5, 0 }, + { 0, 3, 123, 2, 0 }, }; - /* Coefficients for vertical up-sampling */ - static const struct dispc_v_coef coef_vup_3tap[8] = { - { 0, 0, 128, 0, 0 }, - { 0, 3, 123, 2, 0 }, - { 0, 12, 111, 5, 0 }, - { 0, 32, 89, 7, 0 }, - { 0, 0, 64, 64, 0 }, - { 0, 7, 89, 32, 0 }, - { 0, 5, 111, 12, 0 }, - { 0, 2, 123, 3, 0 }, + static const struct dispc_hv_coef coef3_M16[8] = { + { 0, 36, 56, 36, 0 }, + { 0, 31, 57, 40, 0 }, + { 0, 27, 56, 45, 0 }, + { 0, 23, 55, 50, 0 }, + { 0, 55, 55, 18, 0 }, + { 0, 50, 55, 23, 0 }, + { 0, 45, 56, 27, 0 }, + { 0, 40, 57, 31, 0 }, }; - static const struct dispc_v_coef coef_vup_5tap[8] = { - { 0, 0, 128, 0, 0 }, - { -1, 13, 124, -8, 0 }, - { -2, 30, 112, -11, -1 }, - { -5, 51, 95, -11, -2 }, - { 0, -9, 73, 73, -9 }, - { -2, -11, 95, 51, -5 }, - { -1, -11, 112, 30, -2 }, - { 0, -8, 124, 13, -1 }, + static const struct dispc_hv_coef coef_M8[8] = { + { 0, 0, 128, 0, 0 }, + { 0, -8, 124, 13, -1 }, + { -1, -11, 112, 30, -2 }, + { -2, -11, 95, 51, -5 }, + { -9, 73, 73, -9, 0 }, + { -5, 51, 95, -11, -2 }, + { -2, 30, 112, -11, -1 }, + { -1, 13, 124, -8, 0 }, }; - /* Coefficients for horizontal down-sampling */ - static const struct dispc_h_coef coef_hdown[8] = { - { 0, 36, 56, 36, 0 }, - { 4, 40, 55, 31, -2 }, - { 8, 44, 54, 27, -5 }, - { 12, 48, 53, 22, -7 }, - { -9, 17, 52, 51, 17 }, - { -7, 22, 53, 48, 12 }, - { -5, 27, 54, 44, 8 }, - { -2, 31, 55, 40, 4 }, + static const struct dispc_hv_coef coef_M9[8] = { + { 8, -8, 128, -8, 8 }, + { 14, -21, 126, 8, 1 }, + { 17, -27, 117, 30, -9 }, + { 17, -30, 103, 56, -18 }, + { -26, 83, 83, -26, 14 }, + { -18, 56, 103, -30, 17 }, + { -9, 30, 117, -27, 17 }, + { 1, 8, 126, -21, 14 }, }; - /* Coefficients for vertical down-sampling */ - static const struct dispc_v_coef coef_vdown_3tap[8] = { - { 0, 36, 56, 36, 0 }, - { 0, 40, 57, 31, 0 }, - { 0, 45, 56, 27, 0 }, - { 0, 50, 55, 23, 0 }, - { 0, 18, 55, 55, 0 }, - { 0, 23, 55, 50, 0 }, - { 0, 27, 56, 45, 0 }, - { 0, 31, 57, 40, 0 }, + static const struct dispc_hv_coef coef_M10[8] = { + { -2, 2, 128, 2, -2 }, + { 5, -12, 125, 20, -10 }, + { 11, -22, 116, 41, -18 }, + { 15, -27, 102, 62, -24 }, + { -28, 83, 83, -28, 18 }, + { -24, 62, 102, -27, 15 }, + { -18, 41, 116, -22, 11 }, + { -10, 20, 125, -12, 5 }, }; - static const struct dispc_v_coef coef_vdown_5tap[8] = { - { 0, 36, 56, 36, 0 }, - { 4, 40, 55, 31, -2 }, - { 8, 44, 54, 27, -5 }, - { 12, 48, 53, 22, -7 }, - { -9, 17, 52, 51, 17 }, - { -7, 22, 53, 48, 12 }, - { -5, 27, 54, 44, 8 }, - { -2, 31, 55, 40, 4 }, + static const struct dispc_hv_coef coef_M11[8] = { + { -12, 12, 128, 12, -12 }, + { -4, -3, 124, 30, -19 }, + { 3, -15, 115, 49, -24 }, + { 9, -22, 101, 67, -27 }, + { -26, 83, 83, -26, 14 }, + { -27, 67, 101, -22, 9 }, + { -24, 49, 115, -15, 3 }, + { -19, 30, 124, -3, -4 }, }; - const struct dispc_h_coef *h_coef; - const struct dispc_v_coef *v_coef; - int i; + static const struct dispc_hv_coef coef_M12[8] = { + { -19, 21, 124, 21, -19 }, + { -12, 6, 120, 38, -24 }, + { -6, -7, 112, 55, -26 }, + { 1, -16, 98, 70, -25 }, + { -21, 82, 82, -21, 6 }, + { -25, 70, 98, -16, 1 }, + { -26, 55, 112, -7, -6 }, + { -24, 38, 120, 6, -12 }, + }; - if (hscaleup) - h_coef = coef_hup; - else - h_coef = coef_hdown; + static const struct dispc_hv_coef coef_M13[8] = { + { -22, 27, 118, 27, -22 }, + { -18, 13, 115, 43, -25 }, + { -12, 0, 107, 58, -25 }, + { -6, -10, 95, 71, -22 }, + { -17, 81, 81, -17, 0 }, + { -22, 71, 95, -10, -6 }, + { -25, 58, 107, 0, -12 }, + { -25, 43, 115, 13, -18 }, + }; - if (vscaleup) - v_coef = five_taps ? coef_vup_5tap : coef_vup_3tap; - else - v_coef = five_taps ? coef_vdown_5tap : coef_vdown_3tap; + static const struct dispc_hv_coef coef_M14[8] = { + { -23, 32, 110, 32, -23 }, + { -20, 18, 108, 46, -24 }, + { -16, 6, 101, 59, -22 }, + { -11, -4, 91, 70, -18 }, + { -11, 78, 78, -11, -6 }, + { -18, 70, 91, -4, -11 }, + { -22, 59, 101, 6, -16 }, + { -24, 46, 108, 18, -20 }, + }; + + static const struct dispc_hv_coef coef_M16[8] = { + { -20, 37, 94, 37, -20 }, + { -21, 26, 93, 48, -18 }, + { -19, 15, 88, 58, -14 }, + { -17, 6, 82, 66, -9 }, + { -2, 73, 73, -2, -14 }, + { -9, 66, 82, 6, -17 }, + { -14, 58, 88, 15, -19 }, + { -18, 48, 93, 26, -21 }, + }; + + static const struct dispc_hv_coef coef_M19[8] = { + { -12, 38, 76, 38, -12 }, + { -14, 31, 72, 47, -8 }, + { -16, 22, 73, 53, -4 }, + { -16, 15, 69, 59, 1 }, + { 8, 64, 64, 8, -16 }, + { 1, 59, 69, 15, -16 }, + { -4, 53, 73, 22, -16 }, + { -9, 47, 72, 31, -13 }, + }; + + static const struct dispc_hv_coef coef_M22[8] = { + { -6, 37, 66, 37, -6 }, + { -8, 32, 61, 44, -1 }, + { -11, 25, 63, 48, 3 }, + { -13, 19, 61, 53, 8 }, + { 13, 58, 58, 13, -14 }, + { 8, 53, 61, 19, -13 }, + { 3, 48, 63, 25, -11 }, + { -2, 44, 61, 32, -7 }, + }; + + static const struct dispc_hv_coef coef_M26[8] = { + { 1, 36, 54, 36, 1 }, + { -2, 31, 55, 40, 4 }, + { -5, 27, 54, 44, 8 }, + { -8, 22, 53, 48, 13 }, + { 18, 51, 51, 18, -10 }, + { 13, 48, 53, 22, -8 }, + { 8, 44, 54, 27, -5 }, + { 4, 40, 55, 31, -2 }, + }; + + static const struct dispc_hv_coef coef_M32[8] = { + { 7, 34, 46, 34, 7 }, + { 4, 31, 46, 37, 10 }, + { 1, 27, 46, 39, 14 }, + { -1, 24, 46, 42, 17 }, + { 21, 45, 45, 21, -4 }, + { 17, 42, 46, 24, -1 }, + { 14, 39, 46, 28, 1 }, + { 10, 37, 46, 31, 4 }, + }; + + inc >>= 7; /* /= 128 */ + if (five_taps) { + if (inc > 26) + return coef_M32; + if (inc > 22) + return coef_M26; + if (inc > 19) + return coef_M22; + if (inc > 16) + return coef_M19; + if (inc > 14) + return coef_M16; + if (inc > 13) + return coef_M14; + if (inc > 12) + return coef_M13; + if (inc > 11) + return coef_M12; + if (inc > 10) + return coef_M11; + if (inc > 9) + return coef_M10; + if (inc > 8) + return coef_M9; + /* reduce blockiness when upscaling much */ + if (inc > 3) + return coef_M8; + if (inc > 2) + return coef_M11; + if (inc > 1) + return coef_M16; + return coef_M19; + } else { + if (inc > 14) + return coef3_M16; + /* reduce blockiness when upscaling much */ + if (inc > 3) + return coef3_M8; + return coef3_M16; + } +} + +static void _dispc_set_scale_coef(enum omap_plane plane, int hinc, + int vinc, bool five_taps, + enum omap_color_component color_comp) +{ + const struct dispc_hv_coef *h_coef; + const struct dispc_hv_coef *v_coef; + int i; + + h_coef = dispc_get_scaling_coef(hinc, true); + v_coef = dispc_get_scaling_coef(vinc, five_taps); for (i = 0; i < 8; i++) { u32 h, hv; - h = FLD_VAL(h_coef[i].hc0, 7, 0) - | FLD_VAL(h_coef[i].hc1, 15, 8) - | FLD_VAL(h_coef[i].hc2, 23, 16) - | FLD_VAL(h_coef[i].hc3, 31, 24); - hv = FLD_VAL(h_coef[i].hc4, 7, 0) - | FLD_VAL(v_coef[i].vc0, 15, 8) - | FLD_VAL(v_coef[i].vc1, 23, 16) - | FLD_VAL(v_coef[i].vc2, 31, 24); + h = FLD_VAL(h_coef[i].hc0_vc00, 7, 0) + | FLD_VAL(h_coef[i].hc1_vc0, 15, 8) + | FLD_VAL(h_coef[i].hc2_vc1, 23, 16) + | FLD_VAL(h_coef[i].hc3_vc2, 31, 24); + hv = FLD_VAL(h_coef[i].hc4_vc22, 7, 0) + | FLD_VAL(v_coef[i].hc1_vc0, 15, 8) + | FLD_VAL(v_coef[i].hc2_vc1, 23, 16) + | FLD_VAL(v_coef[i].hc3_vc2, 31, 24); if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) { _dispc_write_firh_reg(plane, i, h); @@ -725,14 +839,13 @@ static void _dispc_set_scale_coef(enum omap_plane plane, int hscaleup, _dispc_write_firh2_reg(plane, i, h); _dispc_write_firhv2_reg(plane, i, hv); } - } if (five_taps) { for (i = 0; i < 8; i++) { u32 v; - v = FLD_VAL(v_coef[i].vc00, 7, 0) - | FLD_VAL(v_coef[i].vc22, 15, 8); + v = FLD_VAL(v_coef[i].hc0_vc00, 7, 0) + | FLD_VAL(v_coef[i].hc4_vc22, 15, 8); if (color_comp == DISPC_COLOR_COMPONENT_RGB_Y) _dispc_write_firv_reg(plane, i, v); else @@ -1261,8 +1374,9 @@ static void _dispc_set_scaling_common(enum omap_plane plane, int accu0 = 0; int accu1 = 0; u32 l; + u16 y_adjust = color_mode == OMAP_DSS_COLOR_NV12 ? 2 : 0; - _dispc_set_scale_param(plane, orig_width, orig_height, + _dispc_set_scale_param(plane, orig_width, orig_height - y_adjust, out_width, out_height, five_taps, rotation, DISPC_COLOR_COMPONENT_RGB_Y); l = dispc_read_reg(DISPC_OVL_ATTRIBUTES(plane)); @@ -1314,6 +1428,7 @@ static void _dispc_set_scaling_uv(enum omap_plane plane, { int scale_x = out_width != orig_width; int scale_y = out_height != orig_height; + u16 y_adjust = 0; if (!dss_has_feature(FEAT_HANDLE_UV_SEPARATE)) return; @@ -1330,6 +1445,7 @@ static void _dispc_set_scaling_uv(enum omap_plane plane, orig_height >>= 1; /* UV is subsampled by 2 horz.*/ orig_width >>= 1; + y_adjust = 1; break; case OMAP_DSS_COLOR_YUV2: case OMAP_DSS_COLOR_UYVY: @@ -1353,7 +1469,7 @@ static void _dispc_set_scaling_uv(enum omap_plane plane, if (out_height != orig_height) scale_y = true; - _dispc_set_scale_param(plane, orig_width, orig_height, + _dispc_set_scale_param(plane, orig_width, orig_height - y_adjust, out_width, out_height, five_taps, rotation, DISPC_COLOR_COMPONENT_UV); @@ -1765,10 +1881,17 @@ static unsigned long calc_fclk_five_taps(enum omap_channel channel, u16 width, /* FIXME venc pclk? */ u64 tmp, pclk = dispc_pclk_rate(channel); - /* do conservative guess on OMAP4 until better formula is available */ - if (cpu_is_omap44xx()) - return pclk * DIV_ROUND_UP(width, out_width) * - DIV_ROUND_UP(height, out_height); + if (cpu_is_omap44xx()) { + /* do conservative TRM value on OMAP4 ES1.0 */ + if (omap_rev() == OMAP4430_REV_ES1_0) + return pclk * DIV_ROUND_UP(width, out_width) * + DIV_ROUND_UP(height, out_height); + + /* since 4430 ES2.0, fclk requirement only depends on width */ + pclk *= max(width, out_width); + do_div(pclk, out_width); + return pclk; + } if (height > out_height) { /* FIXME get real display PPL */ @@ -1805,6 +1928,11 @@ static unsigned long calc_fclk(enum omap_channel channel, u16 width, { unsigned int hf, vf; + /* on OMAP4 three-tap and five-tap clock requirements are the same */ + if (cpu_is_omap44xx()) + return calc_fclk_five_taps(channel, width, height, out_width, + out_height, 0); + /* * FIXME how to determine the 'A' factor * for the no downscaling case ? @@ -1940,9 +2068,6 @@ int dispc_scaling_decision(u16 width, u16 height, else *five_taps = true; - /* Also use 3-tap if downscaling by 2 or less */ - *five_taps &= out_height * 2 < in_height; - /* * Predecimation on OMAP4 still fetches the whole lines * :TODO: How does it affect the required clock speed? @@ -1957,9 +2082,6 @@ int dispc_scaling_decision(u16 width, u16 height, in_width, x, in_height, y, out_width, out_height, fclk, fclk5); - /* Use 3-tap if 5-tap clock requirement is too high */ - *five_taps &= fclk5 <= fclk_max; - /* for now we always use 5-tap unless 3-tap is required */ if (*five_taps) fclk = fclk5; @@ -2794,13 +2916,23 @@ unsigned long dispc_pclk_rate(enum omap_channel channel) unsigned long r; u32 l; - l = dispc_read_reg(DISPC_DIVISORo(channel)); + if (channel == OMAP_DSS_CHANNEL_LCD || + channel == OMAP_DSS_CHANNEL_LCD2) { + l = dispc_read_reg(DISPC_DIVISORo(channel)); - pcd = FLD_GET(l, 7, 0); + pcd = FLD_GET(l, 7, 0); - r = dispc_lclk_rate(channel); + r = dispc_lclk_rate(channel); - return r / pcd; + return r / pcd; + } else { + struct omap_overlay_manager *mgr; + mgr = omap_dss_get_overlay_manager(channel); + if (!mgr || !mgr->device) + return 0; + + return mgr->device->panel.timings.pixel_clock * 1000; + } } void dispc_dump_clocks(struct seq_file *s) diff --git a/drivers/video/omap2/dss/display.c b/drivers/video/omap2/dss/display.c index e2ae27f..8b3b360 100644 --- a/drivers/video/omap2/dss/display.c +++ b/drivers/video/omap2/dss/display.c @@ -339,6 +339,18 @@ void default_get_overlay_fifo_thresholds(enum omap_plane plane, *fifo_low = fifo_size - burst_size_bytes; } +void omapdss_display_get_dimensions(struct omap_dss_device *dssdev, + u32 *width_in_um, u32 *height_in_um) +{ + if (dssdev->driver->get_dimensions) { + dssdev->driver->get_dimensions(dssdev, + width_in_um, width_in_um); + } else { + *width_in_um = dssdev->panel.width_in_um; + *height_in_um = dssdev->panel.height_in_um; + } +} + int omapdss_default_get_recommended_bpp(struct omap_dss_device *dssdev) { switch (dssdev->type) { diff --git a/drivers/video/omap2/dss/hdmi_panel.c b/drivers/video/omap2/dss/hdmi_panel.c index 9e2cfc3..0fa5dea 100644 --- a/drivers/video/omap2/dss/hdmi_panel.c +++ b/drivers/video/omap2/dss/hdmi_panel.c @@ -220,6 +220,10 @@ static void hdmi_hotplug_detect_worker(struct work_struct *work) pr_info("panel size %d by %d\n", dssdev->panel.monspecs.max_x, dssdev->panel.monspecs.max_y); + dssdev->panel.width_in_um = + dssdev->panel.monspecs.max_x * 10000; + dssdev->panel.height_in_um = + dssdev->panel.monspecs.max_y * 10000; switch_set_state(&hdmi.hpd_switch, 1); goto done; } else if (state == HPD_STATE_EDID_TRYLAST){ diff --git a/drivers/video/omap2/dss/manager.c b/drivers/video/omap2/dss/manager.c index f933996..6485eff 100644 --- a/drivers/video/omap2/dss/manager.c +++ b/drivers/video/omap2/dss/manager.c @@ -39,6 +39,7 @@ static int num_managers; static struct list_head manager_list; +static struct omap_overlay_manager *mgrs[MAX_DSS_MANAGERS]; static ssize_t manager_name_show(struct omap_overlay_manager *mgr, char *buf) { @@ -716,7 +717,7 @@ static int dss_mgr_wait_for_vsync(struct omap_overlay_manager *mgr) } r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); - if(!r) + if (!r) mgr->device->first_vsync = true; return r; @@ -784,6 +785,8 @@ static int dss_mgr_wait_for_go(struct omap_overlay_manager *mgr) } r = omap_dispc_wait_for_irq_interruptible_timeout(irq, timeout); + if (!r) + mgr->device->first_vsync = true; if (r == -ERESTARTSYS) break; @@ -1403,6 +1406,8 @@ static void dss_completion_irq_handler(void *data, u32 mask) for (i = 0; i < num_mgrs; i++) { mc = &dss_cache.manager_cache[i]; if (mask & masks[i]) { + if (mgrs[i] && mgrs[i]->device) + mgrs[i]->device->first_vsync = true; dss_ovl_cb(&mc->cb.dispc, i, DSS_COMPLETION_DISPLAYED); mc->cb.dispc_displayed = true; } @@ -1531,6 +1536,8 @@ static void dss_apply_irq_handler(void *data, u32 mask) for (i = 0; i < num_mgrs; ++i) { mc = &dss_cache.manager_cache[i]; if (!mgr_busy[i] && mc->shadow_dirty) { + if (mgrs[i] && mgrs[i]->device) + mgrs[i]->device->first_vsync = true; dss_ovl_program_cb(&mc->cb, i); mc->shadow_dirty = false; } @@ -2077,6 +2084,8 @@ static void omap_dss_add_overlay_manager(struct omap_overlay_manager *manager) { ++num_managers; list_add_tail(&manager->list, &manager_list); + if (manager->id < ARRAY_SIZE(mgrs)) + mgrs[manager->id] = manager; } int dss_init_overlay_managers(struct platform_device *pdev) diff --git a/drivers/video/omap2/dsscomp/device.c b/drivers/video/omap2/dsscomp/device.c index 59da904..2986687 100644 --- a/drivers/video/omap2/dsscomp/device.c +++ b/drivers/video/omap2/dsscomp/device.c @@ -306,9 +306,8 @@ static long query_display(struct dsscomp_dev *cdev, dis->state = dev->state; dis->timings = dev->panel.timings; - /* for now LCD panels don't have width and height */ - dis->width_in_mm = dev->panel.monspecs.max_x * 10; - dis->height_in_mm = dev->panel.monspecs.max_y * 10; + dis->width_in_mm = DIV_ROUND_CLOSEST(dev->panel.width_in_um, 1000); + dis->height_in_mm = DIV_ROUND_CLOSEST(dev->panel.height_in_um, 1000); /* find all overlays available for/owned by this display */ for (i = 0; i < cdev->num_ovls && dis->enabled; i++) { diff --git a/drivers/video/omap2/omapfb/omapfb-ioctl.c b/drivers/video/omap2/omapfb/omapfb-ioctl.c index cff4503..cce6a69 100644 --- a/drivers/video/omap2/omapfb/omapfb-ioctl.c +++ b/drivers/video/omap2/omapfb/omapfb-ioctl.c @@ -883,6 +883,7 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) case OMAPFB_GET_DISPLAY_INFO: { u16 xres, yres; + u32 w, h; DBG("ioctl GET_DISPLAY_INFO\n"); @@ -896,15 +897,9 @@ int omapfb_ioctl(struct fb_info *fbi, unsigned int cmd, unsigned long arg) p.display_info.xres = xres; p.display_info.yres = yres; - if (display->driver->get_dimensions) { - u32 w, h; - display->driver->get_dimensions(display, &w, &h); - p.display_info.width = w; - p.display_info.height = h; - } else { - p.display_info.width = 0; - p.display_info.height = 0; - } + omapdss_display_get_dimensions(display, &w, &h); + p.display_info.width = w; + p.display_info.height = h; if (copy_to_user((void __user *)arg, &p.display_info, sizeof(p.display_info))) diff --git a/drivers/video/omap2/omapfb/omapfb-main.c b/drivers/video/omap2/omapfb/omapfb-main.c index 24ea1e5..d5ced95 100644 --- a/drivers/video/omap2/omapfb/omapfb-main.c +++ b/drivers/video/omap2/omapfb/omapfb-main.c @@ -667,6 +667,7 @@ int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var) enum omap_color_mode mode = 0; int i; int r; + u32 w = 0, h = 0; DBG("check_fb_var %d\n", ofbi->id); @@ -704,9 +705,10 @@ int check_fb_var(struct fb_info *fbi, struct fb_var_screeninfo *var) var->xres, var->yres, var->xres_virtual, var->yres_virtual); - if (display && display->driver->get_dimensions) { - u32 w, h; - display->driver->get_dimensions(display, &w, &h); + if (display) + omapdss_display_get_dimensions(display, &w, &h); + + if (w && h) { var->width = DIV_ROUND_CLOSEST(w, 1000); var->height = DIV_ROUND_CLOSEST(h, 1000); } else { |