static void __init db78x00_init(void) { /* * Basic MV78xx0 setup. Needs to be called early. */ mv78xx0_init(); /* * Partition on-chip peripherals between the two CPU cores. */ if (mv78xx0_core_index() == 0) { mv78xx0_ehci0_init(); mv78xx0_ehci1_init(); mv78xx0_ehci2_init(); mv78xx0_ge00_init(&db78x00_ge00_data); mv78xx0_ge01_init(&db78x00_ge01_data); mv78xx0_ge10_init(&db78x00_ge10_data); mv78xx0_ge11_init(&db78x00_ge11_data); mv78xx0_sata_init(&db78x00_sata_data); mv78xx0_uart0_init(); mv78xx0_uart2_init(); } else { mv78xx0_uart1_init(); mv78xx0_uart3_init(); } }
static int __init rd78x00_pci_init(void) { if (machine_is_rd78x00_masa() && mv78xx0_core_index() == 0) mv78xx0_pcie_init(1, 1); return 0; }
static int __init rd78x00_pci_init(void) { /* * Assign all PCIe devices to CPU core #0. */ if (machine_is_rd78x00_masa() && mv78xx0_core_index() == 0) mv78xx0_pcie_init(1, 1); return 0; }
void __init mv78xx0_init_irq(void) { orion_irq_init(0, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF)); orion_irq_init(32, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF)); orion_irq_init(64, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_ERR_OFF)); orion_gpio_init(0, 32, GPIO_VIRT_BASE, mv78xx0_core_index() ? 0x18 : 0, IRQ_MV78XX0_GPIO_START); irq_set_chained_handler(IRQ_MV78XX0_GPIO_0_7, gpio_irq_handler); irq_set_chained_handler(IRQ_MV78XX0_GPIO_8_15, gpio_irq_handler); irq_set_chained_handler(IRQ_MV78XX0_GPIO_16_23, gpio_irq_handler); irq_set_chained_handler(IRQ_MV78XX0_GPIO_24_31, gpio_irq_handler); }
static int __init db78x00_pci_init(void) { if (machine_is_db78x00_bp()) { /* * Assign the x16 PCIe slot on the board to CPU core * #0, and let CPU core #1 have the four x1 slots. */ if (mv78xx0_core_index() == 0) mv78xx0_pcie_init(0, 1); else mv78xx0_pcie_init(1, 0); } return 0; }
void __init mv78xx0_init_irq(void) { orion_irq_init(0, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_LOW_OFF)); orion_irq_init(32, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_HIGH_OFF)); orion_irq_init(64, (void __iomem *)(IRQ_VIRT_BASE + IRQ_MASK_ERR_OFF)); /* * Initialize gpiolib for GPIOs 0-31. (The GPIO interrupt mask * registers for core #1 are at an offset of 0x18 from those of * core #0.) */ orion_gpio_init(NULL, 0, 32, (void __iomem *)GPIO_VIRT_BASE, mv78xx0_core_index() ? 0x18 : 0, IRQ_MV78XX0_GPIO_START, gpio0_irqs); }
void __init mv78xx0_setup_cpu_mbus(void) { /* * Disable, clear and configure windows. */ orion_config_wins(&addr_map_cfg, NULL); /* * Setup MBUS dram target info. */ if (mv78xx0_core_index() == 0) orion_setup_cpu_mbus_target(&addr_map_cfg, DDR_WINDOW_CPU0_BASE); else orion_setup_cpu_mbus_target(&addr_map_cfg, DDR_WINDOW_CPU1_BASE); }
void __init mv78xx0_setup_cpu_mbus(void) { void __iomem *addr; int i; int cs; for (i = 0; i < 14; i++) { addr = win_cfg_base(i); writel(0, addr + WIN_BASE_OFF); writel(0, addr + WIN_CTRL_OFF); if (cpu_win_can_remap(i)) { writel(0, addr + WIN_REMAP_LO_OFF); writel(0, addr + WIN_REMAP_HI_OFF); } } mv78xx0_mbus_dram_info.mbus_dram_target_id = TARGET_DDR; if (mv78xx0_core_index() == 0) addr = (void __iomem *)DDR_WINDOW_CPU0_BASE; else addr = (void __iomem *)DDR_WINDOW_CPU1_BASE; for (i = 0, cs = 0; i < 4; i++) { u32 base = readl(addr + DDR_BASE_CS_OFF(i)); u32 size = readl(addr + DDR_SIZE_CS_OFF(i)); if (size & 1) { struct mbus_dram_window *w; w = &mv78xx0_mbus_dram_info.cs[cs++]; w->cs_index = i; w->mbus_attr = 0xf & ~(1 << i); w->base = base & 0xffff0000; w->size = (size | 0x0000ffff) + 1; } } mv78xx0_mbus_dram_info.num_cs = cs; }
static void __init rd78x00_masa_init(void) { mv78xx0_init(); if (mv78xx0_core_index() == 0) { mv78xx0_ehci0_init(); mv78xx0_ehci1_init(); mv78xx0_ge00_init(&rd78x00_masa_ge00_data); mv78xx0_ge10_init(&rd78x00_masa_ge10_data); mv78xx0_sata_init(&rd78x00_masa_sata_data); mv78xx0_uart0_init(); mv78xx0_uart2_init(); } else { mv78xx0_ehci2_init(); mv78xx0_ge01_init(&rd78x00_masa_ge01_data); mv78xx0_ge11_init(&rd78x00_masa_ge11_data); mv78xx0_uart1_init(); mv78xx0_uart3_init(); } }