1b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone/*
2b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone * arch/arm/mach-ks8695/board-acs5k.c
3b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone *
4b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone * Brivo Systems LLC, ACS-5000 Master Board
5b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone *
6b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone * Copyright 2008 Simtec Electronics
7b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone *		  Daniel Silverstone <dsilvers@simtec.co.uk>
8b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone *
9b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone * This program is free software; you can redistribute it and/or modify
10b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone * it under the terms of the GNU General Public License version 2 as
11b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone * published by the Free Software Foundation.
12b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone */
132f8163baada3dbd0ce891c35bc59ae46e773487aRussell King#include <linux/gpio.h>
14b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/kernel.h>
15b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/types.h>
16b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/interrupt.h>
17b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/init.h>
18b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/platform_device.h>
19b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
20b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/i2c.h>
21b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/i2c-algo-bit.h>
22b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/i2c-gpio.h>
235877457a96e5f89567d2eea092ec28db5d55fc06Vivien Didelot#include <linux/platform_data/pca953x.h>
24b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
25b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/mtd/mtd.h>
26b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/mtd/map.h>
27b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/mtd/physmap.h>
28b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <linux/mtd/partitions.h>
29b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
30b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <asm/mach-types.h>
31b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
32b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <asm/mach/arch.h>
33b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <asm/mach/map.h>
34b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <asm/mach/irq.h>
35b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
36b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include <mach/devices.h>
37e24e4498cb4930bf785e46f98e7be7becece8b4cLinus Walleij#include <mach/gpio-ks8695.h>
38b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
39b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone#include "generic.h"
40b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
41b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic struct i2c_gpio_platform_data acs5k_i2c_device_platdata = {
42b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.sda_pin	= 4,
43b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.scl_pin	= 5,
44b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.udelay		= 10,
45b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone};
46b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
47b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic struct platform_device acs5k_i2c_device = {
48b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.name		= "i2c-gpio",
49b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.id		= -1,
50b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.num_resources	= 0,
51b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.resource	= NULL,
52b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.dev		= {
53b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.platform_data	= &acs5k_i2c_device_platdata,
54b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	},
55b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone};
56b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
57b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic int acs5k_pca9555_setup(struct i2c_client *client,
58b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone			       unsigned gpio_base, unsigned ngpio,
59b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone			       void *context)
60b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone{
61b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	static int acs5k_gpio_value[] = {
62b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		-1, -1, -1, -1, -1, -1, -1, 0, 1, 1, -1, 0, 1, 0, -1, -1
63b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	};
64b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	int n;
65b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
66b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	for (n = 0; n < ARRAY_SIZE(acs5k_gpio_value); ++n) {
67b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		gpio_request(gpio_base + n, "ACS-5000 GPIO Expander");
68b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		if (acs5k_gpio_value[n] < 0)
69b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone			gpio_direction_input(gpio_base + n);
70b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		else
71b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone			gpio_direction_output(gpio_base + n,
72b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone					      acs5k_gpio_value[n]);
73b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		gpio_export(gpio_base + n, 0); /* Export, direction locked down */
74b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	}
75b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
76b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	return 0;
77b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone}
78b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
79b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic struct pca953x_platform_data acs5k_i2c_pca9555_platdata = {
80b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.gpio_base	= 16, /* Start directly after the CPU's GPIO */
81b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.invert		= 0, /* Do not invert */
82b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.setup		= acs5k_pca9555_setup,
83b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone};
84b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
85b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic struct i2c_board_info acs5k_i2c_devs[] __initdata = {
86b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	{
87b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		I2C_BOARD_INFO("pcf8563", 0x51),
88b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	},
89b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	{
90b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		I2C_BOARD_INFO("pca9555", 0x20),
91b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.platform_data = &acs5k_i2c_pca9555_platdata,
92b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	},
93b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone};
94b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
95351a102dbf489d0e9c9b0883f76e2a94d895503dGreg Kroah-Hartmanstatic void acs5k_i2c_init(void)
96b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone{
97b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	/* The gpio interface */
98b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	platform_device_register(&acs5k_i2c_device);
99b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	/* I2C devices */
100b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	i2c_register_board_info(0, acs5k_i2c_devs,
101b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone				ARRAY_SIZE(acs5k_i2c_devs));
102b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone}
103b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
104b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic struct mtd_partition acs5k_nor_partitions[] = {
105b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	[0] = {
106b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.name	= "Boot Agent and config",
107b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.size	= SZ_256K,
108b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.offset	= 0,
109b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.mask_flags = MTD_WRITEABLE,
110b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	},
111b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	[1] = {
112b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.name	= "Kernel",
113b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.size	= SZ_1M,
114b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.offset	= SZ_256K,
115b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	},
116b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	[2] = {
117b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.name	= "SquashFS1",
118b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.size	= SZ_2M,
119b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.offset	= SZ_256K + SZ_1M,
120b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	},
121b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	[3] = {
122b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.name	= "SquashFS2",
123b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.size	= SZ_4M + SZ_2M,
124b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.offset	= SZ_256K + SZ_1M + SZ_2M,
125b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	},
126b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	[4] = {
127b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.name	= "Data",
128b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.size	= SZ_16M + SZ_4M + SZ_2M + SZ_512K, /* 22.5 MB */
129b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.offset	= SZ_256K + SZ_8M + SZ_1M,
130b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	}
131b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone};
132b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
133b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic struct physmap_flash_data acs5k_nor_pdata = {
134b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.width		= 4,
135b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.nr_parts	= ARRAY_SIZE(acs5k_nor_partitions),
136b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.parts		= acs5k_nor_partitions,
137b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone};
138b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
139b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic struct resource acs5k_nor_resource[] = {
140b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	[0] = {
141b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.start = SZ_32M, /* We expect the bootloader to map
142b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone				  * the flash here.
143b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone				  */
144b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.end   = SZ_32M + SZ_16M - 1,
145b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.flags = IORESOURCE_MEM,
146b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	},
147b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	[1] = {
148b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.start = SZ_32M + SZ_16M,
149b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.end   = SZ_32M + SZ_32M - SZ_256K - 1,
150b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.flags = IORESOURCE_MEM,
151b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	}
152b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone};
153b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
154b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic struct platform_device acs5k_device_nor = {
155b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.name		= "physmap-flash",
156b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.id		= -1,
157b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.num_resources	= ARRAY_SIZE(acs5k_nor_resource),
158b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.resource	= acs5k_nor_resource,
159b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.dev		= {
160b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		.platform_data = &acs5k_nor_pdata,
161b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	},
162b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone};
163b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
164b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic void __init acs5k_register_nor(void)
165b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone{
166b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	int ret;
167b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
168b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	if (acs5k_nor_partitions[0].mask_flags == 0)
169b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		printk(KERN_WARNING "Warning: Unprotecting bootloader and configuration partition\n");
170b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
171b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	ret = platform_device_register(&acs5k_device_nor);
172b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	if (ret < 0)
173b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		printk(KERN_ERR "failed to register physmap-flash device\n");
174b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone}
175b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
176b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic int __init acs5k_protection_setup(char *s)
177b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone{
178b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	/* We can't allocate anything here but we should be able
179b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	 * to trivially parse s and decide if we can protect the
180b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	 * bootloader partition or not
181b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	 */
182b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	if (strcmp(s, "no") == 0)
183b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		acs5k_nor_partitions[0].mask_flags = 0;
184b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
185b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	return 1;
186b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone}
187b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
188b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone__setup("protect_bootloader=", acs5k_protection_setup);
189b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
190b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic void __init acs5k_init_gpio(void)
191b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone{
192b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	int i;
193b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
194b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	ks8695_register_gpios();
195b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	for (i = 0; i < 4; ++i)
196b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		gpio_request(i, "ACS5K IRQ");
197b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	gpio_request(7, "ACS5K KS_FRDY");
198b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	for (i = 8; i < 16; ++i)
199b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone		gpio_request(i, "ACS5K Unused");
200b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
201b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	gpio_request(3, "ACS5K CAN Control");
202b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	gpio_request(6, "ACS5K Heartbeat");
203b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	gpio_direction_output(3, 1); /* Default CAN_RESET high */
204b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	gpio_direction_output(6, 0); /* Default KS8695_ACTIVE low */
205b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	gpio_export(3, 0); /* export CAN_RESET as output only */
206b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	gpio_export(6, 0); /* export KS8695_ACTIVE as output only */
207b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone}
208b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
209b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstonestatic void __init acs5k_init(void)
210b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone{
211b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	acs5k_init_gpio();
212b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
213b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	/* Network device */
214b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	ks8695_add_device_lan();	/* eth0 = LAN */
215b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	ks8695_add_device_wan();	/* ethX = WAN */
216b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
217b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	/* NOR devices */
218b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	acs5k_register_nor();
219b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
220b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	/* I2C bus */
221b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	acs5k_i2c_init();
222b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone}
223b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone
224b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel SilverstoneMACHINE_START(ACS5K, "Brivo Systems LLC ACS-5000 Master board")
225b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	/* Maintainer: Simtec Electronics. */
2260318ce936889207b2dacc89036e4bf307564f0d3Nicolas Pitre	.atag_offset	= 0x100,
227b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.map_io		= ks8695_map_io,
228b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.init_irq	= ks8695_init_irq,
229b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel Silverstone	.init_machine	= acs5k_init,
2306bb27d7349db51b50c40534710fe164ca0d58902Stephen Warren	.init_time	= ks8695_timer_init,
231114c19b7b53523a6304c4b4fc51a22d006da3726Russell King	.restart	= ks8695_restart,
232b74788d8c118a48585ad5342560e0aea6ed0ccd4Daniel SilverstoneMACHINE_END
233