xtensa: s6105 specific configuration for s6gmac
Platform-specific configuration for the s6gmac driver, including the PHY interrupt line. Signed-off-by: Daniel Glockner <dg@emlix.com> Signed-off-by: Oskar Schirmer <os@emlix.com> Cc: "David S. Miller" <davem@davemloft.net> Cc: Johannes Weiner <jw@emlix.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
This commit is contained in:
committed by
Chris Zankel
parent
8b0215aa5b
commit
059cafe6df
@@ -5,14 +5,27 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
#include <linux/phy.h>
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/serial.h>
|
#include <linux/serial.h>
|
||||||
#include <linux/serial_8250.h>
|
#include <linux/serial_8250.h>
|
||||||
|
|
||||||
#include <variant/hardware.h>
|
#include <variant/hardware.h>
|
||||||
|
#include <variant/dmac.h>
|
||||||
|
|
||||||
|
#include <platform/gpio.h>
|
||||||
|
|
||||||
|
#define GPIO3_INTNUM 3
|
||||||
#define UART_INTNUM 4
|
#define UART_INTNUM 4
|
||||||
|
#define GMAC_INTNUM 5
|
||||||
|
|
||||||
|
static const signed char gpio3_irq_mappings[] = {
|
||||||
|
S6_INTC_GPIO(3),
|
||||||
|
-1
|
||||||
|
};
|
||||||
|
|
||||||
static const signed char uart_irq_mappings[] = {
|
static const signed char uart_irq_mappings[] = {
|
||||||
S6_INTC_UART(0),
|
S6_INTC_UART(0),
|
||||||
@@ -20,8 +33,18 @@ static const signed char uart_irq_mappings[] = {
|
|||||||
-1,
|
-1,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const signed char gmac_irq_mappings[] = {
|
||||||
|
S6_INTC_GMAC_STAT,
|
||||||
|
S6_INTC_GMAC_ERR,
|
||||||
|
S6_INTC_DMA_HOSTTERMCNT(0),
|
||||||
|
S6_INTC_DMA_HOSTTERMCNT(1),
|
||||||
|
-1
|
||||||
|
};
|
||||||
|
|
||||||
const signed char *platform_irq_mappings[NR_IRQS] = {
|
const signed char *platform_irq_mappings[NR_IRQS] = {
|
||||||
|
[GPIO3_INTNUM] = gpio3_irq_mappings,
|
||||||
[UART_INTNUM] = uart_irq_mappings,
|
[UART_INTNUM] = uart_irq_mappings,
|
||||||
|
[GMAC_INTNUM] = gmac_irq_mappings,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct plat_serial8250_port serial_platform_data[] = {
|
static struct plat_serial8250_port serial_platform_data[] = {
|
||||||
@@ -46,6 +69,66 @@ static struct plat_serial8250_port serial_platform_data[] = {
|
|||||||
{ },
|
{ },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct resource s6_gmac_resource[] = {
|
||||||
|
{
|
||||||
|
.name = "mem",
|
||||||
|
.start = (resource_size_t)S6_REG_GMAC,
|
||||||
|
.end = (resource_size_t)S6_REG_GMAC + 0x10000 - 1,
|
||||||
|
.flags = IORESOURCE_MEM,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "dma",
|
||||||
|
.start = (resource_size_t)
|
||||||
|
DMA_CHNL(S6_REG_HIFDMA, S6_HIFDMA_GMACTX),
|
||||||
|
.end = (resource_size_t)
|
||||||
|
DMA_CHNL(S6_REG_HIFDMA, S6_HIFDMA_GMACTX) + 0x100 - 1,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "dma",
|
||||||
|
.start = (resource_size_t)
|
||||||
|
DMA_CHNL(S6_REG_HIFDMA, S6_HIFDMA_GMACRX),
|
||||||
|
.end = (resource_size_t)
|
||||||
|
DMA_CHNL(S6_REG_HIFDMA, S6_HIFDMA_GMACRX) + 0x100 - 1,
|
||||||
|
.flags = IORESOURCE_DMA,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "io",
|
||||||
|
.start = (resource_size_t)S6_MEM_GMAC,
|
||||||
|
.end = (resource_size_t)S6_MEM_GMAC + 0x2000000 - 1,
|
||||||
|
.flags = IORESOURCE_IO,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "irq",
|
||||||
|
.start = (resource_size_t)GMAC_INTNUM,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.name = "irq",
|
||||||
|
.start = (resource_size_t)PHY_POLL,
|
||||||
|
.flags = IORESOURCE_IRQ,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static int __init prepare_phy_irq(int pin)
|
||||||
|
{
|
||||||
|
int irq;
|
||||||
|
if (gpio_request(pin, "s6gmac_phy") < 0)
|
||||||
|
goto fail;
|
||||||
|
if (gpio_direction_input(pin) < 0)
|
||||||
|
goto free;
|
||||||
|
irq = gpio_to_irq(pin);
|
||||||
|
if (irq < 0)
|
||||||
|
goto free;
|
||||||
|
if (set_irq_type(irq, IRQ_TYPE_LEVEL_LOW) < 0)
|
||||||
|
goto free;
|
||||||
|
return irq;
|
||||||
|
free:
|
||||||
|
gpio_free(pin);
|
||||||
|
fail:
|
||||||
|
return PHY_POLL;
|
||||||
|
}
|
||||||
|
|
||||||
static struct platform_device platform_devices[] = {
|
static struct platform_device platform_devices[] = {
|
||||||
{
|
{
|
||||||
.name = "serial8250",
|
.name = "serial8250",
|
||||||
@@ -54,12 +137,20 @@ static struct platform_device platform_devices[] = {
|
|||||||
.platform_data = serial_platform_data,
|
.platform_data = serial_platform_data,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
.name = "s6gmac",
|
||||||
|
.id = 0,
|
||||||
|
.resource = s6_gmac_resource,
|
||||||
|
.num_resources = ARRAY_SIZE(s6_gmac_resource),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static int __init device_init(void)
|
static int __init device_init(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
s6_gmac_resource[5].start = prepare_phy_irq(GPIO_PHY_IRQ);
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(platform_devices); i++)
|
for (i = 0; i < ARRAY_SIZE(platform_devices); i++)
|
||||||
platform_device_register(&platform_devices[i]);
|
platform_device_register(&platform_devices[i]);
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -35,12 +35,21 @@ void __init platform_setup(char **cmdline)
|
|||||||
{
|
{
|
||||||
unsigned long reg;
|
unsigned long reg;
|
||||||
|
|
||||||
|
reg = readl(S6_REG_GREG1 + S6_GREG1_PLLSEL);
|
||||||
|
reg &= ~(S6_GREG1_PLLSEL_GMAC_MASK << S6_GREG1_PLLSEL_GMAC |
|
||||||
|
S6_GREG1_PLLSEL_GMII_MASK << S6_GREG1_PLLSEL_GMII);
|
||||||
|
reg |= S6_GREG1_PLLSEL_GMAC_125MHZ << S6_GREG1_PLLSEL_GMAC |
|
||||||
|
S6_GREG1_PLLSEL_GMII_125MHZ << S6_GREG1_PLLSEL_GMII;
|
||||||
|
writel(reg, S6_REG_GREG1 + S6_GREG1_PLLSEL);
|
||||||
|
|
||||||
reg = readl(S6_REG_GREG1 + S6_GREG1_CLKGATE);
|
reg = readl(S6_REG_GREG1 + S6_GREG1_CLKGATE);
|
||||||
reg &= ~(1 << S6_GREG1_BLOCK_SB);
|
reg &= ~(1 << S6_GREG1_BLOCK_SB);
|
||||||
|
reg &= ~(1 << S6_GREG1_BLOCK_GMAC);
|
||||||
writel(reg, S6_REG_GREG1 + S6_GREG1_CLKGATE);
|
writel(reg, S6_REG_GREG1 + S6_GREG1_CLKGATE);
|
||||||
|
|
||||||
reg = readl(S6_REG_GREG1 + S6_GREG1_BLOCKENA);
|
reg = readl(S6_REG_GREG1 + S6_GREG1_BLOCKENA);
|
||||||
reg |= 1 << S6_GREG1_BLOCK_SB;
|
reg |= 1 << S6_GREG1_BLOCK_SB;
|
||||||
|
reg |= 1 << S6_GREG1_BLOCK_GMAC;
|
||||||
writel(reg, S6_REG_GREG1 + S6_GREG1_BLOCKENA);
|
writel(reg, S6_REG_GREG1 + S6_GREG1_BLOCKENA);
|
||||||
|
|
||||||
printk(KERN_NOTICE "S6105 on Stretch S6000 - "
|
printk(KERN_NOTICE "S6105 on Stretch S6000 - "
|
||||||
|
Reference in New Issue
Block a user