| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  | 
| Deepak Saxena | 54e269e | 2006-01-05 20:59:29 +0000 | [diff] [blame] | 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 |  */ | 
 | 36 | extern unsigned long ixp4xx_exp_bus_size; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 37 |  | 
| Deepak Saxena | 54e269e | 2006-01-05 20:59:29 +0000 | [diff] [blame] | 38 | #define	IXP4XX_EXP_BUS_BASE(region)\ | 
 | 39 | 		(IXP4XX_EXP_BUS_BASE_PHYS + ((region) * ixp4xx_exp_bus_size)) | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 40 |  | 
| Alessandro Zummo | 03bd14c | 2006-03-20 17:10:10 +0000 | [diff] [blame] | 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 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 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 |  */ | 
 | 84 | struct ixp4xx_i2c_pins { | 
 | 85 | 	unsigned long sda_pin; | 
 | 86 | 	unsigned long scl_pin; | 
 | 87 | }; | 
 | 88 |  | 
| Alessandro Zummo | 0df0d0a | 2006-11-14 13:43:21 -0500 | [diff] [blame] | 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 |  */ | 
 | 94 | struct 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 | }; | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 102 |  | 
 | 103 | struct sys_timer; | 
 | 104 |  | 
 | 105 | /* | 
| Kevin Hilman | 84904d0 | 2006-09-22 00:58:57 +0100 | [diff] [blame] | 106 |  * Frequency of clock used for primary clocksource | 
 | 107 |  */ | 
 | 108 | extern unsigned long ixp4xx_timer_freq; | 
 | 109 |  | 
 | 110 | /* | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 111 |  * Functions used by platform-level setup code | 
 | 112 |  */ | 
 | 113 | extern void ixp4xx_map_io(void); | 
 | 114 | extern void ixp4xx_init_irq(void); | 
 | 115 | extern void ixp4xx_sys_init(void); | 
 | 116 | extern struct sys_timer ixp4xx_timer; | 
 | 117 | extern void ixp4xx_pci_preinit(void); | 
 | 118 | struct pci_sys_data; | 
 | 119 | extern int ixp4xx_setup(int nr, struct pci_sys_data *sys); | 
 | 120 | extern struct pci_bus *ixp4xx_scan_bus(int nr, struct pci_sys_data *sys); | 
 | 121 |  | 
 | 122 | /* | 
 | 123 |  * GPIO-functions | 
 | 124 |  */ | 
 | 125 | /* | 
 | 126 |  * The following converted to the real HW bits the gpio_line_config | 
 | 127 |  */ | 
 | 128 | /* GPIO pin types */ | 
 | 129 | #define IXP4XX_GPIO_OUT 		0x1 | 
 | 130 | #define IXP4XX_GPIO_IN  		0x2 | 
 | 131 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 132 | /* GPIO signal types */ | 
 | 133 | #define IXP4XX_GPIO_LOW			0 | 
 | 134 | #define IXP4XX_GPIO_HIGH		1 | 
 | 135 |  | 
 | 136 | /* GPIO Clocks */ | 
 | 137 | #define IXP4XX_GPIO_CLK_0		14 | 
 | 138 | #define IXP4XX_GPIO_CLK_1		15 | 
 | 139 |  | 
| Deepak Saxena | bdf82b5 | 2005-08-29 22:46:30 +0100 | [diff] [blame] | 140 | static inline void gpio_line_config(u8 line, u32 direction) | 
 | 141 | { | 
| Deepak Saxena | ce12467 | 2005-10-04 16:32:38 -0700 | [diff] [blame] | 142 | 	if (direction == IXP4XX_GPIO_IN) | 
| Deepak Saxena | bdf82b5 | 2005-08-29 22:46:30 +0100 | [diff] [blame] | 143 | 		*IXP4XX_GPIO_GPOER |= (1 << line); | 
 | 144 | 	else | 
 | 145 | 		*IXP4XX_GPIO_GPOER &= ~(1 << line); | 
 | 146 | } | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 147 |  | 
 | 148 | static inline void gpio_line_get(u8 line, int *value) | 
 | 149 | { | 
 | 150 | 	*value = (*IXP4XX_GPIO_GPINR >> line) & 0x1; | 
 | 151 | } | 
 | 152 |  | 
 | 153 | static inline void gpio_line_set(u8 line, int value) | 
 | 154 | { | 
 | 155 | 	if (value == IXP4XX_GPIO_HIGH) | 
 | 156 | 	    *IXP4XX_GPIO_GPOUTR |= (1 << line); | 
 | 157 | 	else if (value == IXP4XX_GPIO_LOW) | 
 | 158 | 	    *IXP4XX_GPIO_GPOUTR &= ~(1 << line); | 
 | 159 | } | 
 | 160 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 161 | #endif // __ASSEMBLY__ | 
 | 162 |  |