Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
clcd.c
Go to the documentation of this file.
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 <plat/clcd.h>
6 
7 static 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),
28  .bpp = 16,
29 };
30 
31 static 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),
52  .bpp = 16,
53 };
54 
55 /* Sanyo TM38QV67A02A - 3.8 inch QVGA (320x240) Color TFT */
56 static 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 
80 static 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,
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 */
105 static 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 
129 static struct clcd_panel *panels[] = {
130  &vga,
131  &xvga,
132  &sanyo_tm38qv67a02a,
133  &sanyo_2_5_in,
134  &epson_l2f50113t00,
135 };
136 
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 
153 int 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 
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 
179 {
180  dma_free_writecombine(&fb->dev->dev, fb->fb.fix.smem_len,
181  fb->fb.screen_base, fb->fb.fix.smem_start);
182 }