1e85390dcSwdenk /* 2e85390dcSwdenk * (C) Copyright 2000 3e85390dcSwdenk * Rob Taylor, Flying Pig Systems. robt@flyingpig.com. 4e85390dcSwdenk * 5*1a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+ 6e85390dcSwdenk */ 7e85390dcSwdenk 8e85390dcSwdenk #ifndef _NS87308_H_ 9e85390dcSwdenk #define _NS87308_H_ 10e85390dcSwdenk 11e85390dcSwdenk #include <asm/pci_io.h> 12e85390dcSwdenk 13e85390dcSwdenk /* Note: I couldn't find a full data sheet for the ns87308, but the ns87307 seems to be pretty 14e85390dcSwdenk functionally- (and pin-) equivalent to the 87308, but the 308 has better ir support. */ 15e85390dcSwdenk 16e85390dcSwdenk void initialise_ns87308(void); 17e85390dcSwdenk 18e85390dcSwdenk /* 19e85390dcSwdenk * The following struct represents the GPIO registers on the NS87308/NS97307 20e85390dcSwdenk */ 21e85390dcSwdenk struct GPIO 22e85390dcSwdenk { 23e85390dcSwdenk unsigned char dta1; /* 0 data port 1 */ 24e85390dcSwdenk unsigned char dir1; /* 1 direction port 1 */ 25e85390dcSwdenk unsigned char out1; /* 2 output type port 1 */ 26e85390dcSwdenk unsigned char puc1; /* 3 pull-up control port 1 */ 27e85390dcSwdenk unsigned char dta2; /* 4 data port 2 */ 28e85390dcSwdenk unsigned char dir2; /* 5 direction port 2 */ 29e85390dcSwdenk unsigned char out2; /* 6 output type port 2 */ 30e85390dcSwdenk unsigned char puc2; /* 7 pull-up control port 2 */ 31e85390dcSwdenk }; 32e85390dcSwdenk 33e85390dcSwdenk /* 34e85390dcSwdenk * The following represents the power management registers on the NS87308/NS97307 35e85390dcSwdenk */ 36e85390dcSwdenk #define PWM_FER1 0 /* 0 function enable reg. 1 */ 37e85390dcSwdenk #define PWM_FER2 1 /* 1 function enable reg. 2 */ 38e85390dcSwdenk #define PWM_PMC1 2 /* 2 power mgmt. control 1 */ 39e85390dcSwdenk #define PWM_PMC2 3 /* 3 power mgmt. control 2 */ 40e85390dcSwdenk #define PWM_PMC3 4 /* 4 power mgmt. control 3 */ 41e85390dcSwdenk #define PWM_WDTO 5 /* 5 watchdog time-out */ 42e85390dcSwdenk #define PWM_WDCF 6 /* 6 watchdog config. */ 43e85390dcSwdenk #define PWM_WDST 7 /* 7 watchdog status */ 44e85390dcSwdenk 45e85390dcSwdenk /*PNP config registers: 46e85390dcSwdenk * these depend on the stated of BADDR1 and BADDR0 on startup 47e85390dcSwdenk * so there's three versions here with the last two digits indicating 48e85390dcSwdenk * for which configuration their valid 49e85390dcSwdenk * the 1st of the two digits indicates the state of BADDR1 50e85390dcSwdenk * the 2st of the two digits indicates the state of BADDR0 51e85390dcSwdenk */ 52e85390dcSwdenk 53e85390dcSwdenk 54e85390dcSwdenk #define IO_INDEX_OFFSET_0x 0x0279 /* full PnP isa Mode */ 55e85390dcSwdenk #define IO_INDEX_OFFSET_10 0x015C /* PnP motherboard mode */ 56e85390dcSwdenk #define IO_INDEX_OFFSET_11 0x002E /* PnP motherboard mode */ 57e85390dcSwdenk #define IO_DATA_OFFSET_0x 0x0A79 /* full PnP isa Mode */ 58e85390dcSwdenk #define IO_DATA_OFFSET_10 0x015D /* PnP motherboard mode */ 59e85390dcSwdenk #define IO_DATA_OFFSET_11 0x002F /* PnP motherboard mode */ 60e85390dcSwdenk 616d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #if defined(CONFIG_SYS_NS87308_BADDR_0x) 626d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_INDEX (CONFIG_SYS_ISA_IO + IO_INDEX_OFFSET_0x) 636d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_DATA (CONFIG_SYS_ISA_IO + IO_DATA_OFFSET_0x) 646d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #elif defined(CONFIG_SYS_NS87308_BADDR_10) 656d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_INDEX (CONFIG_SYS_ISA_IO + IO_INDEX_OFFSET_10) 666d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_DATA (CONFIG_SYS_ISA_IO + IO_DATA_OFFSET_10) 676d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #elif defined(CONFIG_SYS_NS87308_BADDR_11) 686d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_INDEX (CONFIG_SYS_ISA_IO + IO_INDEX_OFFSET_11) 696d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define IO_DATA (CONFIG_SYS_ISA_IO + IO_DATA_OFFSET_11) 70e85390dcSwdenk #endif 71e85390dcSwdenk 72e85390dcSwdenk /* PnP register definitions */ 73e85390dcSwdenk 74e85390dcSwdenk #define SET_RD_DATA_PORT 0x00 75e85390dcSwdenk #define SERIAL_ISOLATION 0x01 76e85390dcSwdenk #define CONFIG_CONTROL 0x02 77e85390dcSwdenk #define WAKE_CSN 0x03 78e85390dcSwdenk #define RES_DATA 0x04 79e85390dcSwdenk #define STATUS 0x05 80e85390dcSwdenk #define SET_CSN 0x06 81e85390dcSwdenk #define LOGICAL_DEVICE 0x07 82e85390dcSwdenk 83e85390dcSwdenk /*vendor defined values */ 84e85390dcSwdenk #define SID_REG 0x20 85e85390dcSwdenk #define SUPOERIO_CONF1 0x21 86e85390dcSwdenk #define SUPOERIO_CONF2 0x22 87e85390dcSwdenk #define PGCS_INDEX 0x23 88e85390dcSwdenk #define PGCS_DATA 0x24 89e85390dcSwdenk 90e85390dcSwdenk /* values above 30 are different for each logical device 91e85390dcSwdenk but I can't be arsed to enter them all. the ones here 92e85390dcSwdenk are pretty consistent between all logical devices 93e85390dcSwdenk feel free to correct the situation if you want.. ;) 94e85390dcSwdenk */ 95e85390dcSwdenk #define ACTIVATE 0x30 96e85390dcSwdenk #define ACTIVATE_OFF 0x00 97e85390dcSwdenk #define ACTIVATE_ON 0x01 98e85390dcSwdenk 99e85390dcSwdenk #define BASE_ADDR_HIGH 0x60 100e85390dcSwdenk #define BASE_ADDR_LOW 0x61 101e85390dcSwdenk #define LUN_CONFIG_REG 0xF0 102e85390dcSwdenk #define DBASE_HIGH 0x60 /* SIO KBC data base address, 15:8 */ 103e85390dcSwdenk #define DBASE_LOW 0x61 /* SIO KBC data base address, 7:0 */ 104e85390dcSwdenk #define CBASE_HIGH 0x62 /* SIO KBC command base addr, 15:8 */ 105e85390dcSwdenk #define CBASE_LOW 0x63 /* SIO KBC command base addr, 7:0 */ 106e85390dcSwdenk 107e85390dcSwdenk /* the logical devices*/ 108e85390dcSwdenk #define LDEV_KBC1 0x00 /* 2 devices for keyboard and mouse controller*/ 109e85390dcSwdenk #define LDEV_KBC2 0x01 110e85390dcSwdenk #define LDEV_MOUSE 0x01 111e85390dcSwdenk #define LDEV_RTC_APC 0x02 /*Real Time Clock and Advanced Power Control*/ 112e85390dcSwdenk #define LDEV_FDC 0x03 /*floppy disk controller*/ 113e85390dcSwdenk #define LDEV_PARP 0x04 /*Parallel port*/ 114e85390dcSwdenk #define LDEV_UART2 0x05 115e85390dcSwdenk #define LDEV_UART1 0x06 116e85390dcSwdenk #define LDEV_GPIO 0x07 /*General Purpose IO and chip select output signals*/ 117e85390dcSwdenk #define LDEV_POWRMAN 0x08 /*Power Managment*/ 118e85390dcSwdenk 1196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_KBC1 (1 << LDEV_KBC1) 1206d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_KBC2 (1 << LDEV_KBC2) 1216d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_MOUSE (1 << LDEV_MOUSE) 1226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_RTC_APC (1 << LDEV_RTC_APC) 1236d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_FDC (1 << LDEV_FDC) 1246d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_PARP (1 << LDEV_PARP) 1256d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_UART2 (1 << LDEV_UART2) 1266d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_UART1 (1 << LDEV_UART1) 1276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_GPIO (1 << LDEV_GPIO) 1286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_POWRMAN (1 << LDEV_POWRMAN) 129e85390dcSwdenk 130e85390dcSwdenk /*some functions and macro's for doing configuration */ 131e85390dcSwdenk 132e85390dcSwdenk static inline void read_pnp_config(unsigned char index, unsigned char *data) 133e85390dcSwdenk { 134e85390dcSwdenk pci_writeb(index,IO_INDEX); 135e85390dcSwdenk pci_readb(IO_DATA, *data); 136e85390dcSwdenk } 137e85390dcSwdenk 138e85390dcSwdenk static inline void write_pnp_config(unsigned char index, unsigned char data) 139e85390dcSwdenk { 140e85390dcSwdenk pci_writeb(index,IO_INDEX); 141e85390dcSwdenk pci_writeb(data, IO_DATA); 142e85390dcSwdenk } 143e85390dcSwdenk 144e85390dcSwdenk static inline void pnp_set_device(unsigned char dev) 145e85390dcSwdenk { 146e85390dcSwdenk write_pnp_config(LOGICAL_DEVICE, dev); 147e85390dcSwdenk } 148e85390dcSwdenk 149e85390dcSwdenk static inline void write_pm_reg(unsigned short base, unsigned char index, unsigned char data) 150e85390dcSwdenk { 1516d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_writeb(index, CONFIG_SYS_ISA_IO + base); 152e85390dcSwdenk eieio(); 1536d0f6bcfSJean-Christophe PLAGNIOL-VILLARD pci_writeb(data, CONFIG_SYS_ISA_IO + base + 1); 154e85390dcSwdenk } 155e85390dcSwdenk 156e85390dcSwdenk /*void write_pnp_config(unsigned char index, unsigned char data); 157e85390dcSwdenk void pnp_set_device(unsigned char dev); 158e85390dcSwdenk */ 159e85390dcSwdenk 160e85390dcSwdenk #define PNP_SET_DEVICE_BASE(dev,base) \ 161e85390dcSwdenk pnp_set_device(dev); \ 162e85390dcSwdenk write_pnp_config(ACTIVATE, ACTIVATE_OFF); \ 163e85390dcSwdenk write_pnp_config(BASE_ADDR_HIGH, ((base) >> 8) & 0xff ); \ 164e85390dcSwdenk write_pnp_config(BASE_ADDR_LOW, (base) &0xff); \ 165e85390dcSwdenk write_pnp_config(ACTIVATE, ACTIVATE_ON); 166e85390dcSwdenk 167e85390dcSwdenk #define PNP_ACTIVATE_DEVICE(dev) \ 168e85390dcSwdenk pnp_set_device(dev); \ 169e85390dcSwdenk write_pnp_config(ACTIVATE, ACTIVATE_ON); 170e85390dcSwdenk 171e85390dcSwdenk #define PNP_DEACTIVATE_DEVICE(dev) \ 172e85390dcSwdenk pnp_set_device(dev); \ 173e85390dcSwdenk write_pnp_config(ACTIVATE, ACTIVATE_OFF); 174e85390dcSwdenk 175e85390dcSwdenk 176e85390dcSwdenk static inline void write_pgcs_config(unsigned char index, unsigned char data) 177e85390dcSwdenk { 178e85390dcSwdenk write_pnp_config(PGCS_INDEX, index); 179e85390dcSwdenk write_pnp_config(PGCS_DATA, data); 180e85390dcSwdenk } 181e85390dcSwdenk 182e85390dcSwdenk /* these macrose configure the 3 CS lines 183e85390dcSwdenk on the sandpoint board these controll NVRAM 184e85390dcSwdenk CS0 is connected to NVRAMCS 185e85390dcSwdenk CS1 is connected to NVRAMAS0 186e85390dcSwdenk CS2 is connected to NVRAMAS1 187e85390dcSwdenk */ 188e85390dcSwdenk #define PGCS_CS_ASSERT_ON_WRITE 0x10 189e85390dcSwdenk #define PGCS_CS_ASSERT_ON_READ 0x20 190e85390dcSwdenk 191e85390dcSwdenk #define PNP_PGCS_CSLINE_BASE(cs, base) \ 192e85390dcSwdenk write_pgcs_config((cs) << 2, ((base) >> 8) & 0xff ); \ 193e85390dcSwdenk write_pgcs_config(((cs) << 2) + 1, (base) & 0xff ); 194e85390dcSwdenk 195e85390dcSwdenk #define PNP_PGCS_CSLINE_CONF(cs, conf) \ 196e85390dcSwdenk write_pgcs_config(((cs) << 2) + 2, (conf) ); 197e85390dcSwdenk 198e85390dcSwdenk 199e85390dcSwdenk /* The following sections are for 87308 extensions to the standard compoents it emulates */ 200e85390dcSwdenk 201e85390dcSwdenk /* extensions to 16550*/ 202e85390dcSwdenk 203e85390dcSwdenk #define MCR_MDSL_MSK 0xe0 /*mode select mask*/ 204e85390dcSwdenk #define MCR_MDSL_UART 0x00 /*uart, default*/ 205e85390dcSwdenk #define MCR_MDSL_SHRPIR 0x02 /*Sharp IR*/ 206e85390dcSwdenk #define MCR_MDSL_SIR 0x03 /*SIR*/ 207e85390dcSwdenk #define MCR_MDSL_CIR 0x06 /*Consumer IR*/ 208e85390dcSwdenk 209e85390dcSwdenk #define FCR_TXFTH0 0x10 /* these bits control threshod of data level in fifo */ 210e85390dcSwdenk #define FCR_TXFTH1 0x20 /* for interrupt trigger */ 211e85390dcSwdenk 212e85390dcSwdenk /* 213e85390dcSwdenk * Default NS87308 configuration 214e85390dcSwdenk */ 2156d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_KBC1_BASE 2166d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_KBC1_BASE 0x0060 217e85390dcSwdenk #endif 2186d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_RTC_BASE 2196d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_RTC_BASE 0x0070 220e85390dcSwdenk #endif 2216d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_FDC_BASE 2226d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_FDC_BASE 0x03F0 223e85390dcSwdenk #endif 2246d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_LPT_BASE 2256d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_LPT_BASE 0x0278 226e85390dcSwdenk #endif 2276d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_UART1_BASE 2286d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_UART1_BASE 0x03F8 229e85390dcSwdenk #endif 2306d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #ifndef CONFIG_SYS_NS87308_UART2_BASE 2316d0f6bcfSJean-Christophe PLAGNIOL-VILLARD #define CONFIG_SYS_NS87308_UART2_BASE 0x02F8 232e85390dcSwdenk #endif 233e85390dcSwdenk 234e85390dcSwdenk #endif /*_NS87308_H_*/ 235