Path: blob/master/arch/mips/alchemy/devboards/db1200/setup.c
10820 views
/*1* Alchemy/AMD/RMI DB1200 board setup.2*3* Licensed under the terms outlined in the file COPYING in the root of4* this source archive.5*/67#include <linux/init.h>8#include <linux/interrupt.h>9#include <linux/io.h>10#include <linux/kernel.h>11#include <asm/mach-au1x00/au1000.h>12#include <asm/mach-db1x00/bcsr.h>13#include <asm/mach-db1x00/db1200.h>1415const char *get_system_type(void)16{17return "Alchemy Db1200";18}1920void __init board_setup(void)21{22unsigned long freq0, clksrc, div, pfc;23unsigned short whoami;2425/* Set Config[OD] (disable overlapping bus transaction):26* This gets rid of a _lot_ of spurious interrupts (especially27* wrt. IDE); but incurs ~10% performance hit in some28* cpu-bound applications.29*/30set_c0_config(1 << 19);3132bcsr_init(DB1200_BCSR_PHYS_ADDR,33DB1200_BCSR_PHYS_ADDR + DB1200_BCSR_HEXLED_OFS);3435whoami = bcsr_read(BCSR_WHOAMI);36printk(KERN_INFO "Alchemy/AMD/RMI DB1200 Board, CPLD Rev %d"37" Board-ID %d Daughtercard ID %d\n",38(whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf);3940/* SMBus/SPI on PSC0, Audio on PSC1 */41pfc = __raw_readl((void __iomem *)SYS_PINFUNC);42pfc &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B);43pfc &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B | SYS_PINFUNC_FS3);44pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */45__raw_writel(pfc, (void __iomem *)SYS_PINFUNC);46wmb();4748/* Clock configurations: PSC0: ~50MHz via Clkgen0, derived from49* CPU clock; all other clock generators off/unused.50*/51div = (get_au1x00_speed() + 25000000) / 50000000;52if (div & 1)53div++;54div = ((div >> 1) - 1) & 0xff;5556freq0 = div << SYS_FC_FRDIV0_BIT;57__raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0);58wmb();59freq0 |= SYS_FC_FE0; /* enable F0 */60__raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0);61wmb();6263/* psc0_intclk comes 1:1 from F0 */64clksrc = SYS_CS_MUX_FQ0 << SYS_CS_ME0_BIT;65__raw_writel(clksrc, (void __iomem *)SYS_CLKSRC);66wmb();67}6869static int __init db1200_arch_init(void)70{71/* GPIO7 is low-level triggered CPLD cascade */72irq_set_irq_type(AU1200_GPIO7_INT, IRQF_TRIGGER_LOW);73bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT);7475/* insert/eject pairs: one of both is always screaming. To avoid76* issues they must not be automatically enabled when initially77* requested.78*/79irq_set_status_flags(DB1200_SD0_INSERT_INT, IRQ_NOAUTOEN);80irq_set_status_flags(DB1200_SD0_EJECT_INT, IRQ_NOAUTOEN);81irq_set_status_flags(DB1200_PC0_INSERT_INT, IRQ_NOAUTOEN);82irq_set_status_flags(DB1200_PC0_EJECT_INT, IRQ_NOAUTOEN);83irq_set_status_flags(DB1200_PC1_INSERT_INT, IRQ_NOAUTOEN);84irq_set_status_flags(DB1200_PC1_EJECT_INT, IRQ_NOAUTOEN);85return 0;86}87arch_initcall(db1200_arch_init);888990