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