Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
config.c
Go to the documentation of this file.
1 #include <linux/types.h>
2 #include <linux/kernel.h>
3 #include <linux/mm.h>
4 #include <linux/tty.h>
5 #include <linux/console.h>
6 #include <linux/rtc.h>
7 #include <linux/vt_kern.h>
8 #include <linux/interrupt.h>
9 
10 #include <asm/setup.h>
11 #include <asm/bootinfo.h>
12 #include <asm/pgtable.h>
13 #include <asm/apollohw.h>
14 #include <asm/irq.h>
15 #include <asm/rtc.h>
16 #include <asm/machdep.h>
17 
26 
27 extern void dn_sched_init(irq_handler_t handler);
28 extern void dn_init_IRQ(void);
29 extern unsigned long dn_gettimeoffset(void);
30 extern int dn_dummy_hwclk(int, struct rtc_time *);
31 extern int dn_dummy_set_clock_mmss(unsigned long);
32 extern void dn_dummy_reset(void);
33 #ifdef CONFIG_HEARTBEAT
34 static void dn_heartbeat(int on);
35 #endif
36 static irqreturn_t dn_timer_int(int irq,void *);
37 static void dn_get_model(char *model);
38 static const char *apollo_models[] = {
39  [APOLLO_DN3000-APOLLO_DN3000] = "DN3000 (Otter)",
40  [APOLLO_DN3010-APOLLO_DN3000] = "DN3010 (Otter)",
41  [APOLLO_DN3500-APOLLO_DN3000] = "DN3500 (Cougar II)",
42  [APOLLO_DN4000-APOLLO_DN3000] = "DN4000 (Mink)",
43  [APOLLO_DN4500-APOLLO_DN3000] = "DN4500 (Roadrunner)"
44 };
45 
47 
48  int unknown = 0;
49  const unsigned long *data = record->data;
50 
51  switch(record->tag) {
52  case BI_APOLLO_MODEL:
54  break;
55 
56  default:
57  unknown=1;
58  }
59 
60  return unknown;
61 }
62 
63 void dn_setup_model(void) {
64 
65 
66  printk("Apollo hardware found: ");
67  printk("[%s]\n", apollo_models[apollo_model - APOLLO_DN3000]);
68 
69  switch(apollo_model) {
70  case APOLLO_UNKNOWN:
71  panic("Unknown apollo model");
72  break;
73  case APOLLO_DN3000:
74  case APOLLO_DN3010:
81  break;
82  case APOLLO_DN4000:
90  break;
91  case APOLLO_DN4500:
92  panic("Apollo model not yet supported");
93  break;
94  case APOLLO_DN3500:
102  break;
103  default:
104  panic("Undefined apollo model");
105  break;
106  }
107 
108 
109 }
110 
112 
113  while(!(sio01.srb_csrb & 1))
114  barrier();
115  return sio01.rhrb_thrb;
116 }
117 
118 void dn_serial_console_write (struct console *co, const char *str,unsigned int count)
119 {
120  while(count--) {
121  if (*str == '\n') {
122  sio01.rhrb_thrb = (unsigned char)'\r';
123  while (!(sio01.srb_csrb & 0x4))
124  ;
125  }
126  sio01.rhrb_thrb = (unsigned char)*str++;
127  while (!(sio01.srb_csrb & 0x4))
128  ;
129  }
130 }
131 
132 void dn_serial_print (const char *str)
133 {
134  while (*str) {
135  if (*str == '\n') {
136  sio01.rhrb_thrb = (unsigned char)'\r';
137  while (!(sio01.srb_csrb & 0x4))
138  ;
139  }
140  sio01.rhrb_thrb = (unsigned char)*str++;
141  while (!(sio01.srb_csrb & 0x4))
142  ;
143  }
144 }
145 
147 {
148  int i;
149 
150  dn_setup_model();
151 
155  mach_max_dma_address = 0xffffffff;
156  mach_hwclk = dn_dummy_hwclk; /* */
158  mach_reset = dn_dummy_reset; /* */
159 #ifdef CONFIG_HEARTBEAT
160  mach_heartbeat = dn_heartbeat;
161 #endif
162  mach_get_model = dn_get_model;
163 
164  cpuctrl=0xaa00;
165 
166  /* clear DMA translation table */
167  for(i=0;i<0x400;i++)
168  addr_xlat_map[i]=0;
169 
170 }
171 
172 irqreturn_t dn_timer_int(int irq, void *dev_id)
173 {
175 
176  volatile unsigned char x;
177 
178  timer_handler(irq, dev_id);
179 
180  x = *(volatile unsigned char *)(apollo_timer + 3);
181  x = *(volatile unsigned char *)(apollo_timer + 5);
182 
183  return IRQ_HANDLED;
184 }
185 
186 void dn_sched_init(irq_handler_t timer_routine)
187 {
188  /* program timer 1 */
189  *(volatile unsigned char *)(apollo_timer + 3) = 0x01;
190  *(volatile unsigned char *)(apollo_timer + 1) = 0x40;
191  *(volatile unsigned char *)(apollo_timer + 5) = 0x09;
192  *(volatile unsigned char *)(apollo_timer + 7) = 0xc4;
193 
194  /* enable IRQ of PIC B */
195  *(volatile unsigned char *)(pica+1)&=(~8);
196 
197 #if 0
198  printk("*(0x10803) %02x\n",*(volatile unsigned char *)(apollo_timer + 0x3));
199  printk("*(0x10803) %02x\n",*(volatile unsigned char *)(apollo_timer + 0x3));
200 #endif
201 
202  if (request_irq(IRQ_APOLLO, dn_timer_int, 0, "time", timer_routine))
203  pr_err("Couldn't register timer interrupt\n");
204 }
205 
206 unsigned long dn_gettimeoffset(void) {
207 
208  return 0xdeadbeef;
209 
210 }
211 
212 int dn_dummy_hwclk(int op, struct rtc_time *t) {
213 
214 
215  if(!op) { /* read */
216  t->tm_sec=rtc->second;
217  t->tm_min=rtc->minute;
218  t->tm_hour=rtc->hours;
219  t->tm_mday=rtc->day_of_month;
220  t->tm_wday=rtc->day_of_week;
221  t->tm_mon=rtc->month;
222  t->tm_year=rtc->year;
223  } else {
224  rtc->second=t->tm_sec;
225  rtc->minute=t->tm_min;
226  rtc->hours=t->tm_hour;
227  rtc->day_of_month=t->tm_mday;
228  if(t->tm_wday!=-1)
229  rtc->day_of_week=t->tm_wday;
230  rtc->month=t->tm_mon;
231  rtc->year=t->tm_year;
232  }
233 
234  return 0;
235 
236 }
237 
238 int dn_dummy_set_clock_mmss(unsigned long nowtime) {
239 
240  printk("set_clock_mmss\n");
241 
242  return 0;
243 
244 }
245 
246 void dn_dummy_reset(void) {
247 
248  dn_serial_print("The end !\n");
249 
250  for(;;);
251 
252 }
253 
254 void dn_dummy_waitbut(void) {
255 
256  dn_serial_print("waitbut\n");
257 
258 }
259 
260 static void dn_get_model(char *model)
261 {
262  strcpy(model, "Apollo ");
264  strcat(model, apollo_models[apollo_model - APOLLO_DN3000]);
265 }
266 
267 #ifdef CONFIG_HEARTBEAT
268 static int dn_cpuctrl=0xff00;
269 
270 static void dn_heartbeat(int on) {
271 
272  if(on) {
273  dn_cpuctrl&=~0x100;
274  cpuctrl=dn_cpuctrl;
275  }
276  else {
277  dn_cpuctrl&=~0x100;
278  dn_cpuctrl|=0x100;
279  cpuctrl=dn_cpuctrl;
280  }
281 }
282 #endif
283