0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016 #ifndef FS_ENET_PD_H
0017 #define FS_ENET_PD_H
0018
0019 #include <linux/clk.h>
0020 #include <linux/string.h>
0021 #include <linux/of_mdio.h>
0022 #include <linux/if_ether.h>
0023 #include <asm/types.h>
0024
0025 #define FS_ENET_NAME "fs_enet"
0026
0027 enum fs_id {
0028 fsid_fec1,
0029 fsid_fec2,
0030 fsid_fcc1,
0031 fsid_fcc2,
0032 fsid_fcc3,
0033 fsid_scc1,
0034 fsid_scc2,
0035 fsid_scc3,
0036 fsid_scc4,
0037 };
0038
0039 #define FS_MAX_INDEX 9
0040
0041 static inline int fs_get_fec_index(enum fs_id id)
0042 {
0043 if (id >= fsid_fec1 && id <= fsid_fec2)
0044 return id - fsid_fec1;
0045 return -1;
0046 }
0047
0048 static inline int fs_get_fcc_index(enum fs_id id)
0049 {
0050 if (id >= fsid_fcc1 && id <= fsid_fcc3)
0051 return id - fsid_fcc1;
0052 return -1;
0053 }
0054
0055 static inline int fs_get_scc_index(enum fs_id id)
0056 {
0057 if (id >= fsid_scc1 && id <= fsid_scc4)
0058 return id - fsid_scc1;
0059 return -1;
0060 }
0061
0062 static inline int fs_fec_index2id(int index)
0063 {
0064 int id = fsid_fec1 + index - 1;
0065 if (id >= fsid_fec1 && id <= fsid_fec2)
0066 return id;
0067 return FS_MAX_INDEX;
0068 }
0069
0070 static inline int fs_fcc_index2id(int index)
0071 {
0072 int id = fsid_fcc1 + index - 1;
0073 if (id >= fsid_fcc1 && id <= fsid_fcc3)
0074 return id;
0075 return FS_MAX_INDEX;
0076 }
0077
0078 static inline int fs_scc_index2id(int index)
0079 {
0080 int id = fsid_scc1 + index - 1;
0081 if (id >= fsid_scc1 && id <= fsid_scc4)
0082 return id;
0083 return FS_MAX_INDEX;
0084 }
0085
0086 enum fs_mii_method {
0087 fsmii_fixed,
0088 fsmii_fec,
0089 fsmii_bitbang,
0090 };
0091
0092 enum fs_ioport {
0093 fsiop_porta,
0094 fsiop_portb,
0095 fsiop_portc,
0096 fsiop_portd,
0097 fsiop_porte,
0098 };
0099
0100 struct fs_mii_bit {
0101 u32 offset;
0102 u8 bit;
0103 u8 polarity;
0104 };
0105 struct fs_mii_bb_platform_info {
0106 struct fs_mii_bit mdio_dir;
0107 struct fs_mii_bit mdio_dat;
0108 struct fs_mii_bit mdc_dat;
0109 int delay;
0110 int irq[32];
0111 };
0112
0113 struct fs_platform_info {
0114
0115 void(*init_ioports)(struct fs_platform_info *);
0116
0117 int fs_no;
0118 char fs_type[4];
0119
0120 u32 cp_page;
0121 u32 cp_block;
0122 u32 cp_command;
0123
0124 u32 clk_trx;
0125 u32 clk_rx;
0126 u32 clk_tx;
0127 u32 clk_route;
0128 u32 clk_mask;
0129
0130 u32 mem_offset;
0131 u32 dpram_offset;
0132 u32 fcc_regs_c;
0133
0134 u32 device_flags;
0135
0136 struct device_node *phy_node;
0137 const struct fs_mii_bus_info *bus_info;
0138
0139 int rx_ring, tx_ring;
0140 __u8 macaddr[ETH_ALEN];
0141 int rx_copybreak;
0142 int napi_weight;
0143
0144 int use_rmii;
0145 int has_phy;
0146
0147 struct clk *clk_per;
0148 };
0149 struct fs_mii_fec_platform_info {
0150 u32 irq[32];
0151 u32 mii_speed;
0152 };
0153
0154 static inline int fs_get_id(struct fs_platform_info *fpi)
0155 {
0156 if(strstr(fpi->fs_type, "SCC"))
0157 return fs_scc_index2id(fpi->fs_no);
0158 if(strstr(fpi->fs_type, "FCC"))
0159 return fs_fcc_index2id(fpi->fs_no);
0160 if(strstr(fpi->fs_type, "FEC"))
0161 return fs_fec_index2id(fpi->fs_no);
0162 return fpi->fs_no;
0163 }
0164
0165 #endif