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 
msp_eth_setup(void)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);
112