diff options
Diffstat (limited to 'include/asm-arm/arch-sa1100/jornada56x.h')
-rw-r--r-- | include/asm-arm/arch-sa1100/jornada56x.h | 362 |
1 files changed, 362 insertions, 0 deletions
diff --git a/include/asm-arm/arch-sa1100/jornada56x.h b/include/asm-arm/arch-sa1100/jornada56x.h new file mode 100644 index 00000000000000..3bdbb7af0d1f3d --- /dev/null +++ b/include/asm-arm/arch-sa1100/jornada56x.h @@ -0,0 +1,362 @@ +/* + * linux/include/asm-arm/arch-sa1100/jornada56x.h + * + * Created 2002/3/6 by John Ankcorn <jca@alum.mit.edu> + * + * This file contains the hardware specific definitions for HP Jornada 56x + * + * Copyright 2008 Michael Kaye <mjkaye@ippimail.com> + * Copyright 2002 John Ankcorn <jca@alum.mit.edu> + * + * This source code is distributed under a dual licence of GPL (version 2 or + * later) and MIT/X11. + * + * GPL: + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Generel Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * MIT/X11: + * Permission is hereby granted, free of charge, to any person + * obtaining a copy of this software and associated documentation + * files (the "Software"), to deal in the Software without + * restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the + * Software is furnished to do so, subject to the following + * conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES + * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT + * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + * + * Changelog: + * 20080303 JCA Relicensed to GPL-MIT/X11 licence + * 20080509 MJK Added IRQs and ASIC REGSTART/REGLEN + * + */ + +#ifndef __ASM_ARCH_JORNADA56X_H +#define __ASM_ARCH_JORNADA56X_H + +#include <linux/irqreturn.h> +#include <asm/hardware.h> +#include <asm/irq.h> + +#ifndef __ASSEMBLY__ + +/* SA-1110 GPIO lines */ +#define GPIO_JORNADA56X_ASIC GPIO_GPIO(10) +#define GPIO_JORNADA56X_ASIC_IRQ IRQ_GPIO10 +#define GPIO_JORNADA56X_POWER_SWITCH GPIO_GPIO0 +#define GPIO_JORNADA56X_POWER_SWITCH_IRQ IRQ_GPIO0 +#define GPIO_JORNADA56X_TOUCH GPIO_GPIO13 +#define GPIO_JORNADA56X_TOUCH_IRQ IRQ_GPIO13 + +#define JORNADA56X_ASIC_BASE 0xf0000000 /* physical 0x40000000 */ +#define JORNADA56X_ASIC_REGSTART 0x40000000 /* phys of JORNADA56X_ASIC_BASE */ +#define JORNADA56X_ASIC_REGLEN 0x00100000 + +#define PMU_BASE ((volatile long *)JORNADA56X_ASIC_BASE) +#define JORNADA_SCR PMU_BASE[0] /* System Control Register - scr */ +#define JORNADA_ASIC_SLEEP_EN 0x0001 +#define JORNADA_RCLK_EN 0x0002 /* 1=Enable internal system reference clock 3.6864MHz */ +#define JORNADA_INT_TEST_BIT 0x0004 +#define JORNADA_PLL_EN 0x0008 /*1=Enable PLL, 0=Bypass PLL */ +#define JORNADA_PLL_LOCK 0x0010 /*1=Locked, 0=Not locked */ +#define JORNADA_SPI_FCLK_EN 0x0020 +#define JORNADA_GPIOAFR PMU_BASE[1] /*GPIO Alternative Function Register - gpioafr */ +#define JORNADA_GP_PWM1 0x02 +#define JORNADA_GP_PWM2 0x04 +#define JORNADA_GP_MW 0x08 +#define JORNADA_GP_L3 0x10 +#define JORNADA_GP_SPI 0x20 +#define JORNADA_PWM1_CKDR PMU_BASE[2] +#define JORNADA_PWM2_CKDR PMU_BASE[3] +#define JORNADA_PCR PMU_BASE[4] /* Power Control register - pcr */ +#define JORNADA_L3CLK_EN 0x0001 +#define JORNADA_PWM1CLK_EN 0x0002 +#define JORNADA_PWM2CLK_EN 0x0004 +#define JORNADA_MW_CLK_EN 0x0010 +#define JORNADA_I2S_CLK_EN 0x0020 +#define JORNADA_GPIO_INT_CLK_EN 0x0040 +#define JORNADA_UART_CLK_EN 0x0080 +#define JORNADA_SM_CLK_EN 0x0100 +#define JORNADA_MMC_CLK_EN 0x0200 +#define JORNADA_SPI_CLK_EN 0x0400 +#define JORNADA_CF_CLK_EN 0x0800 +#define JORNADA_MUX_CLK0 0x1000 +#define JORNADA_MUX_CLK1 0x2000 +#if 0 /* don't use this register */ +#define JORNADA_SRR PMU_BASE[5] +#define JORNADA_L3_RST 0x0001 +#define JORNADA_PWM_RST 0x0002 +#define JORNADA_MW_RST 0x0008 +#define JORNADA_I2S_RST 0x0010 +#define JORNADA_AL_RST 0x0020 +#define JORNADA_GPIO_RST 0x0040 +#define JORNADA_INT_RST 0x0080 +#define JORNADA_UART_RST 0x0100 +#define JORNADA_SM_RST 0x0200 +#define JORNADA_MMC_RST 0x0400 +#define JORNADA_SPI_RST 0x0800 +#define JORNADA_CF_RST 0x1000 +#endif + +/* Interrupt Control Register Locations */ +#define INTR_BASE ((volatile long *)(JORNADA56X_ASIC_BASE+0x100)) +#define JORNADA_INT_EN INTR_BASE[0] +/* or to set, and to clear */ +#define JORNADA_INT_STAT INTR_BASE[1] /* write 1 to clear */ +/* Interrupt Source for Group 1 - int_en / int_stat */ +#define JORNADA_MMC_INT 0x0001 +#define JORNADA_MMC_DETECT_INT 0x0002 +#define JORNADA_MMC_REMOVE_INT 0x0004 +#define JORNADA_L3_DONE_INT 0x0008 +#define JORNADA_MW_TX_INT 0x0020 +#define JORNADA_MW_RX_INT 0x0040 +#define JORNADA_MW_TUR_INT 0x0080 +#define JORNADA_MW_TOR_INT 0x0100 +#define JORNADA_MW_ROR_INT 0x0200 +#define JORNADA_ALARM_ACK_INT 0x0400 +#define JORNADA_CF_REMOVE 0x0800 +#define JORNADA_GPIO_B_INT 0x1000 +#define JORNADA_GPIO_C_INT 0x2000 +#define JORNADA_INT_WK_EN INTR_BASE[2] +#define JORNADA_INT_WK_POL INTR_BASE[3] +#define JORNADA_INT_TEST INTR_BASE[4] +#define JORNADA_GPIOB_RE_EN INTR_BASE[5] /* rising edge enable */ +#define JORNADA_GPIOB_FE_EN INTR_BASE[6] /* falling edge */ +#define JORNADA_GPIOB_STAT INTR_BASE[7] +#define JORNADA_GPIOB_WK_EN INTR_BASE[8] +#define JORNADA_GPIOB_WK_POL INTR_BASE[9] +#define JORNADA_GPIOC_RE_EN INTR_BASE[10] +#define JORNADA_GPIOC_FE_EN INTR_BASE[11] +#define JORNADA_GPIOC_STAT INTR_BASE[12] +#define JORNADA_GPIOC_WK_EN INTR_BASE[13] +#define JORNADA_GPIOC_WK_POL INTR_BASE[14] +/* no inputs on gpio d */ +#define JORNADA_INT_EN2 INTR_BASE[15] +#define JORNADA_INT_STAT2 INTR_BASE[16] +/* Interrupt Source for Group 2 - int_en2 / int_stat2 */ +#define JORNADA_UART_INT 0x0001 +#define JORNADA_UART_RID_INT 0x0002 +#define JORNADA_SM_DETECT_INT 0x0004 +#define JORNADA_SM_REMOVE_INT 0x0008 +#define JORNADA_SM_RFS_INT 0x0010 +#define JORNADA_SM_TFS_INT 0x0020 +#define JORNADA_SM_RID_INT 0x0040 +#define JORNADA_SPI_TX_INT 0x0080 /*SPI_TX FIFO below threshold */ +#define JORNADA_SPI_RX_INT 0x0100 /*SPI_RX FIFO above threshold */ +#define JORNADA_SPI_TUR_INT 0x0200 /*SPI_TX FIFO under-run */ +#define JORNADA_SPI_TOR_INT 0x0400 /*SPI_TX FIFO overrun */ +#define JORNADA_SPI_ROR_INT 0x0800 /*SPI_RX FIFO overrun */ +#define JORNADA_CF_INT 0x1000 /*CF IREQ Interrupt */ +#define JORNADA_CF_INSERT 0x2000 /*CF Card Detect (insertion) */ +#define JORNADA_CF_STSCHG 0x4000 /*CF Status change */ +#define JORNADA_CF_WAIT_ERR 0x8000 /*CF wait time-out */ +#define JORNADA_INT_WK_EN2 INTR_BASE[17] /* wake up enable */ +#define JORNADA_INT_WK_POL2 INTR_BASE[18] /* wake up polarity rising/falling edge -not used */ +#define JORNADA_INT_TEST2 INTR_BASE[19] + +/* CF Control Register Locations */ +#define CF_BASE ((volatile long *)(JORNADA56X_ASIC_BASE+0x280)) +/* look at SA-1111 */ +#define JORNADA_CFSR CF_BASE[0] /* CF Status Register Bits */ +#define JORNADA_CF_READY 0x0001 +#define JORNADA_CF_VALID 0x0002 +#define JORNADA_CF_VS1 0x0004 +#define JORNADA_CF_VS2 0x0008 +#define JORNADA_CF_WP 0x0010 +#define JORNADA_CF_BVD1 0x0020 +#define JORNADA_CF_BVD2 0x0040 +#define JORNADA_CF_WAIT_TOUT 0x0080 +#define JORNADA_CF_INSERT_LATCH 0x0100 +#define JORNADA_CF_REMOVE_LATCH 0x0200 +#define JORNADA_CFCR CF_BASE[1] /* CF Status Register Bits */ +#define JORNADA_CF_RESET 0x0001 +#define JORNADA_CF_FLT 0x0002 +#define JORNADA_CF_PWAIT_EN 0x0004 +#define JORNADA_CF_SLEEPSTATE 0x0008 +#define JORNADA_CFWDCR CF_BASE[2] /* not used */ + +/* PWM Control Register Locations */ +#define PWM_BASE ((volatile long *)(JORNADA56X_ASIC_BASE+0x400)) +#define JORNADA_PWM_CTRL PWM_BASE[0] +#define JORNADA_PWM1_DATA PWM_BASE[1] +#define JORNADA_PWM2_DATA PWM_BASE[2] + +/* Microwire Control Register Locations */ +#define MICROWIRE_BASE ((volatile long *)(JORNADA56X_ASIC_BASE+0x500)) +#define JORNADA_MWCR MICROWIRE_BASE[0] /* Microwire Control register - mwcr */ +#define JORNADA_MW_EN 0x01 /* 1=Enable Microwire Controller */ +#define JORNADA_DSS_16_BIT 0x06 /* Receive data width = 16 bit */ +#define JORNADA_FIFO_RST 0x08 /* 1= Reset the FIFO */ +#define JORNADA_MWCR_V_SCR 8 /*Serial Clock Rate bit offset */ +#define JORNADA_MWDR MICROWIRE_BASE[1] +/* These values are for programming the AD7873 used for touchscreen + * and battery interface. + * See Table I of data sheet for bit values and Table II for bit positions + */ +#define JORNADA_MW_MAIN_BATTERY 0xa6 /* read main battery */ +#define JORNADA_MW_BACKUP_BATTERY 0xe6 /* read backup battery */ +#define JORNADA_MW_TOUCH_X 0x90 /* read touchscreen X location */ +#define JORNADA_MW_TOUCH_Y 0xD0 /* read touchscreen X location */ +#define JORNADA_MW_END JORNADA_MW_TOUCH_Y /* always end reads with this command */ +#define JORNADA_MWFSR MICROWIRE_BASE[2] /* FIFO Status Register -mwfsr */ +#define JORNADA_MW_TNE 0x0001 /*1=TX FIFO not empty */ +#define JORNADA_MW_TOR 0x0002 /*1=TX FIFO overrun: try to write when FIFO is full */ +#define JORNADA_MW_TFL 0x0004 /*1=TX FIFO is full */ +#define JORNADA_MW_RNE 0x0008 /*1=RX FIFO not empty */ +#define JORNADA_MW_BSY 0x0010 /*1=Busy TX or RX */ +#define JORNADA_MW_TFS 0x0020 /*1=TX FIFO is <= TFL threshold request int */ +#define JORNADA_MW_RFS 0x0040 /*1=RX FIFO is => RFL threshold request int */ +#define JORNADA_MW_ROR 0x0080 /*1=RX FIFO overrun: FIFO full request int */ +#define JORNADA_MWFER MICROWIRE_BASE[3] +#define JORNADA_MWFTR MICROWIRE_BASE[4] /* FIFO Control Register mwftr */ +#define JORNADA_MWFTR_V_TFT 0 /*Transmit FIFO threshold bit offset */ +#define JORNADA_MWFTR_V_RFT 5 /*Receive FIFO threshold bit offset */ + + +/* L3 Control Register Locations */ +#define L3_BASE ((volatile long *)(JORNADA56X_ASIC_BASE+0x600)) + +#define JORNADA_L3CFR L3_BASE[0] +#define JORNADA_L3_EN 0x01 +#define JORNADA_L3_READ_TRG 0x02 +#define JORNADA_L3_ADDR_DONE 0x04 +#define JORNADA_L3_DATA_DONE 0x08 +#define JORNADA_L3_READ_DONE 0x10 +#define JORNADA_L3CAR L3_BASE[1] /* address reg */ +#define JORNADA_L3CDW L3_BASE[2] /* data write */ +#define JORNADA_L3CDR L3_BASE[3] /* data read doesn't work */ + + +/* HP ASIC GPIO Control Register Locations */ +#define JORNADA_E_GPIO_BASE ((volatile long *)(JORNADA56X_ASIC_BASE+0x700)) +#define JORNADA_GPBPSR JORNADA_E_GPIO_BASE[1] +/* B[0-3] is freq setting for audio */ +/* B[6-8] are rows, B[9-13] are columns for button scan input */ +/* The light sensor is a GPIO interrupt connected to the HP ASIC GPIO B14. + * If the GPIO is high, means the lower + * threshold has been crossed and the front light should be turned on. */ +#define JORNADA_GPCPSR JORNADA_E_GPIO_BASE[2] +#define JORNADA_GPBPCR JORNADA_E_GPIO_BASE[4] +#define JORNADA_GPCPCR JORNADA_E_GPIO_BASE[5] +#define JORNADA_GPBPLR JORNADA_E_GPIO_BASE[7] +#define JORNADA_GPCPLR JORNADA_E_GPIO_BASE[8] +#define JORNADA_GPBPDR JORNADA_E_GPIO_BASE[10] +#define JORNADA_GPCPDR JORNADA_E_GPIO_BASE[11] +#define JORNADA_GPBPSDR JORNADA_E_GPIO_BASE[13] +#define JORNADA_GPCPSDR JORNADA_E_GPIO_BASE[14] +#define JORNADA_GPBPSLR JORNADA_E_GPIO_BASE[16] +#define JORNADA_GPCPSLR JORNADA_E_GPIO_BASE[17] +#define JORNADA_GPBPFDR JORNADA_E_GPIO_BASE[19] +#define JORNADA_GPCPFDR JORNADA_E_GPIO_BASE[20] +#define JORNADA_GPBPFLR JORNADA_E_GPIO_BASE[22] +#define JORNADA_GPCPFLR JORNADA_E_GPIO_BASE[23] +#define JORNADA_GPDPSR JORNADA_E_GPIO_BASE[24] +#define JORNADA_RS232_ON GPIO_GPIO1 /* GPIO D */ +#define JORNADA_CF_POWER_OFF GPIO_GPIO7 /* GPIO D (0 -> power on!) */ +#define JORNADA_BACKLIGHT GPIO_GPIO15 /* GPIO D (0 -> light on!) */ +#define JORNADA_GPDPCR JORNADA_E_GPIO_BASE[25] +#define JORNADA_GPDPLR JORNADA_E_GPIO_BASE[26] +#define JORNADA_GPDPDR JORNADA_E_GPIO_BASE[27] +#define JORNADA_GPDPSDR JORNADA_E_GPIO_BASE[28] +#define JORNADA_GPDPSLR JORNADA_E_GPIO_BASE[29] +#define JORNADA_GPDPFDR JORNADA_E_GPIO_BASE[30] +#define JORNADA_GPDPFLR JORNADA_E_GPIO_BASE[31] + +/* IRQs */ +enum irq_mmc { + IRQ_MMC_MAIN = IRQ_BOARD_END, + IRQ_MMC_DETECT, + IRQ_MMC_REMOVE, +}; + +enum irq_l3 { + IRQ_L3_DONE = IRQ_BOARD_END + 3, +}; + +enum irq_microwire { + IRQ_MICROWIRE_TX = IRQ_BOARD_END + 5, + IRQ_MICROWIRE_RX, + IRQ_MICROWIRE_TX_UNDERRUN, + IRQ_MICROWIRE_TX_OVERRUN, + IRQ_MICROWIRE_RX_OVERRUN, +}; + +enum irq_button { + IRQ_BUTTON_POWER = IRQ_GPIO0, + IRQ_BUTTON_LED = IRQ_BOARD_END + 10, + IRQ_BUTTON_DPADUP_DPADLEFT_HOME = IRQ_BOARD_END + 41, + IRQ_BUTTON_DPADDOWN_DPADRIGHT_CONTACTS, + IRQ_BUTTON_DPADCENTRE_CALENDAR, + IRQ_BUTTON_ROCKERUP_TASKS, + IRQ_BUTTON_ROCKERDOWN_RECORD, +}; + +enum irq_pcmcia { + IRQ_PCMCIA_MAIN = IRQ_BOARD_END + 28, + IRQ_PCMCIA_INSERT, + IRQ_PCMCIA_REMOVE = IRQ_BOARD_END + 11, + IRQ_PCMCIA_STATUSCHANGE = IRQ_BOARD_END + 30, + IRQ_PCMCIA_WAIT_ERROR, +}; + +enum irq_gpiob { + IRQ_GPIOB_MAIN = IRQ_BOARD_END + 12, + IRQ_GPIOB_B0 = IRQ_BOARD_END + 32, + IRQ_GPIOB_B15 = IRQ_BOARD_END + 47, +}; + +enum irq_gpioc { + IRQ_GPIOC_MAIN = IRQ_BOARD_END + 13, + IRQ_GPIOC_C0 = IRQ_BOARD_END + 48, + IRQ_GPIOC_C15 = IRQ_BOARD_END + 63, +}; + +enum irq_uart { + IRQ_UART_MAIN = IRQ_BOARD_END + 16, + IRQ_UART_RID, +}; + +enum irq_sm { + IRQ_SM_DETECT = IRQ_BOARD_END + 18, + IRQ_SM_REMOVE, + IRQ_SM_RFS, + IRQ_SM_TFS, + IRQ_SM_RID, +}; + +enum irq_spi { + IRQ_SPI_TX = IRQ_BOARD_END + 23, + IRQ_SM_RX, + IRQ_SM_TX_UNDERRUN, + IRQ_SM_TX_OVERRUN, + IRQ_SM_RX_OVERRUN, +}; + +void jornada56x_asic_setup(void); +void jornada56x_asic_init_irq(void); +irqreturn_t jornada56x_IRQ_demux(int irq, void *dev_id); + +#endif +#endif /* __ASM_ARCH_JORNADA56X_H */ |