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