MIPS: Loongson1C: Add board support
Adds basic platform devices for Loongson1C, including serial port and ethernet. Signed-off-by: Yang Ling <gnaygnil@gmail.com> Cc: keguang.zhang@gmail.com Cc: chenhc@lemote.com Cc: linux-mips@linux-mips.org Cc: linux-kernel@vger.kernel.org Patchwork: https://patchwork.linux-mips.org/patch/13304/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
This commit is contained in:
@@ -62,12 +62,58 @@ static void ls1x_irq_unmask(struct irq_data *d)
|
||||
| (1 << bit), LS1X_INTC_INTIEN(n));
|
||||
}
|
||||
|
||||
static int ls1x_irq_settype(struct irq_data *d, unsigned int type)
|
||||
{
|
||||
unsigned int bit = (d->irq - LS1X_IRQ_BASE) & 0x1f;
|
||||
unsigned int n = (d->irq - LS1X_IRQ_BASE) >> 5;
|
||||
|
||||
switch (type) {
|
||||
case IRQ_TYPE_LEVEL_HIGH:
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTPOL(n))
|
||||
| (1 << bit), LS1X_INTC_INTPOL(n));
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTEDGE(n))
|
||||
& ~(1 << bit), LS1X_INTC_INTEDGE(n));
|
||||
break;
|
||||
case IRQ_TYPE_LEVEL_LOW:
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTPOL(n))
|
||||
& ~(1 << bit), LS1X_INTC_INTPOL(n));
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTEDGE(n))
|
||||
& ~(1 << bit), LS1X_INTC_INTEDGE(n));
|
||||
break;
|
||||
case IRQ_TYPE_EDGE_RISING:
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTPOL(n))
|
||||
| (1 << bit), LS1X_INTC_INTPOL(n));
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTEDGE(n))
|
||||
| (1 << bit), LS1X_INTC_INTEDGE(n));
|
||||
break;
|
||||
case IRQ_TYPE_EDGE_FALLING:
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTPOL(n))
|
||||
& ~(1 << bit), LS1X_INTC_INTPOL(n));
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTEDGE(n))
|
||||
| (1 << bit), LS1X_INTC_INTEDGE(n));
|
||||
break;
|
||||
case IRQ_TYPE_EDGE_BOTH:
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTPOL(n))
|
||||
& ~(1 << bit), LS1X_INTC_INTPOL(n));
|
||||
__raw_writel(__raw_readl(LS1X_INTC_INTEDGE(n))
|
||||
| (1 << bit), LS1X_INTC_INTEDGE(n));
|
||||
break;
|
||||
case IRQ_TYPE_NONE:
|
||||
break;
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct irq_chip ls1x_irq_chip = {
|
||||
.name = "LS1X-INTC",
|
||||
.irq_ack = ls1x_irq_ack,
|
||||
.irq_mask = ls1x_irq_mask,
|
||||
.irq_mask_ack = ls1x_irq_mask_ack,
|
||||
.irq_unmask = ls1x_irq_unmask,
|
||||
.irq_set_type = ls1x_irq_settype,
|
||||
};
|
||||
|
||||
static void ls1x_irq_dispatch(int n)
|
||||
@@ -107,7 +153,7 @@ asmlinkage void plat_irq_dispatch(void)
|
||||
|
||||
}
|
||||
|
||||
struct irqaction cascade_irqaction = {
|
||||
static struct irqaction cascade_irqaction = {
|
||||
.handler = no_action,
|
||||
.name = "cascade",
|
||||
.flags = IRQF_NO_THREAD,
|
||||
@@ -120,7 +166,7 @@ static void __init ls1x_irq_init(int base)
|
||||
/* Disable interrupts and clear pending,
|
||||
* setup all IRQs as high level triggered
|
||||
*/
|
||||
for (n = 0; n < 4; n++) {
|
||||
for (n = 0; n < INTN; n++) {
|
||||
__raw_writel(0x0, LS1X_INTC_INTIEN(n));
|
||||
__raw_writel(0xffffffff, LS1X_INTC_INTCLR(n));
|
||||
__raw_writel(0xffffffff, LS1X_INTC_INTPOL(n));
|
||||
@@ -129,7 +175,7 @@ static void __init ls1x_irq_init(int base)
|
||||
}
|
||||
|
||||
|
||||
for (n = base; n < LS1X_IRQS; n++) {
|
||||
for (n = base; n < NR_IRQS; n++) {
|
||||
irq_set_chip_and_handler(n, &ls1x_irq_chip,
|
||||
handle_level_irq);
|
||||
}
|
||||
@@ -138,6 +184,9 @@ static void __init ls1x_irq_init(int base)
|
||||
setup_irq(INT1_IRQ, &cascade_irqaction);
|
||||
setup_irq(INT2_IRQ, &cascade_irqaction);
|
||||
setup_irq(INT3_IRQ, &cascade_irqaction);
|
||||
#if defined(CONFIG_LOONGSON1_LS1C)
|
||||
setup_irq(INT4_IRQ, &cascade_irqaction);
|
||||
#endif
|
||||
}
|
||||
|
||||
void __init arch_init_irq(void)
|
||||
|
@@ -17,6 +17,7 @@
|
||||
#include <linux/stmmac.h>
|
||||
#include <linux/usb/ehci_pdriver.h>
|
||||
|
||||
#include <platform.h>
|
||||
#include <loongson1.h>
|
||||
#include <cpufreq.h>
|
||||
#include <dma.h>
|
||||
@@ -132,6 +133,7 @@ int ls1x_eth_mux_init(struct platform_device *pdev, void *priv)
|
||||
|
||||
val = __raw_readl(LS1X_MUX_CTRL1);
|
||||
|
||||
#if defined(CONFIG_LOONGSON1_LS1B)
|
||||
plat_dat = dev_get_platdata(&pdev->dev);
|
||||
if (plat_dat->bus_id) {
|
||||
__raw_writel(__raw_readl(LS1X_MUX_CTRL0) | GMAC1_USE_UART1 |
|
||||
@@ -165,6 +167,17 @@ int ls1x_eth_mux_init(struct platform_device *pdev, void *priv)
|
||||
val &= ~GMAC0_SHUT;
|
||||
}
|
||||
__raw_writel(val, LS1X_MUX_CTRL1);
|
||||
#elif defined(CONFIG_LOONGSON1_LS1C)
|
||||
plat_dat = dev_get_platdata(&pdev->dev);
|
||||
|
||||
val &= ~PHY_INTF_SELI;
|
||||
if (plat_dat->interface == PHY_INTERFACE_MODE_RMII)
|
||||
val |= 0x4 << PHY_INTF_SELI_SHIFT;
|
||||
__raw_writel(val, LS1X_MUX_CTRL1);
|
||||
|
||||
val = __raw_readl(LS1X_MUX_CTRL0);
|
||||
__raw_writel(val & (~GMAC_SHUT), LS1X_MUX_CTRL0);
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -172,7 +185,11 @@ int ls1x_eth_mux_init(struct platform_device *pdev, void *priv)
|
||||
static struct plat_stmmacenet_data ls1x_eth0_pdata = {
|
||||
.bus_id = 0,
|
||||
.phy_addr = -1,
|
||||
#if defined(CONFIG_LOONGSON1_LS1B)
|
||||
.interface = PHY_INTERFACE_MODE_MII,
|
||||
#elif defined(CONFIG_LOONGSON1_LS1C)
|
||||
.interface = PHY_INTERFACE_MODE_RMII,
|
||||
#endif
|
||||
.mdio_bus_data = &ls1x_mdio_bus_data,
|
||||
.dma_cfg = &ls1x_eth_dma_cfg,
|
||||
.has_gmac = 1,
|
||||
@@ -203,6 +220,7 @@ struct platform_device ls1x_eth0_pdev = {
|
||||
},
|
||||
};
|
||||
|
||||
#ifdef CONFIG_LOONGSON1_LS1B
|
||||
static struct plat_stmmacenet_data ls1x_eth1_pdata = {
|
||||
.bus_id = 1,
|
||||
.phy_addr = -1,
|
||||
@@ -236,6 +254,7 @@ struct platform_device ls1x_eth1_pdev = {
|
||||
.platform_data = &ls1x_eth1_pdata,
|
||||
},
|
||||
};
|
||||
#endif /* CONFIG_LOONGSON1_LS1B */
|
||||
|
||||
/* GPIO */
|
||||
static struct resource ls1x_gpio0_resources[] = {
|
||||
|
@@ -22,7 +22,11 @@ const char *get_system_type(void)
|
||||
|
||||
switch (processor_id & PRID_REV_MASK) {
|
||||
case PRID_REV_LOONGSON1B:
|
||||
#if defined(CONFIG_LOONGSON1_LS1B)
|
||||
return "LOONGSON LS1B";
|
||||
#elif defined(CONFIG_LOONGSON1_LS1C)
|
||||
return "LOONGSON LS1C";
|
||||
#endif
|
||||
default:
|
||||
return "LOONGSON (unknown)";
|
||||
}
|
||||
|
Reference in New Issue
Block a user