Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/mips/pmc-sierra/msp71xx/msp_eth.c
15118 views
1
/*
2
* The setup file for ethernet related hardware on PMC-Sierra MSP processors.
3
*
4
* Copyright 2010 PMC-Sierra, Inc.
5
*
6
* This program is free software; you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License as published by the
8
* Free Software Foundation; either version 2 of the License, or (at your
9
* option) any later version.
10
*
11
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
12
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
13
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
14
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
15
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
16
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
17
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
18
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
19
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
20
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
21
*
22
* You should have received a copy of the GNU General Public License along
23
* with this program; if not, write to the Free Software Foundation, Inc.,
24
* 675 Mass Ave, Cambridge, MA 02139, USA.
25
*/
26
27
#include <linux/init.h>
28
#include <linux/kernel.h>
29
#include <linux/ioport.h>
30
#include <linux/platform_device.h>
31
#include <linux/delay.h>
32
#include <msp_regs.h>
33
#include <msp_int.h>
34
#include <msp_gpio_macros.h>
35
36
37
#define MSP_ETHERNET_GPIO0 14
38
#define MSP_ETHERNET_GPIO1 15
39
#define MSP_ETHERNET_GPIO2 16
40
41
#ifdef CONFIG_MSP_HAS_TSMAC
42
#define MSP_TSMAC_SIZE 0x10020
43
#define MSP_TSMAC_ID "pmc_tsmac"
44
45
static struct resource msp_tsmac0_resources[] = {
46
[0] = {
47
.start = MSP_MAC0_BASE,
48
.end = MSP_MAC0_BASE + MSP_TSMAC_SIZE - 1,
49
.flags = IORESOURCE_MEM,
50
},
51
[1] = {
52
.start = MSP_INT_MAC0,
53
.end = MSP_INT_MAC0,
54
.flags = IORESOURCE_IRQ,
55
},
56
};
57
58
static struct resource msp_tsmac1_resources[] = {
59
[0] = {
60
.start = MSP_MAC1_BASE,
61
.end = MSP_MAC1_BASE + MSP_TSMAC_SIZE - 1,
62
.flags = IORESOURCE_MEM,
63
},
64
[1] = {
65
.start = MSP_INT_MAC1,
66
.end = MSP_INT_MAC1,
67
.flags = IORESOURCE_IRQ,
68
},
69
};
70
static struct resource msp_tsmac2_resources[] = {
71
[0] = {
72
.start = MSP_MAC2_BASE,
73
.end = MSP_MAC2_BASE + MSP_TSMAC_SIZE - 1,
74
.flags = IORESOURCE_MEM,
75
},
76
[1] = {
77
.start = MSP_INT_SAR,
78
.end = MSP_INT_SAR,
79
.flags = IORESOURCE_IRQ,
80
},
81
};
82
83
84
static struct platform_device tsmac_device[] = {
85
[0] = {
86
.name = MSP_TSMAC_ID,
87
.id = 0,
88
.num_resources = ARRAY_SIZE(msp_tsmac0_resources),
89
.resource = msp_tsmac0_resources,
90
},
91
[1] = {
92
.name = MSP_TSMAC_ID,
93
.id = 1,
94
.num_resources = ARRAY_SIZE(msp_tsmac1_resources),
95
.resource = msp_tsmac1_resources,
96
},
97
[2] = {
98
.name = MSP_TSMAC_ID,
99
.id = 2,
100
.num_resources = ARRAY_SIZE(msp_tsmac2_resources),
101
.resource = msp_tsmac2_resources,
102
},
103
};
104
#define msp_eth_devs tsmac_device
105
106
#else
107
/* If it is not TSMAC assume MSP_ETH (100Mbps) */
108
#define MSP_ETH_ID "pmc_mspeth"
109
#define MSP_ETH_SIZE 0xE0
110
static struct resource msp_eth0_resources[] = {
111
[0] = {
112
.start = MSP_MAC0_BASE,
113
.end = MSP_MAC0_BASE + MSP_ETH_SIZE - 1,
114
.flags = IORESOURCE_MEM,
115
},
116
[1] = {
117
.start = MSP_INT_MAC0,
118
.end = MSP_INT_MAC0,
119
.flags = IORESOURCE_IRQ,
120
},
121
};
122
123
static struct resource msp_eth1_resources[] = {
124
[0] = {
125
.start = MSP_MAC1_BASE,
126
.end = MSP_MAC1_BASE + MSP_ETH_SIZE - 1,
127
.flags = IORESOURCE_MEM,
128
},
129
[1] = {
130
.start = MSP_INT_MAC1,
131
.end = MSP_INT_MAC1,
132
.flags = IORESOURCE_IRQ,
133
},
134
};
135
136
137
138
static struct platform_device mspeth_device[] = {
139
[0] = {
140
.name = MSP_ETH_ID,
141
.id = 0,
142
.num_resources = ARRAY_SIZE(msp_eth0_resources),
143
.resource = msp_eth0_resources,
144
},
145
[1] = {
146
.name = MSP_ETH_ID,
147
.id = 1,
148
.num_resources = ARRAY_SIZE(msp_eth1_resources),
149
.resource = msp_eth1_resources,
150
},
151
152
};
153
#define msp_eth_devs mspeth_device
154
155
#endif
156
int __init msp_eth_setup(void)
157
{
158
int i, ret = 0;
159
160
/* Configure the GPIO and take the ethernet PHY out of reset */
161
msp_gpio_pin_mode(MSP_GPIO_OUTPUT, MSP_ETHERNET_GPIO0);
162
msp_gpio_pin_hi(MSP_ETHERNET_GPIO0);
163
164
#ifdef CONFIG_MSP_HAS_TSMAC
165
/* 3 phys on boards with TSMAC */
166
msp_gpio_pin_mode(MSP_GPIO_OUTPUT, MSP_ETHERNET_GPIO1);
167
msp_gpio_pin_hi(MSP_ETHERNET_GPIO1);
168
169
msp_gpio_pin_mode(MSP_GPIO_OUTPUT, MSP_ETHERNET_GPIO2);
170
msp_gpio_pin_hi(MSP_ETHERNET_GPIO2);
171
#endif
172
for (i = 0; i < ARRAY_SIZE(msp_eth_devs); i++) {
173
ret = platform_device_register(&msp_eth_devs[i]);
174
printk(KERN_INFO "device: %d, return value = %d\n", i, ret);
175
if (ret) {
176
platform_device_unregister(&msp_eth_devs[i]);
177
break;
178
}
179
}
180
181
if (ret)
182
printk(KERN_WARNING "Could not initialize "
183
"MSPETH device structures.\n");
184
185
return ret;
186
}
187
subsys_initcall(msp_eth_setup);
188
189