183 lines
		
	
	
	
		
			3.9 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			183 lines
		
	
	
	
		
			3.9 KiB
			
		
	
	
	
		
			C
		
	
	
	
	
	
|   | #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); | ||
|  | } |