1/* 2 * include/asm-arm/arch-ixp4xx/platform.h 3 * 4 * Constants and functions that are useful to IXP4xx platform-specific code 5 * and device drivers. 6 * 7 * Copyright (C) 2004 MontaVista Software, Inc. 8 */ 9 10#ifndef __ASM_ARCH_HARDWARE_H__ 11#error "Do not include this directly, instead #include <asm/hardware.h>" 12#endif 13 14#ifndef __ASSEMBLY__ 15 16#include <asm/types.h> 17 18#ifndef __ARMEB__ 19#define REG_OFFSET 0 20#else 21#define REG_OFFSET 3 22#endif 23 24/* 25 * Expansion bus memory regions 26 */ 27#define IXP4XX_EXP_BUS_BASE_PHYS (0x50000000) 28 29/* 30 * The expansion bus on the IXP4xx can be configured for either 16 or 31 * 32MB windows and the CS offset for each region changes based on the 32 * current configuration. This means that we cannot simply hardcode 33 * each offset. ixp4xx_sys_init() looks at the expansion bus configuration 34 * as setup by the bootloader to determine our window size. 35 */ 36extern unsigned long ixp4xx_exp_bus_size; 37 38#define IXP4XX_EXP_BUS_BASE(region)\ 39 (IXP4XX_EXP_BUS_BASE_PHYS + ((region) * ixp4xx_exp_bus_size)) 40 41#define IXP4XX_EXP_BUS_END(region)\ 42 (IXP4XX_EXP_BUS_BASE(region) + ixp4xx_exp_bus_size - 1) 43 44/* Those macros can be used to adjust timing and configure 45 * other features for each region. 46 */ 47 48#define IXP4XX_EXP_BUS_RECOVERY_T(x) (((x) & 0x0f) << 16) 49#define IXP4XX_EXP_BUS_HOLD_T(x) (((x) & 0x03) << 20) 50#define IXP4XX_EXP_BUS_STROBE_T(x) (((x) & 0x0f) << 22) 51#define IXP4XX_EXP_BUS_SETUP_T(x) (((x) & 0x03) << 26) 52#define IXP4XX_EXP_BUS_ADDR_T(x) (((x) & 0x03) << 28) 53#define IXP4XX_EXP_BUS_SIZE(x) (((x) & 0x0f) << 10) 54#define IXP4XX_EXP_BUS_CYCLES(x) (((x) & 0x03) << 14) 55 56#define IXP4XX_EXP_BUS_CS_EN (1L << 31) 57#define IXP4XX_EXP_BUS_BYTE_RD16 (1L << 6) 58#define IXP4XX_EXP_BUS_HRDY_POL (1L << 5) 59#define IXP4XX_EXP_BUS_MUX_EN (1L << 4) 60#define IXP4XX_EXP_BUS_SPLT_EN (1L << 3) 61#define IXP4XX_EXP_BUS_WR_EN (1L << 1) 62#define IXP4XX_EXP_BUS_BYTE_EN (1L << 0) 63 64#define IXP4XX_EXP_BUS_CYCLES_INTEL 0x00 65#define IXP4XX_EXP_BUS_CYCLES_MOTOROLA 0x01 66#define IXP4XX_EXP_BUS_CYCLES_HPI 0x02 67 68#define IXP4XX_FLASH_WRITABLE (0x2) 69#define IXP4XX_FLASH_DEFAULT (0xbcd23c40) 70#define IXP4XX_FLASH_WRITE (0xbcd23c42) 71 72/* 73 * Clock Speed Definitions. 74 */ 75#define IXP4XX_PERIPHERAL_BUS_CLOCK (66) /* 66Mhzi APB BUS */ 76#define IXP4XX_UART_XTAL 14745600 77 78/* 79 * The IXP4xx chips do not have an I2C unit, so GPIO lines are just 80 * used to 81 * Used as platform_data to provide GPIO pin information to the ixp42x 82 * I2C driver. 83 */ 84struct ixp4xx_i2c_pins { 85 unsigned long sda_pin; 86 unsigned long scl_pin; 87}; 88 89/* 90 * This structure provide a means for the board setup code 91 * to give information to th pata_ixp4xx driver. It is 92 * passed as platform_data. 93 */ 94struct ixp4xx_pata_data { 95 volatile u32 *cs0_cfg; 96 volatile u32 *cs1_cfg; 97 unsigned long cs0_bits; 98 unsigned long cs1_bits; 99 void __iomem *cs0; 100 void __iomem *cs1; 101}; 102 103struct sys_timer; 104 105/* 106 * Frequency of clock used for primary clocksource 107 */ 108extern unsigned long ixp4xx_timer_freq; 109 110/* 111 * Functions used by platform-level setup code 112 */ 113extern void ixp4xx_map_io(void); 114extern void ixp4xx_init_irq(void); 115extern void ixp4xx_sys_init(void); 116extern void ixp4xx_timer_init(void); 117extern struct sys_timer ixp4xx_timer; 118extern void ixp4xx_pci_preinit(void); 119struct pci_sys_data; 120extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); 121extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys); 122 123/* 124 * GPIO-functions 125 */ 126/* 127 * The following converted to the real HW bits the gpio_line_config 128 */ 129/* GPIO pin types */ 130#define IXP4XX_GPIO_OUT 0x1 131#define IXP4XX_GPIO_IN 0x2 132 133/* GPIO signal types */ 134#define IXP4XX_GPIO_LOW 0 135#define IXP4XX_GPIO_HIGH 1 136 137/* GPIO Clocks */ 138#define IXP4XX_GPIO_CLK_0 14 139#define IXP4XX_GPIO_CLK_1 15 140 141static inline void gpio_line_config(u8 line, u32 direction) 142{ 143 if (direction == IXP4XX_GPIO_IN) 144 *IXP4XX_GPIO_GPOER |= (1 << line); 145 else 146 *IXP4XX_GPIO_GPOER &= ~(1 << line); 147} 148 149static inline void gpio_line_get(u8 line, int *value) 150{ 151 *value = (*IXP4XX_GPIO_GPINR >> line) & 0x1; 152} 153 154static inline void gpio_line_set(u8 line, int value) 155{ 156 if (value == IXP4XX_GPIO_HIGH) 157 *IXP4XX_GPIO_GPOUTR |= (1 << line); 158 else if (value == IXP4XX_GPIO_LOW) 159 *IXP4XX_GPIO_GPOUTR &= ~(1 << line); 160} 161 162#endif // __ASSEMBLY__ 163