162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * linux/arch/arm/mach-sa1100/collie.c 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * May be copied or modified under the terms of the GNU General Public 562306a36Sopenharmony_ci * License. See linux/COPYING for more information. 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * This file contains all Collie-specific tweaks. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * This program is free software; you can redistribute it and/or modify 1062306a36Sopenharmony_ci * it under the terms of the GNU General Public License version 2 as 1162306a36Sopenharmony_ci * published by the Free Software Foundation. 1262306a36Sopenharmony_ci * 1362306a36Sopenharmony_ci * ChangeLog: 1462306a36Sopenharmony_ci * 2006 Pavel Machek <pavel@ucw.cz> 1562306a36Sopenharmony_ci * 03-06-2004 John Lenz <lenz@cs.wisc.edu> 1662306a36Sopenharmony_ci * 06-04-2002 Chris Larson <kergoth@digitalnemesis.net> 1762306a36Sopenharmony_ci * 04-16-2001 Lineo Japan,Inc. ... 1862306a36Sopenharmony_ci */ 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <linux/init.h> 2162306a36Sopenharmony_ci#include <linux/kernel.h> 2262306a36Sopenharmony_ci#include <linux/tty.h> 2362306a36Sopenharmony_ci#include <linux/delay.h> 2462306a36Sopenharmony_ci#include <linux/platform_data/sa11x0-serial.h> 2562306a36Sopenharmony_ci#include <linux/platform_device.h> 2662306a36Sopenharmony_ci#include <linux/mfd/ucb1x00.h> 2762306a36Sopenharmony_ci#include <linux/mtd/mtd.h> 2862306a36Sopenharmony_ci#include <linux/mtd/partitions.h> 2962306a36Sopenharmony_ci#include <linux/timer.h> 3062306a36Sopenharmony_ci#include <linux/gpio_keys.h> 3162306a36Sopenharmony_ci#include <linux/input.h> 3262306a36Sopenharmony_ci#include <linux/gpio.h> 3362306a36Sopenharmony_ci#include <linux/gpio/machine.h> 3462306a36Sopenharmony_ci#include <linux/power/gpio-charger.h> 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci#include <video/sa1100fb.h> 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#include <mach/hardware.h> 3962306a36Sopenharmony_ci#include <asm/mach-types.h> 4062306a36Sopenharmony_ci#include <asm/page.h> 4162306a36Sopenharmony_ci#include <asm/setup.h> 4262306a36Sopenharmony_ci#include <mach/collie.h> 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ci#include <asm/mach/arch.h> 4562306a36Sopenharmony_ci#include <asm/mach/flash.h> 4662306a36Sopenharmony_ci#include <asm/mach/map.h> 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#include <asm/hardware/scoop.h> 4962306a36Sopenharmony_ci#include <asm/mach/sharpsl_param.h> 5062306a36Sopenharmony_ci#include <asm/hardware/locomo.h> 5162306a36Sopenharmony_ci#include <linux/platform_data/mfd-mcp-sa11x0.h> 5262306a36Sopenharmony_ci#include <mach/irqs.h> 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci#include "generic.h" 5562306a36Sopenharmony_ci 5662306a36Sopenharmony_cistatic struct resource collie_scoop_resources[] = { 5762306a36Sopenharmony_ci [0] = DEFINE_RES_MEM(0x40800000, SZ_4K), 5862306a36Sopenharmony_ci}; 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic struct scoop_config collie_scoop_setup = { 6162306a36Sopenharmony_ci .io_dir = COLLIE_SCOOP_IO_DIR, 6262306a36Sopenharmony_ci .io_out = COLLIE_SCOOP_IO_OUT, 6362306a36Sopenharmony_ci .gpio_base = COLLIE_SCOOP_GPIO_BASE, 6462306a36Sopenharmony_ci}; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_cistruct platform_device colliescoop_device = { 6762306a36Sopenharmony_ci .name = "sharp-scoop", 6862306a36Sopenharmony_ci .id = -1, 6962306a36Sopenharmony_ci .dev = { 7062306a36Sopenharmony_ci .platform_data = &collie_scoop_setup, 7162306a36Sopenharmony_ci }, 7262306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(collie_scoop_resources), 7362306a36Sopenharmony_ci .resource = collie_scoop_resources, 7462306a36Sopenharmony_ci}; 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_cistatic struct scoop_pcmcia_dev collie_pcmcia_scoop[] = { 7762306a36Sopenharmony_ci { 7862306a36Sopenharmony_ci .dev = &colliescoop_device.dev, 7962306a36Sopenharmony_ci .irq = COLLIE_IRQ_GPIO_CF_IRQ, 8062306a36Sopenharmony_ci .cd_irq = COLLIE_IRQ_GPIO_CF_CD, 8162306a36Sopenharmony_ci .cd_irq_str = "PCMCIA0 CD", 8262306a36Sopenharmony_ci }, 8362306a36Sopenharmony_ci}; 8462306a36Sopenharmony_ci 8562306a36Sopenharmony_cistatic struct scoop_pcmcia_config collie_pcmcia_config = { 8662306a36Sopenharmony_ci .devs = &collie_pcmcia_scoop[0], 8762306a36Sopenharmony_ci .num_devs = 1, 8862306a36Sopenharmony_ci}; 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_cistatic struct ucb1x00_plat_data collie_ucb1x00_data = { 9162306a36Sopenharmony_ci .gpio_base = COLLIE_TC35143_GPIO_BASE, 9262306a36Sopenharmony_ci}; 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_cistatic struct mcp_plat_data collie_mcp_data = { 9562306a36Sopenharmony_ci .mccr0 = MCCR0_ADM | MCCR0_ExtClk, 9662306a36Sopenharmony_ci .sclk_rate = 9216000, 9762306a36Sopenharmony_ci .codec_pdata = &collie_ucb1x00_data, 9862306a36Sopenharmony_ci}; 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ci/* Battery management GPIOs */ 10162306a36Sopenharmony_cistatic struct gpiod_lookup_table collie_battery_gpiod_table = { 10262306a36Sopenharmony_ci /* the MCP codec mcp0 has the ucb1x00 as attached device */ 10362306a36Sopenharmony_ci .dev_id = "ucb1x00", 10462306a36Sopenharmony_ci .table = { 10562306a36Sopenharmony_ci /* This is found on the main GPIO on the SA1100 */ 10662306a36Sopenharmony_ci GPIO_LOOKUP("gpio", COLLIE_GPIO_CO, 10762306a36Sopenharmony_ci "main battery full", GPIO_ACTIVE_HIGH), 10862306a36Sopenharmony_ci GPIO_LOOKUP("gpio", COLLIE_GPIO_MAIN_BAT_LOW, 10962306a36Sopenharmony_ci "main battery low", GPIO_ACTIVE_HIGH), 11062306a36Sopenharmony_ci /* 11162306a36Sopenharmony_ci * This is GPIO 0 on the Scoop expander, which is registered 11262306a36Sopenharmony_ci * from common/scoop.c with this gpio chip label. 11362306a36Sopenharmony_ci */ 11462306a36Sopenharmony_ci GPIO_LOOKUP("sharp-scoop", 0, 11562306a36Sopenharmony_ci "main charge on", GPIO_ACTIVE_HIGH), 11662306a36Sopenharmony_ci { }, 11762306a36Sopenharmony_ci }, 11862306a36Sopenharmony_ci}; 11962306a36Sopenharmony_ci 12062306a36Sopenharmony_ci/* 12162306a36Sopenharmony_ci * Collie AC IN 12262306a36Sopenharmony_ci */ 12362306a36Sopenharmony_cistatic struct gpiod_lookup_table collie_power_gpiod_table = { 12462306a36Sopenharmony_ci .dev_id = "gpio-charger", 12562306a36Sopenharmony_ci .table = { 12662306a36Sopenharmony_ci GPIO_LOOKUP("gpio", COLLIE_GPIO_AC_IN, 12762306a36Sopenharmony_ci NULL, GPIO_ACTIVE_HIGH), 12862306a36Sopenharmony_ci { }, 12962306a36Sopenharmony_ci }, 13062306a36Sopenharmony_ci}; 13162306a36Sopenharmony_ci 13262306a36Sopenharmony_cistatic char *collie_ac_supplied_to[] = { 13362306a36Sopenharmony_ci "main-battery", 13462306a36Sopenharmony_ci "backup-battery", 13562306a36Sopenharmony_ci}; 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_cistatic struct gpio_charger_platform_data collie_power_data = { 13862306a36Sopenharmony_ci .name = "charger", 13962306a36Sopenharmony_ci .type = POWER_SUPPLY_TYPE_MAINS, 14062306a36Sopenharmony_ci .supplied_to = collie_ac_supplied_to, 14162306a36Sopenharmony_ci .num_supplicants = ARRAY_SIZE(collie_ac_supplied_to), 14262306a36Sopenharmony_ci}; 14362306a36Sopenharmony_ci 14462306a36Sopenharmony_cistatic struct platform_device collie_power_device = { 14562306a36Sopenharmony_ci .name = "gpio-charger", 14662306a36Sopenharmony_ci .id = -1, 14762306a36Sopenharmony_ci .dev.platform_data = &collie_power_data, 14862306a36Sopenharmony_ci}; 14962306a36Sopenharmony_ci 15062306a36Sopenharmony_ci#ifdef CONFIG_SHARP_LOCOMO 15162306a36Sopenharmony_ci/* 15262306a36Sopenharmony_ci * low-level UART features. 15362306a36Sopenharmony_ci */ 15462306a36Sopenharmony_cistruct platform_device collie_locomo_device; 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_cistatic void collie_uart_set_mctrl(struct uart_port *port, u_int mctrl) 15762306a36Sopenharmony_ci{ 15862306a36Sopenharmony_ci if (mctrl & TIOCM_RTS) 15962306a36Sopenharmony_ci locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_RTS, 0); 16062306a36Sopenharmony_ci else 16162306a36Sopenharmony_ci locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_RTS, 1); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci if (mctrl & TIOCM_DTR) 16462306a36Sopenharmony_ci locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_DTR, 0); 16562306a36Sopenharmony_ci else 16662306a36Sopenharmony_ci locomo_gpio_write(&collie_locomo_device.dev, LOCOMO_GPIO_DTR, 1); 16762306a36Sopenharmony_ci} 16862306a36Sopenharmony_ci 16962306a36Sopenharmony_cistatic u_int collie_uart_get_mctrl(struct uart_port *port) 17062306a36Sopenharmony_ci{ 17162306a36Sopenharmony_ci int ret = TIOCM_CD; 17262306a36Sopenharmony_ci unsigned int r; 17362306a36Sopenharmony_ci 17462306a36Sopenharmony_ci r = locomo_gpio_read_output(&collie_locomo_device.dev, LOCOMO_GPIO_CTS & LOCOMO_GPIO_DSR); 17562306a36Sopenharmony_ci if (r == -ENODEV) 17662306a36Sopenharmony_ci return ret; 17762306a36Sopenharmony_ci if (r & LOCOMO_GPIO_CTS) 17862306a36Sopenharmony_ci ret |= TIOCM_CTS; 17962306a36Sopenharmony_ci if (r & LOCOMO_GPIO_DSR) 18062306a36Sopenharmony_ci ret |= TIOCM_DSR; 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci return ret; 18362306a36Sopenharmony_ci} 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_cistatic struct sa1100_port_fns collie_port_fns __initdata = { 18662306a36Sopenharmony_ci .set_mctrl = collie_uart_set_mctrl, 18762306a36Sopenharmony_ci .get_mctrl = collie_uart_get_mctrl, 18862306a36Sopenharmony_ci}; 18962306a36Sopenharmony_ci 19062306a36Sopenharmony_cistatic int collie_uart_probe(struct locomo_dev *dev) 19162306a36Sopenharmony_ci{ 19262306a36Sopenharmony_ci return 0; 19362306a36Sopenharmony_ci} 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_cistatic struct locomo_driver collie_uart_driver = { 19662306a36Sopenharmony_ci .drv = { 19762306a36Sopenharmony_ci .name = "collie_uart", 19862306a36Sopenharmony_ci }, 19962306a36Sopenharmony_ci .devid = LOCOMO_DEVID_UART, 20062306a36Sopenharmony_ci .probe = collie_uart_probe, 20162306a36Sopenharmony_ci}; 20262306a36Sopenharmony_ci 20362306a36Sopenharmony_cistatic int __init collie_uart_init(void) 20462306a36Sopenharmony_ci{ 20562306a36Sopenharmony_ci return locomo_driver_register(&collie_uart_driver); 20662306a36Sopenharmony_ci} 20762306a36Sopenharmony_cidevice_initcall(collie_uart_init); 20862306a36Sopenharmony_ci 20962306a36Sopenharmony_ci#endif 21062306a36Sopenharmony_ci 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_cistatic struct resource locomo_resources[] = { 21362306a36Sopenharmony_ci [0] = DEFINE_RES_MEM(0x40000000, SZ_8K), 21462306a36Sopenharmony_ci [1] = DEFINE_RES_IRQ(IRQ_GPIO25), 21562306a36Sopenharmony_ci}; 21662306a36Sopenharmony_ci 21762306a36Sopenharmony_cistatic struct locomo_platform_data locomo_info = { 21862306a36Sopenharmony_ci .irq_base = IRQ_BOARD_START, 21962306a36Sopenharmony_ci}; 22062306a36Sopenharmony_ci 22162306a36Sopenharmony_cistruct platform_device collie_locomo_device = { 22262306a36Sopenharmony_ci .name = "locomo", 22362306a36Sopenharmony_ci .id = 0, 22462306a36Sopenharmony_ci .dev = { 22562306a36Sopenharmony_ci .platform_data = &locomo_info, 22662306a36Sopenharmony_ci }, 22762306a36Sopenharmony_ci .num_resources = ARRAY_SIZE(locomo_resources), 22862306a36Sopenharmony_ci .resource = locomo_resources, 22962306a36Sopenharmony_ci}; 23062306a36Sopenharmony_ci 23162306a36Sopenharmony_cistatic struct gpio_keys_button collie_gpio_keys[] = { 23262306a36Sopenharmony_ci { 23362306a36Sopenharmony_ci .type = EV_PWR, 23462306a36Sopenharmony_ci .code = KEY_RESERVED, 23562306a36Sopenharmony_ci .gpio = COLLIE_GPIO_ON_KEY, 23662306a36Sopenharmony_ci .desc = "On key", 23762306a36Sopenharmony_ci .wakeup = 1, 23862306a36Sopenharmony_ci .active_low = 1, 23962306a36Sopenharmony_ci }, 24062306a36Sopenharmony_ci { 24162306a36Sopenharmony_ci .type = EV_PWR, 24262306a36Sopenharmony_ci .code = KEY_WAKEUP, 24362306a36Sopenharmony_ci .gpio = COLLIE_GPIO_WAKEUP, 24462306a36Sopenharmony_ci .desc = "Sync", 24562306a36Sopenharmony_ci .wakeup = 1, 24662306a36Sopenharmony_ci .active_low = 1, 24762306a36Sopenharmony_ci }, 24862306a36Sopenharmony_ci}; 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cistatic struct gpio_keys_platform_data collie_gpio_keys_data = { 25162306a36Sopenharmony_ci .buttons = collie_gpio_keys, 25262306a36Sopenharmony_ci .nbuttons = ARRAY_SIZE(collie_gpio_keys), 25362306a36Sopenharmony_ci}; 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_cistatic struct platform_device collie_gpio_keys_device = { 25662306a36Sopenharmony_ci .name = "gpio-keys", 25762306a36Sopenharmony_ci .id = -1, 25862306a36Sopenharmony_ci .dev = { 25962306a36Sopenharmony_ci .platform_data = &collie_gpio_keys_data, 26062306a36Sopenharmony_ci }, 26162306a36Sopenharmony_ci}; 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_cistatic struct platform_device *devices[] __initdata = { 26462306a36Sopenharmony_ci &collie_locomo_device, 26562306a36Sopenharmony_ci &colliescoop_device, 26662306a36Sopenharmony_ci &collie_power_device, 26762306a36Sopenharmony_ci &collie_gpio_keys_device, 26862306a36Sopenharmony_ci}; 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_cistatic struct mtd_partition collie_partitions[] = { 27162306a36Sopenharmony_ci { 27262306a36Sopenharmony_ci .name = "bootloader", 27362306a36Sopenharmony_ci .offset = 0, 27462306a36Sopenharmony_ci .size = 0x000C0000, 27562306a36Sopenharmony_ci .mask_flags = MTD_WRITEABLE 27662306a36Sopenharmony_ci }, { 27762306a36Sopenharmony_ci .name = "kernel", 27862306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 27962306a36Sopenharmony_ci .size = 0x00100000, 28062306a36Sopenharmony_ci }, { 28162306a36Sopenharmony_ci .name = "rootfs", 28262306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 28362306a36Sopenharmony_ci .size = 0x00e20000, 28462306a36Sopenharmony_ci }, { 28562306a36Sopenharmony_ci .name = "bootblock", 28662306a36Sopenharmony_ci .offset = MTDPART_OFS_APPEND, 28762306a36Sopenharmony_ci .size = 0x00020000, 28862306a36Sopenharmony_ci .mask_flags = MTD_WRITEABLE 28962306a36Sopenharmony_ci } 29062306a36Sopenharmony_ci}; 29162306a36Sopenharmony_ci 29262306a36Sopenharmony_cistatic int collie_flash_init(void) 29362306a36Sopenharmony_ci{ 29462306a36Sopenharmony_ci int rc = gpio_request(COLLIE_GPIO_VPEN, "flash Vpp enable"); 29562306a36Sopenharmony_ci if (rc) 29662306a36Sopenharmony_ci return rc; 29762306a36Sopenharmony_ci 29862306a36Sopenharmony_ci rc = gpio_direction_output(COLLIE_GPIO_VPEN, 1); 29962306a36Sopenharmony_ci if (rc) 30062306a36Sopenharmony_ci gpio_free(COLLIE_GPIO_VPEN); 30162306a36Sopenharmony_ci 30262306a36Sopenharmony_ci return rc; 30362306a36Sopenharmony_ci} 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_cistatic void collie_set_vpp(int vpp) 30662306a36Sopenharmony_ci{ 30762306a36Sopenharmony_ci gpio_set_value(COLLIE_GPIO_VPEN, vpp); 30862306a36Sopenharmony_ci} 30962306a36Sopenharmony_ci 31062306a36Sopenharmony_cistatic void collie_flash_exit(void) 31162306a36Sopenharmony_ci{ 31262306a36Sopenharmony_ci gpio_free(COLLIE_GPIO_VPEN); 31362306a36Sopenharmony_ci} 31462306a36Sopenharmony_ci 31562306a36Sopenharmony_cistatic struct flash_platform_data collie_flash_data = { 31662306a36Sopenharmony_ci .map_name = "cfi_probe", 31762306a36Sopenharmony_ci .init = collie_flash_init, 31862306a36Sopenharmony_ci .set_vpp = collie_set_vpp, 31962306a36Sopenharmony_ci .exit = collie_flash_exit, 32062306a36Sopenharmony_ci .parts = collie_partitions, 32162306a36Sopenharmony_ci .nr_parts = ARRAY_SIZE(collie_partitions), 32262306a36Sopenharmony_ci}; 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_cistatic struct resource collie_flash_resources[] = { 32562306a36Sopenharmony_ci DEFINE_RES_MEM(SA1100_CS0_PHYS, SZ_32M), 32662306a36Sopenharmony_ci}; 32762306a36Sopenharmony_ci 32862306a36Sopenharmony_cistatic struct sa1100fb_mach_info collie_lcd_info = { 32962306a36Sopenharmony_ci .pixclock = 171521, .bpp = 16, 33062306a36Sopenharmony_ci .xres = 320, .yres = 240, 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ci .hsync_len = 5, .vsync_len = 1, 33362306a36Sopenharmony_ci .left_margin = 11, .upper_margin = 2, 33462306a36Sopenharmony_ci .right_margin = 30, .lower_margin = 0, 33562306a36Sopenharmony_ci 33662306a36Sopenharmony_ci .sync = FB_SYNC_HOR_HIGH_ACT | FB_SYNC_VERT_HIGH_ACT, 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_ci .lccr0 = LCCR0_Color | LCCR0_Sngl | LCCR0_Act, 33962306a36Sopenharmony_ci .lccr3 = LCCR3_OutEnH | LCCR3_PixRsEdg | LCCR3_ACBsDiv(2), 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci#ifdef CONFIG_BACKLIGHT_LOCOMO 34262306a36Sopenharmony_ci .lcd_power = locomolcd_power 34362306a36Sopenharmony_ci#endif 34462306a36Sopenharmony_ci}; 34562306a36Sopenharmony_ci 34662306a36Sopenharmony_cistatic void __init collie_init(void) 34762306a36Sopenharmony_ci{ 34862306a36Sopenharmony_ci int ret = 0; 34962306a36Sopenharmony_ci 35062306a36Sopenharmony_ci /* cpu initialize */ 35162306a36Sopenharmony_ci GAFR = GPIO_SSP_TXD | GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SSP_CLK | 35262306a36Sopenharmony_ci GPIO_MCP_CLK | GPIO_32_768kHz; 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ci GPDR = GPIO_LDD8 | GPIO_LDD9 | GPIO_LDD10 | GPIO_LDD11 | GPIO_LDD12 | 35562306a36Sopenharmony_ci GPIO_LDD13 | GPIO_LDD14 | GPIO_LDD15 | GPIO_SSP_TXD | 35662306a36Sopenharmony_ci GPIO_SSP_SCLK | GPIO_SSP_SFRM | GPIO_SDLC_SCLK | 35762306a36Sopenharmony_ci _COLLIE_GPIO_UCB1x00_RESET | _COLLIE_GPIO_nMIC_ON | 35862306a36Sopenharmony_ci _COLLIE_GPIO_nREMOCON_ON | GPIO_32_768kHz; 35962306a36Sopenharmony_ci 36062306a36Sopenharmony_ci PPDR = PPC_LDD0 | PPC_LDD1 | PPC_LDD2 | PPC_LDD3 | PPC_LDD4 | PPC_LDD5 | 36162306a36Sopenharmony_ci PPC_LDD6 | PPC_LDD7 | PPC_L_PCLK | PPC_L_LCLK | PPC_L_FCLK | PPC_L_BIAS | 36262306a36Sopenharmony_ci PPC_TXD1 | PPC_TXD2 | PPC_TXD3 | PPC_TXD4 | PPC_SCLK | PPC_SFRM; 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci PWER = 0; 36562306a36Sopenharmony_ci 36662306a36Sopenharmony_ci PGSR = _COLLIE_GPIO_nREMOCON_ON; 36762306a36Sopenharmony_ci 36862306a36Sopenharmony_ci PSDR = PPC_RXD1 | PPC_RXD2 | PPC_RXD3 | PPC_RXD4; 36962306a36Sopenharmony_ci 37062306a36Sopenharmony_ci PCFR = PCFR_OPDE; 37162306a36Sopenharmony_ci 37262306a36Sopenharmony_ci GPSR |= _COLLIE_GPIO_UCB1x00_RESET; 37362306a36Sopenharmony_ci 37462306a36Sopenharmony_ci sa11x0_ppc_configure_mcp(); 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci 37762306a36Sopenharmony_ci platform_scoop_config = &collie_pcmcia_config; 37862306a36Sopenharmony_ci 37962306a36Sopenharmony_ci gpiod_add_lookup_table(&collie_power_gpiod_table); 38062306a36Sopenharmony_ci gpiod_add_lookup_table(&collie_battery_gpiod_table); 38162306a36Sopenharmony_ci 38262306a36Sopenharmony_ci ret = platform_add_devices(devices, ARRAY_SIZE(devices)); 38362306a36Sopenharmony_ci if (ret) { 38462306a36Sopenharmony_ci printk(KERN_WARNING "collie: Unable to register LoCoMo device\n"); 38562306a36Sopenharmony_ci } 38662306a36Sopenharmony_ci 38762306a36Sopenharmony_ci sa11x0_register_lcd(&collie_lcd_info); 38862306a36Sopenharmony_ci sa11x0_register_mtd(&collie_flash_data, collie_flash_resources, 38962306a36Sopenharmony_ci ARRAY_SIZE(collie_flash_resources)); 39062306a36Sopenharmony_ci sa11x0_register_mcp(&collie_mcp_data); 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci sharpsl_save_param(); 39362306a36Sopenharmony_ci} 39462306a36Sopenharmony_ci 39562306a36Sopenharmony_cistatic struct map_desc collie_io_desc[] __initdata = { 39662306a36Sopenharmony_ci { /* 32M main flash (cs0) */ 39762306a36Sopenharmony_ci .virtual = 0xe8000000, 39862306a36Sopenharmony_ci .pfn = __phys_to_pfn(0x00000000), 39962306a36Sopenharmony_ci .length = 0x02000000, 40062306a36Sopenharmony_ci .type = MT_DEVICE 40162306a36Sopenharmony_ci }, { /* 32M boot flash (cs1) */ 40262306a36Sopenharmony_ci .virtual = 0xea000000, 40362306a36Sopenharmony_ci .pfn = __phys_to_pfn(0x08000000), 40462306a36Sopenharmony_ci .length = 0x02000000, 40562306a36Sopenharmony_ci .type = MT_DEVICE 40662306a36Sopenharmony_ci } 40762306a36Sopenharmony_ci}; 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cistatic void __init collie_map_io(void) 41062306a36Sopenharmony_ci{ 41162306a36Sopenharmony_ci sa1100_map_io(); 41262306a36Sopenharmony_ci iotable_init(collie_io_desc, ARRAY_SIZE(collie_io_desc)); 41362306a36Sopenharmony_ci 41462306a36Sopenharmony_ci#ifdef CONFIG_SHARP_LOCOMO 41562306a36Sopenharmony_ci sa1100_register_uart_fns(&collie_port_fns); 41662306a36Sopenharmony_ci#endif 41762306a36Sopenharmony_ci sa1100_register_uart(0, 3); 41862306a36Sopenharmony_ci sa1100_register_uart(1, 1); 41962306a36Sopenharmony_ci} 42062306a36Sopenharmony_ci 42162306a36Sopenharmony_ciMACHINE_START(COLLIE, "Sharp-Collie") 42262306a36Sopenharmony_ci .map_io = collie_map_io, 42362306a36Sopenharmony_ci .nr_irqs = SA1100_NR_IRQS, 42462306a36Sopenharmony_ci .init_irq = sa1100_init_irq, 42562306a36Sopenharmony_ci .init_time = sa1100_timer_init, 42662306a36Sopenharmony_ci .init_machine = collie_init, 42762306a36Sopenharmony_ci .init_late = sa11x0_init_late, 42862306a36Sopenharmony_ci .restart = sa11x0_restart, 42962306a36Sopenharmony_ciMACHINE_END 430