diff options
| author | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
|---|---|---|
| committer | Jonathan Herman <hermanjl@cs.unc.edu> | 2013-01-22 10:38:37 -0500 |
| commit | fcc9d2e5a6c89d22b8b773a64fb4ad21ac318446 (patch) | |
| tree | a57612d1888735a2ec7972891b68c1ac5ec8faea /arch/m68k/platform/5407 | |
| parent | 8dea78da5cee153b8af9c07a2745f6c55057fe12 (diff) | |
Diffstat (limited to 'arch/m68k/platform/5407')
| -rw-r--r-- | arch/m68k/platform/5407/Makefile | 18 | ||||
| -rw-r--r-- | arch/m68k/platform/5407/config.c | 122 | ||||
| -rw-r--r-- | arch/m68k/platform/5407/gpio.c | 49 |
3 files changed, 189 insertions, 0 deletions
diff --git a/arch/m68k/platform/5407/Makefile b/arch/m68k/platform/5407/Makefile new file mode 100644 index 00000000000..e83fe148edd --- /dev/null +++ b/arch/m68k/platform/5407/Makefile | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | # | ||
| 2 | # Makefile for the m68knommu linux kernel. | ||
| 3 | # | ||
| 4 | |||
| 5 | # | ||
| 6 | # If you want to play with the HW breakpoints then you will | ||
| 7 | # need to add define this, which will give you a stack backtrace | ||
| 8 | # on the console port whenever a DBG interrupt occurs. You have to | ||
| 9 | # set up you HW breakpoints to trigger a DBG interrupt: | ||
| 10 | # | ||
| 11 | # ccflags-y := -DTRAP_DBG_INTERRUPT | ||
| 12 | # asflags-y := -DTRAP_DBG_INTERRUPT | ||
| 13 | # | ||
| 14 | |||
| 15 | asflags-$(CONFIG_FULLDEBUG) := -DDEBUGGER_COMPATIBLE_CACHE=1 | ||
| 16 | |||
| 17 | obj-y := config.o gpio.o | ||
| 18 | |||
diff --git a/arch/m68k/platform/5407/config.c b/arch/m68k/platform/5407/config.c new file mode 100644 index 00000000000..70ea789a400 --- /dev/null +++ b/arch/m68k/platform/5407/config.c | |||
| @@ -0,0 +1,122 @@ | |||
| 1 | /***************************************************************************/ | ||
| 2 | |||
| 3 | /* | ||
| 4 | * linux/arch/m68knommu/platform/5407/config.c | ||
| 5 | * | ||
| 6 | * Copyright (C) 1999-2002, Greg Ungerer (gerg@snapgear.com) | ||
| 7 | * Copyright (C) 2000, Lineo (www.lineo.com) | ||
| 8 | */ | ||
| 9 | |||
| 10 | /***************************************************************************/ | ||
| 11 | |||
| 12 | #include <linux/kernel.h> | ||
| 13 | #include <linux/param.h> | ||
| 14 | #include <linux/init.h> | ||
| 15 | #include <linux/io.h> | ||
| 16 | #include <asm/machdep.h> | ||
| 17 | #include <asm/coldfire.h> | ||
| 18 | #include <asm/mcfsim.h> | ||
| 19 | #include <asm/mcfuart.h> | ||
| 20 | |||
| 21 | /***************************************************************************/ | ||
| 22 | |||
| 23 | static struct mcf_platform_uart m5407_uart_platform[] = { | ||
| 24 | { | ||
| 25 | .mapbase = MCF_MBAR + MCFUART_BASE1, | ||
| 26 | .irq = 73, | ||
| 27 | }, | ||
| 28 | { | ||
| 29 | .mapbase = MCF_MBAR + MCFUART_BASE2, | ||
| 30 | .irq = 74, | ||
| 31 | }, | ||
| 32 | { }, | ||
| 33 | }; | ||
| 34 | |||
| 35 | static struct platform_device m5407_uart = { | ||
| 36 | .name = "mcfuart", | ||
| 37 | .id = 0, | ||
| 38 | .dev.platform_data = m5407_uart_platform, | ||
| 39 | }; | ||
| 40 | |||
| 41 | static struct platform_device *m5407_devices[] __initdata = { | ||
| 42 | &m5407_uart, | ||
| 43 | }; | ||
| 44 | |||
| 45 | /***************************************************************************/ | ||
| 46 | |||
| 47 | static void __init m5407_uart_init_line(int line, int irq) | ||
| 48 | { | ||
| 49 | if (line == 0) { | ||
| 50 | writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI1, MCF_MBAR + MCFSIM_UART1ICR); | ||
| 51 | writeb(irq, MCF_MBAR + MCFUART_BASE1 + MCFUART_UIVR); | ||
| 52 | mcf_mapirq2imr(irq, MCFINTC_UART0); | ||
| 53 | } else if (line == 1) { | ||
| 54 | writeb(MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI2, MCF_MBAR + MCFSIM_UART2ICR); | ||
| 55 | writeb(irq, MCF_MBAR + MCFUART_BASE2 + MCFUART_UIVR); | ||
| 56 | mcf_mapirq2imr(irq, MCFINTC_UART1); | ||
| 57 | } | ||
| 58 | } | ||
| 59 | |||
| 60 | static void __init m5407_uarts_init(void) | ||
| 61 | { | ||
| 62 | const int nrlines = ARRAY_SIZE(m5407_uart_platform); | ||
| 63 | int line; | ||
| 64 | |||
| 65 | for (line = 0; (line < nrlines); line++) | ||
| 66 | m5407_uart_init_line(line, m5407_uart_platform[line].irq); | ||
| 67 | } | ||
| 68 | |||
| 69 | /***************************************************************************/ | ||
| 70 | |||
| 71 | static void __init m5407_timers_init(void) | ||
| 72 | { | ||
| 73 | /* Timer1 is always used as system timer */ | ||
| 74 | writeb(MCFSIM_ICR_AUTOVEC | MCFSIM_ICR_LEVEL6 | MCFSIM_ICR_PRI3, | ||
| 75 | MCF_MBAR + MCFSIM_TIMER1ICR); | ||
| 76 | mcf_mapirq2imr(MCF_IRQ_TIMER, MCFINTC_TIMER1); | ||
| 77 | |||
| 78 | #ifdef CONFIG_HIGHPROFILE | ||
| 79 | /* Timer2 is to be used as a high speed profile timer */ | ||
| 80 | writeb(MCFSIM_ICR_AUTOVEC | MCFSIM_ICR_LEVEL7 | MCFSIM_ICR_PRI3, | ||
| 81 | MCF_MBAR + MCFSIM_TIMER2ICR); | ||
| 82 | mcf_mapirq2imr(MCF_IRQ_PROFILER, MCFINTC_TIMER2); | ||
| 83 | #endif | ||
| 84 | } | ||
| 85 | |||
| 86 | /***************************************************************************/ | ||
| 87 | |||
| 88 | void m5407_cpu_reset(void) | ||
| 89 | { | ||
| 90 | local_irq_disable(); | ||
| 91 | /* set watchdog to soft reset, and enabled */ | ||
| 92 | __raw_writeb(0xc0, MCF_MBAR + MCFSIM_SYPCR); | ||
| 93 | for (;;) | ||
| 94 | /* wait for watchdog to timeout */; | ||
| 95 | } | ||
| 96 | |||
| 97 | /***************************************************************************/ | ||
| 98 | |||
| 99 | void __init config_BSP(char *commandp, int size) | ||
| 100 | { | ||
| 101 | mach_reset = m5407_cpu_reset; | ||
| 102 | m5407_timers_init(); | ||
| 103 | m5407_uarts_init(); | ||
| 104 | |||
| 105 | /* Only support the external interrupts on their primary level */ | ||
| 106 | mcf_mapirq2imr(25, MCFINTC_EINT1); | ||
| 107 | mcf_mapirq2imr(27, MCFINTC_EINT3); | ||
| 108 | mcf_mapirq2imr(29, MCFINTC_EINT5); | ||
| 109 | mcf_mapirq2imr(31, MCFINTC_EINT7); | ||
| 110 | } | ||
| 111 | |||
| 112 | /***************************************************************************/ | ||
| 113 | |||
| 114 | static int __init init_BSP(void) | ||
| 115 | { | ||
| 116 | platform_add_devices(m5407_devices, ARRAY_SIZE(m5407_devices)); | ||
| 117 | return 0; | ||
| 118 | } | ||
| 119 | |||
| 120 | arch_initcall(init_BSP); | ||
| 121 | |||
| 122 | /***************************************************************************/ | ||
diff --git a/arch/m68k/platform/5407/gpio.c b/arch/m68k/platform/5407/gpio.c new file mode 100644 index 00000000000..5850612b4a3 --- /dev/null +++ b/arch/m68k/platform/5407/gpio.c | |||
| @@ -0,0 +1,49 @@ | |||
| 1 | /* | ||
| 2 | * Coldfire generic GPIO support | ||
| 3 | * | ||
| 4 | * (C) Copyright 2009, Steven King <sfking@fdwdc.com> | ||
| 5 | * | ||
| 6 | * This program is free software; you can redistribute it and/or modify | ||
| 7 | * it under the terms of the GNU General Public License as published by | ||
| 8 | * the Free Software Foundation; version 2 of the License. | ||
| 9 | * | ||
| 10 | * This program is distributed in the hope that it will be useful, | ||
| 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
| 13 | * GNU General Public License for more details. | ||
| 14 | */ | ||
| 15 | |||
| 16 | #include <linux/kernel.h> | ||
| 17 | #include <linux/init.h> | ||
| 18 | |||
| 19 | #include <asm/coldfire.h> | ||
| 20 | #include <asm/mcfsim.h> | ||
| 21 | #include <asm/mcfgpio.h> | ||
| 22 | |||
| 23 | static struct mcf_gpio_chip mcf_gpio_chips[] = { | ||
| 24 | { | ||
| 25 | .gpio_chip = { | ||
| 26 | .label = "PP", | ||
| 27 | .request = mcf_gpio_request, | ||
| 28 | .free = mcf_gpio_free, | ||
| 29 | .direction_input = mcf_gpio_direction_input, | ||
| 30 | .direction_output = mcf_gpio_direction_output, | ||
| 31 | .get = mcf_gpio_get_value, | ||
| 32 | .set = mcf_gpio_set_value, | ||
| 33 | .ngpio = 16, | ||
| 34 | }, | ||
| 35 | .pddr = (void __iomem *) MCFSIM_PADDR, | ||
| 36 | .podr = (void __iomem *) MCFSIM_PADAT, | ||
| 37 | .ppdr = (void __iomem *) MCFSIM_PADAT, | ||
| 38 | }, | ||
| 39 | }; | ||
| 40 | |||
| 41 | static int __init mcf_gpio_init(void) | ||
| 42 | { | ||
| 43 | unsigned i = 0; | ||
| 44 | while (i < ARRAY_SIZE(mcf_gpio_chips)) | ||
| 45 | (void)gpiochip_add((struct gpio_chip *)&mcf_gpio_chips[i++]); | ||
| 46 | return 0; | ||
| 47 | } | ||
| 48 | |||
| 49 | core_initcall(mcf_gpio_init); | ||
