diff options
Diffstat (limited to 'arch/mips/netlogic/xlp')
| -rw-r--r-- | arch/mips/netlogic/xlp/Makefile | 2 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/nlm_hal.c | 52 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/of.c | 34 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/platform.c | 2 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/setup.c | 16 | ||||
| -rw-r--r-- | arch/mips/netlogic/xlp/usb-init.c | 124 | 
6 files changed, 229 insertions, 1 deletions
diff --git a/arch/mips/netlogic/xlp/Makefile b/arch/mips/netlogic/xlp/Makefile index b93ed83474e..6b4b972218f 100644 --- a/arch/mips/netlogic/xlp/Makefile +++ b/arch/mips/netlogic/xlp/Makefile @@ -1,2 +1,4 @@  obj-y				+= setup.o platform.o nlm_hal.o +obj-$(CONFIG_OF)		+= of.o  obj-$(CONFIG_SMP)		+= wakeup.o +obj-$(CONFIG_USB)		+= usb-init.o diff --git a/arch/mips/netlogic/xlp/nlm_hal.c b/arch/mips/netlogic/xlp/nlm_hal.c index 9428e7125fe..6c65ac70191 100644 --- a/arch/mips/netlogic/xlp/nlm_hal.c +++ b/arch/mips/netlogic/xlp/nlm_hal.c @@ -69,6 +69,32 @@ int nlm_irq_to_irt(int irq)  		return PIC_IRT_UART_0_INDEX;  	case PIC_UART_1_IRQ:  		return PIC_IRT_UART_1_INDEX; +	case PIC_PCIE_LINK_0_IRQ: +	       return PIC_IRT_PCIE_LINK_0_INDEX; +	case PIC_PCIE_LINK_1_IRQ: +	       return PIC_IRT_PCIE_LINK_1_INDEX; +	case PIC_PCIE_LINK_2_IRQ: +	       return PIC_IRT_PCIE_LINK_2_INDEX; +	case PIC_PCIE_LINK_3_IRQ: +	       return PIC_IRT_PCIE_LINK_3_INDEX; +	case PIC_EHCI_0_IRQ: +	       return PIC_IRT_EHCI_0_INDEX; +	case PIC_EHCI_1_IRQ: +	       return PIC_IRT_EHCI_1_INDEX; +	case PIC_OHCI_0_IRQ: +	       return PIC_IRT_OHCI_0_INDEX; +	case PIC_OHCI_1_IRQ: +	       return PIC_IRT_OHCI_1_INDEX; +	case PIC_OHCI_2_IRQ: +	       return PIC_IRT_OHCI_2_INDEX; +	case PIC_OHCI_3_IRQ: +	       return PIC_IRT_OHCI_3_INDEX; +	case PIC_MMC_IRQ: +	       return PIC_IRT_MMC_INDEX; +	case PIC_I2C_0_IRQ: +		return PIC_IRT_I2C_0_INDEX; +	case PIC_I2C_1_IRQ: +		return PIC_IRT_I2C_1_INDEX;  	default:  		return -1;  	} @@ -81,6 +107,32 @@ int nlm_irt_to_irq(int irt)  		return PIC_UART_0_IRQ;  	case PIC_IRT_UART_1_INDEX:  		return PIC_UART_1_IRQ; +	case PIC_IRT_PCIE_LINK_0_INDEX: +	       return PIC_PCIE_LINK_0_IRQ; +	case PIC_IRT_PCIE_LINK_1_INDEX: +	       return PIC_PCIE_LINK_1_IRQ; +	case PIC_IRT_PCIE_LINK_2_INDEX: +	       return PIC_PCIE_LINK_2_IRQ; +	case PIC_IRT_PCIE_LINK_3_INDEX: +	       return PIC_PCIE_LINK_3_IRQ; +	case PIC_IRT_EHCI_0_INDEX: +		return PIC_EHCI_0_IRQ; +	case PIC_IRT_EHCI_1_INDEX: +		return PIC_EHCI_1_IRQ; +	case PIC_IRT_OHCI_0_INDEX: +		return PIC_OHCI_0_IRQ; +	case PIC_IRT_OHCI_1_INDEX: +		return PIC_OHCI_1_IRQ; +	case PIC_IRT_OHCI_2_INDEX: +		return PIC_OHCI_2_IRQ; +	case PIC_IRT_OHCI_3_INDEX: +		return PIC_OHCI_3_IRQ; +	case PIC_IRT_MMC_INDEX: +	       return PIC_MMC_IRQ; +	case PIC_IRT_I2C_0_INDEX: +		return PIC_I2C_0_IRQ; +	case PIC_IRT_I2C_1_INDEX: +		return PIC_I2C_1_IRQ;  	default:  		return -1;  	} diff --git a/arch/mips/netlogic/xlp/of.c b/arch/mips/netlogic/xlp/of.c new file mode 100644 index 00000000000..8e3921c0c20 --- /dev/null +++ b/arch/mips/netlogic/xlp/of.c @@ -0,0 +1,34 @@ +#include <linux/bootmem.h> +#include <linux/init.h> +#include <linux/io.h> +#include <linux/of_fdt.h> +#include <asm/byteorder.h> + +static int __init reserve_mem_mach(unsigned long addr, unsigned long size) +{ +	return reserve_bootmem(addr, size, BOOTMEM_DEFAULT); +} + +void __init free_mem_mach(unsigned long addr, unsigned long size) +{ +	return free_bootmem(addr, size); +} + +void __init device_tree_init(void) +{ +	unsigned long base, size; + +	if (!initial_boot_params) +		return; + +	base = virt_to_phys((void *)initial_boot_params); +	size = be32_to_cpu(initial_boot_params->totalsize); + +	/* Before we do anything, lets reserve the dt blob */ +	reserve_mem_mach(base, size); + +	unflatten_device_tree(); + +	/* free the space reserved for the dt blob */ +	free_mem_mach(base, size); +} diff --git a/arch/mips/netlogic/xlp/platform.c b/arch/mips/netlogic/xlp/platform.c index 1f5e4cba891..2c510d58544 100644 --- a/arch/mips/netlogic/xlp/platform.c +++ b/arch/mips/netlogic/xlp/platform.c @@ -53,7 +53,7 @@  static unsigned int nlm_xlp_uart_in(struct uart_port *p, int offset)  { -	 return nlm_read_reg(p->iobase, offset); +	return nlm_read_reg(p->iobase, offset);  }  static void nlm_xlp_uart_out(struct uart_port *p, int offset, int value) diff --git a/arch/mips/netlogic/xlp/setup.c b/arch/mips/netlogic/xlp/setup.c index b3df7c2aad1..3dec9f28b65 100644 --- a/arch/mips/netlogic/xlp/setup.c +++ b/arch/mips/netlogic/xlp/setup.c @@ -41,6 +41,8 @@  #include <asm/bootinfo.h>  #include <linux/of_fdt.h> +#include <linux/of_platform.h> +#include <linux/of_device.h>  #include <asm/netlogic/haldefs.h>  #include <asm/netlogic/common.h> @@ -109,3 +111,17 @@ void __init prom_init(void)  	register_smp_ops(&nlm_smp_ops);  #endif  } + +static struct of_device_id __initdata xlp_ids[] = { +	{ .compatible = "simple-bus", }, +	{}, +}; + +int __init xlp8xx_ds_publish_devices(void) +{ +	if (!of_have_populated_dt()) +		return 0; +	return of_platform_bus_probe(NULL, xlp_ids, NULL); +} + +device_initcall(xlp8xx_ds_publish_devices); diff --git a/arch/mips/netlogic/xlp/usb-init.c b/arch/mips/netlogic/xlp/usb-init.c new file mode 100644 index 00000000000..dbe083a9353 --- /dev/null +++ b/arch/mips/netlogic/xlp/usb-init.c @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2003-2012 Broadcom Corporation + * All Rights Reserved + * + * This software is available to you under a choice of one of two + * licenses.  You may choose to be licensed under the terms of the GNU + * General Public License (GPL) Version 2, available from the file + * COPYING in the main directory of this source tree, or the Broadcom + * license below: + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + *    notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + *    notice, this list of conditions and the following disclaimer in + *    the documentation and/or other materials provided with the + *    distribution. + * + * THIS SOFTWARE IS PROVIDED BY BROADCOM ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL BROADCOM OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, + * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE + * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN + * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include <linux/dma-mapping.h> +#include <linux/kernel.h> +#include <linux/delay.h> +#include <linux/init.h> +#include <linux/pci.h> +#include <linux/platform_device.h> + +#include <asm/netlogic/haldefs.h> +#include <asm/netlogic/xlp-hal/iomap.h> +#include <asm/netlogic/xlp-hal/xlp.h> +#include <asm/netlogic/xlp-hal/usb.h> + +static void nlm_usb_intr_en(int node, int port) +{ +	uint32_t val; +	uint64_t port_addr; + +	port_addr = nlm_get_usb_regbase(node, port); +	val = nlm_read_usb_reg(port_addr, USB_INT_EN); +	val = USB_CTRL_INTERRUPT_EN  | USB_OHCI_INTERRUPT_EN | +		USB_OHCI_INTERRUPT1_EN | USB_CTRL_INTERRUPT_EN  | +		USB_OHCI_INTERRUPT_EN | USB_OHCI_INTERRUPT2_EN; +	nlm_write_usb_reg(port_addr, USB_INT_EN, val); +} + +static void nlm_usb_hw_reset(int node, int port) +{ +	uint64_t port_addr; +	uint32_t val; + +	/* reset USB phy */ +	port_addr = nlm_get_usb_regbase(node, port); +	val = nlm_read_usb_reg(port_addr, USB_PHY_0); +	val &= ~(USB_PHY_RESET | USB_PHY_PORT_RESET_0 | USB_PHY_PORT_RESET_1); +	nlm_write_usb_reg(port_addr, USB_PHY_0, val); + +	mdelay(100); +	val = nlm_read_usb_reg(port_addr, USB_CTL_0); +	val &= ~(USB_CONTROLLER_RESET); +	val |= 0x4; +	nlm_write_usb_reg(port_addr, USB_CTL_0, val); +} + +static int __init nlm_platform_usb_init(void) +{ +	pr_info("Initializing USB Interface\n"); +	nlm_usb_hw_reset(0, 0); +	nlm_usb_hw_reset(0, 3); + +	/* Enable PHY interrupts */ +	nlm_usb_intr_en(0, 0); +	nlm_usb_intr_en(0, 3); + +	return 0; +} + +arch_initcall(nlm_platform_usb_init); + +static u64 xlp_usb_dmamask = ~(u32)0; + +/* Fixup the IRQ for USB devices which is exist on XLP SOC PCIE bus */ +static void nlm_usb_fixup_final(struct pci_dev *dev) +{ +	dev->dev.dma_mask		= &xlp_usb_dmamask; +	dev->dev.coherent_dma_mask	= DMA_BIT_MASK(64); +	switch (dev->devfn) { +	case 0x10: +	       dev->irq = PIC_EHCI_0_IRQ; +	       break; +	case 0x11: +	       dev->irq = PIC_OHCI_0_IRQ; +	       break; +	case 0x12: +	       dev->irq = PIC_OHCI_1_IRQ; +	       break; +	case 0x13: +	       dev->irq = PIC_EHCI_1_IRQ; +	       break; +	case 0x14: +	       dev->irq = PIC_OHCI_2_IRQ; +	       break; +	case 0x15: +	       dev->irq = PIC_OHCI_3_IRQ; +	       break; +	} +} +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_NETLOGIC, PCI_DEVICE_ID_NLM_EHCI, +		nlm_usb_fixup_final); +DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_NETLOGIC, PCI_DEVICE_ID_NLM_OHCI, +		nlm_usb_fixup_final);  |