linux/arch/mips/loongson1/common/platform.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2011 Zhang, Keguang <keguang.zhang@gmail.com>
   3 *
   4 * This program is free software; you can redistribute  it and/or modify it
   5 * under  the terms of  the GNU General  Public License as published by the
   6 * Free Software Foundation;  either version 2 of the  License, or (at your
   7 * option) any later version.
   8 */
   9
  10#include <linux/clk.h>
  11#include <linux/dma-mapping.h>
  12#include <linux/err.h>
  13#include <linux/phy.h>
  14#include <linux/serial_8250.h>
  15#include <linux/stmmac.h>
  16#include <linux/usb/ehci_pdriver.h>
  17#include <asm-generic/sizes.h>
  18
  19#include <loongson1.h>
  20
  21#define LS1X_UART(_id)                                          \
  22        {                                                       \
  23                .mapbase        = LS1X_UART ## _id ## _BASE,    \
  24                .irq            = LS1X_UART ## _id ## _IRQ,     \
  25                .iotype         = UPIO_MEM,                     \
  26                .flags          = UPF_IOREMAP | UPF_FIXED_TYPE, \
  27                .type           = PORT_16550A,                  \
  28        }
  29
  30static struct plat_serial8250_port ls1x_serial8250_port[] = {
  31        LS1X_UART(0),
  32        LS1X_UART(1),
  33        LS1X_UART(2),
  34        LS1X_UART(3),
  35        {},
  36};
  37
  38struct platform_device ls1x_uart_device = {
  39        .name           = "serial8250",
  40        .id             = PLAT8250_DEV_PLATFORM,
  41        .dev            = {
  42                .platform_data = ls1x_serial8250_port,
  43        },
  44};
  45
  46void __init ls1x_serial_setup(struct platform_device *pdev)
  47{
  48        struct clk *clk;
  49        struct plat_serial8250_port *p;
  50
  51        clk = clk_get(NULL, pdev->name);
  52        if (IS_ERR(clk))
  53                panic("unable to get %s clock, err=%ld",
  54                        pdev->name, PTR_ERR(clk));
  55
  56        for (p = pdev->dev.platform_data; p->flags != 0; ++p)
  57                p->uartclk = clk_get_rate(clk);
  58}
  59
  60/* Synopsys Ethernet GMAC */
  61static struct resource ls1x_eth0_resources[] = {
  62        [0] = {
  63                .start  = LS1X_GMAC0_BASE,
  64                .end    = LS1X_GMAC0_BASE + SZ_64K - 1,
  65                .flags  = IORESOURCE_MEM,
  66        },
  67        [1] = {
  68                .name   = "macirq",
  69                .start  = LS1X_GMAC0_IRQ,
  70                .flags  = IORESOURCE_IRQ,
  71        },
  72};
  73
  74static struct stmmac_mdio_bus_data ls1x_mdio_bus_data = {
  75        .phy_mask       = 0,
  76};
  77
  78static struct plat_stmmacenet_data ls1x_eth_data = {
  79        .bus_id         = 0,
  80        .phy_addr       = -1,
  81        .mdio_bus_data  = &ls1x_mdio_bus_data,
  82        .has_gmac       = 1,
  83        .tx_coe         = 1,
  84};
  85
  86struct platform_device ls1x_eth0_device = {
  87        .name           = "stmmaceth",
  88        .id             = 0,
  89        .num_resources  = ARRAY_SIZE(ls1x_eth0_resources),
  90        .resource       = ls1x_eth0_resources,
  91        .dev            = {
  92                .platform_data = &ls1x_eth_data,
  93        },
  94};
  95
  96/* USB EHCI */
  97static u64 ls1x_ehci_dmamask = DMA_BIT_MASK(32);
  98
  99static struct resource ls1x_ehci_resources[] = {
 100        [0] = {
 101                .start  = LS1X_EHCI_BASE,
 102                .end    = LS1X_EHCI_BASE + SZ_32K - 1,
 103                .flags  = IORESOURCE_MEM,
 104        },
 105        [1] = {
 106                .start  = LS1X_EHCI_IRQ,
 107                .flags  = IORESOURCE_IRQ,
 108        },
 109};
 110
 111static struct usb_ehci_pdata ls1x_ehci_pdata = {
 112};
 113
 114struct platform_device ls1x_ehci_device = {
 115        .name           = "ehci-platform",
 116        .id             = -1,
 117        .num_resources  = ARRAY_SIZE(ls1x_ehci_resources),
 118        .resource       = ls1x_ehci_resources,
 119        .dev            = {
 120                .dma_mask = &ls1x_ehci_dmamask,
 121                .platform_data = &ls1x_ehci_pdata,
 122        },
 123};
 124
 125/* Real Time Clock */
 126struct platform_device ls1x_rtc_device = {
 127        .name           = "ls1x-rtc",
 128        .id             = -1,
 129};
 130