summaryrefslogtreecommitdiffstats
path: root/target/linux/mcs814x/files-3.3
diff options
context:
space:
mode:
Diffstat (limited to 'target/linux/mcs814x/files-3.3')
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/boot/dts/dlan-usb-extender.dts8
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi24
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts6
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile1
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile.boot2
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/board-mcs8140-dt.c3
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c4
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/entry-macro.S23
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/irqs.h5
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/irq.c22
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/pci.c453
-rw-r--r--target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/timer.c1
-rw-r--r--target/linux/mcs814x/files-3.3/drivers/char/hw_random/mcs814x-rng.c9
-rw-r--r--target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c40
14 files changed, 71 insertions, 530 deletions
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/dlan-usb-extender.dts b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/dlan-usb-extender.dts
index c8611deab..0c85b94c0 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/dlan-usb-extender.dts
+++ b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/dlan-usb-extender.dts
@@ -19,6 +19,14 @@
ahb {
vci {
+ eth0: ethernet@40084000 {
+ phy = <&phy0>;
+ phy-mode = "mii";
+
+ phy0: ethernet-phy@0 {
+ reg = <8>;
+ };
+ };
adc {
sdram: memory@0,0 {
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi
index ad52d9277..b7e8eb4fa 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi
+++ b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/mcs8140.dtsi
@@ -37,6 +37,9 @@
ranges;
eth0: ethernet@40084000 {
+ #address-cells = <1>;
+ #size-cells = <0>;
+
compatible = "moschip,nuport-mac";
reg = <0x40084000 0xd8 // mac
0x40080000 0x58>; // dma channels
@@ -76,27 +79,6 @@
interrupts = <19 27>; // done, error
};
- pci@400b0000 {
- compatible = "moschip,mcs8140-pci", "moschip,mcs814x-pci";
- reg = <0x400b0000 0x44 // PCI master
- 0x400d8000 0xe4>; // EEPROM emulator
- interrupts = <25>; // abort interrupt
- status = "disabled";
- #address-cells = <3>;
- #size-cells = <2>;
-
- ranges = <0x01000000 0 0x80000000 0x80000000 0 0x04000000 // IO
- 0x42000000 0 0x90000000 0x90000000 0 0x20000000 // non-prefetch
- 0x02000000 0 0xb0000000 0xb0000000 0 0x10000000>; // prefecth
-
- #interrupt-cells = <1>;
- interrupt-map-mask = <>;
- interrupt-map = <0 0 0 1 &intc 22 0
- 0 0 0 2 &intc 23 0
- 0 0 0 3 &intc 24 0
- 0 0 0 4 &intc 26 0>;
- };
-
gpio: gpio@400d0000 {
compatible = "moschip,mcs814x-gpio";
reg = <0x400d0000 0x670>;
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts
index cc7fab8ed..9949c8ecf 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts
+++ b/target/linux/mcs814x/files-3.3/arch/arm/boot/dts/rbt-832.dts
@@ -21,6 +21,12 @@
vci {
eth0: ethernet@40084000 {
nuport-mac,link-activity = <0x01>;
+ phy = <&phy0>;
+ phy-mode = "mii";
+
+ phy0: ethernet-phy@0 {
+ reg = <1>;
+ };
};
adc {
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile
index bad95cc15..68c5f4a9f 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile
+++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile
@@ -3,4 +3,3 @@ obj-y += common.o
obj-y += irq.o
obj-y += timer.o
obj-y += board-mcs8140-dt.o
-obj-$(CONFIG_PCI) += pci.o
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile.boot b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile.boot
index 60dfcf6dc..b5725078d 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile.boot
+++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/Makefile.boot
@@ -1,6 +1,4 @@
zreladdr-y := 0x00008000
- params_phys-y := 0x00000008
- initrd_phys-y := 0x00400000
dtb-$(CONFIG_MACH_DLAN_USB_EXT) += dlan-usb-extender.dtb
dtb-$(CONFIG_MACH_RBT_832) += rbt-832.dtb
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/board-mcs8140-dt.c b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/board-mcs8140-dt.c
index 766166b05..9f6625cdc 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/board-mcs8140-dt.c
+++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/board-mcs8140-dt.c
@@ -27,8 +27,6 @@ static void __init mcs814x_dt_device_init(void)
}
static const char *mcs8140_dt_board_compat[] __initdata = {
- "devolo,dlan-usb-extender",
- "tigal,rbt-832",
"moschip,mcs8140",
NULL, /* sentinel */
};
@@ -42,5 +40,6 @@ DT_MACHINE_START(mcs8140_dt, "Moschip MCS8140 board")
.init_machine = mcs814x_dt_device_init,
.restart = mcs814x_restart,
.dt_compat = mcs8140_dt_board_compat,
+ .handle_irq = mcs814x_handle_irq,
MACHINE_END
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c
index b679c0442..68b0a0dd1 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c
+++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/common.c
@@ -89,12 +89,12 @@ static void mcs814x_eth_buffer_shifting_set(u8 value)
{
u8 reg;
- reg = __raw_readb(mcs814x_sysdbg_base + SYSDBG_SYSCTL_MAC);
+ reg = readb_relaxed(mcs814x_sysdbg_base + SYSDBG_SYSCTL_MAC);
if (value)
reg |= BUF_SHIFT_BIT;
else
reg &= ~BUF_SHIFT_BIT;
- __raw_writeb(reg, mcs814x_sysdbg_base + SYSDBG_SYSCTL_MAC);
+ writeb_relaxed(reg, mcs814x_sysdbg_base + SYSDBG_SYSCTL_MAC);
}
static struct of_device_id mcs814x_eth_ids[] __initdata = {
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/entry-macro.S b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/entry-macro.S
index eaca5921c..16d2d6d1a 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/entry-macro.S
+++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/entry-macro.S
@@ -4,26 +4,3 @@
.macro arch_ret_to_user, tmp1, tmp2
.endm
-
- .macro get_irqnr_preamble, base, tmp
- ldr \base, =mcs814x_intc_base @ base virtual address of AIC peripheral
- ldr \base, [\base]
- .endm
-
- .macro get_irqnr_and_base, irqnr, irqstat, base, tmp
- mov \tmp, #MCS814X_IRQ_STS0 @ load tmp with STS0 register offset
- ldr \irqstat, [\base, \tmp] @ load value at base + tmp
- tst \irqstat, \irqstat @ test if no active IRQ's
- beq 1002f @ if no active irqs return with status 0
- mov \irqnr, #0 @ start from irq zero
- mov \tmp, #1 @ the mask initially 1
-1001:
- tst \irqstat, \tmp @ and with mask
- addeq \irqnr, \irqnr, #1 @ if zero then add one to nr
- moveq \tmp, \tmp, lsl #1 @ shift mask one to left
- beq 1001b @ if zero then loop again
- mov \irqstat, \tmp @ save the return mask
- mov \tmp, #MCS814X_IRQ_STS0 @ load tmp with ICR offset
- str \irqstat, [\base, \tmp] @ clear irq with selected mask
-1002:
- .endm
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/irqs.h b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/irqs.h
index 78021d132..7b9e07c1a 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/irqs.h
+++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/include/mach/irqs.h
@@ -14,9 +14,4 @@
#define NR_IRQS 32
-#define IRQ_PCI_INTA 22
-#define IRQ_PCI_INTB 23
-#define IRQ_PCI_INTC 24
-#define IRQ_PCI_INTD 26
-
#endif
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/irq.c b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/irq.c
index c1e48927d..b49e51190 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/irq.c
+++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/irq.c
@@ -16,7 +16,7 @@
#include <asm/mach/irq.h>
#include <mach/mcs814x.h>
-void __iomem *mcs814x_intc_base;
+static void __iomem *mcs814x_intc_base;
static void __init mcs814x_alloc_gc(void __iomem *base, unsigned int irq_start,
unsigned int num)
@@ -43,6 +43,26 @@ static void __init mcs814x_alloc_gc(void __iomem *base, unsigned int irq_start,
writel_relaxed(0xffffffff, base + MCS814X_IRQ_ICR);
}
+asmlinkage void __exception_irq_entry mcs814x_handle_irq(struct pt_regs *regs)
+{
+ u32 status, irq;
+
+ do {
+ /* read the status register */
+ status = __raw_readl(mcs814x_intc_base + MCS814X_IRQ_STS0);
+ if (!status)
+ break;
+
+ irq = ffs(status) - 1;
+ status |= (1 << irq);
+ /* clear the interrupt */
+ __raw_writel(status, mcs814x_intc_base + MCS814X_IRQ_STS0);
+ /* call the generic handler */
+ handle_IRQ(irq, regs);
+
+ } while (1);
+}
+
static const struct of_device_id mcs814x_intc_ids[] = {
{ .compatible = "moschip,mcs814x-intc" },
{ /* sentinel */ },
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/pci.c b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/pci.c
deleted file mode 100644
index 3606fe84e..000000000
--- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/pci.c
+++ /dev/null
@@ -1,453 +0,0 @@
-/*
- * Moschip MCS8140 PCI support
- *
- * Copyright (C) 2003 Moschip Semiconductors Ltd.
- * Copyright (C) 2003 Artec Design Ltd.
- * Copyright (C) 2012 Florian Fainelli <florian@openwrt.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation.
- */
-
-#include <linux/kernel.h>
-#include <linux/init.h>
-#include <linux/pci.h>
-#include <linux/ptrace.h>
-#include <linux/slab.h>
-#include <linux/ioport.h>
-#include <linux/interrupt.h>
-#include <linux/spinlock.h>
-#include <linux/init.h>
-#include <linux/platform_device.h>
-#include <linux/of.h>
-#include <linux/io.h>
-
-#include <asm/irq.h>
-#include <asm/system.h>
-#include <asm/mach/pci.h>
-#include <asm/mach/map.h>
-#include <mach/mcs814x.h>
-#include <mach/irqs.h>
-
-#define MCS8140_PCI_CONFIG_SIZE SZ_64M
-#define MCS8140_PCI_IOMISC_SIZE SZ_64M
-
-#define MCS8140_PCI_HOST_BASE 0x80000000
-#define MCS8140_PCI_IOMISC_BASE 0x00000000
-#define MCS8140_PCI_PRE_BASE 0x10000000
-#define MCS8140_PCI_NONPRE_BASE 0x30000000
-
-#define MCS8140_PCI_CFG_BASE (MCS8140_PCI_HOST_BASE + 0x04000000)
-#define MCS8140_PCI_IO_BASE (MCS8140_PCI_HOST_BASE)
-
-#define MCS8140_PCI_IO_VIRT_BASE (MCS814X_IO_BASE - MCS8140_PCI_CONFIG_SIZE - \
- MCS8140_PCI_IOMISC_SIZE)
-#define MCS8140_PCI_CFG_VIRT_BASE (MCS814X_IO_BASE - MCS8140_PCI_CONFIG_SIZE)
-
-#define PCI_FATAL_ERROR 1
-#define EXTERNAL_ABORT_NON_LINE_FETCH 8
-#define EPRM_DONE 0x80
-#define EPRM_SDRAM_FUNC0 0xAC
-#define PCI_INTD 4
-#define MCS8140_PCI_DEVICE_ID 0xA0009710
-#define MCS8140_PCI_CLASS_ID 0x02000011 /* Host-Class id :0x0600 */
-#define PCI_IF_CONFIG 0x200
-
-static void __iomem *mcs8140_pci_master_base;
-static void __iomem *mcs8140_eeprom_emu_base;
-
-static unsigned long __pci_addr(struct pci_bus *bus,
- unsigned int devfn, int offset)
-{
- unsigned int busnr = bus->number;
- unsigned int slot;
-
- /* we only support bus 0 */
- if (busnr != 0)
- return 0;
-
- /*
- * Trap out illegal values
- */
- BUG_ON(devfn > 255 || busnr > 255 || devfn > 255);
-
- /* Scan 3 slots */
- slot = PCI_SLOT(devfn);
- switch (slot) {
- case 1:
- case 2:
- case 3:
- if (PCI_FUNC(devfn) >= 4)
- return 0;
-
- return MCS8140_PCI_CFG_VIRT_BASE | (PCI_SLOT(devfn) << 11) |
- (PCI_FUNC(devfn) << 8) | offset;
- default:
- pr_warn("Ignoring: PCI Slot is %x\n", PCI_SLOT(devfn));
- return 0;
- }
-}
-
-static int mcs8140_pci_host_status(void)
-{
- u32 host_status;
-
- host_status = readl_relaxed(mcs8140_pci_master_base + PCI_IF_CONFIG);
- if (host_status & PCI_FATAL_ERROR) {
- writel_relaxed(host_status & 0xfffffff0,
- mcs8140_pci_master_base + PCI_IF_CONFIG);
- /* flush write */
- host_status =
- readl_relaxed(mcs8140_pci_master_base + PCI_IF_CONFIG);
- return 1;
- }
-
- return 0;
-}
-
-static int mcs8140_pci_read_config(struct pci_bus *bus,
- unsigned int devfn, int where,
- int size, u32 *val)
-{
- unsigned long v = 0xFFFFFFFF;
- unsigned long addr = __pci_addr(bus, devfn, where);
-
- if (addr != 0) {
- switch (size) {
- case 1:
- v = __raw_readb(addr);
- break;
- case 2:
- addr &= ~1;
- v = __raw_readw(addr);
- break;
- default:
- addr &= ~3;
- v = readl_relaxed(addr);
- break;
- }
- } else
- v = 0xffffffff;
-
- if (mcs8140_pci_host_status())
- v = 0xffffffff;
-
- *val = v;
-
- return PCIBIOS_SUCCESSFUL;
-}
-
-static void mcs8140_eeprom_emu_init(void)
-{
- writel_relaxed(0x0000000F, mcs8140_eeprom_emu_base + EPRM_SDRAM_FUNC0);
- writel_relaxed(0x08000000, MCS8140_PCI_CFG_VIRT_BASE + 0x10);
- /* Set the DONE bit of the EEPROM emulator */
- writel_relaxed(0x01, mcs8140_eeprom_emu_base + EPRM_DONE);
-}
-
-static int mcs8140_pci_write_config(struct pci_bus *bus,
- unsigned int devfn, int where,
- int size, u32 val)
-{
- unsigned long addr = __pci_addr(bus, devfn, where);
-
- if (addr != 0) {
- switch (size) {
- case 1:
- __raw_writeb((u8)val, addr);
- break;
- case 2:
- __raw_writew((u16)val, addr);
- break;
- case 4:
- writel_relaxed(val, addr);
- break;
- }
- }
-
- return PCIBIOS_SUCCESSFUL;
-}
-
-static struct pci_ops pci_mcs8140_ops = {
- .read = mcs8140_pci_read_config,
- .write = mcs8140_pci_write_config,
-};
-
-
-static struct resource io_mem = {
- .name = "PCI I/O space",
- .start = MCS8140_PCI_HOST_BASE + MCS8140_PCI_IOMISC_BASE,
- .end = MCS8140_PCI_HOST_BASE + MCS8140_PCI_IOMISC_BASE + SZ_64M,
- .flags = IORESOURCE_IO,
-};
-
-static struct resource pre_mem = {
- .name = "PCI prefetchable",
- .start = MCS8140_PCI_HOST_BASE + MCS8140_PCI_PRE_BASE,
- .end = MCS8140_PCI_HOST_BASE + MCS8140_PCI_PRE_BASE + SZ_512M,
- .flags = IORESOURCE_MEM | IORESOURCE_PREFETCH,
-};
-
-static struct resource non_mem = {
- .name = "PCI non-prefetchable",
- .start = MCS8140_PCI_HOST_BASE + MCS8140_PCI_NONPRE_BASE,
- .end = MCS8140_PCI_HOST_BASE + MCS8140_PCI_NONPRE_BASE + SZ_256M,
- .flags = IORESOURCE_MEM,
-};
-
-int __init pci_mcs8140_setup_resources(struct pci_sys_data *sys)
-{
- int ret = 0;
-
- ret = request_resource(&iomem_resource, &io_mem);
- if (ret) {
- pr_err("PCI: unable to allocate I/O "
- "memory region (%d)\n", ret);
- goto out;
- }
-
- ret = request_resource(&iomem_resource, &non_mem);
- if (ret) {
- pr_err("PCI: unable to allocate non-prefetchable "
- "memory region (%d)\n", ret);
- goto release_io_mem;
- }
-
- ret = request_resource(&iomem_resource, &pre_mem);
- if (ret) {
- pr_err("PCI: unable to allocate prefetchable "
- "memory region (%d)\n", ret);
- goto release_non_mem;
- }
-
- mcs8140_eeprom_emu_init();
-
- pci_add_resource(&sys->resources, &io_mem);
- pci_add_resource(&sys->resources, &non_mem);
- pci_add_resource(&sys->resources, &pre_mem);
-
- return ret;
-
-release_non_mem:
- release_resource(&non_mem);
-release_io_mem:
- release_resource(&io_mem);
-out:
- return ret;
-}
-
-struct pci_bus *pci_mcs8140_scan_bus(int nr, struct pci_sys_data *sys)
-{
- return pci_scan_bus(sys->busnr, &pci_mcs8140_ops, sys);
-}
-
-
-int __init pci_mcs8140_setup(int nr, struct pci_sys_data *sys)
-{
- int ret = 0;
- u32 val;
-
- if (nr > 0)
- return 0;
-
- sys->mem_offset = MCS8140_PCI_IO_VIRT_BASE - MCS8140_PCI_IO_BASE;
- sys->io_offset = 0;
-
- ret = pci_mcs8140_setup_resources(sys);
- if (ret < 0) {
- pr_err("unable to setup mcs8140 resources\n");
- goto out;
- }
-
- val = readl_relaxed(MCS8140_PCI_CFG_VIRT_BASE);
- if (val != MCS8140_PCI_DEVICE_ID) {
- pr_err("cannot find MCS8140 PCI Core: %08x\n", val);
- ret = -EIO;
- goto out;
- }
-
- pr_info("MCS8140 PCI core found\n");
-
- val = readl_relaxed(MCS8140_PCI_CFG_VIRT_BASE + PCI_COMMAND);
- /* Added to support wireless cards */
- writel_relaxed(0, MCS8140_PCI_CFG_VIRT_BASE + 0x40);
- writel_relaxed(val | 0x147, MCS8140_PCI_CFG_VIRT_BASE + PCI_COMMAND);
- val = readl_relaxed(MCS8140_PCI_CFG_VIRT_BASE + PCI_COMMAND);
- ret = 1;
-out:
- return ret;
-}
-
-
-static int __init mcs8140_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
-{
- int line = IRQ_PCI_INTA;
-
- if (pin != 0) {
- /* IRQ_PCIA - 22 */
- if (pin == PCI_INTD)
- line = IRQ_PCI_INTA + pin; /* IRQ_PCIA - 22 */
- else
- line = IRQ_PCI_INTA + pin - 1; /* IRQ_PCIA - 22 */
- }
-
- pr_info("PCI: Map interrupt slot 0x%02x pin 0x%02x line 0x%02x\n",
- slot, pin, line);
-
- return line;
-}
-
-static irqreturn_t mcs8140_pci_abort_interrupt(int irq, void *dummy)
-{
- u32 word;
-
- word = readl_relaxed(mcs8140_pci_master_base + PCI_IF_CONFIG);
- if (!(word & (1 << 24)))
- return IRQ_NONE;
-
- writel_relaxed(word & 0xfffffff0,
- mcs8140_pci_master_base + PCI_IF_CONFIG);
- /* flush write */
- word = readl_relaxed(mcs8140_pci_master_base + PCI_IF_CONFIG);
-
- return IRQ_HANDLED;
-}
-
-static int mcs8140_pci_abort_irq_init(int irq)
-{
- u32 word;
-
- /* Enable Interrupt in PCI Master Core */
- word = readl_relaxed(mcs8140_pci_master_base + PCI_IF_CONFIG);
- word |= (1 << 24);
- writel_relaxed(word, mcs8140_pci_master_base + PCI_IF_CONFIG);
-
- /* flush write */
- word = readl_relaxed(mcs8140_pci_master_base + PCI_IF_CONFIG);
-
- return request_irq(irq, mcs8140_pci_abort_interrupt, 0,
- "PCI abort", NULL);
-}
-
-static int mcs8140_pci_host_abort(unsigned long addr,
- unsigned int fsr, struct pt_regs *regs)
-{
- pr_warn("PCI Data abort: address = 0x%08lx fsr = 0x%03x"
- "PC = 0x%08lx LR = 0x%08lx\n",
- addr, fsr, regs->ARM_pc, regs->ARM_lr);
-
- /*
- * If it was an imprecise abort, then we need to correct the
- * return address to be _after_ the instruction.
- */
- if (fsr & (1 << 10) || mcs8140_pci_host_status())
- regs->ARM_pc += 4;
-
- return 0;
-}
-
-static void mcs8140_data_abort_init(void)
-{
- hook_fault_code(EXTERNAL_ABORT_NON_LINE_FETCH,
- mcs8140_pci_host_abort, SIGBUS,
- 0, "external abort on non-line fetch");
-}
-
-static struct hw_pci mcs8140_pci __initdata = {
- .map_irq = mcs8140_map_irq,
- .nr_controllers = 1,
- .setup = pci_mcs8140_setup,
- .scan = pci_mcs8140_scan_bus,
-};
-
-static struct map_desc mcs8140_pci_io_desc[] __initdata = {
- {
- .virtual = MCS8140_PCI_CFG_VIRT_BASE,
- .pfn = __phys_to_pfn(MCS8140_PCI_CFG_BASE),
- .length = MCS8140_PCI_CONFIG_SIZE,
- .type = MT_DEVICE
- },
- {
- .virtual = MCS8140_PCI_IO_VIRT_BASE,
- .pfn = __phys_to_pfn(MCS8140_PCI_IO_BASE),
- .length = MCS8140_PCI_IOMISC_SIZE,
- .type = MT_DEVICE
- },
-};
-
-static int __devinit mcs8140_pci_probe(struct platform_device *pdev)
-{
- struct resource *res;
- int ret, irq;
-
- res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
- if (!res) {
- dev_err(&pdev->dev, "failed to get mem resource 0\n");
- return -ENODEV;
- }
-
- mcs8140_pci_master_base = devm_ioremap(&pdev->dev, res->start,
- resource_size(res));
- if (!mcs8140_pci_master_base) {
- dev_err(&pdev->dev, "failed to remap PCI master regs\n");
- return -ENODEV;
- }
-
- res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
- if (!res) {
- dev_err(&pdev->dev, "failed to get mem resource 1\n");
- return -ENOMEM;
- }
-
- mcs8140_eeprom_emu_base = devm_ioremap(&pdev->dev, res->start,
- resource_size(res));
- if (!mcs8140_eeprom_emu_base) {
- dev_err(&pdev->dev, "failed to remap EEPROM regs\n");
- return -ENOMEM;
- }
-
- irq = platform_get_irq(pdev, 0);
- if (irq < 0) {
- dev_err(&pdev->dev, "failed to get pci abort irq\n");
- return -ENODEV;
- }
-
- /* Setup static mappins for PCI CFG space */
- iotable_init(mcs8140_pci_io_desc, ARRAY_SIZE(mcs8140_pci_io_desc));
-
- pcibios_min_io = MCS8140_PCI_HOST_BASE;
- pcibios_min_mem = MCS8140_PCI_HOST_BASE + MCS8140_PCI_PRE_BASE;
-
- mcs8140_data_abort_init();
- ret = mcs8140_pci_abort_irq_init(irq);
- if (ret) {
- dev_err(&pdev->dev, "failed to setup abort irq\n");
- return ret;
- }
-
- pci_common_init(&mcs8140_pci);
-
- return 0;
-}
-
-static struct of_device_id mcs8140_of_ids[] __devinitdata = {
- { .compatible = "moschip,mcs8140-pci" },
- { .compatible = "moschip,mcs814x-pci" },
- { /* sentinel */ },
-};
-
-static struct platform_driver mcs8140_pci_driver = {
- .driver = {
- .name = "mcs8140-pci",
- .of_match_table = mcs8140_of_ids,
- },
- .probe = mcs8140_pci_probe,
-};
-
-static int __init mcs8140_pci_init(void)
-{
- return platform_driver_register(&mcs8140_pci_driver);
-}
-subsys_initcall(mcs8140_pci_init);
-
diff --git a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/timer.c b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/timer.c
index 0947fb245..571f9e888 100644
--- a/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/timer.c
+++ b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/timer.c
@@ -111,7 +111,6 @@ static void __init mcs814x_timer_init(void)
panic("unable to get timer0 clock");
clock_rate = clk_get_rate(clk);
- clk_put(clk);
mcs814x_of_timer_init();
diff --git a/target/linux/mcs814x/files-3.3/drivers/char/hw_random/mcs814x-rng.c b/target/linux/mcs814x/files-3.3/drivers/char/hw_random/mcs814x-rng.c
index b1e95810d..5e3d8f247 100644
--- a/target/linux/mcs814x/files-3.3/drivers/char/hw_random/mcs814x-rng.c
+++ b/target/linux/mcs814x/files-3.3/drivers/char/hw_random/mcs814x-rng.c
@@ -61,14 +61,7 @@ static int mcs814x_rng_probe(struct platform_device *pdev)
rng->name = pdev->name;
rng->data_read = mcs814x_rng_data_read;
- if (!devm_request_mem_region(&pdev->dev,
- res->start, resource_size(res),
- pdev->name)) {
- ret = -EBUSY;
- goto out_rng;
- }
-
- priv->regs = devm_ioremap(&pdev->dev, res->start, resource_size(res));
+ priv->regs = devm_request_and_ioremap(&pdev->dev, res);
if (!priv->regs) {
ret = -ENOMEM;
goto out_rng;
diff --git a/target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c b/target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c
index d874e71a1..f11f425a0 100644
--- a/target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c
+++ b/target/linux/mcs814x/files-3.3/drivers/net/ethernet/mcs8140/nuport_mac.c
@@ -19,6 +19,8 @@
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/of.h>
+#include <linux/of_mdio.h>
+#include <linux/of_net.h>
#include <linux/irq.h>
#include <linux/err.h>
#include <linux/phy.h>
@@ -117,7 +119,7 @@ static inline u32 nuport_mac_readl(void __iomem *reg)
static inline u8 nuport_mac_readb(void __iomem *reg)
{
- return __raw_readb(reg);
+ return readb_relaxed(reg);
}
static inline void nuport_mac_writel(u32 value, void __iomem *reg)
@@ -168,6 +170,8 @@ struct nuport_mac_priv {
struct platform_device *pdev;
struct mii_bus *mii_bus;
struct phy_device *phydev;
+ struct device_node *phy_node;
+ phy_interface_t phy_interface;
int old_link;
int old_duplex;
u32 msg_level;
@@ -396,7 +400,7 @@ static void nuport_mac_adjust_link(struct net_device *dev)
priv->old_link = phydev->link;
}
- if (phydev->link & (priv->old_duplex != phydev->duplex)) {
+ if (phydev->link && (priv->old_duplex != phydev->duplex)) {
reg = nuport_mac_readl(CTRL_REG);
if (phydev->duplex == DUPLEX_FULL)
reg |= DUPLEX_FULL;
@@ -564,7 +568,6 @@ static int nuport_mac_rx(struct net_device *dev, int limit)
/* Get packet status */
status = get_unaligned((u32 *) (skb->data + len));
- skb->dev = dev;
dma_unmap_single(&priv->pdev->dev, priv->rx_addr, skb->len,
DMA_FROM_DEVICE);
@@ -615,6 +618,9 @@ static int nuport_mac_rx(struct net_device *dev, int limit)
exit:
skb = netdev_alloc_skb(dev, RX_ALLOC_SIZE);
+ if (!skb)
+ goto out;
+
skb_reserve(skb, RX_SKB_HEADROOM);
priv->rx_skb[priv->cur_rx] = skb;
priv->irq_rxskb[priv->cur_rx] = 1;
@@ -624,7 +630,7 @@ exit:
priv->cur_rx = 0;
count++;
}
-
+out:
return count;
}
@@ -896,9 +902,9 @@ static int nuport_mac_mii_probe(struct net_device *dev)
goto out;
}
- phydev = phy_connect(dev, dev_name(&phydev->dev),
+ phydev = of_phy_connect(dev, priv->phy_node,
nuport_mac_adjust_link, 0,
- PHY_INTERFACE_MODE_MII);
+ priv->phy_interface);
if (IS_ERR(phydev)) {
netdev_err(dev, "could not attach PHY\n");
ret = PTR_ERR(phydev);
@@ -1038,16 +1044,14 @@ static int __init nuport_mac_probe(struct platform_device *pdev)
else
priv->buffer_shifting_len = 2;
- priv->mac_base = devm_ioremap(&pdev->dev,
- regs->start, resource_size(regs));
+ priv->mac_base = devm_request_and_ioremap(&pdev->dev, regs);
if (!priv->mac_base) {
dev_err(&pdev->dev, "failed to remap regs\n");
ret = -ENOMEM;
goto out_platform;
}
- priv->dma_base = devm_ioremap(&pdev->dev,
- dma->start, resource_size(dma));
+ priv->dma_base = devm_request_and_ioremap(&pdev->dev, dma);
if (!priv->dma_base) {
dev_err(&pdev->dev, "failed to remap dma-regs\n");
ret = -ENOMEM;
@@ -1080,6 +1084,20 @@ static int __init nuport_mac_probe(struct platform_device *pdev)
netif_napi_add(dev, &priv->napi, nuport_mac_poll, 64);
+ priv->phy_node = of_parse_phandle(pdev->dev.of_node, "phy", 0);
+ if (!priv->phy_node) {
+ dev_err(&pdev->dev, "no associated PHY\n");
+ ret = -ENODEV;
+ goto out;
+ }
+
+ priv->phy_interface = of_get_phy_mode(pdev->dev.of_node);
+ if (priv->phy_interface < 0) {
+ dev_err(&pdev->dev, "invalid PHY mode\n");
+ ret = -EINVAL;
+ goto out;
+ }
+
priv->mii_bus = mdiobus_alloc();
if (!priv->mii_bus) {
dev_err(&pdev->dev, "mii bus allocation failed\n");
@@ -1104,7 +1122,7 @@ static int __init nuport_mac_probe(struct platform_device *pdev)
for (i = 0; i < PHY_MAX_ADDR; i++)
priv->mii_bus->irq[i] = PHY_IGNORE_INTERRUPT;
- ret = mdiobus_register(priv->mii_bus);
+ ret = of_mdiobus_register(priv->mii_bus, pdev->dev.of_node);
if (ret) {
dev_err(&pdev->dev, "failed to register mii_bus\n");
goto out_mdio_irq;