linux/arch/mips/pmcs-msp71xx/msp_eth.c
<<
>>
Prefs
   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
  43static 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
  56static 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
  71static 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
  88int __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}
 111subsys_initcall(msp_eth_setup);
 112