setup.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:4k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Setup pointers to hardware-dependent routines.
  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.  * Copyright (C) 1996, 1997, 1998 by Ralf Baechle
  9.  */
  10. #include <linux/config.h>
  11. #include <linux/hdreg.h>
  12. #include <linux/init.h>
  13. #include <linux/mm.h>
  14. #include <linux/interrupt.h>
  15. #include <linux/ide.h>
  16. #include <linux/bootmem.h>
  17. #include <asm/mc146818rtc.h>
  18. #include <asm/reboot.h>
  19. #include <asm/time.h>
  20. #include <asm/hp-lj/asic.h>
  21. #include "utils.h"
  22. #ifdef CONFIG_REMOTE_DEBUG
  23. int remote_debug = 0;
  24. #endif
  25. const char *get_system_type(void)
  26. {
  27. return "HP LaserJet"; /* But which exactly?  */
  28. }
  29. static void (*timer_interrupt_service)(int irq, void *dev_id, struct pt_regs * regs) = NULL;
  30. static void andros_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  31. {
  32.    if (!(*((volatile unsigned int*)0xbfea0010) & 0x20))  // mask = pend & en
  33.       return;
  34.    /* clear timer interrupt */
  35.    {
  36.       unsigned int tmr = *((volatile unsigned int*)0xbfe90040);   // ctl bits
  37.       *((volatile unsigned int*)0xbfe90040) = tmr;     // write to ack
  38.       *((volatile unsigned int*)0xbfea000c) = 0x20;    // sys int ack
  39.    }
  40.    /* service interrupt */
  41.    timer_interrupt_service(irq, dev_id, regs);
  42. }
  43. static void harmony_timer_interrupt(int irq, void *dev_id, struct pt_regs * regs)
  44. {
  45.    if (!(*((volatile unsigned int*)0xbff63000) & 0x01))
  46.       return;  // big sys     int reg, 01-timer  did it
  47.    if (!(*((volatile unsigned int*)0xbff610a4) & 0x01))
  48.       return;  // local small int reg, 01-timer0 did it
  49.    *((volatile unsigned int*)0xbff610a4) = 1;   // ack local timer0 bit
  50.    *((volatile unsigned int*)0xbff63000) = 1;   // ack global timer bit
  51.    /* service interrupt */
  52.    timer_interrupt_service(irq, dev_id, regs);
  53. }
  54. #define ASIC_IRQ_NUMBER  2
  55. static void __init hp_time_init(struct irqaction *irq)
  56. {
  57.     timer_interrupt_service = irq->handler;
  58.     if (GetAsicId() == AndrosAsic) {
  59.        //*((volatile unsigned int*)0xbfe90000) = 0x2f;  // set by bootloader to 0x20              // prescaler
  60.        *((volatile unsigned int*)0xbfe90040) = 0x21;    // 20-res of 1kHz,1-int ack                // control
  61.        *((volatile unsigned int*)0xbfe90048) = 0x09;    // 09-reload val                          // reload
  62.        *((volatile unsigned int*)0xbfe90044) = 0x09;    // 09-count val                           // count
  63.        *((volatile unsigned int*)0xbfe90040) = 0x2f;    // 8-int enable,4-reload en,2-count down en,1-int-ack
  64.        irq->handler = andros_timer_interrupt;
  65.        irq->flags |= SA_INTERRUPT | SA_SHIRQ;
  66.        printk("setting up timer in hp_time_initn");
  67.        setup_irq(ASIC_IRQ_NUMBER, irq); 
  68.     
  69.        // enable timer interrupt
  70.        *((volatile unsigned int*)0xbfea0000) = 0x20;
  71.     } else if (GetAsicId() == HarmonyAsic) {
  72.         *((volatile unsigned int*)0xbff61000) = 99;  // prescaler, 100Mz sys clk
  73.         *((volatile unsigned int*)0xbff61028) = 0x09;  // reload reg
  74.         *((volatile unsigned int*)0xbff61024) = 0x09;  // count reg
  75.         *((volatile unsigned int*)0xbff61020) = 0x0b;  // 80-1khz res on timer, 2 reload en, 1 - count down en
  76.         irq->handler = harmony_timer_interrupt;
  77.         irq->flags |= SA_INTERRUPT | SA_SHIRQ;
  78.         setup_irq(ASIC_IRQ_NUMBER, irq);
  79.         *((volatile unsigned int*)0xbff610a0) |= 1;    // turn on timer0
  80.     } else if (GetAsicId() == UnknownAsic) 
  81.         printk("Unknown asic in hp_time_init()n");
  82.     else
  83.         printk("Unsupported asic in hp_time_init()n");
  84. }
  85. static void hplj_restart(void)
  86. {
  87.    if (GetAsicId() == AndrosAsic) 
  88.        *((volatile unsigned int *) 0xbfe900c0) = 0;
  89.     if (GetAsicId() == HarmonyAsic)
  90.         *((volatile unsigned int *) 0xbff62030) = 0;
  91.    printk("Restart Failed ... halting insteadn");
  92.    while(1);
  93. }
  94. static void hplj_halt(void)
  95. {
  96.    while(1);
  97. }
  98. void __init hp_setup(void)
  99. {
  100. #ifdef CONFIG_PCI
  101.    extern void pci_setup(void);
  102.    pci_setup();
  103. #endif
  104. #ifdef CONFIG_IDE
  105.    {
  106.       extern struct ide_ops std_ide_ops;
  107.       ide_ops = &std_ide_ops;
  108.    }
  109. #endif
  110.    _machine_restart =(void (*)(char *)) hplj_restart;
  111.    _machine_halt = hplj_halt;
  112.    _machine_power_off = hplj_halt;
  113.    board_timer_setup = hp_time_init;
  114. #ifdef CONFIG_REMOTE_DEBUG
  115.    {
  116.       extern char CommandLine[];
  117.       remote_debug = (strstr(CommandLine, "kgdb") != NULL);
  118.    }
  119. #endif
  120.    printk("HP SETUPn");
  121. }
  122. int __init page_is_ram(unsigned long pagenr)
  123. {
  124. return 1;
  125. }