linux/drivers/video/fbdev/amba-clcd-versatile.c
<<
>>
Prefs
   1#include <linux/device.h>
   2#include <linux/dma-mapping.h>
   3#include <linux/amba/bus.h>
   4#include <linux/amba/clcd.h>
   5#include <linux/platform_data/video-clcd-versatile.h>
   6
   7static struct clcd_panel vga = {
   8        .mode           = {
   9                .name           = "VGA",
  10                .refresh        = 60,
  11                .xres           = 640,
  12                .yres           = 480,
  13                .pixclock       = 39721,
  14                .left_margin    = 40,
  15                .right_margin   = 24,
  16                .upper_margin   = 32,
  17                .lower_margin   = 11,
  18                .hsync_len      = 96,
  19                .vsync_len      = 2,
  20                .sync           = 0,
  21                .vmode          = FB_VMODE_NONINTERLACED,
  22        },
  23        .width          = -1,
  24        .height         = -1,
  25        .tim2           = TIM2_BCD | TIM2_IPC,
  26        .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
  27        .caps           = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888,
  28        .bpp            = 16,
  29};
  30
  31static struct clcd_panel xvga = {
  32        .mode           = {
  33                .name           = "XVGA",
  34                .refresh        = 60,
  35                .xres           = 1024,
  36                .yres           = 768,
  37                .pixclock       = 15748,
  38                .left_margin    = 152,
  39                .right_margin   = 48,
  40                .upper_margin   = 23,
  41                .lower_margin   = 3,
  42                .hsync_len      = 104,
  43                .vsync_len      = 4,
  44                .sync           = 0,
  45                .vmode          = FB_VMODE_NONINTERLACED,
  46        },
  47        .width          = -1,
  48        .height         = -1,
  49        .tim2           = TIM2_BCD | TIM2_IPC,
  50        .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
  51        .caps           = CLCD_CAP_5551 | CLCD_CAP_565 | CLCD_CAP_888,
  52        .bpp            = 16,
  53};
  54
  55/* Sanyo TM38QV67A02A - 3.8 inch QVGA (320x240) Color TFT */
  56static struct clcd_panel sanyo_tm38qv67a02a = {
  57        .mode           = {
  58                .name           = "Sanyo TM38QV67A02A",
  59                .refresh        = 116,
  60                .xres           = 320,
  61                .yres           = 240,
  62                .pixclock       = 100000,
  63                .left_margin    = 6,
  64                .right_margin   = 6,
  65                .upper_margin   = 5,
  66                .lower_margin   = 5,
  67                .hsync_len      = 6,
  68                .vsync_len      = 6,
  69                .sync           = 0,
  70                .vmode          = FB_VMODE_NONINTERLACED,
  71        },
  72        .width          = -1,
  73        .height         = -1,
  74        .tim2           = TIM2_BCD,
  75        .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
  76        .caps           = CLCD_CAP_5551,
  77        .bpp            = 16,
  78};
  79
  80static struct clcd_panel sanyo_2_5_in = {
  81        .mode           = {
  82                .name           = "Sanyo QVGA Portrait",
  83                .refresh        = 116,
  84                .xres           = 240,
  85                .yres           = 320,
  86                .pixclock       = 100000,
  87                .left_margin    = 20,
  88                .right_margin   = 10,
  89                .upper_margin   = 2,
  90                .lower_margin   = 2,
  91                .hsync_len      = 10,
  92                .vsync_len      = 2,
  93                .sync           = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT,
  94                .vmode          = FB_VMODE_NONINTERLACED,
  95        },
  96        .width          = -1,
  97        .height         = -1,
  98        .tim2           = TIM2_IVS | TIM2_IHS | TIM2_IPC,
  99        .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
 100        .caps           = CLCD_CAP_5551,
 101        .bpp            = 16,
 102};
 103
 104/* Epson L2F50113T00 - 2.2 inch 176x220 Color TFT */
 105static struct clcd_panel epson_l2f50113t00 = {
 106        .mode           = {
 107                .name           = "Epson L2F50113T00",
 108                .refresh        = 390,
 109                .xres           = 176,
 110                .yres           = 220,
 111                .pixclock       = 62500,
 112                .left_margin    = 3,
 113                .right_margin   = 2,
 114                .upper_margin   = 1,
 115                .lower_margin   = 0,
 116                .hsync_len      = 3,
 117                .vsync_len      = 2,
 118                .sync           = 0,
 119                .vmode          = FB_VMODE_NONINTERLACED,
 120        },
 121        .width          = -1,
 122        .height         = -1,
 123        .tim2           = TIM2_BCD | TIM2_IPC,
 124        .cntl           = CNTL_LCDTFT | CNTL_BGR | CNTL_LCDVCOMP(1),
 125        .caps           = CLCD_CAP_5551,
 126        .bpp            = 16,
 127};
 128
 129static struct clcd_panel *panels[] = {
 130        &vga,
 131        &xvga,
 132        &sanyo_tm38qv67a02a,
 133        &sanyo_2_5_in,
 134        &epson_l2f50113t00,
 135};
 136
 137struct clcd_panel *versatile_clcd_get_panel(const char *name)
 138{
 139        int i;
 140
 141        for (i = 0; i < ARRAY_SIZE(panels); i++)
 142                if (strcmp(panels[i]->mode.name, name) == 0)
 143                        break;
 144
 145        if (i < ARRAY_SIZE(panels))
 146                return panels[i];
 147
 148        pr_err("CLCD: couldn't get parameters for panel %s\n", name);
 149
 150        return NULL;
 151}
 152
 153int versatile_clcd_setup_dma(struct clcd_fb *fb, unsigned long framesize)
 154{
 155        dma_addr_t dma;
 156
 157        fb->fb.screen_base = dma_alloc_writecombine(&fb->dev->dev, framesize,
 158                                                    &dma, GFP_KERNEL);
 159        if (!fb->fb.screen_base) {
 160                pr_err("CLCD: unable to map framebuffer\n");
 161                return -ENOMEM;
 162        }
 163
 164        fb->fb.fix.smem_start   = dma;
 165        fb->fb.fix.smem_len     = framesize;
 166
 167        return 0;
 168}
 169
 170int versatile_clcd_mmap_dma(struct clcd_fb *fb, struct vm_area_struct *vma)
 171{
 172        return dma_mmap_writecombine(&fb->dev->dev, vma,
 173                                     fb->fb.screen_base,
 174                                     fb->fb.fix.smem_start,
 175                                     fb->fb.fix.smem_len);
 176}
 177
 178void versatile_clcd_remove_dma(struct clcd_fb *fb)
 179{
 180        dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,
 181                              fb->fb.screen_base, fb->fb.fix.smem_start);
 182}
 183