18c2ecf20Sopenharmony_ci/* 28c2ecf20Sopenharmony_ci * linux/arch/arm/mach-sa1100/collie.c 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * May be copied or modified under the terms of the GNU General Public 58c2ecf20Sopenharmony_ci * License. See linux/COPYING for more information. 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * This file contains all Collie-specific tweaks. 88c2ecf20Sopenharmony_ci * 98c2ecf20Sopenharmony_ci * This program is free software; you can redistribute it and/or modify 108c2ecf20Sopenharmony_ci * it under the terms of the GNU General Public License version 2 as 118c2ecf20Sopenharmony_ci * published by the Free Software Foundation. 128c2ecf20Sopenharmony_ci * 138c2ecf20Sopenharmony_ci * ChangeLog: 148c2ecf20Sopenharmony_ci * 2006 Pavel Machek <pavel@ucw.cz> 158c2ecf20Sopenharmony_ci * 03-06-2004 John Lenz <lenz@cs.wisc.edu> 168c2ecf20Sopenharmony_ci * 06-04-2002 Chris Larson <kergoth@digitalnemesis.net> 178c2ecf20Sopenharmony_ci * 04-16-2001 Lineo Japan,Inc. ... 188c2ecf20Sopenharmony_ci */ 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci#include <linux/init.h> 218c2ecf20Sopenharmony_ci#include <linux/kernel.h> 228c2ecf20Sopenharmony_ci#include <linux/tty.h> 238c2ecf20Sopenharmony_ci#include <linux/delay.h> 248c2ecf20Sopenharmony_ci#include <linux/platform_data/sa11x0-serial.h> 258c2ecf20Sopenharmony_ci#include <linux/platform_device.h> 268c2ecf20Sopenharmony_ci#include <linux/mfd/ucb1x00.h> 278c2ecf20Sopenharmony_ci#include <linux/mtd/mtd.h> 288c2ecf20Sopenharmony_ci#include <linux/mtd/partitions.h> 298c2ecf20Sopenharmony_ci#include <linux/timer.h> 308c2ecf20Sopenharmony_ci#include <linux/gpio_keys.h> 318c2ecf20Sopenharmony_ci#include <linux/input.h> 328c2ecf20Sopenharmony_ci#include <linux/gpio.h> 338c2ecf20Sopenharmony_ci#include <linux/gpio/machine.h> 348c2ecf20Sopenharmony_ci#include <linux/power/gpio-charger.h> 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_ci#include <video/sa1100fb.h> 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#include <mach/hardware.h> 398c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 408c2ecf20Sopenharmony_ci#include <asm/page.h> 418c2ecf20Sopenharmony_ci#include <asm/setup.h> 428c2ecf20Sopenharmony_ci#include <mach/collie.h> 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci#include <asm/mach/arch.h> 458c2ecf20Sopenharmony_ci#include <asm/mach/flash.h> 468c2ecf20Sopenharmony_ci#include <asm/mach/map.h> 478c2ecf20Sopenharmony_ci#include <linux/platform_data/irda-sa11x0.h> 488c2ecf20Sopenharmony_ci 498c2ecf20Sopenharmony_ci#include <asm/hardware/scoop.h> 508c2ecf20Sopenharmony_ci#include <asm/mach/sharpsl_param.h> 518c2ecf20Sopenharmony_ci#include <asm/hardware/locomo.h> 528c2ecf20Sopenharmony_ci#include <linux/platform_data/mfd-mcp-sa11x0.h> 538c2ecf20Sopenharmony_ci#include <mach/irqs.h> 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci#include "generic.h" 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_cistatic struct resource collie_scoop_resources[] = { 588c2ecf20Sopenharmony_ci [0] = DEFINE_RES_MEM(0x40800000, SZ_4K), 598c2ecf20Sopenharmony_ci}; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_cistatic struct scoop_config collie_scoop_setup = { 628c2ecf20Sopenharmony_ci .io_dir = COLLIE_SCOOP_IO_DIR, 638c2ecf20Sopenharmony_ci .io_out = COLLIE_SCOOP_IO_OUT, 648c2ecf20Sopenharmony_ci .gpio_base = COLLIE_SCOOP_GPIO_BASE, 658c2ecf20Sopenharmony_ci}; 668c2ecf20Sopenharmony_ci 678c2ecf20Sopenharmony_cistruct platform_device colliescoop_device = { 688c2ecf20Sopenharmony_ci .name = "sharp-scoop", 698c2ecf20Sopenharmony_ci .id = -1, 708c2ecf20Sopenharmony_ci .dev = { 718c2ecf20Sopenharmony_ci .platform_data = &collie_scoop_setup, 728c2ecf20Sopenharmony_ci }, 738c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(collie_scoop_resources), 748c2ecf20Sopenharmony_ci .resource = collie_scoop_resources, 758c2ecf20Sopenharmony_ci}; 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_cistatic struct scoop_pcmcia_dev collie_pcmcia_scoop[] = { 788c2ecf20Sopenharmony_ci { 798c2ecf20Sopenharmony_ci .dev = &colliescoop_device.dev, 808c2ecf20Sopenharmony_ci .irq = COLLIE_IRQ_GPIO_CF_IRQ, 818c2ecf20Sopenharmony_ci .cd_irq = COLLIE_IRQ_GPIO_CF_CD, 828c2ecf20Sopenharmony_ci .cd_irq_str = "PCMCIA0 CD", 838c2ecf20Sopenharmony_ci }, 848c2ecf20Sopenharmony_ci}; 858c2ecf20Sopenharmony_ci 868c2ecf20Sopenharmony_cistatic struct scoop_pcmcia_config collie_pcmcia_config = { 878c2ecf20Sopenharmony_ci .devs = &collie_pcmcia_scoop[0], 888c2ecf20Sopenharmony_ci .num_devs = 1, 898c2ecf20Sopenharmony_ci}; 908c2ecf20Sopenharmony_ci 918c2ecf20Sopenharmony_cistatic struct ucb1x00_plat_data collie_ucb1x00_data = { 928c2ecf20Sopenharmony_ci .gpio_base = COLLIE_TC35143_GPIO_BASE, 938c2ecf20Sopenharmony_ci}; 948c2ecf20Sopenharmony_ci 958c2ecf20Sopenharmony_cistatic struct mcp_plat_data collie_mcp_data = { 968c2ecf20Sopenharmony_ci .mccr0 = MCCR0_ADM | MCCR0_ExtClk, 978c2ecf20Sopenharmony_ci .sclk_rate = 9216000, 988c2ecf20Sopenharmony_ci .codec_pdata = &collie_ucb1x00_data, 998c2ecf20Sopenharmony_ci}; 1008c2ecf20Sopenharmony_ci 1018c2ecf20Sopenharmony_cistatic int collie_ir_startup(struct device *dev) 1028c2ecf20Sopenharmony_ci{ 1038c2ecf20Sopenharmony_ci int rc = gpio_request(COLLIE_GPIO_IR_ON, "IrDA"); 1048c2ecf20Sopenharmony_ci if (rc) 1058c2ecf20Sopenharmony_ci return rc; 1068c2ecf20Sopenharmony_ci rc = gpio_direction_output(COLLIE_GPIO_IR_ON, 1); 1078c2ecf20Sopenharmony_ci 1088c2ecf20Sopenharmony_ci if (!rc) 1098c2ecf20Sopenharmony_ci return 0; 1108c2ecf20Sopenharmony_ci 1118c2ecf20Sopenharmony_ci gpio_free(COLLIE_GPIO_IR_ON); 1128c2ecf20Sopenharmony_ci return rc; 1138c2ecf20Sopenharmony_ci} 1148c2ecf20Sopenharmony_ci 1158c2ecf20Sopenharmony_cistatic void collie_ir_shutdown(struct device *dev) 1168c2ecf20Sopenharmony_ci{ 1178c2ecf20Sopenharmony_ci gpio_free(COLLIE_GPIO_IR_ON); 1188c2ecf20Sopenharmony_ci} 1198c2ecf20Sopenharmony_ci 1208c2ecf20Sopenharmony_cistatic int collie_ir_set_power(struct device *dev, unsigned int state) 1218c2ecf20Sopenharmony_ci{ 1228c2ecf20Sopenharmony_ci gpio_set_value(COLLIE_GPIO_IR_ON, !state); 1238c2ecf20Sopenharmony_ci return 0; 1248c2ecf20Sopenharmony_ci} 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_cistatic struct irda_platform_data collie_ir_data = { 1278c2ecf20Sopenharmony_ci .startup = collie_ir_startup, 1288c2ecf20Sopenharmony_ci .shutdown = collie_ir_shutdown, 1298c2ecf20Sopenharmony_ci .set_power = collie_ir_set_power, 1308c2ecf20Sopenharmony_ci}; 1318c2ecf20Sopenharmony_ci 1328c2ecf20Sopenharmony_ci/* 1338c2ecf20Sopenharmony_ci * Collie AC IN 1348c2ecf20Sopenharmony_ci */ 1358c2ecf20Sopenharmony_cistatic struct gpiod_lookup_table collie_power_gpiod_table = { 1368c2ecf20Sopenharmony_ci .dev_id = "gpio-charger", 1378c2ecf20Sopenharmony_ci .table = { 1388c2ecf20Sopenharmony_ci GPIO_LOOKUP("gpio", COLLIE_GPIO_AC_IN, 1398c2ecf20Sopenharmony_ci NULL, GPIO_ACTIVE_HIGH), 1408c2ecf20Sopenharmony_ci { }, 1418c2ecf20Sopenharmony_ci }, 1428c2ecf20Sopenharmony_ci}; 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_cistatic char *collie_ac_supplied_to[] = { 1458c2ecf20Sopenharmony_ci "main-battery", 1468c2ecf20Sopenharmony_ci "backup-battery", 1478c2ecf20Sopenharmony_ci}; 1488c2ecf20Sopenharmony_ci 1498c2ecf20Sopenharmony_cistatic struct gpio_charger_platform_data collie_power_data = { 1508c2ecf20Sopenharmony_ci .name = "charger", 1518c2ecf20Sopenharmony_ci .type = POWER_SUPPLY_TYPE_MAINS, 1528c2ecf20Sopenharmony_ci .supplied_to = collie_ac_supplied_to, 1538c2ecf20Sopenharmony_ci .num_supplicants = ARRAY_SIZE(collie_ac_supplied_to), 1548c2ecf20Sopenharmony_ci}; 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_cistatic struct platform_device collie_power_device = { 1578c2ecf20Sopenharmony_ci .name = "gpio-charger", 1588c2ecf20Sopenharmony_ci .id = -1, 1598c2ecf20Sopenharmony_ci .dev.platform_data = &collie_power_data, 1608c2ecf20Sopenharmony_ci}; 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci#ifdef CONFIG_SHARP_LOCOMO 1638c2ecf20Sopenharmony_ci/* 1648c2ecf20Sopenharmony_ci * low-level UART features. 1658c2ecf20Sopenharmony_ci */ 1668c2ecf20Sopenharmony_cistruct platform_device collie_locomo_device; 1678c2ecf20Sopenharmony_ci 1688c2ecf20Sopenharmony_cistatic void collie_uart_set_mctrl(struct uart_port *port, u_int mctrl) 1698c2ecf20Sopenharmony_ci{ 1708c2ecf20Sopenharmony_ci if (mctrl & TIOCM_RTS) 1718c2ecf20Sopenharmony_ci locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_RTS, 0); 1728c2ecf20Sopenharmony_ci else 1738c2ecf20Sopenharmony_ci locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_RTS, 1); 1748c2ecf20Sopenharmony_ci 1758c2ecf20Sopenharmony_ci if (mctrl & TIOCM_DTR) 1768c2ecf20Sopenharmony_ci locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_DTR, 0); 1778c2ecf20Sopenharmony_ci else 1788c2ecf20Sopenharmony_ci locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_DTR, 1); 1798c2ecf20Sopenharmony_ci} 1808c2ecf20Sopenharmony_ci 1818c2ecf20Sopenharmony_cistatic u_int collie_uart_get_mctrl(struct uart_port *port) 1828c2ecf20Sopenharmony_ci{ 1838c2ecf20Sopenharmony_ci int ret = TIOCM_CD; 1848c2ecf20Sopenharmony_ci unsigned int r; 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci r = locomo_gpio_read_output(&collie_locomo_device.dev, LOCOMO_GPIO_CTS & LOCOMO_GPIO_DSR); 1878c2ecf20Sopenharmony_ci if (r == -ENODEV) 1888c2ecf20Sopenharmony_ci return ret; 1898c2ecf20Sopenharmony_ci if (r & LOCOMO_GPIO_CTS) 1908c2ecf20Sopenharmony_ci ret |= TIOCM_CTS; 1918c2ecf20Sopenharmony_ci if (r & LOCOMO_GPIO_DSR) 1928c2ecf20Sopenharmony_ci ret |= TIOCM_DSR; 1938c2ecf20Sopenharmony_ci 1948c2ecf20Sopenharmony_ci return ret; 1958c2ecf20Sopenharmony_ci} 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_cistatic struct sa1100_port_fns collie_port_fns __initdata = { 1988c2ecf20Sopenharmony_ci .set_mctrl = collie_uart_set_mctrl, 1998c2ecf20Sopenharmony_ci .get_mctrl = collie_uart_get_mctrl, 2008c2ecf20Sopenharmony_ci}; 2018c2ecf20Sopenharmony_ci 2028c2ecf20Sopenharmony_cistatic int collie_uart_probe(struct locomo_dev *dev) 2038c2ecf20Sopenharmony_ci{ 2048c2ecf20Sopenharmony_ci return 0; 2058c2ecf20Sopenharmony_ci} 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_cistatic int collie_uart_remove(struct locomo_dev *dev) 2088c2ecf20Sopenharmony_ci{ 2098c2ecf20Sopenharmony_ci return 0; 2108c2ecf20Sopenharmony_ci} 2118c2ecf20Sopenharmony_ci 2128c2ecf20Sopenharmony_cistatic struct locomo_driver collie_uart_driver = { 2138c2ecf20Sopenharmony_ci .drv = { 2148c2ecf20Sopenharmony_ci .name = "collie_uart", 2158c2ecf20Sopenharmony_ci }, 2168c2ecf20Sopenharmony_ci .devid = LOCOMO_DEVID_UART, 2178c2ecf20Sopenharmony_ci .probe = collie_uart_probe, 2188c2ecf20Sopenharmony_ci .remove = collie_uart_remove, 2198c2ecf20Sopenharmony_ci}; 2208c2ecf20Sopenharmony_ci 2218c2ecf20Sopenharmony_cistatic int __init collie_uart_init(void) 2228c2ecf20Sopenharmony_ci{ 2238c2ecf20Sopenharmony_ci return locomo_driver_register(&collie_uart_driver); 2248c2ecf20Sopenharmony_ci} 2258c2ecf20Sopenharmony_cidevice_initcall(collie_uart_init); 2268c2ecf20Sopenharmony_ci 2278c2ecf20Sopenharmony_ci#endif 2288c2ecf20Sopenharmony_ci 2298c2ecf20Sopenharmony_ci 2308c2ecf20Sopenharmony_cistatic struct resource locomo_resources[] = { 2318c2ecf20Sopenharmony_ci [0] = DEFINE_RES_MEM(0x40000000, SZ_8K), 2328c2ecf20Sopenharmony_ci [1] = DEFINE_RES_IRQ(IRQ_GPIO25), 2338c2ecf20Sopenharmony_ci}; 2348c2ecf20Sopenharmony_ci 2358c2ecf20Sopenharmony_cistatic struct locomo_platform_data locomo_info = { 2368c2ecf20Sopenharmony_ci .irq_base = IRQ_BOARD_START, 2378c2ecf20Sopenharmony_ci}; 2388c2ecf20Sopenharmony_ci 2398c2ecf20Sopenharmony_cistruct platform_device collie_locomo_device = { 2408c2ecf20Sopenharmony_ci .name = "locomo", 2418c2ecf20Sopenharmony_ci .id = 0, 2428c2ecf20Sopenharmony_ci .dev = { 2438c2ecf20Sopenharmony_ci .platform_data = &locomo_info, 2448c2ecf20Sopenharmony_ci }, 2458c2ecf20Sopenharmony_ci .num_resources = ARRAY_SIZE(locomo_resources), 2468c2ecf20Sopenharmony_ci .resource = locomo_resources, 2478c2ecf20Sopenharmony_ci}; 2488c2ecf20Sopenharmony_ci 2498c2ecf20Sopenharmony_cistatic struct gpio_keys_button collie_gpio_keys[] = { 2508c2ecf20Sopenharmony_ci { 2518c2ecf20Sopenharmony_ci .type = EV_PWR, 2528c2ecf20Sopenharmony_ci .code = KEY_RESERVED, 2538c2ecf20Sopenharmony_ci .gpio = COLLIE_GPIO_ON_KEY, 2548c2ecf20Sopenharmony_ci .desc = "On key", 2558c2ecf20Sopenharmony_ci .wakeup = 1, 2568c2ecf20Sopenharmony_ci .active_low = 1, 2578c2ecf20Sopenharmony_ci }, 2588c2ecf20Sopenharmony_ci { 2598c2ecf20Sopenharmony_ci .type = EV_PWR, 2608c2ecf20Sopenharmony_ci .code = KEY_WAKEUP, 2618c2ecf20Sopenharmony_ci .gpio = COLLIE_GPIO_WAKEUP, 2628c2ecf20Sopenharmony_ci .desc = "Sync", 2638c2ecf20Sopenharmony_ci .wakeup = 1, 2648c2ecf20Sopenharmony_ci .active_low = 1, 2658c2ecf20Sopenharmony_ci }, 2668c2ecf20Sopenharmony_ci}; 2678c2ecf20Sopenharmony_ci 2688c2ecf20Sopenharmony_cistatic struct gpio_keys_platform_data collie_gpio_keys_data = { 2698c2ecf20Sopenharmony_ci .buttons = collie_gpio_keys, 2708c2ecf20Sopenharmony_ci .nbuttons = ARRAY_SIZE(collie_gpio_keys), 2718c2ecf20Sopenharmony_ci}; 2728c2ecf20Sopenharmony_ci 2738c2ecf20Sopenharmony_cistatic struct platform_device collie_gpio_keys_device = { 2748c2ecf20Sopenharmony_ci .name = "gpio-keys", 2758c2ecf20Sopenharmony_ci .id = -1, 2768c2ecf20Sopenharmony_ci .dev = { 2778c2ecf20Sopenharmony_ci .platform_data = &collie_gpio_keys_data, 2788c2ecf20Sopenharmony_ci }, 2798c2ecf20Sopenharmony_ci}; 2808c2ecf20Sopenharmony_ci 2818c2ecf20Sopenharmony_cistatic struct platform_device *devices[] __initdata = { 2828c2ecf20Sopenharmony_ci &collie_locomo_device, 2838c2ecf20Sopenharmony_ci &colliescoop_device, 2848c2ecf20Sopenharmony_ci &collie_power_device, 2858c2ecf20Sopenharmony_ci &collie_gpio_keys_device, 2868c2ecf20Sopenharmony_ci}; 2878c2ecf20Sopenharmony_ci 2888c2ecf20Sopenharmony_cistatic struct mtd_partition collie_partitions[] = { 2898c2ecf20Sopenharmony_ci { 2908c2ecf20Sopenharmony_ci .name = "bootloader", 2918c2ecf20Sopenharmony_ci .offset = 0, 2928c2ecf20Sopenharmony_ci .size = 0x000C0000, 2938c2ecf20Sopenharmony_ci .mask_flags = MTD_WRITEABLE 2948c2ecf20Sopenharmony_ci }, { 2958c2ecf20Sopenharmony_ci .name = "kernel", 2968c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 2978c2ecf20Sopenharmony_ci .size = 0x00100000, 2988c2ecf20Sopenharmony_ci }, { 2998c2ecf20Sopenharmony_ci .name = "rootfs", 3008c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 3018c2ecf20Sopenharmony_ci .size = 0x00e20000, 3028c2ecf20Sopenharmony_ci }, { 3038c2ecf20Sopenharmony_ci .name = "bootblock", 3048c2ecf20Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 3058c2ecf20Sopenharmony_ci .size = 0x00020000, 3068c2ecf20Sopenharmony_ci .mask_flags = MTD_WRITEABLE 3078c2ecf20Sopenharmony_ci } 3088c2ecf20Sopenharmony_ci}; 3098c2ecf20Sopenharmony_ci 3108c2ecf20Sopenharmony_cistatic int collie_flash_init(void) 3118c2ecf20Sopenharmony_ci{ 3128c2ecf20Sopenharmony_ci int rc = gpio_request(COLLIE_GPIO_VPEN, "flash Vpp enable"); 3138c2ecf20Sopenharmony_ci if (rc) 3148c2ecf20Sopenharmony_ci return rc; 3158c2ecf20Sopenharmony_ci 3168c2ecf20Sopenharmony_ci rc = gpio_direction_output(COLLIE_GPIO_VPEN, 1); 3178c2ecf20Sopenharmony_ci if (rc) 3188c2ecf20Sopenharmony_ci gpio_free(COLLIE_GPIO_VPEN); 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci return rc; 3218c2ecf20Sopenharmony_ci} 3228c2ecf20Sopenharmony_ci 3238c2ecf20Sopenharmony_cistatic void collie_set_vpp(int vpp) 3248c2ecf20Sopenharmony_ci{ 3258c2ecf20Sopenharmony_ci gpio_set_value(COLLIE_GPIO_VPEN, vpp); 3268c2ecf20Sopenharmony_ci} 3278c2ecf20Sopenharmony_ci 3288c2ecf20Sopenharmony_cistatic void collie_flash_exit(void) 3298c2ecf20Sopenharmony_ci{ 3308c2ecf20Sopenharmony_ci gpio_free(COLLIE_GPIO_VPEN); 3318c2ecf20Sopenharmony_ci} 3328c2ecf20Sopenharmony_ci 3338c2ecf20Sopenharmony_cistatic struct flash_platform_data collie_flash_data = { 3348c2ecf20Sopenharmony_ci .map_name = "cfi_probe", 3358c2ecf20Sopenharmony_ci .init = collie_flash_init, 3368c2ecf20Sopenharmony_ci .set_vpp = collie_set_vpp, 3378c2ecf20Sopenharmony_ci .exit = collie_flash_exit, 3388c2ecf20Sopenharmony_ci .parts = collie_partitions, 3398c2ecf20Sopenharmony_ci .nr_parts = ARRAY_SIZE(collie_partitions), 3408c2ecf20Sopenharmony_ci}; 3418c2ecf20Sopenharmony_ci 3428c2ecf20Sopenharmony_cistatic struct resource collie_flash_resources[] = { 3438c2ecf20Sopenharmony_ci DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M), 3448c2ecf20Sopenharmony_ci}; 3458c2ecf20Sopenharmony_ci 3468c2ecf20Sopenharmony_cistatic struct sa1100fb_mach_info collie_lcd_info = { 3478c2ecf20Sopenharmony_ci .pixclock = 171521, .bpp = 16, 3488c2ecf20Sopenharmony_ci .xres = 320, .yres = 240, 3498c2ecf20Sopenharmony_ci 3508c2ecf20Sopenharmony_ci .hsync_len = 5, .vsync_len = 1, 3518c2ecf20Sopenharmony_ci .left_margin = 11, .upper_margin = 2, 3528c2ecf20Sopenharmony_ci .right_margin = 30, .lower_margin = 0, 3538c2ecf20Sopenharmony_ci 3548c2ecf20Sopenharmony_ci .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 3558c2ecf20Sopenharmony_ci 3568c2ecf20Sopenharmony_ci .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, 3578c2ecf20Sopenharmony_ci .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), 3588c2ecf20Sopenharmony_ci 3598c2ecf20Sopenharmony_ci#ifdef CONFIG_BACKLIGHT_LOCOMO 3608c2ecf20Sopenharmony_ci .lcd_power = locomolcd_power 3618c2ecf20Sopenharmony_ci#endif 3628c2ecf20Sopenharmony_ci}; 3638c2ecf20Sopenharmony_ci 3648c2ecf20Sopenharmony_cistatic void __init collie_init(void) 3658c2ecf20Sopenharmony_ci{ 3668c2ecf20Sopenharmony_ci int ret = 0; 3678c2ecf20Sopenharmony_ci 3688c2ecf20Sopenharmony_ci /* cpu initialize */ 3698c2ecf20Sopenharmony_ci GAFR = GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SSP_CLK | 3708c2ecf20Sopenharmony_ci GPIO_MCP_CLK | GPIO_32_768kHz; 3718c2ecf20Sopenharmony_ci 3728c2ecf20Sopenharmony_ci GPDR = GPIO_LDD8 | GPIO_LDD9 | GPIO_LDD10 | GPIO_LDD11 | GPIO_LDD12 | 3738c2ecf20Sopenharmony_ci GPIO_LDD13 | GPIO_LDD14 | GPIO_LDD15 | GPIO_SSP_TXD | 3748c2ecf20Sopenharmony_ci GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SDLC_SCLK | 3758c2ecf20Sopenharmony_ci _COLLIE_GPIO_UCB1x00_RESET | _COLLIE_GPIO_nMIC_ON | 3768c2ecf20Sopenharmony_ci _COLLIE_GPIO_nREMOCON_ON | GPIO_32_768kHz; 3778c2ecf20Sopenharmony_ci 3788c2ecf20Sopenharmony_ci PPDR = PPC_LDD0 | PPC_LDD1 | PPC_LDD2 | PPC_LDD3 | PPC_LDD4 | PPC_LDD5 | 3798c2ecf20Sopenharmony_ci PPC_LDD6 | PPC_LDD7 | PPC_L_PCLK | PPC_L_LCLK | PPC_L_FCLK | PPC_L_BIAS | 3808c2ecf20Sopenharmony_ci PPC_TXD1 | PPC_TXD2 | PPC_TXD3 | PPC_TXD4 | PPC_SCLK | PPC_SFRM; 3818c2ecf20Sopenharmony_ci 3828c2ecf20Sopenharmony_ci PWER = 0; 3838c2ecf20Sopenharmony_ci 3848c2ecf20Sopenharmony_ci PGSR = _COLLIE_GPIO_nREMOCON_ON; 3858c2ecf20Sopenharmony_ci 3868c2ecf20Sopenharmony_ci PSDR = PPC_RXD1 | PPC_RXD2 | PPC_RXD3 | PPC_RXD4; 3878c2ecf20Sopenharmony_ci 3888c2ecf20Sopenharmony_ci PCFR = PCFR_OPDE; 3898c2ecf20Sopenharmony_ci 3908c2ecf20Sopenharmony_ci GPSR |= _COLLIE_GPIO_UCB1x00_RESET; 3918c2ecf20Sopenharmony_ci 3928c2ecf20Sopenharmony_ci sa11x0_ppc_configure_mcp(); 3938c2ecf20Sopenharmony_ci 3948c2ecf20Sopenharmony_ci 3958c2ecf20Sopenharmony_ci platform_scoop_config = &collie_pcmcia_config; 3968c2ecf20Sopenharmony_ci 3978c2ecf20Sopenharmony_ci gpiod_add_lookup_table(&collie_power_gpiod_table); 3988c2ecf20Sopenharmony_ci 3998c2ecf20Sopenharmony_ci ret = platform_add_devices(devices, ARRAY_SIZE(devices)); 4008c2ecf20Sopenharmony_ci if (ret) { 4018c2ecf20Sopenharmony_ci printk(KERN_WARNING "collie: Unable to register LoCoMo device\n"); 4028c2ecf20Sopenharmony_ci } 4038c2ecf20Sopenharmony_ci 4048c2ecf20Sopenharmony_ci sa11x0_register_lcd(&collie_lcd_info); 4058c2ecf20Sopenharmony_ci sa11x0_register_mtd(&collie_flash_data, collie_flash_resources, 4068c2ecf20Sopenharmony_ci ARRAY_SIZE(collie_flash_resources)); 4078c2ecf20Sopenharmony_ci sa11x0_register_mcp(&collie_mcp_data); 4088c2ecf20Sopenharmony_ci sa11x0_register_irda(&collie_ir_data); 4098c2ecf20Sopenharmony_ci 4108c2ecf20Sopenharmony_ci sharpsl_save_param(); 4118c2ecf20Sopenharmony_ci} 4128c2ecf20Sopenharmony_ci 4138c2ecf20Sopenharmony_cistatic struct map_desc collie_io_desc[] __initdata = { 4148c2ecf20Sopenharmony_ci { /* 32M main flash (cs0) */ 4158c2ecf20Sopenharmony_ci .virtual = 0xe8000000, 4168c2ecf20Sopenharmony_ci .pfn = __phys_to_pfn(0x00000000), 4178c2ecf20Sopenharmony_ci .length = 0x02000000, 4188c2ecf20Sopenharmony_ci .type = MT_DEVICE 4198c2ecf20Sopenharmony_ci }, { /* 32M boot flash (cs1) */ 4208c2ecf20Sopenharmony_ci .virtual = 0xea000000, 4218c2ecf20Sopenharmony_ci .pfn = __phys_to_pfn(0x08000000), 4228c2ecf20Sopenharmony_ci .length = 0x02000000, 4238c2ecf20Sopenharmony_ci .type = MT_DEVICE 4248c2ecf20Sopenharmony_ci } 4258c2ecf20Sopenharmony_ci}; 4268c2ecf20Sopenharmony_ci 4278c2ecf20Sopenharmony_cistatic void __init collie_map_io(void) 4288c2ecf20Sopenharmony_ci{ 4298c2ecf20Sopenharmony_ci sa1100_map_io(); 4308c2ecf20Sopenharmony_ci iotable_init(collie_io_desc, ARRAY_SIZE(collie_io_desc)); 4318c2ecf20Sopenharmony_ci 4328c2ecf20Sopenharmony_ci#ifdef CONFIG_SHARP_LOCOMO 4338c2ecf20Sopenharmony_ci sa1100_register_uart_fns(&collie_port_fns); 4348c2ecf20Sopenharmony_ci#endif 4358c2ecf20Sopenharmony_ci sa1100_register_uart(0, 3); 4368c2ecf20Sopenharmony_ci sa1100_register_uart(1, 1); 4378c2ecf20Sopenharmony_ci} 4388c2ecf20Sopenharmony_ci 4398c2ecf20Sopenharmony_ciMACHINE_START(COLLIE, "Sharp-Collie") 4408c2ecf20Sopenharmony_ci .map_io = collie_map_io, 4418c2ecf20Sopenharmony_ci .nr_irqs = SA1100_NR_IRQS, 4428c2ecf20Sopenharmony_ci .init_irq = sa1100_init_irq, 4438c2ecf20Sopenharmony_ci .init_time = sa1100_timer_init, 4448c2ecf20Sopenharmony_ci .init_machine = collie_init, 4458c2ecf20Sopenharmony_ci .init_late = sa11x0_init_late, 4468c2ecf20Sopenharmony_ci .restart = sa11x0_restart, 4478c2ecf20Sopenharmony_ciMACHINE_END 448