Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS updates from Ralf Baechle: o Add basic support for the Mediatek/Ralink Wireless SoC family. o The Qualcomm Atheros platform is extended by support for the new QCA955X SoC series as well as a bunch of patches that get the code ready for OF support. o Lantiq and BCM47XX platform have a few improvements and bug fixes. o MIPS has sent a few patches that get the kernel ready for the upcoming microMIPS support. o The rest of the series is made up of small bug fixes and cleanups that relate to various parts of the MIPS code. The biggy in there is a whitespace cleanup. After I was sent another set of whitespace cleanup patches I decided it was the time to clean the whitespace "issues" for once and and that touches many files below arch/mips/. Fix up silly conflicts, mostly due to whitespace cleanups. * 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: (105 commits) MIPS: Quit exporting kernel internel break codes to uapi/asm/break.h MIPS: remove broken conditional inside vpe loader code MIPS: SMTC: fix implicit declaration of set_vi_handler MIPS: early_printk: drop __init annotations MIPS: Probe for and report hardware virtualization support. MIPS: ath79: add support for the Qualcomm Atheros AP136-010 board MIPS: ath79: add USB controller registration code for the QCA955X SoCs MIPS: ath79: add PCI controller registration code for the QCA955X SoCs MIPS: ath79: add WMAC registration code for the QCA955X SoCs MIPS: ath79: register UART for the QCA955X SoCs MIPS: ath79: add QCA955X specific glue to ath79_device_reset_{set, clear} MIPS: ath79: add GPIO setup code for the QCA955X SoCs MIPS: ath79: add IRQ handling code for the QCA955X SoCs MIPS: ath79: add clock setup code for the QCA955X SoCs MIPS: ath79: add SoC detection code for the QCA955X SoCs MIPS: ath79: add early printk support for the QCA955X SoCs MIPS: ath79: fix WMAC IRQ resource assignment mips: reserve elfcorehdr mips: Make sure kernel memory is in iomem MIPS: ath79: use dynamically allocated USB platform devices ...
This commit is contained in:
Коммит
aebb2afd54
|
@ -0,0 +1,47 @@
|
|||
MIPS CPU interrupt controller
|
||||
|
||||
On MIPS the mips_cpu_intc_init() helper can be used to initialize the 8 CPU
|
||||
IRQs from a devicetree file and create a irq_domain for IRQ controller.
|
||||
|
||||
With the irq_domain in place we can describe how the 8 IRQs are wired to the
|
||||
platforms internal interrupt controller cascade.
|
||||
|
||||
Below is an example of a platform describing the cascade inside the devicetree
|
||||
and the code used to load it inside arch_init_irq().
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "mti,cpu-interrupt-controller"
|
||||
|
||||
Example devicetree:
|
||||
cpu-irq: cpu-irq@0 {
|
||||
#address-cells = <0>;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
compatible = "mti,cpu-interrupt-controller";
|
||||
};
|
||||
|
||||
intc: intc@200 {
|
||||
compatible = "ralink,rt2880-intc";
|
||||
reg = <0x200 0x100>;
|
||||
|
||||
interrupt-controller;
|
||||
#interrupt-cells = <1>;
|
||||
|
||||
interrupt-parent = <&cpu-irq>;
|
||||
interrupts = <2>;
|
||||
};
|
||||
|
||||
|
||||
Example platform irq.c:
|
||||
static struct of_device_id __initdata of_irq_ids[] = {
|
||||
{ .compatible = "mti,cpu-interrupt-controller", .data = mips_cpu_intc_init },
|
||||
{ .compatible = "ralink,rt2880-intc", .data = intc_of_init },
|
||||
{},
|
||||
};
|
||||
|
||||
void __init arch_init_irq(void)
|
||||
{
|
||||
of_irq_init(of_irq_ids);
|
||||
}
|
|
@ -0,0 +1,16 @@
|
|||
Lantiq SoC ASC serial controller
|
||||
|
||||
Required properties:
|
||||
- compatible : Should be "lantiq,asc"
|
||||
- reg : Address and length of the register set for the device
|
||||
- interrupts: the 3 (tx rx err) interrupt numbers. The interrupt specifier
|
||||
depends on the interrupt-parent interrupt controller.
|
||||
|
||||
Example:
|
||||
|
||||
asc1: serial@E100C00 {
|
||||
compatible = "lantiq,asc";
|
||||
reg = <0xE100C00 0x400>;
|
||||
interrupt-parent = <&icu0>;
|
||||
interrupts = <112 113 114>;
|
||||
};
|
|
@ -18,10 +18,10 @@ platforms += loongson1
|
|||
platforms += mti-malta
|
||||
platforms += mti-sead3
|
||||
platforms += netlogic
|
||||
platforms += pmc-sierra
|
||||
platforms += pmcs-msp71xx
|
||||
platforms += pnx833x
|
||||
platforms += pnx8550
|
||||
platforms += powertv
|
||||
platforms += ralink
|
||||
platforms += rb532
|
||||
platforms += sgi-ip22
|
||||
platforms += sgi-ip27
|
||||
|
|
|
@ -108,12 +108,14 @@ config ATH79
|
|||
config BCM47XX
|
||||
bool "Broadcom BCM47XX based boards"
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select BOOT_RAW
|
||||
select CEVT_R4K
|
||||
select CSRC_R4K
|
||||
select DMA_NONCOHERENT
|
||||
select FW_CFE
|
||||
select HW_HAS_PCI
|
||||
select IRQ_CPU
|
||||
select NO_EXCEPT_FILL
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
|
@ -295,6 +297,7 @@ config MIPS_MALTA
|
|||
select BOOT_RAW
|
||||
select CEVT_R4K
|
||||
select CSRC_R4K
|
||||
select CSRC_GIC
|
||||
select DMA_NONCOHERENT
|
||||
select GENERIC_ISA_DMA
|
||||
select HAVE_PCSPKR_PLATFORM
|
||||
|
@ -354,6 +357,7 @@ config MIPS_SEAD3
|
|||
select USB_ARCH_HAS_EHCI
|
||||
select USB_EHCI_BIG_ENDIAN_DESC
|
||||
select USB_EHCI_BIG_ENDIAN_MMIO
|
||||
select USE_OF
|
||||
help
|
||||
This enables support for the MIPS Technologies SEAD3 evaluation
|
||||
board.
|
||||
|
@ -385,16 +389,6 @@ config NXP_STB225
|
|||
help
|
||||
Support for NXP Semiconductors STB225 Development Board.
|
||||
|
||||
config PNX8550_JBS
|
||||
bool "NXP PNX8550 based JBS board"
|
||||
select PNX8550
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config PNX8550_STB810
|
||||
bool "NXP PNX8550 based STB810 board"
|
||||
select PNX8550
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
|
||||
config PMC_MSP
|
||||
bool "PMC-Sierra MSP chipsets"
|
||||
select CEVT_R4K
|
||||
|
@ -434,6 +428,22 @@ config POWERTV
|
|||
help
|
||||
This enables support for the Cisco PowerTV Platform.
|
||||
|
||||
config RALINK
|
||||
bool "Ralink based machines"
|
||||
select CEVT_R4K
|
||||
select CSRC_R4K
|
||||
select BOOT_RAW
|
||||
select DMA_NONCOHERENT
|
||||
select IRQ_CPU
|
||||
select USE_OF
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_HAS_CPU_MIPS32_R2
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select SYS_SUPPORTS_LITTLE_ENDIAN
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
select HAVE_MACH_CLKDEV
|
||||
select CLKDEV_LOOKUP
|
||||
|
||||
config SGI_IP22
|
||||
bool "SGI IP22 (Indy/Indigo2)"
|
||||
select FW_ARC
|
||||
|
@ -835,8 +845,9 @@ source "arch/mips/jazz/Kconfig"
|
|||
source "arch/mips/jz4740/Kconfig"
|
||||
source "arch/mips/lantiq/Kconfig"
|
||||
source "arch/mips/lasat/Kconfig"
|
||||
source "arch/mips/pmc-sierra/Kconfig"
|
||||
source "arch/mips/pmcs-msp71xx/Kconfig"
|
||||
source "arch/mips/powertv/Kconfig"
|
||||
source "arch/mips/ralink/Kconfig"
|
||||
source "arch/mips/sgi-ip27/Kconfig"
|
||||
source "arch/mips/sibyte/Kconfig"
|
||||
source "arch/mips/txx9/Kconfig"
|
||||
|
@ -917,6 +928,9 @@ config CSRC_POWERTV
|
|||
config CSRC_R4K
|
||||
bool
|
||||
|
||||
config CSRC_GIC
|
||||
bool
|
||||
|
||||
config CSRC_SB1250
|
||||
bool
|
||||
|
||||
|
@ -1103,19 +1117,6 @@ config SOC_PNX8335
|
|||
bool
|
||||
select SOC_PNX833X
|
||||
|
||||
config PNX8550
|
||||
bool
|
||||
select SOC_PNX8550
|
||||
|
||||
config SOC_PNX8550
|
||||
bool
|
||||
select DMA_NONCOHERENT
|
||||
select HW_HAS_PCI
|
||||
select SYS_HAS_CPU_MIPS32_R1
|
||||
select SYS_HAS_EARLY_PRINTK
|
||||
select SYS_SUPPORTS_32BIT_KERNEL
|
||||
select GENERIC_GPIO
|
||||
|
||||
config SWAP_IO_SPACE
|
||||
bool
|
||||
|
||||
|
|
|
@ -191,7 +191,7 @@ endif
|
|||
include $(srctree)/arch/mips/Kbuild.platforms
|
||||
|
||||
ifdef CONFIG_PHYSICAL_START
|
||||
load-y = $(CONFIG_PHYSICAL_START)
|
||||
load-y = $(CONFIG_PHYSICAL_START)
|
||||
endif
|
||||
|
||||
cflags-y += -I$(srctree)/arch/mips/include/asm/mach-generic
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Core Alchemy code
|
||||
#
|
||||
platform-$(CONFIG_MIPS_ALCHEMY) += alchemy/common/
|
||||
platform-$(CONFIG_MIPS_ALCHEMY) += alchemy/common/
|
||||
|
||||
|
||||
#
|
||||
|
@ -45,7 +45,7 @@ load-$(CONFIG_MIPS_MTX1) += 0xffffffff80100000
|
|||
#
|
||||
# MyCable eval board
|
||||
#
|
||||
platform-$(CONFIG_MIPS_XXS1500) += alchemy/
|
||||
platform-$(CONFIG_MIPS_XXS1500) += alchemy/
|
||||
load-$(CONFIG_MIPS_XXS1500) += 0xffffffff80100000
|
||||
|
||||
#
|
||||
|
@ -56,7 +56,7 @@ load-$(CONFIG_MIPS_GPR) += 0xffffffff80100000
|
|||
|
||||
# boards can specify their own <gpio.h> in one of their include dirs.
|
||||
# If they do, placing this line here at the end will make sure the
|
||||
# compiler picks the board one. If they don't, it will make sure
|
||||
# compiler picks the board one. If they don't, it will make sure
|
||||
# the alchemy generic gpio header is picked up.
|
||||
|
||||
cflags-$(CONFIG_MIPS_ALCHEMY) += -I$(srctree)/arch/mips/include/asm/mach-au1x00
|
||||
|
|
|
@ -135,33 +135,33 @@ static struct mtd_partition gpr_mtd_partitions[] = {
|
|||
{
|
||||
.name = "kernel",
|
||||
.size = 0x00200000,
|
||||
.offset = 0,
|
||||
.offset = 0,
|
||||
},
|
||||
{
|
||||
.name = "rootfs",
|
||||
.size = 0x00800000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
{
|
||||
.name = "config",
|
||||
.size = 0x00200000,
|
||||
.offset = 0x01d00000,
|
||||
.offset = 0x01d00000,
|
||||
},
|
||||
{
|
||||
.name = "yamon",
|
||||
.size = 0x00100000,
|
||||
.offset = 0x01c00000,
|
||||
.offset = 0x01c00000,
|
||||
},
|
||||
{
|
||||
.name = "yamon env vars",
|
||||
.size = 0x00040000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
},
|
||||
{
|
||||
.name = "kernel+rootfs",
|
||||
.size = 0x00a00000,
|
||||
.offset = 0,
|
||||
.offset = 0,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -173,23 +173,23 @@ static struct mtd_partition mtx1_mtd_partitions[] = {
|
|||
{
|
||||
.name = "filesystem",
|
||||
.size = 0x01C00000,
|
||||
.offset = 0,
|
||||
.offset = 0,
|
||||
},
|
||||
{
|
||||
.name = "yamon",
|
||||
.size = 0x00100000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.mask_flags = MTD_WRITEABLE,
|
||||
},
|
||||
{
|
||||
.name = "kernel",
|
||||
.size = 0x002c0000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
},
|
||||
{
|
||||
.name = "yamon env",
|
||||
.size = 0x00040000,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -252,7 +252,7 @@ EXPORT_SYMBOL(au1xxx_ddma_del_device);
|
|||
u32 au1xxx_dbdma_chan_alloc(u32 srcid, u32 destid,
|
||||
void (*callback)(int, void *), void *callparam)
|
||||
{
|
||||
unsigned long flags;
|
||||
unsigned long flags;
|
||||
u32 used, chan;
|
||||
u32 dcp;
|
||||
int i;
|
||||
|
@ -512,7 +512,7 @@ u32 au1xxx_dbdma_ring_alloc(u32 chanid, int entries)
|
|||
break;
|
||||
}
|
||||
|
||||
/* If source input is FIFO, set static address. */
|
||||
/* If source input is FIFO, set static address. */
|
||||
if (stp->dev_flags & DEV_FLAGS_IN) {
|
||||
if (stp->dev_flags & DEV_FLAGS_BURSTABLE)
|
||||
src1 |= DSCR_SRC1_SAM(DSCR_xAM_BURST);
|
||||
|
@ -635,7 +635,7 @@ u32 au1xxx_dbdma_put_source(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
|
|||
dma_cache_wback_inv((unsigned long)dp, sizeof(*dp));
|
||||
ctp->chan_ptr->ddma_dbell = 0;
|
||||
|
||||
/* Get next descriptor pointer. */
|
||||
/* Get next descriptor pointer. */
|
||||
ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
|
||||
|
||||
/* Return something non-zero. */
|
||||
|
@ -697,7 +697,7 @@ u32 au1xxx_dbdma_put_dest(u32 chanid, dma_addr_t buf, int nbytes, u32 flags)
|
|||
dma_cache_wback_inv((unsigned long)dp, sizeof(*dp));
|
||||
ctp->chan_ptr->ddma_dbell = 0;
|
||||
|
||||
/* Get next descriptor pointer. */
|
||||
/* Get next descriptor pointer. */
|
||||
ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
|
||||
|
||||
/* Return something non-zero. */
|
||||
|
@ -742,7 +742,7 @@ u32 au1xxx_dbdma_get_dest(u32 chanid, void **buf, int *nbytes)
|
|||
*nbytes = dp->dscr_cmd1;
|
||||
rv = dp->dscr_stat;
|
||||
|
||||
/* Get next descriptor pointer. */
|
||||
/* Get next descriptor pointer. */
|
||||
ctp->get_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
|
||||
|
||||
/* Return something non-zero. */
|
||||
|
@ -891,7 +891,7 @@ void au1xxx_dbdma_dump(u32 chanid)
|
|||
chan_tab_t *ctp;
|
||||
au1x_ddma_desc_t *dp;
|
||||
dbdev_tab_t *stp, *dtp;
|
||||
au1x_dma_chan_t *cp;
|
||||
au1x_dma_chan_t *cp;
|
||||
u32 i = 0;
|
||||
|
||||
ctp = *((chan_tab_t **)chanid);
|
||||
|
@ -969,7 +969,7 @@ u32 au1xxx_dbdma_put_dscr(u32 chanid, au1x_ddma_desc_t *dscr)
|
|||
dp->dscr_cmd0 |= dscr->dscr_cmd0 | DSCR_CMD0_V;
|
||||
ctp->chan_ptr->ddma_dbell = 0;
|
||||
|
||||
/* Get next descriptor pointer. */
|
||||
/* Get next descriptor pointer. */
|
||||
ctp->put_ptr = phys_to_virt(DSCR_GET_NXTPTR(dp->dscr_nxtptr));
|
||||
|
||||
/* Return something non-zero. */
|
||||
|
|
|
@ -106,14 +106,14 @@ struct gpio_chip alchemy_gpio_chip[] = {
|
|||
.ngpio = ALCHEMY_GPIO1_NUM,
|
||||
},
|
||||
[1] = {
|
||||
.label = "alchemy-gpio2",
|
||||
.direction_input = gpio2_direction_input,
|
||||
.direction_output = gpio2_direction_output,
|
||||
.get = gpio2_get,
|
||||
.set = gpio2_set,
|
||||
.label = "alchemy-gpio2",
|
||||
.direction_input = gpio2_direction_input,
|
||||
.direction_output = gpio2_direction_output,
|
||||
.get = gpio2_get,
|
||||
.set = gpio2_set,
|
||||
.to_irq = gpio2_to_irq,
|
||||
.base = ALCHEMY_GPIO2_BASE,
|
||||
.ngpio = ALCHEMY_GPIO2_NUM,
|
||||
.base = ALCHEMY_GPIO2_BASE,
|
||||
.ngpio = ALCHEMY_GPIO2_NUM,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -84,20 +84,20 @@ static int au1300_gpic_settype(struct irq_data *d, unsigned int type);
|
|||
* needs the highest priority.
|
||||
*/
|
||||
struct alchemy_irqmap au1000_irqmap[] __initdata = {
|
||||
{ AU1000_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_UART2_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_SSI0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_SSI1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_UART2_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_SSI0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_SSI1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_TOY_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1000_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1000_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
|
@ -106,33 +106,33 @@ struct alchemy_irqmap au1000_irqmap[] __initdata = {
|
|||
{ AU1000_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1000_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1000_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0, 0 },
|
||||
{ AU1000_IRDA_TX_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_IRDA_RX_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0, 0 },
|
||||
{ AU1000_IRDA_TX_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_IRDA_RX_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0, 0 },
|
||||
{ AU1000_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1000_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1000_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1000_ACSYNC_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1000_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1000_AC97C_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
struct alchemy_irqmap au1500_irqmap[] __initdata = {
|
||||
{ AU1500_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_PCI_INTA, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_PCI_INTB, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_PCI_INTC, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_PCI_INTD, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_PCI_INTA, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_PCI_INTB, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_PCI_INTC, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_PCI_INTD, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_TOY_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1500_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1500_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
|
@ -141,31 +141,31 @@ struct alchemy_irqmap au1500_irqmap[] __initdata = {
|
|||
{ AU1500_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1500_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1500_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0, 0 },
|
||||
{ AU1500_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0, 0 },
|
||||
{ AU1500_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0, 0 },
|
||||
{ AU1500_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1500_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1500_ACSYNC_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1500_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1500_AC97C_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
struct alchemy_irqmap au1100_irqmap[] __initdata = {
|
||||
{ AU1100_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_SD_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_SSI0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_SSI1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_SD_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_SSI0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_SSI1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+1, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+2, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+3, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+4, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+5, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+6, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_DMA_INT_BASE+7, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_TOY_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1100_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1100_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
|
@ -174,33 +174,33 @@ struct alchemy_irqmap au1100_irqmap[] __initdata = {
|
|||
{ AU1100_RTC_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1100_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1100_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0, 0 },
|
||||
{ AU1100_IRDA_TX_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_IRDA_RX_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0, 0 },
|
||||
{ AU1100_IRDA_TX_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_IRDA_RX_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0, 0 },
|
||||
{ AU1100_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1100_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1100_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1100_ACSYNC_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1100_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_LCD_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_LCD_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1100_AC97C_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
struct alchemy_irqmap au1550_irqmap[] __initdata = {
|
||||
{ AU1550_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PCI_INTA, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_PCI_INTB, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_DDMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_CRYPTO_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PCI_INTC, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_PCI_INTD, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_PCI_RST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PSC0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PSC1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PSC2_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PSC3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PCI_INTA, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_PCI_INTB, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_DDMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_CRYPTO_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PCI_INTC, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_PCI_INTD, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_PCI_RST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_UART3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PSC0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PSC1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PSC2_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_PSC3_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_TOY_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1550_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1550_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
|
@ -210,26 +210,26 @@ struct alchemy_irqmap au1550_irqmap[] __initdata = {
|
|||
{ AU1550_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1550_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0, 0 },
|
||||
{ AU1550_NAND_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1550_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0, 0 },
|
||||
{ AU1550_USB_DEV_REQ_INT, IRQ_TYPE_LEVEL_HIGH, 0, 0 },
|
||||
{ AU1550_USB_DEV_SUS_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1550_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_USB_HOST_INT, IRQ_TYPE_LEVEL_LOW, 1, 0 },
|
||||
{ AU1550_MAC0_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1550_MAC1_DMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
struct alchemy_irqmap au1200_irqmap[] __initdata = {
|
||||
{ AU1200_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_UART0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_SWT_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1200_SD_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_DDMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_MAE_BE_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_MAE_FE_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_PSC0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_PSC1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_AES_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_CAMERA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_SD_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_DDMA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_MAE_BE_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_UART1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_MAE_FE_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_PSC0_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_PSC1_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_AES_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_CAMERA_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_TOY_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1200_TOY_MATCH0_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1200_TOY_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
|
@ -239,9 +239,9 @@ struct alchemy_irqmap au1200_irqmap[] __initdata = {
|
|||
{ AU1200_RTC_MATCH1_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1200_RTC_MATCH2_INT, IRQ_TYPE_EDGE_RISING, 0, 0 },
|
||||
{ AU1200_NAND_INT, IRQ_TYPE_EDGE_RISING, 1, 0 },
|
||||
{ AU1200_USB_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_LCD_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_MAE_BOTH_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_USB_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_LCD_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ AU1200_MAE_BOTH_INT, IRQ_TYPE_LEVEL_HIGH, 1, 0 },
|
||||
{ -1, },
|
||||
};
|
||||
|
||||
|
|
|
@ -53,7 +53,7 @@ static void alchemy_8250_pm(struct uart_port *port, unsigned int state,
|
|||
.irq = _irq, \
|
||||
.regshift = 2, \
|
||||
.iotype = UPIO_AU, \
|
||||
.flags = UPF_SKIP_TEST | UPF_IOREMAP | \
|
||||
.flags = UPF_SKIP_TEST | UPF_IOREMAP | \
|
||||
UPF_FIXED_TYPE, \
|
||||
.type = PORT_16550A, \
|
||||
.pm = alchemy_8250_pm, \
|
||||
|
@ -137,7 +137,7 @@ static void alchemy_ehci_power_off(struct platform_device *pdev)
|
|||
}
|
||||
|
||||
static struct usb_ehci_pdata alchemy_ehci_pdata = {
|
||||
.no_io_watchdog = 1,
|
||||
.no_io_watchdog = 1,
|
||||
.power_on = alchemy_ehci_power_on,
|
||||
.power_off = alchemy_ehci_power_off,
|
||||
.power_suspend = alchemy_ehci_power_off,
|
||||
|
|
|
@ -59,7 +59,7 @@ void __init plat_mem_setup(void)
|
|||
/* Clear to obtain best system bus performance */
|
||||
clear_c0_config(1 << 19); /* Clear Config[OD] */
|
||||
|
||||
board_setup(); /* board specific setup */
|
||||
board_setup(); /* board specific setup */
|
||||
|
||||
/* IO/MEM resources. */
|
||||
set_io_port_base(0);
|
||||
|
|
|
@ -102,12 +102,12 @@ LEAF(alchemy_sleep_au1000)
|
|||
cache 0x14, 96(t0)
|
||||
.set mips0
|
||||
|
||||
1: lui a0, 0xb400 /* mem_xxx */
|
||||
sw zero, 0x001c(a0) /* Precharge */
|
||||
1: lui a0, 0xb400 /* mem_xxx */
|
||||
sw zero, 0x001c(a0) /* Precharge */
|
||||
sync
|
||||
sw zero, 0x0020(a0) /* Auto Refresh */
|
||||
sync
|
||||
sw zero, 0x0030(a0) /* Sleep */
|
||||
sw zero, 0x0030(a0) /* Sleep */
|
||||
sync
|
||||
|
||||
DO_SLEEP
|
||||
|
@ -128,15 +128,15 @@ LEAF(alchemy_sleep_au1550)
|
|||
cache 0x14, 96(t0)
|
||||
.set mips0
|
||||
|
||||
1: lui a0, 0xb400 /* mem_xxx */
|
||||
sw zero, 0x08c0(a0) /* Precharge */
|
||||
1: lui a0, 0xb400 /* mem_xxx */
|
||||
sw zero, 0x08c0(a0) /* Precharge */
|
||||
sync
|
||||
sw zero, 0x08d0(a0) /* Self Refresh */
|
||||
sync
|
||||
|
||||
/* wait for sdram to enter self-refresh mode */
|
||||
lui t0, 0x0100
|
||||
2: lw t1, 0x0850(a0) /* mem_sdstat */
|
||||
lui t0, 0x0100
|
||||
2: lw t1, 0x0850(a0) /* mem_sdstat */
|
||||
and t2, t1, t0
|
||||
beq t2, zero, 2b
|
||||
nop
|
||||
|
@ -144,9 +144,9 @@ LEAF(alchemy_sleep_au1550)
|
|||
/* disable SDRAM clocks */
|
||||
lui t0, 0xcfff
|
||||
ori t0, t0, 0xffff
|
||||
lw t1, 0x0840(a0) /* mem_sdconfiga */
|
||||
and t1, t0, t1 /* clear CE[1:0] */
|
||||
sw t1, 0x0840(a0) /* mem_sdconfiga */
|
||||
lw t1, 0x0840(a0) /* mem_sdconfiga */
|
||||
and t1, t0, t1 /* clear CE[1:0] */
|
||||
sw t1, 0x0840(a0) /* mem_sdconfiga */
|
||||
sync
|
||||
|
||||
DO_SLEEP
|
||||
|
|
|
@ -85,7 +85,7 @@ static struct clock_event_device au1x_rtcmatch2_clockdev = {
|
|||
.name = "rtcmatch2",
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||
.rating = 1500,
|
||||
.set_next_event = au1x_rtcmatch2_set_next_event,
|
||||
.set_next_event = au1x_rtcmatch2_set_next_event,
|
||||
.set_mode = au1x_rtcmatch2_set_mode,
|
||||
.cpumask = cpu_all_mask,
|
||||
};
|
||||
|
|
|
@ -122,7 +122,7 @@ static inline void __au1300_ohci_control(void __iomem *base, int enable, int id)
|
|||
unsigned long r;
|
||||
|
||||
if (enable) {
|
||||
__raw_writel(1, base + USB_DWC_CTRL7); /* start OHCI clock */
|
||||
__raw_writel(1, base + USB_DWC_CTRL7); /* start OHCI clock */
|
||||
wmb();
|
||||
|
||||
r = __raw_readl(base + USB_DWC_CTRL3); /* enable OHCI block */
|
||||
|
|
|
@ -20,7 +20,7 @@ static struct bcsr_reg {
|
|||
spinlock_t lock;
|
||||
} bcsr_regs[BCSR_CNT];
|
||||
|
||||
static void __iomem *bcsr_virt; /* KSEG1 addr of BCSR base */
|
||||
static void __iomem *bcsr_virt; /* KSEG1 addr of BCSR base */
|
||||
static int bcsr_csc_base; /* linux-irq of first cascaded irq */
|
||||
|
||||
void __init bcsr_init(unsigned long bcsr1_phys, unsigned long bcsr2_phys)
|
||||
|
|
|
@ -276,7 +276,7 @@ static void db1100_mmcled_set(struct led_classdev *led, enum led_brightness b)
|
|||
}
|
||||
|
||||
static struct led_classdev db1100_mmc_led = {
|
||||
.brightness_set = db1100_mmcled_set,
|
||||
.brightness_set = db1100_mmcled_set,
|
||||
};
|
||||
|
||||
static int db1100_mmc1_card_readonly(void *mmc_host)
|
||||
|
@ -314,7 +314,7 @@ static void db1100_mmc1led_set(struct led_classdev *led, enum led_brightness b)
|
|||
}
|
||||
|
||||
static struct led_classdev db1100_mmc1_led = {
|
||||
.brightness_set = db1100_mmc1led_set,
|
||||
.brightness_set = db1100_mmc1led_set,
|
||||
};
|
||||
|
||||
static struct au1xmmc_platform_data db1100_mmc_platdata[2] = {
|
||||
|
@ -357,7 +357,7 @@ static struct resource au1100_mmc0_resources[] = {
|
|||
}
|
||||
};
|
||||
|
||||
static u64 au1xxx_mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static u64 au1xxx_mmc_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device db1100_mmc0_dev = {
|
||||
.name = "au1xxx-mmc",
|
||||
|
@ -482,7 +482,7 @@ static struct spi_board_info db1100_spi_info[] __initdata = {
|
|||
.mode = 0,
|
||||
.irq = AU1100_GPIO21_INT,
|
||||
.platform_data = &db1100_touch_pd,
|
||||
.controller_data = (void *)210, /* for spi_gpio: CS# GPIO210 */
|
||||
.controller_data = (void *)210, /* for spi_gpio: CS# GPIO210 */
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -572,7 +572,7 @@ static int __init db1000_dev_init(void)
|
|||
irq_set_irq_type(AU1500_GPIO204_INT, IRQ_TYPE_LEVEL_LOW);
|
||||
irq_set_irq_type(AU1500_GPIO205_INT, IRQ_TYPE_LEVEL_LOW);
|
||||
/* EPSON S1D13806 0x1b000000
|
||||
* SRAM 1MB/2MB 0x1a000000
|
||||
* SRAM 1MB/2MB 0x1a000000
|
||||
* DS1693 RTC 0x0c000000
|
||||
*/
|
||||
} else if (board == BCSR_WHOAMI_PB1100) {
|
||||
|
@ -586,7 +586,7 @@ static int __init db1000_dev_init(void)
|
|||
irq_set_irq_type(AU1100_GPIO12_INT, IRQ_TYPE_LEVEL_LOW);
|
||||
irq_set_irq_type(AU1100_GPIO13_INT, IRQ_TYPE_LEVEL_LOW);
|
||||
/* EPSON S1D13806 0x1b000000
|
||||
* SRAM 1MB/2MB 0x1a000000
|
||||
* SRAM 1MB/2MB 0x1a000000
|
||||
* DiskOnChip 0x0d000000
|
||||
* DS1693 RTC 0x0c000000
|
||||
*/
|
||||
|
@ -605,7 +605,7 @@ static int __init db1000_dev_init(void)
|
|||
AU1000_PCMCIA_MEM_PHYS_ADDR + 0x000400000 - 1,
|
||||
AU1000_PCMCIA_IO_PHYS_ADDR,
|
||||
AU1000_PCMCIA_IO_PHYS_ADDR + 0x000010000 - 1,
|
||||
c0, d0, /*s0*/0, 0, 0);
|
||||
c0, d0, /*s0*/0, 0, 0);
|
||||
|
||||
if (twosocks) {
|
||||
irq_set_irq_type(d1, IRQ_TYPE_EDGE_BOTH);
|
||||
|
@ -619,7 +619,7 @@ static int __init db1000_dev_init(void)
|
|||
AU1000_PCMCIA_MEM_PHYS_ADDR + 0x004400000 - 1,
|
||||
AU1000_PCMCIA_IO_PHYS_ADDR + 0x004000000,
|
||||
AU1000_PCMCIA_IO_PHYS_ADDR + 0x004010000 - 1,
|
||||
c1, d1, /*s1*/0, 0, 1);
|
||||
c1, d1, /*s1*/0, 0, 1);
|
||||
}
|
||||
|
||||
platform_add_devices(db1x00_devs, ARRAY_SIZE(db1x00_devs));
|
||||
|
|
|
@ -90,14 +90,14 @@ int __init db1200_board_setup(void)
|
|||
|
||||
whoami = bcsr_read(BCSR_WHOAMI);
|
||||
printk(KERN_INFO "Alchemy/AMD/RMI %s Board, CPLD Rev %d"
|
||||
" Board-ID %d Daughtercard ID %d\n", get_system_type(),
|
||||
" Board-ID %d Daughtercard ID %d\n", get_system_type(),
|
||||
(whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf);
|
||||
|
||||
/* SMBus/SPI on PSC0, Audio on PSC1 */
|
||||
pfc = __raw_readl((void __iomem *)SYS_PINFUNC);
|
||||
pfc &= ~(SYS_PINFUNC_P0A | SYS_PINFUNC_P0B);
|
||||
pfc &= ~(SYS_PINFUNC_P1A | SYS_PINFUNC_P1B | SYS_PINFUNC_FS3);
|
||||
pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */
|
||||
pfc |= SYS_PINFUNC_P1C; /* SPI is configured later */
|
||||
__raw_writel(pfc, (void __iomem *)SYS_PINFUNC);
|
||||
wmb();
|
||||
|
||||
|
@ -129,7 +129,7 @@ int __init db1200_board_setup(void)
|
|||
static struct mtd_partition db1200_spiflash_parts[] = {
|
||||
{
|
||||
.name = "spi_flash",
|
||||
.offset = 0,
|
||||
.offset = 0,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
@ -200,12 +200,12 @@ static int au1200_nand_device_ready(struct mtd_info *mtd)
|
|||
static struct mtd_partition db1200_nand_parts[] = {
|
||||
{
|
||||
.name = "NAND FS 0",
|
||||
.offset = 0,
|
||||
.offset = 0,
|
||||
.size = 8 * 1024 * 1024,
|
||||
},
|
||||
{
|
||||
.name = "NAND FS 1",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = MTDPART_SIZ_FULL
|
||||
},
|
||||
};
|
||||
|
@ -395,7 +395,7 @@ static void db1200_mmcled_set(struct led_classdev *led,
|
|||
}
|
||||
|
||||
static struct led_classdev db1200_mmc_led = {
|
||||
.brightness_set = db1200_mmcled_set,
|
||||
.brightness_set = db1200_mmcled_set,
|
||||
};
|
||||
|
||||
/* -- */
|
||||
|
@ -463,7 +463,7 @@ static void pb1200_mmc1led_set(struct led_classdev *led,
|
|||
}
|
||||
|
||||
static struct led_classdev pb1200_mmc1_led = {
|
||||
.brightness_set = pb1200_mmc1led_set,
|
||||
.brightness_set = pb1200_mmc1led_set,
|
||||
};
|
||||
|
||||
static void pb1200_mmc1_set_power(void *mmc_host, int state)
|
||||
|
@ -526,7 +526,7 @@ static struct resource au1200_mmc0_resources[] = {
|
|||
}
|
||||
};
|
||||
|
||||
static u64 au1xxx_mmc_dmamask = DMA_BIT_MASK(32);
|
||||
static u64 au1xxx_mmc_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct platform_device db1200_mmc0_dev = {
|
||||
.name = "au1xxx-mmc",
|
||||
|
@ -601,7 +601,7 @@ static int db1200fb_panel_shutdown(void)
|
|||
static struct au1200fb_platdata db1200fb_pd = {
|
||||
.panel_index = db1200fb_panel_index,
|
||||
.panel_init = db1200fb_panel_init,
|
||||
.panel_shutdown = db1200fb_panel_shutdown,
|
||||
.panel_shutdown = db1200fb_panel_shutdown,
|
||||
};
|
||||
|
||||
static struct resource au1200_lcd_res[] = {
|
||||
|
@ -772,11 +772,11 @@ static int __init pb1200_res_fixup(void)
|
|||
}
|
||||
|
||||
db1200_nand_res[0].start = PB1200_NAND_PHYS_ADDR;
|
||||
db1200_nand_res[0].end = PB1200_NAND_PHYS_ADDR + 0xff;
|
||||
db1200_nand_res[0].end = PB1200_NAND_PHYS_ADDR + 0xff;
|
||||
db1200_ide_res[0].start = PB1200_IDE_PHYS_ADDR;
|
||||
db1200_ide_res[0].end = PB1200_IDE_PHYS_ADDR + DB1200_IDE_PHYS_LEN - 1;
|
||||
db1200_ide_res[0].end = PB1200_IDE_PHYS_ADDR + DB1200_IDE_PHYS_LEN - 1;
|
||||
db1200_eth_res[0].start = PB1200_ETH_PHYS_ADDR;
|
||||
db1200_eth_res[0].end = PB1200_ETH_PHYS_ADDR + 0xff;
|
||||
db1200_eth_res[0].end = PB1200_ETH_PHYS_ADDR + 0xff;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -797,7 +797,7 @@ int __init db1200_dev_setup(void)
|
|||
irq_set_irq_type(AU1200_GPIO7_INT, IRQ_TYPE_LEVEL_LOW);
|
||||
bcsr_init_irq(DB1200_INT_BEGIN, DB1200_INT_END, AU1200_GPIO7_INT);
|
||||
|
||||
/* insert/eject pairs: one of both is always screaming. To avoid
|
||||
/* insert/eject pairs: one of both is always screaming. To avoid
|
||||
* issues they must not be automatically enabled when initially
|
||||
* requested.
|
||||
*/
|
||||
|
@ -813,7 +813,7 @@ int __init db1200_dev_setup(void)
|
|||
spi_register_board_info(db1200_spi_devs,
|
||||
ARRAY_SIZE(db1200_i2c_devs));
|
||||
|
||||
/* SWITCHES: S6.8 I2C/SPI selector (OFF=I2C ON=SPI)
|
||||
/* SWITCHES: S6.8 I2C/SPI selector (OFF=I2C ON=SPI)
|
||||
* S6.7 AC97/I2S selector (OFF=AC97 ON=I2S)
|
||||
* or S12 on the PB1200.
|
||||
*/
|
||||
|
|
|
@ -80,7 +80,7 @@ static int db1300_dev_pins[] __initdata = {
|
|||
AU1300_PIN_PSC0D1,
|
||||
AU1300_PIN_PSC1SYNC0, AU1300_PIN_PSC1SYNC1, AU1300_PIN_PSC1D0,
|
||||
AU1300_PIN_PSC1D1,
|
||||
AU1300_PIN_PSC2SYNC0, AU1300_PIN_PSC2D0,
|
||||
AU1300_PIN_PSC2SYNC0, AU1300_PIN_PSC2D0,
|
||||
AU1300_PIN_PSC2D1,
|
||||
AU1300_PIN_PSC3SYNC0, AU1300_PIN_PSC3SYNC1, AU1300_PIN_PSC3D0,
|
||||
AU1300_PIN_PSC3D1,
|
||||
|
@ -143,12 +143,12 @@ static int au1300_nand_device_ready(struct mtd_info *mtd)
|
|||
static struct mtd_partition db1300_nand_parts[] = {
|
||||
{
|
||||
.name = "NAND FS 0",
|
||||
.offset = 0,
|
||||
.offset = 0,
|
||||
.size = 8 * 1024 * 1024,
|
||||
},
|
||||
{
|
||||
.name = "NAND FS 1",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = MTDPART_SIZ_FULL
|
||||
},
|
||||
};
|
||||
|
@ -487,7 +487,7 @@ static void db1300_mmcled_set(struct led_classdev *led,
|
|||
}
|
||||
|
||||
static struct led_classdev db1300_mmc_led = {
|
||||
.brightness_set = db1300_mmcled_set,
|
||||
.brightness_set = db1300_mmcled_set,
|
||||
};
|
||||
|
||||
struct au1xmmc_platform_data db1300_sd1_platdata = {
|
||||
|
@ -646,7 +646,7 @@ static int db1300fb_panel_shutdown(void)
|
|||
static struct au1200fb_platdata db1300fb_pd = {
|
||||
.panel_index = db1300fb_panel_index,
|
||||
.panel_init = db1300fb_panel_init,
|
||||
.panel_shutdown = db1300fb_panel_shutdown,
|
||||
.panel_shutdown = db1300fb_panel_shutdown,
|
||||
};
|
||||
|
||||
static struct resource au1300_lcd_res[] = {
|
||||
|
|
|
@ -67,7 +67,7 @@ int __init db1550_board_setup(void)
|
|||
bcsr_init(PB1550_BCSR_PHYS_ADDR,
|
||||
PB1550_BCSR_PHYS_ADDR + PB1550_BCSR_HEXLED_OFS);
|
||||
|
||||
pr_info("Alchemy/AMD %s Board, CPLD Rev %d Board-ID %d " \
|
||||
pr_info("Alchemy/AMD %s Board, CPLD Rev %d Board-ID %d " \
|
||||
"Daughtercard ID %d\n", get_system_type(),
|
||||
(whoami >> 4) & 0xf, (whoami >> 8) & 0xf, whoami & 0xf);
|
||||
|
||||
|
@ -80,7 +80,7 @@ int __init db1550_board_setup(void)
|
|||
static struct mtd_partition db1550_spiflash_parts[] = {
|
||||
{
|
||||
.name = "spi_flash",
|
||||
.offset = 0,
|
||||
.offset = 0,
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
},
|
||||
};
|
||||
|
@ -151,12 +151,12 @@ static int au1550_nand_device_ready(struct mtd_info *mtd)
|
|||
static struct mtd_partition db1550_nand_parts[] = {
|
||||
{
|
||||
.name = "NAND FS 0",
|
||||
.offset = 0,
|
||||
.offset = 0,
|
||||
.size = 8 * 1024 * 1024,
|
||||
},
|
||||
{
|
||||
.name = "NAND FS 1",
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.offset = MTDPART_OFS_APPEND,
|
||||
.size = MTDPART_SIZ_FULL
|
||||
},
|
||||
};
|
||||
|
@ -495,10 +495,10 @@ static void __init db1550_devices(void)
|
|||
{
|
||||
alchemy_gpio_direction_output(203, 0); /* red led on */
|
||||
|
||||
irq_set_irq_type(AU1550_GPIO0_INT, IRQ_TYPE_EDGE_BOTH); /* CD0# */
|
||||
irq_set_irq_type(AU1550_GPIO1_INT, IRQ_TYPE_EDGE_BOTH); /* CD1# */
|
||||
irq_set_irq_type(AU1550_GPIO3_INT, IRQ_TYPE_LEVEL_LOW); /* CARD0# */
|
||||
irq_set_irq_type(AU1550_GPIO5_INT, IRQ_TYPE_LEVEL_LOW); /* CARD1# */
|
||||
irq_set_irq_type(AU1550_GPIO0_INT, IRQ_TYPE_EDGE_BOTH); /* CD0# */
|
||||
irq_set_irq_type(AU1550_GPIO1_INT, IRQ_TYPE_EDGE_BOTH); /* CD1# */
|
||||
irq_set_irq_type(AU1550_GPIO3_INT, IRQ_TYPE_LEVEL_LOW); /* CARD0# */
|
||||
irq_set_irq_type(AU1550_GPIO5_INT, IRQ_TYPE_LEVEL_LOW); /* CARD1# */
|
||||
irq_set_irq_type(AU1550_GPIO21_INT, IRQ_TYPE_LEVEL_LOW); /* STSCHG0# */
|
||||
irq_set_irq_type(AU1550_GPIO22_INT, IRQ_TYPE_LEVEL_LOW); /* STSCHG1# */
|
||||
|
||||
|
@ -539,7 +539,7 @@ static void __init pb1550_devices(void)
|
|||
|
||||
/* Pb1550, like all others, also has statuschange irqs; however they're
|
||||
* wired up on one of the Au1550's shared GPIO201_205 line, which also
|
||||
* services the PCMCIA card interrupts. So we ignore statuschange and
|
||||
* services the PCMCIA card interrupts. So we ignore statuschange and
|
||||
* use the GPIO201_205 exclusively for card interrupts, since a) pcmcia
|
||||
* drivers are used to shared irqs and b) statuschange isn't really use-
|
||||
* ful anyway.
|
||||
|
|
|
@ -194,7 +194,7 @@ static ssize_t db1x_pmattr_store(struct kobject *kobj,
|
|||
}
|
||||
|
||||
#define ATTR(x) \
|
||||
static struct kobj_attribute x##_attribute = \
|
||||
static struct kobj_attribute x##_attribute = \
|
||||
__ATTR(x, 0664, db1x_pmattr_show, \
|
||||
db1x_pmattr_store);
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
#
|
||||
# Texas Instruments AR7
|
||||
#
|
||||
platform-$(CONFIG_AR7) += ar7/
|
||||
cflags-$(CONFIG_AR7) += -I$(srctree)/arch/mips/include/asm/mach-ar7
|
||||
load-$(CONFIG_AR7) += 0xffffffff94100000
|
||||
platform-$(CONFIG_AR7) += ar7/
|
||||
cflags-$(CONFIG_AR7) += -I$(srctree)/arch/mips/include/asm/mach-ar7
|
||||
load-$(CONFIG_AR7) += 0xffffffff94100000
|
||||
|
|
|
@ -492,11 +492,11 @@ static struct gpio_led gt701_leds[] = {
|
|||
.active_low = 1,
|
||||
.default_trigger = "default-on",
|
||||
},
|
||||
{
|
||||
.name = "ethernet",
|
||||
.gpio = 10,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "ethernet",
|
||||
.gpio = 10,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct gpio_led_platform_data ar7_led_data;
|
||||
|
@ -512,7 +512,7 @@ static void __init detect_leds(void)
|
|||
{
|
||||
char *prid, *usb_prod;
|
||||
|
||||
/* Default LEDs */
|
||||
/* Default LEDs */
|
||||
ar7_led_data.num_leds = ARRAY_SIZE(default_leds);
|
||||
ar7_led_data.leds = default_leds;
|
||||
|
||||
|
|
|
@ -14,6 +14,18 @@ config ATH79_MACH_AP121
|
|||
Say 'Y' here if you want your kernel to support the
|
||||
Atheros AP121 reference board.
|
||||
|
||||
config ATH79_MACH_AP136
|
||||
bool "Atheros AP136 reference board"
|
||||
select SOC_QCA955X
|
||||
select ATH79_DEV_GPIO_BUTTONS
|
||||
select ATH79_DEV_LEDS_GPIO
|
||||
select ATH79_DEV_SPI
|
||||
select ATH79_DEV_USB
|
||||
select ATH79_DEV_WMAC
|
||||
help
|
||||
Say 'Y' here if you want your kernel to support the
|
||||
Atheros AP136 reference board.
|
||||
|
||||
config ATH79_MACH_AP81
|
||||
bool "Atheros AP81 reference board"
|
||||
select SOC_AR913X
|
||||
|
@ -88,6 +100,12 @@ config SOC_AR934X
|
|||
select PCI_AR724X if PCI
|
||||
def_bool n
|
||||
|
||||
config SOC_QCA955X
|
||||
select USB_ARCH_HAS_EHCI
|
||||
select HW_HAS_PCI
|
||||
select PCI_AR724X if PCI
|
||||
def_bool n
|
||||
|
||||
config PCI_AR724X
|
||||
def_bool n
|
||||
|
||||
|
@ -104,7 +122,7 @@ config ATH79_DEV_USB
|
|||
def_bool n
|
||||
|
||||
config ATH79_DEV_WMAC
|
||||
depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X)
|
||||
depends on (SOC_AR913X || SOC_AR933X || SOC_AR934X || SOC_QCA955X)
|
||||
def_bool n
|
||||
|
||||
endif
|
||||
|
|
|
@ -27,6 +27,7 @@ obj-$(CONFIG_ATH79_DEV_WMAC) += dev-wmac.o
|
|||
# Machines
|
||||
#
|
||||
obj-$(CONFIG_ATH79_MACH_AP121) += mach-ap121.o
|
||||
obj-$(CONFIG_ATH79_MACH_AP136) += mach-ap136.o
|
||||
obj-$(CONFIG_ATH79_MACH_AP81) += mach-ap81.o
|
||||
obj-$(CONFIG_ATH79_MACH_DB120) += mach-db120.o
|
||||
obj-$(CONFIG_ATH79_MACH_PB44) += mach-pb44.o
|
||||
|
|
|
@ -198,7 +198,7 @@ static void __init ar934x_clocks_init(void)
|
|||
dpll_base = ioremap(AR934X_SRIF_BASE, AR934X_SRIF_SIZE);
|
||||
|
||||
bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
|
||||
if (bootstrap & AR934X_BOOTSTRAP_REF_CLK_40)
|
||||
if (bootstrap & AR934X_BOOTSTRAP_REF_CLK_40)
|
||||
ath79_ref_clk.rate = 40 * 1000 * 1000;
|
||||
else
|
||||
ath79_ref_clk.rate = 25 * 1000 * 1000;
|
||||
|
@ -295,6 +295,82 @@ static void __init ar934x_clocks_init(void)
|
|||
iounmap(dpll_base);
|
||||
}
|
||||
|
||||
static void __init qca955x_clocks_init(void)
|
||||
{
|
||||
u32 pll, out_div, ref_div, nint, frac, clk_ctrl, postdiv;
|
||||
u32 cpu_pll, ddr_pll;
|
||||
u32 bootstrap;
|
||||
|
||||
bootstrap = ath79_reset_rr(QCA955X_RESET_REG_BOOTSTRAP);
|
||||
if (bootstrap & QCA955X_BOOTSTRAP_REF_CLK_40)
|
||||
ath79_ref_clk.rate = 40 * 1000 * 1000;
|
||||
else
|
||||
ath79_ref_clk.rate = 25 * 1000 * 1000;
|
||||
|
||||
pll = ath79_pll_rr(QCA955X_PLL_CPU_CONFIG_REG);
|
||||
out_div = (pll >> QCA955X_PLL_CPU_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA955X_PLL_CPU_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> QCA955X_PLL_CPU_CONFIG_REFDIV_SHIFT) &
|
||||
QCA955X_PLL_CPU_CONFIG_REFDIV_MASK;
|
||||
nint = (pll >> QCA955X_PLL_CPU_CONFIG_NINT_SHIFT) &
|
||||
QCA955X_PLL_CPU_CONFIG_NINT_MASK;
|
||||
frac = (pll >> QCA955X_PLL_CPU_CONFIG_NFRAC_SHIFT) &
|
||||
QCA955X_PLL_CPU_CONFIG_NFRAC_MASK;
|
||||
|
||||
cpu_pll = nint * ath79_ref_clk.rate / ref_div;
|
||||
cpu_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 6));
|
||||
cpu_pll /= (1 << out_div);
|
||||
|
||||
pll = ath79_pll_rr(QCA955X_PLL_DDR_CONFIG_REG);
|
||||
out_div = (pll >> QCA955X_PLL_DDR_CONFIG_OUTDIV_SHIFT) &
|
||||
QCA955X_PLL_DDR_CONFIG_OUTDIV_MASK;
|
||||
ref_div = (pll >> QCA955X_PLL_DDR_CONFIG_REFDIV_SHIFT) &
|
||||
QCA955X_PLL_DDR_CONFIG_REFDIV_MASK;
|
||||
nint = (pll >> QCA955X_PLL_DDR_CONFIG_NINT_SHIFT) &
|
||||
QCA955X_PLL_DDR_CONFIG_NINT_MASK;
|
||||
frac = (pll >> QCA955X_PLL_DDR_CONFIG_NFRAC_SHIFT) &
|
||||
QCA955X_PLL_DDR_CONFIG_NFRAC_MASK;
|
||||
|
||||
ddr_pll = nint * ath79_ref_clk.rate / ref_div;
|
||||
ddr_pll += frac * ath79_ref_clk.rate / (ref_div * (1 << 10));
|
||||
ddr_pll /= (1 << out_div);
|
||||
|
||||
clk_ctrl = ath79_pll_rr(QCA955X_PLL_CLK_CTRL_REG);
|
||||
|
||||
postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_SHIFT) &
|
||||
QCA955X_PLL_CLK_CTRL_CPU_POST_DIV_MASK;
|
||||
|
||||
if (clk_ctrl & QCA955X_PLL_CLK_CTRL_CPU_PLL_BYPASS)
|
||||
ath79_cpu_clk.rate = ath79_ref_clk.rate;
|
||||
else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_CPUCLK_FROM_CPUPLL)
|
||||
ath79_cpu_clk.rate = ddr_pll / (postdiv + 1);
|
||||
else
|
||||
ath79_cpu_clk.rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_SHIFT) &
|
||||
QCA955X_PLL_CLK_CTRL_DDR_POST_DIV_MASK;
|
||||
|
||||
if (clk_ctrl & QCA955X_PLL_CLK_CTRL_DDR_PLL_BYPASS)
|
||||
ath79_ddr_clk.rate = ath79_ref_clk.rate;
|
||||
else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_DDRCLK_FROM_DDRPLL)
|
||||
ath79_ddr_clk.rate = cpu_pll / (postdiv + 1);
|
||||
else
|
||||
ath79_ddr_clk.rate = ddr_pll / (postdiv + 1);
|
||||
|
||||
postdiv = (clk_ctrl >> QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_SHIFT) &
|
||||
QCA955X_PLL_CLK_CTRL_AHB_POST_DIV_MASK;
|
||||
|
||||
if (clk_ctrl & QCA955X_PLL_CLK_CTRL_AHB_PLL_BYPASS)
|
||||
ath79_ahb_clk.rate = ath79_ref_clk.rate;
|
||||
else if (clk_ctrl & QCA955X_PLL_CLK_CTRL_AHBCLK_FROM_DDRPLL)
|
||||
ath79_ahb_clk.rate = ddr_pll / (postdiv + 1);
|
||||
else
|
||||
ath79_ahb_clk.rate = cpu_pll / (postdiv + 1);
|
||||
|
||||
ath79_wdt_clk.rate = ath79_ref_clk.rate;
|
||||
ath79_uart_clk.rate = ath79_ref_clk.rate;
|
||||
}
|
||||
|
||||
void __init ath79_clocks_init(void)
|
||||
{
|
||||
if (soc_is_ar71xx())
|
||||
|
@ -307,6 +383,8 @@ void __init ath79_clocks_init(void)
|
|||
ar933x_clocks_init();
|
||||
else if (soc_is_ar934x())
|
||||
ar934x_clocks_init();
|
||||
else if (soc_is_qca955x())
|
||||
qca955x_clocks_init();
|
||||
else
|
||||
BUG();
|
||||
|
||||
|
|
|
@ -72,6 +72,8 @@ void ath79_device_reset_set(u32 mask)
|
|||
reg = AR933X_RESET_REG_RESET_MODULE;
|
||||
else if (soc_is_ar934x())
|
||||
reg = AR934X_RESET_REG_RESET_MODULE;
|
||||
else if (soc_is_qca955x())
|
||||
reg = QCA955X_RESET_REG_RESET_MODULE;
|
||||
else
|
||||
BUG();
|
||||
|
||||
|
@ -98,6 +100,8 @@ void ath79_device_reset_clear(u32 mask)
|
|||
reg = AR933X_RESET_REG_RESET_MODULE;
|
||||
else if (soc_is_ar934x())
|
||||
reg = AR934X_RESET_REG_RESET_MODULE;
|
||||
else if (soc_is_qca955x())
|
||||
reg = QCA955X_RESET_REG_RESET_MODULE;
|
||||
else
|
||||
BUG();
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ static struct resource ath79_uart_resources[] = {
|
|||
static struct plat_serial8250_port ath79_uart_data[] = {
|
||||
{
|
||||
.mapbase = AR71XX_UART_BASE,
|
||||
.irq = ATH79_MISC_IRQ_UART,
|
||||
.irq = ATH79_MISC_IRQ(3),
|
||||
.flags = AR71XX_UART_FLAGS,
|
||||
.iotype = UPIO_MEM32,
|
||||
.regshift = 2,
|
||||
|
@ -62,8 +62,8 @@ static struct resource ar933x_uart_resources[] = {
|
|||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
{
|
||||
.start = ATH79_MISC_IRQ_UART,
|
||||
.end = ATH79_MISC_IRQ_UART,
|
||||
.start = ATH79_MISC_IRQ(3),
|
||||
.end = ATH79_MISC_IRQ(3),
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
@ -90,7 +90,8 @@ void __init ath79_register_uart(void)
|
|||
if (soc_is_ar71xx() ||
|
||||
soc_is_ar724x() ||
|
||||
soc_is_ar913x() ||
|
||||
soc_is_ar934x()) {
|
||||
soc_is_ar934x() ||
|
||||
soc_is_qca955x()) {
|
||||
ath79_uart_data[0].uartclk = clk_get_rate(clk);
|
||||
platform_device_register(&ath79_uart_device);
|
||||
} else if (soc_is_ar933x()) {
|
||||
|
|
|
@ -25,29 +25,11 @@
|
|||
#include "common.h"
|
||||
#include "dev-usb.h"
|
||||
|
||||
static struct resource ath79_ohci_resources[2];
|
||||
|
||||
static u64 ath79_ohci_dmamask = DMA_BIT_MASK(32);
|
||||
static u64 ath79_usb_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct usb_ohci_pdata ath79_ohci_pdata = {
|
||||
};
|
||||
|
||||
static struct platform_device ath79_ohci_device = {
|
||||
.name = "ohci-platform",
|
||||
.id = -1,
|
||||
.resource = ath79_ohci_resources,
|
||||
.num_resources = ARRAY_SIZE(ath79_ohci_resources),
|
||||
.dev = {
|
||||
.dma_mask = &ath79_ohci_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
.platform_data = &ath79_ohci_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource ath79_ehci_resources[2];
|
||||
|
||||
static u64 ath79_ehci_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
static struct usb_ehci_pdata ath79_ehci_pdata_v1 = {
|
||||
.has_synopsys_hc_bug = 1,
|
||||
};
|
||||
|
@ -57,22 +39,16 @@ static struct usb_ehci_pdata ath79_ehci_pdata_v2 = {
|
|||
.has_tt = 1,
|
||||
};
|
||||
|
||||
static struct platform_device ath79_ehci_device = {
|
||||
.name = "ehci-platform",
|
||||
.id = -1,
|
||||
.resource = ath79_ehci_resources,
|
||||
.num_resources = ARRAY_SIZE(ath79_ehci_resources),
|
||||
.dev = {
|
||||
.dma_mask = &ath79_ehci_dmamask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
};
|
||||
|
||||
static void __init ath79_usb_init_resource(struct resource res[2],
|
||||
unsigned long base,
|
||||
unsigned long size,
|
||||
int irq)
|
||||
static void __init ath79_usb_register(const char *name, int id,
|
||||
unsigned long base, unsigned long size,
|
||||
int irq, const void *data,
|
||||
size_t data_size)
|
||||
{
|
||||
struct resource res[2];
|
||||
struct platform_device *pdev;
|
||||
|
||||
memset(res, 0, sizeof(res));
|
||||
|
||||
res[0].flags = IORESOURCE_MEM;
|
||||
res[0].start = base;
|
||||
res[0].end = base + size - 1;
|
||||
|
@ -80,6 +56,19 @@ static void __init ath79_usb_init_resource(struct resource res[2],
|
|||
res[1].flags = IORESOURCE_IRQ;
|
||||
res[1].start = irq;
|
||||
res[1].end = irq;
|
||||
|
||||
pdev = platform_device_register_resndata(NULL, name, id,
|
||||
res, ARRAY_SIZE(res),
|
||||
data, data_size);
|
||||
|
||||
if (IS_ERR(pdev)) {
|
||||
pr_err("ath79: unable to register USB at %08lx, err=%d\n",
|
||||
base, (int) PTR_ERR(pdev));
|
||||
return;
|
||||
}
|
||||
|
||||
pdev->dev.dma_mask = &ath79_usb_dmamask;
|
||||
pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
|
||||
}
|
||||
|
||||
#define AR71XX_USB_RESET_MASK (AR71XX_RESET_USB_HOST | \
|
||||
|
@ -106,14 +95,15 @@ static void __init ath79_usb_setup(void)
|
|||
|
||||
mdelay(900);
|
||||
|
||||
ath79_usb_init_resource(ath79_ohci_resources, AR71XX_OHCI_BASE,
|
||||
AR71XX_OHCI_SIZE, ATH79_MISC_IRQ_OHCI);
|
||||
platform_device_register(&ath79_ohci_device);
|
||||
ath79_usb_register("ohci-platform", -1,
|
||||
AR71XX_OHCI_BASE, AR71XX_OHCI_SIZE,
|
||||
ATH79_MISC_IRQ(6),
|
||||
&ath79_ohci_pdata, sizeof(ath79_ohci_pdata));
|
||||
|
||||
ath79_usb_init_resource(ath79_ehci_resources, AR71XX_EHCI_BASE,
|
||||
AR71XX_EHCI_SIZE, ATH79_CPU_IRQ_USB);
|
||||
ath79_ehci_device.dev.platform_data = &ath79_ehci_pdata_v1;
|
||||
platform_device_register(&ath79_ehci_device);
|
||||
ath79_usb_register("ehci-platform", -1,
|
||||
AR71XX_EHCI_BASE, AR71XX_EHCI_SIZE,
|
||||
ATH79_CPU_IRQ(3),
|
||||
&ath79_ehci_pdata_v1, sizeof(ath79_ehci_pdata_v1));
|
||||
}
|
||||
|
||||
static void __init ar7240_usb_setup(void)
|
||||
|
@ -135,9 +125,10 @@ static void __init ar7240_usb_setup(void)
|
|||
|
||||
iounmap(usb_ctrl_base);
|
||||
|
||||
ath79_usb_init_resource(ath79_ohci_resources, AR7240_OHCI_BASE,
|
||||
AR7240_OHCI_SIZE, ATH79_CPU_IRQ_USB);
|
||||
platform_device_register(&ath79_ohci_device);
|
||||
ath79_usb_register("ohci-platform", -1,
|
||||
AR7240_OHCI_BASE, AR7240_OHCI_SIZE,
|
||||
ATH79_CPU_IRQ(3),
|
||||
&ath79_ohci_pdata, sizeof(ath79_ohci_pdata));
|
||||
}
|
||||
|
||||
static void __init ar724x_usb_setup(void)
|
||||
|
@ -151,10 +142,10 @@ static void __init ar724x_usb_setup(void)
|
|||
ath79_device_reset_clear(AR724X_RESET_USB_PHY);
|
||||
mdelay(10);
|
||||
|
||||
ath79_usb_init_resource(ath79_ehci_resources, AR724X_EHCI_BASE,
|
||||
AR724X_EHCI_SIZE, ATH79_CPU_IRQ_USB);
|
||||
ath79_ehci_device.dev.platform_data = &ath79_ehci_pdata_v2;
|
||||
platform_device_register(&ath79_ehci_device);
|
||||
ath79_usb_register("ehci-platform", -1,
|
||||
AR724X_EHCI_BASE, AR724X_EHCI_SIZE,
|
||||
ATH79_CPU_IRQ(3),
|
||||
&ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
}
|
||||
|
||||
static void __init ar913x_usb_setup(void)
|
||||
|
@ -168,10 +159,10 @@ static void __init ar913x_usb_setup(void)
|
|||
ath79_device_reset_clear(AR913X_RESET_USB_PHY);
|
||||
mdelay(10);
|
||||
|
||||
ath79_usb_init_resource(ath79_ehci_resources, AR913X_EHCI_BASE,
|
||||
AR913X_EHCI_SIZE, ATH79_CPU_IRQ_USB);
|
||||
ath79_ehci_device.dev.platform_data = &ath79_ehci_pdata_v2;
|
||||
platform_device_register(&ath79_ehci_device);
|
||||
ath79_usb_register("ehci-platform", -1,
|
||||
AR913X_EHCI_BASE, AR913X_EHCI_SIZE,
|
||||
ATH79_CPU_IRQ(3),
|
||||
&ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
}
|
||||
|
||||
static void __init ar933x_usb_setup(void)
|
||||
|
@ -185,10 +176,10 @@ static void __init ar933x_usb_setup(void)
|
|||
ath79_device_reset_clear(AR933X_RESET_USB_PHY);
|
||||
mdelay(10);
|
||||
|
||||
ath79_usb_init_resource(ath79_ehci_resources, AR933X_EHCI_BASE,
|
||||
AR933X_EHCI_SIZE, ATH79_CPU_IRQ_USB);
|
||||
ath79_ehci_device.dev.platform_data = &ath79_ehci_pdata_v2;
|
||||
platform_device_register(&ath79_ehci_device);
|
||||
ath79_usb_register("ehci-platform", -1,
|
||||
AR933X_EHCI_BASE, AR933X_EHCI_SIZE,
|
||||
ATH79_CPU_IRQ(3),
|
||||
&ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
}
|
||||
|
||||
static void __init ar934x_usb_setup(void)
|
||||
|
@ -211,10 +202,23 @@ static void __init ar934x_usb_setup(void)
|
|||
ath79_device_reset_clear(AR934X_RESET_USB_HOST);
|
||||
udelay(1000);
|
||||
|
||||
ath79_usb_init_resource(ath79_ehci_resources, AR934X_EHCI_BASE,
|
||||
AR934X_EHCI_SIZE, ATH79_CPU_IRQ_USB);
|
||||
ath79_ehci_device.dev.platform_data = &ath79_ehci_pdata_v2;
|
||||
platform_device_register(&ath79_ehci_device);
|
||||
ath79_usb_register("ehci-platform", -1,
|
||||
AR934X_EHCI_BASE, AR934X_EHCI_SIZE,
|
||||
ATH79_CPU_IRQ(3),
|
||||
&ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
}
|
||||
|
||||
static void __init qca955x_usb_setup(void)
|
||||
{
|
||||
ath79_usb_register("ehci-platform", 0,
|
||||
QCA955X_EHCI0_BASE, QCA955X_EHCI_SIZE,
|
||||
ATH79_IP3_IRQ(0),
|
||||
&ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
|
||||
ath79_usb_register("ehci-platform", 1,
|
||||
QCA955X_EHCI1_BASE, QCA955X_EHCI_SIZE,
|
||||
ATH79_IP3_IRQ(1),
|
||||
&ath79_ehci_pdata_v2, sizeof(ath79_ehci_pdata_v2));
|
||||
}
|
||||
|
||||
void __init ath79_register_usb(void)
|
||||
|
@ -231,6 +235,8 @@ void __init ath79_register_usb(void)
|
|||
ar933x_usb_setup();
|
||||
else if (soc_is_ar934x())
|
||||
ar934x_usb_setup();
|
||||
else if (soc_is_qca955x())
|
||||
qca955x_usb_setup();
|
||||
else
|
||||
BUG();
|
||||
}
|
||||
|
|
|
@ -55,8 +55,8 @@ static void __init ar913x_wmac_setup(void)
|
|||
|
||||
ath79_wmac_resources[0].start = AR913X_WMAC_BASE;
|
||||
ath79_wmac_resources[0].end = AR913X_WMAC_BASE + AR913X_WMAC_SIZE - 1;
|
||||
ath79_wmac_resources[1].start = ATH79_CPU_IRQ_IP2;
|
||||
ath79_wmac_resources[1].end = ATH79_CPU_IRQ_IP2;
|
||||
ath79_wmac_resources[1].start = ATH79_CPU_IRQ(2);
|
||||
ath79_wmac_resources[1].end = ATH79_CPU_IRQ(2);
|
||||
}
|
||||
|
||||
|
||||
|
@ -83,8 +83,8 @@ static void __init ar933x_wmac_setup(void)
|
|||
|
||||
ath79_wmac_resources[0].start = AR933X_WMAC_BASE;
|
||||
ath79_wmac_resources[0].end = AR933X_WMAC_BASE + AR933X_WMAC_SIZE - 1;
|
||||
ath79_wmac_resources[1].start = ATH79_CPU_IRQ_IP2;
|
||||
ath79_wmac_resources[1].end = ATH79_CPU_IRQ_IP2;
|
||||
ath79_wmac_resources[1].start = ATH79_CPU_IRQ(2);
|
||||
ath79_wmac_resources[1].end = ATH79_CPU_IRQ(2);
|
||||
|
||||
t = ath79_reset_rr(AR933X_RESET_REG_BOOTSTRAP);
|
||||
if (t & AR933X_BOOTSTRAP_REF_CLK_40)
|
||||
|
@ -107,7 +107,7 @@ static void ar934x_wmac_setup(void)
|
|||
ath79_wmac_resources[0].start = AR934X_WMAC_BASE;
|
||||
ath79_wmac_resources[0].end = AR934X_WMAC_BASE + AR934X_WMAC_SIZE - 1;
|
||||
ath79_wmac_resources[1].start = ATH79_IP2_IRQ(1);
|
||||
ath79_wmac_resources[1].start = ATH79_IP2_IRQ(1);
|
||||
ath79_wmac_resources[1].end = ATH79_IP2_IRQ(1);
|
||||
|
||||
t = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
|
||||
if (t & AR934X_BOOTSTRAP_REF_CLK_40)
|
||||
|
@ -116,6 +116,24 @@ static void ar934x_wmac_setup(void)
|
|||
ath79_wmac_data.is_clk_25mhz = true;
|
||||
}
|
||||
|
||||
static void qca955x_wmac_setup(void)
|
||||
{
|
||||
u32 t;
|
||||
|
||||
ath79_wmac_device.name = "qca955x_wmac";
|
||||
|
||||
ath79_wmac_resources[0].start = QCA955X_WMAC_BASE;
|
||||
ath79_wmac_resources[0].end = QCA955X_WMAC_BASE + QCA955X_WMAC_SIZE - 1;
|
||||
ath79_wmac_resources[1].start = ATH79_IP2_IRQ(1);
|
||||
ath79_wmac_resources[1].end = ATH79_IP2_IRQ(1);
|
||||
|
||||
t = ath79_reset_rr(QCA955X_RESET_REG_BOOTSTRAP);
|
||||
if (t & QCA955X_BOOTSTRAP_REF_CLK_40)
|
||||
ath79_wmac_data.is_clk_25mhz = false;
|
||||
else
|
||||
ath79_wmac_data.is_clk_25mhz = true;
|
||||
}
|
||||
|
||||
void __init ath79_register_wmac(u8 *cal_data)
|
||||
{
|
||||
if (soc_is_ar913x())
|
||||
|
@ -124,6 +142,8 @@ void __init ath79_register_wmac(u8 *cal_data)
|
|||
ar933x_wmac_setup();
|
||||
else if (soc_is_ar934x())
|
||||
ar934x_wmac_setup();
|
||||
else if (soc_is_qca955x())
|
||||
qca955x_wmac_setup();
|
||||
else
|
||||
BUG();
|
||||
|
||||
|
|
|
@ -74,6 +74,8 @@ static void prom_putchar_init(void)
|
|||
case REV_ID_MAJOR_AR9341:
|
||||
case REV_ID_MAJOR_AR9342:
|
||||
case REV_ID_MAJOR_AR9344:
|
||||
case REV_ID_MAJOR_QCA9556:
|
||||
case REV_ID_MAJOR_QCA9558:
|
||||
_prom_putchar = prom_putchar_ar71xx;
|
||||
break;
|
||||
|
||||
|
|
|
@ -137,51 +137,47 @@ static struct gpio_chip ath79_gpio_chip = {
|
|||
.base = 0,
|
||||
};
|
||||
|
||||
void ath79_gpio_function_enable(u32 mask)
|
||||
static void __iomem *ath79_gpio_get_function_reg(void)
|
||||
{
|
||||
void __iomem *base = ath79_gpio_base;
|
||||
unsigned long flags;
|
||||
u32 reg = 0;
|
||||
|
||||
spin_lock_irqsave(&ath79_gpio_lock, flags);
|
||||
if (soc_is_ar71xx() ||
|
||||
soc_is_ar724x() ||
|
||||
soc_is_ar913x() ||
|
||||
soc_is_ar933x())
|
||||
reg = AR71XX_GPIO_REG_FUNC;
|
||||
else if (soc_is_ar934x())
|
||||
reg = AR934X_GPIO_REG_FUNC;
|
||||
else
|
||||
BUG();
|
||||
|
||||
__raw_writel(__raw_readl(base + AR71XX_GPIO_REG_FUNC) | mask,
|
||||
base + AR71XX_GPIO_REG_FUNC);
|
||||
/* flush write */
|
||||
__raw_readl(base + AR71XX_GPIO_REG_FUNC);
|
||||
|
||||
spin_unlock_irqrestore(&ath79_gpio_lock, flags);
|
||||
}
|
||||
|
||||
void ath79_gpio_function_disable(u32 mask)
|
||||
{
|
||||
void __iomem *base = ath79_gpio_base;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ath79_gpio_lock, flags);
|
||||
|
||||
__raw_writel(__raw_readl(base + AR71XX_GPIO_REG_FUNC) & ~mask,
|
||||
base + AR71XX_GPIO_REG_FUNC);
|
||||
/* flush write */
|
||||
__raw_readl(base + AR71XX_GPIO_REG_FUNC);
|
||||
|
||||
spin_unlock_irqrestore(&ath79_gpio_lock, flags);
|
||||
return ath79_gpio_base + reg;
|
||||
}
|
||||
|
||||
void ath79_gpio_function_setup(u32 set, u32 clear)
|
||||
{
|
||||
void __iomem *base = ath79_gpio_base;
|
||||
void __iomem *reg = ath79_gpio_get_function_reg();
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&ath79_gpio_lock, flags);
|
||||
|
||||
__raw_writel((__raw_readl(base + AR71XX_GPIO_REG_FUNC) & ~clear) | set,
|
||||
base + AR71XX_GPIO_REG_FUNC);
|
||||
__raw_writel((__raw_readl(reg) & ~clear) | set, reg);
|
||||
/* flush write */
|
||||
__raw_readl(base + AR71XX_GPIO_REG_FUNC);
|
||||
__raw_readl(reg);
|
||||
|
||||
spin_unlock_irqrestore(&ath79_gpio_lock, flags);
|
||||
}
|
||||
|
||||
void ath79_gpio_function_enable(u32 mask)
|
||||
{
|
||||
ath79_gpio_function_setup(mask, 0);
|
||||
}
|
||||
|
||||
void ath79_gpio_function_disable(u32 mask)
|
||||
{
|
||||
ath79_gpio_function_setup(0, mask);
|
||||
}
|
||||
|
||||
void __init ath79_gpio_init(void)
|
||||
{
|
||||
int err;
|
||||
|
@ -198,12 +194,14 @@ void __init ath79_gpio_init(void)
|
|||
ath79_gpio_count = AR933X_GPIO_COUNT;
|
||||
else if (soc_is_ar934x())
|
||||
ath79_gpio_count = AR934X_GPIO_COUNT;
|
||||
else if (soc_is_qca955x())
|
||||
ath79_gpio_count = QCA955X_GPIO_COUNT;
|
||||
else
|
||||
BUG();
|
||||
|
||||
ath79_gpio_base = ioremap_nocache(AR71XX_GPIO_BASE, AR71XX_GPIO_SIZE);
|
||||
ath79_gpio_chip.ngpio = ath79_gpio_count;
|
||||
if (soc_is_ar934x()) {
|
||||
if (soc_is_ar934x() || soc_is_qca955x()) {
|
||||
ath79_gpio_chip.direction_input = ar934x_gpio_direction_input;
|
||||
ath79_gpio_chip.direction_output = ar934x_gpio_direction_output;
|
||||
}
|
||||
|
|
|
@ -35,44 +35,17 @@ static void ath79_misc_irq_handler(unsigned int irq, struct irq_desc *desc)
|
|||
pending = __raw_readl(base + AR71XX_RESET_REG_MISC_INT_STATUS) &
|
||||
__raw_readl(base + AR71XX_RESET_REG_MISC_INT_ENABLE);
|
||||
|
||||
if (pending & MISC_INT_UART)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_UART);
|
||||
|
||||
else if (pending & MISC_INT_DMA)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_DMA);
|
||||
|
||||
else if (pending & MISC_INT_PERFC)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_PERFC);
|
||||
|
||||
else if (pending & MISC_INT_TIMER)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_TIMER);
|
||||
|
||||
else if (pending & MISC_INT_TIMER2)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_TIMER2);
|
||||
|
||||
else if (pending & MISC_INT_TIMER3)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_TIMER3);
|
||||
|
||||
else if (pending & MISC_INT_TIMER4)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_TIMER4);
|
||||
|
||||
else if (pending & MISC_INT_OHCI)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_OHCI);
|
||||
|
||||
else if (pending & MISC_INT_ERROR)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_ERROR);
|
||||
|
||||
else if (pending & MISC_INT_GPIO)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_GPIO);
|
||||
|
||||
else if (pending & MISC_INT_WDOG)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_WDOG);
|
||||
|
||||
else if (pending & MISC_INT_ETHSW)
|
||||
generic_handle_irq(ATH79_MISC_IRQ_ETHSW);
|
||||
|
||||
else
|
||||
if (!pending) {
|
||||
spurious_interrupt();
|
||||
return;
|
||||
}
|
||||
|
||||
while (pending) {
|
||||
int bit = __ffs(pending);
|
||||
|
||||
generic_handle_irq(ATH79_MISC_IRQ(bit));
|
||||
pending &= ~BIT(bit);
|
||||
}
|
||||
}
|
||||
|
||||
static void ar71xx_misc_irq_unmask(struct irq_data *d)
|
||||
|
@ -130,7 +103,10 @@ static void __init ath79_misc_irq_init(void)
|
|||
|
||||
if (soc_is_ar71xx() || soc_is_ar913x())
|
||||
ath79_misc_irq_chip.irq_mask_ack = ar71xx_misc_irq_mask;
|
||||
else if (soc_is_ar724x() || soc_is_ar933x() || soc_is_ar934x())
|
||||
else if (soc_is_ar724x() ||
|
||||
soc_is_ar933x() ||
|
||||
soc_is_ar934x() ||
|
||||
soc_is_qca955x())
|
||||
ath79_misc_irq_chip.irq_ack = ar724x_misc_irq_ack;
|
||||
else
|
||||
BUG();
|
||||
|
@ -141,7 +117,7 @@ static void __init ath79_misc_irq_init(void)
|
|||
handle_level_irq);
|
||||
}
|
||||
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ_MISC, ath79_misc_irq_handler);
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ(6), ath79_misc_irq_handler);
|
||||
}
|
||||
|
||||
static void ar934x_ip2_irq_dispatch(unsigned int irq, struct irq_desc *desc)
|
||||
|
@ -174,7 +150,89 @@ static void ar934x_ip2_irq_init(void)
|
|||
irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
handle_level_irq);
|
||||
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ_IP2, ar934x_ip2_irq_dispatch);
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ(2), ar934x_ip2_irq_dispatch);
|
||||
}
|
||||
|
||||
static void qca955x_ip2_irq_dispatch(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
u32 status;
|
||||
|
||||
disable_irq_nosync(irq);
|
||||
|
||||
status = ath79_reset_rr(QCA955X_RESET_REG_EXT_INT_STATUS);
|
||||
status &= QCA955X_EXT_INT_PCIE_RC1_ALL | QCA955X_EXT_INT_WMAC_ALL;
|
||||
|
||||
if (status == 0) {
|
||||
spurious_interrupt();
|
||||
goto enable;
|
||||
}
|
||||
|
||||
if (status & QCA955X_EXT_INT_PCIE_RC1_ALL) {
|
||||
/* TODO: flush DDR? */
|
||||
generic_handle_irq(ATH79_IP2_IRQ(0));
|
||||
}
|
||||
|
||||
if (status & QCA955X_EXT_INT_WMAC_ALL) {
|
||||
/* TODO: flush DDR? */
|
||||
generic_handle_irq(ATH79_IP2_IRQ(1));
|
||||
}
|
||||
|
||||
enable:
|
||||
enable_irq(irq);
|
||||
}
|
||||
|
||||
static void qca955x_ip3_irq_dispatch(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
u32 status;
|
||||
|
||||
disable_irq_nosync(irq);
|
||||
|
||||
status = ath79_reset_rr(QCA955X_RESET_REG_EXT_INT_STATUS);
|
||||
status &= QCA955X_EXT_INT_PCIE_RC2_ALL |
|
||||
QCA955X_EXT_INT_USB1 |
|
||||
QCA955X_EXT_INT_USB2;
|
||||
|
||||
if (status == 0) {
|
||||
spurious_interrupt();
|
||||
goto enable;
|
||||
}
|
||||
|
||||
if (status & QCA955X_EXT_INT_USB1) {
|
||||
/* TODO: flush DDR? */
|
||||
generic_handle_irq(ATH79_IP3_IRQ(0));
|
||||
}
|
||||
|
||||
if (status & QCA955X_EXT_INT_USB2) {
|
||||
/* TODO: flush DDR? */
|
||||
generic_handle_irq(ATH79_IP3_IRQ(1));
|
||||
}
|
||||
|
||||
if (status & QCA955X_EXT_INT_PCIE_RC2_ALL) {
|
||||
/* TODO: flush DDR? */
|
||||
generic_handle_irq(ATH79_IP3_IRQ(2));
|
||||
}
|
||||
|
||||
enable:
|
||||
enable_irq(irq);
|
||||
}
|
||||
|
||||
static void qca955x_irq_init(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = ATH79_IP2_IRQ_BASE;
|
||||
i < ATH79_IP2_IRQ_BASE + ATH79_IP2_IRQ_COUNT; i++)
|
||||
irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
handle_level_irq);
|
||||
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ(2), qca955x_ip2_irq_dispatch);
|
||||
|
||||
for (i = ATH79_IP3_IRQ_BASE;
|
||||
i < ATH79_IP3_IRQ_BASE + ATH79_IP3_IRQ_COUNT; i++)
|
||||
irq_set_chip_and_handler(i, &dummy_irq_chip,
|
||||
handle_level_irq);
|
||||
|
||||
irq_set_chained_handler(ATH79_CPU_IRQ(3), qca955x_ip3_irq_dispatch);
|
||||
}
|
||||
|
||||
asmlinkage void plat_irq_dispatch(void)
|
||||
|
@ -184,22 +242,22 @@ asmlinkage void plat_irq_dispatch(void)
|
|||
pending = read_c0_status() & read_c0_cause() & ST0_IM;
|
||||
|
||||
if (pending & STATUSF_IP7)
|
||||
do_IRQ(ATH79_CPU_IRQ_TIMER);
|
||||
do_IRQ(ATH79_CPU_IRQ(7));
|
||||
|
||||
else if (pending & STATUSF_IP2)
|
||||
ath79_ip2_handler();
|
||||
|
||||
else if (pending & STATUSF_IP4)
|
||||
do_IRQ(ATH79_CPU_IRQ_GE0);
|
||||
do_IRQ(ATH79_CPU_IRQ(4));
|
||||
|
||||
else if (pending & STATUSF_IP5)
|
||||
do_IRQ(ATH79_CPU_IRQ_GE1);
|
||||
do_IRQ(ATH79_CPU_IRQ(5));
|
||||
|
||||
else if (pending & STATUSF_IP3)
|
||||
ath79_ip3_handler();
|
||||
|
||||
else if (pending & STATUSF_IP6)
|
||||
do_IRQ(ATH79_CPU_IRQ_MISC);
|
||||
do_IRQ(ATH79_CPU_IRQ(6));
|
||||
|
||||
else
|
||||
spurious_interrupt();
|
||||
|
@ -212,63 +270,69 @@ asmlinkage void plat_irq_dispatch(void)
|
|||
* Issue a flush in the handlers to ensure that the driver sees
|
||||
* the update.
|
||||
*/
|
||||
|
||||
static void ath79_default_ip2_handler(void)
|
||||
{
|
||||
do_IRQ(ATH79_CPU_IRQ(2));
|
||||
}
|
||||
|
||||
static void ath79_default_ip3_handler(void)
|
||||
{
|
||||
do_IRQ(ATH79_CPU_IRQ(3));
|
||||
}
|
||||
|
||||
static void ar71xx_ip2_handler(void)
|
||||
{
|
||||
ath79_ddr_wb_flush(AR71XX_DDR_REG_FLUSH_PCI);
|
||||
do_IRQ(ATH79_CPU_IRQ_IP2);
|
||||
do_IRQ(ATH79_CPU_IRQ(2));
|
||||
}
|
||||
|
||||
static void ar724x_ip2_handler(void)
|
||||
{
|
||||
ath79_ddr_wb_flush(AR724X_DDR_REG_FLUSH_PCIE);
|
||||
do_IRQ(ATH79_CPU_IRQ_IP2);
|
||||
do_IRQ(ATH79_CPU_IRQ(2));
|
||||
}
|
||||
|
||||
static void ar913x_ip2_handler(void)
|
||||
{
|
||||
ath79_ddr_wb_flush(AR913X_DDR_REG_FLUSH_WMAC);
|
||||
do_IRQ(ATH79_CPU_IRQ_IP2);
|
||||
do_IRQ(ATH79_CPU_IRQ(2));
|
||||
}
|
||||
|
||||
static void ar933x_ip2_handler(void)
|
||||
{
|
||||
ath79_ddr_wb_flush(AR933X_DDR_REG_FLUSH_WMAC);
|
||||
do_IRQ(ATH79_CPU_IRQ_IP2);
|
||||
}
|
||||
|
||||
static void ar934x_ip2_handler(void)
|
||||
{
|
||||
do_IRQ(ATH79_CPU_IRQ_IP2);
|
||||
do_IRQ(ATH79_CPU_IRQ(2));
|
||||
}
|
||||
|
||||
static void ar71xx_ip3_handler(void)
|
||||
{
|
||||
ath79_ddr_wb_flush(AR71XX_DDR_REG_FLUSH_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ(3));
|
||||
}
|
||||
|
||||
static void ar724x_ip3_handler(void)
|
||||
{
|
||||
ath79_ddr_wb_flush(AR724X_DDR_REG_FLUSH_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ(3));
|
||||
}
|
||||
|
||||
static void ar913x_ip3_handler(void)
|
||||
{
|
||||
ath79_ddr_wb_flush(AR913X_DDR_REG_FLUSH_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ(3));
|
||||
}
|
||||
|
||||
static void ar933x_ip3_handler(void)
|
||||
{
|
||||
ath79_ddr_wb_flush(AR933X_DDR_REG_FLUSH_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ(3));
|
||||
}
|
||||
|
||||
static void ar934x_ip3_handler(void)
|
||||
{
|
||||
ath79_ddr_wb_flush(AR934X_DDR_REG_FLUSH_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ_USB);
|
||||
do_IRQ(ATH79_CPU_IRQ(3));
|
||||
}
|
||||
|
||||
void __init arch_init_irq(void)
|
||||
|
@ -286,16 +350,21 @@ void __init arch_init_irq(void)
|
|||
ath79_ip2_handler = ar933x_ip2_handler;
|
||||
ath79_ip3_handler = ar933x_ip3_handler;
|
||||
} else if (soc_is_ar934x()) {
|
||||
ath79_ip2_handler = ar934x_ip2_handler;
|
||||
ath79_ip2_handler = ath79_default_ip2_handler;
|
||||
ath79_ip3_handler = ar934x_ip3_handler;
|
||||
} else if (soc_is_qca955x()) {
|
||||
ath79_ip2_handler = ath79_default_ip2_handler;
|
||||
ath79_ip3_handler = ath79_default_ip3_handler;
|
||||
} else {
|
||||
BUG();
|
||||
}
|
||||
|
||||
cp0_perfcount_irq = ATH79_MISC_IRQ_PERFC;
|
||||
cp0_perfcount_irq = ATH79_MISC_IRQ(5);
|
||||
mips_cpu_irq_init();
|
||||
ath79_misc_irq_init();
|
||||
|
||||
if (soc_is_ar934x())
|
||||
ar934x_ip2_irq_init();
|
||||
else if (soc_is_qca955x())
|
||||
qca955x_irq_init();
|
||||
}
|
||||
|
|
|
@ -69,7 +69,7 @@ static struct spi_board_info ap121_spi_info[] = {
|
|||
|
||||
static struct ath79_spi_platform_data ap121_spi_data = {
|
||||
.bus_num = 0,
|
||||
.num_chipselect = 1,
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
static void __init ap121_setup(void)
|
||||
|
|
|
@ -0,0 +1,156 @@
|
|||
/*
|
||||
* Qualcomm Atheros AP136 reference board support
|
||||
*
|
||||
* Copyright (c) 2012 Qualcomm Atheros
|
||||
* Copyright (c) 2012-2013 Gabor Juhos <juhosg@openwrt.org>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ath9k_platform.h>
|
||||
|
||||
#include "machtypes.h"
|
||||
#include "dev-gpio-buttons.h"
|
||||
#include "dev-leds-gpio.h"
|
||||
#include "dev-spi.h"
|
||||
#include "dev-usb.h"
|
||||
#include "dev-wmac.h"
|
||||
#include "pci.h"
|
||||
|
||||
#define AP136_GPIO_LED_STATUS_RED 14
|
||||
#define AP136_GPIO_LED_STATUS_GREEN 19
|
||||
#define AP136_GPIO_LED_USB 4
|
||||
#define AP136_GPIO_LED_WLAN_2G 13
|
||||
#define AP136_GPIO_LED_WLAN_5G 12
|
||||
#define AP136_GPIO_LED_WPS_RED 15
|
||||
#define AP136_GPIO_LED_WPS_GREEN 20
|
||||
|
||||
#define AP136_GPIO_BTN_WPS 16
|
||||
#define AP136_GPIO_BTN_RFKILL 21
|
||||
|
||||
#define AP136_KEYS_POLL_INTERVAL 20 /* msecs */
|
||||
#define AP136_KEYS_DEBOUNCE_INTERVAL (3 * AP136_KEYS_POLL_INTERVAL)
|
||||
|
||||
#define AP136_WMAC_CALDATA_OFFSET 0x1000
|
||||
#define AP136_PCIE_CALDATA_OFFSET 0x5000
|
||||
|
||||
static struct gpio_led ap136_leds_gpio[] __initdata = {
|
||||
{
|
||||
.name = "qca:green:status",
|
||||
.gpio = AP136_GPIO_LED_STATUS_GREEN,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "qca:red:status",
|
||||
.gpio = AP136_GPIO_LED_STATUS_RED,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "qca:green:wps",
|
||||
.gpio = AP136_GPIO_LED_WPS_GREEN,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "qca:red:wps",
|
||||
.gpio = AP136_GPIO_LED_WPS_RED,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "qca:red:wlan-2g",
|
||||
.gpio = AP136_GPIO_LED_WLAN_2G,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.name = "qca:red:usb",
|
||||
.gpio = AP136_GPIO_LED_USB,
|
||||
.active_low = 1,
|
||||
}
|
||||
};
|
||||
|
||||
static struct gpio_keys_button ap136_gpio_keys[] __initdata = {
|
||||
{
|
||||
.desc = "WPS button",
|
||||
.type = EV_KEY,
|
||||
.code = KEY_WPS_BUTTON,
|
||||
.debounce_interval = AP136_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = AP136_GPIO_BTN_WPS,
|
||||
.active_low = 1,
|
||||
},
|
||||
{
|
||||
.desc = "RFKILL button",
|
||||
.type = EV_KEY,
|
||||
.code = KEY_RFKILL,
|
||||
.debounce_interval = AP136_KEYS_DEBOUNCE_INTERVAL,
|
||||
.gpio = AP136_GPIO_BTN_RFKILL,
|
||||
.active_low = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct spi_board_info ap136_spi_info[] = {
|
||||
{
|
||||
.bus_num = 0,
|
||||
.chip_select = 0,
|
||||
.max_speed_hz = 25000000,
|
||||
.modalias = "mx25l6405d",
|
||||
}
|
||||
};
|
||||
|
||||
static struct ath79_spi_platform_data ap136_spi_data = {
|
||||
.bus_num = 0,
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
static struct ath9k_platform_data ap136_ath9k_data;
|
||||
|
||||
static int ap136_pci_plat_dev_init(struct pci_dev *dev)
|
||||
{
|
||||
if (dev->bus->number == 1 && (PCI_SLOT(dev->devfn)) == 0)
|
||||
dev->dev.platform_data = &ap136_ath9k_data;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void __init ap136_pci_init(u8 *eeprom)
|
||||
{
|
||||
memcpy(ap136_ath9k_data.eeprom_data, eeprom,
|
||||
sizeof(ap136_ath9k_data.eeprom_data));
|
||||
|
||||
ath79_pci_set_plat_dev_init(ap136_pci_plat_dev_init);
|
||||
ath79_register_pci();
|
||||
}
|
||||
#else
|
||||
static inline void ap136_pci_init(void) {}
|
||||
#endif /* CONFIG_PCI */
|
||||
|
||||
static void __init ap136_setup(void)
|
||||
{
|
||||
u8 *art = (u8 *) KSEG1ADDR(0x1fff0000);
|
||||
|
||||
ath79_register_leds_gpio(-1, ARRAY_SIZE(ap136_leds_gpio),
|
||||
ap136_leds_gpio);
|
||||
ath79_register_gpio_keys_polled(-1, AP136_KEYS_POLL_INTERVAL,
|
||||
ARRAY_SIZE(ap136_gpio_keys),
|
||||
ap136_gpio_keys);
|
||||
ath79_register_spi(&ap136_spi_data, ap136_spi_info,
|
||||
ARRAY_SIZE(ap136_spi_info));
|
||||
ath79_register_usb();
|
||||
ath79_register_wmac(art + AP136_WMAC_CALDATA_OFFSET);
|
||||
ap136_pci_init(art + AP136_PCIE_CALDATA_OFFSET);
|
||||
}
|
||||
|
||||
MIPS_MACHINE(ATH79_MACH_AP136_010, "AP136-010",
|
||||
"Atheros AP136-010 reference board",
|
||||
ap136_setup);
|
|
@ -78,7 +78,7 @@ static struct spi_board_info ap81_spi_info[] = {
|
|||
|
||||
static struct ath79_spi_platform_data ap81_spi_data = {
|
||||
.bus_num = 0,
|
||||
.num_chipselect = 1,
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
static void __init ap81_setup(void)
|
||||
|
|
|
@ -87,7 +87,7 @@ static struct spi_board_info db120_spi_info[] = {
|
|||
|
||||
static struct ath79_spi_platform_data db120_spi_data = {
|
||||
.bus_num = 0,
|
||||
.num_chipselect = 1,
|
||||
.num_chipselect = 1,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
|
|
|
@ -34,8 +34,8 @@
|
|||
#define PB44_KEYS_DEBOUNCE_INTERVAL (3 * PB44_KEYS_POLL_INTERVAL)
|
||||
|
||||
static struct i2c_gpio_platform_data pb44_i2c_gpio_data = {
|
||||
.sda_pin = PB44_GPIO_I2C_SDA,
|
||||
.scl_pin = PB44_GPIO_I2C_SCL,
|
||||
.sda_pin = PB44_GPIO_I2C_SDA,
|
||||
.scl_pin = PB44_GPIO_I2C_SCL,
|
||||
};
|
||||
|
||||
static struct platform_device pb44_i2c_gpio_device = {
|
||||
|
@ -53,7 +53,7 @@ static struct pcf857x_platform_data pb44_pcf857x_data = {
|
|||
static struct i2c_board_info pb44_i2c_board_info[] __initdata = {
|
||||
{
|
||||
I2C_BOARD_INFO("pcf8575", 0x20),
|
||||
.platform_data = &pb44_pcf857x_data,
|
||||
.platform_data = &pb44_pcf857x_data,
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -17,6 +17,7 @@
|
|||
enum ath79_mach_type {
|
||||
ATH79_MACH_GENERIC = 0,
|
||||
ATH79_MACH_AP121, /* Atheros AP121 reference board */
|
||||
ATH79_MACH_AP136_010, /* Atheros AP136-010 reference board */
|
||||
ATH79_MACH_AP81, /* Atheros AP81 reference board */
|
||||
ATH79_MACH_DB120, /* Atheros DB120 reference board */
|
||||
ATH79_MACH_PB44, /* Atheros PB44 reference board */
|
||||
|
|
|
@ -14,10 +14,11 @@
|
|||
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/resource.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/mach-ath79/ar71xx_regs.h>
|
||||
#include <asm/mach-ath79/ath79.h>
|
||||
#include <asm/mach-ath79/irq.h>
|
||||
#include <asm/mach-ath79/pci.h>
|
||||
#include "pci.h"
|
||||
|
||||
static int (*ath79_pci_plat_dev_init)(struct pci_dev *dev);
|
||||
|
@ -48,6 +49,21 @@ static const struct ath79_pci_irq ar724x_pci_irq_map[] __initconst = {
|
|||
}
|
||||
};
|
||||
|
||||
static const struct ath79_pci_irq qca955x_pci_irq_map[] __initconst = {
|
||||
{
|
||||
.bus = 0,
|
||||
.slot = 0,
|
||||
.pin = 1,
|
||||
.irq = ATH79_PCI_IRQ(0),
|
||||
},
|
||||
{
|
||||
.bus = 1,
|
||||
.slot = 0,
|
||||
.pin = 1,
|
||||
.irq = ATH79_PCI_IRQ(1),
|
||||
},
|
||||
};
|
||||
|
||||
int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
|
||||
{
|
||||
int irq = -1;
|
||||
|
@ -63,6 +79,9 @@ int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
|
|||
soc_is_ar9344()) {
|
||||
ath79_pci_irq_map = ar724x_pci_irq_map;
|
||||
ath79_pci_nr_irqs = ARRAY_SIZE(ar724x_pci_irq_map);
|
||||
} else if (soc_is_qca955x()) {
|
||||
ath79_pci_irq_map = qca955x_pci_irq_map;
|
||||
ath79_pci_nr_irqs = ARRAY_SIZE(qca955x_pci_irq_map);
|
||||
} else {
|
||||
pr_crit("pci %s: invalid irq map\n",
|
||||
pci_name((struct pci_dev *) dev));
|
||||
|
@ -74,7 +93,9 @@ int __init pcibios_map_irq(const struct pci_dev *dev, uint8_t slot, uint8_t pin)
|
|||
const struct ath79_pci_irq *entry;
|
||||
|
||||
entry = &ath79_pci_irq_map[i];
|
||||
if (entry->slot == slot && entry->pin == pin) {
|
||||
if (entry->bus == dev->bus->number &&
|
||||
entry->slot == slot &&
|
||||
entry->pin == pin) {
|
||||
irq = entry->irq;
|
||||
break;
|
||||
}
|
||||
|
@ -110,21 +131,143 @@ void __init ath79_pci_set_plat_dev_init(int (*func)(struct pci_dev *dev))
|
|||
ath79_pci_plat_dev_init = func;
|
||||
}
|
||||
|
||||
static struct platform_device *
|
||||
ath79_register_pci_ar71xx(void)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct resource res[4];
|
||||
|
||||
memset(res, 0, sizeof(res));
|
||||
|
||||
res[0].name = "cfg_base";
|
||||
res[0].flags = IORESOURCE_MEM;
|
||||
res[0].start = AR71XX_PCI_CFG_BASE;
|
||||
res[0].end = AR71XX_PCI_CFG_BASE + AR71XX_PCI_CFG_SIZE - 1;
|
||||
|
||||
res[1].flags = IORESOURCE_IRQ;
|
||||
res[1].start = ATH79_CPU_IRQ(2);
|
||||
res[1].end = ATH79_CPU_IRQ(2);
|
||||
|
||||
res[2].name = "io_base";
|
||||
res[2].flags = IORESOURCE_IO;
|
||||
res[2].start = 0;
|
||||
res[2].end = 0;
|
||||
|
||||
res[3].name = "mem_base";
|
||||
res[3].flags = IORESOURCE_MEM;
|
||||
res[3].start = AR71XX_PCI_MEM_BASE;
|
||||
res[3].end = AR71XX_PCI_MEM_BASE + AR71XX_PCI_MEM_SIZE - 1;
|
||||
|
||||
pdev = platform_device_register_simple("ar71xx-pci", -1,
|
||||
res, ARRAY_SIZE(res));
|
||||
return pdev;
|
||||
}
|
||||
|
||||
static struct platform_device *
|
||||
ath79_register_pci_ar724x(int id,
|
||||
unsigned long cfg_base,
|
||||
unsigned long ctrl_base,
|
||||
unsigned long crp_base,
|
||||
unsigned long mem_base,
|
||||
unsigned long mem_size,
|
||||
unsigned long io_base,
|
||||
int irq)
|
||||
{
|
||||
struct platform_device *pdev;
|
||||
struct resource res[6];
|
||||
|
||||
memset(res, 0, sizeof(res));
|
||||
|
||||
res[0].name = "cfg_base";
|
||||
res[0].flags = IORESOURCE_MEM;
|
||||
res[0].start = cfg_base;
|
||||
res[0].end = cfg_base + AR724X_PCI_CFG_SIZE - 1;
|
||||
|
||||
res[1].name = "ctrl_base";
|
||||
res[1].flags = IORESOURCE_MEM;
|
||||
res[1].start = ctrl_base;
|
||||
res[1].end = ctrl_base + AR724X_PCI_CTRL_SIZE - 1;
|
||||
|
||||
res[2].flags = IORESOURCE_IRQ;
|
||||
res[2].start = irq;
|
||||
res[2].end = irq;
|
||||
|
||||
res[3].name = "mem_base";
|
||||
res[3].flags = IORESOURCE_MEM;
|
||||
res[3].start = mem_base;
|
||||
res[3].end = mem_base + mem_size - 1;
|
||||
|
||||
res[4].name = "io_base";
|
||||
res[4].flags = IORESOURCE_IO;
|
||||
res[4].start = io_base;
|
||||
res[4].end = io_base;
|
||||
|
||||
res[5].name = "crp_base";
|
||||
res[5].flags = IORESOURCE_MEM;
|
||||
res[5].start = crp_base;
|
||||
res[5].end = crp_base + AR724X_PCI_CRP_SIZE - 1;
|
||||
|
||||
pdev = platform_device_register_simple("ar724x-pci", id,
|
||||
res, ARRAY_SIZE(res));
|
||||
return pdev;
|
||||
}
|
||||
|
||||
int __init ath79_register_pci(void)
|
||||
{
|
||||
if (soc_is_ar71xx())
|
||||
return ar71xx_pcibios_init();
|
||||
struct platform_device *pdev = NULL;
|
||||
|
||||
if (soc_is_ar724x())
|
||||
return ar724x_pcibios_init(ATH79_CPU_IRQ_IP2);
|
||||
|
||||
if (soc_is_ar9342() || soc_is_ar9344()) {
|
||||
if (soc_is_ar71xx()) {
|
||||
pdev = ath79_register_pci_ar71xx();
|
||||
} else if (soc_is_ar724x()) {
|
||||
pdev = ath79_register_pci_ar724x(-1,
|
||||
AR724X_PCI_CFG_BASE,
|
||||
AR724X_PCI_CTRL_BASE,
|
||||
AR724X_PCI_CRP_BASE,
|
||||
AR724X_PCI_MEM_BASE,
|
||||
AR724X_PCI_MEM_SIZE,
|
||||
0,
|
||||
ATH79_CPU_IRQ(2));
|
||||
} else if (soc_is_ar9342() ||
|
||||
soc_is_ar9344()) {
|
||||
u32 bootstrap;
|
||||
|
||||
bootstrap = ath79_reset_rr(AR934X_RESET_REG_BOOTSTRAP);
|
||||
if (bootstrap & AR934X_BOOTSTRAP_PCIE_RC)
|
||||
return ar724x_pcibios_init(ATH79_IP2_IRQ(0));
|
||||
if ((bootstrap & AR934X_BOOTSTRAP_PCIE_RC) == 0)
|
||||
return -ENODEV;
|
||||
|
||||
pdev = ath79_register_pci_ar724x(-1,
|
||||
AR724X_PCI_CFG_BASE,
|
||||
AR724X_PCI_CTRL_BASE,
|
||||
AR724X_PCI_CRP_BASE,
|
||||
AR724X_PCI_MEM_BASE,
|
||||
AR724X_PCI_MEM_SIZE,
|
||||
0,
|
||||
ATH79_IP2_IRQ(0));
|
||||
} else if (soc_is_qca9558()) {
|
||||
pdev = ath79_register_pci_ar724x(0,
|
||||
QCA955X_PCI_CFG_BASE0,
|
||||
QCA955X_PCI_CTRL_BASE0,
|
||||
QCA955X_PCI_CRP_BASE0,
|
||||
QCA955X_PCI_MEM_BASE0,
|
||||
QCA955X_PCI_MEM_SIZE,
|
||||
0,
|
||||
ATH79_IP2_IRQ(0));
|
||||
|
||||
pdev = ath79_register_pci_ar724x(1,
|
||||
QCA955X_PCI_CFG_BASE1,
|
||||
QCA955X_PCI_CTRL_BASE1,
|
||||
QCA955X_PCI_CRP_BASE1,
|
||||
QCA955X_PCI_MEM_BASE1,
|
||||
QCA955X_PCI_MEM_SIZE,
|
||||
1,
|
||||
ATH79_IP3_IRQ(2));
|
||||
} else {
|
||||
/* No PCI support */
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return -ENODEV;
|
||||
if (!pdev)
|
||||
pr_err("unable to register PCI controller device\n");
|
||||
|
||||
return pdev ? 0 : -ENODEV;
|
||||
}
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
#define _ATH79_PCI_H
|
||||
|
||||
struct ath79_pci_irq {
|
||||
int bus;
|
||||
u8 slot;
|
||||
u8 pin;
|
||||
int irq;
|
||||
|
|
|
@ -164,13 +164,29 @@ static void __init ath79_detect_sys_type(void)
|
|||
rev = id & AR934X_REV_ID_REVISION_MASK;
|
||||
break;
|
||||
|
||||
case REV_ID_MAJOR_QCA9556:
|
||||
ath79_soc = ATH79_SOC_QCA9556;
|
||||
chip = "9556";
|
||||
rev = id & QCA955X_REV_ID_REVISION_MASK;
|
||||
break;
|
||||
|
||||
case REV_ID_MAJOR_QCA9558:
|
||||
ath79_soc = ATH79_SOC_QCA9558;
|
||||
chip = "9558";
|
||||
rev = id & QCA955X_REV_ID_REVISION_MASK;
|
||||
break;
|
||||
|
||||
default:
|
||||
panic("ath79: unknown SoC, id:0x%08x", id);
|
||||
}
|
||||
|
||||
ath79_soc_rev = rev;
|
||||
|
||||
sprintf(ath79_sys_type, "Atheros AR%s rev %u", chip, rev);
|
||||
if (soc_is_qca955x())
|
||||
sprintf(ath79_sys_type, "Qualcomm Atheros QCA%s rev %u",
|
||||
chip, rev);
|
||||
else
|
||||
sprintf(ath79_sys_type, "Atheros AR%s rev %u", chip, rev);
|
||||
pr_info("SoC: %s\n", ath79_sys_type);
|
||||
}
|
||||
|
||||
|
|
|
@ -3,5 +3,5 @@
|
|||
# under Linux.
|
||||
#
|
||||
|
||||
obj-y += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
|
||||
obj-y += irq.o nvram.o prom.o serial.o setup.o time.o sprom.o
|
||||
obj-$(CONFIG_BCM47XX_SSB) += wgt634u.o
|
||||
|
|
|
@ -3,10 +3,10 @@
|
|||
*
|
||||
* Copyright (C) 2005 Broadcom Corporation
|
||||
* Copyright (C) 2006 Felix Fietkau <nbd@openwrt.org>
|
||||
* Copyright (C) 2010-2011 Hauke Mehrtens <hauke@hauke-m.de>
|
||||
* Copyright (C) 2010-2012 Hauke Mehrtens <hauke@hauke-m.de>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
@ -18,83 +18,160 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
#include <asm/addrspace.h>
|
||||
#include <asm/mach-bcm47xx/nvram.h>
|
||||
#include <bcm47xx_nvram.h>
|
||||
#include <asm/mach-bcm47xx/bcm47xx.h>
|
||||
|
||||
static char nvram_buf[NVRAM_SPACE];
|
||||
|
||||
/* Probe for NVRAM header */
|
||||
static void early_nvram_init(void)
|
||||
static u32 find_nvram_size(u32 end)
|
||||
{
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
struct ssb_mipscore *mcore_ssb;
|
||||
#endif
|
||||
#ifdef CONFIG_BCM47XX_BCMA
|
||||
struct bcma_drv_cc *bcma_cc;
|
||||
#endif
|
||||
struct nvram_header *header;
|
||||
u32 nvram_sizes[] = {0x8000, 0xF000, 0x10000};
|
||||
int i;
|
||||
u32 base = 0;
|
||||
u32 lim = 0;
|
||||
u32 off;
|
||||
u32 *src, *dst;
|
||||
|
||||
switch (bcm47xx_bus_type) {
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
case BCM47XX_BUS_TYPE_SSB:
|
||||
mcore_ssb = &bcm47xx_bus.ssb.mipscore;
|
||||
base = mcore_ssb->pflash.window;
|
||||
lim = mcore_ssb->pflash.window_size;
|
||||
break;
|
||||
#endif
|
||||
#ifdef CONFIG_BCM47XX_BCMA
|
||||
case BCM47XX_BUS_TYPE_BCMA:
|
||||
bcma_cc = &bcm47xx_bus.bcma.bus.drv_cc;
|
||||
base = bcma_cc->pflash.window;
|
||||
lim = bcma_cc->pflash.window_size;
|
||||
break;
|
||||
#endif
|
||||
for (i = 0; i < ARRAY_SIZE(nvram_sizes); i++) {
|
||||
header = (struct nvram_header *)KSEG1ADDR(end - nvram_sizes[i]);
|
||||
if (header->magic == NVRAM_HEADER)
|
||||
return nvram_sizes[i];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Probe for NVRAM header */
|
||||
static int nvram_find_and_copy(u32 base, u32 lim)
|
||||
{
|
||||
struct nvram_header *header;
|
||||
int i;
|
||||
u32 off;
|
||||
u32 *src, *dst;
|
||||
u32 size;
|
||||
|
||||
/* TODO: when nvram is on nand flash check for bad blocks first. */
|
||||
off = FLASH_MIN;
|
||||
while (off <= lim) {
|
||||
/* Windowed flash access */
|
||||
header = (struct nvram_header *)
|
||||
KSEG1ADDR(base + off - NVRAM_SPACE);
|
||||
if (header->magic == NVRAM_HEADER)
|
||||
size = find_nvram_size(base + off);
|
||||
if (size) {
|
||||
header = (struct nvram_header *)KSEG1ADDR(base + off -
|
||||
size);
|
||||
goto found;
|
||||
}
|
||||
off <<= 1;
|
||||
}
|
||||
|
||||
/* Try embedded NVRAM at 4 KB and 1 KB as last resorts */
|
||||
header = (struct nvram_header *) KSEG1ADDR(base + 4096);
|
||||
if (header->magic == NVRAM_HEADER)
|
||||
if (header->magic == NVRAM_HEADER) {
|
||||
size = NVRAM_SPACE;
|
||||
goto found;
|
||||
}
|
||||
|
||||
header = (struct nvram_header *) KSEG1ADDR(base + 1024);
|
||||
if (header->magic == NVRAM_HEADER)
|
||||
if (header->magic == NVRAM_HEADER) {
|
||||
size = NVRAM_SPACE;
|
||||
goto found;
|
||||
}
|
||||
|
||||
return;
|
||||
pr_err("no nvram found\n");
|
||||
return -ENXIO;
|
||||
|
||||
found:
|
||||
|
||||
if (header->len > size)
|
||||
pr_err("The nvram size accoridng to the header seems to be bigger than the partition on flash\n");
|
||||
if (header->len > NVRAM_SPACE)
|
||||
pr_err("nvram on flash (%i bytes) is bigger than the reserved space in memory, will just copy the first %i bytes\n",
|
||||
header->len, NVRAM_SPACE);
|
||||
|
||||
src = (u32 *) header;
|
||||
dst = (u32 *) nvram_buf;
|
||||
for (i = 0; i < sizeof(struct nvram_header); i += 4)
|
||||
*dst++ = *src++;
|
||||
for (; i < header->len && i < NVRAM_SPACE; i += 4)
|
||||
for (; i < header->len && i < NVRAM_SPACE && i < size; i += 4)
|
||||
*dst++ = le32_to_cpu(*src++);
|
||||
memset(dst, 0x0, NVRAM_SPACE - i);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int nvram_getenv(char *name, char *val, size_t val_len)
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
static int nvram_init_ssb(void)
|
||||
{
|
||||
struct ssb_mipscore *mcore = &bcm47xx_bus.ssb.mipscore;
|
||||
u32 base;
|
||||
u32 lim;
|
||||
|
||||
if (mcore->pflash.present) {
|
||||
base = mcore->pflash.window;
|
||||
lim = mcore->pflash.window_size;
|
||||
} else {
|
||||
pr_err("Couldn't find supported flash memory\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
return nvram_find_and_copy(base, lim);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_BCM47XX_BCMA
|
||||
static int nvram_init_bcma(void)
|
||||
{
|
||||
struct bcma_drv_cc *cc = &bcm47xx_bus.bcma.bus.drv_cc;
|
||||
u32 base;
|
||||
u32 lim;
|
||||
|
||||
#ifdef CONFIG_BCMA_NFLASH
|
||||
if (cc->nflash.boot) {
|
||||
base = BCMA_SOC_FLASH1;
|
||||
lim = BCMA_SOC_FLASH1_SZ;
|
||||
} else
|
||||
#endif
|
||||
if (cc->pflash.present) {
|
||||
base = cc->pflash.window;
|
||||
lim = cc->pflash.window_size;
|
||||
#ifdef CONFIG_BCMA_SFLASH
|
||||
} else if (cc->sflash.present) {
|
||||
base = cc->sflash.window;
|
||||
lim = cc->sflash.size;
|
||||
#endif
|
||||
} else {
|
||||
pr_err("Couldn't find supported flash memory\n");
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
return nvram_find_and_copy(base, lim);
|
||||
}
|
||||
#endif
|
||||
|
||||
static int nvram_init(void)
|
||||
{
|
||||
switch (bcm47xx_bus_type) {
|
||||
#ifdef CONFIG_BCM47XX_SSB
|
||||
case BCM47XX_BUS_TYPE_SSB:
|
||||
return nvram_init_ssb();
|
||||
#endif
|
||||
#ifdef CONFIG_BCM47XX_BCMA
|
||||
case BCM47XX_BUS_TYPE_BCMA:
|
||||
return nvram_init_bcma();
|
||||
#endif
|
||||
}
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
int bcm47xx_nvram_getenv(char *name, char *val, size_t val_len)
|
||||
{
|
||||
char *var, *value, *end, *eq;
|
||||
int err;
|
||||
|
||||
if (!name)
|
||||
return NVRAM_ERR_INV_PARAM;
|
||||
return -EINVAL;
|
||||
|
||||
if (!nvram_buf[0])
|
||||
early_nvram_init();
|
||||
if (!nvram_buf[0]) {
|
||||
err = nvram_init();
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
/* Look for name=value and return value */
|
||||
var = &nvram_buf[sizeof(struct nvram_header)];
|
||||
|
@ -110,6 +187,6 @@ int nvram_getenv(char *name, char *val, size_t val_len)
|
|||
return snprintf(val, val_len, "%s", value);
|
||||
}
|
||||
}
|
||||
return NVRAM_ERR_ENVNOTFOUND;
|
||||
return -ENOENT;
|
||||
}
|
||||
EXPORT_SYMBOL(nvram_getenv);
|
||||
EXPORT_SYMBOL(bcm47xx_nvram_getenv);
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
#include <asm/reboot.h>
|
||||
#include <asm/time.h>
|
||||
#include <bcm47xx.h>
|
||||
#include <asm/mach-bcm47xx/nvram.h>
|
||||
#include <bcm47xx_nvram.h>
|
||||
|
||||
union bcm47xx_bus bcm47xx_bus;
|
||||
EXPORT_SYMBOL(bcm47xx_bus);
|
||||
|
@ -115,7 +115,7 @@ static int bcm47xx_get_invariants(struct ssb_bus *bus,
|
|||
memset(&iv->sprom, 0, sizeof(struct ssb_sprom));
|
||||
bcm47xx_fill_sprom(&iv->sprom, NULL, false);
|
||||
|
||||
if (nvram_getenv("cardbus", buf, sizeof(buf)) >= 0)
|
||||
if (bcm47xx_nvram_getenv("cardbus", buf, sizeof(buf)) >= 0)
|
||||
iv->has_cardbus_slot = !!simple_strtoul(buf, NULL, 10);
|
||||
|
||||
return 0;
|
||||
|
@ -138,7 +138,7 @@ static void __init bcm47xx_register_ssb(void)
|
|||
panic("Failed to initialize SSB bus (err %d)", err);
|
||||
|
||||
mcore = &bcm47xx_bus.ssb.mipscore;
|
||||
if (nvram_getenv("kernel_args", buf, sizeof(buf)) >= 0) {
|
||||
if (bcm47xx_nvram_getenv("kernel_args", buf, sizeof(buf)) >= 0) {
|
||||
if (strstr(buf, "console=ttyS1")) {
|
||||
struct ssb_serial_port port;
|
||||
|
||||
|
|
|
@ -27,7 +27,7 @@
|
|||
*/
|
||||
|
||||
#include <bcm47xx.h>
|
||||
#include <nvram.h>
|
||||
#include <bcm47xx_nvram.h>
|
||||
|
||||
static void create_key(const char *prefix, const char *postfix,
|
||||
const char *name, char *buf, int len)
|
||||
|
@ -50,18 +50,18 @@ static int get_nvram_var(const char *prefix, const char *postfix,
|
|||
|
||||
create_key(prefix, postfix, name, key, sizeof(key));
|
||||
|
||||
err = nvram_getenv(key, buf, len);
|
||||
if (fallback && err == NVRAM_ERR_ENVNOTFOUND && prefix) {
|
||||
err = bcm47xx_nvram_getenv(key, buf, len);
|
||||
if (fallback && err == -ENOENT && prefix) {
|
||||
create_key(NULL, postfix, name, key, sizeof(key));
|
||||
err = nvram_getenv(key, buf, len);
|
||||
err = bcm47xx_nvram_getenv(key, buf, len);
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
#define NVRAM_READ_VAL(type) \
|
||||
static void nvram_read_ ## type (const char *prefix, \
|
||||
const char *postfix, const char *name, \
|
||||
type *val, type allset, bool fallback) \
|
||||
const char *postfix, const char *name, \
|
||||
type *val, type allset, bool fallback) \
|
||||
{ \
|
||||
char buf[100]; \
|
||||
int err; \
|
||||
|
@ -71,7 +71,7 @@ static void nvram_read_ ## type (const char *prefix, \
|
|||
fallback); \
|
||||
if (err < 0) \
|
||||
return; \
|
||||
err = kstrto ## type (buf, 0, &var); \
|
||||
err = kstrto ## type(strim(buf), 0, &var); \
|
||||
if (err) { \
|
||||
pr_warn("can not parse nvram name %s%s%s with value %s got %i\n", \
|
||||
prefix, name, postfix, buf, err); \
|
||||
|
@ -99,7 +99,7 @@ static void nvram_read_u32_2(const char *prefix, const char *name,
|
|||
err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback);
|
||||
if (err < 0)
|
||||
return;
|
||||
err = kstrtou32(buf, 0, &val);
|
||||
err = kstrtou32(strim(buf), 0, &val);
|
||||
if (err) {
|
||||
pr_warn("can not parse nvram name %s%s with value %s got %i\n",
|
||||
prefix, name, buf, err);
|
||||
|
@ -120,7 +120,7 @@ static void nvram_read_leddc(const char *prefix, const char *name,
|
|||
err = get_nvram_var(prefix, NULL, name, buf, sizeof(buf), fallback);
|
||||
if (err < 0)
|
||||
return;
|
||||
err = kstrtou32(buf, 0, &val);
|
||||
err = kstrtou32(strim(buf), 0, &val);
|
||||
if (err) {
|
||||
pr_warn("can not parse nvram name %s%s with value %s got %i\n",
|
||||
prefix, name, buf, err);
|
||||
|
@ -144,7 +144,7 @@ static void nvram_read_macaddr(const char *prefix, const char *name,
|
|||
if (err < 0)
|
||||
return;
|
||||
|
||||
nvram_parse_macaddr(buf, *val);
|
||||
bcm47xx_nvram_parse_macaddr(buf, *val);
|
||||
}
|
||||
|
||||
static void nvram_read_alpha2(const char *prefix, const char *name,
|
||||
|
@ -652,12 +652,10 @@ static void bcm47xx_fill_sprom_ethernet(struct ssb_sprom *sprom,
|
|||
static void bcm47xx_fill_board_data(struct ssb_sprom *sprom, const char *prefix,
|
||||
bool fallback)
|
||||
{
|
||||
nvram_read_u16(prefix, NULL, "boardrev", &sprom->board_rev, 0,
|
||||
fallback);
|
||||
nvram_read_u16(prefix, NULL, "boardrev", &sprom->board_rev, 0, true);
|
||||
nvram_read_u16(prefix, NULL, "boardnum", &sprom->board_num, 0,
|
||||
fallback);
|
||||
nvram_read_u16(prefix, NULL, "boardtype", &sprom->board_type, 0,
|
||||
fallback);
|
||||
nvram_read_u16(prefix, NULL, "boardtype", &sprom->board_type, 0, true);
|
||||
nvram_read_u32_2(prefix, "boardflags", &sprom->boardflags_lo,
|
||||
&sprom->boardflags_hi, fallback);
|
||||
nvram_read_u32_2(prefix, "boardflags2", &sprom->boardflags2_lo,
|
||||
|
|
|
@ -36,13 +36,13 @@ static struct gpio_led wgt634u_leds[] = {
|
|||
};
|
||||
|
||||
static struct gpio_led_platform_data wgt634u_led_data = {
|
||||
.num_leds = ARRAY_SIZE(wgt634u_leds),
|
||||
.leds = wgt634u_leds,
|
||||
.num_leds = ARRAY_SIZE(wgt634u_leds),
|
||||
.leds = wgt634u_leds,
|
||||
};
|
||||
|
||||
static struct platform_device wgt634u_gpio_leds = {
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.name = "leds-gpio",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.platform_data = &wgt634u_led_data,
|
||||
}
|
||||
|
@ -53,35 +53,35 @@ static struct platform_device wgt634u_gpio_leds = {
|
|||
firmware. */
|
||||
static struct mtd_partition wgt634u_partitions[] = {
|
||||
{
|
||||
.name = "cfe",
|
||||
.offset = 0,
|
||||
.size = 0x60000, /* 384k */
|
||||
.mask_flags = MTD_WRITEABLE /* force read-only */
|
||||
.name = "cfe",
|
||||
.offset = 0,
|
||||
.size = 0x60000, /* 384k */
|
||||
.mask_flags = MTD_WRITEABLE /* force read-only */
|
||||
},
|
||||
{
|
||||
.name = "config",
|
||||
.name = "config",
|
||||
.offset = 0x60000,
|
||||
.size = 0x20000 /* 128k */
|
||||
.size = 0x20000 /* 128k */
|
||||
},
|
||||
{
|
||||
.name = "linux",
|
||||
.name = "linux",
|
||||
.offset = 0x80000,
|
||||
.size = 0x140000 /* 1280k */
|
||||
.size = 0x140000 /* 1280k */
|
||||
},
|
||||
{
|
||||
.name = "jffs",
|
||||
.name = "jffs",
|
||||
.offset = 0x1c0000,
|
||||
.size = 0x620000 /* 6272k */
|
||||
.size = 0x620000 /* 6272k */
|
||||
},
|
||||
{
|
||||
.name = "nvram",
|
||||
.name = "nvram",
|
||||
.offset = 0x7e0000,
|
||||
.size = 0x20000 /* 128k */
|
||||
.size = 0x20000 /* 128k */
|
||||
},
|
||||
};
|
||||
|
||||
static struct physmap_flash_data wgt634u_flash_data = {
|
||||
.parts = wgt634u_partitions,
|
||||
.parts = wgt634u_partitions,
|
||||
.nr_parts = ARRAY_SIZE(wgt634u_partitions)
|
||||
};
|
||||
|
||||
|
@ -90,9 +90,9 @@ static struct resource wgt634u_flash_resource = {
|
|||
};
|
||||
|
||||
static struct platform_device wgt634u_flash = {
|
||||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.dev = { .platform_data = &wgt634u_flash_data, },
|
||||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.dev = { .platform_data = &wgt634u_flash_data, },
|
||||
.resource = &wgt634u_flash_resource,
|
||||
.num_resources = 1,
|
||||
};
|
||||
|
|
|
@ -406,9 +406,9 @@ static struct board_info __initdata board_FAST2404 = {
|
|||
.expected_cpu_id = 0x6348,
|
||||
|
||||
.has_uart0 = 1,
|
||||
.has_enet0 = 1,
|
||||
.has_enet1 = 1,
|
||||
.has_pci = 1,
|
||||
.has_enet0 = 1,
|
||||
.has_enet1 = 1,
|
||||
.has_pci = 1,
|
||||
|
||||
.enet0 = {
|
||||
.has_phy = 1,
|
||||
|
@ -591,22 +591,22 @@ static struct board_info __initdata board_96358vw2 = {
|
|||
};
|
||||
|
||||
static struct board_info __initdata board_AGPFS0 = {
|
||||
.name = "AGPF-S0",
|
||||
.expected_cpu_id = 0x6358,
|
||||
.name = "AGPF-S0",
|
||||
.expected_cpu_id = 0x6358,
|
||||
|
||||
.has_uart0 = 1,
|
||||
.has_enet0 = 1,
|
||||
.has_enet1 = 1,
|
||||
.has_pci = 1,
|
||||
.has_enet0 = 1,
|
||||
.has_enet1 = 1,
|
||||
.has_pci = 1,
|
||||
|
||||
.enet0 = {
|
||||
.has_phy = 1,
|
||||
.use_internal_phy = 1,
|
||||
.has_phy = 1,
|
||||
.use_internal_phy = 1,
|
||||
},
|
||||
|
||||
.enet1 = {
|
||||
.force_speed_100 = 1,
|
||||
.force_duplex_full = 1,
|
||||
.force_speed_100 = 1,
|
||||
.force_duplex_full = 1,
|
||||
},
|
||||
|
||||
.has_ohci0 = 1,
|
||||
|
@ -677,7 +677,7 @@ static struct ssb_sprom bcm63xx_sprom = {
|
|||
.revision = 0x02,
|
||||
.board_rev = 0x17,
|
||||
.country_code = 0x0,
|
||||
.ant_available_bg = 0x3,
|
||||
.ant_available_bg = 0x3,
|
||||
.pa0b0 = 0x15ae,
|
||||
.pa0b1 = 0xfa85,
|
||||
.pa0b2 = 0xfe8d,
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
#include <bcm63xx_io.h>
|
||||
#include <bcm63xx_regs.h>
|
||||
|
||||
static void __init wait_xfered(void)
|
||||
static void wait_xfered(void)
|
||||
{
|
||||
unsigned int val;
|
||||
|
||||
|
@ -22,7 +22,7 @@ static void __init wait_xfered(void)
|
|||
} while (1);
|
||||
}
|
||||
|
||||
void __init prom_putchar(char c)
|
||||
void prom_putchar(char c)
|
||||
{
|
||||
wait_xfered();
|
||||
bcm_uart0_writel(c, UART_FIFO_REG);
|
||||
|
|
|
@ -24,7 +24,7 @@ strip-flags := $(addprefix --remove-section=,$(drop-sections))
|
|||
hostprogs-y := elf2ecoff
|
||||
|
||||
targets := vmlinux.ecoff
|
||||
quiet_cmd_ecoff = ECOFF $@
|
||||
quiet_cmd_ecoff = ECOFF $@
|
||||
cmd_ecoff = $(obj)/elf2ecoff $(VMLINUX) $@ $(e2eflag)
|
||||
$(obj)/vmlinux.ecoff: $(obj)/elf2ecoff $(VMLINUX) FORCE
|
||||
$(call if_changed,ecoff)
|
||||
|
|
|
@ -51,7 +51,7 @@ $(obj)/vmlinux.bin.z: $(obj)/vmlinux.bin FORCE
|
|||
|
||||
targets += piggy.o
|
||||
OBJCOPYFLAGS_piggy.o := --add-section=.image=$(obj)/vmlinux.bin.z \
|
||||
--set-section-flags=.image=contents,alloc,load,readonly,data
|
||||
--set-section-flags=.image=contents,alloc,load,readonly,data
|
||||
$(obj)/piggy.o: $(obj)/dummy.o $(obj)/vmlinux.bin.z FORCE
|
||||
$(call if_changed,objcopy)
|
||||
|
||||
|
@ -67,9 +67,9 @@ endif
|
|||
|
||||
vmlinuzobjs-y += $(obj)/piggy.o
|
||||
|
||||
quiet_cmd_zld = LD $@
|
||||
quiet_cmd_zld = LD $@
|
||||
cmd_zld = $(LD) $(LDFLAGS) -Ttext $(VMLINUZ_LOAD_ADDRESS) -T $< $(vmlinuzobjs-y) -o $@
|
||||
quiet_cmd_strip = STRIP $@
|
||||
quiet_cmd_strip = STRIP $@
|
||||
cmd_strip = $(STRIP) -s $@
|
||||
vmlinuz: $(src)/ld.script $(vmlinuzobjs-y) $(obj)/calc_vmlinuz_load_addr
|
||||
$(call cmd,zld)
|
||||
|
@ -96,7 +96,7 @@ quiet_cmd_32 = OBJCOPY $@
|
|||
vmlinuz.32: vmlinuz
|
||||
$(call cmd,32)
|
||||
|
||||
quiet_cmd_ecoff = ECOFF $@
|
||||
quiet_cmd_ecoff = ECOFF $@
|
||||
cmd_ecoff = $< $(VMLINUZ) $@ $(e2eflag)
|
||||
vmlinuz.ecoff: $(obj)/../elf2ecoff $(VMLINUZ)
|
||||
$(call cmd,ecoff)
|
||||
|
|
|
@ -1,8 +1,8 @@
|
|||
/*
|
||||
* Copyright (C) 2010 "Wu Zhangjin" <wuzhangjin@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
|
|
@ -5,8 +5,8 @@
|
|||
* Copyright (C) 2009 Lemote, Inc.
|
||||
* Author: Wu Zhangjin <wuzhangjin@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; either version 2 of the License, or (at your
|
||||
* option) any later version.
|
||||
*/
|
||||
|
|
|
@ -32,8 +32,8 @@ start:
|
|||
bne a2, a0, 1b
|
||||
addiu a0, a0, 4
|
||||
|
||||
PTR_LA a0, (.heap) /* heap address */
|
||||
PTR_LA sp, (.stack + 8192) /* stack address */
|
||||
PTR_LA a0, (.heap) /* heap address */
|
||||
PTR_LA sp, (.stack + 8192) /* stack address */
|
||||
|
||||
PTR_LA ra, 2f
|
||||
PTR_LA k0, decompress_kernel
|
||||
|
|
|
@ -2,48 +2,48 @@
|
|||
* Some ECOFF definitions.
|
||||
*/
|
||||
typedef struct filehdr {
|
||||
unsigned short f_magic; /* magic number */
|
||||
unsigned short f_nscns; /* number of sections */
|
||||
long f_timdat; /* time & date stamp */
|
||||
long f_symptr; /* file pointer to symbolic header */
|
||||
long f_nsyms; /* sizeof(symbolic hdr) */
|
||||
unsigned short f_opthdr; /* sizeof(optional hdr) */
|
||||
unsigned short f_flags; /* flags */
|
||||
unsigned short f_magic; /* magic number */
|
||||
unsigned short f_nscns; /* number of sections */
|
||||
long f_timdat; /* time & date stamp */
|
||||
long f_symptr; /* file pointer to symbolic header */
|
||||
long f_nsyms; /* sizeof(symbolic hdr) */
|
||||
unsigned short f_opthdr; /* sizeof(optional hdr) */
|
||||
unsigned short f_flags; /* flags */
|
||||
} FILHDR;
|
||||
#define FILHSZ sizeof(FILHDR)
|
||||
#define FILHSZ sizeof(FILHDR)
|
||||
|
||||
#define OMAGIC 0407
|
||||
#define MIPSEBMAGIC 0x160
|
||||
#define MIPSELMAGIC 0x162
|
||||
|
||||
typedef struct scnhdr {
|
||||
char s_name[8]; /* section name */
|
||||
long s_paddr; /* physical address, aliased s_nlib */
|
||||
long s_vaddr; /* virtual address */
|
||||
long s_size; /* section size */
|
||||
long s_scnptr; /* file ptr to raw data for section */
|
||||
long s_relptr; /* file ptr to relocation */
|
||||
long s_lnnoptr; /* file ptr to gp histogram */
|
||||
unsigned short s_nreloc; /* number of relocation entries */
|
||||
unsigned short s_nlnno; /* number of gp histogram entries */
|
||||
long s_flags; /* flags */
|
||||
char s_name[8]; /* section name */
|
||||
long s_paddr; /* physical address, aliased s_nlib */
|
||||
long s_vaddr; /* virtual address */
|
||||
long s_size; /* section size */
|
||||
long s_scnptr; /* file ptr to raw data for section */
|
||||
long s_relptr; /* file ptr to relocation */
|
||||
long s_lnnoptr; /* file ptr to gp histogram */
|
||||
unsigned short s_nreloc; /* number of relocation entries */
|
||||
unsigned short s_nlnno; /* number of gp histogram entries */
|
||||
long s_flags; /* flags */
|
||||
} SCNHDR;
|
||||
#define SCNHSZ sizeof(SCNHDR)
|
||||
#define SCNROUND ((long)16)
|
||||
|
||||
typedef struct aouthdr {
|
||||
short magic; /* see above */
|
||||
short vstamp; /* version stamp */
|
||||
long tsize; /* text size in bytes, padded to DW bdry*/
|
||||
long dsize; /* initialized data " " */
|
||||
long bsize; /* uninitialized data " " */
|
||||
long entry; /* entry pt. */
|
||||
long text_start; /* base of text used for this file */
|
||||
long data_start; /* base of data used for this file */
|
||||
long bss_start; /* base of bss used for this file */
|
||||
long gprmask; /* general purpose register mask */
|
||||
long cprmask[4]; /* co-processor register masks */
|
||||
long gp_value; /* the gp value used for this object */
|
||||
short magic; /* see above */
|
||||
short vstamp; /* version stamp */
|
||||
long tsize; /* text size in bytes, padded to DW bdry*/
|
||||
long dsize; /* initialized data " " */
|
||||
long bsize; /* uninitialized data " " */
|
||||
long entry; /* entry pt. */
|
||||
long text_start; /* base of text used for this file */
|
||||
long data_start; /* base of data used for this file */
|
||||
long bss_start; /* base of bss used for this file */
|
||||
long gprmask; /* general purpose register mask */
|
||||
long cprmask[4]; /* co-processor register masks */
|
||||
long gp_value; /* the gp value used for this object */
|
||||
} AOUTHDR;
|
||||
#define AOUTHSZ sizeof(AOUTHDR)
|
||||
|
||||
|
@ -51,7 +51,7 @@ typedef struct aouthdr {
|
|||
#define NMAGIC 0410
|
||||
#define ZMAGIC 0413
|
||||
#define SMAGIC 0411
|
||||
#define LIBMAGIC 0443
|
||||
#define LIBMAGIC 0443
|
||||
|
||||
#define N_TXTOFF(f, a) \
|
||||
((a).magic == ZMAGIC || (a).magic == LIBMAGIC ? 0 : \
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
/* elf2ecoff.c
|
||||
|
||||
This program converts an elf executable to an ECOFF executable.
|
||||
No symbol table is retained. This is useful primarily in building
|
||||
No symbol table is retained. This is useful primarily in building
|
||||
net-bootable kernels for machines (e.g., DECstation and Alpha) which
|
||||
only support the ECOFF object file format. */
|
||||
|
||||
|
@ -341,7 +341,7 @@ int main(int argc, char *argv[])
|
|||
|
||||
/* Figure out if we can cram the program header into an ECOFF
|
||||
header... Basically, we can't handle anything but loadable
|
||||
segments, but we can ignore some kinds of segments. We can't
|
||||
segments, but we can ignore some kinds of segments. We can't
|
||||
handle holes in the address space. Segments may be out of order,
|
||||
so we sort them first. */
|
||||
|
||||
|
@ -514,7 +514,7 @@ int main(int argc, char *argv[])
|
|||
|
||||
for (i = 0; i < nosecs; i++) {
|
||||
printf
|
||||
("Section %d: %s phys %lx size %lx file offset %lx\n",
|
||||
("Section %d: %s phys %lx size %lx file offset %lx\n",
|
||||
i, esecs[i].s_name, esecs[i].s_paddr,
|
||||
esecs[i].s_size, esecs[i].s_scnptr);
|
||||
}
|
||||
|
@ -551,7 +551,7 @@ int main(int argc, char *argv[])
|
|||
}
|
||||
|
||||
/*
|
||||
* Copy the loadable sections. Zero-fill any gaps less than 64k;
|
||||
* Copy the loadable sections. Zero-fill any gaps less than 64k;
|
||||
* complain about any zero-filling, and die if we're asked to zero-fill
|
||||
* more than 64k.
|
||||
*/
|
||||
|
|
|
@ -94,4 +94,13 @@ config SWIOTLB
|
|||
select NEED_SG_DMA_LENGTH
|
||||
|
||||
|
||||
config OCTEON_ILM
|
||||
tristate "Module to measure interrupt latency using Octeon CIU Timer"
|
||||
help
|
||||
This driver is a module to measure interrupt latency using the
|
||||
the CIU Timers on Octeon.
|
||||
|
||||
To compile this driver as a module, choose M here. The module
|
||||
will be called octeon-ilm
|
||||
|
||||
endif # CPU_CAVIUM_OCTEON
|
||||
|
|
|
@ -17,7 +17,8 @@ obj-y += dma-octeon.o flash_setup.o
|
|||
obj-y += octeon-memcpy.o
|
||||
obj-y += executive/
|
||||
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_SMP) += smp.o
|
||||
obj-$(CONFIG_OCTEON_ILM) += oct_ilm.o
|
||||
|
||||
DTS_FILES = octeon_3xxx.dts octeon_68xx.dts
|
||||
DTB_FILES = $(patsubst %.dts, %.dtb, $(DTS_FILES))
|
||||
|
|
|
@ -155,8 +155,8 @@ int cvmx_bootmem_init(void *mem_desc_ptr)
|
|||
*
|
||||
* Linux 64 bit: Set XKPHYS bit
|
||||
* Linux 32 bit: use mmap to create mapping, use virtual address
|
||||
* CVMX 64 bit: use physical address directly
|
||||
* CVMX 32 bit: use physical address directly
|
||||
* CVMX 64 bit: use physical address directly
|
||||
* CVMX 32 bit: use physical address directly
|
||||
*
|
||||
* Note that the CVMX environment assumes the use of 1-1 TLB
|
||||
* mappings so that the physical addresses can be used
|
||||
|
@ -398,7 +398,7 @@ error_out:
|
|||
int __cvmx_bootmem_phy_free(uint64_t phy_addr, uint64_t size, uint32_t flags)
|
||||
{
|
||||
uint64_t cur_addr;
|
||||
uint64_t prev_addr = 0; /* zero is invalid */
|
||||
uint64_t prev_addr = 0; /* zero is invalid */
|
||||
int retval = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -424,7 +424,7 @@ int __cvmx_bootmem_phy_free(uint64_t phy_addr, uint64_t size, uint32_t flags)
|
|||
if (cur_addr == 0 || phy_addr < cur_addr) {
|
||||
/* add at front of list - special case with changing head ptr */
|
||||
if (cur_addr && phy_addr + size > cur_addr)
|
||||
goto bootmem_free_done; /* error, overlapping section */
|
||||
goto bootmem_free_done; /* error, overlapping section */
|
||||
else if (phy_addr + size == cur_addr) {
|
||||
/* Add to front of existing first block */
|
||||
cvmx_bootmem_phy_set_next(phy_addr,
|
||||
|
@ -611,7 +611,7 @@ int cvmx_bootmem_phy_named_block_free(char *name, uint32_t flags)
|
|||
}
|
||||
|
||||
cvmx_bootmem_unlock();
|
||||
return named_block_ptr != NULL; /* 0 on failure, 1 on success */
|
||||
return named_block_ptr != NULL; /* 0 on failure, 1 on success */
|
||||
}
|
||||
|
||||
int64_t cvmx_bootmem_phy_named_block_alloc(uint64_t size, uint64_t min_addr,
|
||||
|
|
|
@ -203,10 +203,10 @@ int cvmx_helper_board_get_mii_address(int ipd_port)
|
|||
* enumeration from the bootloader.
|
||||
*
|
||||
* @ipd_port: IPD input port associated with the port we want to get link
|
||||
* status for.
|
||||
* status for.
|
||||
*
|
||||
* Returns The ports link status. If the link isn't fully resolved, this must
|
||||
* return zero.
|
||||
* return zero.
|
||||
*/
|
||||
cvmx_helper_link_info_t __cvmx_helper_board_link_get(int ipd_port)
|
||||
{
|
||||
|
@ -357,16 +357,16 @@ cvmx_helper_link_info_t __cvmx_helper_board_link_get(int ipd_port)
|
|||
result.s.link_up = 1;
|
||||
result.s.full_duplex = ((phy_status >> 13) & 1);
|
||||
switch ((phy_status >> 14) & 3) {
|
||||
case 0: /* 10 Mbps */
|
||||
case 0: /* 10 Mbps */
|
||||
result.s.speed = 10;
|
||||
break;
|
||||
case 1: /* 100 Mbps */
|
||||
case 1: /* 100 Mbps */
|
||||
result.s.speed = 100;
|
||||
break;
|
||||
case 2: /* 1 Gbps */
|
||||
case 2: /* 1 Gbps */
|
||||
result.s.speed = 1000;
|
||||
break;
|
||||
case 3: /* Illegal */
|
||||
case 3: /* Illegal */
|
||||
result.u64 = 0;
|
||||
break;
|
||||
}
|
||||
|
@ -391,16 +391,16 @@ cvmx_helper_link_info_t __cvmx_helper_board_link_get(int ipd_port)
|
|||
result.s.link_up = inband_status.s.status;
|
||||
result.s.full_duplex = inband_status.s.duplex;
|
||||
switch (inband_status.s.speed) {
|
||||
case 0: /* 10 Mbps */
|
||||
case 0: /* 10 Mbps */
|
||||
result.s.speed = 10;
|
||||
break;
|
||||
case 1: /* 100 Mbps */
|
||||
case 1: /* 100 Mbps */
|
||||
result.s.speed = 100;
|
||||
break;
|
||||
case 2: /* 1 Gbps */
|
||||
case 2: /* 1 Gbps */
|
||||
result.s.speed = 1000;
|
||||
break;
|
||||
case 3: /* Illegal */
|
||||
case 3: /* Illegal */
|
||||
result.u64 = 0;
|
||||
break;
|
||||
}
|
||||
|
@ -429,9 +429,9 @@ cvmx_helper_link_info_t __cvmx_helper_board_link_get(int ipd_port)
|
|||
*
|
||||
* @phy_addr: The address of the PHY to program
|
||||
* @enable_autoneg:
|
||||
* Non zero if you want to enable auto-negotiation.
|
||||
* Non zero if you want to enable auto-negotiation.
|
||||
* @link_info: Link speed to program. If the speed is zero and auto-negotiation
|
||||
* is enabled, all possible negotiation speeds are advertised.
|
||||
* is enabled, all possible negotiation speeds are advertised.
|
||||
*
|
||||
* Returns Zero on success, negative on failure
|
||||
*/
|
||||
|
@ -607,10 +607,10 @@ int cvmx_helper_board_link_set_phy(int phy_addr,
|
|||
*
|
||||
* @interface: Interface to probe
|
||||
* @supported_ports:
|
||||
* Number of ports Octeon supports.
|
||||
* Number of ports Octeon supports.
|
||||
*
|
||||
* Returns Number of ports the actual board supports. Many times this will
|
||||
* simple be "support_ports".
|
||||
* simple be "support_ports".
|
||||
*/
|
||||
int __cvmx_helper_board_interface_probe(int interface, int supported_ports)
|
||||
{
|
||||
|
|
|
@ -79,10 +79,10 @@ void cvmx_helper_qlm_jtag_init(void)
|
|||
* @qlm: QLM to shift value into
|
||||
* @bits: Number of bits to shift in (1-32).
|
||||
* @data: Data to shift in. Bit 0 enters the chain first, followed by
|
||||
* bit 1, etc.
|
||||
* bit 1, etc.
|
||||
*
|
||||
* Returns The low order bits of the JTAG chain that shifted out of the
|
||||
* circle.
|
||||
* circle.
|
||||
*/
|
||||
uint32_t cvmx_helper_qlm_jtag_shift(int qlm, int bits, uint32_t data)
|
||||
{
|
||||
|
|
|
@ -131,7 +131,7 @@ void cvmx_helper_rgmii_internal_loopback(int port)
|
|||
* @interface: Interface to setup
|
||||
* @port: Port to setup (0..3)
|
||||
* @cpu_clock_hz:
|
||||
* Chip frequency in Hertz
|
||||
* Chip frequency in Hertz
|
||||
*
|
||||
* Returns Zero on success, negative on failure
|
||||
*/
|
||||
|
@ -409,14 +409,14 @@ int __cvmx_helper_rgmii_link_set(int ipd_port,
|
|||
mode.u64 = cvmx_read_csr(CVMX_GMXX_INF_MODE(interface));
|
||||
|
||||
/*
|
||||
* Port .en .type .p0mii Configuration
|
||||
* ---- --- ----- ------ -----------------------------------------
|
||||
* X 0 X X All links are disabled.
|
||||
* 0 1 X 0 Port 0 is RGMII
|
||||
* 0 1 X 1 Port 0 is MII
|
||||
* 1 1 0 X Ports 1 and 2 are configured as RGMII ports.
|
||||
* 1 1 1 X Port 1: GMII/MII; Port 2: disabled. GMII or
|
||||
* MII port is selected by GMX_PRT1_CFG[SPEED].
|
||||
* Port .en .type .p0mii Configuration
|
||||
* ---- --- ----- ------ -----------------------------------------
|
||||
* X 0 X X All links are disabled.
|
||||
* 0 1 X 0 Port 0 is RGMII
|
||||
* 0 1 X 1 Port 0 is MII
|
||||
* 1 1 0 X Ports 1 and 2 are configured as RGMII ports.
|
||||
* 1 1 1 X Port 1: GMII/MII; Port 2: disabled. GMII or
|
||||
* MII port is selected by GMX_PRT1_CFG[SPEED].
|
||||
*/
|
||||
|
||||
/* In MII mode, CLK_CNT = 1. */
|
||||
|
@ -464,9 +464,9 @@ int __cvmx_helper_rgmii_link_set(int ipd_port,
|
|||
*
|
||||
* @ipd_port: IPD/PKO port to loopback.
|
||||
* @enable_internal:
|
||||
* Non zero if you want internal loopback
|
||||
* Non zero if you want internal loopback
|
||||
* @enable_external:
|
||||
* Non zero if you want external loopback
|
||||
* Non zero if you want external loopback
|
||||
*
|
||||
* Returns Zero on success, negative on failure.
|
||||
*/
|
||||
|
|
|
@ -523,9 +523,9 @@ int __cvmx_helper_sgmii_link_set(int ipd_port,
|
|||
*
|
||||
* @ipd_port: IPD/PKO port to loopback.
|
||||
* @enable_internal:
|
||||
* Non zero if you want internal loopback
|
||||
* Non zero if you want internal loopback
|
||||
* @enable_external:
|
||||
* Non zero if you want external loopback
|
||||
* Non zero if you want external loopback
|
||||
*
|
||||
* Returns Zero on success, negative on failure.
|
||||
*/
|
||||
|
|
|
@ -160,16 +160,16 @@ cvmx_helper_link_info_t __cvmx_helper_spi_link_get(int ipd_port)
|
|||
result.s.link_up = inband.s.status;
|
||||
result.s.full_duplex = inband.s.duplex;
|
||||
switch (inband.s.speed) {
|
||||
case 0: /* 10 Mbps */
|
||||
case 0: /* 10 Mbps */
|
||||
result.s.speed = 10;
|
||||
break;
|
||||
case 1: /* 100 Mbps */
|
||||
case 1: /* 100 Mbps */
|
||||
result.s.speed = 100;
|
||||
break;
|
||||
case 2: /* 1 Gbps */
|
||||
case 2: /* 1 Gbps */
|
||||
result.s.speed = 1000;
|
||||
break;
|
||||
case 3: /* Illegal */
|
||||
case 3: /* Illegal */
|
||||
result.s.speed = 0;
|
||||
result.s.link_up = 0;
|
||||
break;
|
||||
|
|
|
@ -96,9 +96,9 @@ int cvmx_helper_dump_packet(cvmx_wqe_t *work)
|
|||
uint8_t *end_of_data;
|
||||
|
||||
cvmx_dprintf("Packet Length: %u\n", work->len);
|
||||
cvmx_dprintf(" Input Port: %u\n", work->ipprt);
|
||||
cvmx_dprintf(" QoS: %u\n", work->qos);
|
||||
cvmx_dprintf(" Buffers: %u\n", work->word2.s.bufs);
|
||||
cvmx_dprintf(" Input Port: %u\n", work->ipprt);
|
||||
cvmx_dprintf(" QoS: %u\n", work->qos);
|
||||
cvmx_dprintf(" Buffers: %u\n", work->word2.s.bufs);
|
||||
|
||||
if (work->word2.s.bufs == 0) {
|
||||
union cvmx_ipd_wqe_fpa_queue wqe_pool;
|
||||
|
@ -132,14 +132,14 @@ int cvmx_helper_dump_packet(cvmx_wqe_t *work)
|
|||
while (remaining_bytes) {
|
||||
start_of_buffer =
|
||||
((buffer_ptr.s.addr >> 7) - buffer_ptr.s.back) << 7;
|
||||
cvmx_dprintf(" Buffer Start:%llx\n",
|
||||
cvmx_dprintf(" Buffer Start:%llx\n",
|
||||
(unsigned long long)start_of_buffer);
|
||||
cvmx_dprintf(" Buffer I : %u\n", buffer_ptr.s.i);
|
||||
cvmx_dprintf(" Buffer Back: %u\n", buffer_ptr.s.back);
|
||||
cvmx_dprintf(" Buffer Pool: %u\n", buffer_ptr.s.pool);
|
||||
cvmx_dprintf(" Buffer Data: %llx\n",
|
||||
cvmx_dprintf(" Buffer I : %u\n", buffer_ptr.s.i);
|
||||
cvmx_dprintf(" Buffer Back: %u\n", buffer_ptr.s.back);
|
||||
cvmx_dprintf(" Buffer Pool: %u\n", buffer_ptr.s.pool);
|
||||
cvmx_dprintf(" Buffer Data: %llx\n",
|
||||
(unsigned long long)buffer_ptr.s.addr);
|
||||
cvmx_dprintf(" Buffer Size: %u\n", buffer_ptr.s.size);
|
||||
cvmx_dprintf(" Buffer Size: %u\n", buffer_ptr.s.size);
|
||||
|
||||
cvmx_dprintf("\t\t");
|
||||
data_address = (uint8_t *) cvmx_phys_to_ptr(buffer_ptr.s.addr);
|
||||
|
@ -172,11 +172,11 @@ int cvmx_helper_dump_packet(cvmx_wqe_t *work)
|
|||
*
|
||||
* @queue: Input queue to setup RED on (0-7)
|
||||
* @pass_thresh:
|
||||
* Packets will begin slowly dropping when there are less than
|
||||
* this many packet buffers free in FPA 0.
|
||||
* Packets will begin slowly dropping when there are less than
|
||||
* this many packet buffers free in FPA 0.
|
||||
* @drop_thresh:
|
||||
* All incoming packets will be dropped when there are less
|
||||
* than this many free packet buffers in FPA 0.
|
||||
* All incoming packets will be dropped when there are less
|
||||
* than this many free packet buffers in FPA 0.
|
||||
* Returns Zero on success. Negative on failure
|
||||
*/
|
||||
int cvmx_helper_setup_red_queue(int queue, int pass_thresh, int drop_thresh)
|
||||
|
@ -207,11 +207,11 @@ int cvmx_helper_setup_red_queue(int queue, int pass_thresh, int drop_thresh)
|
|||
* Setup Random Early Drop to automatically begin dropping packets.
|
||||
*
|
||||
* @pass_thresh:
|
||||
* Packets will begin slowly dropping when there are less than
|
||||
* this many packet buffers free in FPA 0.
|
||||
* Packets will begin slowly dropping when there are less than
|
||||
* this many packet buffers free in FPA 0.
|
||||
* @drop_thresh:
|
||||
* All incoming packets will be dropped when there are less
|
||||
* than this many free packet buffers in FPA 0.
|
||||
* All incoming packets will be dropped when there are less
|
||||
* than this many free packet buffers in FPA 0.
|
||||
* Returns Zero on success. Negative on failure
|
||||
*/
|
||||
int cvmx_helper_setup_red(int pass_thresh, int drop_thresh)
|
||||
|
|
|
@ -321,9 +321,9 @@ int __cvmx_helper_xaui_link_set(int ipd_port, cvmx_helper_link_info_t link_info)
|
|||
*
|
||||
* @ipd_port: IPD/PKO port to loopback.
|
||||
* @enable_internal:
|
||||
* Non zero if you want internal loopback
|
||||
* Non zero if you want internal loopback
|
||||
* @enable_external:
|
||||
* Non zero if you want external loopback
|
||||
* Non zero if you want external loopback
|
||||
*
|
||||
* Returns Zero on success, negative on failure.
|
||||
*/
|
||||
|
|
|
@ -111,7 +111,7 @@ int cvmx_helper_ports_on_interface(int interface)
|
|||
* @interface: Interface to probe
|
||||
*
|
||||
* Returns Mode of the interface. Unknown or unsupported interfaces return
|
||||
* DISABLED.
|
||||
* DISABLED.
|
||||
*/
|
||||
cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int interface)
|
||||
{
|
||||
|
@ -187,7 +187,7 @@ cvmx_helper_interface_mode_t cvmx_helper_interface_get_mode(int interface)
|
|||
* the defines in executive-config.h.
|
||||
*
|
||||
* @ipd_port: Port to configure. This follows the IPD numbering, not the
|
||||
* per interface numbering
|
||||
* per interface numbering
|
||||
*
|
||||
* Returns Zero on success, negative on failure
|
||||
*/
|
||||
|
@ -591,7 +591,7 @@ static int __cvmx_helper_packet_hardware_enable(int interface)
|
|||
* Function to adjust internal IPD pointer alignments
|
||||
*
|
||||
* Returns 0 on success
|
||||
* !0 on failure
|
||||
* !0 on failure
|
||||
*/
|
||||
int __cvmx_helper_errata_fix_ipd_ptr_alignment(void)
|
||||
{
|
||||
|
@ -1068,9 +1068,9 @@ int cvmx_helper_link_set(int ipd_port, cvmx_helper_link_info_t link_info)
|
|||
*
|
||||
* @ipd_port: IPD/PKO port to loopback.
|
||||
* @enable_internal:
|
||||
* Non zero if you want internal loopback
|
||||
* Non zero if you want internal loopback
|
||||
* @enable_external:
|
||||
* Non zero if you want external loopback
|
||||
* Non zero if you want external loopback
|
||||
*
|
||||
* Returns Zero on success, negative on failure.
|
||||
*/
|
||||
|
|
|
@ -85,11 +85,11 @@ void __cvmx_interrupt_gmxx_enable(int interface)
|
|||
if (OCTEON_IS_MODEL(OCTEON_CN56XX) || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
|
||||
if (mode.s.en) {
|
||||
switch (mode.cn56xx.mode) {
|
||||
case 1: /* XAUI */
|
||||
case 1: /* XAUI */
|
||||
num_ports = 1;
|
||||
break;
|
||||
case 2: /* SGMII */
|
||||
case 3: /* PICMG */
|
||||
case 2: /* SGMII */
|
||||
case 3: /* PICMG */
|
||||
num_ports = 4;
|
||||
break;
|
||||
default: /* Disabled */
|
||||
|
|
|
@ -147,7 +147,7 @@ int cvmx_l2c_set_hw_way_partition(uint32_t mask)
|
|||
mask &= valid_mask;
|
||||
|
||||
/* A UMSK setting which blocks all L2C Ways is an error on some chips */
|
||||
if (mask == valid_mask && !OCTEON_IS_MODEL(OCTEON_CN63XX))
|
||||
if (mask == valid_mask && !OCTEON_IS_MODEL(OCTEON_CN63XX))
|
||||
return -1;
|
||||
|
||||
if (OCTEON_IS_MODEL(OCTEON_CN63XX))
|
||||
|
@ -438,7 +438,7 @@ void cvmx_l2c_flush(void)
|
|||
for (set = 0; set < n_set; set++) {
|
||||
for (assoc = 0; assoc < n_assoc; assoc++) {
|
||||
address = CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS,
|
||||
(assoc << assoc_shift) | (set << set_shift));
|
||||
(assoc << assoc_shift) | (set << set_shift));
|
||||
CVMX_CACHE_WBIL2I(address, 0);
|
||||
}
|
||||
}
|
||||
|
@ -573,8 +573,8 @@ union __cvmx_l2c_tag {
|
|||
* @index: Index of the cacheline
|
||||
*
|
||||
* Returns The Octeon model specific tag structure. This is
|
||||
* translated by a wrapper function to a generic form that is
|
||||
* easier for applications to use.
|
||||
* translated by a wrapper function to a generic form that is
|
||||
* easier for applications to use.
|
||||
*/
|
||||
static union __cvmx_l2c_tag __read_l2_tag(uint64_t assoc, uint64_t index)
|
||||
{
|
||||
|
@ -618,12 +618,12 @@ static union __cvmx_l2c_tag __read_l2_tag(uint64_t assoc, uint64_t index)
|
|||
".set push\n\t"
|
||||
".set mips64\n\t"
|
||||
".set noreorder\n\t"
|
||||
"sd %[dbg_val], 0(%[dbg_addr])\n\t" /* Enter debug mode, wait for store */
|
||||
"sd %[dbg_val], 0(%[dbg_addr])\n\t" /* Enter debug mode, wait for store */
|
||||
"ld $0, 0(%[dbg_addr])\n\t"
|
||||
"ld %[tag_val], 0(%[tag_addr])\n\t" /* Read L2C tag data */
|
||||
"sd $0, 0(%[dbg_addr])\n\t" /* Exit debug mode, wait for store */
|
||||
"ld %[tag_val], 0(%[tag_addr])\n\t" /* Read L2C tag data */
|
||||
"sd $0, 0(%[dbg_addr])\n\t" /* Exit debug mode, wait for store */
|
||||
"ld $0, 0(%[dbg_addr])\n\t"
|
||||
"cache 9, 0($0)\n\t" /* Invalidate dcache to discard debug data */
|
||||
"cache 9, 0($0)\n\t" /* Invalidate dcache to discard debug data */
|
||||
".set pop"
|
||||
: [tag_val] "=r" (tag_val)
|
||||
: [dbg_addr] "r" (dbg_addr), [dbg_val] "r" (debug_val), [tag_addr] "r" (debug_tag_addr)
|
||||
|
@ -664,10 +664,10 @@ union cvmx_l2c_tag cvmx_l2c_get_tag(uint32_t association, uint32_t index)
|
|||
CVMX_SYNC; /* make sure CVMX_L2C_TADX_TAG is updated */
|
||||
l2c_tadx_tag.u64 = cvmx_read_csr(CVMX_L2C_TADX_TAG(0));
|
||||
|
||||
tag.s.V = l2c_tadx_tag.s.valid;
|
||||
tag.s.D = l2c_tadx_tag.s.dirty;
|
||||
tag.s.L = l2c_tadx_tag.s.lock;
|
||||
tag.s.U = l2c_tadx_tag.s.use;
|
||||
tag.s.V = l2c_tadx_tag.s.valid;
|
||||
tag.s.D = l2c_tadx_tag.s.dirty;
|
||||
tag.s.L = l2c_tadx_tag.s.lock;
|
||||
tag.s.U = l2c_tadx_tag.s.use;
|
||||
tag.s.addr = l2c_tadx_tag.s.tag;
|
||||
} else {
|
||||
union __cvmx_l2c_tag tmp_tag;
|
||||
|
@ -679,34 +679,34 @@ union cvmx_l2c_tag cvmx_l2c_get_tag(uint32_t association, uint32_t index)
|
|||
* as it can represent all models.
|
||||
*/
|
||||
if (OCTEON_IS_MODEL(OCTEON_CN58XX) || OCTEON_IS_MODEL(OCTEON_CN56XX)) {
|
||||
tag.s.V = tmp_tag.cn58xx.V;
|
||||
tag.s.D = tmp_tag.cn58xx.D;
|
||||
tag.s.L = tmp_tag.cn58xx.L;
|
||||
tag.s.U = tmp_tag.cn58xx.U;
|
||||
tag.s.V = tmp_tag.cn58xx.V;
|
||||
tag.s.D = tmp_tag.cn58xx.D;
|
||||
tag.s.L = tmp_tag.cn58xx.L;
|
||||
tag.s.U = tmp_tag.cn58xx.U;
|
||||
tag.s.addr = tmp_tag.cn58xx.addr;
|
||||
} else if (OCTEON_IS_MODEL(OCTEON_CN38XX)) {
|
||||
tag.s.V = tmp_tag.cn38xx.V;
|
||||
tag.s.D = tmp_tag.cn38xx.D;
|
||||
tag.s.L = tmp_tag.cn38xx.L;
|
||||
tag.s.U = tmp_tag.cn38xx.U;
|
||||
tag.s.V = tmp_tag.cn38xx.V;
|
||||
tag.s.D = tmp_tag.cn38xx.D;
|
||||
tag.s.L = tmp_tag.cn38xx.L;
|
||||
tag.s.U = tmp_tag.cn38xx.U;
|
||||
tag.s.addr = tmp_tag.cn38xx.addr;
|
||||
} else if (OCTEON_IS_MODEL(OCTEON_CN31XX) || OCTEON_IS_MODEL(OCTEON_CN52XX)) {
|
||||
tag.s.V = tmp_tag.cn31xx.V;
|
||||
tag.s.D = tmp_tag.cn31xx.D;
|
||||
tag.s.L = tmp_tag.cn31xx.L;
|
||||
tag.s.U = tmp_tag.cn31xx.U;
|
||||
tag.s.V = tmp_tag.cn31xx.V;
|
||||
tag.s.D = tmp_tag.cn31xx.D;
|
||||
tag.s.L = tmp_tag.cn31xx.L;
|
||||
tag.s.U = tmp_tag.cn31xx.U;
|
||||
tag.s.addr = tmp_tag.cn31xx.addr;
|
||||
} else if (OCTEON_IS_MODEL(OCTEON_CN30XX)) {
|
||||
tag.s.V = tmp_tag.cn30xx.V;
|
||||
tag.s.D = tmp_tag.cn30xx.D;
|
||||
tag.s.L = tmp_tag.cn30xx.L;
|
||||
tag.s.U = tmp_tag.cn30xx.U;
|
||||
tag.s.V = tmp_tag.cn30xx.V;
|
||||
tag.s.D = tmp_tag.cn30xx.D;
|
||||
tag.s.L = tmp_tag.cn30xx.L;
|
||||
tag.s.U = tmp_tag.cn30xx.U;
|
||||
tag.s.addr = tmp_tag.cn30xx.addr;
|
||||
} else if (OCTEON_IS_MODEL(OCTEON_CN50XX)) {
|
||||
tag.s.V = tmp_tag.cn50xx.V;
|
||||
tag.s.D = tmp_tag.cn50xx.D;
|
||||
tag.s.L = tmp_tag.cn50xx.L;
|
||||
tag.s.U = tmp_tag.cn50xx.U;
|
||||
tag.s.V = tmp_tag.cn50xx.V;
|
||||
tag.s.D = tmp_tag.cn50xx.D;
|
||||
tag.s.L = tmp_tag.cn50xx.L;
|
||||
tag.s.U = tmp_tag.cn50xx.U;
|
||||
tag.s.addr = tmp_tag.cn50xx.addr;
|
||||
} else {
|
||||
cvmx_dprintf("Unsupported OCTEON Model in %s\n", __func__);
|
||||
|
@ -865,7 +865,7 @@ void cvmx_l2c_flush_line(uint32_t assoc, uint32_t index)
|
|||
uint64_t address;
|
||||
/* Create the address based on index and association.
|
||||
* Bits<20:17> select the way of the cache block involved in
|
||||
* the operation
|
||||
* the operation
|
||||
* Bits<16:7> of the effect address select the index
|
||||
*/
|
||||
address = CVMX_ADD_SEG(CVMX_MIPS_SPACE_XKPHYS,
|
||||
|
|
|
@ -99,7 +99,7 @@ void cvmx_pko_initialize_global(void)
|
|||
* be called after the FPA has been initialized and filled with pages.
|
||||
*
|
||||
* Returns 0 on success
|
||||
* !0 on failure
|
||||
* !0 on failure
|
||||
*/
|
||||
int cvmx_pko_initialize_local(void)
|
||||
{
|
||||
|
@ -186,19 +186,19 @@ void cvmx_pko_shutdown(void)
|
|||
/**
|
||||
* Configure a output port and the associated queues for use.
|
||||
*
|
||||
* @port: Port to configure.
|
||||
* @port: Port to configure.
|
||||
* @base_queue: First queue number to associate with this port.
|
||||
* @num_queues: Number of queues to associate with this port
|
||||
* @priority: Array of priority levels for each queue. Values are
|
||||
* allowed to be 0-8. A value of 8 get 8 times the traffic
|
||||
* of a value of 1. A value of 0 indicates that no rounds
|
||||
* will be participated in. These priorities can be changed
|
||||
* on the fly while the pko is enabled. A priority of 9
|
||||
* indicates that static priority should be used. If static
|
||||
* priority is used all queues with static priority must be
|
||||
* contiguous starting at the base_queue, and lower numbered
|
||||
* queues have higher priority than higher numbered queues.
|
||||
* There must be num_queues elements in the array.
|
||||
* @priority: Array of priority levels for each queue. Values are
|
||||
* allowed to be 0-8. A value of 8 get 8 times the traffic
|
||||
* of a value of 1. A value of 0 indicates that no rounds
|
||||
* will be participated in. These priorities can be changed
|
||||
* on the fly while the pko is enabled. A priority of 9
|
||||
* indicates that static priority should be used. If static
|
||||
* priority is used all queues with static priority must be
|
||||
* contiguous starting at the base_queue, and lower numbered
|
||||
* queues have higher priority than higher numbered queues.
|
||||
* There must be num_queues elements in the array.
|
||||
*/
|
||||
cvmx_pko_status_t cvmx_pko_config_port(uint64_t port, uint64_t base_queue,
|
||||
uint64_t num_queues,
|
||||
|
@ -440,7 +440,7 @@ void cvmx_pko_show_queue_map()
|
|||
* @port: Port to rate limit
|
||||
* @packets_s: Maximum packet/sec
|
||||
* @burst: Maximum number of packets to burst in a row before rate
|
||||
* limiting cuts in.
|
||||
* limiting cuts in.
|
||||
*
|
||||
* Returns Zero on success, negative on failure
|
||||
*/
|
||||
|
@ -473,7 +473,7 @@ int cvmx_pko_rate_limit_packets(int port, int packets_s, int burst)
|
|||
* @port: Port to rate limit
|
||||
* @bits_s: PKO rate limit in bits/sec
|
||||
* @burst: Maximum number of bits to burst before rate
|
||||
* limiting cuts in.
|
||||
* limiting cuts in.
|
||||
*
|
||||
* Returns Zero on success, negative on failure
|
||||
*/
|
||||
|
|
|
@ -69,7 +69,7 @@ static cvmx_spi_callbacks_t cvmx_spi_callbacks = {
|
|||
/**
|
||||
* Get current SPI4 initialization callbacks
|
||||
*
|
||||
* @callbacks: Pointer to the callbacks structure.to fill
|
||||
* @callbacks: Pointer to the callbacks structure.to fill
|
||||
*
|
||||
* Returns Pointer to cvmx_spi_callbacks_t structure.
|
||||
*/
|
||||
|
@ -92,11 +92,11 @@ void cvmx_spi_set_callbacks(cvmx_spi_callbacks_t *new_callbacks)
|
|||
* Initialize and start the SPI interface.
|
||||
*
|
||||
* @interface: The identifier of the packet interface to configure and
|
||||
* use as a SPI interface.
|
||||
* use as a SPI interface.
|
||||
* @mode: The operating mode for the SPI interface. The interface
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* @timeout: Timeout to wait for clock synchronization in seconds
|
||||
* @num_ports: Number of SPI ports to configure
|
||||
*
|
||||
|
@ -138,11 +138,11 @@ int cvmx_spi_start_interface(int interface, cvmx_spi_mode_t mode, int timeout,
|
|||
* with its correspondent system.
|
||||
*
|
||||
* @interface: The identifier of the packet interface to configure and
|
||||
* use as a SPI interface.
|
||||
* use as a SPI interface.
|
||||
* @mode: The operating mode for the SPI interface. The interface
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* @timeout: Timeout to wait for clock synchronization in seconds
|
||||
*
|
||||
* Returns Zero on success, negative of failure.
|
||||
|
@ -160,7 +160,7 @@ int cvmx_spi_restart_interface(int interface, cvmx_spi_mode_t mode, int timeout)
|
|||
INVOKE_CB(cvmx_spi_callbacks.reset_cb, interface, mode);
|
||||
|
||||
/* NOTE: Calendar setup is not performed during restart */
|
||||
/* Refer to cvmx_spi_start_interface() for the full sequence */
|
||||
/* Refer to cvmx_spi_start_interface() for the full sequence */
|
||||
|
||||
/* Callback to perform clock detection */
|
||||
INVOKE_CB(cvmx_spi_callbacks.clock_detect_cb, interface, mode, timeout);
|
||||
|
@ -182,11 +182,11 @@ int cvmx_spi_restart_interface(int interface, cvmx_spi_mode_t mode, int timeout)
|
|||
* Callback to perform SPI4 reset
|
||||
*
|
||||
* @interface: The identifier of the packet interface to configure and
|
||||
* use as a SPI interface.
|
||||
* use as a SPI interface.
|
||||
* @mode: The operating mode for the SPI interface. The interface
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
*
|
||||
* Returns Zero on success, non-zero error code on failure (will cause
|
||||
* SPI initialization to abort)
|
||||
|
@ -297,11 +297,11 @@ int cvmx_spi_reset_cb(int interface, cvmx_spi_mode_t mode)
|
|||
* Callback to setup calendar and miscellaneous settings before clock detection
|
||||
*
|
||||
* @interface: The identifier of the packet interface to configure and
|
||||
* use as a SPI interface.
|
||||
* use as a SPI interface.
|
||||
* @mode: The operating mode for the SPI interface. The interface
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* @num_ports: Number of ports to configure on SPI
|
||||
*
|
||||
* Returns Zero on success, non-zero error code on failure (will cause
|
||||
|
@ -382,7 +382,7 @@ int cvmx_spi_calendar_setup_cb(int interface, cvmx_spi_mode_t mode,
|
|||
stxx_spi4_dat.u64 = 0;
|
||||
/*Minimum needed by dynamic alignment */
|
||||
stxx_spi4_dat.s.alpha = 32;
|
||||
stxx_spi4_dat.s.max_t = 0xFFFF; /*Minimum interval is 0x20 */
|
||||
stxx_spi4_dat.s.max_t = 0xFFFF; /*Minimum interval is 0x20 */
|
||||
cvmx_write_csr(CVMX_STXX_SPI4_DAT(interface),
|
||||
stxx_spi4_dat.u64);
|
||||
|
||||
|
@ -416,11 +416,11 @@ int cvmx_spi_calendar_setup_cb(int interface, cvmx_spi_mode_t mode,
|
|||
* Callback to perform clock detection
|
||||
*
|
||||
* @interface: The identifier of the packet interface to configure and
|
||||
* use as a SPI interface.
|
||||
* use as a SPI interface.
|
||||
* @mode: The operating mode for the SPI interface. The interface
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* @timeout: Timeout to wait for clock synchronization in seconds
|
||||
*
|
||||
* Returns Zero on success, non-zero error code on failure (will cause
|
||||
|
@ -494,11 +494,11 @@ int cvmx_spi_clock_detect_cb(int interface, cvmx_spi_mode_t mode, int timeout)
|
|||
* Callback to perform link training
|
||||
*
|
||||
* @interface: The identifier of the packet interface to configure and
|
||||
* use as a SPI interface.
|
||||
* use as a SPI interface.
|
||||
* @mode: The operating mode for the SPI interface. The interface
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* @timeout: Timeout to wait for link to be trained (in seconds)
|
||||
*
|
||||
* Returns Zero on success, non-zero error code on failure (will cause
|
||||
|
@ -563,11 +563,11 @@ int cvmx_spi_training_cb(int interface, cvmx_spi_mode_t mode, int timeout)
|
|||
* Callback to perform calendar data synchronization
|
||||
*
|
||||
* @interface: The identifier of the packet interface to configure and
|
||||
* use as a SPI interface.
|
||||
* use as a SPI interface.
|
||||
* @mode: The operating mode for the SPI interface. The interface
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* @timeout: Timeout to wait for calendar data in seconds
|
||||
*
|
||||
* Returns Zero on success, non-zero error code on failure (will cause
|
||||
|
@ -620,11 +620,11 @@ int cvmx_spi_calendar_sync_cb(int interface, cvmx_spi_mode_t mode, int timeout)
|
|||
* Callback to handle interface up
|
||||
*
|
||||
* @interface: The identifier of the packet interface to configure and
|
||||
* use as a SPI interface.
|
||||
* use as a SPI interface.
|
||||
* @mode: The operating mode for the SPI interface. The interface
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
* can operate as a full duplex (both Tx and Rx data paths
|
||||
* active) or as a halfplex (either the Tx data path is
|
||||
* active or the Rx data path is active, but not both).
|
||||
*
|
||||
* Returns Zero on success, non-zero error code on failure (will cause
|
||||
* SPI initialization to abort)
|
||||
|
|
|
@ -74,26 +74,26 @@ EXPORT_SYMBOL(cvmx_sysinfo_get);
|
|||
|
||||
/**
|
||||
* This function is used in non-simple executive environments (such as
|
||||
* Linux kernel, u-boot, etc.) to configure the minimal fields that
|
||||
* Linux kernel, u-boot, etc.) to configure the minimal fields that
|
||||
* are required to use simple executive files directly.
|
||||
*
|
||||
* Locking (if required) must be handled outside of this
|
||||
* function
|
||||
*
|
||||
* @phy_mem_desc_ptr:
|
||||
* Pointer to global physical memory descriptor
|
||||
* (bootmem descriptor) @board_type: Octeon board
|
||||
* type enumeration
|
||||
* Pointer to global physical memory descriptor
|
||||
* (bootmem descriptor) @board_type: Octeon board
|
||||
* type enumeration
|
||||
*
|
||||
* @board_rev_major:
|
||||
* Board major revision
|
||||
* Board major revision
|
||||
* @board_rev_minor:
|
||||
* Board minor revision
|
||||
* Board minor revision
|
||||
* @cpu_clock_hz:
|
||||
* CPU clock freqency in hertz
|
||||
* CPU clock freqency in hertz
|
||||
*
|
||||
* Returns 0: Failure
|
||||
* 1: success
|
||||
* 1: success
|
||||
*/
|
||||
int cvmx_sysinfo_minimal_initialize(void *phy_mem_desc_ptr,
|
||||
uint16_t board_type,
|
||||
|
|
|
@ -0,0 +1,206 @@
|
|||
#include <linux/fs.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <asm/octeon/octeon.h>
|
||||
#include <asm/octeon/cvmx-ciu-defs.h>
|
||||
#include <asm/octeon/cvmx.h>
|
||||
#include <linux/debugfs.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/seq_file.h>
|
||||
|
||||
#define TIMER_NUM 3
|
||||
|
||||
static bool reset_stats;
|
||||
|
||||
struct latency_info {
|
||||
u64 io_interval;
|
||||
u64 cpu_interval;
|
||||
u64 timer_start1;
|
||||
u64 timer_start2;
|
||||
u64 max_latency;
|
||||
u64 min_latency;
|
||||
u64 latency_sum;
|
||||
u64 average_latency;
|
||||
u64 interrupt_cnt;
|
||||
};
|
||||
|
||||
static struct latency_info li;
|
||||
static struct dentry *dir;
|
||||
|
||||
static int show_latency(struct seq_file *m, void *v)
|
||||
{
|
||||
u64 cpuclk, avg, max, min;
|
||||
struct latency_info curr_li = li;
|
||||
|
||||
cpuclk = octeon_get_clock_rate();
|
||||
|
||||
max = (curr_li.max_latency * 1000000000) / cpuclk;
|
||||
min = (curr_li.min_latency * 1000000000) / cpuclk;
|
||||
avg = (curr_li.latency_sum * 1000000000) / (cpuclk * curr_li.interrupt_cnt);
|
||||
|
||||
seq_printf(m, "cnt: %10lld, avg: %7lld ns, max: %7lld ns, min: %7lld ns\n",
|
||||
curr_li.interrupt_cnt, avg, max, min);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int oct_ilm_open(struct inode *inode, struct file *file)
|
||||
{
|
||||
return single_open(file, show_latency, NULL);
|
||||
}
|
||||
|
||||
static const struct file_operations oct_ilm_ops = {
|
||||
.open = oct_ilm_open,
|
||||
.read = seq_read,
|
||||
.llseek = seq_lseek,
|
||||
.release = single_release,
|
||||
};
|
||||
|
||||
static int reset_statistics(void *data, u64 value)
|
||||
{
|
||||
reset_stats = true;
|
||||
return 0;
|
||||
}
|
||||
|
||||
DEFINE_SIMPLE_ATTRIBUTE(reset_statistics_ops, NULL, reset_statistics, "%llu\n");
|
||||
|
||||
static int init_debufs(void)
|
||||
{
|
||||
struct dentry *show_dentry;
|
||||
dir = debugfs_create_dir("oct_ilm", 0);
|
||||
if (!dir) {
|
||||
pr_err("oct_ilm: failed to create debugfs entry oct_ilm\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
show_dentry = debugfs_create_file("statistics", 0222, dir, NULL,
|
||||
&oct_ilm_ops);
|
||||
if (!show_dentry) {
|
||||
pr_err("oct_ilm: failed to create debugfs entry oct_ilm/statistics\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
show_dentry = debugfs_create_file("reset", 0222, dir, NULL,
|
||||
&reset_statistics_ops);
|
||||
if (!show_dentry) {
|
||||
pr_err("oct_ilm: failed to create debugfs entry oct_ilm/reset\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static void init_latency_info(struct latency_info *li, int startup)
|
||||
{
|
||||
/* interval in milli seconds after which the interrupt will
|
||||
* be triggered
|
||||
*/
|
||||
int interval = 1;
|
||||
|
||||
if (startup) {
|
||||
/* Calculating by the amounts io clock and cpu clock would
|
||||
* increment in interval amount of ms
|
||||
*/
|
||||
li->io_interval = (octeon_get_io_clock_rate() * interval) / 1000;
|
||||
li->cpu_interval = (octeon_get_clock_rate() * interval) / 1000;
|
||||
}
|
||||
li->timer_start1 = 0;
|
||||
li->timer_start2 = 0;
|
||||
li->max_latency = 0;
|
||||
li->min_latency = (u64)-1;
|
||||
li->latency_sum = 0;
|
||||
li->interrupt_cnt = 0;
|
||||
}
|
||||
|
||||
|
||||
static void start_timer(int timer, u64 interval)
|
||||
{
|
||||
union cvmx_ciu_timx timx;
|
||||
unsigned long flags;
|
||||
|
||||
timx.u64 = 0;
|
||||
timx.s.one_shot = 1;
|
||||
timx.s.len = interval;
|
||||
raw_local_irq_save(flags);
|
||||
li.timer_start1 = read_c0_cvmcount();
|
||||
cvmx_write_csr(CVMX_CIU_TIMX(timer), timx.u64);
|
||||
/* Read it back to force wait until register is written. */
|
||||
timx.u64 = cvmx_read_csr(CVMX_CIU_TIMX(timer));
|
||||
li.timer_start2 = read_c0_cvmcount();
|
||||
raw_local_irq_restore(flags);
|
||||
}
|
||||
|
||||
|
||||
static irqreturn_t cvm_oct_ciu_timer_interrupt(int cpl, void *dev_id)
|
||||
{
|
||||
u64 last_latency;
|
||||
u64 last_int_cnt;
|
||||
|
||||
if (reset_stats) {
|
||||
init_latency_info(&li, 0);
|
||||
reset_stats = false;
|
||||
} else {
|
||||
last_int_cnt = read_c0_cvmcount();
|
||||
last_latency = last_int_cnt - (li.timer_start1 + li.cpu_interval);
|
||||
li.interrupt_cnt++;
|
||||
li.latency_sum += last_latency;
|
||||
if (last_latency > li.max_latency)
|
||||
li.max_latency = last_latency;
|
||||
if (last_latency < li.min_latency)
|
||||
li.min_latency = last_latency;
|
||||
}
|
||||
start_timer(TIMER_NUM, li.io_interval);
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static void disable_timer(int timer)
|
||||
{
|
||||
union cvmx_ciu_timx timx;
|
||||
|
||||
timx.s.one_shot = 0;
|
||||
timx.s.len = 0;
|
||||
cvmx_write_csr(CVMX_CIU_TIMX(timer), timx.u64);
|
||||
/* Read it back to force immediate write of timer register*/
|
||||
timx.u64 = cvmx_read_csr(CVMX_CIU_TIMX(timer));
|
||||
}
|
||||
|
||||
static __init int oct_ilm_module_init(void)
|
||||
{
|
||||
int rc;
|
||||
int irq = OCTEON_IRQ_TIMER0 + TIMER_NUM;
|
||||
|
||||
rc = init_debufs();
|
||||
if (rc) {
|
||||
WARN(1, "Could not create debugfs entries");
|
||||
return rc;
|
||||
}
|
||||
|
||||
rc = request_irq(irq, cvm_oct_ciu_timer_interrupt, IRQF_NO_THREAD,
|
||||
"oct_ilm", 0);
|
||||
if (rc) {
|
||||
WARN(1, "Could not acquire IRQ %d", irq);
|
||||
goto err_irq;
|
||||
}
|
||||
|
||||
init_latency_info(&li, 1);
|
||||
start_timer(TIMER_NUM, li.io_interval);
|
||||
|
||||
return 0;
|
||||
err_irq:
|
||||
debugfs_remove_recursive(dir);
|
||||
return rc;
|
||||
}
|
||||
|
||||
static __exit void oct_ilm_module_exit(void)
|
||||
{
|
||||
disable_timer(TIMER_NUM);
|
||||
if (dir)
|
||||
debugfs_remove_recursive(dir);
|
||||
free_irq(OCTEON_IRQ_TIMER0 + TIMER_NUM, 0);
|
||||
}
|
||||
|
||||
module_exit(oct_ilm_module_exit);
|
||||
module_init(oct_ilm_module_init);
|
||||
MODULE_AUTHOR("Venkat Subbiah, Cavium");
|
||||
MODULE_DESCRIPTION("Measures interrupt latency on Octeon chips.");
|
||||
MODULE_LICENSE("GPL");
|
|
@ -1542,7 +1542,7 @@ static bool octeon_irq_ciu2_is_edge(unsigned int line, unsigned int bit)
|
|||
|
||||
if (line == 3) /* MIO */
|
||||
switch (bit) {
|
||||
case 2: /* IPD_DRP */
|
||||
case 2: /* IPD_DRP */
|
||||
case 8 ... 11: /* Timers */
|
||||
case 48: /* PTP */
|
||||
edge = true;
|
||||
|
@ -1553,7 +1553,7 @@ static bool octeon_irq_ciu2_is_edge(unsigned int line, unsigned int bit)
|
|||
else if (line == 6) /* PKT */
|
||||
switch (bit) {
|
||||
case 52 ... 53: /* ILK_DRP */
|
||||
case 8 ... 12: /* GMX_DRP */
|
||||
case 8 ... 12: /* GMX_DRP */
|
||||
edge = true;
|
||||
break;
|
||||
default:
|
||||
|
|
|
@ -116,15 +116,15 @@
|
|||
|
||||
#ifdef CONFIG_CPU_LITTLE_ENDIAN
|
||||
#define LDFIRST LOADR
|
||||
#define LDREST LOADL
|
||||
#define LDREST LOADL
|
||||
#define STFIRST STORER
|
||||
#define STREST STOREL
|
||||
#define STREST STOREL
|
||||
#define SHIFT_DISCARD SLLV
|
||||
#else
|
||||
#define LDFIRST LOADL
|
||||
#define LDREST LOADR
|
||||
#define LDREST LOADR
|
||||
#define STFIRST STOREL
|
||||
#define STREST STORER
|
||||
#define STREST STORER
|
||||
#define SHIFT_DISCARD SRLV
|
||||
#endif
|
||||
|
||||
|
@ -316,9 +316,9 @@ EXC( STORE t0, -8(dst), s_exc_p1u)
|
|||
|
||||
src_unaligned:
|
||||
#define rem t8
|
||||
SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter
|
||||
SRL t0, len, LOG_NBYTES+2 # +2 for 4 units/iter
|
||||
beqz t0, cleanup_src_unaligned
|
||||
and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES
|
||||
and rem, len, (4*NBYTES-1) # rem = len % 4*NBYTES
|
||||
1:
|
||||
/*
|
||||
* Avoid consecutive LD*'s to the same register since some mips
|
||||
|
@ -326,13 +326,13 @@ src_unaligned:
|
|||
* It's OK to load FIRST(N+1) before REST(N) because the two addresses
|
||||
* are to the same unit (unless src is aligned, but it's not).
|
||||
*/
|
||||
EXC( LDFIRST t0, FIRST(0)(src), l_exc)
|
||||
EXC( LDFIRST t1, FIRST(1)(src), l_exc_copy)
|
||||
SUB len, len, 4*NBYTES
|
||||
EXC( LDFIRST t0, FIRST(0)(src), l_exc)
|
||||
EXC( LDFIRST t1, FIRST(1)(src), l_exc_copy)
|
||||
SUB len, len, 4*NBYTES
|
||||
EXC( LDREST t0, REST(0)(src), l_exc_copy)
|
||||
EXC( LDREST t1, REST(1)(src), l_exc_copy)
|
||||
EXC( LDFIRST t2, FIRST(2)(src), l_exc_copy)
|
||||
EXC( LDFIRST t3, FIRST(3)(src), l_exc_copy)
|
||||
EXC( LDFIRST t2, FIRST(2)(src), l_exc_copy)
|
||||
EXC( LDFIRST t3, FIRST(3)(src), l_exc_copy)
|
||||
EXC( LDREST t2, REST(2)(src), l_exc_copy)
|
||||
EXC( LDREST t3, REST(3)(src), l_exc_copy)
|
||||
ADD src, src, 4*NBYTES
|
||||
|
|
|
@ -410,7 +410,7 @@ int __init octeon_prune_device_tree(void)
|
|||
pip_path = fdt_getprop(initial_boot_params, aliases, "pip", NULL);
|
||||
if (pip_path) {
|
||||
int pip = fdt_path_offset(initial_boot_params, pip_path);
|
||||
if (pip >= 0)
|
||||
if (pip >= 0)
|
||||
for (i = 0; i <= 4; i++)
|
||||
octeon_fdt_pip_iface(pip, i, &mac_addr_base);
|
||||
}
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* OCTEON 3XXX, 5XXX, 63XX device tree skeleton.
|
||||
*
|
||||
* This device tree is pruned and patched by early boot code before
|
||||
* use. Because of this, it contains a super-set of the available
|
||||
* use. Because of this, it contains a super-set of the available
|
||||
* devices and properties.
|
||||
*/
|
||||
/ {
|
||||
|
@ -433,12 +433,12 @@
|
|||
cavium,t-we = <45>;
|
||||
cavium,t-rd-hld = <35>;
|
||||
cavium,t-wr-hld = <45>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <0>;
|
||||
cavium,t-page = <35>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <0>;
|
||||
cavium,t-page = <35>;
|
||||
cavium,t-rd-dly = <0>;
|
||||
|
||||
cavium,pages = <0>;
|
||||
cavium,pages = <0>;
|
||||
cavium,bus-width = <8>;
|
||||
};
|
||||
cavium,cs-config@4 {
|
||||
|
@ -450,12 +450,12 @@
|
|||
cavium,t-we = <320>;
|
||||
cavium,t-rd-hld = <320>;
|
||||
cavium,t-wr-hld = <320>;
|
||||
cavium,t-pause = <320>;
|
||||
cavium,t-wait = <320>;
|
||||
cavium,t-page = <320>;
|
||||
cavium,t-pause = <320>;
|
||||
cavium,t-wait = <320>;
|
||||
cavium,t-page = <320>;
|
||||
cavium,t-rd-dly = <0>;
|
||||
|
||||
cavium,pages = <0>;
|
||||
cavium,pages = <0>;
|
||||
cavium,bus-width = <8>;
|
||||
};
|
||||
cavium,cs-config@5 {
|
||||
|
@ -467,12 +467,12 @@
|
|||
cavium,t-we = <150>;
|
||||
cavium,t-rd-hld = <100>;
|
||||
cavium,t-wr-hld = <30>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <30>;
|
||||
cavium,t-page = <320>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <30>;
|
||||
cavium,t-page = <320>;
|
||||
cavium,t-rd-dly = <0>;
|
||||
|
||||
cavium,pages = <0>;
|
||||
cavium,pages = <0>;
|
||||
cavium,bus-width = <16>;
|
||||
};
|
||||
cavium,cs-config@6 {
|
||||
|
@ -484,12 +484,12 @@
|
|||
cavium,t-we = <150>;
|
||||
cavium,t-rd-hld = <100>;
|
||||
cavium,t-wr-hld = <70>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <0>;
|
||||
cavium,t-page = <320>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <0>;
|
||||
cavium,t-page = <320>;
|
||||
cavium,t-rd-dly = <0>;
|
||||
|
||||
cavium,pages = <0>;
|
||||
cavium,pages = <0>;
|
||||
cavium,wait-mode;
|
||||
cavium,bus-width = <16>;
|
||||
};
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
* OCTEON 68XX device tree skeleton.
|
||||
*
|
||||
* This device tree is pruned and patched by early boot code before
|
||||
* use. Because of this, it contains a super-set of the available
|
||||
* use. Because of this, it contains a super-set of the available
|
||||
* devices and properties.
|
||||
*/
|
||||
/ {
|
||||
|
@ -469,12 +469,12 @@
|
|||
cavium,t-we = <35>;
|
||||
cavium,t-rd-hld = <25>;
|
||||
cavium,t-wr-hld = <35>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <300>;
|
||||
cavium,t-page = <25>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <300>;
|
||||
cavium,t-page = <25>;
|
||||
cavium,t-rd-dly = <0>;
|
||||
|
||||
cavium,pages = <0>;
|
||||
cavium,pages = <0>;
|
||||
cavium,bus-width = <8>;
|
||||
};
|
||||
cavium,cs-config@4 {
|
||||
|
@ -486,12 +486,12 @@
|
|||
cavium,t-we = <320>;
|
||||
cavium,t-rd-hld = <320>;
|
||||
cavium,t-wr-hld = <320>;
|
||||
cavium,t-pause = <320>;
|
||||
cavium,t-wait = <320>;
|
||||
cavium,t-page = <320>;
|
||||
cavium,t-pause = <320>;
|
||||
cavium,t-wait = <320>;
|
||||
cavium,t-page = <320>;
|
||||
cavium,t-rd-dly = <0>;
|
||||
|
||||
cavium,pages = <0>;
|
||||
cavium,pages = <0>;
|
||||
cavium,bus-width = <8>;
|
||||
};
|
||||
cavium,cs-config@5 {
|
||||
|
@ -503,12 +503,12 @@
|
|||
cavium,t-we = <150>;
|
||||
cavium,t-rd-hld = <100>;
|
||||
cavium,t-wr-hld = <300>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <300>;
|
||||
cavium,t-page = <310>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <300>;
|
||||
cavium,t-page = <310>;
|
||||
cavium,t-rd-dly = <0>;
|
||||
|
||||
cavium,pages = <0>;
|
||||
cavium,pages = <0>;
|
||||
cavium,bus-width = <16>;
|
||||
};
|
||||
cavium,cs-config@6 {
|
||||
|
@ -520,12 +520,12 @@
|
|||
cavium,t-we = <150>;
|
||||
cavium,t-rd-hld = <100>;
|
||||
cavium,t-wr-hld = <30>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <30>;
|
||||
cavium,t-page = <310>;
|
||||
cavium,t-pause = <0>;
|
||||
cavium,t-wait = <30>;
|
||||
cavium,t-page = <310>;
|
||||
cavium,t-rd-dly = <0>;
|
||||
|
||||
cavium,pages = <0>;
|
||||
cavium,pages = <0>;
|
||||
cavium,wait-mode;
|
||||
cavium,bus-width = <16>;
|
||||
};
|
||||
|
|
|
@ -31,7 +31,7 @@ struct boot_init_vector {
|
|||
uint32_t k0_val;
|
||||
/* Address of boot info block structure */
|
||||
uint64_t boot_info_addr;
|
||||
uint32_t flags; /* flags */
|
||||
uint32_t flags; /* flags */
|
||||
uint32_t pad;
|
||||
};
|
||||
|
||||
|
@ -53,20 +53,20 @@ struct linux_app_boot_info {
|
|||
|
||||
/* If not to copy a lot of bootloader's structures
|
||||
here is only offset of requested member */
|
||||
#define AVAIL_COREMASK_OFFSET_IN_LINUX_APP_BOOT_BLOCK 0x765c
|
||||
#define AVAIL_COREMASK_OFFSET_IN_LINUX_APP_BOOT_BLOCK 0x765c
|
||||
|
||||
/* hardcoded in bootloader */
|
||||
#define LABI_ADDR_IN_BOOTLOADER 0x700
|
||||
#define LABI_ADDR_IN_BOOTLOADER 0x700
|
||||
|
||||
#define LINUX_APP_BOOT_BLOCK_NAME "linux-app-boot"
|
||||
|
||||
#define LABI_SIGNATURE 0xAABBCC01
|
||||
|
||||
/* from uboot-headers/octeon_mem_map.h */
|
||||
#define EXCEPTION_BASE_INCR (4 * 1024)
|
||||
#define EXCEPTION_BASE_INCR (4 * 1024)
|
||||
/* Increment size for exception base addresses (4k minimum) */
|
||||
#define EXCEPTION_BASE_BASE 0
|
||||
#define BOOTLOADER_PRIV_DATA_BASE (EXCEPTION_BASE_BASE + 0x800)
|
||||
#define BOOTLOADER_BOOT_VECTOR (BOOTLOADER_PRIV_DATA_BASE)
|
||||
#define EXCEPTION_BASE_BASE 0
|
||||
#define BOOTLOADER_PRIV_DATA_BASE (EXCEPTION_BASE_BASE + 0x800)
|
||||
#define BOOTLOADER_BOOT_VECTOR (BOOTLOADER_PRIV_DATA_BASE)
|
||||
|
||||
#endif /* __OCTEON_BOOT_H__ */
|
||||
|
|
|
@ -319,7 +319,7 @@ EXPORT_SYMBOL(octeon_get_io_clock_rate);
|
|||
* exists on most Cavium evaluation boards. If it doesn't exist, then
|
||||
* this function doesn't do anything.
|
||||
*
|
||||
* @s: String to write
|
||||
* @s: String to write
|
||||
*/
|
||||
void octeon_write_lcd(const char *s)
|
||||
{
|
||||
|
@ -341,7 +341,7 @@ void octeon_write_lcd(const char *s)
|
|||
/**
|
||||
* Return the console uart passed by the bootloader
|
||||
*
|
||||
* Returns uart (0 or 1)
|
||||
* Returns uart (0 or 1)
|
||||
*/
|
||||
int octeon_get_boot_uart(void)
|
||||
{
|
||||
|
@ -805,7 +805,7 @@ void __init prom_init(void)
|
|||
/*
|
||||
* To do: switch parsing to new style, something like:
|
||||
* parse_crashkernel(arg, sysinfo->system_dram_size,
|
||||
* &crashk_size, &crashk_base);
|
||||
* &crashk_size, &crashk_base);
|
||||
*/
|
||||
#endif
|
||||
} else if (strlen(arcs_cmdline) + strlen(arg) + 1 <
|
||||
|
@ -1013,7 +1013,7 @@ void __init plat_mem_setup(void)
|
|||
}
|
||||
|
||||
/*
|
||||
* Emit one character to the boot UART. Exported for use by the
|
||||
* Emit one character to the boot UART. Exported for use by the
|
||||
* watchdog timer.
|
||||
*/
|
||||
int prom_putchar(char c)
|
||||
|
|
|
@ -55,7 +55,7 @@ static irqreturn_t mailbox_interrupt(int irq, void *dev_id)
|
|||
|
||||
/**
|
||||
* Cause the function described by call_data to be executed on the passed
|
||||
* cpu. When the function has finished, increment the finished field of
|
||||
* cpu. When the function has finished, increment the finished field of
|
||||
* call_data.
|
||||
*/
|
||||
void octeon_send_ipi_single(int cpu, unsigned int action)
|
||||
|
@ -126,8 +126,8 @@ static void octeon_smp_setup(void)
|
|||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
/*
|
||||
* The possible CPUs are all those present on the chip. We
|
||||
* will assign CPU numbers for possible cores as well. Cores
|
||||
* The possible CPUs are all those present on the chip. We
|
||||
* will assign CPU numbers for possible cores as well. Cores
|
||||
* are always consecutively numberd from 0.
|
||||
*/
|
||||
for (id = 0; id < num_cores && id < NR_CPUS; id++) {
|
||||
|
@ -332,7 +332,7 @@ extern void kernel_entry(unsigned long arg1, ...);
|
|||
|
||||
static void start_after_reset(void)
|
||||
{
|
||||
kernel_entry(0, 0, 0); /* set a2 = 0 for secondary core */
|
||||
kernel_entry(0, 0, 0); /* set a2 = 0 for secondary core */
|
||||
}
|
||||
|
||||
static int octeon_update_boot_vector(unsigned int cpu)
|
||||
|
@ -401,7 +401,7 @@ static int __cpuinit register_cavium_notifier(void)
|
|||
}
|
||||
late_initcall(register_cavium_notifier);
|
||||
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
struct plat_smp_ops octeon_smp_ops = {
|
||||
.send_ipi_single = octeon_send_ipi_single,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* Registration of Cobalt LED platform device.
|
||||
*
|
||||
* Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org>
|
||||
* Copyright (C) 2007 Yoichi Yuasa <yuasa@linux-mips.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
|
|
@ -25,7 +25,7 @@
|
|||
static struct mtd_partition cobalt_mtd_partitions[] = {
|
||||
{
|
||||
.name = "firmware",
|
||||
.offset = 0x0,
|
||||
.offset = 0x0,
|
||||
.size = 0x80000,
|
||||
},
|
||||
};
|
||||
|
|
|
@ -46,7 +46,7 @@ static __init int cobalt_rtc_add(void)
|
|||
return -ENOMEM;
|
||||
|
||||
retval = platform_device_add_resources(pdev, cobalt_rtc_resource,
|
||||
ARRAY_SIZE(cobalt_rtc_resource));
|
||||
ARRAY_SIZE(cobalt_rtc_resource));
|
||||
if (retval)
|
||||
goto err_free_device;
|
||||
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
CONFIG_ATH79=y
|
||||
CONFIG_ATH79_MACH_AP121=y
|
||||
CONFIG_ATH79_MACH_AP136=y
|
||||
CONFIG_ATH79_MACH_AP81=y
|
||||
CONFIG_ATH79_MACH_DB120=y
|
||||
CONFIG_ATH79_MACH_PB44=y
|
||||
|
|
|
@ -1,98 +0,0 @@
|
|||
CONFIG_PNX8550_JBS=y
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_EXPERT=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM_MIGRATE=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_TCP_MD5SIG=y
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_SGI_IOC4=m
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=m
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_OFFBOARD=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_HPT366=y
|
||||
CONFIG_BLK_DEV_IT8213=m
|
||||
CONFIG_BLK_DEV_TC86C001=m
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_TGT=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SCAN_ASYNC=y
|
||||
CONFIG_SCSI_FC_ATTRS=y
|
||||
CONFIG_ISCSI_TCP=m
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_NET_PCI=y
|
||||
CONFIG_8139TOO=y
|
||||
# CONFIG_8139TOO_PIO is not set
|
||||
CONFIG_8139TOO_TUNE_TWISTER=y
|
||||
CONFIG_8139TOO_8129=y
|
||||
CONFIG_CHELSIO_T3=m
|
||||
CONFIG_NETXEN_NIC=m
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO_I8042 is not set
|
||||
# CONFIG_SERIO_SERPORT is not set
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
CONFIG_SERIAL_PNX8XXX=y
|
||||
CONFIG_SERIAL_PNX8XXX_CONSOLE=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
# CONFIG_HID is not set
|
||||
# CONFIG_USB_HID is not set
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_MON=y
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_STORAGE_DATAFAB=y
|
||||
CONFIG_USB_STORAGE_FREECOM=y
|
||||
CONFIG_USB_STORAGE_ISD200=y
|
||||
CONFIG_USB_STORAGE_USBAT=y
|
||||
CONFIG_USB_STORAGE_SDDR09=y
|
||||
CONFIG_USB_STORAGE_SDDR55=y
|
||||
CONFIG_USB_STORAGE_JUMPSHOT=y
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_DLM=m
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DEBUG_SLAB=y
|
||||
CONFIG_DEBUG_MUTEXES=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyS1,38400n8 root=/dev/nfs ip=bootp"
|
||||
CONFIG_CRYPTO_CBC=m
|
||||
CONFIG_CRYPTO_ECB=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRC_CCITT=m
|
|
@ -1,92 +0,0 @@
|
|||
CONFIG_PNX8550_STB810=y
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||
CONFIG_EXPERT=y
|
||||
# CONFIG_SYSCTL_SYSCALL is not set
|
||||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_SLAB=y
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_PCI=y
|
||||
CONFIG_PM=y
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_XFRM_MIGRATE=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_BLK_DEV_LOOP=y
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_SIZE=8192
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDECD=m
|
||||
CONFIG_IDE_GENERIC=y
|
||||
CONFIG_BLK_DEV_OFFBOARD=y
|
||||
CONFIG_BLK_DEV_GENERIC=y
|
||||
CONFIG_BLK_DEV_HPT366=y
|
||||
CONFIG_BLK_DEV_IT8213=m
|
||||
CONFIG_BLK_DEV_TC86C001=m
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_SCSI_TGT=m
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_SCSI_CONSTANTS=y
|
||||
CONFIG_SCSI_SCAN_ASYNC=y
|
||||
CONFIG_ISCSI_TCP=m
|
||||
CONFIG_NETDEVICES=y
|
||||
CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
CONFIG_NET_PCI=y
|
||||
CONFIG_NATSEMI=y
|
||||
CONFIG_CHELSIO_T3=m
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
# CONFIG_SERIO_I8042 is not set
|
||||
# CONFIG_SERIO_SERPORT is not set
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
CONFIG_HW_RANDOM=y
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
# CONFIG_HID is not set
|
||||
# CONFIG_USB_HID is not set
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_MON=y
|
||||
CONFIG_USB_OHCI_HCD=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_STORAGE_DATAFAB=y
|
||||
CONFIG_USB_STORAGE_FREECOM=y
|
||||
CONFIG_USB_STORAGE_ISD200=y
|
||||
CONFIG_USB_STORAGE_USBAT=y
|
||||
CONFIG_USB_STORAGE_SDDR09=y
|
||||
CONFIG_USB_STORAGE_SDDR55=y
|
||||
CONFIG_USB_STORAGE_JUMPSHOT=y
|
||||
CONFIG_EXT2_FS=y
|
||||
# CONFIG_DNOTIFY is not set
|
||||
CONFIG_MSDOS_FS=y
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_NFSD=m
|
||||
CONFIG_DLM=m
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_HEADERS_CHECK=y
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
CONFIG_DEBUG_SLAB=y
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CMDLINE="console=ttyS1,38400n8 root=/dev/nfs ip=bootp"
|
||||
CONFIG_CRYPTO_CBC=m
|
||||
CONFIG_CRYPTO_ECB=m
|
||||
CONFIG_CRYPTO_LRW=m
|
||||
CONFIG_CRYPTO_PCBC=m
|
||||
CONFIG_CRYPTO_XCBC=m
|
||||
CONFIG_CRYPTO_CAMELLIA=m
|
||||
CONFIG_CRYPTO_FCRYPT=m
|
||||
CONFIG_CRC_CCITT=m
|
|
@ -0,0 +1,167 @@
|
|||
CONFIG_RALINK=y
|
||||
CONFIG_DTB_RT305X_EVAL=y
|
||||
CONFIG_CPU_MIPS32_R2=y
|
||||
# CONFIG_COMPACTION is not set
|
||||
# CONFIG_CROSS_MEMORY_ATTACH is not set
|
||||
CONFIG_HZ_100=y
|
||||
# CONFIG_SECCOMP is not set
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
# CONFIG_LOCALVERSION_AUTO is not set
|
||||
CONFIG_SYSVIPC=y
|
||||
CONFIG_HIGH_RES_TIMERS=y
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_INITRAMFS_ROOT_UID=1000
|
||||
CONFIG_INITRAMFS_ROOT_GID=1000
|
||||
# CONFIG_RD_GZIP is not set
|
||||
CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||
CONFIG_KALLSYMS_ALL=y
|
||||
# CONFIG_AIO is not set
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||
# CONFIG_SLUB_DEBUG is not set
|
||||
# CONFIG_COMPAT_BRK is not set
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
CONFIG_PARTITION_ADVANCED=y
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
# CONFIG_COREDUMP is not set
|
||||
# CONFIG_SUSPEND is not set
|
||||
CONFIG_NET=y
|
||||
CONFIG_PACKET=y
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_INET=y
|
||||
CONFIG_IP_MULTICAST=y
|
||||
CONFIG_IP_ADVANCED_ROUTER=y
|
||||
CONFIG_IP_MULTIPLE_TABLES=y
|
||||
CONFIG_IP_ROUTE_MULTIPATH=y
|
||||
CONFIG_IP_ROUTE_VERBOSE=y
|
||||
CONFIG_IP_MROUTE=y
|
||||
CONFIG_IP_MROUTE_MULTIPLE_TABLES=y
|
||||
CONFIG_ARPD=y
|
||||
CONFIG_SYN_COOKIES=y
|
||||
# CONFIG_INET_XFRM_MODE_TRANSPORT is not set
|
||||
# CONFIG_INET_XFRM_MODE_TUNNEL is not set
|
||||
# CONFIG_INET_XFRM_MODE_BEET is not set
|
||||
# CONFIG_INET_LRO is not set
|
||||
# CONFIG_INET_DIAG is not set
|
||||
CONFIG_TCP_CONG_ADVANCED=y
|
||||
# CONFIG_TCP_CONG_BIC is not set
|
||||
# CONFIG_TCP_CONG_WESTWOOD is not set
|
||||
# CONFIG_TCP_CONG_HTCP is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
CONFIG_NETFILTER=y
|
||||
# CONFIG_BRIDGE_NETFILTER is not set
|
||||
CONFIG_NF_CONNTRACK=m
|
||||
CONFIG_NF_CONNTRACK_FTP=m
|
||||
CONFIG_NF_CONNTRACK_IRC=m
|
||||
CONFIG_NETFILTER_XT_TARGET_CT=m
|
||||
CONFIG_NETFILTER_XT_TARGET_LOG=m
|
||||
CONFIG_NETFILTER_XT_TARGET_TCPMSS=m
|
||||
CONFIG_NETFILTER_XT_MATCH_COMMENT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_CONNTRACK=m
|
||||
CONFIG_NETFILTER_XT_MATCH_LIMIT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_MAC=m
|
||||
CONFIG_NETFILTER_XT_MATCH_MULTIPORT=m
|
||||
CONFIG_NETFILTER_XT_MATCH_STATE=m
|
||||
CONFIG_NF_CONNTRACK_IPV4=m
|
||||
# CONFIG_NF_CONNTRACK_PROC_COMPAT is not set
|
||||
CONFIG_IP_NF_IPTABLES=m
|
||||
CONFIG_IP_NF_FILTER=m
|
||||
CONFIG_IP_NF_TARGET_REJECT=m
|
||||
CONFIG_IP_NF_MANGLE=m
|
||||
CONFIG_IP_NF_RAW=m
|
||||
CONFIG_BRIDGE=y
|
||||
# CONFIG_BRIDGE_IGMP_SNOOPING is not set
|
||||
CONFIG_VLAN_8021Q=y
|
||||
CONFIG_NET_SCHED=y
|
||||
CONFIG_HAMRADIO=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
# CONFIG_FIRMWARE_IN_KERNEL is not set
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
CONFIG_MTD_CHAR=y
|
||||
CONFIG_MTD_BLOCK=y
|
||||
CONFIG_MTD_CFI=y
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_COMPLEX_MAPPINGS=y
|
||||
CONFIG_MTD_PHYSMAP=y
|
||||
CONFIG_MTD_PHYSMAP_OF=y
|
||||
CONFIG_MTD_M25P80=y
|
||||
CONFIG_EEPROM_93CX6=m
|
||||
CONFIG_SCSI=y
|
||||
CONFIG_BLK_DEV_SD=y
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NET_VENDOR_WIZNET is not set
|
||||
CONFIG_PHYLIB=y
|
||||
CONFIG_PPP=m
|
||||
CONFIG_PPP_FILTER=y
|
||||
CONFIG_PPP_MULTILINK=y
|
||||
CONFIG_PPPOE=m
|
||||
CONFIG_PPP_ASYNC=m
|
||||
CONFIG_ISDN=y
|
||||
CONFIG_INPUT=m
|
||||
CONFIG_INPUT_POLLDEV=m
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
# CONFIG_KEYBOARD_ATKBD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_MISC=y
|
||||
# CONFIG_SERIO is not set
|
||||
# CONFIG_VT is not set
|
||||
# CONFIG_LEGACY_PTYS is not set
|
||||
# CONFIG_DEVKMEM is not set
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_RUNTIME_UARTS=2
|
||||
CONFIG_SERIAL_OF_PLATFORM=y
|
||||
CONFIG_SPI=y
|
||||
# CONFIG_HWMON is not set
|
||||
CONFIG_WATCHDOG=y
|
||||
# CONFIG_HID is not set
|
||||
# CONFIG_USB_HID is not set
|
||||
CONFIG_USB=y
|
||||
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
|
||||
CONFIG_USB_STORAGE=y
|
||||
CONFIG_USB_STORAGE_DEBUG=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
CONFIG_LEDS_TRIGGERS=y
|
||||
CONFIG_LEDS_TRIGGER_TIMER=y
|
||||
CONFIG_LEDS_TRIGGER_DEFAULT_ON=y
|
||||
CONFIG_STAGING=y
|
||||
# CONFIG_IOMMU_SUPPORT is not set
|
||||
# CONFIG_DNOTIFY is not set
|
||||
# CONFIG_PROC_PAGE_MONITOR is not set
|
||||
CONFIG_TMPFS=y
|
||||
CONFIG_TMPFS_XATTR=y
|
||||
CONFIG_JFFS2_FS=y
|
||||
CONFIG_JFFS2_SUMMARY=y
|
||||
CONFIG_JFFS2_FS_XATTR=y
|
||||
# CONFIG_JFFS2_FS_POSIX_ACL is not set
|
||||
# CONFIG_JFFS2_FS_SECURITY is not set
|
||||
CONFIG_JFFS2_COMPRESSION_OPTIONS=y
|
||||
# CONFIG_JFFS2_ZLIB is not set
|
||||
CONFIG_SQUASHFS=y
|
||||
# CONFIG_SQUASHFS_ZLIB is not set
|
||||
CONFIG_SQUASHFS_XZ=y
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_ENABLE_MUST_CHECK is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_STRIP_ASM_SYMS=y
|
||||
CONFIG_DEBUG_FS=y
|
||||
# CONFIG_SCHED_DEBUG is not set
|
||||
# CONFIG_FTRACE is not set
|
||||
CONFIG_CMDLINE_BOOL=y
|
||||
CONFIG_CRYPTO_MANAGER=m
|
||||
CONFIG_CRYPTO_ARC4=m
|
||||
# CONFIG_CRYPTO_ANSI_CPRNG is not set
|
||||
CONFIG_CRC_ITU_T=m
|
||||
CONFIG_CRC32_SARWATE=y
|
||||
# CONFIG_XZ_DEC_X86 is not set
|
||||
# CONFIG_XZ_DEC_POWERPC is not set
|
||||
# CONFIG_XZ_DEC_IA64 is not set
|
||||
# CONFIG_XZ_DEC_ARM is not set
|
||||
# CONFIG_XZ_DEC_ARMTHUMB is not set
|
||||
# CONFIG_XZ_DEC_SPARC is not set
|
||||
CONFIG_AVERAGE=y
|
|
@ -55,70 +55,70 @@
|
|||
* DS2100/3100's, aka kn01, aka Pmax:
|
||||
*
|
||||
* MIPS IRQ Source
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 SCSI
|
||||
* 3 Lance Ethernet
|
||||
* 4 DZ11 serial
|
||||
* 5 RTC
|
||||
* 6 Memory Controller & Video
|
||||
* 7 FPU
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 SCSI
|
||||
* 3 Lance Ethernet
|
||||
* 4 DZ11 serial
|
||||
* 5 RTC
|
||||
* 6 Memory Controller & Video
|
||||
* 7 FPU
|
||||
*
|
||||
* DS5000/200, aka kn02, aka 3max:
|
||||
*
|
||||
* MIPS IRQ Source
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 TurboChannel
|
||||
* 3 RTC
|
||||
* 4 Reserved
|
||||
* 5 Memory Controller
|
||||
* 6 Reserved
|
||||
* 7 FPU
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 TurboChannel
|
||||
* 3 RTC
|
||||
* 4 Reserved
|
||||
* 5 Memory Controller
|
||||
* 6 Reserved
|
||||
* 7 FPU
|
||||
*
|
||||
* DS5000/1xx's, aka kn02ba, aka 3min:
|
||||
*
|
||||
* MIPS IRQ Source
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 TurboChannel Slot 0
|
||||
* 3 TurboChannel Slot 1
|
||||
* 4 TurboChannel Slot 2
|
||||
* 5 TurboChannel Slot 3 (ASIC)
|
||||
* 6 Halt button
|
||||
* 7 FPU/R4k timer
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 TurboChannel Slot 0
|
||||
* 3 TurboChannel Slot 1
|
||||
* 4 TurboChannel Slot 2
|
||||
* 5 TurboChannel Slot 3 (ASIC)
|
||||
* 6 Halt button
|
||||
* 7 FPU/R4k timer
|
||||
*
|
||||
* DS5000/2x's, aka kn02ca, aka maxine:
|
||||
*
|
||||
* MIPS IRQ Source
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 Periodic Interrupt (100usec)
|
||||
* 3 RTC
|
||||
* 4 I/O write timeout
|
||||
* 5 TurboChannel (ASIC)
|
||||
* 6 Halt Keycode from Access.Bus keyboard (CTRL-ALT-ENTER)
|
||||
* 7 FPU/R4k timer
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 Periodic Interrupt (100usec)
|
||||
* 3 RTC
|
||||
* 4 I/O write timeout
|
||||
* 5 TurboChannel (ASIC)
|
||||
* 6 Halt Keycode from Access.Bus keyboard (CTRL-ALT-ENTER)
|
||||
* 7 FPU/R4k timer
|
||||
*
|
||||
* DS5000/2xx's, aka kn03, aka 3maxplus:
|
||||
*
|
||||
* MIPS IRQ Source
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 System Board (ASIC)
|
||||
* 3 RTC
|
||||
* 4 Reserved
|
||||
* 5 Memory
|
||||
* 6 Halt Button
|
||||
* 7 FPU/R4k timer
|
||||
* -------- ------
|
||||
* 0 Software (ignored)
|
||||
* 1 Software (ignored)
|
||||
* 2 System Board (ASIC)
|
||||
* 3 RTC
|
||||
* 4 Reserved
|
||||
* 5 Memory
|
||||
* 6 Halt Button
|
||||
* 7 FPU/R4k timer
|
||||
*
|
||||
* We handle the IRQ according to _our_ priority (see setup.c),
|
||||
* then we just return. If multiple IRQs are pending then we will
|
||||
* then we just return. If multiple IRQs are pending then we will
|
||||
* just take another exception, big deal.
|
||||
*/
|
||||
.align 5
|
||||
|
@ -146,7 +146,7 @@
|
|||
/*
|
||||
* Find irq with highest priority
|
||||
*/
|
||||
PTR_LA t1,cpu_mask_nr_tbl
|
||||
PTR_LA t1,cpu_mask_nr_tbl
|
||||
1: lw t2,(t1)
|
||||
nop
|
||||
and t2,t0
|
||||
|
@ -195,7 +195,7 @@
|
|||
/*
|
||||
* Find irq with highest priority
|
||||
*/
|
||||
PTR_LA t1,asic_mask_nr_tbl
|
||||
PTR_LA t1,asic_mask_nr_tbl
|
||||
2: lw t2,(t1)
|
||||
nop
|
||||
and t2,t0
|
||||
|
@ -221,7 +221,7 @@
|
|||
FEXPORT(cpu_all_int) # HALT, timers, software junk
|
||||
li a0,DEC_CPU_IRQ_BASE
|
||||
srl t0,CAUSEB_IP
|
||||
li t1,CAUSEF_IP>>CAUSEB_IP # mask
|
||||
li t1,CAUSEF_IP>>CAUSEB_IP # mask
|
||||
b 1f
|
||||
li t2,4 # nr of bits / 2
|
||||
|
||||
|
|
|
@ -128,8 +128,8 @@ void __init dec_kn02xa_be_init(void)
|
|||
{
|
||||
volatile u32 *mbcs = (void *)CKSEG1ADDR(KN4K_SLOT_BASE + KN4K_MB_CSR);
|
||||
|
||||
/* For KN04 we need to make sure EE (?) is enabled in the MB. */
|
||||
if (current_cpu_type() == CPU_R4000SC)
|
||||
/* For KN04 we need to make sure EE (?) is enabled in the MB. */
|
||||
if (current_cpu_type() == CPU_R4000SC)
|
||||
*mbcs |= KN4K_MB_CSR_EE;
|
||||
fast_iob();
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
/* Maximum number of arguments supported. Must be even! */
|
||||
#define O32_ARGC 32
|
||||
/* Number of static registers we save. */
|
||||
/* Number of static registers we save. */
|
||||
#define O32_STATC 11
|
||||
/* Frame size for both of the above. */
|
||||
#define O32_FRAMESZ (4 * O32_ARGC + SZREG * O32_STATC)
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
#ifndef DECTYPES
|
||||
#define DECTYPES
|
||||
#define DECTYPES
|
||||
|
||||
#define DS2100_3100 1 /* DS2100/3100 Pmax */
|
||||
#define DS5000_200 2 /* DS5000/200 3max */
|
||||
|
|
|
@ -103,7 +103,7 @@ void __init prom_init(void)
|
|||
if (prom_is_rex(magic))
|
||||
rex_clear_cache();
|
||||
|
||||
/* Register the early console. */
|
||||
/* Register the early console. */
|
||||
register_prom_console();
|
||||
|
||||
/* Were we compiled with the right CPU option? */
|
||||
|
|
|
@ -22,7 +22,7 @@ volatile unsigned long mem_err; /* So we know an error occurred */
|
|||
|
||||
/*
|
||||
* Probe memory in 4MB chunks, waiting for an error to tell us we've fallen
|
||||
* off the end of real memory. Only suitable for the 2100/3100's (PMAX).
|
||||
* off the end of real memory. Only suitable for the 2100/3100's (PMAX).
|
||||
*/
|
||||
|
||||
#define CHUNK_SIZE 0x400000
|
||||
|
|
|
@ -65,7 +65,7 @@ EXPORT_SYMBOL(ioasic_base);
|
|||
/*
|
||||
* IRQ routing and priority tables. Priorites are set as follows:
|
||||
*
|
||||
* KN01 KN230 KN02 KN02-BA KN02-CA KN03
|
||||
* KN01 KN230 KN02 KN02-BA KN02-CA KN03
|
||||
*
|
||||
* MEMORY CPU CPU CPU ASIC CPU CPU
|
||||
* RTC CPU CPU CPU ASIC CPU CPU
|
||||
|
@ -413,7 +413,7 @@ static void __init dec_init_kn02(void)
|
|||
|
||||
/*
|
||||
* Machine-specific initialisation for KN02-BA, aka DS5000/1xx
|
||||
* (xx = 20, 25, 33), aka 3min. Also applies to KN04(-BA), aka
|
||||
* (xx = 20, 25, 33), aka 3min. Also applies to KN04(-BA), aka
|
||||
* DS5000/150, aka 4min.
|
||||
*/
|
||||
static int kn02ba_interrupt[DEC_NR_INTS] __initdata = {
|
||||
|
|
|
@ -2,9 +2,9 @@
|
|||
* Setup the right wbflush routine for the different DECstations.
|
||||
*
|
||||
* Created with information from:
|
||||
* DECstation 3100 Desktop Workstation Functional Specification
|
||||
* DECstation 5000/200 KN02 System Module Functional Specification
|
||||
* mipsel-linux-objdump --disassemble vmunix | grep "wbflush" :-)
|
||||
* DECstation 3100 Desktop Workstation Functional Specification
|
||||
* DECstation 5000/200 KN02 System Module Functional Specification
|
||||
* mipsel-linux-objdump --disassemble vmunix | grep "wbflush" :-)
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
|
|
|
@ -292,7 +292,7 @@ void __init arch_init_irq(void)
|
|||
|
||||
asmlinkage void plat_irq_dispatch(void)
|
||||
{
|
||||
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
|
||||
unsigned int pending = read_c0_status() & read_c0_cause() & ST0_IM;
|
||||
|
||||
if (pending & STATUSF_IP7)
|
||||
do_IRQ(MIPS_CPU_IRQ_BASE + 7);
|
||||
|
|
|
@ -190,7 +190,7 @@ static struct platform_device markeins_flash_device = {
|
|||
.name = "physmap-flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &markeins_flash_data,
|
||||
.platform_data = &markeins_flash_data,
|
||||
},
|
||||
.num_resources = 1,
|
||||
.resource = &markeins_flash_resource,
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <asm/emma/emma2rh.h>
|
||||
|
||||
#define USE_CPU_COUNTER_TIMER /* whether we use cpu counter */
|
||||
#define USE_CPU_COUNTER_TIMER /* whether we use cpu counter */
|
||||
|
||||
extern void markeins_led(const char *);
|
||||
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче