diff -rup kernel-source-rx-34-2.6.21.0.orig/drivers/video/omap/blizzard.c kernel-source-rx-34-2.6.21.0/drivers/video/omap/blizzard.c --- kernel-source-rx-34-2.6.21.0.orig/drivers/video/omap/blizzard.c 2008-03-13 21:37:17.000000000 +0100 +++ kernel-source-rx-34-2.6.21.0/drivers/video/omap/blizzard.c 2008-03-16 20:33:06.000000000 +0100 @@ -46,6 +46,7 @@ #define BLIZZARD_CLK_SRC 0x0e #define BLIZZARD_MEM_BANK0_ACTIVATE 0x10 #define BLIZZARD_MEM_BANK0_STATUS 0x14 +#define BLIZZARD_PANEL_CONFIGURATION 0x28 #define BLIZZARD_HDISP 0x2a #define BLIZZARD_HNDP 0x2c #define BLIZZARD_VDISP0 0x2e @@ -935,6 +936,62 @@ static int blizzard_set_scale(int plane, return 0; } +static int blizzard_set_rotate(int angle) +{ + u8 l; + struct omapfb_device *fbdev = blizzard.fbdev; + + + if (blizzard.update_mode == OMAPFB_UPDATE_DISABLED) + l = blizzard_reg_cache[BLIZZARD_PANEL_CONFIGURATION / 2]; + else + l = blizzard_read_reg(BLIZZARD_PANEL_CONFIGURATION); + + l &= ~0x03; + + switch (angle) { + case 0: + l = l | 0x00; + break; + case 90: + l = l | 0x03; + break; + case 180: + l = l | 0x02; + break; + case 270: + l = l | 0x01; + break; + default: + return -EINVAL; + } + + if (blizzard.update_mode == OMAPFB_UPDATE_DISABLED) + blizzard_reg_cache[BLIZZARD_PANEL_CONFIGURATION / 2] = l; /* FIXME: don't change cached register */ + else + blizzard_write_reg(BLIZZARD_PANEL_CONFIGURATION, l); + + /* update screen width and height */ + if (l & 0x01) { + blizzard.auto_update_window.width = fbdev->panel->y_res; + blizzard.auto_update_window.height = fbdev->panel->x_res; + blizzard.auto_update_window.out_width = fbdev->panel->y_res; + blizzard.auto_update_window.out_height = fbdev->panel->x_res; + blizzard.screen_width = fbdev->panel->y_res; + blizzard.screen_height = fbdev->panel->x_res; + } + else { + blizzard.auto_update_window.width = fbdev->panel->x_res; + blizzard.auto_update_window.height = fbdev->panel->y_res; + blizzard.auto_update_window.out_width = fbdev->panel->x_res; + blizzard.auto_update_window.out_height = fbdev->panel->y_res; + blizzard.screen_width = fbdev->panel->x_res; + blizzard.screen_height = fbdev->panel->y_res; + } + + return 0; +} + static int blizzard_enable_plane(int plane, int enable) { if (enable) @@ -1351,7 +1408,8 @@ static void blizzard_get_caps(int plane, caps->ctrl |= OMAPFB_CAPS_MANUAL_UPDATE | OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE | OMAPFB_CAPS_WINDOW_SCALE | - OMAPFB_CAPS_WINDOW_OVERLAY; + OMAPFB_CAPS_WINDOW_OVERLAY | + OMAPFB_CAPS_WINDOW_ROTATE; if (blizzard.te_connected) caps->ctrl |= OMAPFB_CAPS_TEARSYNC; caps->wnd_color |= (1 << OMAPFB_COLOR_RGB565) | @@ -1613,6 +1671,7 @@ struct lcd_ctrl blizzard_ctrl = { .setup_plane = blizzard_setup_plane, .set_scale = blizzard_set_scale, .enable_plane = blizzard_enable_plane, + .set_rotate = blizzard_set_rotate, .update_window = blizzard_update_window_async, .sync = blizzard_sync, .suspend = blizzard_suspend, diff -rup kernel-source-rx-34-2.6.21.0.orig/drivers/video/omap/omapfb_main.c kernel-source-rx-34-2.6.21.0/drivers/video/omap/omapfb_main.c --- kernel-source-rx-34-2.6.21.0.orig/drivers/video/omap/omapfb_main.c 2008-03-13 21:37:17.000000000 +0100 +++ kernel-source-rx-34-2.6.21.0/drivers/video/omap/omapfb_main.c 2008-03-16 20:30:26.000000000 +0100 @@ -66,6 +66,7 @@ static struct caps_table_struct ctrl_cap { OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE, "pixel double window" }, { OMAPFB_CAPS_WINDOW_SCALE, "scale window" }, { OMAPFB_CAPS_WINDOW_OVERLAY,"overlay window" }, + { OMAPFB_CAPS_WINDOW_ROTATE, "rotate window" }, { OMAPFB_CAPS_SET_BACKLIGHT, "backlight setting" }, }; @@ -244,6 +245,13 @@ static int ctrl_change_mode(struct fb_in offset, var->xres_virtual, plane->info.pos_x, plane->info.pos_y, var->xres, var->yres, plane->color_mode); + if (r < 0) + return r; + + if (fbdev->ctrl->set_rotate != NULL) + if((r = fbdev->ctrl->set_rotate(var->rotate)) < 0) + return r; + if (fbdev->ctrl->set_scale != NULL) r = fbdev->ctrl->set_scale(plane->idx, var->xres, var->yres, @@ -625,7 +633,7 @@ static void omapfb_rotate(struct fb_info struct omapfb_device *fbdev = plane->fbdev; omapfb_rqueue_lock(fbdev); - if (cpu_is_omap15xx() && rotate != fbi->var.rotate) { + if (rotate != fbi->var.rotate) { struct fb_var_screeninfo *new_var = &fbdev->new_var; memcpy(new_var, &fbi->var, sizeof(*new_var)); @@ -729,28 +737,42 @@ int omapfb_update_window_async(struct fb void (*callback)(void *), void *callback_data) { + int xres, yres; struct omapfb_plane_struct *plane = fbi->par; struct omapfb_device *fbdev = plane->fbdev; - struct fb_var_screeninfo *var; + struct fb_var_screeninfo *var = &fbi->var; + + switch (var->rotate) { + case 0: + case 180: + xres = fbdev->panel->x_res; + yres = fbdev->panel->y_res; + break; + case 90: + case 270: + xres = fbdev->panel->y_res; + yres = fbdev->panel->x_res; + break; + default: + return -EINVAL; + } - var = &fbi->var; - if (win->x >= var->xres || win->y >= var->yres || - win->out_x > var->xres || win->out_y >= var->yres) + if (win->x >= xres || win->y >= yres || + win->out_x > xres || win->out_y > yres) return -EINVAL; if (!fbdev->ctrl->update_window || fbdev->ctrl->get_update_mode() != OMAPFB_MANUAL_UPDATE) return -ENODEV; - if (win->x + win->width >= var->xres) - win->width = var->xres - win->x; - if (win->y + win->height >= var->yres) - win->height = var->yres - win->y; - /* The out sizes should be cropped to the LCD size */ - if (win->out_x + win->out_width > fbdev->panel->x_res) - win->out_width = fbdev->panel->x_res - win->out_x; - if (win->out_y + win->out_height > fbdev->panel->y_res) - win->out_height = fbdev->panel->y_res - win->out_y; + if (win->x + win->width > xres) + win->width = xres - win->x; + if (win->y + win->height > yres) + win->height = yres - win->y; + if (win->out_x + win->out_width > xres) + win->out_width = xres - win->out_x; + if (win->out_y + win->out_height > yres) + win->out_height = yres - win->out_y; if (!win->width || !win->height || !win->out_width || !win->out_height) return 0; diff -rup kernel-source-rx-34-2.6.21.0.orig/include/asm-arm/arch-omap/omapfb.h kernel-source-rx-34-2.6.21.0/include/asm-arm/arch-omap/omapfb.h --- kernel-source-rx-34-2.6.21.0.orig/include/asm-arm/arch-omap/omapfb.h 2008-03-13 21:37:18.000000000 +0100 +++ kernel-source-rx-34-2.6.21.0/include/asm-arm/arch-omap/omapfb.h 2008-02-23 13:23:33.000000000 +0100 @@ -62,6 +62,7 @@ #define OMAPFB_CAPS_WINDOW_PIXEL_DOUBLE 0x00010000 #define OMAPFB_CAPS_WINDOW_SCALE 0x00020000 #define OMAPFB_CAPS_WINDOW_OVERLAY 0x00040000 +#define OMAPFB_CAPS_WINDOW_ROTATE 0x00080000 #define OMAPFB_CAPS_SET_BACKLIGHT 0x01000000 /* Values from DSP must map to lower 16-bits */ @@ -305,6 +306,7 @@ struct lcd_ctrl { int screen_width, int pos_x, int pos_y, int width, int height, int color_mode); + int (*set_rotate) (int angle); int (*setup_mem) (int plane, size_t size, int mem_type, unsigned long *paddr); int (*mmap) (struct fb_info *info,