Loading...
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | /* * linux/arch/arm/mach-sa1100/adsbitsy.c * * Author: Woojung Huh * * Pieces specific to the ADS Bitsy * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #include <linux/kernel.h> #include <linux/init.h> #include <linux/ptrace.h> #include <linux/ioport.h> #include <linux/serial_core.h> #include <asm/hardware.h> #include <asm/mach-types.h> #include <asm/setup.h> #include <asm/irq.h> #include <asm/mach/irq.h> #include <asm/mach/arch.h> #include <asm/mach/map.h> #include <asm/mach/serial_sa1100.h> #include "generic.h" static struct resource sa1111_resources[] = { [0] = { .start = 0x18000000, .end = 0x18001fff, .flags = IORESOURCE_MEM, }, [1] = { .start = IRQ_GPIO0, .end = IRQ_GPIO0, .flags = IORESOURCE_IRQ, }, }; static u64 sa1111_dmamask = 0xffffffffUL; static struct platform_device sa1111_device = { .name = "sa1111", .id = 0, .dev = { .dma_mask = &sa1111_dmamask, }, .num_resources = ARRAY_SIZE(sa1111_resources), .resource = sa1111_resources, }; static struct platform_device *devices[] __initdata = { &sa1111_device, }; static int __init adsbitsy_init(void) { int ret; if (!machine_is_adsbitsy()) return -ENODEV; /* * Ensure that the memory bus request/grant signals are setup, * and the grant is held in its inactive state */ sa1110_mb_disable(); /* * Reset SA1111 */ GPCR |= GPIO_GPIO26; udelay(1000); GPSR |= GPIO_GPIO26; /* * Probe for SA1111. */ ret = platform_add_devices(devices, ARRAY_SIZE(devices)); if (ret < 0) return ret; /* * Enable PWM control for LCD */ sa1111_enable_device(SKPCR_PWMCLKEN); SKPWM0 = 0x7F; // VEE SKPEN0 = 1; SKPWM1 = 0x01; // Backlight SKPEN1 = 1; return 0; } arch_initcall(adsbitsy_init); static void __init adsbitsy_init_irq(void) { /* First the standard SA1100 IRQs */ sa1100_init_irq(); } static struct map_desc adsbitsy_io_desc[] __initdata = { /* virtual physical length type */ { 0xf4000000, 0x18000000, 0x00800000, MT_DEVICE } /* SA1111 */ }; static int adsbitsy_uart_open(struct uart_port *port, struct uart_info *info) { if (port->mapbase == _Ser1UTCR0) { Ser1SDCR0 |= SDCR0_UART; #error Fixme // Set RTS High (should be done in the set_mctrl fn) GPCR = GPIO_GPIO15; } else if (port->mapbase == _Ser2UTCR0) { Ser2UTCR4 = Ser2HSCR0 = 0; #error Fixme // Set RTS High (should be done in the set_mctrl fn) GPCR = GPIO_GPIO17; } else if (port->mapbase == _Ser2UTCR0) { #error Fixme // Set RTS High (should be done in the set_mctrl fn) GPCR = GPIO_GPIO19; } return 0; } static struct sa1100_port_fns adsbitsy_port_fns __initdata = { .open = adsbitsy_uart_open, }; static void __init adsbitsy_map_io(void) { sa1100_map_io(); iotable_init(adsbitsy_io_desc, ARRAY_SIZE(adsbitsy_io_desc)); sa1100_register_uart_fns(&adsbitsy_port_fns); sa1100_register_uart(0, 3); sa1100_register_uart(1, 1); sa1100_register_uart(2, 2); GPDR |= GPIO_GPIO15 | GPIO_GPIO17 | GPIO_GPIO19; GPDR &= ~(GPIO_GPIO14 | GPIO_GPIO16 | GPIO_GPIO18); } MACHINE_START(ADSBITSY, "ADS Bitsy") BOOT_MEM(0xc0000000, 0x80000000, 0xf8000000) MAPIO(adsbitsy_map_io) INITIRQ(adsbitsy_init_irq) MACHINE_END |