1  /*
2   * Platform information definitions for the
3   * universal Freescale Ethernet driver.
4   *
5   * Copyright (c) 2003 Intracom S.A.
6   *  by Pantelis Antoniou <panto@intracom.gr>
7   *
8   * 2005 (c) MontaVista Software, Inc.
9   * Vitaly Bordug <vbordug@ru.mvista.com>
10   *
11   * This file is licensed under the terms of the GNU General Public License
12   * version 2. This program is licensed "as is" without any warranty of any
13   * kind, whether express or implied.
14   */
15  
16  #ifndef FS_ENET_PD_H
17  #define FS_ENET_PD_H
18  
19  #include <linux/clk.h>
20  #include <linux/string.h>
21  #include <linux/of_mdio.h>
22  #include <linux/if_ether.h>
23  #include <asm/types.h>
24  
25  #define FS_ENET_NAME	"fs_enet"
26  
27  enum fs_id {
28  	fsid_fec1,
29  	fsid_fec2,
30  	fsid_fcc1,
31  	fsid_fcc2,
32  	fsid_fcc3,
33  	fsid_scc1,
34  	fsid_scc2,
35  	fsid_scc3,
36  	fsid_scc4,
37  };
38  
39  #define FS_MAX_INDEX	9
40  
fs_get_fec_index(enum fs_id id)41  static inline int fs_get_fec_index(enum fs_id id)
42  {
43  	if (id >= fsid_fec1 && id <= fsid_fec2)
44  		return id - fsid_fec1;
45  	return -1;
46  }
47  
fs_get_fcc_index(enum fs_id id)48  static inline int fs_get_fcc_index(enum fs_id id)
49  {
50  	if (id >= fsid_fcc1 && id <= fsid_fcc3)
51  		return id - fsid_fcc1;
52  	return -1;
53  }
54  
fs_get_scc_index(enum fs_id id)55  static inline int fs_get_scc_index(enum fs_id id)
56  {
57  	if (id >= fsid_scc1 && id <= fsid_scc4)
58  		return id - fsid_scc1;
59  	return -1;
60  }
61  
fs_fec_index2id(int index)62  static inline int fs_fec_index2id(int index)
63  {
64  	int id = fsid_fec1 + index - 1;
65  	if (id >= fsid_fec1 && id <= fsid_fec2)
66  		return id;
67  	return FS_MAX_INDEX;
68  		}
69  
fs_fcc_index2id(int index)70  static inline int fs_fcc_index2id(int index)
71  {
72  	int id = fsid_fcc1 + index - 1;
73  	if (id >= fsid_fcc1 && id <= fsid_fcc3)
74  		return id;
75  	return FS_MAX_INDEX;
76  }
77  
fs_scc_index2id(int index)78  static inline int fs_scc_index2id(int index)
79  {
80  	int id = fsid_scc1 + index - 1;
81  	if (id >= fsid_scc1 && id <= fsid_scc4)
82  		return id;
83  	return FS_MAX_INDEX;
84  }
85  
86  enum fs_mii_method {
87  	fsmii_fixed,
88  	fsmii_fec,
89  	fsmii_bitbang,
90  };
91  
92  enum fs_ioport {
93  	fsiop_porta,
94  	fsiop_portb,
95  	fsiop_portc,
96  	fsiop_portd,
97  	fsiop_porte,
98  };
99  
100  struct fs_mii_bit {
101  	u32 offset;
102  	u8 bit;
103  	u8 polarity;
104  };
105  struct fs_mii_bb_platform_info {
106  	struct fs_mii_bit 	mdio_dir;
107  	struct fs_mii_bit 	mdio_dat;
108  	struct fs_mii_bit	mdc_dat;
109  	int delay;	/* delay in us         */
110  	int irq[32]; 	/* irqs per phy's */
111  };
112  
113  struct fs_platform_info {
114  
115  	void(*init_ioports)(struct fs_platform_info *);
116  	/* device specific information */
117  	int fs_no;		/* controller index            */
118  	char fs_type[4];	/* controller type             */
119  
120  	u32 cp_page;		/* CPM page */
121  	u32 cp_block;		/* CPM sblock */
122  	u32 cp_command;		/* CPM page/sblock/mcn */
123  
124  	u32 clk_trx;		/* some stuff for pins & mux configuration*/
125  	u32 clk_rx;
126  	u32 clk_tx;
127  	u32 clk_route;
128  	u32 clk_mask;
129  
130  	u32 mem_offset;
131  	u32 dpram_offset;
132  	u32 fcc_regs_c;
133  
134  	u32 device_flags;
135  
136  	struct device_node *phy_node;
137  	const struct fs_mii_bus_info *bus_info;
138  
139  	int rx_ring, tx_ring;	/* number of buffers on rx     */
140  	__u8 macaddr[ETH_ALEN];	/* mac address                 */
141  	int rx_copybreak;	/* limit we copy small frames  */
142  	int napi_weight;	/* NAPI weight                 */
143  
144  	int use_rmii;		/* use RMII mode 	       */
145  	int has_phy;            /* if the network is phy container as well...*/
146  
147  	struct clk *clk_per;	/* 'per' clock for register access */
148  };
149  struct fs_mii_fec_platform_info {
150  	u32 irq[32];
151  	u32 mii_speed;
152  };
153  
fs_get_id(struct fs_platform_info * fpi)154  static inline int fs_get_id(struct fs_platform_info *fpi)
155  {
156  	if(strstr(fpi->fs_type, "SCC"))
157  		return fs_scc_index2id(fpi->fs_no);
158  	if(strstr(fpi->fs_type, "FCC"))
159  		return fs_fcc_index2id(fpi->fs_no);
160  	if(strstr(fpi->fs_type, "FEC"))
161  		return fs_fec_index2id(fpi->fs_no);
162  	return fpi->fs_no;
163  }
164  
165  #endif
166