2 * linux/drivers/video/amba-clcd.c
4 * Copyright (C) 2001 ARM Limited, by David A Rusling
5 * Updated to 2.5, Deep Blue Solutions Ltd.
7 * This file is subject to the terms and conditions of the GNU General Public
8 * License. See the file COPYING in the main directory of this archive
11 * ARM PrimeCell PL110 Color LCD Controller
13 #include <linux/dma-mapping.h>
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/errno.h>
17 #include <linux/string.h>
18 #include <linux/slab.h>
19 #include <linux/delay.h>
22 #include <linux/init.h>
23 #include <linux/ioport.h>
24 #include <linux/list.h>
25 #include <linux/amba/bus.h>
26 #include <linux/amba/clcd.h>
27 #include <linux/bitops.h>
28 #include <linux/clk.h>
29 #include <linux/hardirq.h>
31 #include <linux/of_address.h>
32 #include <linux/of_graph.h>
33 #include <linux/backlight.h>
34 #include <video/display_timing.h>
35 #include <video/of_display_timing.h>
36 #include <video/videomode.h>
38 #include "amba-clcd-nomadik.h"
39 #include "amba-clcd-versatile.h"
41 #define to_clcd(info) container_of(info, struct clcd_fb, fb)
43 /* This is limited to 16 characters when displayed by X startup */
44 static const char *clcd_name
= "CLCD FB";
47 * Unfortunately, the enable/disable functions may be called either from
48 * process or IRQ context, and we _need_ to delay. This is _not_ good.
50 static inline void clcdfb_sleep(unsigned int ms
)
59 static inline void clcdfb_set_start(struct clcd_fb
*fb
)
61 unsigned long ustart
= fb
->fb
.fix
.smem_start
;
64 ustart
+= fb
->fb
.var
.yoffset
* fb
->fb
.fix
.line_length
;
65 lstart
= ustart
+ fb
->fb
.var
.yres
* fb
->fb
.fix
.line_length
/ 2;
67 writel(ustart
, fb
->regs
+ CLCD_UBAS
);
68 writel(lstart
, fb
->regs
+ CLCD_LBAS
);
71 static void clcdfb_disable(struct clcd_fb
*fb
)
75 if (fb
->board
->disable
)
76 fb
->board
->disable(fb
);
78 if (fb
->panel
->backlight
) {
79 fb
->panel
->backlight
->props
.power
= FB_BLANK_POWERDOWN
;
80 backlight_update_status(fb
->panel
->backlight
);
83 val
= readl(fb
->regs
+ fb
->off_cntl
);
84 if (val
& CNTL_LCDPWR
) {
86 writel(val
, fb
->regs
+ fb
->off_cntl
);
90 if (val
& CNTL_LCDEN
) {
92 writel(val
, fb
->regs
+ fb
->off_cntl
);
96 * Disable CLCD clock source.
98 if (fb
->clk_enabled
) {
99 fb
->clk_enabled
= false;
100 clk_disable(fb
->clk
);
104 static void clcdfb_enable(struct clcd_fb
*fb
, u32 cntl
)
107 * Enable the CLCD clock source.
109 if (!fb
->clk_enabled
) {
110 fb
->clk_enabled
= true;
115 * Bring up by first enabling..
118 writel(cntl
, fb
->regs
+ fb
->off_cntl
);
123 * and now apply power.
126 writel(cntl
, fb
->regs
+ fb
->off_cntl
);
131 if (fb
->panel
->backlight
) {
132 fb
->panel
->backlight
->props
.power
= FB_BLANK_UNBLANK
;
133 backlight_update_status(fb
->panel
->backlight
);
137 * finally, enable the interface.
139 if (fb
->board
->enable
)
140 fb
->board
->enable(fb
);
144 clcdfb_set_bitfields(struct clcd_fb
*fb
, struct fb_var_screeninfo
*var
)
149 if (fb
->panel
->caps
&& fb
->board
->caps
)
150 caps
= fb
->panel
->caps
& fb
->board
->caps
;
152 /* Old way of specifying what can be used */
153 caps
= fb
->panel
->cntl
& CNTL_BGR
?
154 CLCD_CAP_BGR
: CLCD_CAP_RGB
;
155 /* But mask out 444 modes as they weren't supported */
156 caps
&= ~CLCD_CAP_444
;
159 /* Only TFT panels can do RGB888/BGR888 */
160 if (!(fb
->panel
->cntl
& CNTL_LCDTFT
))
161 caps
&= ~CLCD_CAP_888
;
163 memset(&var
->transp
, 0, sizeof(var
->transp
));
165 var
->red
.msb_right
= 0;
166 var
->green
.msb_right
= 0;
167 var
->blue
.msb_right
= 0;
169 switch (var
->bits_per_pixel
) {
174 /* If we can't do 5551, reject */
175 caps
&= CLCD_CAP_5551
;
181 var
->red
.length
= var
->bits_per_pixel
;
183 var
->green
.length
= var
->bits_per_pixel
;
184 var
->green
.offset
= 0;
185 var
->blue
.length
= var
->bits_per_pixel
;
186 var
->blue
.offset
= 0;
190 /* If we can't do 444, 5551 or 565, reject */
191 if (!(caps
& (CLCD_CAP_444
| CLCD_CAP_5551
| CLCD_CAP_565
))) {
197 * Green length can be 4, 5 or 6 depending whether
198 * we're operating in 444, 5551 or 565 mode.
200 if (var
->green
.length
== 4 && caps
& CLCD_CAP_444
)
201 caps
&= CLCD_CAP_444
;
202 if (var
->green
.length
== 5 && caps
& CLCD_CAP_5551
)
203 caps
&= CLCD_CAP_5551
;
204 else if (var
->green
.length
== 6 && caps
& CLCD_CAP_565
)
205 caps
&= CLCD_CAP_565
;
208 * PL110 officially only supports RGB555,
209 * but may be wired up to allow RGB565.
211 if (caps
& CLCD_CAP_565
) {
212 var
->green
.length
= 6;
213 caps
&= CLCD_CAP_565
;
214 } else if (caps
& CLCD_CAP_5551
) {
215 var
->green
.length
= 5;
216 caps
&= CLCD_CAP_5551
;
218 var
->green
.length
= 4;
219 caps
&= CLCD_CAP_444
;
223 if (var
->green
.length
>= 5) {
225 var
->blue
.length
= 5;
228 var
->blue
.length
= 4;
232 if (fb
->vendor
->packed_24_bit_pixels
) {
234 var
->green
.length
= 8;
235 var
->blue
.length
= 8;
241 /* If we can't do 888, reject */
242 caps
&= CLCD_CAP_888
;
249 var
->green
.length
= 8;
250 var
->blue
.length
= 8;
258 * >= 16bpp displays have separate colour component bitfields
259 * encoded in the pixel data. Calculate their position from
260 * the bitfield length defined above.
262 if (ret
== 0 && var
->bits_per_pixel
>= 16) {
265 bgr
= caps
& CLCD_CAP_BGR
&& var
->blue
.offset
== 0;
266 rgb
= caps
& CLCD_CAP_RGB
&& var
->red
.offset
== 0;
270 * The requested format was not possible, try just
271 * our capabilities. One of BGR or RGB must be
274 bgr
= caps
& CLCD_CAP_BGR
;
277 var
->blue
.offset
= 0;
278 var
->green
.offset
= var
->blue
.offset
+ var
->blue
.length
;
279 var
->red
.offset
= var
->green
.offset
+ var
->green
.length
;
282 var
->green
.offset
= var
->red
.offset
+ var
->red
.length
;
283 var
->blue
.offset
= var
->green
.offset
+ var
->green
.length
;
290 static int clcdfb_check_var(struct fb_var_screeninfo
*var
, struct fb_info
*info
)
292 struct clcd_fb
*fb
= to_clcd(info
);
295 if (fb
->board
->check
)
296 ret
= fb
->board
->check(fb
, var
);
299 var
->xres_virtual
* var
->bits_per_pixel
/ 8 *
300 var
->yres_virtual
> fb
->fb
.fix
.smem_len
)
304 ret
= clcdfb_set_bitfields(fb
, var
);
309 static int clcdfb_set_par(struct fb_info
*info
)
311 struct clcd_fb
*fb
= to_clcd(info
);
312 struct clcd_regs regs
;
314 fb
->fb
.fix
.line_length
= fb
->fb
.var
.xres_virtual
*
315 fb
->fb
.var
.bits_per_pixel
/ 8;
317 if (fb
->fb
.var
.bits_per_pixel
<= 8)
318 fb
->fb
.fix
.visual
= FB_VISUAL_PSEUDOCOLOR
;
320 fb
->fb
.fix
.visual
= FB_VISUAL_TRUECOLOR
;
322 fb
->board
->decode(fb
, ®s
);
326 /* Some variants must be clocked here */
327 if (fb
->vendor
->clock_timregs
&& !fb
->clk_enabled
) {
328 fb
->clk_enabled
= true;
332 writel(regs
.tim0
, fb
->regs
+ CLCD_TIM0
);
333 writel(regs
.tim1
, fb
->regs
+ CLCD_TIM1
);
334 writel(regs
.tim2
, fb
->regs
+ CLCD_TIM2
);
335 writel(regs
.tim3
, fb
->regs
+ CLCD_TIM3
);
337 clcdfb_set_start(fb
);
339 clk_set_rate(fb
->clk
, (1000000000 / regs
.pixclock
) * 1000);
341 fb
->clcd_cntl
= regs
.cntl
;
343 clcdfb_enable(fb
, regs
.cntl
);
347 "CLCD: Registers set to\n"
348 " %08x %08x %08x %08x\n"
349 " %08x %08x %08x %08x\n",
350 readl(fb
->regs
+ CLCD_TIM0
), readl(fb
->regs
+ CLCD_TIM1
),
351 readl(fb
->regs
+ CLCD_TIM2
), readl(fb
->regs
+ CLCD_TIM3
),
352 readl(fb
->regs
+ CLCD_UBAS
), readl(fb
->regs
+ CLCD_LBAS
),
353 readl(fb
->regs
+ fb
->off_ienb
), readl(fb
->regs
+ fb
->off_cntl
));
359 static inline u32
convert_bitfield(int val
, struct fb_bitfield
*bf
)
361 unsigned int mask
= (1 << bf
->length
) - 1;
363 return (val
>> (16 - bf
->length
) & mask
) << bf
->offset
;
367 * Set a single color register. The values supplied have a 16 bit
368 * magnitude. Return != 0 for invalid regno.
371 clcdfb_setcolreg(unsigned int regno
, unsigned int red
, unsigned int green
,
372 unsigned int blue
, unsigned int transp
, struct fb_info
*info
)
374 struct clcd_fb
*fb
= to_clcd(info
);
377 fb
->cmap
[regno
] = convert_bitfield(transp
, &fb
->fb
.var
.transp
) |
378 convert_bitfield(blue
, &fb
->fb
.var
.blue
) |
379 convert_bitfield(green
, &fb
->fb
.var
.green
) |
380 convert_bitfield(red
, &fb
->fb
.var
.red
);
382 if (fb
->fb
.fix
.visual
== FB_VISUAL_PSEUDOCOLOR
&& regno
< 256) {
383 int hw_reg
= CLCD_PALETTE
+ ((regno
* 2) & ~3);
384 u32 val
, mask
, newval
;
386 newval
= (red
>> 11) & 0x001f;
387 newval
|= (green
>> 6) & 0x03e0;
388 newval
|= (blue
>> 1) & 0x7c00;
391 * 3.2.11: if we're configured for big endian
392 * byte order, the palette entries are swapped.
394 if (fb
->clcd_cntl
& CNTL_BEBO
)
404 val
= readl(fb
->regs
+ hw_reg
) & mask
;
405 writel(val
| newval
, fb
->regs
+ hw_reg
);
412 * Blank the screen if blank_mode != 0, else unblank. If blank == NULL
413 * then the caller blanks by setting the CLUT (Color Look Up Table) to all
414 * black. Return 0 if blanking succeeded, != 0 if un-/blanking failed due
415 * to e.g. a video mode which doesn't support it. Implements VESA suspend
416 * and powerdown modes on hardware that supports disabling hsync/vsync:
417 * blank_mode == 2: suspend vsync
418 * blank_mode == 3: suspend hsync
419 * blank_mode == 4: powerdown
421 static int clcdfb_blank(int blank_mode
, struct fb_info
*info
)
423 struct clcd_fb
*fb
= to_clcd(info
);
425 if (blank_mode
!= 0) {
428 clcdfb_enable(fb
, fb
->clcd_cntl
);
433 static int clcdfb_mmap(struct fb_info
*info
,
434 struct vm_area_struct
*vma
)
436 struct clcd_fb
*fb
= to_clcd(info
);
437 unsigned long len
, off
= vma
->vm_pgoff
<< PAGE_SHIFT
;
440 len
= info
->fix
.smem_len
;
442 if (off
<= len
&& vma
->vm_end
- vma
->vm_start
<= len
- off
&&
444 ret
= fb
->board
->mmap(fb
, vma
);
449 static struct fb_ops clcdfb_ops
= {
450 .owner
= THIS_MODULE
,
451 .fb_check_var
= clcdfb_check_var
,
452 .fb_set_par
= clcdfb_set_par
,
453 .fb_setcolreg
= clcdfb_setcolreg
,
454 .fb_blank
= clcdfb_blank
,
455 .fb_fillrect
= cfb_fillrect
,
456 .fb_copyarea
= cfb_copyarea
,
457 .fb_imageblit
= cfb_imageblit
,
458 .fb_mmap
= clcdfb_mmap
,
461 static int clcdfb_register(struct clcd_fb
*fb
)
466 * ARM PL111 always has IENB at 0x1c; it's only PL110
467 * which is reversed on some platforms.
469 if (amba_manf(fb
->dev
) == 0x41 && amba_part(fb
->dev
) == 0x111) {
470 fb
->off_ienb
= CLCD_PL111_IENB
;
471 fb
->off_cntl
= CLCD_PL111_CNTL
;
473 if (of_machine_is_compatible("arm,versatile-ab") ||
474 of_machine_is_compatible("arm,versatile-pb")) {
475 fb
->off_ienb
= CLCD_PL111_IENB
;
476 fb
->off_cntl
= CLCD_PL111_CNTL
;
478 fb
->off_ienb
= CLCD_PL110_IENB
;
479 fb
->off_cntl
= CLCD_PL110_CNTL
;
483 fb
->clk
= clk_get(&fb
->dev
->dev
, NULL
);
484 if (IS_ERR(fb
->clk
)) {
485 ret
= PTR_ERR(fb
->clk
);
489 ret
= clk_prepare(fb
->clk
);
493 fb
->fb
.device
= &fb
->dev
->dev
;
495 fb
->fb
.fix
.mmio_start
= fb
->dev
->res
.start
;
496 fb
->fb
.fix
.mmio_len
= resource_size(&fb
->dev
->res
);
498 fb
->regs
= ioremap(fb
->fb
.fix
.mmio_start
, fb
->fb
.fix
.mmio_len
);
500 printk(KERN_ERR
"CLCD: unable to remap registers\n");
505 fb
->fb
.fbops
= &clcdfb_ops
;
506 fb
->fb
.flags
= FBINFO_FLAG_DEFAULT
;
507 fb
->fb
.pseudo_palette
= fb
->cmap
;
509 strncpy(fb
->fb
.fix
.id
, clcd_name
, sizeof(fb
->fb
.fix
.id
));
510 fb
->fb
.fix
.type
= FB_TYPE_PACKED_PIXELS
;
511 fb
->fb
.fix
.type_aux
= 0;
512 fb
->fb
.fix
.xpanstep
= 0;
513 fb
->fb
.fix
.ypanstep
= 0;
514 fb
->fb
.fix
.ywrapstep
= 0;
515 fb
->fb
.fix
.accel
= FB_ACCEL_NONE
;
517 fb
->fb
.var
.xres
= fb
->panel
->mode
.xres
;
518 fb
->fb
.var
.yres
= fb
->panel
->mode
.yres
;
519 fb
->fb
.var
.xres_virtual
= fb
->panel
->mode
.xres
;
520 fb
->fb
.var
.yres_virtual
= fb
->panel
->mode
.yres
;
521 fb
->fb
.var
.bits_per_pixel
= fb
->panel
->bpp
;
522 fb
->fb
.var
.grayscale
= fb
->panel
->grayscale
;
523 fb
->fb
.var
.pixclock
= fb
->panel
->mode
.pixclock
;
524 fb
->fb
.var
.left_margin
= fb
->panel
->mode
.left_margin
;
525 fb
->fb
.var
.right_margin
= fb
->panel
->mode
.right_margin
;
526 fb
->fb
.var
.upper_margin
= fb
->panel
->mode
.upper_margin
;
527 fb
->fb
.var
.lower_margin
= fb
->panel
->mode
.lower_margin
;
528 fb
->fb
.var
.hsync_len
= fb
->panel
->mode
.hsync_len
;
529 fb
->fb
.var
.vsync_len
= fb
->panel
->mode
.vsync_len
;
530 fb
->fb
.var
.sync
= fb
->panel
->mode
.sync
;
531 fb
->fb
.var
.vmode
= fb
->panel
->mode
.vmode
;
532 fb
->fb
.var
.activate
= FB_ACTIVATE_NOW
;
533 fb
->fb
.var
.nonstd
= 0;
534 fb
->fb
.var
.height
= fb
->panel
->height
;
535 fb
->fb
.var
.width
= fb
->panel
->width
;
536 fb
->fb
.var
.accel_flags
= 0;
538 fb
->fb
.monspecs
.hfmin
= 0;
539 fb
->fb
.monspecs
.hfmax
= 100000;
540 fb
->fb
.monspecs
.vfmin
= 0;
541 fb
->fb
.monspecs
.vfmax
= 400;
542 fb
->fb
.monspecs
.dclkmin
= 1000000;
543 fb
->fb
.monspecs
.dclkmax
= 100000000;
546 * Make sure that the bitfields are set appropriately.
548 clcdfb_set_bitfields(fb
, &fb
->fb
.var
);
551 * Allocate colourmap.
553 ret
= fb_alloc_cmap(&fb
->fb
.cmap
, 256, 0);
558 * Ensure interrupts are disabled.
560 writel(0, fb
->regs
+ fb
->off_ienb
);
562 fb_set_var(&fb
->fb
, &fb
->fb
.var
);
564 dev_info(&fb
->dev
->dev
, "%s hardware, %s display\n",
565 fb
->board
->name
, fb
->panel
->mode
.name
);
567 ret
= register_framebuffer(&fb
->fb
);
571 printk(KERN_ERR
"CLCD: cannot register framebuffer (%d)\n", ret
);
573 fb_dealloc_cmap(&fb
->fb
.cmap
);
577 clk_unprepare(fb
->clk
);
585 static int clcdfb_of_get_dpi_panel_mode(struct device_node
*node
,
586 struct clcd_panel
*clcd_panel
)
589 struct display_timing timing
;
590 struct videomode video
;
592 err
= of_get_display_timing(node
, "panel-timing", &timing
);
596 videomode_from_timing(&timing
, &video
);
598 err
= fb_videomode_from_videomode(&video
, &clcd_panel
->mode
);
602 /* Set up some inversion flags */
603 if (timing
.flags
& DISPLAY_FLAGS_PIXDATA_NEGEDGE
)
604 clcd_panel
->tim2
|= TIM2_IPC
;
605 else if (!(timing
.flags
& DISPLAY_FLAGS_PIXDATA_POSEDGE
))
607 * To preserve backwards compatibility, the IPC (inverted
608 * pixel clock) flag needs to be set on any display that
609 * doesn't explicitly specify that the pixel clock is
610 * active on the negative or positive edge.
612 clcd_panel
->tim2
|= TIM2_IPC
;
614 if (timing
.flags
& DISPLAY_FLAGS_HSYNC_LOW
)
615 clcd_panel
->tim2
|= TIM2_IHS
;
617 if (timing
.flags
& DISPLAY_FLAGS_VSYNC_LOW
)
618 clcd_panel
->tim2
|= TIM2_IVS
;
620 if (timing
.flags
& DISPLAY_FLAGS_DE_LOW
)
621 clcd_panel
->tim2
|= TIM2_IOE
;
626 static int clcdfb_snprintf_mode(char *buf
, int size
, struct fb_videomode
*mode
)
628 return snprintf(buf
, size
, "%ux%u@%u", mode
->xres
, mode
->yres
,
632 static int clcdfb_of_get_backlight(struct device_node
*endpoint
,
633 struct clcd_panel
*clcd_panel
)
635 struct device_node
*panel
;
636 struct device_node
*backlight
;
638 panel
= of_graph_get_remote_port_parent(endpoint
);
642 /* Look up the optional backlight phandle */
643 backlight
= of_parse_phandle(panel
, "backlight", 0);
645 clcd_panel
->backlight
= of_find_backlight_by_node(backlight
);
646 of_node_put(backlight
);
648 if (!clcd_panel
->backlight
)
649 return -EPROBE_DEFER
;
654 static int clcdfb_of_get_mode(struct device
*dev
, struct device_node
*endpoint
,
655 struct clcd_panel
*clcd_panel
)
658 struct device_node
*panel
;
659 struct fb_videomode
*mode
;
663 panel
= of_graph_get_remote_port_parent(endpoint
);
667 /* Only directly connected DPI panels supported for now */
668 if (of_device_is_compatible(panel
, "panel-dpi"))
669 err
= clcdfb_of_get_dpi_panel_mode(panel
, clcd_panel
);
674 mode
= &clcd_panel
->mode
;
676 len
= clcdfb_snprintf_mode(NULL
, 0, mode
);
677 name
= devm_kzalloc(dev
, len
+ 1, GFP_KERNEL
);
681 clcdfb_snprintf_mode(name
, len
+ 1, mode
);
687 static int clcdfb_of_init_tft_panel(struct clcd_fb
*fb
, u32 r0
, u32 g0
, u32 b0
)
694 { 0x110, 1, 7, 13, CLCD_CAP_5551
},
695 { 0x110, 0, 8, 16, CLCD_CAP_888
},
696 { 0x110, 16, 8, 0, CLCD_CAP_888
},
697 { 0x111, 4, 14, 20, CLCD_CAP_444
},
698 { 0x111, 3, 11, 19, CLCD_CAP_444
| CLCD_CAP_5551
},
699 { 0x111, 3, 10, 19, CLCD_CAP_444
| CLCD_CAP_5551
|
701 { 0x111, 0, 8, 16, CLCD_CAP_444
| CLCD_CAP_5551
|
702 CLCD_CAP_565
| CLCD_CAP_888
},
706 /* Bypass pixel clock divider */
707 fb
->panel
->tim2
|= TIM2_BCD
;
709 /* TFT display, vert. comp. interrupt at the start of the back porch */
710 fb
->panel
->cntl
|= CNTL_LCDTFT
| CNTL_LCDVCOMP(1);
714 /* Match the setup with known variants */
715 for (i
= 0; i
< ARRAY_SIZE(panels
) && !fb
->panel
->caps
; i
++) {
716 if (amba_part(fb
->dev
) != panels
[i
].part
)
718 if (g0
!= panels
[i
].g0
)
720 if (r0
== panels
[i
].r0
&& b0
== panels
[i
].b0
)
721 fb
->panel
->caps
= panels
[i
].caps
;
725 * If we actually physically connected the R lines to B and
728 if (r0
!= 0 && b0
== 0)
729 fb
->panel
->bgr_connection
= true;
731 if (fb
->panel
->caps
&& fb
->vendor
->st_bitmux_control
) {
733 * Set up the special bits for the Nomadik control register
734 * (other platforms tend to do this through an external
738 /* Offset of the highest used color */
739 int maxoff
= max3(r0
, g0
, b0
);
740 /* Most significant bit out, highest used bit */
743 if (fb
->panel
->caps
& CLCD_CAP_888
) {
744 msb
= maxoff
+ 8 - 1;
745 } else if (fb
->panel
->caps
& CLCD_CAP_565
) {
746 msb
= maxoff
+ 5 - 1;
747 fb
->panel
->cntl
|= CNTL_ST_1XBPP_565
;
748 } else if (fb
->panel
->caps
& CLCD_CAP_5551
) {
749 msb
= maxoff
+ 5 - 1;
750 fb
->panel
->cntl
|= CNTL_ST_1XBPP_5551
;
751 } else if (fb
->panel
->caps
& CLCD_CAP_444
) {
752 msb
= maxoff
+ 4 - 1;
753 fb
->panel
->cntl
|= CNTL_ST_1XBPP_444
;
756 /* Send out as many bits as we need */
758 fb
->panel
->cntl
|= CNTL_ST_CDWID_24
;
760 fb
->panel
->cntl
|= CNTL_ST_CDWID_18
;
762 fb
->panel
->cntl
|= CNTL_ST_CDWID_16
;
764 fb
->panel
->cntl
|= CNTL_ST_CDWID_12
;
767 return fb
->panel
->caps
? 0 : -EINVAL
;
770 static int clcdfb_of_init_display(struct clcd_fb
*fb
)
772 struct device_node
*endpoint
;
778 fb
->panel
= devm_kzalloc(&fb
->dev
->dev
, sizeof(*fb
->panel
), GFP_KERNEL
);
783 * Fetch the panel endpoint.
785 endpoint
= of_graph_get_next_endpoint(fb
->dev
->dev
.of_node
, NULL
);
789 if (fb
->vendor
->init_panel
) {
790 err
= fb
->vendor
->init_panel(fb
, endpoint
);
795 err
= clcdfb_of_get_backlight(endpoint
, fb
->panel
);
799 err
= clcdfb_of_get_mode(&fb
->dev
->dev
, endpoint
, fb
->panel
);
803 err
= of_property_read_u32(fb
->dev
->dev
.of_node
, "max-memory-bandwidth",
807 * max_bandwidth is in bytes per second and pixclock in
808 * pico-seconds, so the maximum allowed bits per pixel is
809 * 8 * max_bandwidth / (PICOS2KHZ(pixclock) * 1000)
810 * Rearrange this calculation to avoid overflow and then ensure
811 * result is a valid format.
813 bpp
= max_bandwidth
/ (1000 / 8)
814 / PICOS2KHZ(fb
->panel
->mode
.pixclock
);
815 bpp
= rounddown_pow_of_two(bpp
);
820 fb
->panel
->bpp
= bpp
;
822 #ifdef CONFIG_CPU_BIG_ENDIAN
823 fb
->panel
->cntl
|= CNTL_BEBO
;
825 fb
->panel
->width
= -1;
826 fb
->panel
->height
= -1;
828 if (of_property_read_u32_array(endpoint
,
829 "arm,pl11x,tft-r0g0b0-pads",
830 tft_r0b0g0
, ARRAY_SIZE(tft_r0b0g0
)) != 0)
833 return clcdfb_of_init_tft_panel(fb
, tft_r0b0g0
[0],
834 tft_r0b0g0
[1], tft_r0b0g0
[2]);
837 static int clcdfb_of_vram_setup(struct clcd_fb
*fb
)
840 struct device_node
*memory
;
843 err
= clcdfb_of_init_display(fb
);
847 memory
= of_parse_phandle(fb
->dev
->dev
.of_node
, "memory-region", 0);
851 fb
->fb
.screen_base
= of_iomap(memory
, 0);
852 if (!fb
->fb
.screen_base
)
855 fb
->fb
.fix
.smem_start
= of_translate_address(memory
,
856 of_get_address(memory
, 0, &size
, NULL
));
857 fb
->fb
.fix
.smem_len
= size
;
862 static int clcdfb_of_vram_mmap(struct clcd_fb
*fb
, struct vm_area_struct
*vma
)
864 unsigned long off
, user_size
, kernel_size
;
867 off
= vma
->vm_pgoff
<< PAGE_SHIFT
;
868 user_size
= vma
->vm_end
- vma
->vm_start
;
869 kernel_size
= fb
->fb
.fix
.smem_len
;
871 if (off
>= kernel_size
|| user_size
> (kernel_size
- off
))
874 return remap_pfn_range(vma
, vma
->vm_start
,
875 __phys_to_pfn(fb
->fb
.fix
.smem_start
) + vma
->vm_pgoff
,
877 pgprot_writecombine(vma
->vm_page_prot
));
880 static void clcdfb_of_vram_remove(struct clcd_fb
*fb
)
882 iounmap(fb
->fb
.screen_base
);
885 static int clcdfb_of_dma_setup(struct clcd_fb
*fb
)
887 unsigned long framesize
;
891 err
= clcdfb_of_init_display(fb
);
895 framesize
= fb
->panel
->mode
.xres
* fb
->panel
->mode
.yres
*
897 fb
->fb
.screen_base
= dma_alloc_coherent(&fb
->dev
->dev
, framesize
,
899 if (!fb
->fb
.screen_base
)
902 fb
->fb
.fix
.smem_start
= dma
;
903 fb
->fb
.fix
.smem_len
= framesize
;
908 static int clcdfb_of_dma_mmap(struct clcd_fb
*fb
, struct vm_area_struct
*vma
)
910 return dma_mmap_wc(&fb
->dev
->dev
, vma
, fb
->fb
.screen_base
,
911 fb
->fb
.fix
.smem_start
, fb
->fb
.fix
.smem_len
);
914 static void clcdfb_of_dma_remove(struct clcd_fb
*fb
)
916 dma_free_coherent(&fb
->dev
->dev
, fb
->fb
.fix
.smem_len
,
917 fb
->fb
.screen_base
, fb
->fb
.fix
.smem_start
);
920 static struct clcd_board
*clcdfb_of_get_board(struct amba_device
*dev
)
922 struct clcd_board
*board
= devm_kzalloc(&dev
->dev
, sizeof(*board
),
924 struct device_node
*node
= dev
->dev
.of_node
;
929 board
->name
= of_node_full_name(node
);
930 board
->caps
= CLCD_CAP_ALL
;
931 board
->check
= clcdfb_check
;
932 board
->decode
= clcdfb_decode
;
933 if (of_find_property(node
, "memory-region", NULL
)) {
934 board
->setup
= clcdfb_of_vram_setup
;
935 board
->mmap
= clcdfb_of_vram_mmap
;
936 board
->remove
= clcdfb_of_vram_remove
;
938 board
->setup
= clcdfb_of_dma_setup
;
939 board
->mmap
= clcdfb_of_dma_mmap
;
940 board
->remove
= clcdfb_of_dma_remove
;
946 static struct clcd_board
*clcdfb_of_get_board(struct amba_device
*dev
)
952 static int clcdfb_probe(struct amba_device
*dev
, const struct amba_id
*id
)
954 struct clcd_board
*board
= dev_get_platdata(&dev
->dev
);
955 struct clcd_vendor_data
*vendor
= id
->data
;
960 board
= clcdfb_of_get_board(dev
);
965 if (vendor
->init_board
) {
966 ret
= vendor
->init_board(dev
, board
);
971 ret
= dma_set_mask_and_coherent(&dev
->dev
, DMA_BIT_MASK(32));
975 ret
= amba_request_regions(dev
, NULL
);
977 printk(KERN_ERR
"CLCD: unable to reserve regs region\n");
981 fb
= kzalloc(sizeof(struct clcd_fb
), GFP_KERNEL
);
983 printk(KERN_INFO
"CLCD: could not allocate new clcd_fb struct\n");
992 dev_info(&fb
->dev
->dev
, "PL%03x designer %02x rev%u at 0x%08llx\n",
993 amba_part(dev
), amba_manf(dev
), amba_rev(dev
),
994 (unsigned long long)dev
->res
.start
);
996 ret
= fb
->board
->setup(fb
);
1000 ret
= clcdfb_register(fb
);
1002 amba_set_drvdata(dev
, fb
);
1006 fb
->board
->remove(fb
);
1010 amba_release_regions(dev
);
1015 static int clcdfb_remove(struct amba_device
*dev
)
1017 struct clcd_fb
*fb
= amba_get_drvdata(dev
);
1020 unregister_framebuffer(&fb
->fb
);
1021 if (fb
->fb
.cmap
.len
)
1022 fb_dealloc_cmap(&fb
->fb
.cmap
);
1024 clk_unprepare(fb
->clk
);
1027 fb
->board
->remove(fb
);
1031 amba_release_regions(dev
);
1036 static struct clcd_vendor_data vendor_arm
= {
1037 /* Sets up the versatile board displays */
1038 .init_panel
= versatile_clcd_init_panel
,
1041 static struct clcd_vendor_data vendor_nomadik
= {
1042 .clock_timregs
= true,
1043 .packed_24_bit_pixels
= true,
1044 .st_bitmux_control
= true,
1045 .init_board
= nomadik_clcd_init_board
,
1046 .init_panel
= nomadik_clcd_init_panel
,
1049 static struct amba_id clcdfb_id_table
[] = {
1053 .data
= &vendor_arm
,
1055 /* ST Electronics Nomadik variant */
1059 .data
= &vendor_nomadik
,
1064 MODULE_DEVICE_TABLE(amba
, clcdfb_id_table
);
1066 static struct amba_driver clcd_driver
= {
1068 .name
= "clcd-pl11x",
1070 .probe
= clcdfb_probe
,
1071 .remove
= clcdfb_remove
,
1072 .id_table
= clcdfb_id_table
,
1075 static int __init
amba_clcdfb_init(void)
1077 if (fb_get_options("ambafb", NULL
))
1080 return amba_driver_register(&clcd_driver
);
1083 module_init(amba_clcdfb_init
);
1085 static void __exit
amba_clcdfb_exit(void)
1087 amba_driver_unregister(&clcd_driver
);
1090 module_exit(amba_clcdfb_exit
);
1092 MODULE_DESCRIPTION("ARM PrimeCell PL110 CLCD core driver");
1093 MODULE_LICENSE("GPL");