GNU Linux-libre 4.19.286-gnu1
[releases.git] / arch / mips / pmcs-msp71xx / msp_eth.c
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 #define MSP_ETH_ID      "pmc_mspeth"
42 #define MSP_ETH_SIZE    0xE0
43 static struct resource msp_eth0_resources[] = {
44         [0] = {
45                 .start  = MSP_MAC0_BASE,
46                 .end    = MSP_MAC0_BASE + MSP_ETH_SIZE - 1,
47                 .flags  = IORESOURCE_MEM,
48         },
49         [1] = {
50                 .start  = MSP_INT_MAC0,
51                 .end    = MSP_INT_MAC0,
52                 .flags  = IORESOURCE_IRQ,
53         },
54 };
55
56 static struct resource msp_eth1_resources[] = {
57         [0] = {
58                 .start  = MSP_MAC1_BASE,
59                 .end    = MSP_MAC1_BASE + MSP_ETH_SIZE - 1,
60                 .flags  = IORESOURCE_MEM,
61         },
62         [1] = {
63                 .start  = MSP_INT_MAC1,
64                 .end    = MSP_INT_MAC1,
65                 .flags  = IORESOURCE_IRQ,
66         },
67 };
68
69
70
71 static struct platform_device mspeth_device[] = {
72         [0] = {
73                 .name   = MSP_ETH_ID,
74                 .id     = 0,
75                 .num_resources = ARRAY_SIZE(msp_eth0_resources),
76                 .resource = msp_eth0_resources,
77         },
78         [1] = {
79                 .name   = MSP_ETH_ID,
80                 .id     = 1,
81                 .num_resources = ARRAY_SIZE(msp_eth1_resources),
82                 .resource = msp_eth1_resources,
83         },
84
85 };
86 #define msp_eth_devs    mspeth_device
87
88 int __init msp_eth_setup(void)
89 {
90         int i, ret = 0;
91
92         /* Configure the GPIO and take the ethernet PHY out of reset */
93         msp_gpio_pin_mode(MSP_GPIO_OUTPUT, MSP_ETHERNET_GPIO0);
94         msp_gpio_pin_hi(MSP_ETHERNET_GPIO0);
95
96         for (i = 0; i < ARRAY_SIZE(msp_eth_devs); i++) {
97                 ret = platform_device_register(&msp_eth_devs[i]);
98                 printk(KERN_INFO "device: %d, return value = %d\n", i, ret);
99                 if (ret) {
100                         platform_device_unregister(&msp_eth_devs[i]);
101                         break;
102                 }
103         }
104
105         if (ret)
106                 printk(KERN_WARNING "Could not initialize "
107                                                 "MSPETH device structures.\n");
108
109         return ret;
110 }
111 subsys_initcall(msp_eth_setup);