1e85390dcSwdenk /* 2e85390dcSwdenk * (C) Copyright 2000 3e85390dcSwdenk * Rob Taylor, Flying Pig Systems. robt@flyingpig.com. 4e85390dcSwdenk * 5e85390dcSwdenk * See file CREDITS for list of people who contributed to this 6e85390dcSwdenk * project. 7e85390dcSwdenk * 8e85390dcSwdenk * This program is free software; you can redistribute it and/or 9e85390dcSwdenk * modify it under the terms of the GNU General Public License as 10e85390dcSwdenk * published by the Free Software Foundation; either version 2 of 11e85390dcSwdenk * the License, or (at your option) any later version. 12e85390dcSwdenk * 13e85390dcSwdenk * This program is distributed in the hope that it will be useful, 14e85390dcSwdenk * but WITHOUT ANY WARRANTY; without even the implied warranty of 15e85390dcSwdenk * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16e85390dcSwdenk * GNU General Public License for more details. 17e85390dcSwdenk * 18e85390dcSwdenk * You should have received a copy of the GNU General Public License 19e85390dcSwdenk * along with this program; if not, write to the Free Software 20e85390dcSwdenk * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 21e85390dcSwdenk * MA 02111-1307 USA 22e85390dcSwdenk */ 23e85390dcSwdenk 24e85390dcSwdenk #ifndef _NS87308_H_ 25e85390dcSwdenk #define _NS87308_H_ 26e85390dcSwdenk 27e85390dcSwdenk #include <asm/pci_io.h> 28e85390dcSwdenk 29e85390dcSwdenk /* Note: I couldn't find a full data sheet for the ns87308, but the ns87307 seems to be pretty 30e85390dcSwdenk functionally- (and pin-) equivalent to the 87308, but the 308 has better ir support. */ 31e85390dcSwdenk 32e85390dcSwdenk void initialise_ns87308(void); 33e85390dcSwdenk 34e85390dcSwdenk /* 35e85390dcSwdenk * The following struct represents the GPIO registers on the NS87308/NS97307 36e85390dcSwdenk */ 37e85390dcSwdenk struct GPIO 38e85390dcSwdenk { 39e85390dcSwdenk unsigned char dta1; /* 0 data port 1 */ 40e85390dcSwdenk unsigned char dir1; /* 1 direction port 1 */ 41e85390dcSwdenk unsigned char out1; /* 2 output type port 1 */ 42e85390dcSwdenk unsigned char puc1; /* 3 pull-up control port 1 */ 43e85390dcSwdenk unsigned char dta2; /* 4 data port 2 */ 44e85390dcSwdenk unsigned char dir2; /* 5 direction port 2 */ 45e85390dcSwdenk unsigned char out2; /* 6 output type port 2 */ 46e85390dcSwdenk unsigned char puc2; /* 7 pull-up control port 2 */ 47e85390dcSwdenk }; 48e85390dcSwdenk 49e85390dcSwdenk /* 50e85390dcSwdenk * The following represents the power management registers on the NS87308/NS97307 51e85390dcSwdenk */ 52e85390dcSwdenk #define PWM_FER1 0 /* 0 function enable reg. 1 */ 53e85390dcSwdenk #define PWM_FER2 1 /* 1 function enable reg. 2 */ 54e85390dcSwdenk #define PWM_PMC1 2 /* 2 power mgmt. control 1 */ 55e85390dcSwdenk #define PWM_PMC2 3 /* 3 power mgmt. control 2 */ 56e85390dcSwdenk #define PWM_PMC3 4 /* 4 power mgmt. control 3 */ 57e85390dcSwdenk #define PWM_WDTO 5 /* 5 watchdog time-out */ 58e85390dcSwdenk #define PWM_WDCF 6 /* 6 watchdog config. */ 59e85390dcSwdenk #define PWM_WDST 7 /* 7 watchdog status */ 60e85390dcSwdenk 61e85390dcSwdenk /*PNP config registers: 62e85390dcSwdenk * these depend on the stated of BADDR1 and BADDR0 on startup 63e85390dcSwdenk * so there's three versions here with the last two digits indicating 64e85390dcSwdenk * for which configuration their valid 65e85390dcSwdenk * the 1st of the two digits indicates the state of BADDR1 66e85390dcSwdenk * the 2st of the two digits indicates the state of BADDR0 67e85390dcSwdenk */ 68e85390dcSwdenk 69e85390dcSwdenk 70e85390dcSwdenk #define IO_INDEX_OFFSET_0x 0x0279 /* full PnP isa Mode */ 71e85390dcSwdenk #define IO_INDEX_OFFSET_10 0x015C /* PnP motherboard mode */ 72e85390dcSwdenk #define IO_INDEX_OFFSET_11 0x002E /* PnP motherboard mode */ 73e85390dcSwdenk #define IO_DATA_OFFSET_0x 0x0A79 /* full PnP isa Mode */ 74e85390dcSwdenk #define IO_DATA_OFFSET_10 0x015D /* PnP motherboard mode */ 75e85390dcSwdenk #define IO_DATA_OFFSET_11 0x002F /* PnP motherboard mode */ 76e85390dcSwdenk 77*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SYS_NS87308_BADDR_0x) 78*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_INDEX (CONFIG_SYS_ISA_IO + IO_INDEX_OFFSET_0x) 79*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_DATA (CONFIG_SYS_ISA_IO + IO_DATA_OFFSET_0x) 80*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #elif defined(CONFIG_SYS_NS87308_BADDR_10) 81*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_INDEX (CONFIG_SYS_ISA_IO + IO_INDEX_OFFSET_10) 82*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_DATA (CONFIG_SYS_ISA_IO + IO_DATA_OFFSET_10) 83*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #elif defined(CONFIG_SYS_NS87308_BADDR_11) 84*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_INDEX (CONFIG_SYS_ISA_IO + IO_INDEX_OFFSET_11) 85*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_DATA (CONFIG_SYS_ISA_IO + IO_DATA_OFFSET_11) 86e85390dcSwdenk #endif 87e85390dcSwdenk 88e85390dcSwdenk /* PnP register definitions */ 89e85390dcSwdenk 90e85390dcSwdenk #define SET_RD_DATA_PORT 0x00 91e85390dcSwdenk #define SERIAL_ISOLATION 0x01 92e85390dcSwdenk #define CONFIG_CONTROL 0x02 93e85390dcSwdenk #define WAKE_CSN 0x03 94e85390dcSwdenk #define RES_DATA 0x04 95e85390dcSwdenk #define STATUS 0x05 96e85390dcSwdenk #define SET_CSN 0x06 97e85390dcSwdenk #define LOGICAL_DEVICE 0x07 98e85390dcSwdenk 99e85390dcSwdenk /*vendor defined values */ 100e85390dcSwdenk #define SID_REG 0x20 101e85390dcSwdenk #define SUPOERIO_CONF1 0x21 102e85390dcSwdenk #define SUPOERIO_CONF2 0x22 103e85390dcSwdenk #define PGCS_INDEX 0x23 104e85390dcSwdenk #define PGCS_DATA 0x24 105e85390dcSwdenk 106e85390dcSwdenk /* values above 30 are different for each logical device 107e85390dcSwdenk but I can't be arsed to enter them all. the ones here 108e85390dcSwdenk are pretty consistent between all logical devices 109e85390dcSwdenk feel free to correct the situation if you want.. ;) 110e85390dcSwdenk */ 111e85390dcSwdenk #define ACTIVATE 0x30 112e85390dcSwdenk #define ACTIVATE_OFF 0x00 113e85390dcSwdenk #define ACTIVATE_ON 0x01 114e85390dcSwdenk 115e85390dcSwdenk #define BASE_ADDR_HIGH 0x60 116e85390dcSwdenk #define BASE_ADDR_LOW 0x61 117e85390dcSwdenk #define LUN_CONFIG_REG 0xF0 118e85390dcSwdenk #define DBASE_HIGH 0x60 /* SIO KBC data base address, 15:8 */ 119e85390dcSwdenk #define DBASE_LOW 0x61 /* SIO KBC data base address, 7:0 */ 120e85390dcSwdenk #define CBASE_HIGH 0x62 /* SIO KBC command base addr, 15:8 */ 121e85390dcSwdenk #define CBASE_LOW 0x63 /* SIO KBC command base addr, 7:0 */ 122e85390dcSwdenk 123e85390dcSwdenk /* the logical devices*/ 124e85390dcSwdenk #define LDEV_KBC1 0x00 /* 2 devices for keyboard and mouse controller*/ 125e85390dcSwdenk #define LDEV_KBC2 0x01 126e85390dcSwdenk #define LDEV_MOUSE 0x01 127e85390dcSwdenk #define LDEV_RTC_APC 0x02 /*Real Time Clock and Advanced Power Control*/ 128e85390dcSwdenk #define LDEV_FDC 0x03 /*floppy disk controller*/ 129e85390dcSwdenk #define LDEV_PARP 0x04 /*Parallel port*/ 130e85390dcSwdenk #define LDEV_UART2 0x05 131e85390dcSwdenk #define LDEV_UART1 0x06 132e85390dcSwdenk #define LDEV_GPIO 0x07 /*General Purpose IO and chip select output signals*/ 133e85390dcSwdenk #define LDEV_POWRMAN 0x08 /*Power Managment*/ 134e85390dcSwdenk 135*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_KBC1 (1 << LDEV_KBC1) 136*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_KBC2 (1 << LDEV_KBC2) 137*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_MOUSE (1 << LDEV_MOUSE) 138*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_RTC_APC (1 << LDEV_RTC_APC) 139*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_FDC (1 << LDEV_FDC) 140*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_PARP (1 << LDEV_PARP) 141*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_UART2 (1 << LDEV_UART2) 142*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_UART1 (1 << LDEV_UART1) 143*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_GPIO (1 << LDEV_GPIO) 144*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_POWRMAN (1 << LDEV_POWRMAN) 145e85390dcSwdenk 146e85390dcSwdenk /*some functions and macro's for doing configuration */ 147e85390dcSwdenk 148e85390dcSwdenk static inline void read_pnp_config(unsigned char index, unsigned char *data) 149e85390dcSwdenk { 150e85390dcSwdenk pci_writeb(index,IO_INDEX); 151e85390dcSwdenk pci_readb(IO_DATA, *data); 152e85390dcSwdenk } 153e85390dcSwdenk 154e85390dcSwdenk static inline void write_pnp_config(unsigned char index, unsigned char data) 155e85390dcSwdenk { 156e85390dcSwdenk pci_writeb(index,IO_INDEX); 157e85390dcSwdenk pci_writeb(data, IO_DATA); 158e85390dcSwdenk } 159e85390dcSwdenk 160e85390dcSwdenk static inline void pnp_set_device(unsigned char dev) 161e85390dcSwdenk { 162e85390dcSwdenk write_pnp_config(LOGICAL_DEVICE, dev); 163e85390dcSwdenk } 164e85390dcSwdenk 165e85390dcSwdenk static inline void write_pm_reg(unsigned short base, unsigned char index, unsigned char data) 166e85390dcSwdenk { 167*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_writeb(index, CONFIG_SYS_ISA_IO + base); 168e85390dcSwdenk eieio(); 169*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_writeb(data, CONFIG_SYS_ISA_IO + base + 1); 170e85390dcSwdenk } 171e85390dcSwdenk 172e85390dcSwdenk /*void write_pnp_config(unsigned char index, unsigned char data); 173e85390dcSwdenk void pnp_set_device(unsigned char dev); 174e85390dcSwdenk */ 175e85390dcSwdenk 176e85390dcSwdenk #define PNP_SET_DEVICE_BASE(dev,base) \ 177e85390dcSwdenk pnp_set_device(dev); \ 178e85390dcSwdenk write_pnp_config(ACTIVATE, ACTIVATE_OFF); \ 179e85390dcSwdenk write_pnp_config(BASE_ADDR_HIGH, ((base) >> 8) & 0xff ); \ 180e85390dcSwdenk write_pnp_config(BASE_ADDR_LOW, (base) &0xff); \ 181e85390dcSwdenk write_pnp_config(ACTIVATE, ACTIVATE_ON); 182e85390dcSwdenk 183e85390dcSwdenk #define PNP_ACTIVATE_DEVICE(dev) \ 184e85390dcSwdenk pnp_set_device(dev); \ 185e85390dcSwdenk write_pnp_config(ACTIVATE, ACTIVATE_ON); 186e85390dcSwdenk 187e85390dcSwdenk #define PNP_DEACTIVATE_DEVICE(dev) \ 188e85390dcSwdenk pnp_set_device(dev); \ 189e85390dcSwdenk write_pnp_config(ACTIVATE, ACTIVATE_OFF); 190e85390dcSwdenk 191e85390dcSwdenk 192e85390dcSwdenk static inline void write_pgcs_config(unsigned char index, unsigned char data) 193e85390dcSwdenk { 194e85390dcSwdenk write_pnp_config(PGCS_INDEX, index); 195e85390dcSwdenk write_pnp_config(PGCS_DATA, data); 196e85390dcSwdenk } 197e85390dcSwdenk 198e85390dcSwdenk /* these macrose configure the 3 CS lines 199e85390dcSwdenk on the sandpoint board these controll NVRAM 200e85390dcSwdenk CS0 is connected to NVRAMCS 201e85390dcSwdenk CS1 is connected to NVRAMAS0 202e85390dcSwdenk CS2 is connected to NVRAMAS1 203e85390dcSwdenk */ 204e85390dcSwdenk #define PGCS_CS_ASSERT_ON_WRITE 0x10 205e85390dcSwdenk #define PGCS_CS_ASSERT_ON_READ 0x20 206e85390dcSwdenk 207e85390dcSwdenk #define PNP_PGCS_CSLINE_BASE(cs, base) \ 208e85390dcSwdenk write_pgcs_config((cs) << 2, ((base) >> 8) & 0xff ); \ 209e85390dcSwdenk write_pgcs_config(((cs) << 2) + 1, (base) & 0xff ); 210e85390dcSwdenk 211e85390dcSwdenk #define PNP_PGCS_CSLINE_CONF(cs, conf) \ 212e85390dcSwdenk write_pgcs_config(((cs) << 2) + 2, (conf) ); 213e85390dcSwdenk 214e85390dcSwdenk 215e85390dcSwdenk /* The following sections are for 87308 extensions to the standard compoents it emulates */ 216e85390dcSwdenk 217e85390dcSwdenk /* extensions to 16550*/ 218e85390dcSwdenk 219e85390dcSwdenk #define MCR_MDSL_MSK 0xe0 /*mode select mask*/ 220e85390dcSwdenk #define MCR_MDSL_UART 0x00 /*uart, default*/ 221e85390dcSwdenk #define MCR_MDSL_SHRPIR 0x02 /*Sharp IR*/ 222e85390dcSwdenk #define MCR_MDSL_SIR 0x03 /*SIR*/ 223e85390dcSwdenk #define MCR_MDSL_CIR 0x06 /*Consumer IR*/ 224e85390dcSwdenk 225e85390dcSwdenk #define FCR_TXFTH0 0x10 /* these bits control threshod of data level in fifo */ 226e85390dcSwdenk #define FCR_TXFTH1 0x20 /* for interrupt trigger */ 227e85390dcSwdenk 228e85390dcSwdenk /* 229e85390dcSwdenk * Default NS87308 configuration 230e85390dcSwdenk */ 231*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_KBC1_BASE 232*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_KBC1_BASE 0x0060 233e85390dcSwdenk #endif 234*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_RTC_BASE 235*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_RTC_BASE 0x0070 236e85390dcSwdenk #endif 237*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_FDC_BASE 238*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_FDC_BASE 0x03F0 239e85390dcSwdenk #endif 240*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_LPT_BASE 241*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_LPT_BASE 0x0278 242e85390dcSwdenk #endif 243*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_UART1_BASE 244*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_UART1_BASE 0x03F8 245e85390dcSwdenk #endif 246*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_UART2_BASE 247*6d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_UART2_BASE 0x02F8 248e85390dcSwdenk #endif 249e85390dcSwdenk 250e85390dcSwdenk #endif /*_NS87308_H_*/ 251