1/*
2 * Platform device support for Au1x00 SoCs.
3 *
4 * Copyright 2004, Matt Porter <mporter@kernel.crashing.org>
5 *
6 * This file is licensed under the terms of the GNU General Public
7 * License version 2.  This program is licensed "as is" without any
8 * warranty of any kind, whether express or implied.
9 */
10#include <linux/device.h>
11#include <linux/platform_device.h>
12#include <linux/kernel.h>
13#include <linux/init.h>
14#include <linux/resource.h>
15
16#include <asm/mach-au1x00/au1xxx.h>
17
18/* OHCI (USB full speed host controller) */
19static struct resource au1xxx_usb_ohci_resources[] = {
20	[0] = {
21		.start		= USB_OHCI_BASE,
22		.end		= USB_OHCI_BASE + USB_OHCI_LEN - 1,
23		.flags		= IORESOURCE_MEM,
24	},
25	[1] = {
26		.start		= AU1000_USB_HOST_INT,
27		.end		= AU1000_USB_HOST_INT,
28		.flags		= IORESOURCE_IRQ,
29	},
30};
31
32/* The dmamask must be set for OHCI to work */
33static u64 ohci_dmamask = ~(u32)0;
34
35static struct platform_device au1xxx_usb_ohci_device = {
36	.name		= "au1xxx-ohci",
37	.id		= 0,
38	.dev = {
39		.dma_mask		= &ohci_dmamask,
40		.coherent_dma_mask	= 0xffffffff,
41	},
42	.num_resources	= ARRAY_SIZE(au1xxx_usb_ohci_resources),
43	.resource	= au1xxx_usb_ohci_resources,
44};
45
46/*** AU1100 LCD controller ***/
47
48#ifdef CONFIG_FB_AU1100
49static struct resource au1100_lcd_resources[] = {
50	[0] = {
51		.start          = LCD_PHYS_ADDR,
52		.end            = LCD_PHYS_ADDR + 0x800 - 1,
53		.flags          = IORESOURCE_MEM,
54	},
55	[1] = {
56		.start          = AU1100_LCD_INT,
57		.end            = AU1100_LCD_INT,
58		.flags          = IORESOURCE_IRQ,
59	}
60};
61
62static u64 au1100_lcd_dmamask = ~(u32)0;
63
64static struct platform_device au1100_lcd_device = {
65	.name           = "au1100-lcd",
66	.id             = 0,
67	.dev = {
68		.dma_mask               = &au1100_lcd_dmamask,
69		.coherent_dma_mask      = 0xffffffff,
70	},
71	.num_resources  = ARRAY_SIZE(au1100_lcd_resources),
72	.resource       = au1100_lcd_resources,
73};
74#endif
75
76#ifdef CONFIG_SOC_AU1200
77/* EHCI (USB high speed host controller) */
78static struct resource au1xxx_usb_ehci_resources[] = {
79	[0] = {
80		.start		= USB_EHCI_BASE,
81		.end		= USB_EHCI_BASE + USB_EHCI_LEN - 1,
82		.flags		= IORESOURCE_MEM,
83	},
84	[1] = {
85		.start		= AU1000_USB_HOST_INT,
86		.end		= AU1000_USB_HOST_INT,
87		.flags		= IORESOURCE_IRQ,
88	},
89};
90
91static u64 ehci_dmamask = ~(u32)0;
92
93static struct platform_device au1xxx_usb_ehci_device = {
94	.name		= "au1xxx-ehci",
95	.id		= 0,
96	.dev = {
97		.dma_mask		= &ehci_dmamask,
98		.coherent_dma_mask	= 0xffffffff,
99	},
100	.num_resources	= ARRAY_SIZE(au1xxx_usb_ehci_resources),
101	.resource	= au1xxx_usb_ehci_resources,
102};
103
104/* Au1200 UDC (USB gadget controller) */
105static struct resource au1xxx_usb_gdt_resources[] = {
106	[0] = {
107		.start		= USB_UDC_BASE,
108		.end		= USB_UDC_BASE + USB_UDC_LEN - 1,
109		.flags		= IORESOURCE_MEM,
110	},
111	[1] = {
112		.start		= AU1200_USB_INT,
113		.end		= AU1200_USB_INT,
114		.flags		= IORESOURCE_IRQ,
115	},
116};
117
118static struct resource au1xxx_mmc_resources[] = {
119	[0] = {
120		.start          = SD0_PHYS_ADDR,
121		.end            = SD0_PHYS_ADDR + 0x40,
122		.flags          = IORESOURCE_MEM,
123	},
124	[1] = {
125		.start		= SD1_PHYS_ADDR,
126		.end 		= SD1_PHYS_ADDR + 0x40,
127		.flags		= IORESOURCE_MEM,
128	},
129	[2] = {
130		.start          = AU1200_SD_INT,
131		.end            = AU1200_SD_INT,
132		.flags          = IORESOURCE_IRQ,
133	}
134};
135
136static u64 udc_dmamask = ~(u32)0;
137
138static struct platform_device au1xxx_usb_gdt_device = {
139	.name		= "au1xxx-udc",
140	.id		= 0,
141	.dev = {
142		.dma_mask		= &udc_dmamask,
143		.coherent_dma_mask	= 0xffffffff,
144	},
145	.num_resources	= ARRAY_SIZE(au1xxx_usb_gdt_resources),
146	.resource	= au1xxx_usb_gdt_resources,
147};
148
149/* Au1200 UOC (USB OTG controller) */
150static struct resource au1xxx_usb_otg_resources[] = {
151	[0] = {
152		.start		= USB_UOC_BASE,
153		.end		= USB_UOC_BASE + USB_UOC_LEN - 1,
154		.flags		= IORESOURCE_MEM,
155	},
156	[1] = {
157		.start		= AU1200_USB_INT,
158		.end		= AU1200_USB_INT,
159		.flags		= IORESOURCE_IRQ,
160	},
161};
162
163static u64 uoc_dmamask = ~(u32)0;
164
165static struct platform_device au1xxx_usb_otg_device = {
166	.name		= "au1xxx-uoc",
167	.id		= 0,
168	.dev = {
169		.dma_mask		= &uoc_dmamask,
170		.coherent_dma_mask	= 0xffffffff,
171	},
172	.num_resources	= ARRAY_SIZE(au1xxx_usb_otg_resources),
173	.resource	= au1xxx_usb_otg_resources,
174};
175
176static struct resource au1200_lcd_resources[] = {
177	[0] = {
178		.start          = LCD_PHYS_ADDR,
179		.end            = LCD_PHYS_ADDR + 0x800 - 1,
180		.flags          = IORESOURCE_MEM,
181	},
182	[1] = {
183		.start          = AU1200_LCD_INT,
184		.end            = AU1200_LCD_INT,
185		.flags          = IORESOURCE_IRQ,
186	}
187};
188
189static struct resource au1200_ide0_resources[] = {
190	[0] = {
191		.start		= AU1XXX_ATA_PHYS_ADDR,
192		.end 		= AU1XXX_ATA_PHYS_ADDR + AU1XXX_ATA_PHYS_LEN,
193		.flags		= IORESOURCE_MEM,
194	},
195	[1] = {
196		.start		= AU1XXX_ATA_INT,
197		.end		= AU1XXX_ATA_INT,
198		.flags		= IORESOURCE_IRQ,
199	}
200};
201
202static u64 au1200_lcd_dmamask = ~(u32)0;
203
204static struct platform_device au1200_lcd_device = {
205	.name           = "au1200-lcd",
206	.id             = 0,
207	.dev = {
208		.dma_mask               = &au1200_lcd_dmamask,
209		.coherent_dma_mask      = 0xffffffff,
210	},
211	.num_resources  = ARRAY_SIZE(au1200_lcd_resources),
212	.resource       = au1200_lcd_resources,
213};
214
215
216static u64 ide0_dmamask = ~(u32)0;
217
218static struct platform_device au1200_ide0_device = {
219	.name		= "au1200-ide",
220	.id		= 0,
221	.dev = {
222		.dma_mask 		= &ide0_dmamask,
223		.coherent_dma_mask	= 0xffffffff,
224	},
225	.num_resources = ARRAY_SIZE(au1200_ide0_resources),
226	.resource	= au1200_ide0_resources,
227};
228
229static u64 au1xxx_mmc_dmamask =  ~(u32)0;
230
231static struct platform_device au1xxx_mmc_device = {
232	.name = "au1xxx-mmc",
233	.id = 0,
234	.dev = {
235		.dma_mask               = &au1xxx_mmc_dmamask,
236		.coherent_dma_mask      = 0xffffffff,
237	},
238	.num_resources  = ARRAY_SIZE(au1xxx_mmc_resources),
239	.resource       = au1xxx_mmc_resources,
240};
241#endif /* #ifdef CONFIG_SOC_AU1200 */
242
243static struct platform_device au1x00_pcmcia_device = {
244	.name 		= "au1x00-pcmcia",
245	.id 		= 0,
246};
247
248#ifdef CONFIG_MIPS_DB1200
249
250static struct resource smc91x_resources[] = {
251	[0] = {
252		.name	= "smc91x-regs",
253		.start	= AU1XXX_SMC91111_PHYS_ADDR,
254		.end	= AU1XXX_SMC91111_PHYS_ADDR + 0xfffff,
255		.flags	= IORESOURCE_MEM,
256	},
257	[1] = {
258		.start	= AU1XXX_SMC91111_IRQ,
259		.end	= AU1XXX_SMC91111_IRQ,
260		.flags	= IORESOURCE_IRQ,
261	},
262};
263
264static struct platform_device smc91x_device = {
265	.name		= "smc91x",
266	.id		= -1,
267	.num_resources	= ARRAY_SIZE(smc91x_resources),
268	.resource	= smc91x_resources,
269};
270
271#endif
272
273static struct platform_device *au1xxx_platform_devices[] __initdata = {
274	&au1xxx_usb_ohci_device,
275	&au1x00_pcmcia_device,
276#ifdef CONFIG_FB_AU1100
277	&au1100_lcd_device,
278#endif
279#ifdef CONFIG_SOC_AU1200
280	&au1xxx_usb_ehci_device,
281	&au1xxx_usb_gdt_device,
282	&au1xxx_usb_otg_device,
283	&au1200_lcd_device,
284	&au1200_ide0_device,
285	&au1xxx_mmc_device,
286#endif
287#ifdef CONFIG_MIPS_DB1200
288	&smc91x_device,
289#endif
290};
291
292int au1xxx_platform_init(void)
293{
294	return platform_add_devices(au1xxx_platform_devices, ARRAY_SIZE(au1xxx_platform_devices));
295}
296
297arch_initcall(au1xxx_platform_init);
298