Commit | Line | Data |
---|---|---|
a21765a7 | 1 | /* linux/arch/arm/mach-s3c2412/dma.c |
34348012 | 2 | * |
c16f7bd8 | 3 | * Copyright (c) 2006 Simtec Electronics |
34348012 BD |
4 | * Ben Dooks <ben@simtec.co.uk> |
5 | * | |
6 | * S3C2412 DMA selection | |
7 | * | |
8 | * http://armlinux.simtec.co.uk/ | |
9 | * | |
10 | * This program is free software; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License version 2 as | |
12 | * published by the Free Software Foundation. | |
13 | */ | |
14 | ||
15 | #include <linux/kernel.h> | |
16 | #include <linux/init.h> | |
4a858cfc | 17 | #include <linux/device.h> |
b6d1f542 | 18 | #include <linux/serial_core.h> |
fced80c7 | 19 | #include <linux/io.h> |
34348012 | 20 | |
a09e64fb | 21 | #include <mach/dma.h> |
34348012 | 22 | |
992426bf | 23 | #include <plat/dma-s3c24xx.h> |
a2b7ba9c | 24 | #include <plat/cpu.h> |
34348012 | 25 | |
a2b7ba9c | 26 | #include <plat/regs-serial.h> |
a09e64fb | 27 | #include <mach/regs-gpio.h> |
f74c95c2 | 28 | #include <plat/regs-ac97.h> |
44dc9404 | 29 | #include <plat/regs-dma.h> |
a09e64fb RK |
30 | #include <mach/regs-lcd.h> |
31 | #include <mach/regs-sdi.h> | |
8150bc88 | 32 | #include <plat/regs-iis.h> |
13622708 | 33 | #include <plat/regs-spi.h> |
34348012 BD |
34 | |
35 | #define MAP(x) { (x)| DMA_CH_VALID, (x)| DMA_CH_VALID, (x)| DMA_CH_VALID, (x)| DMA_CH_VALID } | |
36 | ||
37 | static struct s3c24xx_dma_map __initdata s3c2412_dma_mappings[] = { | |
38 | [DMACH_XD0] = { | |
39 | .name = "xdreq0", | |
40 | .channels = MAP(S3C2412_DMAREQSEL_XDREQ0), | |
c6709e8e | 41 | .channels_rx = MAP(S3C2412_DMAREQSEL_XDREQ0), |
34348012 BD |
42 | }, |
43 | [DMACH_XD1] = { | |
44 | .name = "xdreq1", | |
45 | .channels = MAP(S3C2412_DMAREQSEL_XDREQ1), | |
c6709e8e | 46 | .channels_rx = MAP(S3C2412_DMAREQSEL_XDREQ1), |
34348012 BD |
47 | }, |
48 | [DMACH_SDI] = { | |
49 | .name = "sdi", | |
50 | .channels = MAP(S3C2412_DMAREQSEL_SDI), | |
c6709e8e | 51 | .channels_rx = MAP(S3C2412_DMAREQSEL_SDI), |
34348012 BD |
52 | }, |
53 | [DMACH_SPI0] = { | |
54 | .name = "spi0", | |
55 | .channels = MAP(S3C2412_DMAREQSEL_SPI0TX), | |
c6709e8e | 56 | .channels_rx = MAP(S3C2412_DMAREQSEL_SPI0RX), |
34348012 BD |
57 | }, |
58 | [DMACH_SPI1] = { | |
59 | .name = "spi1", | |
60 | .channels = MAP(S3C2412_DMAREQSEL_SPI1TX), | |
c6709e8e | 61 | .channels_rx = MAP(S3C2412_DMAREQSEL_SPI1RX), |
34348012 BD |
62 | }, |
63 | [DMACH_UART0] = { | |
64 | .name = "uart0", | |
65 | .channels = MAP(S3C2412_DMAREQSEL_UART0_0), | |
c6709e8e | 66 | .channels_rx = MAP(S3C2412_DMAREQSEL_UART0_0), |
34348012 BD |
67 | }, |
68 | [DMACH_UART1] = { | |
69 | .name = "uart1", | |
70 | .channels = MAP(S3C2412_DMAREQSEL_UART1_0), | |
c6709e8e | 71 | .channels_rx = MAP(S3C2412_DMAREQSEL_UART1_0), |
34348012 BD |
72 | }, |
73 | [DMACH_UART2] = { | |
74 | .name = "uart2", | |
75 | .channels = MAP(S3C2412_DMAREQSEL_UART2_0), | |
c6709e8e | 76 | .channels_rx = MAP(S3C2412_DMAREQSEL_UART2_0), |
34348012 BD |
77 | }, |
78 | [DMACH_UART0_SRC2] = { | |
79 | .name = "uart0", | |
80 | .channels = MAP(S3C2412_DMAREQSEL_UART0_1), | |
c6709e8e | 81 | .channels_rx = MAP(S3C2412_DMAREQSEL_UART0_1), |
34348012 BD |
82 | }, |
83 | [DMACH_UART1_SRC2] = { | |
84 | .name = "uart1", | |
85 | .channels = MAP(S3C2412_DMAREQSEL_UART1_1), | |
c6709e8e | 86 | .channels_rx = MAP(S3C2412_DMAREQSEL_UART1_1), |
34348012 BD |
87 | }, |
88 | [DMACH_UART2_SRC2] = { | |
89 | .name = "uart2", | |
90 | .channels = MAP(S3C2412_DMAREQSEL_UART2_1), | |
c6709e8e | 91 | .channels_rx = MAP(S3C2412_DMAREQSEL_UART2_1), |
34348012 BD |
92 | }, |
93 | [DMACH_TIMER] = { | |
94 | .name = "timer", | |
95 | .channels = MAP(S3C2412_DMAREQSEL_TIMER), | |
c6709e8e | 96 | .channels_rx = MAP(S3C2412_DMAREQSEL_TIMER), |
34348012 BD |
97 | }, |
98 | [DMACH_I2S_IN] = { | |
99 | .name = "i2s-sdi", | |
100 | .channels = MAP(S3C2412_DMAREQSEL_I2SRX), | |
c6709e8e | 101 | .channels_rx = MAP(S3C2412_DMAREQSEL_I2SRX), |
34348012 BD |
102 | }, |
103 | [DMACH_I2S_OUT] = { | |
104 | .name = "i2s-sdo", | |
105 | .channels = MAP(S3C2412_DMAREQSEL_I2STX), | |
c6709e8e | 106 | .channels_rx = MAP(S3C2412_DMAREQSEL_I2STX), |
34348012 BD |
107 | }, |
108 | [DMACH_USB_EP1] = { | |
109 | .name = "usb-ep1", | |
110 | .channels = MAP(S3C2412_DMAREQSEL_USBEP1), | |
c6709e8e | 111 | .channels_rx = MAP(S3C2412_DMAREQSEL_USBEP1), |
34348012 BD |
112 | }, |
113 | [DMACH_USB_EP2] = { | |
114 | .name = "usb-ep2", | |
115 | .channels = MAP(S3C2412_DMAREQSEL_USBEP2), | |
c6709e8e | 116 | .channels_rx = MAP(S3C2412_DMAREQSEL_USBEP2), |
34348012 BD |
117 | }, |
118 | [DMACH_USB_EP3] = { | |
119 | .name = "usb-ep3", | |
120 | .channels = MAP(S3C2412_DMAREQSEL_USBEP3), | |
c6709e8e | 121 | .channels_rx = MAP(S3C2412_DMAREQSEL_USBEP3), |
34348012 BD |
122 | }, |
123 | [DMACH_USB_EP4] = { | |
124 | .name = "usb-ep4", | |
125 | .channels = MAP(S3C2412_DMAREQSEL_USBEP4), | |
c6709e8e | 126 | .channels_rx = MAP(S3C2412_DMAREQSEL_USBEP4), |
34348012 BD |
127 | }, |
128 | }; | |
129 | ||
c6709e8e BD |
130 | static void s3c2412_dma_direction(struct s3c2410_dma_chan *chan, |
131 | struct s3c24xx_dma_map *map, | |
51ddf31d | 132 | enum dma_data_direction dir) |
c6709e8e BD |
133 | { |
134 | unsigned long chsel; | |
135 | ||
51ddf31d | 136 | if (dir == DMA_FROM_DEVICE) |
c6709e8e BD |
137 | chsel = map->channels_rx[0]; |
138 | else | |
139 | chsel = map->channels[0]; | |
140 | ||
141 | chsel &= ~DMA_CH_VALID; | |
142 | chsel |= S3C2412_DMAREQSEL_HW; | |
143 | ||
144 | writel(chsel, chan->regs + S3C2412_DMA_DMAREQSEL); | |
145 | } | |
146 | ||
34348012 BD |
147 | static void s3c2412_dma_select(struct s3c2410_dma_chan *chan, |
148 | struct s3c24xx_dma_map *map) | |
149 | { | |
c6709e8e | 150 | s3c2412_dma_direction(chan, map, chan->source); |
34348012 BD |
151 | } |
152 | ||
153 | static struct s3c24xx_dma_selection __initdata s3c2412_dma_sel = { | |
154 | .select = s3c2412_dma_select, | |
c6709e8e | 155 | .direction = s3c2412_dma_direction, |
34348012 BD |
156 | .dcon_mask = 0, |
157 | .map = s3c2412_dma_mappings, | |
158 | .map_size = ARRAY_SIZE(s3c2412_dma_mappings), | |
159 | }; | |
160 | ||
04511a6f HS |
161 | static int __init s3c2412_dma_add(struct device *dev, |
162 | struct subsys_interface *sif) | |
34348012 | 163 | { |
48adbcf3 | 164 | s3c2410_dma_init(); |
34348012 BD |
165 | return s3c24xx_dma_init_map(&s3c2412_dma_sel); |
166 | } | |
167 | ||
4a858cfc KS |
168 | static struct subsys_interface s3c2412_dma_interface = { |
169 | .name = "s3c2412_dma", | |
170 | .subsys = &s3c2412_subsys, | |
171 | .add_dev = s3c2412_dma_add, | |
34348012 BD |
172 | }; |
173 | ||
174 | static int __init s3c2412_dma_init(void) | |
175 | { | |
4a858cfc | 176 | return subsys_interface_register(&s3c2412_dma_interface); |
34348012 BD |
177 | } |
178 | ||
179 | arch_initcall(s3c2412_dma_init); |