1c066a32aSThomas Bogendoerfer /* 2c066a32aSThomas Bogendoerfer * PCI Tower specific code 3c066a32aSThomas Bogendoerfer * 4c066a32aSThomas Bogendoerfer * This file is subject to the terms and conditions of the GNU General Public 5c066a32aSThomas Bogendoerfer * License. See the file "COPYING" in the main directory of this archive 6c066a32aSThomas Bogendoerfer * for more details. 7c066a32aSThomas Bogendoerfer * 8c066a32aSThomas Bogendoerfer * Copyright (C) 2006 Thomas Bogendoerfer (tsbogend@alpha.franken.de) 9c066a32aSThomas Bogendoerfer */ 10c066a32aSThomas Bogendoerfer 11c066a32aSThomas Bogendoerfer #include <linux/init.h> 12c066a32aSThomas Bogendoerfer #include <linux/interrupt.h> 13c066a32aSThomas Bogendoerfer #include <linux/pci.h> 14c066a32aSThomas Bogendoerfer #include <linux/serial_8250.h> 15c066a32aSThomas Bogendoerfer 16c066a32aSThomas Bogendoerfer #include <asm/mc146818-time.h> 17c066a32aSThomas Bogendoerfer #include <asm/sni.h> 18c066a32aSThomas Bogendoerfer #include <asm/time.h> 19c066a32aSThomas Bogendoerfer #include <asm/irq_cpu.h> 20c066a32aSThomas Bogendoerfer 21c066a32aSThomas Bogendoerfer 22c066a32aSThomas Bogendoerfer #define PORT(_base,_irq) \ 23c066a32aSThomas Bogendoerfer { \ 24c066a32aSThomas Bogendoerfer .iobase = _base, \ 25c066a32aSThomas Bogendoerfer .irq = _irq, \ 26c066a32aSThomas Bogendoerfer .uartclk = 1843200, \ 27c066a32aSThomas Bogendoerfer .iotype = UPIO_PORT, \ 28c066a32aSThomas Bogendoerfer .flags = UPF_BOOT_AUTOCONF, \ 29c066a32aSThomas Bogendoerfer } 30c066a32aSThomas Bogendoerfer 31c066a32aSThomas Bogendoerfer static struct plat_serial8250_port pcit_data[] = { 32c066a32aSThomas Bogendoerfer PORT(0x3f8, 0), 33c066a32aSThomas Bogendoerfer PORT(0x2f8, 3), 34c066a32aSThomas Bogendoerfer { }, 35c066a32aSThomas Bogendoerfer }; 36c066a32aSThomas Bogendoerfer 37c066a32aSThomas Bogendoerfer static struct platform_device pcit_serial8250_device = { 38c066a32aSThomas Bogendoerfer .name = "serial8250", 39c066a32aSThomas Bogendoerfer .id = PLAT8250_DEV_PLATFORM, 40c066a32aSThomas Bogendoerfer .dev = { 41c066a32aSThomas Bogendoerfer .platform_data = pcit_data, 42c066a32aSThomas Bogendoerfer }, 43c066a32aSThomas Bogendoerfer }; 44c066a32aSThomas Bogendoerfer 45c066a32aSThomas Bogendoerfer static struct plat_serial8250_port pcit_cplus_data[] = { 46c066a32aSThomas Bogendoerfer PORT(0x3f8, 4), 47c066a32aSThomas Bogendoerfer PORT(0x2f8, 3), 48c066a32aSThomas Bogendoerfer PORT(0x3e8, 4), 49c066a32aSThomas Bogendoerfer PORT(0x2e8, 3), 50c066a32aSThomas Bogendoerfer { }, 51c066a32aSThomas Bogendoerfer }; 52c066a32aSThomas Bogendoerfer 53c066a32aSThomas Bogendoerfer static struct platform_device pcit_cplus_serial8250_device = { 54c066a32aSThomas Bogendoerfer .name = "serial8250", 55c066a32aSThomas Bogendoerfer .id = PLAT8250_DEV_PLATFORM, 56c066a32aSThomas Bogendoerfer .dev = { 57c066a32aSThomas Bogendoerfer .platform_data = pcit_cplus_data, 58c066a32aSThomas Bogendoerfer }, 59c066a32aSThomas Bogendoerfer }; 60c066a32aSThomas Bogendoerfer 61c066a32aSThomas Bogendoerfer static struct resource sni_io_resource = { 62c066a32aSThomas Bogendoerfer .start = 0x00001000UL, 63c066a32aSThomas Bogendoerfer .end = 0x03bfffffUL, 64c066a32aSThomas Bogendoerfer .name = "PCIT IO MEM", 65c066a32aSThomas Bogendoerfer .flags = IORESOURCE_IO, 66c066a32aSThomas Bogendoerfer }; 67c066a32aSThomas Bogendoerfer 68c066a32aSThomas Bogendoerfer static struct resource pcit_io_resources[] = { 69c066a32aSThomas Bogendoerfer { 70c066a32aSThomas Bogendoerfer .start = 0x00, 71c066a32aSThomas Bogendoerfer .end = 0x1f, 72c066a32aSThomas Bogendoerfer .name = "dma1", 73c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 74c066a32aSThomas Bogendoerfer }, { 75c066a32aSThomas Bogendoerfer .start = 0x40, 76c066a32aSThomas Bogendoerfer .end = 0x5f, 77c066a32aSThomas Bogendoerfer .name = "timer", 78c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 79c066a32aSThomas Bogendoerfer }, { 80c066a32aSThomas Bogendoerfer .start = 0x60, 81c066a32aSThomas Bogendoerfer .end = 0x6f, 82c066a32aSThomas Bogendoerfer .name = "keyboard", 83c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 84c066a32aSThomas Bogendoerfer }, { 85c066a32aSThomas Bogendoerfer .start = 0x80, 86c066a32aSThomas Bogendoerfer .end = 0x8f, 87c066a32aSThomas Bogendoerfer .name = "dma page reg", 88c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 89c066a32aSThomas Bogendoerfer }, { 90c066a32aSThomas Bogendoerfer .start = 0xc0, 91c066a32aSThomas Bogendoerfer .end = 0xdf, 92c066a32aSThomas Bogendoerfer .name = "dma2", 93c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 94c066a32aSThomas Bogendoerfer }, { 95c066a32aSThomas Bogendoerfer .start = 0xcfc, 96c066a32aSThomas Bogendoerfer .end = 0xcff, 97c066a32aSThomas Bogendoerfer .name = "PCI config data", 98c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 99c066a32aSThomas Bogendoerfer } 100c066a32aSThomas Bogendoerfer }; 101c066a32aSThomas Bogendoerfer 102c066a32aSThomas Bogendoerfer static struct resource sni_mem_resource = { 103c066a32aSThomas Bogendoerfer .start = 0x10000000UL, 104c066a32aSThomas Bogendoerfer .end = 0xffffffffUL, 105c066a32aSThomas Bogendoerfer .name = "PCIT PCI MEM", 106c066a32aSThomas Bogendoerfer .flags = IORESOURCE_MEM 107c066a32aSThomas Bogendoerfer }; 108c066a32aSThomas Bogendoerfer 109c066a32aSThomas Bogendoerfer /* 110c066a32aSThomas Bogendoerfer * The RM200/RM300 has a few holes in it's PCI/EISA memory address space used 111c066a32aSThomas Bogendoerfer * for other purposes. Be paranoid and allocate all of the before the PCI 112c066a32aSThomas Bogendoerfer * code gets a chance to to map anything else there ... 113c066a32aSThomas Bogendoerfer * 114c066a32aSThomas Bogendoerfer * This leaves the following areas available: 115c066a32aSThomas Bogendoerfer * 116c066a32aSThomas Bogendoerfer * 0x10000000 - 0x1009ffff (640kB) PCI/EISA/ISA Bus Memory 117c066a32aSThomas Bogendoerfer * 0x10100000 - 0x13ffffff ( 15MB) PCI/EISA/ISA Bus Memory 118c066a32aSThomas Bogendoerfer * 0x18000000 - 0x1fbfffff (124MB) PCI/EISA Bus Memory 119c066a32aSThomas Bogendoerfer * 0x1ff08000 - 0x1ffeffff (816kB) PCI/EISA Bus Memory 120c066a32aSThomas Bogendoerfer * 0xa0000000 - 0xffffffff (1.5GB) PCI/EISA Bus Memory 121c066a32aSThomas Bogendoerfer */ 122c066a32aSThomas Bogendoerfer static struct resource pcit_mem_resources[] = { 123c066a32aSThomas Bogendoerfer { 124c066a32aSThomas Bogendoerfer .start = 0x14000000, 125c066a32aSThomas Bogendoerfer .end = 0x17bfffff, 126c066a32aSThomas Bogendoerfer .name = "PCI IO", 127c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 128c066a32aSThomas Bogendoerfer }, { 129c066a32aSThomas Bogendoerfer .start = 0x17c00000, 130c066a32aSThomas Bogendoerfer .end = 0x17ffffff, 131c066a32aSThomas Bogendoerfer .name = "Cache Replacement Area", 132c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 133c066a32aSThomas Bogendoerfer }, { 134c066a32aSThomas Bogendoerfer .start = 0x180a0000, 135c066a32aSThomas Bogendoerfer .end = 0x180bffff, 136c066a32aSThomas Bogendoerfer .name = "Video RAM area", 137c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 138c066a32aSThomas Bogendoerfer }, { 139c066a32aSThomas Bogendoerfer .start = 0x180c0000, 140c066a32aSThomas Bogendoerfer .end = 0x180fffff, 141c066a32aSThomas Bogendoerfer .name = "ISA Reserved", 142c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 143c066a32aSThomas Bogendoerfer }, { 144c066a32aSThomas Bogendoerfer .start = 0x19000000, 145c066a32aSThomas Bogendoerfer .end = 0x1fbfffff, 146c066a32aSThomas Bogendoerfer .name = "PCI MEM", 147c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 148c066a32aSThomas Bogendoerfer }, { 149c066a32aSThomas Bogendoerfer .start = 0x1fc00000, 150c066a32aSThomas Bogendoerfer .end = 0x1fc7ffff, 151c066a32aSThomas Bogendoerfer .name = "Boot PROM", 152c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 153c066a32aSThomas Bogendoerfer }, { 154c066a32aSThomas Bogendoerfer .start = 0x1fc80000, 155c066a32aSThomas Bogendoerfer .end = 0x1fcfffff, 156c066a32aSThomas Bogendoerfer .name = "Diag PROM", 157c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 158c066a32aSThomas Bogendoerfer }, { 159c066a32aSThomas Bogendoerfer .start = 0x1fd00000, 160c066a32aSThomas Bogendoerfer .end = 0x1fdfffff, 161c066a32aSThomas Bogendoerfer .name = "X-Bus", 162c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 163c066a32aSThomas Bogendoerfer }, { 164c066a32aSThomas Bogendoerfer .start = 0x1fe00000, 165c066a32aSThomas Bogendoerfer .end = 0x1fefffff, 166c066a32aSThomas Bogendoerfer .name = "BIOS map", 167c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 168c066a32aSThomas Bogendoerfer }, { 169c066a32aSThomas Bogendoerfer .start = 0x1ff00000, 170c066a32aSThomas Bogendoerfer .end = 0x1ff7ffff, 171c066a32aSThomas Bogendoerfer .name = "NVRAM / EEPROM", 172c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 173c066a32aSThomas Bogendoerfer }, { 174c066a32aSThomas Bogendoerfer .start = 0x1fff0000, 175c066a32aSThomas Bogendoerfer .end = 0x1fffefff, 176c066a32aSThomas Bogendoerfer .name = "MAUI ASIC", 177c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 178c066a32aSThomas Bogendoerfer }, { 179c066a32aSThomas Bogendoerfer .start = 0x1ffff000, 180c066a32aSThomas Bogendoerfer .end = 0x1fffffff, 181c066a32aSThomas Bogendoerfer .name = "MP Agent", 182c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 183c066a32aSThomas Bogendoerfer }, { 184c066a32aSThomas Bogendoerfer .start = 0x20000000, 185c066a32aSThomas Bogendoerfer .end = 0x9fffffff, 186c066a32aSThomas Bogendoerfer .name = "Main Memory", 187c066a32aSThomas Bogendoerfer .flags = IORESOURCE_BUSY 188c066a32aSThomas Bogendoerfer } 189c066a32aSThomas Bogendoerfer }; 190c066a32aSThomas Bogendoerfer 191c066a32aSThomas Bogendoerfer static void __init sni_pcit_resource_init(void) 192c066a32aSThomas Bogendoerfer { 193c066a32aSThomas Bogendoerfer int i; 194c066a32aSThomas Bogendoerfer 195c066a32aSThomas Bogendoerfer /* request I/O space for devices used on all i[345]86 PCs */ 196c066a32aSThomas Bogendoerfer for (i = 0; i < ARRAY_SIZE(pcit_io_resources); i++) 197c066a32aSThomas Bogendoerfer request_resource(&ioport_resource, pcit_io_resources + i); 198c066a32aSThomas Bogendoerfer 199c066a32aSThomas Bogendoerfer /* request mem space for pcimt-specific devices */ 200c066a32aSThomas Bogendoerfer for (i = 0; i < ARRAY_SIZE(pcit_mem_resources); i++) 201c066a32aSThomas Bogendoerfer request_resource(&sni_mem_resource, pcit_mem_resources + i); 202c066a32aSThomas Bogendoerfer 203c066a32aSThomas Bogendoerfer ioport_resource.end = sni_io_resource.end; 204c066a32aSThomas Bogendoerfer } 205c066a32aSThomas Bogendoerfer 206c066a32aSThomas Bogendoerfer 207c066a32aSThomas Bogendoerfer extern struct pci_ops sni_pcit_ops; 208c066a32aSThomas Bogendoerfer 209c066a32aSThomas Bogendoerfer static struct pci_controller sni_pcit_controller = { 210c066a32aSThomas Bogendoerfer .pci_ops = &sni_pcit_ops, 211c066a32aSThomas Bogendoerfer .mem_resource = &sni_mem_resource, 212c066a32aSThomas Bogendoerfer .mem_offset = 0x10000000UL, 213c066a32aSThomas Bogendoerfer .io_resource = &sni_io_resource, 214c066a32aSThomas Bogendoerfer .io_offset = 0x00000000UL 215c066a32aSThomas Bogendoerfer }; 216c066a32aSThomas Bogendoerfer 217c066a32aSThomas Bogendoerfer static void enable_pcit_irq(unsigned int irq) 218c066a32aSThomas Bogendoerfer { 219c066a32aSThomas Bogendoerfer u32 mask = 1 << (irq - SNI_PCIT_INT_START + 24); 220c066a32aSThomas Bogendoerfer 221c066a32aSThomas Bogendoerfer *(volatile u32 *)SNI_PCIT_INT_REG |= mask; 222c066a32aSThomas Bogendoerfer } 223c066a32aSThomas Bogendoerfer 224c066a32aSThomas Bogendoerfer void disable_pcit_irq(unsigned int irq) 225c066a32aSThomas Bogendoerfer { 226c066a32aSThomas Bogendoerfer u32 mask = 1 << (irq - SNI_PCIT_INT_START + 24); 227c066a32aSThomas Bogendoerfer 228c066a32aSThomas Bogendoerfer *(volatile u32 *)SNI_PCIT_INT_REG &= ~mask; 229c066a32aSThomas Bogendoerfer } 230c066a32aSThomas Bogendoerfer 231c066a32aSThomas Bogendoerfer void end_pcit_irq(unsigned int irq) 232c066a32aSThomas Bogendoerfer { 233c066a32aSThomas Bogendoerfer if (!(irq_desc[irq].status & (IRQ_DISABLED|IRQ_INPROGRESS))) 234c066a32aSThomas Bogendoerfer enable_pcit_irq(irq); 235c066a32aSThomas Bogendoerfer } 236c066a32aSThomas Bogendoerfer 237c066a32aSThomas Bogendoerfer static struct irq_chip pcit_irq_type = { 238c066a32aSThomas Bogendoerfer .typename = "PCIT", 239c066a32aSThomas Bogendoerfer .ack = disable_pcit_irq, 240c066a32aSThomas Bogendoerfer .mask = disable_pcit_irq, 241c066a32aSThomas Bogendoerfer .mask_ack = disable_pcit_irq, 242c066a32aSThomas Bogendoerfer .unmask = enable_pcit_irq, 243c066a32aSThomas Bogendoerfer .end = end_pcit_irq, 244c066a32aSThomas Bogendoerfer }; 245c066a32aSThomas Bogendoerfer 246c066a32aSThomas Bogendoerfer static void pcit_hwint1(void) 247c066a32aSThomas Bogendoerfer { 248c066a32aSThomas Bogendoerfer u32 pending = *(volatile u32 *)SNI_PCIT_INT_REG; 249c066a32aSThomas Bogendoerfer int irq; 250c066a32aSThomas Bogendoerfer 251c066a32aSThomas Bogendoerfer clear_c0_status(IE_IRQ1); 252c066a32aSThomas Bogendoerfer irq = ffs((pending >> 16) & 0x7f); 253c066a32aSThomas Bogendoerfer 254c066a32aSThomas Bogendoerfer if (likely(irq > 0)) 255c066a32aSThomas Bogendoerfer do_IRQ (irq + SNI_PCIT_INT_START - 1); 256c066a32aSThomas Bogendoerfer set_c0_status (IE_IRQ1); 257c066a32aSThomas Bogendoerfer } 258c066a32aSThomas Bogendoerfer 259c066a32aSThomas Bogendoerfer static void pcit_hwint0(void) 260c066a32aSThomas Bogendoerfer { 261c066a32aSThomas Bogendoerfer u32 pending = *(volatile u32 *)SNI_PCIT_INT_REG; 262c066a32aSThomas Bogendoerfer int irq; 263c066a32aSThomas Bogendoerfer 264c066a32aSThomas Bogendoerfer clear_c0_status(IE_IRQ0); 265c066a32aSThomas Bogendoerfer irq = ffs((pending >> 16) & 0x7f); 266c066a32aSThomas Bogendoerfer 267c066a32aSThomas Bogendoerfer if (likely(irq > 0)) 268c066a32aSThomas Bogendoerfer do_IRQ (irq + SNI_PCIT_INT_START - 1); 269c066a32aSThomas Bogendoerfer set_c0_status (IE_IRQ0); 270c066a32aSThomas Bogendoerfer } 271c066a32aSThomas Bogendoerfer 272c066a32aSThomas Bogendoerfer static void sni_pcit_hwint(void) 273c066a32aSThomas Bogendoerfer { 274c066a32aSThomas Bogendoerfer u32 pending = (read_c0_cause() & read_c0_status()); 275c066a32aSThomas Bogendoerfer 276c066a32aSThomas Bogendoerfer if (pending & C_IRQ1) 277c066a32aSThomas Bogendoerfer pcit_hwint1(); 278c066a32aSThomas Bogendoerfer else if (pending & C_IRQ2) 279f13cc01dSThomas Bogendoerfer do_IRQ (MIPS_CPU_IRQ_BASE + 4); 280c066a32aSThomas Bogendoerfer else if (pending & C_IRQ3) 281f13cc01dSThomas Bogendoerfer do_IRQ (MIPS_CPU_IRQ_BASE + 5); 282c066a32aSThomas Bogendoerfer else if (pending & C_IRQ5) 283f13cc01dSThomas Bogendoerfer do_IRQ (MIPS_CPU_IRQ_BASE + 7); 284c066a32aSThomas Bogendoerfer } 285c066a32aSThomas Bogendoerfer 286c066a32aSThomas Bogendoerfer static void sni_pcit_hwint_cplus(void) 287c066a32aSThomas Bogendoerfer { 288c066a32aSThomas Bogendoerfer u32 pending = (read_c0_cause() & read_c0_status()); 289c066a32aSThomas Bogendoerfer 290c066a32aSThomas Bogendoerfer if (pending & C_IRQ0) 291c066a32aSThomas Bogendoerfer pcit_hwint0(); 292c066a32aSThomas Bogendoerfer else if (pending & C_IRQ2) 293f13cc01dSThomas Bogendoerfer do_IRQ (MIPS_CPU_IRQ_BASE + 4); 294c066a32aSThomas Bogendoerfer else if (pending & C_IRQ3) 295f13cc01dSThomas Bogendoerfer do_IRQ (MIPS_CPU_IRQ_BASE + 5); 296c066a32aSThomas Bogendoerfer else if (pending & C_IRQ5) 297f13cc01dSThomas Bogendoerfer do_IRQ (MIPS_CPU_IRQ_BASE + 7); 298c066a32aSThomas Bogendoerfer } 299c066a32aSThomas Bogendoerfer 300c066a32aSThomas Bogendoerfer void __init sni_pcit_irq_init(void) 301c066a32aSThomas Bogendoerfer { 302c066a32aSThomas Bogendoerfer int i; 303c066a32aSThomas Bogendoerfer 304c066a32aSThomas Bogendoerfer mips_cpu_irq_init(); 305c066a32aSThomas Bogendoerfer for (i = SNI_PCIT_INT_START; i <= SNI_PCIT_INT_END; i++) 306c066a32aSThomas Bogendoerfer set_irq_chip(i, &pcit_irq_type); 307c066a32aSThomas Bogendoerfer *(volatile u32 *)SNI_PCIT_INT_REG = 0; 308c066a32aSThomas Bogendoerfer sni_hwint = sni_pcit_hwint; 309c066a32aSThomas Bogendoerfer change_c0_status(ST0_IM, IE_IRQ1); 310c066a32aSThomas Bogendoerfer setup_irq (SNI_PCIT_INT_START + 6, &sni_isa_irq); 311c066a32aSThomas Bogendoerfer } 312c066a32aSThomas Bogendoerfer 313c066a32aSThomas Bogendoerfer void __init sni_pcit_cplus_irq_init(void) 314c066a32aSThomas Bogendoerfer { 315c066a32aSThomas Bogendoerfer int i; 316c066a32aSThomas Bogendoerfer 317c066a32aSThomas Bogendoerfer mips_cpu_irq_init(); 318c066a32aSThomas Bogendoerfer for (i = SNI_PCIT_INT_START; i <= SNI_PCIT_INT_END; i++) 319c066a32aSThomas Bogendoerfer set_irq_chip(i, &pcit_irq_type); 320c066a32aSThomas Bogendoerfer *(volatile u32 *)SNI_PCIT_INT_REG = 0; 321c066a32aSThomas Bogendoerfer sni_hwint = sni_pcit_hwint_cplus; 322c066a32aSThomas Bogendoerfer change_c0_status(ST0_IM, IE_IRQ0); 323c066a32aSThomas Bogendoerfer setup_irq (SNI_PCIT_INT_START + 6, &sni_isa_irq); 324c066a32aSThomas Bogendoerfer } 325c066a32aSThomas Bogendoerfer 326c066a32aSThomas Bogendoerfer void sni_pcit_init(void) 327c066a32aSThomas Bogendoerfer { 328c066a32aSThomas Bogendoerfer sni_pcit_resource_init(); 329c066a32aSThomas Bogendoerfer rtc_mips_get_time = mc146818_get_cmos_time; 330c066a32aSThomas Bogendoerfer rtc_mips_set_time = mc146818_set_rtc_mmss; 331c066a32aSThomas Bogendoerfer board_time_init = sni_cpu_time_init; 332c066a32aSThomas Bogendoerfer #ifdef CONFIG_PCI 333c066a32aSThomas Bogendoerfer register_pci_controller(&sni_pcit_controller); 334c066a32aSThomas Bogendoerfer #endif 335c066a32aSThomas Bogendoerfer } 336c066a32aSThomas Bogendoerfer 337c066a32aSThomas Bogendoerfer static int __init snirm_pcit_setup_devinit(void) 338c066a32aSThomas Bogendoerfer { 339c066a32aSThomas Bogendoerfer switch (sni_brd_type) { 340c066a32aSThomas Bogendoerfer case SNI_BRD_PCI_TOWER: 341c066a32aSThomas Bogendoerfer platform_device_register(&pcit_serial8250_device); 342c066a32aSThomas Bogendoerfer break; 343c066a32aSThomas Bogendoerfer 344c066a32aSThomas Bogendoerfer case SNI_BRD_PCI_TOWER_CPLUS: 345c066a32aSThomas Bogendoerfer platform_device_register(&pcit_cplus_serial8250_device); 346c066a32aSThomas Bogendoerfer break; 347c066a32aSThomas Bogendoerfer } 348c066a32aSThomas Bogendoerfer return 0; 349c066a32aSThomas Bogendoerfer } 350c066a32aSThomas Bogendoerfer 351c066a32aSThomas Bogendoerfer device_initcall(snirm_pcit_setup_devinit); 352