diff options
-rw-r--r-- | drivers/video/mcde/display-av8100.c | 34 | ||||
-rw-r--r-- | include/video/mcde_display-av8100.h | 2 |
2 files changed, 29 insertions, 7 deletions
diff --git a/drivers/video/mcde/display-av8100.c b/drivers/video/mcde/display-av8100.c index e076398ca45..7034f6ed2e7 100644 --- a/drivers/video/mcde/display-av8100.c +++ b/drivers/video/mcde/display-av8100.c @@ -17,6 +17,7 @@ #include <linux/io.h> #include <linux/slab.h> +#include <video/mcde_fb.h> #include <video/mcde_display.h> #include <video/mcde_display-av8100.h> #include <video/av8100.h> @@ -31,6 +32,12 @@ #define AVI_INFOFRAME_DB1 0x10 /* Active Information present */ #define AVI_INFOFRAME_DB2 0x08 /* Active Portion Aspect ratio */ +#ifdef CONFIG_DISPLAY_AV8100_TRIPPLE_BUFFER +#define NUM_FB_BUFFERS 3 +#else +#define NUM_FB_BUFFERS 2 +#endif + struct cea_vesa_video_mode { u32 cea; u32 vesa_cea_nr; @@ -45,6 +52,8 @@ static int hdmi_set_pixel_format( struct mcde_display_device *ddev, enum mcde_ovly_pix_fmt format); static struct mcde_video_mode *video_mode_get(struct mcde_display_device *ddev, u8 cea, u8 vesa_cea_nr); +static int ceanr_convert(struct mcde_display_device *ddev, + u8 cea, u8 vesa_cea_nr, u16 *w, u16 *h); static ssize_t show_hdmisdtvswitch(struct device *dev, struct device_attribute *attr, char *buf); @@ -198,7 +207,24 @@ static ssize_t store_disponoff(struct device *dev, vesa_cea_nr = (hex_to_bin(buf[4]) << 4) + hex_to_bin(buf[5]); dev_dbg(dev, "enable:%d cea:%d nr:%d\n", enable, cea, vesa_cea_nr); - hdmi_fb_onoff(mdev, enable, cea, vesa_cea_nr); + if (enable && !mdev->enabled && mdev->fbi == NULL) { + struct display_driver_data *driver_data = dev_get_drvdata(dev); + u16 w = mdev->native_x_res; + u16 h = mdev->native_y_res, vh; + int buffering = NUM_FB_BUFFERS; + struct fb_info *fbi; + + ceanr_convert(mdev, cea, vesa_cea_nr, &w, &h); + vh = h * buffering; + fbi = mcde_fb_create(mdev, w, h, w, vh, + mdev->default_pixel_format, FB_ROTATE_UR); + if (IS_ERR(fbi)) + dev_warn(dev, "fb create failed\n"); + else + driver_data->fbdevname = dev_name(fbi->dev); + } else if (!enable && mdev->enabled) { + mcde_fb_destroy(mdev); + } return count; } @@ -271,8 +297,7 @@ static ssize_t store_stayalive(struct device *dev, } static int ceanr_convert(struct mcde_display_device *ddev, - u8 cea, u8 vesa_cea_nr, int buffering, - u16 *w, u16 *h, u16 *vw, u16 *vh) + u8 cea, u8 vesa_cea_nr, u16 *w, u16 *h) { struct mcde_video_mode *video_mode; @@ -281,8 +306,6 @@ static int ceanr_convert(struct mcde_display_device *ddev, if (video_mode) { *w = video_mode->xres; *h = video_mode->yres; - *vw = video_mode->xres; - *vh = video_mode->yres * buffering; dev_dbg(&ddev->dev, "cea:%d nr:%d found\n", cea, vesa_cea_nr); return 0; @@ -1429,7 +1452,6 @@ static int __devinit hdmi_probe(struct mcde_display_device *dev) dev->apply_config = hdmi_apply_config; dev->set_pixel_format = hdmi_set_pixel_format; dev->set_power_mode = hdmi_set_power_mode; - dev->ceanr_convert = ceanr_convert; /* Create sysfs files */ if (device_create_file(&dev->dev, &dev_attr_hdmisdtvswitch)) diff --git a/include/video/mcde_display-av8100.h b/include/video/mcde_display-av8100.h index 52578a675f1..7c13b49e58f 100644 --- a/include/video/mcde_display-av8100.h +++ b/include/video/mcde_display-av8100.h @@ -43,7 +43,7 @@ struct display_driver_data { struct regulator *cvbs_regulator; bool cvbs_regulator_enabled; bool update_port_pixel_format; - char *fbdevname; + const char *fbdevname; struct mcde_video_mode *video_mode; }; |