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