bsc.h (7645B)
1 /* 2 * 3 * This license is set out in https://raw.githubusercontent.com/Broadcom-Network-Switching-Software/OpenBCM/master/Legal/LICENSE file. 4 * 5 * Copyright 2007-2019 Broadcom Inc. All rights reserved. 6 * 7 * Constants and defines for the Broadcom GTO (BCM98548) I2C 8 * Bus Driver interface controller operating in master mode. 9 * 10 * See also: Broadcom StrataSwitch (TM) Register Reference Guide 11 */ 12 13 #ifndef _SOC_BSC_H 14 #define _SOC_BSC_H 15 16 #ifdef INCLUDE_I2C 17 18 #include <sal/compiler.h> 19 #include <sal/core/sync.h> 20 21 #define BSCBUS(_u) ((soc_bsc_bus_t *)(SOC_CONTROL(_u)->bsc_bus)) 22 23 #define BSC_WRITE_ONLY 0 24 #define BSC_READ_ONLY 1 25 #define BSC_READ_THEN_WRITE 2 26 #define BSC_WRITE_THEN_READ 3 27 28 #define BSC_DIV_CLK (1 << 7) 29 30 #define BSC_SCL_SEL_375KHZ (0 << 4) 31 #define BSC_SCL_SEL_390KHZ (1 << 4) 32 #define BSC_SCL_SEL_187KHZ (2 << 4) 33 #define BSC_SCL_SEL_200KHZ (3 << 4) 34 35 #define BSC_LOCK(unit) \ 36 sal_mutex_take(BSCBUS(unit)->bsc_mutex, sal_mutex_FOREVER) 37 #define BSC_UNLOCK(unit) \ 38 sal_mutex_give(BSCBUS(unit)->bsc_mutex) 39 40 #define MAX_BSC_DEVICES 48 41 42 /* Temperature Sensor and Fan Controller */ 43 #define MAX6653_DEVICE_TYPE 0x00000007 /* Device ID */ 44 #define BSC_MAX6653_SADDR 0x2e 45 46 #define BSC_MAX6653_DEVID_OFF 0x3d /* device id register offset */ 47 #define BSC_MAX6653_MANUF_OFF 0x3e /* manufacturer id register offset */ 48 49 #define BSC_MAX6653_DEVID 0x38 /* device ID */ 50 #define BSC_MAX6653_MANUF 0x4d /* manufacturer ID */ 51 52 /* Philips 8-channel I2C Mux */ 53 #define BSC_PCA9548_SADDR 0x73 54 #define BSC_PCA9548_SADDR_1 0x71 55 #define BSC_PCA9548_SADDR_2 0x72 56 #define BSC_PCA9548_SADDR_3 BSC_PCA9548_SADDR 57 #define BSC_PCA9548_CHAN_MAX 8 58 #define BSC_PCA9548_CHAN_0 (1 << 0) 59 #define BSC_PCA9548_CHAN_1 (1 << 1) 60 #define BSC_PCA9548_CHAN_2 (1 << 2) 61 #define BSC_PCA9548_CHAN_3 (1 << 3) 62 #define BSC_PCA9548_CHAN_4 (1 << 4) 63 #define BSC_PCA9548_CHAN_5 (1 << 5) 64 #define BSC_PCA9548_CHAN_6 (1 << 6) 65 #define BSC_PCA9548_CHAN_7 (1 << 7) 66 67 /* Digital Power Manager */ 68 #define ZM7300_DEVICE_TYPE 0x00000008 /* Device ID */ 69 #define BSC_ZM73XX_SADDR 0x2f 70 71 /* 72 * Atmel EEPROM At24C32 73 * 74 * The EEPROM device on board slave address depends on which 75 * slot the board is inserted in. There are total 4 slots 76 * and they are refleted at the lowest 2-bit. 77 */ 78 #define BSC_AT24C32_SADDR 0x50 79 #define BSC_AT24C32_NAME "at24c64" 80 81 #define AT24C32_DEVICE_TYPE 0x00000009 /* Device ID */ 82 83 84 #define LC2464_NAME_LEN 10 85 86 /* Coverity :: 21386 */ 87 typedef struct eep24c64_s{ 88 uint16 size; /* Number of Bytes */ 89 uint16 type; /* Reserved */ 90 char name[LC2464_NAME_LEN + 1]; /* Device name */ 91 uint16 chksum; /* 16 bit checksum of size, type, and name */ 92 } eep24c64_t; 93 94 /* 95 * Store EEPROM data at start of prom, make all 96 * drivers read/write beyond that. This basically 97 * serves as a way of signing the EEPROM with data 98 * so that we know the device is good and has been 99 * validated. 100 */ 101 #define AT24C64_DEVICE_SIZE (8192) /* AT24C64 */ 102 #define AT24C64_DEVICE_RW_SIZE ((AT24C64_DEVICE_SIZE * 3) / 4) 103 #define AT24C64_PARAMS_SIZE (sizeof(eep24c64_t)) 104 #define AT24C64_CONFIG_START (AT24C64_DEVICE_RW_SIZE - AT24C64_PARAMS_SIZE) 105 106 /* 107 * SFP Fiber module 108 */ 109 #define BSC_SFP_SADDR 0x50 110 #define BSC_SFP_NAME "sfp" 111 #define BSC_SFP_00_NAME "sfp0" 112 #define BSC_SFP_01_NAME "sfp1" 113 #define BSC_SFP_02_NAME "sfp2" 114 #define BSC_SFP_03_NAME "sfp3" 115 #define BSC_SFP_04_NAME "sfp4" 116 #define BSC_SFP_05_NAME "sfp5" 117 #define BSC_SFP_06_NAME "sfp6" 118 #define BSC_SFP_07_NAME "sfp7" 119 #define BSC_SFP_08_NAME "sfp8" 120 #define BSC_SFP_09_NAME "sfp9" 121 #define BSC_SFP_10_NAME "sfp10" 122 #define BSC_SFP_11_NAME "sfp11" 123 124 #define SFP_DEVICE_TYPE 0x0000000A /* Device ID */ 125 #define SFP_DEVICE_SIZE (256) /* SFP */ 126 127 typedef uint8 bsc_saddr_t; /* Device address in datasheet-speak */ 128 typedef uint8 bsc_bus_addr_t; /* Address byte on the I2C SDA line */ 129 130 /* 131 * BSC Driver i/f routines. 132 */ 133 typedef int (*bsc_read_func_t)(int unit, int devno, uint32 reg, uint32 *data); 134 typedef int (*bsc_write_func_t)(int unit, int devno, uint32 reg, uint32 data); 135 typedef int (*bsc_ioc_func_t)(int unit, int devno, int opcode, void* data, int len); 136 typedef int (*bsc_dev_init_func_t)(int unit, int devno); 137 138 /* 139 * I2C Driver structure: definitions for managed device operations 140 */ 141 typedef struct bsc_driver_s { 142 uint8 flags; /* Device flags */ 143 int devno; /* Index into device descriptor table */ 144 uint32 id; /* Device Serial No, GUID, or identifier */ 145 bsc_read_func_t read; /* Read routine */ 146 bsc_write_func_t write; /* Write routine */ 147 bsc_ioc_func_t ioctl; /* IO control routine */ 148 bsc_dev_init_func_t init; /* Called once at startup */ 149 } bsc_driver_t; 150 151 /* 152 * Command definition for ioctl 153 */ 154 #define BSC_IOCTL_DEVICE_PRESENT 1 155 156 /* 157 * I2C Device Descriptor: One for every known device on the bus 158 */ 159 typedef struct bsc_dev_s { 160 char *devname; /* Device name, eg. "eeprom0" */ 161 int mux; /* i2c mux address */ 162 int chan; /* attached to mux channel */ 163 bsc_saddr_t saddr; /* Slave address */ 164 bsc_driver_t *driver; /* Driver routines */ 165 char *desc; /* Description */ 166 uint32 tbyte; /* Bytes transmitted */ 167 uint32 rbyte; /* Bytes received */ 168 void *sc; /* device local data structure */ 169 } bsc_device_t; 170 171 /* 172 * I2C BUS configuration parameters, one per Switch on a Chip (SOC) device 173 */ 174 typedef struct soc_bsc_bus_s { 175 uint32 flags; /* Bitmask of state : see below */ 176 sal_mutex_t bsc_mutex; /* BSC state mutual exclusion */ 177 int mon_delay; /* Monitor or sensor period */ 178 bsc_device_t *devs[MAX_BSC_DEVICES]; /* devices on this bus */ 179 } soc_bsc_bus_t; 180 181 /* Bus Controller flag bit values and their meanings */ 182 #define SOC_BSC_DETACHED 0x00 /* No status */ 183 #define SOC_BSC_MODE_PIO 0x01 /* PIO mode */ 184 #define SOC_BSC_MODE_INTR 0x02 /* Interrupt mode */ 185 #define SOC_BSC_ATTACHED 0x04 /* Driver attached */ 186 187 extern int soc_bsc_addr(int unit, int devno); 188 extern const char * soc_bsc_devname(int unit, int devno); 189 extern int soc_bsc_device_count(int unit); 190 extern bsc_device_t *soc_bsc_device(int unit, int devno); 191 extern int soc_bsc_devtype(int unit, int devno); 192 extern int soc_bsc_devopen(int unit, char* devname); 193 extern int soc_bsc_devdesc_set(int unit, int devno, char *desc); 194 extern int soc_bsc_devdesc_get(int unit, int devno, char **desc); 195 196 /* 197 * MAX6653 Device Driver Temperature and Fan probe and display 198 * See: drv/i2c/max6653.c 199 */ 200 extern void soc_bsc_max6653_show(int unit); 201 extern void soc_bsc_max6653_watch(int unit, int enable, int nsecs); 202 extern int soc_bsc_max6653_set(int unit, int devno, int speed); 203 204 extern int soc_bsc_zm73xx_show(int unit); 205 extern void soc_bsc_zm73xx_watch(int unit, int enable, int nsecs); 206 extern int soc_bsc_zm73xx_set(int unit, int pol, float volt); 207 208 extern int soc_eep24c64_read(int unit, int devno, 209 uint16 addr, uint8* data, uint32 *len); 210 extern int soc_eep24c64_write(int unit, int devno, 211 uint16 addr, uint8* data, uint32 len); 212 extern void soc_eep24c64_test(int unit, int devno); 213 214 extern int soc_sfp_read(int unit, int devno, 215 uint16 addr, uint8* data, uint32 *len); 216 extern int soc_sfp_write(int unit, int devno, 217 uint16 addr, uint8* data, uint32 len); 218 219 #define MAX_POLS 32 220 221 struct zm73xx_sc { 222 int numpols; /* from ID reg */ 223 int fw_ver; /* from ID reg */ 224 int fw_idx; /* from ID reg */ 225 int dpm_gen; /* from ID reg */ 226 char pids[MAX_POLS]; /* POL ids */ 227 }; 228 229 extern int soc_bsc_probe(int unit); 230 extern void soc_bsc_show(int unit); 231 extern void soc_bsc_setmux(int unit, int chan); 232 extern void soc_bsc_readmax(int unit); 233 extern void soc_bsc_readdpm(int unit); 234 extern int soc_bsc_is_attached(int unit); 235 extern int soc_bsc_attach(int unit); 236 237 #endif /* INCLUDE_I2C */ 238 239 #endif /* !_SOC_BSC_H */ 240