diff options
Diffstat (limited to 'target/linux/mcs814x')
15 files changed, 74 insertions, 522 deletions
diff --git a/target/linux/mcs814x/base-files/etc/config/network b/target/linux/mcs814x/base-files/etc/config/network index e24e82429..e2f779e7b 100644 --- a/target/linux/mcs814x/base-files/etc/config/network +++ b/target/linux/mcs814x/base-files/etc/config/network @@ -11,3 +11,11 @@ config interface lan option proto static option ipaddr 192.168.1.1 option netmask 255.255.255.0 + option ip6assign 60 + +config interface wan6 + option ifname @wan + option proto dhcpv6 + +config globals globals + option ula_prefix auto diff --git a/target/linux/mcs814x/base-files/etc/uci-defaults/leds b/target/linux/mcs814x/base-files/etc/uci-defaults/01_leds index 8ab8b4e76..8ab8b4e76 100644 --- a/target/linux/mcs814x/base-files/etc/uci-defaults/leds +++ b/target/linux/mcs814x/base-files/etc/uci-defaults/01_leds diff --git a/target/linux/mcs814x/config-default b/target/linux/mcs814x/config-default index 5011107fe..00c6b6ccb 100644 --- a/target/linux/mcs814x/config-default +++ b/target/linux/mcs814x/config-default @@ -60,7 +60,6 @@ CONFIG_GENERIC_BUG=y CONFIG_GENERIC_GPIO=y CONFIG_GENERIC_IRQ_CHIP=y CONFIG_GENERIC_IRQ_SHOW=y -CONFIG_GENERIC_PCI_IOMAP=y CONFIG_GPIOLIB=y CONFIG_GPIO_MCS814X=y CONFIG_GPIO_SYSFS=y @@ -118,7 +117,6 @@ CONFIG_MCS814X_PHY=y # CONFIG_MCS814X_WATCHDOG is not set CONFIG_MDIO_BOARDINFO=y # CONFIG_MFD_T7L66XB is not set -CONFIG_MIGHT_HAVE_PCI=y # CONFIG_MTD_COMPLEX_MAPPINGS is not set # CONFIG_MTD_IMPA7 is not set CONFIG_MTD_JEDECPROBE=y @@ -183,6 +181,8 @@ CONFIG_WATCHDOG_NOWAYOUT=y # CONFIG_WEXT_SPY is not set # CONFIG_WIRELESS_EXT is not set CONFIG_XZ_DEC=y +CONFIG_XZ_DEC_ARM=y +CONFIG_XZ_DEC_BCJ=y CONFIG_ZBOOT_ROM_BSS=0 CONFIG_ZBOOT_ROM_TEXT=0 CONFIG_ZONE_DMA_FLAG=0 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/board-mcs8140-dt.c b/target/linux/mcs814x/files-3.3/arch/arm/mach-mcs814x/board-mcs8140-dt.c index 5d13283e9..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 @@ -40,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/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 9ac5c46d6..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 = readb_relaxed(addr); - break; - case 2: - addr &= ~1; - v = readw_relaxed(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: - writeb_relaxed((u8)val, addr); - break; - case 2: - writew_relaxed((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/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 2dc237515..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> @@ -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; @@ -898,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); @@ -1040,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; @@ -1082,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"); @@ -1106,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; diff --git a/target/linux/mcs814x/patches-3.3/001-platform.patch b/target/linux/mcs814x/patches-3.3/001-platform.patch index 051a4922f..8cfed8ca9 100644 --- a/target/linux/mcs814x/patches-3.3/001-platform.patch +++ b/target/linux/mcs814x/patches-3.3/001-platform.patch @@ -6,7 +6,6 @@ +config ARCH_MCS814X + bool "Moschip MCS814x" -+ select MIGHT_HAVE_PCI + select FIQ + select GENERIC_IRQ_CHIP + select GENERIC_GPIO @@ -16,6 +15,7 @@ + select NEED_MACH_MEMORY_H + select USB_ARCH_HAS_OHCI + select USB_ARCH_HAS_EHCI ++ select MULTI_IRQ_HANDLER + help + Support for Moschip MCS814x SoCs (MCS8140). + |