fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git] / arch / sparc / kernel / pcic.c
index bc52cd4..207f1b6 100644 (file)
@@ -10,7 +10,6 @@
  * CP-1200 by Eric Brower.
  */
 
-#include <linux/config.h>
 #include <linux/kernel.h>
 #include <linux/types.h>
 #include <linux/init.h>
 
 #include <asm/irq.h>
 #include <asm/oplib.h>
+#include <asm/prom.h>
 #include <asm/pcic.h>
 #include <asm/timer.h>
 #include <asm/uaccess.h>
+#include <asm/irq_regs.h>
 
 
-struct pci_fixup pcibios_fixups[] = {
-       { 0 }
-};
-
 unsigned int pcic_pin_to_irq(unsigned int pin, char *name);
 
 /*
@@ -147,7 +144,7 @@ static struct pcic_ca2irq pcic_i_jk[] = {
  * as several PROMs may be installed on the same physical board.
  */
 #define SN2L_INIT(name, map)   \
-  { name, map, sizeof(map)/sizeof(struct pcic_ca2irq) }
+  { name, map, ARRAY_SIZE(map) }
 
 static struct pcic_sn2list pcic_known_sysnames[] = {
        SN2L_INIT("SUNW,JavaEngine1", pcic_i_je1a),     /* JE1, PROM 2.32 */
@@ -165,7 +162,7 @@ static struct pcic_sn2list pcic_known_sysnames[] = {
 static int pcic0_up;
 static struct linux_pcic pcic0;
 
-unsigned int pcic_regs;
+void __iomem *pcic_regs;
 volatile int pcic_speculative;
 volatile int pcic_trapped;
 
@@ -317,8 +314,7 @@ int __init pcic_probe(void)
        pcic0_up = 1;
 
        pcic->pcic_res_regs.name = "pcic_registers";
-       pcic->pcic_regs = (unsigned long)
-           ioremap(regs[0].phys_addr, regs[0].reg_size);
+       pcic->pcic_regs = ioremap(regs[0].phys_addr, regs[0].reg_size);
        if (!pcic->pcic_regs) {
                prom_printf("PCIC: Error, cannot map PCIC registers.\n");
                prom_halt();
@@ -332,7 +328,7 @@ int __init pcic_probe(void)
        }
 
        pcic->pcic_res_cfg_addr.name = "pcic_cfg_addr";
-       if ((pcic->pcic_config_space_addr = (unsigned long)
+       if ((pcic->pcic_config_space_addr =
            ioremap(regs[2].phys_addr, regs[2].reg_size * 2)) == 0) {
                prom_printf("PCIC: Error, cannot map" 
                            "PCI Configuration Space Address.\n");
@@ -344,7 +340,7 @@ int __init pcic_probe(void)
         * must be the same. Thus, we need adjust size of data.
         */
        pcic->pcic_res_cfg_data.name = "pcic_cfg_data";
-       if ((pcic->pcic_config_space_data = (unsigned long)
+       if ((pcic->pcic_config_space_data =
            ioremap(regs[3].phys_addr, regs[3].reg_size * 2)) == 0) {
                prom_printf("PCIC: Error, cannot map" 
                            "PCI Configuration Space Data.\n");
@@ -502,8 +498,8 @@ static void pcic_map_pci_device(struct linux_pcic *pcic,
                                 * CheerIO makes a similar conversion.
                                 * See ebus.c for details.
                                 *
-                                * Note that check_region()/request_region()
-                                * work for these devices.
+                                * Note that request_region()
+                                * works for these devices.
                                 *
                                 * XXX Neat trick, but it's a *bad* idea
                                 * to shit into regions like that.
@@ -607,7 +603,7 @@ pcic_fill_irq(struct linux_pcic *pcic, struct pci_dev *dev, int node)
  */
 void __init pcibios_fixup_bus(struct pci_bus *bus)
 {
-       struct list_head *walk;
+       struct pci_dev *dev;
        int i, has_io, has_mem;
        unsigned int cmd;
        struct linux_pcic *pcic;
@@ -629,9 +625,7 @@ void __init pcibios_fixup_bus(struct pci_bus *bus)
                return;
        }
 
-       walk = &bus->devices;
-       for (walk = walk->next; walk != &bus->devices; walk = walk->next) {
-               struct pci_dev *dev = pci_dev_b(walk);
+       list_for_each_entry(dev, &bus->devices, bus_list) {
 
                /*
                 * Comment from i386 branch:
@@ -672,7 +666,7 @@ void __init pcibios_fixup_bus(struct pci_bus *bus)
                /* cookies */
                pcp = pci_devcookie_alloc();
                pcp->pbm = &pcic->pbm;
-               pcp->prom_node = node;
+               pcp->prom_node = of_find_node_by_phandle(node);
                dev->sysdata = pcp;
 
                /* fixing I/O to look like memory */
@@ -715,11 +709,14 @@ static void pcic_clear_clock_irq(void)
        pcic_timer_dummy = readl(pcic0.pcic_regs+PCI_SYS_LIMIT);
 }
 
-static irqreturn_t pcic_timer_handler (int irq, void *h, struct pt_regs *regs)
+static irqreturn_t pcic_timer_handler (int irq, void *h)
 {
        write_seqlock(&xtime_lock);     /* Dummy, to show that we remember */
        pcic_clear_clock_irq();
-       do_timer(regs);
+       do_timer(1);
+#ifndef CONFIG_SMP
+       update_process_times(user_mode(get_irq_regs()));
+#endif
        write_sequnlock(&xtime_lock);
        return IRQ_HANDLED;
 }
@@ -749,7 +746,7 @@ void __init pci_time_init(void)
        writel (PCI_COUNTER_IRQ_SET(timer_irq, 0),
                pcic->pcic_regs+PCI_COUNTER_IRQ);
        irq = request_irq(timer_irq, pcic_timer_handler,
-                         (SA_INTERRUPT | SA_STATIC_ALLOC), "timer", NULL);
+                         (IRQF_DISABLED | SA_STATIC_ALLOC), "timer", NULL);
        if (irq) {
                prom_printf("time_init: unable to attach IRQ%d\n", timer_irq);
                prom_halt();
@@ -769,8 +766,6 @@ static __inline__ unsigned long do_gettimeoffset(void)
        return count;
 }
 
-extern unsigned long wall_jiffies;
-
 static void pci_do_gettimeofday(struct timeval *tv)
 {
        unsigned long flags;
@@ -779,26 +774,17 @@ static void pci_do_gettimeofday(struct timeval *tv)
        unsigned long max_ntp_tick = tick_usec - tickadj;
 
        do {
-               unsigned long lost;
-
                seq = read_seqbegin_irqsave(&xtime_lock, flags);
                usec = do_gettimeoffset();
-               lost = jiffies - wall_jiffies;
 
                /*
                 * If time_adjust is negative then NTP is slowing the clock
                 * so make sure not to go into next possible interval.
                 * Better to lose some accuracy than have time go backwards..
                 */
-               if (unlikely(time_adjust < 0)) {
+               if (unlikely(time_adjust < 0))
                        usec = min(usec, max_ntp_tick);
 
-                       if (lost)
-                               usec += lost * max_ntp_tick;
-               }
-               else if (unlikely(lost))
-                       usec += lost * tick_usec;
-
                sec = xtime.tv_sec;
                usec += (xtime.tv_nsec / 1000);
        } while (read_seqretry_irqrestore(&xtime_lock, seq, flags));
@@ -823,8 +809,7 @@ static int pci_do_settimeofday(struct timespec *tv)
         * wall time.  Discover what correction gettimeofday() would have
         * made, and then undo it!
         */
-       tv->tv_nsec -= 1000 * (do_gettimeoffset() + 
-                               (jiffies - wall_jiffies) * (USEC_PER_SEC / HZ));
+       tv->tv_nsec -= 1000 * do_gettimeoffset();
        while (tv->tv_nsec < 0) {
                tv->tv_nsec += NSEC_PER_SEC;
                tv->tv_sec--;
@@ -844,10 +829,7 @@ static int pci_do_settimeofday(struct timespec *tv)
 
        xtime.tv_sec = tv->tv_sec;
        xtime.tv_nsec = tv->tv_nsec;
-       time_adjust = 0;                /* stop active adjtime() */
-       time_status |= STA_UNSYNC;
-       time_maxerror = NTP_PHASE_LIMIT;
-       time_esterror = NTP_PHASE_LIMIT;
+       ntp_clear();
        return 0;
 }
 
@@ -866,7 +848,7 @@ char * __init pcibios_setup(char *str)
 }
 
 void pcibios_align_resource(void *data, struct resource *res,
-                           unsigned long size, unsigned long align)
+                           resource_size_t size, resource_size_t align)
 {
 }
 
@@ -903,13 +885,6 @@ static inline unsigned long get_irqmask(int irq_nr)
        return 1 << irq_nr;
 }
 
-static inline char *pcic_irq_itoa(unsigned int irq)
-{
-       static char buff[16];
-       sprintf(buff, "%d", irq);
-       return buff;
-}
-
 static void pcic_disable_irq(unsigned int irq_nr)
 {
        unsigned long mask, flags;
@@ -962,7 +937,6 @@ void __init sun4m_pci_init_IRQ(void)
        BTFIXUPSET_CALL(clear_clock_irq, pcic_clear_clock_irq, BTFIXUPCALL_NORM);
        BTFIXUPSET_CALL(clear_profile_irq, pcic_clear_profile_irq, BTFIXUPCALL_NORM);
        BTFIXUPSET_CALL(load_profile_irq, pcic_load_profile_irq, BTFIXUPCALL_NORM);
-       BTFIXUPSET_CALL(__irq_itoa, pcic_irq_itoa, BTFIXUPCALL_NORM);
 }
 
 int pcibios_assign_resource(struct pci_dev *pdev, int resource)
@@ -979,60 +953,66 @@ int pcibios_assign_resource(struct pci_dev *pdev, int resource)
  * We do not use horroble macroses here because we want to
  * advance pointer by sizeof(size).
  */
-void outsb(unsigned long addr, const void *src, unsigned long count) {
+void outsb(unsigned long addr, const void *src, unsigned long count)
+{
        while (count) {
                count -= 1;
-               writeb(*(const char *)src, addr);
+               outb(*(const char *)src, addr);
                src += 1;
-               addr += 1;
+               /* addr += 1; */
        }
 }
 
-void outsw(unsigned long addr, const void *src, unsigned long count) {
+void outsw(unsigned long addr, const void *src, unsigned long count)
+{
        while (count) {
                count -= 2;
-               writew(*(const short *)src, addr);
+               outw(*(const short *)src, addr);
                src += 2;
-               addr += 2;
+               /* addr += 2; */
        }
 }
 
-void outsl(unsigned long addr, const void *src, unsigned long count) {
+void outsl(unsigned long addr, const void *src, unsigned long count)
+{
        while (count) {
                count -= 4;
-               writel(*(const long *)src, addr);
+               outl(*(const long *)src, addr);
                src += 4;
-               addr += 4;
+               /* addr += 4; */
        }
 }
 
-void insb(unsigned long addr, void *dst, unsigned long count) {
+void insb(unsigned long addr, void *dst, unsigned long count)
+{
        while (count) {
                count -= 1;
-               *(unsigned char *)dst = readb(addr);
+               *(unsigned char *)dst = inb(addr);
                dst += 1;
-               addr += 1;
+               /* addr += 1; */
        }
 }
 
-void insw(unsigned long addr, void *dst, unsigned long count) {
+void insw(unsigned long addr, void *dst, unsigned long count)
+{
        while (count) {
                count -= 2;
-               *(unsigned short *)dst = readw(addr);
+               *(unsigned short *)dst = inw(addr);
                dst += 2;
-               addr += 2;
+               /* addr += 2; */
        }
 }
 
-void insl(unsigned long addr, void *dst, unsigned long count) {
+void insl(unsigned long addr, void *dst, unsigned long count)
+{
        while (count) {
                count -= 4;
                /*
                 * XXX I am sure we are in for an unaligned trap here.
                 */
-               *(unsigned long *)dst = readl(addr);
+               *(unsigned long *)dst = inl(addr);
                dst += 4;
-               addr += 4;
+               /* addr += 4; */
        }
 }