diff options
Diffstat (limited to 'arch/mips/alchemy/devboards/db1200/setup.c')
| -rw-r--r-- | arch/mips/alchemy/devboards/db1200/setup.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/arch/mips/alchemy/devboards/db1200/setup.c b/arch/mips/alchemy/devboards/db1200/setup.c new file mode 100644 index 00000000000..4a8980027ec --- /dev/null +++ b/arch/mips/alchemy/devboards/db1200/setup.c | |||
| @@ -0,0 +1,81 @@ | |||
| 1 | /* | ||
| 2 | * Alchemy/AMD/RMI DB1200 board setup. | ||
| 3 | * | ||
| 4 | * Licensed under the terms outlined in the file COPYING in the root of | ||
| 5 | * this source archive. | ||
| 6 | */ | ||
| 7 | |||
| 8 | #include <linux/init.h> | ||
| 9 | #include <linux/interrupt.h> | ||
| 10 | #include <linux/io.h> | ||
| 11 | #include <linux/kernel.h> | ||
| 12 | #include <asm/mach-au1x00/au1000.h> | ||
| 13 | #include <asm/mach-db1x00/bcsr.h> | ||
| 14 | #include <asm/mach-db1x00/db1200.h> | ||
| 15 | |||
| 16 | const char *get_system_type(void) | ||
| 17 | { | ||
| 18 | return "Alchemy Db1200"; | ||
| 19 | } | ||
| 20 | |||
| 21 | void __init board_setup(void) | ||
| 22 | { | ||
| 23 | unsigned long freq0, clksrc, div, pfc; | ||
| 24 | unsigned short whoami; | ||
| 25 | |||
| 26 | bcsr_init(DB1200_BCSR_PHYS_ADDR, | ||
| 27 | DB1200_BCSR_PHYS_ADDR + DB1200_BCSR_HEXLED_OFS); | ||
| 28 | |||
| 29 | whoami = bcsr_read(BCSR_WHOAMI); | ||
| 30 | printk(KERN_INFO "Alchemy/AMD/RMI DB1200 Board, CPLD Rev %d" | ||
| 31 | " Board-ID %d Daughtercard ID %d\n", | ||
| 32 | (whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf); | ||
| 33 | |||
| 34 | /* SMBus/SPI on PSC0, Audio on PSC1 */ | ||
| 35 | pfc = __raw_readl((void __iomem *)SYS_PINFUNC); | ||
| 36 | pfc &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B); | ||
| 37 | pfc &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B | SYS_PINFUNC_FS3); | ||
| 38 | pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */ | ||
| 39 | __raw_writel(pfc, (void __iomem *)SYS_PINFUNC); | ||
| 40 | wmb(); | ||
| 41 | |||
| 42 | /* Clock configurations: PSC0: ~50MHz via Clkgen0, derived from | ||
| 43 | * CPU clock; all other clock generators off/unused. | ||
| 44 | */ | ||
| 45 | div = (get_au1x00_speed() + 25000000) / 50000000; | ||
| 46 | if (div & 1) | ||
| 47 | div++; | ||
| 48 | div = ((div >> 1) - 1) & 0xff; | ||
| 49 | |||
| 50 | freq0 = div << SYS_FC_FRDIV0_BIT; | ||
| 51 | __raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0); | ||
| 52 | wmb(); | ||
| 53 | freq0 |= SYS_FC_FE0; /* enable F0 */ | ||
| 54 | __raw_writel(freq0, (void __iomem *)SYS_FREQCTRL0); | ||
| 55 | wmb(); | ||
| 56 | |||
| 57 | /* psc0_intclk comes 1:1 from F0 */ | ||
| 58 | clksrc = SYS_CS_MUX_FQ0 << SYS_CS_ME0_BIT; | ||
| 59 | __raw_writel(clksrc, (void __iomem *)SYS_CLKSRC); | ||
| 60 | wmb(); | ||
| 61 | } | ||
| 62 | |||
| 63 | static int __init db1200_arch_init(void) | ||
| 64 | { | ||
| 65 | /* GPIO7 is low-level triggered CPLD cascade */ | ||
| 66 | irq_set_irq_type(AU1200_GPIO7_INT, IRQF_TRIGGER_LOW); | ||
| 67 | bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT); | ||
| 68 | |||
| 69 | /* insert/eject pairs: one of both is always screaming. To avoid | ||
| 70 | * issues they must not be automatically enabled when initially | ||
| 71 | * requested. | ||
| 72 | */ | ||
| 73 | irq_set_status_flags(DB1200_SD0_INSERT_INT, IRQ_NOAUTOEN); | ||
| 74 | irq_set_status_flags(DB1200_SD0_EJECT_INT, IRQ_NOAUTOEN); | ||
| 75 | irq_set_status_flags(DB1200_PC0_INSERT_INT, IRQ_NOAUTOEN); | ||
| 76 | irq_set_status_flags(DB1200_PC0_EJECT_INT, IRQ_NOAUTOEN); | ||
| 77 | irq_set_status_flags(DB1200_PC1_INSERT_INT, IRQ_NOAUTOEN); | ||
| 78 | irq_set_status_flags(DB1200_PC1_EJECT_INT, IRQ_NOAUTOEN); | ||
| 79 | return 0; | ||
| 80 | } | ||
| 81 | arch_initcall(db1200_arch_init); | ||
