| #include <linux/device.h> |
| #include <linux/dma-mapping.h> |
| #include <linux/amba/bus.h> |
| #include <linux/amba/clcd.h> |
| #include <plat/clcd.h> |
| |
| static struct clcd_panel vga = { |
| .mode = { |
| .name = "VGA", |
| .refresh = 60, |
| .xres = 640, |
| .yres = 480, |
| .pixclock = 39721, |
| .left_margin = 40, |
| .right_margin = 24, |
| .upper_margin = 32, |
| .lower_margin = 11, |
| .hsync_len = 96, |
| .vsync_len = 2, |
| .sync = 0, |
| .vmode = FB_VMODE_NONINTERLACED, |
| }, |
| .width = -1, |
| .height = -1, |
| .tim2 = TIM2_BCD | TIM2_IPC, |
| .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
| .caps = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888, |
| .bpp = 16, |
| }; |
| |
| static struct clcd_panel xvga = { |
| .mode = { |
| .name = "XVGA", |
| .refresh = 60, |
| .xres = 1024, |
| .yres = 768, |
| .pixclock = 15748, |
| .left_margin = 152, |
| .right_margin = 48, |
| .upper_margin = 23, |
| .lower_margin = 3, |
| .hsync_len = 104, |
| .vsync_len = 4, |
| .sync = 0, |
| .vmode = FB_VMODE_NONINTERLACED, |
| }, |
| .width = -1, |
| .height = -1, |
| .tim2 = TIM2_BCD | TIM2_IPC, |
| .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
| .caps = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888, |
| .bpp = 16, |
| }; |
| |
| /* Sanyo TM38QV67A02A - 3.8 inch QVGA (320x240) Color TFT */ |
| static struct clcd_panel sanyo_tm38qv67a02a = { |
| .mode = { |
| .name = "Sanyo TM38QV67A02A", |
| .refresh = 116, |
| .xres = 320, |
| .yres = 240, |
| .pixclock = 100000, |
| .left_margin = 6, |
| .right_margin = 6, |
| .upper_margin = 5, |
| .lower_margin = 5, |
| .hsync_len = 6, |
| .vsync_len = 6, |
| .sync = 0, |
| .vmode = FB_VMODE_NONINTERLACED, |
| }, |
| .width = -1, |
| .height = -1, |
| .tim2 = TIM2_BCD, |
| .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
| .caps = CLCD_CAP_5551, |
| .bpp = 16, |
| }; |
| |
| static struct clcd_panel sanyo_2_5_in = { |
| .mode = { |
| .name = "Sanyo QVGA Portrait", |
| .refresh = 116, |
| .xres = 240, |
| .yres = 320, |
| .pixclock = 100000, |
| .left_margin = 20, |
| .right_margin = 10, |
| .upper_margin = 2, |
| .lower_margin = 2, |
| .hsync_len = 10, |
| .vsync_len = 2, |
| .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, |
| .vmode = FB_VMODE_NONINTERLACED, |
| }, |
| .width = -1, |
| .height = -1, |
| .tim2 = TIM2_IVS | TIM2_IHS | TIM2_IPC, |
| .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
| .caps = CLCD_CAP_5551, |
| .bpp = 16, |
| }; |
| |
| /* Epson L2F50113T00 - 2.2 inch 176x220 Color TFT */ |
| static struct clcd_panel epson_l2f50113t00 = { |
| .mode = { |
| .name = "Epson L2F50113T00", |
| .refresh = 390, |
| .xres = 176, |
| .yres = 220, |
| .pixclock = 62500, |
| .left_margin = 3, |
| .right_margin = 2, |
| .upper_margin = 1, |
| .lower_margin = 0, |
| .hsync_len = 3, |
| .vsync_len = 2, |
| .sync = 0, |
| .vmode = FB_VMODE_NONINTERLACED, |
| }, |
| .width = -1, |
| .height = -1, |
| .tim2 = TIM2_BCD | TIM2_IPC, |
| .cntl = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1), |
| .caps = CLCD_CAP_5551, |
| .bpp = 16, |
| }; |
| |
| static struct clcd_panel *panels[] = { |
| &vga, |
| &xvga, |
| &sanyo_tm38qv67a02a, |
| &sanyo_2_5_in, |
| &epson_l2f50113t00, |
| }; |
| |
| struct clcd_panel *versatile_clcd_get_panel(const char *name) |
| { |
| int i; |
| |
| for (i = 0; i < ARRAY_SIZE(panels); i++) |
| if (strcmp(panels[i]->mode.name, name) == 0) |
| break; |
| |
| if (i < ARRAY_SIZE(panels)) |
| return panels[i]; |
| |
| pr_err("CLCD: couldn't get parameters for panel %s\n", name); |
| |
| return NULL; |
| } |
| |
| int versatile_clcd_setup_dma(struct clcd_fb *fb, unsigned long framesize) |
| { |
| dma_addr_t dma; |
| |
| fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize, |
| &dma, GFP_KERNEL); |
| if (!fb->fb.screen_base) { |
| pr_err("CLCD: unable to map framebuffer\n"); |
| return -ENOMEM; |
| } |
| |
| fb->fb.fix.smem_start = dma; |
| fb->fb.fix.smem_len = framesize; |
| |
| return 0; |
| } |
| |
| int versatile_clcd_mmap_dma(struct clcd_fb *fb, struct vm_area_struct *vma) |
| { |
| return dma_mmap_writecombine(&fb->dev->dev, vma, |
| fb->fb.screen_base, |
| fb->fb.fix.smem_start, |
| fb->fb.fix.smem_len); |
| } |
| |
| void versatile_clcd_remove_dma(struct clcd_fb *fb) |
| { |
| dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len, |
| fb->fb.screen_base, fb->fb.fix.smem_start); |
| } |