Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
platform.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2007-2009 Geert Uytterhoeven
3  *
4  * This file is subject to the terms and conditions of the GNU General Public
5  * License. See the file COPYING in the main directory of this archive
6  * for more details.
7  */
8 
9 #include <linux/err.h>
10 #include <linux/init.h>
11 #include <linux/platform_device.h>
12 #include <linux/zorro.h>
13 
14 #include <asm/amigahw.h>
15 #include <asm/amigayle.h>
16 
17 
18 #ifdef CONFIG_ZORRO
19 
20 static const struct resource zorro_resources[] __initconst = {
21  /* Zorro II regions (on Zorro II/III) */
22  {
23  .name = "Zorro II exp",
24  .start = 0x00e80000,
25  .end = 0x00efffff,
26  .flags = IORESOURCE_MEM,
27  }, {
28  .name = "Zorro II mem",
29  .start = 0x00200000,
30  .end = 0x009fffff,
31  .flags = IORESOURCE_MEM,
32  },
33  /* Zorro III regions (on Zorro III only) */
34  {
35  .name = "Zorro III exp",
36  .start = 0xff000000,
37  .end = 0xffffffff,
38  .flags = IORESOURCE_MEM,
39  }, {
40  .name = "Zorro III cfg",
41  .start = 0x40000000,
42  .end = 0x7fffffff,
43  .flags = IORESOURCE_MEM,
44  }
45 };
46 
47 
48 static int __init amiga_init_bus(void)
49 {
50  struct platform_device *pdev;
51  unsigned int n;
52 
53  if (!MACH_IS_AMIGA || !AMIGAHW_PRESENT(ZORRO))
54  return -ENODEV;
55 
56  n = AMIGAHW_PRESENT(ZORRO3) ? 4 : 2;
57  pdev = platform_device_register_simple("amiga-zorro", -1,
58  zorro_resources, n);
59  return PTR_RET(pdev);
60 }
61 
62 subsys_initcall(amiga_init_bus);
63 
64 
65 static int __init z_dev_present(zorro_id id)
66 {
67  unsigned int i;
68 
69  for (i = 0; i < zorro_num_autocon; i++)
70  if (zorro_autocon[i].rom.er_Manufacturer == ZORRO_MANUF(id) &&
71  zorro_autocon[i].rom.er_Product == ZORRO_PROD(id))
72  return 1;
73 
74  return 0;
75 }
76 
77 #else /* !CONFIG_ZORRO */
78 
79 static inline int z_dev_present(zorro_id id) { return 0; }
80 
81 #endif /* !CONFIG_ZORRO */
82 
83 
84 static const struct resource a3000_scsi_resource __initconst = {
85  .start = 0xdd0000,
86  .end = 0xdd00ff,
87  .flags = IORESOURCE_MEM,
88 };
89 
90 
91 static const struct resource a4000t_scsi_resource __initconst = {
92  .start = 0xdd0000,
93  .end = 0xdd0fff,
94  .flags = IORESOURCE_MEM,
95 };
96 
97 
98 static const struct resource a1200_ide_resource __initconst = {
99  .start = 0xda0000,
100  .end = 0xda1fff,
101  .flags = IORESOURCE_MEM,
102 };
103 
104 static const struct gayle_ide_platform_data a1200_ide_pdata __initconst = {
105  .base = 0xda0000,
106  .irqport = 0xda9000,
107  .explicit_ack = 1,
108 };
109 
110 
111 static const struct resource a4000_ide_resource __initconst = {
112  .start = 0xdd2000,
113  .end = 0xdd3fff,
114  .flags = IORESOURCE_MEM,
115 };
116 
117 static const struct gayle_ide_platform_data a4000_ide_pdata __initconst = {
118  .base = 0xdd2020,
119  .irqport = 0xdd3020,
120  .explicit_ack = 0,
121 };
122 
123 
124 static const struct resource amiga_rtc_resource __initconst = {
125  .start = 0x00dc0000,
126  .end = 0x00dcffff,
127  .flags = IORESOURCE_MEM,
128 };
129 
130 
131 static int __init amiga_init_devices(void)
132 {
133  struct platform_device *pdev;
134  int error;
135 
136  if (!MACH_IS_AMIGA)
137  return -ENODEV;
138 
139  /* video hardware */
140  if (AMIGAHW_PRESENT(AMI_VIDEO)) {
141  pdev = platform_device_register_simple("amiga-video", -1, NULL,
142  0);
143  if (IS_ERR(pdev))
144  return PTR_ERR(pdev);
145  }
146 
147 
148  /* sound hardware */
149  if (AMIGAHW_PRESENT(AMI_AUDIO)) {
150  pdev = platform_device_register_simple("amiga-audio", -1, NULL,
151  0);
152  if (IS_ERR(pdev))
153  return PTR_ERR(pdev);
154  }
155 
156 
157  /* storage interfaces */
158  if (AMIGAHW_PRESENT(AMI_FLOPPY)) {
159  pdev = platform_device_register_simple("amiga-floppy", -1,
160  NULL, 0);
161  if (IS_ERR(pdev))
162  return PTR_ERR(pdev);
163  }
164 
165  if (AMIGAHW_PRESENT(A3000_SCSI)) {
166  pdev = platform_device_register_simple("amiga-a3000-scsi", -1,
167  &a3000_scsi_resource, 1);
168  if (IS_ERR(pdev))
169  return PTR_ERR(pdev);
170  }
171 
172  if (AMIGAHW_PRESENT(A4000_SCSI)) {
173  pdev = platform_device_register_simple("amiga-a4000t-scsi", -1,
174  &a4000t_scsi_resource,
175  1);
176  if (IS_ERR(pdev))
177  return PTR_ERR(pdev);
178  }
179 
180  if (AMIGAHW_PRESENT(A1200_IDE) ||
182  pdev = platform_device_register_simple("amiga-gayle-ide", -1,
183  &a1200_ide_resource, 1);
184  if (IS_ERR(pdev))
185  return PTR_ERR(pdev);
186  error = platform_device_add_data(pdev, &a1200_ide_pdata,
187  sizeof(a1200_ide_pdata));
188  if (error)
189  return error;
190  }
191 
192  if (AMIGAHW_PRESENT(A4000_IDE)) {
193  pdev = platform_device_register_simple("amiga-gayle-ide", -1,
194  &a4000_ide_resource, 1);
195  if (IS_ERR(pdev))
196  return PTR_ERR(pdev);
197  error = platform_device_add_data(pdev, &a4000_ide_pdata,
198  sizeof(a4000_ide_pdata));
199  if (error)
200  return error;
201  }
202 
203 
204  /* other I/O hardware */
205  if (AMIGAHW_PRESENT(AMI_KEYBOARD)) {
206  pdev = platform_device_register_simple("amiga-keyboard", -1,
207  NULL, 0);
208  if (IS_ERR(pdev))
209  return PTR_ERR(pdev);
210  }
211 
212  if (AMIGAHW_PRESENT(AMI_MOUSE)) {
213  pdev = platform_device_register_simple("amiga-mouse", -1, NULL,
214  0);
215  if (IS_ERR(pdev))
216  return PTR_ERR(pdev);
217  }
218 
219  if (AMIGAHW_PRESENT(AMI_SERIAL)) {
220  pdev = platform_device_register_simple("amiga-serial", -1,
221  NULL, 0);
222  if (IS_ERR(pdev))
223  return PTR_ERR(pdev);
224  }
225 
226  if (AMIGAHW_PRESENT(AMI_PARALLEL)) {
227  pdev = platform_device_register_simple("amiga-parallel", -1,
228  NULL, 0);
229  if (IS_ERR(pdev))
230  return PTR_ERR(pdev);
231  }
232 
233 
234  /* real time clocks */
235  if (AMIGAHW_PRESENT(A2000_CLK)) {
236  pdev = platform_device_register_simple("rtc-msm6242", -1,
237  &amiga_rtc_resource, 1);
238  if (IS_ERR(pdev))
239  return PTR_ERR(pdev);
240  }
241 
242  if (AMIGAHW_PRESENT(A3000_CLK)) {
243  pdev = platform_device_register_simple("rtc-rp5c01", -1,
244  &amiga_rtc_resource, 1);
245  if (IS_ERR(pdev))
246  return PTR_ERR(pdev);
247  }
248 
249  return 0;
250 }
251 
252 arch_initcall(amiga_init_devices);