openbcm

Git mirror of https://github.com/Broadcom-Network-Switching-Software/OpenBCM
git clone git://git.finwo.net/mirror/broadcom/openbcm
Log | Files | Refs | README

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