| 
									
										
										
										
											2006-09-15 23:42:24 +01:00
										 |  |  | /* linux/arch/arm/mach-s3c2410/dma.c
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  |  * Copyright (c) 2006 Simtec Electronics | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  *	Ben Dooks <ben@simtec.co.uk> | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  |  * S3C2410 DMA selection | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2006-09-15 23:42:24 +01:00
										 |  |  |  * http://armlinux.simtec.co.uk/
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU General Public License version 2 as | 
					
						
							|  |  |  |  * published by the Free Software Foundation. | 
					
						
							| 
									
										
										
										
											2006-09-15 23:42:24 +01:00
										 |  |  | */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | #include <linux/kernel.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <linux/init.h>
 | 
					
						
							| 
									
										
										
										
											2011-12-21 16:01:38 -08:00
										 |  |  | #include <linux/device.h>
 | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | #include <linux/serial_core.h>
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-03-19 15:02:38 +00:00
										 |  |  | #include <mach/map.h>
 | 
					
						
							| 
									
										
										
										
											2008-08-05 16:14:15 +01:00
										 |  |  | #include <mach/dma.h>
 | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 22:26:09 +01:00
										 |  |  | #include <plat/cpu.h>
 | 
					
						
							| 
									
										
										
										
											2010-02-20 23:01:33 +00:00
										 |  |  | #include <plat/dma-s3c24xx.h>
 | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-10-07 22:26:09 +01:00
										 |  |  | #include <plat/regs-serial.h>
 | 
					
						
							| 
									
										
										
										
											2008-08-05 16:14:15 +01:00
										 |  |  | #include <mach/regs-gpio.h>
 | 
					
						
							| 
									
										
										
										
											2008-10-30 10:14:36 +00:00
										 |  |  | #include <plat/regs-ac97.h>
 | 
					
						
							| 
									
										
										
										
											2009-03-19 15:02:35 +00:00
										 |  |  | #include <plat/regs-dma.h>
 | 
					
						
							| 
									
										
										
										
											2008-08-05 16:14:15 +01:00
										 |  |  | #include <mach/regs-mem.h>
 | 
					
						
							|  |  |  | #include <mach/regs-lcd.h>
 | 
					
						
							|  |  |  | #include <mach/regs-sdi.h>
 | 
					
						
							| 
									
										
										
										
											2009-03-04 00:49:26 +00:00
										 |  |  | #include <plat/regs-iis.h>
 | 
					
						
							| 
									
										
										
										
											2008-10-30 10:14:38 +00:00
										 |  |  | #include <plat/regs-spi.h>
 | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | static struct s3c24xx_dma_map __initdata s3c2410_dma_mappings[] = { | 
					
						
							|  |  |  | 	[DMACH_XD0] = { | 
					
						
							|  |  |  | 		.name		= "xdreq0", | 
					
						
							|  |  |  | 		.channels[0]	= S3C2410_DCON_CH0_XDREQ0 | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_XD1] = { | 
					
						
							|  |  |  | 		.name		= "xdreq1", | 
					
						
							|  |  |  | 		.channels[1]	= S3C2410_DCON_CH1_XDREQ1 | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_SDI] = { | 
					
						
							|  |  |  | 		.name		= "sdi", | 
					
						
							|  |  |  | 		.channels[0]	= S3C2410_DCON_CH0_SDI | DMA_CH_VALID, | 
					
						
							|  |  |  | 		.channels[2]	= S3C2410_DCON_CH2_SDI | DMA_CH_VALID, | 
					
						
							|  |  |  | 		.channels[3]	= S3C2410_DCON_CH3_SDI | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_SPI0] = { | 
					
						
							|  |  |  | 		.name		= "spi0", | 
					
						
							|  |  |  | 		.channels[1]	= S3C2410_DCON_CH1_SPI | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_SPI1] = { | 
					
						
							|  |  |  | 		.name		= "spi1", | 
					
						
							|  |  |  | 		.channels[3]	= S3C2410_DCON_CH3_SPI | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_UART0] = { | 
					
						
							|  |  |  | 		.name		= "uart0", | 
					
						
							|  |  |  | 		.channels[0]	= S3C2410_DCON_CH0_UART0 | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_UART1] = { | 
					
						
							|  |  |  | 		.name		= "uart1", | 
					
						
							|  |  |  | 		.channels[1]	= S3C2410_DCON_CH1_UART1 | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  |       	[DMACH_UART2] = { | 
					
						
							|  |  |  | 		.name		= "uart2", | 
					
						
							|  |  |  | 		.channels[3]	= S3C2410_DCON_CH3_UART2 | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_TIMER] = { | 
					
						
							|  |  |  | 		.name		= "timer", | 
					
						
							|  |  |  | 		.channels[0]	= S3C2410_DCON_CH0_TIMER | DMA_CH_VALID, | 
					
						
							|  |  |  | 		.channels[2]	= S3C2410_DCON_CH2_TIMER | DMA_CH_VALID, | 
					
						
							|  |  |  | 		.channels[3]	= S3C2410_DCON_CH3_TIMER | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_I2S_IN] = { | 
					
						
							|  |  |  | 		.name		= "i2s-sdi", | 
					
						
							|  |  |  | 		.channels[1]	= S3C2410_DCON_CH1_I2SSDI | DMA_CH_VALID, | 
					
						
							|  |  |  | 		.channels[2]	= S3C2410_DCON_CH2_I2SSDI | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_I2S_OUT] = { | 
					
						
							|  |  |  | 		.name		= "i2s-sdo", | 
					
						
							|  |  |  | 		.channels[2]	= S3C2410_DCON_CH2_I2SSDO | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_USB_EP1] = { | 
					
						
							|  |  |  | 		.name		= "usb-ep1", | 
					
						
							|  |  |  | 		.channels[0]	= S3C2410_DCON_CH0_USBEP1 | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_USB_EP2] = { | 
					
						
							|  |  |  | 		.name		= "usb-ep2", | 
					
						
							|  |  |  | 		.channels[1]	= S3C2410_DCON_CH1_USBEP2 | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_USB_EP3] = { | 
					
						
							|  |  |  | 		.name		= "usb-ep3", | 
					
						
							|  |  |  | 		.channels[2]	= S3C2410_DCON_CH2_USBEP3 | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | 	[DMACH_USB_EP4] = { | 
					
						
							|  |  |  | 		.name		= "usb-ep4", | 
					
						
							|  |  |  | 		.channels[3]	=S3C2410_DCON_CH3_USBEP4 | DMA_CH_VALID, | 
					
						
							|  |  |  | 	}, | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | static void s3c2410_dma_select(struct s3c2410_dma_chan *chan, | 
					
						
							|  |  |  | 			       struct s3c24xx_dma_map *map) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | 	chan->dcon = map->channels[chan->number] & ~DMA_CH_VALID; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | static struct s3c24xx_dma_selection __initdata s3c2410_dma_sel = { | 
					
						
							|  |  |  | 	.select		= s3c2410_dma_select, | 
					
						
							|  |  |  | 	.dcon_mask	= 7 << 24, | 
					
						
							|  |  |  | 	.map		= s3c2410_dma_mappings, | 
					
						
							|  |  |  | 	.map_size	= ARRAY_SIZE(s3c2410_dma_mappings), | 
					
						
							|  |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-13 13:12:16 +01:00
										 |  |  | static struct s3c24xx_dma_order __initdata s3c2410_dma_order = { | 
					
						
							|  |  |  | 	.channels	= { | 
					
						
							|  |  |  | 		[DMACH_SDI]	= { | 
					
						
							|  |  |  | 			.list	= { | 
					
						
							|  |  |  | 				[0]	= 3 | DMA_CH_VALID, | 
					
						
							|  |  |  | 				[1]	= 2 | DMA_CH_VALID, | 
					
						
							|  |  |  | 				[2]	= 0 | DMA_CH_VALID, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 		[DMACH_I2S_IN]	= { | 
					
						
							|  |  |  | 			.list	= { | 
					
						
							|  |  |  | 				[0]	= 1 | DMA_CH_VALID, | 
					
						
							|  |  |  | 				[1]	= 2 | DMA_CH_VALID, | 
					
						
							|  |  |  | 			}, | 
					
						
							|  |  |  | 		}, | 
					
						
							|  |  |  | 	}, | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-01-27 15:35:25 +09:00
										 |  |  | static int __init s3c2410_dma_add(struct device *dev, | 
					
						
							|  |  |  | 				  struct subsys_interface *sif) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-02-17 15:37:14 +01:00
										 |  |  | 	s3c2410_dma_init(); | 
					
						
							| 
									
										
										
										
											2007-02-13 13:12:16 +01:00
										 |  |  | 	s3c24xx_dma_order_set(&s3c2410_dma_order); | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | 	return s3c24xx_dma_init_map(&s3c2410_dma_sel); | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | #if defined(CONFIG_CPU_S3C2410)
 | 
					
						
							| 
									
										
										
										
											2011-12-21 16:01:38 -08:00
										 |  |  | static struct subsys_interface s3c2410_dma_interface = { | 
					
						
							|  |  |  | 	.name		= "s3c2410_dma", | 
					
						
							|  |  |  | 	.subsys		= &s3c2410_subsys, | 
					
						
							|  |  |  | 	.add_dev	= s3c2410_dma_add, | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-17 15:37:14 +01:00
										 |  |  | static int __init s3c2410_dma_drvinit(void) | 
					
						
							| 
									
										
										
										
											2006-08-18 15:32:10 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2012-01-27 15:35:25 +09:00
										 |  |  | 	return subsys_interface_register(&s3c2410_dma_interface); | 
					
						
							| 
									
										
										
										
											2006-08-18 15:32:10 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-17 15:37:14 +01:00
										 |  |  | arch_initcall(s3c2410_dma_drvinit); | 
					
						
							| 
									
										
										
										
											2009-07-30 23:23:38 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-12-21 16:01:38 -08:00
										 |  |  | static struct subsys_interface s3c2410a_dma_interface = { | 
					
						
							|  |  |  | 	.name		= "s3c2410a_dma", | 
					
						
							|  |  |  | 	.subsys		= &s3c2410a_subsys, | 
					
						
							|  |  |  | 	.add_dev	= s3c2410_dma_add, | 
					
						
							| 
									
										
										
										
											2009-07-30 23:23:38 +01:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static int __init s3c2410a_dma_drvinit(void) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2011-12-21 16:01:38 -08:00
										 |  |  | 	return subsys_interface_register(&s3c2410a_dma_interface); | 
					
						
							| 
									
										
										
										
											2009-07-30 23:23:38 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | arch_initcall(s3c2410a_dma_drvinit); | 
					
						
							| 
									
										
										
										
											2006-08-18 15:32:10 +01:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | #if defined(CONFIG_CPU_S3C2442)
 | 
					
						
							|  |  |  | /* S3C2442 DMA contains the same selection table as the S3C2410 */ | 
					
						
							| 
									
										
										
										
											2011-12-21 16:01:38 -08:00
										 |  |  | static struct subsys_interface s3c2442_dma_interface = { | 
					
						
							|  |  |  | 	.name		= "s3c2442_dma", | 
					
						
							|  |  |  | 	.subsys		= &s3c2442_subsys, | 
					
						
							|  |  |  | 	.add_dev	= s3c2410_dma_add, | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-17 15:37:14 +01:00
										 |  |  | static int __init s3c2442_dma_drvinit(void) | 
					
						
							| 
									
										
										
										
											2006-09-15 23:42:24 +01:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-12-21 16:01:38 -08:00
										 |  |  | 	return subsys_interface_register(&s3c2442_dma_interface); | 
					
						
							| 
									
										
										
										
											2006-09-15 23:42:24 +01:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-02-17 15:37:14 +01:00
										 |  |  | arch_initcall(s3c2442_dma_drvinit); | 
					
						
							| 
									
										
										
										
											2007-02-11 18:31:01 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2006-09-15 23:42:24 +01:00
										 |  |  | 
 |