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