ARM: iop32x: merge everything into mach-iop32x/
authorArnd Bergmann <arnd@arndb.de>
Fri, 9 Aug 2019 16:33:21 +0000 (18:33 +0200)
committerArnd Bergmann <arnd@arndb.de>
Wed, 14 Aug 2019 13:36:22 +0000 (15:36 +0200)
Various bits of iop32x are now in their traditional locations in plat-iop,
mach-iop/include/mach/ and in include/asm/mach/hardware. As nothing
outside of the iop32x mach code references these any more, this can all
be moved into one place now.

The only remaining things in the include/mach/ directory are now the
NR_IRQS definition, the entry-macros.S file and the the decompressor
uart access. After the irqchip code has been converted to SPARSE_IRQ
and GENERIC_IRQ_MULTI_HANDLER, it can be moved to ARCH_MULTIPLATFORM.

Link: https://lore.kernel.org/r/20190809163334.489360-7-arnd@arndb.de
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
42 files changed:
arch/arm/Makefile
arch/arm/include/asm/hardware/iop3xx.h [deleted file]
arch/arm/mach-iop32x/Makefile
arch/arm/mach-iop32x/adma.c [new file with mode: 0644]
arch/arm/mach-iop32x/cp6.c [new file with mode: 0644]
arch/arm/mach-iop32x/em7210.c
arch/arm/mach-iop32x/glantank.c
arch/arm/mach-iop32x/glantank.h [new file with mode: 0644]
arch/arm/mach-iop32x/hardware.h [new file with mode: 0644]
arch/arm/mach-iop32x/i2c.c [new file with mode: 0644]
arch/arm/mach-iop32x/include/mach/entry-macro.S
arch/arm/mach-iop32x/include/mach/glantank.h [deleted file]
arch/arm/mach-iop32x/include/mach/hardware.h [deleted file]
arch/arm/mach-iop32x/include/mach/iop32x.h [deleted file]
arch/arm/mach-iop32x/include/mach/iq31244.h [deleted file]
arch/arm/mach-iop32x/include/mach/iq80321.h [deleted file]
arch/arm/mach-iop32x/include/mach/irqs.h
arch/arm/mach-iop32x/include/mach/n2100.h [deleted file]
arch/arm/mach-iop32x/include/mach/time.h [deleted file]
arch/arm/mach-iop32x/iop3xx.h [new file with mode: 0644]
arch/arm/mach-iop32x/iq31244.c
arch/arm/mach-iop32x/iq31244.h [new file with mode: 0644]
arch/arm/mach-iop32x/iq80321.c
arch/arm/mach-iop32x/iq80321.h [new file with mode: 0644]
arch/arm/mach-iop32x/irq.c
arch/arm/mach-iop32x/irqs.h [new file with mode: 0644]
arch/arm/mach-iop32x/n2100.c
arch/arm/mach-iop32x/n2100.h [new file with mode: 0644]
arch/arm/mach-iop32x/pci.c [new file with mode: 0644]
arch/arm/mach-iop32x/pmu.c [new file with mode: 0644]
arch/arm/mach-iop32x/restart.c [new file with mode: 0644]
arch/arm/mach-iop32x/setup.c [new file with mode: 0644]
arch/arm/mach-iop32x/time.c [new file with mode: 0644]
arch/arm/plat-iop/Makefile [deleted file]
arch/arm/plat-iop/adma.c [deleted file]
arch/arm/plat-iop/cp6.c [deleted file]
arch/arm/plat-iop/i2c.c [deleted file]
arch/arm/plat-iop/pci.c [deleted file]
arch/arm/plat-iop/pmu.c [deleted file]
arch/arm/plat-iop/restart.c [deleted file]
arch/arm/plat-iop/setup.c [deleted file]
arch/arm/plat-iop/time.c [deleted file]

index 516ff35..c96bc7e 100644 (file)
@@ -229,7 +229,6 @@ plat-$(CONFIG_ARCH_EXYNOS)  += samsung
 plat-$(CONFIG_ARCH_OMAP)       += omap
 plat-$(CONFIG_ARCH_S3C64XX)    += samsung
 plat-$(CONFIG_ARCH_S5PV210)    += samsung
-plat-$(CONFIG_PLAT_IOP)                += iop
 plat-$(CONFIG_PLAT_ORION)      += orion
 plat-$(CONFIG_PLAT_PXA)                += pxa
 plat-$(CONFIG_PLAT_S3C24XX)    += samsung
diff --git a/arch/arm/include/asm/hardware/iop3xx.h b/arch/arm/include/asm/hardware/iop3xx.h
deleted file mode 100644 (file)
index 3cb6f22..0000000
+++ /dev/null
@@ -1,311 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * arch/arm/include/asm/hardware/iop3xx.h
- *
- * Intel IOP32X and IOP33X register definitions
- *
- * Author: Rory Bolt <rorybolt@pacbell.net>
- * Copyright (C) 2002 Rory Bolt
- * Copyright (C) 2004 Intel Corp.
- */
-
-#ifndef __IOP3XX_H
-#define __IOP3XX_H
-
-/*
- * IOP3XX GPIO handling
- */
-#define IOP3XX_GPIO_LINE(x)    (x)
-
-#ifndef __ASSEMBLY__
-extern int init_atu;
-extern int iop3xx_get_init_atu(void);
-#endif
-
-
-/*
- * IOP3XX processor registers
- */
-#define IOP3XX_PERIPHERAL_PHYS_BASE    0xffffe000
-#define IOP3XX_PERIPHERAL_VIRT_BASE    0xfedfe000
-#define IOP3XX_PERIPHERAL_SIZE         0x00002000
-#define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\
-                                       IOP3XX_PERIPHERAL_SIZE - 1)
-#define IOP3XX_PERIPHERAL_UPPER_VA (IOP3XX_PERIPHERAL_VIRT_BASE +\
-                                       IOP3XX_PERIPHERAL_SIZE - 1)
-#define IOP3XX_PMMR_PHYS_TO_VIRT(addr) (u32) ((u32) (addr) -\
-                                       (IOP3XX_PERIPHERAL_PHYS_BASE\
-                                       - IOP3XX_PERIPHERAL_VIRT_BASE))
-#define IOP3XX_REG_ADDR(reg)           (IOP3XX_PERIPHERAL_VIRT_BASE + (reg))
-
-/* Address Translation Unit  */
-#define IOP3XX_ATUVID          (volatile u16 *)IOP3XX_REG_ADDR(0x0100)
-#define IOP3XX_ATUDID          (volatile u16 *)IOP3XX_REG_ADDR(0x0102)
-#define IOP3XX_ATUCMD          (volatile u16 *)IOP3XX_REG_ADDR(0x0104)
-#define IOP3XX_ATUSR           (volatile u16 *)IOP3XX_REG_ADDR(0x0106)
-#define IOP3XX_ATURID          (volatile u8  *)IOP3XX_REG_ADDR(0x0108)
-#define IOP3XX_ATUCCR          (volatile u32 *)IOP3XX_REG_ADDR(0x0109)
-#define IOP3XX_ATUCLSR         (volatile u8  *)IOP3XX_REG_ADDR(0x010c)
-#define IOP3XX_ATULT           (volatile u8  *)IOP3XX_REG_ADDR(0x010d)
-#define IOP3XX_ATUHTR          (volatile u8  *)IOP3XX_REG_ADDR(0x010e)
-#define IOP3XX_ATUBIST         (volatile u8  *)IOP3XX_REG_ADDR(0x010f)
-#define IOP3XX_IABAR0          (volatile u32 *)IOP3XX_REG_ADDR(0x0110)
-#define IOP3XX_IAUBAR0         (volatile u32 *)IOP3XX_REG_ADDR(0x0114)
-#define IOP3XX_IABAR1          (volatile u32 *)IOP3XX_REG_ADDR(0x0118)
-#define IOP3XX_IAUBAR1         (volatile u32 *)IOP3XX_REG_ADDR(0x011c)
-#define IOP3XX_IABAR2          (volatile u32 *)IOP3XX_REG_ADDR(0x0120)
-#define IOP3XX_IAUBAR2         (volatile u32 *)IOP3XX_REG_ADDR(0x0124)
-#define IOP3XX_ASVIR           (volatile u16 *)IOP3XX_REG_ADDR(0x012c)
-#define IOP3XX_ASIR            (volatile u16 *)IOP3XX_REG_ADDR(0x012e)
-#define IOP3XX_ERBAR           (volatile u32 *)IOP3XX_REG_ADDR(0x0130)
-#define IOP3XX_ATUILR          (volatile u8  *)IOP3XX_REG_ADDR(0x013c)
-#define IOP3XX_ATUIPR          (volatile u8  *)IOP3XX_REG_ADDR(0x013d)
-#define IOP3XX_ATUMGNT         (volatile u8  *)IOP3XX_REG_ADDR(0x013e)
-#define IOP3XX_ATUMLAT         (volatile u8  *)IOP3XX_REG_ADDR(0x013f)
-#define IOP3XX_IALR0           (volatile u32 *)IOP3XX_REG_ADDR(0x0140)
-#define IOP3XX_IATVR0          (volatile u32 *)IOP3XX_REG_ADDR(0x0144)
-#define IOP3XX_ERLR            (volatile u32 *)IOP3XX_REG_ADDR(0x0148)
-#define IOP3XX_ERTVR           (volatile u32 *)IOP3XX_REG_ADDR(0x014c)
-#define IOP3XX_IALR1           (volatile u32 *)IOP3XX_REG_ADDR(0x0150)
-#define IOP3XX_IALR2           (volatile u32 *)IOP3XX_REG_ADDR(0x0154)
-#define IOP3XX_IATVR2          (volatile u32 *)IOP3XX_REG_ADDR(0x0158)
-#define IOP3XX_OIOWTVR         (volatile u32 *)IOP3XX_REG_ADDR(0x015c)
-#define IOP3XX_OMWTVR0         (volatile u32 *)IOP3XX_REG_ADDR(0x0160)
-#define IOP3XX_OUMWTVR0                (volatile u32 *)IOP3XX_REG_ADDR(0x0164)
-#define IOP3XX_OMWTVR1         (volatile u32 *)IOP3XX_REG_ADDR(0x0168)
-#define IOP3XX_OUMWTVR1                (volatile u32 *)IOP3XX_REG_ADDR(0x016c)
-#define IOP3XX_OUDWTVR         (volatile u32 *)IOP3XX_REG_ADDR(0x0178)
-#define IOP3XX_ATUCR           (volatile u32 *)IOP3XX_REG_ADDR(0x0180)
-#define IOP3XX_PCSR            (volatile u32 *)IOP3XX_REG_ADDR(0x0184)
-#define IOP3XX_ATUISR          (volatile u32 *)IOP3XX_REG_ADDR(0x0188)
-#define IOP3XX_ATUIMR          (volatile u32 *)IOP3XX_REG_ADDR(0x018c)
-#define IOP3XX_IABAR3          (volatile u32 *)IOP3XX_REG_ADDR(0x0190)
-#define IOP3XX_IAUBAR3         (volatile u32 *)IOP3XX_REG_ADDR(0x0194)
-#define IOP3XX_IALR3           (volatile u32 *)IOP3XX_REG_ADDR(0x0198)
-#define IOP3XX_IATVR3          (volatile u32 *)IOP3XX_REG_ADDR(0x019c)
-#define IOP3XX_OCCAR           (volatile u32 *)IOP3XX_REG_ADDR(0x01a4)
-#define IOP3XX_OCCDR           (volatile u32 *)IOP3XX_REG_ADDR(0x01ac)
-#define IOP3XX_PDSCR           (volatile u32 *)IOP3XX_REG_ADDR(0x01bc)
-#define IOP3XX_PMCAPID         (volatile u8  *)IOP3XX_REG_ADDR(0x01c0)
-#define IOP3XX_PMNEXT          (volatile u8  *)IOP3XX_REG_ADDR(0x01c1)
-#define IOP3XX_APMCR           (volatile u16 *)IOP3XX_REG_ADDR(0x01c2)
-#define IOP3XX_APMCSR          (volatile u16 *)IOP3XX_REG_ADDR(0x01c4)
-#define IOP3XX_PCIXCAPID       (volatile u8  *)IOP3XX_REG_ADDR(0x01e0)
-#define IOP3XX_PCIXNEXT                (volatile u8  *)IOP3XX_REG_ADDR(0x01e1)
-#define IOP3XX_PCIXCMD         (volatile u16 *)IOP3XX_REG_ADDR(0x01e2)
-#define IOP3XX_PCIXSR          (volatile u32 *)IOP3XX_REG_ADDR(0x01e4)
-#define IOP3XX_PCIIRSR         (volatile u32 *)IOP3XX_REG_ADDR(0x01ec)
-#define IOP3XX_PCSR_OUT_Q_BUSY (1 << 15)
-#define IOP3XX_PCSR_IN_Q_BUSY  (1 << 14)
-#define IOP3XX_ATUCR_OUT_EN    (1 << 1)
-
-#define IOP3XX_INIT_ATU_DEFAULT 0
-#define IOP3XX_INIT_ATU_DISABLE -1
-#define IOP3XX_INIT_ATU_ENABLE  1
-
-/* Messaging Unit  */
-#define IOP3XX_IMR0            (volatile u32 *)IOP3XX_REG_ADDR(0x0310)
-#define IOP3XX_IMR1            (volatile u32 *)IOP3XX_REG_ADDR(0x0314)
-#define IOP3XX_OMR0            (volatile u32 *)IOP3XX_REG_ADDR(0x0318)
-#define IOP3XX_OMR1            (volatile u32 *)IOP3XX_REG_ADDR(0x031c)
-#define IOP3XX_IDR             (volatile u32 *)IOP3XX_REG_ADDR(0x0320)
-#define IOP3XX_IISR            (volatile u32 *)IOP3XX_REG_ADDR(0x0324)
-#define IOP3XX_IIMR            (volatile u32 *)IOP3XX_REG_ADDR(0x0328)
-#define IOP3XX_ODR             (volatile u32 *)IOP3XX_REG_ADDR(0x032c)
-#define IOP3XX_OISR            (volatile u32 *)IOP3XX_REG_ADDR(0x0330)
-#define IOP3XX_OIMR            (volatile u32 *)IOP3XX_REG_ADDR(0x0334)
-#define IOP3XX_MUCR            (volatile u32 *)IOP3XX_REG_ADDR(0x0350)
-#define IOP3XX_QBAR            (volatile u32 *)IOP3XX_REG_ADDR(0x0354)
-#define IOP3XX_IFHPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0360)
-#define IOP3XX_IFTPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0364)
-#define IOP3XX_IPHPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0368)
-#define IOP3XX_IPTPR           (volatile u32 *)IOP3XX_REG_ADDR(0x036c)
-#define IOP3XX_OFHPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0370)
-#define IOP3XX_OFTPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0374)
-#define IOP3XX_OPHPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0378)
-#define IOP3XX_OPTPR           (volatile u32 *)IOP3XX_REG_ADDR(0x037c)
-#define IOP3XX_IAR             (volatile u32 *)IOP3XX_REG_ADDR(0x0380)
-
-/* DMA Controller  */
-#define IOP3XX_DMA_PHYS_BASE(chan) (IOP3XX_PERIPHERAL_PHYS_BASE + \
-                                       (0x400 + (chan << 6)))
-#define IOP3XX_DMA_UPPER_PA(chan)  (IOP3XX_DMA_PHYS_BASE(chan) + 0x27)
-
-/* Peripheral bus interface  */
-#define IOP3XX_PBCR            (volatile u32 *)IOP3XX_REG_ADDR(0x0680)
-#define IOP3XX_PBISR           (volatile u32 *)IOP3XX_REG_ADDR(0x0684)
-#define IOP3XX_PBBAR0          (volatile u32 *)IOP3XX_REG_ADDR(0x0688)
-#define IOP3XX_PBLR0           (volatile u32 *)IOP3XX_REG_ADDR(0x068c)
-#define IOP3XX_PBBAR1          (volatile u32 *)IOP3XX_REG_ADDR(0x0690)
-#define IOP3XX_PBLR1           (volatile u32 *)IOP3XX_REG_ADDR(0x0694)
-#define IOP3XX_PBBAR2          (volatile u32 *)IOP3XX_REG_ADDR(0x0698)
-#define IOP3XX_PBLR2           (volatile u32 *)IOP3XX_REG_ADDR(0x069c)
-#define IOP3XX_PBBAR3          (volatile u32 *)IOP3XX_REG_ADDR(0x06a0)
-#define IOP3XX_PBLR3           (volatile u32 *)IOP3XX_REG_ADDR(0x06a4)
-#define IOP3XX_PBBAR4          (volatile u32 *)IOP3XX_REG_ADDR(0x06a8)
-#define IOP3XX_PBLR4           (volatile u32 *)IOP3XX_REG_ADDR(0x06ac)
-#define IOP3XX_PBBAR5          (volatile u32 *)IOP3XX_REG_ADDR(0x06b0)
-#define IOP3XX_PBLR5           (volatile u32 *)IOP3XX_REG_ADDR(0x06b4)
-#define IOP3XX_PMBR0           (volatile u32 *)IOP3XX_REG_ADDR(0x06c0)
-#define IOP3XX_PMBR1           (volatile u32 *)IOP3XX_REG_ADDR(0x06e0)
-#define IOP3XX_PMBR2           (volatile u32 *)IOP3XX_REG_ADDR(0x06e4)
-
-/* Peripheral performance monitoring unit  */
-#define IOP3XX_GTMR            (volatile u32 *)IOP3XX_REG_ADDR(0x0700)
-#define IOP3XX_ESR             (volatile u32 *)IOP3XX_REG_ADDR(0x0704)
-#define IOP3XX_EMISR           (volatile u32 *)IOP3XX_REG_ADDR(0x0708)
-#define IOP3XX_GTSR            (volatile u32 *)IOP3XX_REG_ADDR(0x0710)
-/* PERCR0 DOESN'T EXIST - index from 1! */
-#define IOP3XX_PERCR0          (volatile u32 *)IOP3XX_REG_ADDR(0x0710)
-
-/* Timers  */
-#define IOP3XX_TU_TMR0         (volatile u32 *)IOP3XX_TIMER_REG(0x0000)
-#define IOP3XX_TU_TMR1         (volatile u32 *)IOP3XX_TIMER_REG(0x0004)
-#define IOP3XX_TU_TCR0         (volatile u32 *)IOP3XX_TIMER_REG(0x0008)
-#define IOP3XX_TU_TCR1         (volatile u32 *)IOP3XX_TIMER_REG(0x000c)
-#define IOP3XX_TU_TRR0         (volatile u32 *)IOP3XX_TIMER_REG(0x0010)
-#define IOP3XX_TU_TRR1         (volatile u32 *)IOP3XX_TIMER_REG(0x0014)
-#define IOP3XX_TU_TISR         (volatile u32 *)IOP3XX_TIMER_REG(0x0018)
-#define IOP3XX_TU_WDTCR                (volatile u32 *)IOP3XX_TIMER_REG(0x001c)
-#define IOP_TMR_EN         0x02
-#define IOP_TMR_RELOAD     0x04
-#define IOP_TMR_PRIVILEGED 0x08
-#define IOP_TMR_RATIO_1_1  0x00
-
-/* Watchdog timer definitions */
-#define IOP_WDTCR_EN_ARM        0x1e1e1e1e
-#define IOP_WDTCR_EN            0xe1e1e1e1
-/* iop3xx does not support stopping the watchdog, so we just re-arm */
-#define IOP_WDTCR_DIS_ARM      (IOP_WDTCR_EN_ARM)
-#define IOP_WDTCR_DIS          (IOP_WDTCR_EN)
-
-/* Application accelerator unit  */
-#define IOP3XX_AAU_PHYS_BASE (IOP3XX_PERIPHERAL_PHYS_BASE + 0x800)
-#define IOP3XX_AAU_UPPER_PA (IOP3XX_AAU_PHYS_BASE + 0xa7)
-
-/* I2C bus interface unit  */
-#define IOP3XX_ICR0            (volatile u32 *)IOP3XX_REG_ADDR(0x1680)
-#define IOP3XX_ISR0            (volatile u32 *)IOP3XX_REG_ADDR(0x1684)
-#define IOP3XX_ISAR0           (volatile u32 *)IOP3XX_REG_ADDR(0x1688)
-#define IOP3XX_IDBR0           (volatile u32 *)IOP3XX_REG_ADDR(0x168c)
-#define IOP3XX_IBMR0           (volatile u32 *)IOP3XX_REG_ADDR(0x1694)
-#define IOP3XX_ICR1            (volatile u32 *)IOP3XX_REG_ADDR(0x16a0)
-#define IOP3XX_ISR1            (volatile u32 *)IOP3XX_REG_ADDR(0x16a4)
-#define IOP3XX_ISAR1           (volatile u32 *)IOP3XX_REG_ADDR(0x16a8)
-#define IOP3XX_IDBR1           (volatile u32 *)IOP3XX_REG_ADDR(0x16ac)
-#define IOP3XX_IBMR1           (volatile u32 *)IOP3XX_REG_ADDR(0x16b4)
-
-
-/*
- * IOP3XX I/O and Mem space regions for PCI autoconfiguration
- */
-#define IOP3XX_PCI_LOWER_MEM_PA        0x80000000
-#define IOP3XX_PCI_MEM_WINDOW_SIZE     0x08000000
-
-#define IOP3XX_PCI_LOWER_IO_PA         0x90000000
-#define IOP3XX_PCI_LOWER_IO_BA         0x00000000
-
-#ifndef __ASSEMBLY__
-
-#include <linux/types.h>
-#include <linux/reboot.h>
-
-void iop3xx_map_io(void);
-void iop_init_cp6_handler(void);
-void iop_init_time(unsigned long tickrate);
-void iop3xx_restart(enum reboot_mode, const char *);
-
-static inline u32 read_tmr0(void)
-{
-       u32 val;
-       asm volatile("mrc p6, 0, %0, c0, c1, 0" : "=r" (val));
-       return val;
-}
-
-static inline void write_tmr0(u32 val)
-{
-       asm volatile("mcr p6, 0, %0, c0, c1, 0" : : "r" (val));
-}
-
-static inline void write_tmr1(u32 val)
-{
-       asm volatile("mcr p6, 0, %0, c1, c1, 0" : : "r" (val));
-}
-
-static inline u32 read_tcr0(void)
-{
-       u32 val;
-       asm volatile("mrc p6, 0, %0, c2, c1, 0" : "=r" (val));
-       return val;
-}
-
-static inline void write_tcr0(u32 val)
-{
-       asm volatile("mcr p6, 0, %0, c2, c1, 0" : : "r" (val));
-}
-
-static inline u32 read_tcr1(void)
-{
-       u32 val;
-       asm volatile("mrc p6, 0, %0, c3, c1, 0" : "=r" (val));
-       return val;
-}
-
-static inline void write_tcr1(u32 val)
-{
-       asm volatile("mcr p6, 0, %0, c3, c1, 0" : : "r" (val));
-}
-
-static inline void write_trr0(u32 val)
-{
-       asm volatile("mcr p6, 0, %0, c4, c1, 0" : : "r" (val));
-}
-
-static inline void write_trr1(u32 val)
-{
-       asm volatile("mcr p6, 0, %0, c5, c1, 0" : : "r" (val));
-}
-
-static inline void write_tisr(u32 val)
-{
-       asm volatile("mcr p6, 0, %0, c6, c1, 0" : : "r" (val));
-}
-
-static inline u32 read_wdtcr(void)
-{
-       u32 val;
-       asm volatile("mrc p6, 0, %0, c7, c1, 0":"=r" (val));
-       return val;
-}
-static inline void write_wdtcr(u32 val)
-{
-       asm volatile("mcr p6, 0, %0, c7, c1, 0"::"r" (val));
-}
-
-extern unsigned long get_iop_tick_rate(void);
-
-/* only iop13xx has these registers, we define these to present a
- * common register interface for the iop_wdt driver.
- */
-#define IOP_RCSR_WDT   (0)
-static inline u32 read_rcsr(void)
-{
-       return 0;
-}
-static inline void write_wdtsr(u32 val)
-{
-       do { } while (0);
-}
-
-extern struct platform_device iop3xx_dma_0_channel;
-extern struct platform_device iop3xx_dma_1_channel;
-extern struct platform_device iop3xx_aau_channel;
-extern struct platform_device iop3xx_i2c0_device;
-extern struct platform_device iop3xx_i2c1_device;
-extern struct gpiod_lookup_table iop3xx_i2c0_gpio_lookup;
-extern struct gpiod_lookup_table iop3xx_i2c1_gpio_lookup;
-
-#endif
-
-
-#endif
index 71d6244..c8018ef 100644 (file)
@@ -3,7 +3,15 @@
 # Makefile for the linux kernel.
 #
 
-obj-y                  := irq.o
+obj-$(CONFIG_ARCH_IOP32X) += irq.o
+obj-$(CONFIG_ARCH_IOP32X) += i2c.o
+obj-$(CONFIG_ARCH_IOP32X) += pci.o
+obj-$(CONFIG_ARCH_IOP32X) += setup.o
+obj-$(CONFIG_ARCH_IOP32X) += time.o
+obj-$(CONFIG_ARCH_IOP32X) += cp6.o
+obj-$(CONFIG_ARCH_IOP32X) += adma.o
+obj-$(CONFIG_ARCH_IOP32X) += pmu.o
+obj-$(CONFIG_ARCH_IOP32X) += restart.o
 
 obj-$(CONFIG_MACH_GLANTANK) += glantank.o
 obj-$(CONFIG_ARCH_IQ80321) += iq80321.o
diff --git a/arch/arm/mach-iop32x/adma.c b/arch/arm/mach-iop32x/adma.c
new file mode 100644 (file)
index 0000000..764bcbf
--- /dev/null
@@ -0,0 +1,163 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * platform device definitions for the iop3xx dma/xor engines
+ * Copyright Â© 2006, Intel Corporation.
+ */
+#include <linux/platform_device.h>
+#include <linux/dma-mapping.h>
+#include <linux/platform_data/dma-iop32x.h>
+
+#include "iop3xx.h"
+#include "irqs.h"
+
+#define IRQ_DMA0_EOT IRQ_IOP32X_DMA0_EOT
+#define IRQ_DMA0_EOC IRQ_IOP32X_DMA0_EOC
+#define IRQ_DMA0_ERR IRQ_IOP32X_DMA0_ERR
+
+#define IRQ_DMA1_EOT IRQ_IOP32X_DMA1_EOT
+#define IRQ_DMA1_EOC IRQ_IOP32X_DMA1_EOC
+#define IRQ_DMA1_ERR IRQ_IOP32X_DMA1_ERR
+
+#define IRQ_AA_EOT IRQ_IOP32X_AA_EOT
+#define IRQ_AA_EOC IRQ_IOP32X_AA_EOC
+#define IRQ_AA_ERR IRQ_IOP32X_AA_ERR
+
+/* AAU and DMA Channels */
+static struct resource iop3xx_dma_0_resources[] = {
+       [0] = {
+               .start = IOP3XX_DMA_PHYS_BASE(0),
+               .end = IOP3XX_DMA_UPPER_PA(0),
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_DMA0_EOT,
+               .end = IRQ_DMA0_EOT,
+               .flags = IORESOURCE_IRQ
+       },
+       [2] = {
+               .start = IRQ_DMA0_EOC,
+               .end = IRQ_DMA0_EOC,
+               .flags = IORESOURCE_IRQ
+       },
+       [3] = {
+               .start = IRQ_DMA0_ERR,
+               .end = IRQ_DMA0_ERR,
+               .flags = IORESOURCE_IRQ
+       }
+};
+
+static struct resource iop3xx_dma_1_resources[] = {
+       [0] = {
+               .start = IOP3XX_DMA_PHYS_BASE(1),
+               .end = IOP3XX_DMA_UPPER_PA(1),
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_DMA1_EOT,
+               .end = IRQ_DMA1_EOT,
+               .flags = IORESOURCE_IRQ
+       },
+       [2] = {
+               .start = IRQ_DMA1_EOC,
+               .end = IRQ_DMA1_EOC,
+               .flags = IORESOURCE_IRQ
+       },
+       [3] = {
+               .start = IRQ_DMA1_ERR,
+               .end = IRQ_DMA1_ERR,
+               .flags = IORESOURCE_IRQ
+       }
+};
+
+
+static struct resource iop3xx_aau_resources[] = {
+       [0] = {
+               .start = IOP3XX_AAU_PHYS_BASE,
+               .end = IOP3XX_AAU_UPPER_PA,
+               .flags = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start = IRQ_AA_EOT,
+               .end = IRQ_AA_EOT,
+               .flags = IORESOURCE_IRQ
+       },
+       [2] = {
+               .start = IRQ_AA_EOC,
+               .end = IRQ_AA_EOC,
+               .flags = IORESOURCE_IRQ
+       },
+       [3] = {
+               .start = IRQ_AA_ERR,
+               .end = IRQ_AA_ERR,
+               .flags = IORESOURCE_IRQ
+       }
+};
+
+static u64 iop3xx_adma_dmamask = DMA_BIT_MASK(32);
+
+static struct iop_adma_platform_data iop3xx_dma_0_data = {
+       .hw_id = DMA0_ID,
+       .pool_size = PAGE_SIZE,
+};
+
+static struct iop_adma_platform_data iop3xx_dma_1_data = {
+       .hw_id = DMA1_ID,
+       .pool_size = PAGE_SIZE,
+};
+
+static struct iop_adma_platform_data iop3xx_aau_data = {
+       .hw_id = AAU_ID,
+       .pool_size = 3 * PAGE_SIZE,
+};
+
+struct platform_device iop3xx_dma_0_channel = {
+       .name = "iop-adma",
+       .id = 0,
+       .num_resources = 4,
+       .resource = iop3xx_dma_0_resources,
+       .dev = {
+               .dma_mask = &iop3xx_adma_dmamask,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
+               .platform_data = (void *) &iop3xx_dma_0_data,
+       },
+};
+
+struct platform_device iop3xx_dma_1_channel = {
+       .name = "iop-adma",
+       .id = 1,
+       .num_resources = 4,
+       .resource = iop3xx_dma_1_resources,
+       .dev = {
+               .dma_mask = &iop3xx_adma_dmamask,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
+               .platform_data = (void *) &iop3xx_dma_1_data,
+       },
+};
+
+struct platform_device iop3xx_aau_channel = {
+       .name = "iop-adma",
+       .id = 2,
+       .num_resources = 4,
+       .resource = iop3xx_aau_resources,
+       .dev = {
+               .dma_mask = &iop3xx_adma_dmamask,
+               .coherent_dma_mask = DMA_BIT_MASK(32),
+               .platform_data = (void *) &iop3xx_aau_data,
+       },
+};
+
+static int __init iop3xx_adma_cap_init(void)
+{
+       dma_cap_set(DMA_MEMCPY, iop3xx_dma_0_data.cap_mask);
+       dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask);
+
+       dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask);
+       dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask);
+
+       dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask);
+       dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask);
+
+       return 0;
+}
+
+arch_initcall(iop3xx_adma_cap_init);
diff --git a/arch/arm/mach-iop32x/cp6.c b/arch/arm/mach-iop32x/cp6.c
new file mode 100644 (file)
index 0000000..ec74b07
--- /dev/null
@@ -0,0 +1,38 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * IOP Coprocessor-6 access handler
+ * Copyright (c) 2006, Intel Corporation.
+ */
+#include <linux/init.h>
+#include <asm/traps.h>
+#include <asm/ptrace.h>
+
+static int cp6_trap(struct pt_regs *regs, unsigned int instr)
+{
+       u32 temp;
+
+        /* enable cp6 access */
+        asm volatile (
+               "mrc    p15, 0, %0, c15, c1, 0\n\t"
+               "orr    %0, %0, #(1 << 6)\n\t"
+               "mcr    p15, 0, %0, c15, c1, 0\n\t"
+               : "=r"(temp));
+
+       return 0;
+}
+
+/* permit kernel space cp6 access
+ * deny user space cp6 access
+ */
+static struct undef_hook cp6_hook = {
+       .instr_mask     = 0x0f000ff0,
+       .instr_val      = 0x0e000610,
+       .cpsr_mask      = MODE_MASK,
+       .cpsr_val       = SVC_MODE,
+       .fn             = cp6_trap,
+};
+
+void __init iop_init_cp6_handler(void)
+{
+       register_undef_hook(&cp6_hook);
+}
index 61a1e59..d43ced3 100644 (file)
@@ -21,7 +21,6 @@
 #include <linux/i2c.h>
 #include <linux/gpio.h>
 #include <linux/gpio/machine.h>
-#include <mach/hardware.h>
 #include <linux/io.h>
 #include <linux/irq.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/pci.h>
 #include <asm/mach/time.h>
 #include <asm/mach-types.h>
-#include <mach/time.h>
+
+#include "hardware.h"
 #include "gpio-iop32x.h"
+#include "irqs.h"
 
 static void __init em7210_timer_init(void)
 {
index 5a45d61..2fe0f77 100644 (file)
@@ -22,7 +22,6 @@
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/gpio/machine.h>
-#include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
 #include <asm/mach/time.h>
 #include <asm/mach-types.h>
 #include <asm/page.h>
-#include <mach/time.h>
+
+#include "hardware.h"
 #include "gpio-iop32x.h"
+#include "irqs.h"
 
 /*
  * GLAN Tank timer tick configuration.
diff --git a/arch/arm/mach-iop32x/glantank.h b/arch/arm/mach-iop32x/glantank.h
new file mode 100644 (file)
index 0000000..f38e86b
--- /dev/null
@@ -0,0 +1,12 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * IO-Data GLAN Tank board registers
+ */
+
+#ifndef __GLANTANK_H
+#define __GLANTANK_H
+
+#define GLANTANK_UART          0xfe800000      /* UART */
+
+
+#endif
diff --git a/arch/arm/mach-iop32x/hardware.h b/arch/arm/mach-iop32x/hardware.h
new file mode 100644 (file)
index 0000000..43ab4fb
--- /dev/null
@@ -0,0 +1,38 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#ifndef __HARDWARE_H
+#define __HARDWARE_H
+
+#include <asm/types.h>
+
+/*
+ * Note about PCI IO space mappings
+ *
+ * To make IO space accesses efficient, we store virtual addresses in
+ * the IO resources.
+ *
+ * The PCI IO space is located at virtual 0xfe000000 from physical
+ * 0x90000000. The PCI BARs must be programmed with physical addresses,
+ * but when we read them, we convert them to virtual addresses. See
+ * arch/arm/plat-iop/pci.c.
+ */
+
+#ifndef __ASSEMBLY__
+void iop32x_init_irq(void);
+#endif
+
+
+/*
+ * Generic chipset bits
+ */
+#include "iop3xx.h"
+
+/*
+ * Board specific bits
+ */
+#include "glantank.h"
+#include "iq80321.h"
+#include "iq31244.h"
+#include "n2100.h"
+
+
+#endif
diff --git a/arch/arm/mach-iop32x/i2c.c b/arch/arm/mach-iop32x/i2c.c
new file mode 100644 (file)
index 0000000..dc9f6a1
--- /dev/null
@@ -0,0 +1,93 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * arch/arm/plat-iop/i2c.c
+ *
+ * Author: Nicolas Pitre <nico@cam.org>
+ * Copyright (C) 2001 MontaVista Software, Inc.
+ * Copyright (C) 2004 Intel Corporation.
+ */
+
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/major.h>
+#include <linux/fs.h>
+#include <linux/platform_device.h>
+#include <linux/serial.h>
+#include <linux/tty.h>
+#include <linux/serial_core.h>
+#include <linux/io.h>
+#include <linux/gpio/machine.h>
+#include <asm/pgtable.h>
+#include <asm/page.h>
+#include <asm/mach/map.h>
+#include <asm/setup.h>
+#include <asm/memory.h>
+#include <asm/mach/arch.h>
+
+#include "hardware.h"
+#include "iop3xx.h"
+#include "irqs.h"
+
+/*
+ * Each of the I2C busses have corresponding GPIO lines, and the driver
+ * need to access these directly to drive the bus low at times.
+ */
+
+struct gpiod_lookup_table iop3xx_i2c0_gpio_lookup = {
+       .dev_id = "IOP3xx-I2C.0",
+       .table = {
+               GPIO_LOOKUP("gpio-iop", 7, "scl", GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("gpio-iop", 6, "sda", GPIO_ACTIVE_HIGH),
+               { }
+       },
+};
+
+struct gpiod_lookup_table iop3xx_i2c1_gpio_lookup = {
+       .dev_id = "IOP3xx-I2C.1",
+       .table = {
+               GPIO_LOOKUP("gpio-iop", 5, "scl", GPIO_ACTIVE_HIGH),
+               GPIO_LOOKUP("gpio-iop", 4, "sda", GPIO_ACTIVE_HIGH),
+               { }
+       },
+};
+
+static struct resource iop3xx_i2c0_resources[] = {
+       [0] = {
+               .start  = 0xfffff680,
+               .end    = 0xfffff697,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = IRQ_IOP32X_I2C_0,
+               .end    = IRQ_IOP32X_I2C_0,
+               .flags  = IORESOURCE_IRQ,
+       },
+};
+
+struct platform_device iop3xx_i2c0_device = {
+       .name           = "IOP3xx-I2C",
+       .id             = 0,
+       .num_resources  = 2,
+       .resource       = iop3xx_i2c0_resources,
+};
+
+
+static struct resource iop3xx_i2c1_resources[] = {
+       [0] = {
+               .start  = 0xfffff6a0,
+               .end    = 0xfffff6b7,
+               .flags  = IORESOURCE_MEM,
+       },
+       [1] = {
+               .start  = IRQ_IOP32X_I2C_1,
+               .end    = IRQ_IOP32X_I2C_1,
+               .flags  = IORESOURCE_IRQ,
+       }
+};
+
+struct platform_device iop3xx_i2c1_device = {
+       .name           = "IOP3xx-I2C",
+       .id             = 1,
+       .num_resources  = 2,
+       .resource       = iop3xx_i2c1_resources,
+};
index ea13ae0..8e6766d 100644 (file)
@@ -7,8 +7,6 @@
  * License version 2. This program is licensed "as is" without any
  * warranty of any kind, whether express or implied.
  */
-#include <mach/iop32x.h>
-
        .macro get_irqnr_preamble, base, tmp
        mrc     p15, 0, \tmp, c15, c1, 0
        orr     \tmp, \tmp, #(1 << 6)
diff --git a/arch/arm/mach-iop32x/include/mach/glantank.h b/arch/arm/mach-iop32x/include/mach/glantank.h
deleted file mode 100644 (file)
index b9df2e4..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * arch/arm/mach-iop32x/include/mach/glantank.h
- *
- * IO-Data GLAN Tank board registers
- */
-
-#ifndef __GLANTANK_H
-#define __GLANTANK_H
-
-#define GLANTANK_UART          0xfe800000      /* UART */
-
-
-#endif
diff --git a/arch/arm/mach-iop32x/include/mach/hardware.h b/arch/arm/mach-iop32x/include/mach/hardware.h
deleted file mode 100644 (file)
index 6e5303e..0000000
+++ /dev/null
@@ -1,42 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * arch/arm/mach-iop32x/include/mach/hardware.h
- */
-
-#ifndef __HARDWARE_H
-#define __HARDWARE_H
-
-#include <asm/types.h>
-
-/*
- * Note about PCI IO space mappings
- *
- * To make IO space accesses efficient, we store virtual addresses in
- * the IO resources.
- *
- * The PCI IO space is located at virtual 0xfe000000 from physical
- * 0x90000000. The PCI BARs must be programmed with physical addresses,
- * but when we read them, we convert them to virtual addresses. See
- * arch/arm/plat-iop/pci.c.
- */
-
-#ifndef __ASSEMBLY__
-void iop32x_init_irq(void);
-#endif
-
-
-/*
- * Generic chipset bits
- */
-#include "iop32x.h"
-
-/*
- * Board specific bits
- */
-#include "glantank.h"
-#include "iq80321.h"
-#include "iq31244.h"
-#include "n2100.h"
-
-
-#endif
diff --git a/arch/arm/mach-iop32x/include/mach/iop32x.h b/arch/arm/mach-iop32x/include/mach/iop32x.h
deleted file mode 100644 (file)
index 84223f8..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0-only */
-/*
- * arch/arm/mach-iop32x/include/mach/iop32x.h
- *
- * Intel IOP32X Chip definitions
- *
- * Author: Rory Bolt <rorybolt@pacbell.net>
- * Copyright (C) 2002 Rory Bolt
- * Copyright (C) 2004 Intel Corp.
- */
-
-#ifndef __IOP32X_H
-#define __IOP32X_H
-
-/*
- * Peripherals that are shared between the iop32x and iop33x but
- * located at different addresses.
- */
-#define IOP3XX_TIMER_REG(reg)  (IOP3XX_PERIPHERAL_VIRT_BASE + 0x07e0 + (reg))
-
-#include <asm/hardware/iop3xx.h>
-
-/* ATU Parameters
- * set up a 1:1 bus to physical ram relationship
- * w/ physical ram on top of pci in the memory map
- */
-#define IOP32X_MAX_RAM_SIZE            0x40000000UL
-#define IOP3XX_MAX_RAM_SIZE            IOP32X_MAX_RAM_SIZE
-#define IOP3XX_PCI_LOWER_MEM_BA        0x80000000
-
-#endif
diff --git a/arch/arm/mach-iop32x/include/mach/iq31244.h b/arch/arm/mach-iop32x/include/mach/iq31244.h
deleted file mode 100644 (file)
index e62da5d..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * arch/arm/mach-iop32x/include/mach/iq31244.h
- *
- * Intel IQ31244 evaluation board registers
- */
-
-#ifndef __IQ31244_H
-#define __IQ31244_H
-
-#define IQ31244_UART           0xfe800000      /* UART #1 */
-#define IQ31244_7SEG_1         0xfe840000      /* 7-Segment MSB */
-#define IQ31244_7SEG_0         0xfe850000      /* 7-Segment LSB (WO) */
-#define IQ31244_ROTARY_SW      0xfe8d0000      /* Rotary Switch */
-#define IQ31244_BATT_STAT      0xfe8f0000      /* Battery Status */
-
-
-#endif
diff --git a/arch/arm/mach-iop32x/include/mach/iq80321.h b/arch/arm/mach-iop32x/include/mach/iq80321.h
deleted file mode 100644 (file)
index faf62c2..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * arch/arm/mach-iop32x/include/mach/iq80321.h
- *
- * Intel IQ80321 evaluation board registers
- */
-
-#ifndef __IQ80321_H
-#define __IQ80321_H
-
-#define IQ80321_UART           0xfe800000      /* UART #1 */
-#define IQ80321_7SEG_1         0xfe840000      /* 7-Segment MSB */
-#define IQ80321_7SEG_0         0xfe850000      /* 7-Segment LSB (WO) */
-#define IQ80321_ROTARY_SW      0xfe8d0000      /* Rotary Switch */
-#define IQ80321_BATT_STAT      0xfe8f0000      /* Battery Status */
-
-
-#endif
index 82b1174..c4e78df 100644 (file)
@@ -9,39 +9,6 @@
 #ifndef __IRQS_H
 #define __IRQS_H
 
-/*
- * IOP80321 chipset interrupts
- */
-#define IRQ_IOP32X_DMA0_EOT    0
-#define IRQ_IOP32X_DMA0_EOC    1
-#define IRQ_IOP32X_DMA1_EOT    2
-#define IRQ_IOP32X_DMA1_EOC    3
-#define IRQ_IOP32X_AA_EOT      6
-#define IRQ_IOP32X_AA_EOC      7
-#define IRQ_IOP32X_CORE_PMON   8
-#define IRQ_IOP32X_TIMER0      9
-#define IRQ_IOP32X_TIMER1      10
-#define IRQ_IOP32X_I2C_0       11
-#define IRQ_IOP32X_I2C_1       12
-#define IRQ_IOP32X_MESSAGING   13
-#define IRQ_IOP32X_ATU_BIST    14
-#define IRQ_IOP32X_PERFMON     15
-#define IRQ_IOP32X_CORE_PMU    16
-#define IRQ_IOP32X_BIU_ERR     17
-#define IRQ_IOP32X_ATU_ERR     18
-#define IRQ_IOP32X_MCU_ERR     19
-#define IRQ_IOP32X_DMA0_ERR    20
-#define IRQ_IOP32X_DMA1_ERR    21
-#define IRQ_IOP32X_AA_ERR      23
-#define IRQ_IOP32X_MSG_ERR     24
-#define IRQ_IOP32X_SSP         25
-#define IRQ_IOP32X_XINT0       27
-#define IRQ_IOP32X_XINT1       28
-#define IRQ_IOP32X_XINT2       29
-#define IRQ_IOP32X_XINT3       30
-#define IRQ_IOP32X_HPI         31
-
 #define NR_IRQS                        32
 
-
 #endif
diff --git a/arch/arm/mach-iop32x/include/mach/n2100.h b/arch/arm/mach-iop32x/include/mach/n2100.h
deleted file mode 100644 (file)
index 70bb660..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-/*
- * arch/arm/mach-iop32x/include/mach/n2100.h
- *
- * Thecus N2100 board registers
- */
-
-#ifndef __N2100_H
-#define __N2100_H
-
-#define N2100_UART             0xfe800000      /* UART */
-
-#define N2100_COPY_BUTTON      IOP3XX_GPIO_LINE(0)
-#define N2100_PCA9532_RESET    IOP3XX_GPIO_LINE(2)
-#define N2100_RESET_BUTTON     IOP3XX_GPIO_LINE(3)
-#define N2100_HARDWARE_RESET   IOP3XX_GPIO_LINE(4)
-#define N2100_POWER_BUTTON     IOP3XX_GPIO_LINE(5)
-
-
-#endif
diff --git a/arch/arm/mach-iop32x/include/mach/time.h b/arch/arm/mach-iop32x/include/mach/time.h
deleted file mode 100644 (file)
index d08950c..0000000
+++ /dev/null
@@ -1,5 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _IOP32X_TIME_H_
-#define _IOP32X_TIME_H_
-#define IRQ_IOP_TIMER0 IRQ_IOP32X_TIMER0
-#endif
diff --git a/arch/arm/mach-iop32x/iop3xx.h b/arch/arm/mach-iop32x/iop3xx.h
new file mode 100644 (file)
index 0000000..46b4b34
--- /dev/null
@@ -0,0 +1,325 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Intel IOP32X and IOP33X register definitions
+ *
+ * Author: Rory Bolt <rorybolt@pacbell.net>
+ * Copyright (C) 2002 Rory Bolt
+ * Copyright (C) 2004 Intel Corp.
+ */
+
+#ifndef __IOP3XX_H
+#define __IOP3XX_H
+
+/*
+ * Peripherals that are shared between the iop32x and iop33x but
+ * located at different addresses.
+ */
+#define IOP3XX_TIMER_REG(reg)  (IOP3XX_PERIPHERAL_VIRT_BASE + 0x07e0 + (reg))
+
+#include "iop3xx.h"
+
+/* ATU Parameters
+ * set up a 1:1 bus to physical ram relationship
+ * w/ physical ram on top of pci in the memory map
+ */
+#define IOP32X_MAX_RAM_SIZE            0x40000000UL
+#define IOP3XX_MAX_RAM_SIZE            IOP32X_MAX_RAM_SIZE
+#define IOP3XX_PCI_LOWER_MEM_BA        0x80000000
+
+/*
+ * IOP3XX GPIO handling
+ */
+#define IOP3XX_GPIO_LINE(x)    (x)
+
+#ifndef __ASSEMBLY__
+extern int init_atu;
+extern int iop3xx_get_init_atu(void);
+#endif
+
+
+/*
+ * IOP3XX processor registers
+ */
+#define IOP3XX_PERIPHERAL_PHYS_BASE    0xffffe000
+#define IOP3XX_PERIPHERAL_VIRT_BASE    0xfedfe000
+#define IOP3XX_PERIPHERAL_SIZE         0x00002000
+#define IOP3XX_PERIPHERAL_UPPER_PA (IOP3XX_PERIPHERAL_PHYS_BASE +\
+                                       IOP3XX_PERIPHERAL_SIZE - 1)
+#define IOP3XX_PERIPHERAL_UPPER_VA (IOP3XX_PERIPHERAL_VIRT_BASE +\
+                                       IOP3XX_PERIPHERAL_SIZE - 1)
+#define IOP3XX_PMMR_PHYS_TO_VIRT(addr) (u32) ((u32) (addr) -\
+                                       (IOP3XX_PERIPHERAL_PHYS_BASE\
+                                       - IOP3XX_PERIPHERAL_VIRT_BASE))
+#define IOP3XX_REG_ADDR(reg)           (IOP3XX_PERIPHERAL_VIRT_BASE + (reg))
+
+/* Address Translation Unit  */
+#define IOP3XX_ATUVID          (volatile u16 *)IOP3XX_REG_ADDR(0x0100)
+#define IOP3XX_ATUDID          (volatile u16 *)IOP3XX_REG_ADDR(0x0102)
+#define IOP3XX_ATUCMD          (volatile u16 *)IOP3XX_REG_ADDR(0x0104)
+#define IOP3XX_ATUSR           (volatile u16 *)IOP3XX_REG_ADDR(0x0106)
+#define IOP3XX_ATURID          (volatile u8  *)IOP3XX_REG_ADDR(0x0108)
+#define IOP3XX_ATUCCR          (volatile u32 *)IOP3XX_REG_ADDR(0x0109)
+#define IOP3XX_ATUCLSR         (volatile u8  *)IOP3XX_REG_ADDR(0x010c)
+#define IOP3XX_ATULT           (volatile u8  *)IOP3XX_REG_ADDR(0x010d)
+#define IOP3XX_ATUHTR          (volatile u8  *)IOP3XX_REG_ADDR(0x010e)
+#define IOP3XX_ATUBIST         (volatile u8  *)IOP3XX_REG_ADDR(0x010f)
+#define IOP3XX_IABAR0          (volatile u32 *)IOP3XX_REG_ADDR(0x0110)
+#define IOP3XX_IAUBAR0         (volatile u32 *)IOP3XX_REG_ADDR(0x0114)
+#define IOP3XX_IABAR1          (volatile u32 *)IOP3XX_REG_ADDR(0x0118)
+#define IOP3XX_IAUBAR1         (volatile u32 *)IOP3XX_REG_ADDR(0x011c)
+#define IOP3XX_IABAR2          (volatile u32 *)IOP3XX_REG_ADDR(0x0120)
+#define IOP3XX_IAUBAR2         (volatile u32 *)IOP3XX_REG_ADDR(0x0124)
+#define IOP3XX_ASVIR           (volatile u16 *)IOP3XX_REG_ADDR(0x012c)
+#define IOP3XX_ASIR            (volatile u16 *)IOP3XX_REG_ADDR(0x012e)
+#define IOP3XX_ERBAR           (volatile u32 *)IOP3XX_REG_ADDR(0x0130)
+#define IOP3XX_ATUILR          (volatile u8  *)IOP3XX_REG_ADDR(0x013c)
+#define IOP3XX_ATUIPR          (volatile u8  *)IOP3XX_REG_ADDR(0x013d)
+#define IOP3XX_ATUMGNT         (volatile u8  *)IOP3XX_REG_ADDR(0x013e)
+#define IOP3XX_ATUMLAT         (volatile u8  *)IOP3XX_REG_ADDR(0x013f)
+#define IOP3XX_IALR0           (volatile u32 *)IOP3XX_REG_ADDR(0x0140)
+#define IOP3XX_IATVR0          (volatile u32 *)IOP3XX_REG_ADDR(0x0144)
+#define IOP3XX_ERLR            (volatile u32 *)IOP3XX_REG_ADDR(0x0148)
+#define IOP3XX_ERTVR           (volatile u32 *)IOP3XX_REG_ADDR(0x014c)
+#define IOP3XX_IALR1           (volatile u32 *)IOP3XX_REG_ADDR(0x0150)
+#define IOP3XX_IALR2           (volatile u32 *)IOP3XX_REG_ADDR(0x0154)
+#define IOP3XX_IATVR2          (volatile u32 *)IOP3XX_REG_ADDR(0x0158)
+#define IOP3XX_OIOWTVR         (volatile u32 *)IOP3XX_REG_ADDR(0x015c)
+#define IOP3XX_OMWTVR0         (volatile u32 *)IOP3XX_REG_ADDR(0x0160)
+#define IOP3XX_OUMWTVR0                (volatile u32 *)IOP3XX_REG_ADDR(0x0164)
+#define IOP3XX_OMWTVR1         (volatile u32 *)IOP3XX_REG_ADDR(0x0168)
+#define IOP3XX_OUMWTVR1                (volatile u32 *)IOP3XX_REG_ADDR(0x016c)
+#define IOP3XX_OUDWTVR         (volatile u32 *)IOP3XX_REG_ADDR(0x0178)
+#define IOP3XX_ATUCR           (volatile u32 *)IOP3XX_REG_ADDR(0x0180)
+#define IOP3XX_PCSR            (volatile u32 *)IOP3XX_REG_ADDR(0x0184)
+#define IOP3XX_ATUISR          (volatile u32 *)IOP3XX_REG_ADDR(0x0188)
+#define IOP3XX_ATUIMR          (volatile u32 *)IOP3XX_REG_ADDR(0x018c)
+#define IOP3XX_IABAR3          (volatile u32 *)IOP3XX_REG_ADDR(0x0190)
+#define IOP3XX_IAUBAR3         (volatile u32 *)IOP3XX_REG_ADDR(0x0194)
+#define IOP3XX_IALR3           (volatile u32 *)IOP3XX_REG_ADDR(0x0198)
+#define IOP3XX_IATVR3          (volatile u32 *)IOP3XX_REG_ADDR(0x019c)
+#define IOP3XX_OCCAR           (volatile u32 *)IOP3XX_REG_ADDR(0x01a4)
+#define IOP3XX_OCCDR           (volatile u32 *)IOP3XX_REG_ADDR(0x01ac)
+#define IOP3XX_PDSCR           (volatile u32 *)IOP3XX_REG_ADDR(0x01bc)
+#define IOP3XX_PMCAPID         (volatile u8  *)IOP3XX_REG_ADDR(0x01c0)
+#define IOP3XX_PMNEXT          (volatile u8  *)IOP3XX_REG_ADDR(0x01c1)
+#define IOP3XX_APMCR           (volatile u16 *)IOP3XX_REG_ADDR(0x01c2)
+#define IOP3XX_APMCSR          (volatile u16 *)IOP3XX_REG_ADDR(0x01c4)
+#define IOP3XX_PCIXCAPID       (volatile u8  *)IOP3XX_REG_ADDR(0x01e0)
+#define IOP3XX_PCIXNEXT                (volatile u8  *)IOP3XX_REG_ADDR(0x01e1)
+#define IOP3XX_PCIXCMD         (volatile u16 *)IOP3XX_REG_ADDR(0x01e2)
+#define IOP3XX_PCIXSR          (volatile u32 *)IOP3XX_REG_ADDR(0x01e4)
+#define IOP3XX_PCIIRSR         (volatile u32 *)IOP3XX_REG_ADDR(0x01ec)
+#define IOP3XX_PCSR_OUT_Q_BUSY (1 << 15)
+#define IOP3XX_PCSR_IN_Q_BUSY  (1 << 14)
+#define IOP3XX_ATUCR_OUT_EN    (1 << 1)
+
+#define IOP3XX_INIT_ATU_DEFAULT 0
+#define IOP3XX_INIT_ATU_DISABLE -1
+#define IOP3XX_INIT_ATU_ENABLE  1
+
+/* Messaging Unit  */
+#define IOP3XX_IMR0            (volatile u32 *)IOP3XX_REG_ADDR(0x0310)
+#define IOP3XX_IMR1            (volatile u32 *)IOP3XX_REG_ADDR(0x0314)
+#define IOP3XX_OMR0            (volatile u32 *)IOP3XX_REG_ADDR(0x0318)
+#define IOP3XX_OMR1            (volatile u32 *)IOP3XX_REG_ADDR(0x031c)
+#define IOP3XX_IDR             (volatile u32 *)IOP3XX_REG_ADDR(0x0320)
+#define IOP3XX_IISR            (volatile u32 *)IOP3XX_REG_ADDR(0x0324)
+#define IOP3XX_IIMR            (volatile u32 *)IOP3XX_REG_ADDR(0x0328)
+#define IOP3XX_ODR             (volatile u32 *)IOP3XX_REG_ADDR(0x032c)
+#define IOP3XX_OISR            (volatile u32 *)IOP3XX_REG_ADDR(0x0330)
+#define IOP3XX_OIMR            (volatile u32 *)IOP3XX_REG_ADDR(0x0334)
+#define IOP3XX_MUCR            (volatile u32 *)IOP3XX_REG_ADDR(0x0350)
+#define IOP3XX_QBAR            (volatile u32 *)IOP3XX_REG_ADDR(0x0354)
+#define IOP3XX_IFHPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0360)
+#define IOP3XX_IFTPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0364)
+#define IOP3XX_IPHPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0368)
+#define IOP3XX_IPTPR           (volatile u32 *)IOP3XX_REG_ADDR(0x036c)
+#define IOP3XX_OFHPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0370)
+#define IOP3XX_OFTPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0374)
+#define IOP3XX_OPHPR           (volatile u32 *)IOP3XX_REG_ADDR(0x0378)
+#define IOP3XX_OPTPR           (volatile u32 *)IOP3XX_REG_ADDR(0x037c)
+#define IOP3XX_IAR             (volatile u32 *)IOP3XX_REG_ADDR(0x0380)
+
+/* DMA Controller  */
+#define IOP3XX_DMA_PHYS_BASE(chan) (IOP3XX_PERIPHERAL_PHYS_BASE + \
+                                       (0x400 + (chan << 6)))
+#define IOP3XX_DMA_UPPER_PA(chan)  (IOP3XX_DMA_PHYS_BASE(chan) + 0x27)
+
+/* Peripheral bus interface  */
+#define IOP3XX_PBCR            (volatile u32 *)IOP3XX_REG_ADDR(0x0680)
+#define IOP3XX_PBISR           (volatile u32 *)IOP3XX_REG_ADDR(0x0684)
+#define IOP3XX_PBBAR0          (volatile u32 *)IOP3XX_REG_ADDR(0x0688)
+#define IOP3XX_PBLR0           (volatile u32 *)IOP3XX_REG_ADDR(0x068c)
+#define IOP3XX_PBBAR1          (volatile u32 *)IOP3XX_REG_ADDR(0x0690)
+#define IOP3XX_PBLR1           (volatile u32 *)IOP3XX_REG_ADDR(0x0694)
+#define IOP3XX_PBBAR2          (volatile u32 *)IOP3XX_REG_ADDR(0x0698)
+#define IOP3XX_PBLR2           (volatile u32 *)IOP3XX_REG_ADDR(0x069c)
+#define IOP3XX_PBBAR3          (volatile u32 *)IOP3XX_REG_ADDR(0x06a0)
+#define IOP3XX_PBLR3           (volatile u32 *)IOP3XX_REG_ADDR(0x06a4)
+#define IOP3XX_PBBAR4          (volatile u32 *)IOP3XX_REG_ADDR(0x06a8)
+#define IOP3XX_PBLR4           (volatile u32 *)IOP3XX_REG_ADDR(0x06ac)
+#define IOP3XX_PBBAR5          (volatile u32 *)IOP3XX_REG_ADDR(0x06b0)
+#define IOP3XX_PBLR5           (volatile u32 *)IOP3XX_REG_ADDR(0x06b4)
+#define IOP3XX_PMBR0           (volatile u32 *)IOP3XX_REG_ADDR(0x06c0)
+#define IOP3XX_PMBR1           (volatile u32 *)IOP3XX_REG_ADDR(0x06e0)
+#define IOP3XX_PMBR2           (volatile u32 *)IOP3XX_REG_ADDR(0x06e4)
+
+/* Peripheral performance monitoring unit  */
+#define IOP3XX_GTMR            (volatile u32 *)IOP3XX_REG_ADDR(0x0700)
+#define IOP3XX_ESR             (volatile u32 *)IOP3XX_REG_ADDR(0x0704)
+#define IOP3XX_EMISR           (volatile u32 *)IOP3XX_REG_ADDR(0x0708)
+#define IOP3XX_GTSR            (volatile u32 *)IOP3XX_REG_ADDR(0x0710)
+/* PERCR0 DOESN'T EXIST - index from 1! */
+#define IOP3XX_PERCR0          (volatile u32 *)IOP3XX_REG_ADDR(0x0710)
+
+/* Timers  */
+#define IOP3XX_TU_TMR0         (volatile u32 *)IOP3XX_TIMER_REG(0x0000)
+#define IOP3XX_TU_TMR1         (volatile u32 *)IOP3XX_TIMER_REG(0x0004)
+#define IOP3XX_TU_TCR0         (volatile u32 *)IOP3XX_TIMER_REG(0x0008)
+#define IOP3XX_TU_TCR1         (volatile u32 *)IOP3XX_TIMER_REG(0x000c)
+#define IOP3XX_TU_TRR0         (volatile u32 *)IOP3XX_TIMER_REG(0x0010)
+#define IOP3XX_TU_TRR1         (volatile u32 *)IOP3XX_TIMER_REG(0x0014)
+#define IOP3XX_TU_TISR         (volatile u32 *)IOP3XX_TIMER_REG(0x0018)
+#define IOP3XX_TU_WDTCR                (volatile u32 *)IOP3XX_TIMER_REG(0x001c)
+#define IOP_TMR_EN         0x02
+#define IOP_TMR_RELOAD     0x04
+#define IOP_TMR_PRIVILEGED 0x08
+#define IOP_TMR_RATIO_1_1  0x00
+
+/* Watchdog timer definitions */
+#define IOP_WDTCR_EN_ARM        0x1e1e1e1e
+#define IOP_WDTCR_EN            0xe1e1e1e1
+/* iop3xx does not support stopping the watchdog, so we just re-arm */
+#define IOP_WDTCR_DIS_ARM      (IOP_WDTCR_EN_ARM)
+#define IOP_WDTCR_DIS          (IOP_WDTCR_EN)
+
+/* Application accelerator unit  */
+#define IOP3XX_AAU_PHYS_BASE (IOP3XX_PERIPHERAL_PHYS_BASE + 0x800)
+#define IOP3XX_AAU_UPPER_PA (IOP3XX_AAU_PHYS_BASE + 0xa7)
+
+/* I2C bus interface unit  */
+#define IOP3XX_ICR0            (volatile u32 *)IOP3XX_REG_ADDR(0x1680)
+#define IOP3XX_ISR0            (volatile u32 *)IOP3XX_REG_ADDR(0x1684)
+#define IOP3XX_ISAR0           (volatile u32 *)IOP3XX_REG_ADDR(0x1688)
+#define IOP3XX_IDBR0           (volatile u32 *)IOP3XX_REG_ADDR(0x168c)
+#define IOP3XX_IBMR0           (volatile u32 *)IOP3XX_REG_ADDR(0x1694)
+#define IOP3XX_ICR1            (volatile u32 *)IOP3XX_REG_ADDR(0x16a0)
+#define IOP3XX_ISR1            (volatile u32 *)IOP3XX_REG_ADDR(0x16a4)
+#define IOP3XX_ISAR1           (volatile u32 *)IOP3XX_REG_ADDR(0x16a8)
+#define IOP3XX_IDBR1           (volatile u32 *)IOP3XX_REG_ADDR(0x16ac)
+#define IOP3XX_IBMR1           (volatile u32 *)IOP3XX_REG_ADDR(0x16b4)
+
+
+/*
+ * IOP3XX I/O and Mem space regions for PCI autoconfiguration
+ */
+#define IOP3XX_PCI_LOWER_MEM_PA        0x80000000
+#define IOP3XX_PCI_MEM_WINDOW_SIZE     0x08000000
+
+#define IOP3XX_PCI_LOWER_IO_PA         0x90000000
+#define IOP3XX_PCI_LOWER_IO_BA         0x00000000
+
+#ifndef __ASSEMBLY__
+
+#include <linux/types.h>
+#include <linux/reboot.h>
+
+void iop3xx_map_io(void);
+void iop_init_cp6_handler(void);
+void iop_init_time(unsigned long tickrate);
+void iop3xx_restart(enum reboot_mode, const char *);
+
+static inline u32 read_tmr0(void)
+{
+       u32 val;
+       asm volatile("mrc p6, 0, %0, c0, c1, 0" : "=r" (val));
+       return val;
+}
+
+static inline void write_tmr0(u32 val)
+{
+       asm volatile("mcr p6, 0, %0, c0, c1, 0" : : "r" (val));
+}
+
+static inline void write_tmr1(u32 val)
+{
+       asm volatile("mcr p6, 0, %0, c1, c1, 0" : : "r" (val));
+}
+
+static inline u32 read_tcr0(void)
+{
+       u32 val;
+       asm volatile("mrc p6, 0, %0, c2, c1, 0" : "=r" (val));
+       return val;
+}
+
+static inline void write_tcr0(u32 val)
+{
+       asm volatile("mcr p6, 0, %0, c2, c1, 0" : : "r" (val));
+}
+
+static inline u32 read_tcr1(void)
+{
+       u32 val;
+       asm volatile("mrc p6, 0, %0, c3, c1, 0" : "=r" (val));
+       return val;
+}
+
+static inline void write_tcr1(u32 val)
+{
+       asm volatile("mcr p6, 0, %0, c3, c1, 0" : : "r" (val));
+}
+
+static inline void write_trr0(u32 val)
+{
+       asm volatile("mcr p6, 0, %0, c4, c1, 0" : : "r" (val));
+}
+
+static inline void write_trr1(u32 val)
+{
+       asm volatile("mcr p6, 0, %0, c5, c1, 0" : : "r" (val));
+}
+
+static inline void write_tisr(u32 val)
+{
+       asm volatile("mcr p6, 0, %0, c6, c1, 0" : : "r" (val));
+}
+
+static inline u32 read_wdtcr(void)
+{
+       u32 val;
+       asm volatile("mrc p6, 0, %0, c7, c1, 0":"=r" (val));
+       return val;
+}
+static inline void write_wdtcr(u32 val)
+{
+       asm volatile("mcr p6, 0, %0, c7, c1, 0"::"r" (val));
+}
+
+extern unsigned long get_iop_tick_rate(void);
+
+/* only iop13xx has these registers, we define these to present a
+ * common register interface for the iop_wdt driver.
+ */
+#define IOP_RCSR_WDT   (0)
+static inline u32 read_rcsr(void)
+{
+       return 0;
+}
+static inline void write_wdtsr(u32 val)
+{
+       do { } while (0);
+}
+
+extern struct platform_device iop3xx_dma_0_channel;
+extern struct platform_device iop3xx_dma_1_channel;
+extern struct platform_device iop3xx_aau_channel;
+extern struct platform_device iop3xx_i2c0_device;
+extern struct platform_device iop3xx_i2c1_device;
+extern struct gpiod_lookup_table iop3xx_i2c0_gpio_lookup;
+extern struct gpiod_lookup_table iop3xx_i2c1_gpio_lookup;
+
+#endif
+
+
+#endif
index 8755aa8..04a7d38 100644 (file)
@@ -23,7 +23,6 @@
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/gpio/machine.h>
-#include <mach/hardware.h>
 #include <asm/cputype.h>
 #include <asm/irq.h>
 #include <asm/mach/arch.h>
@@ -33,7 +32,9 @@
 #include <asm/mach-types.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
-#include <mach/time.h>
+
+#include "hardware.h"
+#include "irqs.h"
 #include "gpio-iop32x.h"
 
 /*
diff --git a/arch/arm/mach-iop32x/iq31244.h b/arch/arm/mach-iop32x/iq31244.h
new file mode 100644 (file)
index 0000000..a7ac691
--- /dev/null
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Intel IQ31244 evaluation board registers
+ */
+
+#ifndef __IQ31244_H
+#define __IQ31244_H
+
+#define IQ31244_UART           0xfe800000      /* UART #1 */
+#define IQ31244_7SEG_1         0xfe840000      /* 7-Segment MSB */
+#define IQ31244_7SEG_0         0xfe850000      /* 7-Segment LSB (WO) */
+#define IQ31244_ROTARY_SW      0xfe8d0000      /* Rotary Switch */
+#define IQ31244_BATT_STAT      0xfe8f0000      /* Battery Status */
+
+
+#endif
index e12699d..4bd596d 100644 (file)
@@ -20,7 +20,6 @@
 #include <linux/platform_device.h>
 #include <linux/io.h>
 #include <linux/gpio/machine.h>
-#include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
@@ -29,7 +28,9 @@
 #include <asm/mach-types.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
-#include <mach/time.h>
+
+#include "hardware.h"
+#include "irqs.h"
 #include "gpio-iop32x.h"
 
 /*
diff --git a/arch/arm/mach-iop32x/iq80321.h b/arch/arm/mach-iop32x/iq80321.h
new file mode 100644 (file)
index 0000000..3a5d106
--- /dev/null
@@ -0,0 +1,16 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Intel IQ80321 evaluation board registers
+ */
+
+#ifndef __IQ80321_H
+#define __IQ80321_H
+
+#define IQ80321_UART           0xfe800000      /* UART #1 */
+#define IQ80321_7SEG_1         0xfe840000      /* 7-Segment MSB */
+#define IQ80321_7SEG_0         0xfe850000      /* 7-Segment LSB (WO) */
+#define IQ80321_ROTARY_SW      0xfe8d0000      /* Rotary Switch */
+#define IQ80321_BATT_STAT      0xfe8f0000      /* Battery Status */
+
+
+#endif
index 2f5d4ec..2d48bf1 100644 (file)
 #include <linux/list.h>
 #include <asm/mach/irq.h>
 #include <asm/irq.h>
-#include <mach/hardware.h>
 #include <asm/mach-types.h>
 
+#include "hardware.h"
+
 static u32 iop32x_mask;
 
 static void intctl_write(u32 val)
diff --git a/arch/arm/mach-iop32x/irqs.h b/arch/arm/mach-iop32x/irqs.h
new file mode 100644 (file)
index 0000000..69858e4
--- /dev/null
@@ -0,0 +1,42 @@
+/* SPDX-License-Identifier: GPL-2.0-only */
+/*
+ * Author:     Rory Bolt <rorybolt@pacbell.net>
+ * Copyright:  (C) 2002 Rory Bolt
+ */
+
+#ifndef __IOP32X_IRQS_H
+#define __IOP32X_IRQS_H
+
+/*
+ * IOP80321 chipset interrupts
+ */
+#define IRQ_IOP32X_DMA0_EOT    0
+#define IRQ_IOP32X_DMA0_EOC    1
+#define IRQ_IOP32X_DMA1_EOT    2
+#define IRQ_IOP32X_DMA1_EOC    3
+#define IRQ_IOP32X_AA_EOT      6
+#define IRQ_IOP32X_AA_EOC      7
+#define IRQ_IOP32X_CORE_PMON   8
+#define IRQ_IOP32X_TIMER0      9
+#define IRQ_IOP32X_TIMER1      10
+#define IRQ_IOP32X_I2C_0       11
+#define IRQ_IOP32X_I2C_1       12
+#define IRQ_IOP32X_MESSAGING   13
+#define IRQ_IOP32X_ATU_BIST    14
+#define IRQ_IOP32X_PERFMON     15
+#define IRQ_IOP32X_CORE_PMU    16
+#define IRQ_IOP32X_BIU_ERR     17
+#define IRQ_IOP32X_ATU_ERR     18
+#define IRQ_IOP32X_MCU_ERR     19
+#define IRQ_IOP32X_DMA0_ERR    20
+#define IRQ_IOP32X_DMA1_ERR    21
+#define IRQ_IOP32X_AA_ERR      23
+#define IRQ_IOP32X_MSG_ERR     24
+#define IRQ_IOP32X_SSP         25
+#define IRQ_IOP32X_XINT0       27
+#define IRQ_IOP32X_XINT1       28
+#define IRQ_IOP32X_XINT2       29
+#define IRQ_IOP32X_XINT3       30
+#define IRQ_IOP32X_HPI         31
+
+#endif
index 26d76b3..5382a93 100644 (file)
@@ -28,7 +28,6 @@
 #include <linux/io.h>
 #include <linux/gpio.h>
 #include <linux/gpio/machine.h>
-#include <mach/hardware.h>
 #include <asm/irq.h>
 #include <asm/mach/arch.h>
 #include <asm/mach/map.h>
@@ -37,7 +36,9 @@
 #include <asm/mach-types.h>
 #include <asm/page.h>
 #include <asm/pgtable.h>
-#include <mach/time.h>
+
+#include "hardware.h"
+#include "irqs.h"
 #include "gpio-iop32x.h"
 
 /*
diff --git a/arch/arm/mach-iop32x/n2100.h b/arch/arm/mach-iop32x/n2100.h
new file mode 100644 (file)
index 0000000..0b97b94
--- /dev/null
@@ -0,0 +1,18 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * Thecus N2100 board registers
+ */
+
+#ifndef __N2100_H
+#define __N2100_H
+
+#define N2100_UART             0xfe800000      /* UART */
+
+#define N2100_COPY_BUTTON      IOP3XX_GPIO_LINE(0)
+#define N2100_PCA9532_RESET    IOP3XX_GPIO_LINE(2)
+#define N2100_RESET_BUTTON     IOP3XX_GPIO_LINE(3)
+#define N2100_HARDWARE_RESET   IOP3XX_GPIO_LINE(4)
+#define N2100_POWER_BUTTON     IOP3XX_GPIO_LINE(5)
+
+
+#endif
diff --git a/arch/arm/mach-iop32x/pci.c b/arch/arm/mach-iop32x/pci.c
new file mode 100644 (file)
index 0000000..ab0010d
--- /dev/null
@@ -0,0 +1,401 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * arch/arm/plat-iop/pci.c
+ *
+ * PCI support for the Intel IOP32X and IOP33X processors
+ *
+ * Author: Rory Bolt <rorybolt@pacbell.net>
+ * Copyright (C) 2002 Rory Bolt
+ */
+
+#include <linux/kernel.h>
+#include <linux/pci.h>
+#include <linux/slab.h>
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <linux/ioport.h>
+#include <linux/io.h>
+#include <asm/irq.h>
+#include <asm/signal.h>
+#include <asm/mach/pci.h>
+#include "hardware.h"
+#include "iop3xx.h"
+
+// #define DEBUG
+
+#ifdef DEBUG
+#define  DBG(x...) printk(x)
+#else
+#define  DBG(x...) do { } while (0)
+#endif
+
+/*
+ * This routine builds either a type0 or type1 configuration command.  If the
+ * bus is on the 803xx then a type0 made, else a type1 is created.
+ */
+static u32 iop3xx_cfg_address(struct pci_bus *bus, int devfn, int where)
+{
+       struct pci_sys_data *sys = bus->sysdata;
+       u32 addr;
+
+       if (sys->busnr == bus->number)
+               addr = 1 << (PCI_SLOT(devfn) + 16) | (PCI_SLOT(devfn) << 11);
+       else
+               addr = bus->number << 16 | PCI_SLOT(devfn) << 11 | 1;
+
+       addr |= PCI_FUNC(devfn) << 8 | (where & ~3);
+
+       return addr;
+}
+
+/*
+ * This routine checks the status of the last configuration cycle.  If an error
+ * was detected it returns a 1, else it returns a 0.  The errors being checked
+ * are parity, master abort, target abort (master and target).  These types of
+ * errors occur during a config cycle where there is no device, like during
+ * the discovery stage.
+ */
+static int iop3xx_pci_status(void)
+{
+       unsigned int status;
+       int ret = 0;
+
+       /*
+        * Check the status registers.
+        */
+       status = *IOP3XX_ATUSR;
+       if (status & 0xf900) {
+               DBG("\t\t\tPCI: P0 - status = 0x%08x\n", status);
+               *IOP3XX_ATUSR = status & 0xf900;
+               ret = 1;
+       }
+
+       status = *IOP3XX_ATUISR;
+       if (status & 0x679f) {
+               DBG("\t\t\tPCI: P1 - status = 0x%08x\n", status);
+               *IOP3XX_ATUISR = status & 0x679f;
+               ret = 1;
+       }
+
+       return ret;
+}
+
+/*
+ * Simply write the address register and read the configuration
+ * data.  Note that the 4 nops ensure that we are able to handle
+ * a delayed abort (in theory.)
+ */
+static u32 iop3xx_read(unsigned long addr)
+{
+       u32 val;
+
+       __asm__ __volatile__(
+               "str    %1, [%2]\n\t"
+               "ldr    %0, [%3]\n\t"
+               "nop\n\t"
+               "nop\n\t"
+               "nop\n\t"
+               "nop\n\t"
+               : "=r" (val)
+               : "r" (addr), "r" (IOP3XX_OCCAR), "r" (IOP3XX_OCCDR));
+
+       return val;
+}
+
+/*
+ * The read routines must check the error status of the last configuration
+ * cycle.  If there was an error, the routine returns all hex f's.
+ */
+static int
+iop3xx_read_config(struct pci_bus *bus, unsigned int devfn, int where,
+               int size, u32 *value)
+{
+       unsigned long addr = iop3xx_cfg_address(bus, devfn, where);
+       u32 val = iop3xx_read(addr) >> ((where & 3) * 8);
+
+       if (iop3xx_pci_status())
+               val = 0xffffffff;
+
+       *value = val;
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+static int
+iop3xx_write_config(struct pci_bus *bus, unsigned int devfn, int where,
+               int size, u32 value)
+{
+       unsigned long addr = iop3xx_cfg_address(bus, devfn, where);
+       u32 val;
+
+       if (size != 4) {
+               val = iop3xx_read(addr);
+               if (iop3xx_pci_status())
+                       return PCIBIOS_SUCCESSFUL;
+
+               where = (where & 3) * 8;
+
+               if (size == 1)
+                       val &= ~(0xff << where);
+               else
+                       val &= ~(0xffff << where);
+
+               *IOP3XX_OCCDR = val | value << where;
+       } else {
+               asm volatile(
+                       "str    %1, [%2]\n\t"
+                       "str    %0, [%3]\n\t"
+                       "nop\n\t"
+                       "nop\n\t"
+                       "nop\n\t"
+                       "nop\n\t"
+                       :
+                       : "r" (value), "r" (addr),
+                         "r" (IOP3XX_OCCAR), "r" (IOP3XX_OCCDR));
+       }
+
+       return PCIBIOS_SUCCESSFUL;
+}
+
+struct pci_ops iop3xx_ops = {
+       .read   = iop3xx_read_config,
+       .write  = iop3xx_write_config,
+};
+
+/*
+ * When a PCI device does not exist during config cycles, the 80200 gets a
+ * bus error instead of returning 0xffffffff. This handler simply returns.
+ */
+static int
+iop3xx_pci_abort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
+{
+       DBG("PCI abort: address = 0x%08lx fsr = 0x%03x PC = 0x%08lx LR = 0x%08lx\n",
+               addr, fsr, regs->ARM_pc, regs->ARM_lr);
+
+       /*
+        * If it was an imprecise abort, then we need to correct the
+        * return address to be _after_ the instruction.
+        */
+       if (fsr & (1 << 10))
+               regs->ARM_pc += 4;
+
+       return 0;
+}
+
+int iop3xx_pci_setup(int nr, struct pci_sys_data *sys)
+{
+       struct resource *res;
+
+       if (nr != 0)
+               return 0;
+
+       res = kzalloc(sizeof(struct resource), GFP_KERNEL);
+       if (!res)
+               panic("PCI: unable to alloc resources");
+
+       res->start = IOP3XX_PCI_LOWER_MEM_PA;
+       res->end   = IOP3XX_PCI_LOWER_MEM_PA + IOP3XX_PCI_MEM_WINDOW_SIZE - 1;
+       res->name  = "IOP3XX PCI Memory Space";
+       res->flags = IORESOURCE_MEM;
+       request_resource(&iomem_resource, res);
+
+       /*
+        * Use whatever translation is already setup.
+        */
+       sys->mem_offset = IOP3XX_PCI_LOWER_MEM_PA - *IOP3XX_OMWTVR0;
+
+       pci_add_resource_offset(&sys->resources, res, sys->mem_offset);
+
+       pci_ioremap_io(0, IOP3XX_PCI_LOWER_IO_PA);
+
+       return 1;
+}
+
+void __init iop3xx_atu_setup(void)
+{
+       /* BAR 0 ( Disabled ) */
+       *IOP3XX_IAUBAR0 = 0x0;
+       *IOP3XX_IABAR0  = 0x0;
+       *IOP3XX_IATVR0  = 0x0;
+       *IOP3XX_IALR0   = 0x0;
+
+       /* BAR 1 ( Disabled ) */
+       *IOP3XX_IAUBAR1 = 0x0;
+       *IOP3XX_IABAR1  = 0x0;
+       *IOP3XX_IALR1   = 0x0;
+
+       /* BAR 2 (1:1 mapping with Physical RAM) */
+       /* Set limit and enable */
+       *IOP3XX_IALR2 = ~((u32)IOP3XX_MAX_RAM_SIZE - 1) & ~0x1;
+       *IOP3XX_IAUBAR2 = 0x0;
+
+       /* Align the inbound bar with the base of memory */
+       *IOP3XX_IABAR2 = PHYS_OFFSET |
+                              PCI_BASE_ADDRESS_MEM_TYPE_64 |
+                              PCI_BASE_ADDRESS_MEM_PREFETCH;
+
+       *IOP3XX_IATVR2 = PHYS_OFFSET;
+
+       /* Outbound window 0 */
+       *IOP3XX_OMWTVR0 = IOP3XX_PCI_LOWER_MEM_BA;
+       *IOP3XX_OUMWTVR0 = 0;
+
+       /* Outbound window 1 */
+       *IOP3XX_OMWTVR1 = IOP3XX_PCI_LOWER_MEM_BA +
+                         IOP3XX_PCI_MEM_WINDOW_SIZE / 2;
+       *IOP3XX_OUMWTVR1 = 0;
+
+       /* BAR 3 ( Disabled ) */
+       *IOP3XX_IAUBAR3 = 0x0;
+       *IOP3XX_IABAR3  = 0x0;
+       *IOP3XX_IATVR3  = 0x0;
+       *IOP3XX_IALR3   = 0x0;
+
+       /* Setup the I/O Bar
+        */
+       *IOP3XX_OIOWTVR = IOP3XX_PCI_LOWER_IO_BA;
+
+       /* Enable inbound and outbound cycles
+        */
+       *IOP3XX_ATUCMD |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
+                              PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
+       *IOP3XX_ATUCR |= IOP3XX_ATUCR_OUT_EN;
+}
+
+void __init iop3xx_atu_disable(void)
+{
+       *IOP3XX_ATUCMD = 0;
+       *IOP3XX_ATUCR = 0;
+
+       /* wait for cycles to quiesce */
+       while (*IOP3XX_PCSR & (IOP3XX_PCSR_OUT_Q_BUSY |
+                                    IOP3XX_PCSR_IN_Q_BUSY))
+               cpu_relax();
+
+       /* BAR 0 ( Disabled ) */
+       *IOP3XX_IAUBAR0 = 0x0;
+       *IOP3XX_IABAR0  = 0x0;
+       *IOP3XX_IATVR0  = 0x0;
+       *IOP3XX_IALR0   = 0x0;
+
+       /* BAR 1 ( Disabled ) */
+       *IOP3XX_IAUBAR1 = 0x0;
+       *IOP3XX_IABAR1  = 0x0;
+       *IOP3XX_IALR1   = 0x0;
+
+       /* BAR 2 ( Disabled ) */
+       *IOP3XX_IAUBAR2 = 0x0;
+       *IOP3XX_IABAR2  = 0x0;
+       *IOP3XX_IATVR2  = 0x0;
+       *IOP3XX_IALR2   = 0x0;
+
+       /* BAR 3 ( Disabled ) */
+       *IOP3XX_IAUBAR3 = 0x0;
+       *IOP3XX_IABAR3  = 0x0;
+       *IOP3XX_IATVR3  = 0x0;
+       *IOP3XX_IALR3   = 0x0;
+
+       /* Clear the outbound windows */
+       *IOP3XX_OIOWTVR  = 0;
+
+       /* Outbound window 0 */
+       *IOP3XX_OMWTVR0 = 0;
+       *IOP3XX_OUMWTVR0 = 0;
+
+       /* Outbound window 1 */
+       *IOP3XX_OMWTVR1 = 0;
+       *IOP3XX_OUMWTVR1 = 0;
+}
+
+/* Flag to determine whether the ATU is initialized and the PCI bus scanned */
+int init_atu;
+
+int iop3xx_get_init_atu(void) {
+       /* check if default has been overridden */
+       if (init_atu != IOP3XX_INIT_ATU_DEFAULT)
+               return init_atu;
+       else
+               return IOP3XX_INIT_ATU_DISABLE;
+}
+
+static void __init iop3xx_atu_debug(void)
+{
+       DBG("PCI: Intel IOP3xx PCI init.\n");
+       DBG("PCI: Outbound memory window 0: PCI 0x%08x%08x\n",
+               *IOP3XX_OUMWTVR0, *IOP3XX_OMWTVR0);
+       DBG("PCI: Outbound memory window 1: PCI 0x%08x%08x\n",
+               *IOP3XX_OUMWTVR1, *IOP3XX_OMWTVR1);
+       DBG("PCI: Outbound IO window: PCI 0x%08x\n",
+               *IOP3XX_OIOWTVR);
+
+       DBG("PCI: Inbound memory window 0: PCI 0x%08x%08x 0x%08x -> 0x%08x\n",
+               *IOP3XX_IAUBAR0, *IOP3XX_IABAR0, *IOP3XX_IALR0, *IOP3XX_IATVR0);
+       DBG("PCI: Inbound memory window 1: PCI 0x%08x%08x 0x%08x\n",
+               *IOP3XX_IAUBAR1, *IOP3XX_IABAR1, *IOP3XX_IALR1);
+       DBG("PCI: Inbound memory window 2: PCI 0x%08x%08x 0x%08x -> 0x%08x\n",
+               *IOP3XX_IAUBAR2, *IOP3XX_IABAR2, *IOP3XX_IALR2, *IOP3XX_IATVR2);
+       DBG("PCI: Inbound memory window 3: PCI 0x%08x%08x 0x%08x -> 0x%08x\n",
+               *IOP3XX_IAUBAR3, *IOP3XX_IABAR3, *IOP3XX_IALR3, *IOP3XX_IATVR3);
+
+       DBG("PCI: Expansion ROM window: PCI 0x%08x%08x 0x%08x -> 0x%08x\n",
+               0, *IOP3XX_ERBAR, *IOP3XX_ERLR, *IOP3XX_ERTVR);
+
+       DBG("ATU: IOP3XX_ATUCMD=0x%04x\n", *IOP3XX_ATUCMD);
+       DBG("ATU: IOP3XX_ATUCR=0x%08x\n", *IOP3XX_ATUCR);
+
+       hook_fault_code(16+6, iop3xx_pci_abort, SIGBUS, 0, "imprecise external abort");
+}
+
+/* for platforms that might be host-bus-adapters */
+void __init iop3xx_pci_preinit_cond(void)
+{
+       if (iop3xx_get_init_atu() == IOP3XX_INIT_ATU_ENABLE) {
+               iop3xx_atu_disable();
+               iop3xx_atu_setup();
+               iop3xx_atu_debug();
+       }
+}
+
+void __init iop3xx_pci_preinit(void)
+{
+       pcibios_min_mem = 0;
+
+       iop3xx_atu_disable();
+       iop3xx_atu_setup();
+       iop3xx_atu_debug();
+}
+
+/* allow init_atu to be user overridden */
+static int __init iop3xx_init_atu_setup(char *str)
+{
+       init_atu = IOP3XX_INIT_ATU_DEFAULT;
+       if (str) {
+               while (*str != '\0') {
+                       switch (*str) {
+                       case 'y':
+                       case 'Y':
+                               init_atu = IOP3XX_INIT_ATU_ENABLE;
+                               break;
+                       case 'n':
+                       case 'N':
+                               init_atu = IOP3XX_INIT_ATU_DISABLE;
+                               break;
+                       case ',':
+                       case '=':
+                               break;
+                       default:
+                               printk(KERN_DEBUG "\"%s\" malformed at "
+                                           "character: \'%c\'",
+                                           __func__,
+                                           *str);
+                               *(str + 1) = '\0';
+                       }
+                       str++;
+               }
+       }
+
+       return 1;
+}
+
+__setup("iop3xx_init_atu", iop3xx_init_atu_setup);
+
diff --git a/arch/arm/mach-iop32x/pmu.c b/arch/arm/mach-iop32x/pmu.c
new file mode 100644 (file)
index 0000000..bdbc7a3
--- /dev/null
@@ -0,0 +1,29 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * PMU IRQ registration for the iop3xx xscale PMU families.
+ * Copyright (C) 2010 Will Deacon, ARM Ltd.
+ */
+
+#include <linux/platform_device.h>
+#include "irqs.h"
+
+static struct resource pmu_resource = {
+       .start  = IRQ_IOP32X_CORE_PMU,
+       .end    = IRQ_IOP32X_CORE_PMU,
+       .flags  = IORESOURCE_IRQ,
+};
+
+static struct platform_device pmu_device = {
+       .name           = "xscale-pmu",
+       .id             = -1,
+       .resource       = &pmu_resource,
+       .num_resources  = 1,
+};
+
+static int __init iop3xx_pmu_init(void)
+{
+       platform_device_register(&pmu_device);
+       return 0;
+}
+
+arch_initcall(iop3xx_pmu_init);
diff --git a/arch/arm/mach-iop32x/restart.c b/arch/arm/mach-iop32x/restart.c
new file mode 100644 (file)
index 0000000..3dfa54d
--- /dev/null
@@ -0,0 +1,17 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * restart.c
+ *
+ * Copyright (C) 2001 MontaVista Software, Inc.
+ */
+#include <asm/system_misc.h>
+#include "hardware.h"
+#include "iop3xx.h"
+
+void iop3xx_restart(enum reboot_mode mode, const char *cmd)
+{
+       *IOP3XX_PCSR = 0x30;
+
+       /* Jump into ROM at address 0 */
+       soft_restart(0);
+}
diff --git a/arch/arm/mach-iop32x/setup.c b/arch/arm/mach-iop32x/setup.c
new file mode 100644 (file)
index 0000000..a0a81c2
--- /dev/null
@@ -0,0 +1,31 @@
+// SPDX-License-Identifier: GPL-2.0-only
+/*
+ * arch/arm/plat-iop/setup.c
+ *
+ * Author: Nicolas Pitre <nico@fluxnic.net>
+ * Copyright (C) 2001 MontaVista Software, Inc.
+ * Copyright (C) 2004 Intel Corporation.
+ */
+
+#include <linux/mm.h>
+#include <linux/init.h>
+#include <asm/mach/map.h>
+#include "iop3xx.h"
+
+/*
+ * Standard IO mapping for all IOP3xx based systems.  Note that
+ * the IOP3xx OCCDR must be mapped uncached and unbuffered.
+ */
+static struct map_desc iop3xx_std_desc[] __initdata = {
+       {       /* mem mapped registers */
+               .virtual        = IOP3XX_PERIPHERAL_VIRT_BASE,
+               .pfn            = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE),
+               .length         = IOP3XX_PERIPHERAL_SIZE,
+               .type           = MT_UNCACHED,
+       },
+};
+
+void __init iop3xx_map_io(void)
+{
+       iotable_init(iop3xx_std_desc, ARRAY_SIZE(iop3xx_std_desc));
+}
diff --git a/arch/arm/mach-iop32x/time.c b/arch/arm/mach-iop32x/time.c
new file mode 100644 (file)
index 0000000..18a4df5
--- /dev/null
@@ -0,0 +1,183 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * arch/arm/plat-iop/time.c
+ *
+ * Timer code for IOP32x and IOP33x based systems
+ *
+ * Author: Deepak Saxena <dsaxena@mvista.com>
+ *
+ * Copyright 2002-2003 MontaVista Software Inc.
+ */
+
+#include <linux/kernel.h>
+#include <linux/interrupt.h>
+#include <linux/time.h>
+#include <linux/init.h>
+#include <linux/timex.h>
+#include <linux/io.h>
+#include <linux/clocksource.h>
+#include <linux/clockchips.h>
+#include <linux/export.h>
+#include <linux/sched_clock.h>
+#include <asm/irq.h>
+#include <linux/uaccess.h>
+#include <asm/mach/irq.h>
+#include <asm/mach/time.h>
+
+#include "hardware.h"
+#include "irqs.h"
+
+/*
+ * Minimum clocksource/clockevent timer range in seconds
+ */
+#define IOP_MIN_RANGE 4
+
+/*
+ * IOP clocksource (free-running timer 1).
+ */
+static u64 notrace iop_clocksource_read(struct clocksource *unused)
+{
+       return 0xffffffffu - read_tcr1();
+}
+
+static struct clocksource iop_clocksource = {
+       .name           = "iop_timer1",
+       .rating         = 300,
+       .read           = iop_clocksource_read,
+       .mask           = CLOCKSOURCE_MASK(32),
+       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
+};
+
+/*
+ * IOP sched_clock() implementation via its clocksource.
+ */
+static u64 notrace iop_read_sched_clock(void)
+{
+       return 0xffffffffu - read_tcr1();
+}
+
+/*
+ * IOP clockevents (interrupting timer 0).
+ */
+static int iop_set_next_event(unsigned long delta,
+                             struct clock_event_device *unused)
+{
+       u32 tmr = IOP_TMR_PRIVILEGED | IOP_TMR_RATIO_1_1;
+
+       BUG_ON(delta == 0);
+       write_tmr0(tmr & ~(IOP_TMR_EN | IOP_TMR_RELOAD));
+       write_tcr0(delta);
+       write_tmr0((tmr & ~IOP_TMR_RELOAD) | IOP_TMR_EN);
+
+       return 0;
+}
+
+static unsigned long ticks_per_jiffy;
+
+static int iop_set_periodic(struct clock_event_device *evt)
+{
+       u32 tmr = read_tmr0();
+
+       write_tmr0(tmr & ~IOP_TMR_EN);
+       write_tcr0(ticks_per_jiffy - 1);
+       write_trr0(ticks_per_jiffy - 1);
+       tmr |= (IOP_TMR_RELOAD | IOP_TMR_EN);
+
+       write_tmr0(tmr);
+       return 0;
+}
+
+static int iop_set_oneshot(struct clock_event_device *evt)
+{
+       u32 tmr = read_tmr0();
+
+       /* ->set_next_event sets period and enables timer */
+       tmr &= ~(IOP_TMR_RELOAD | IOP_TMR_EN);
+       write_tmr0(tmr);
+       return 0;
+}
+
+static int iop_shutdown(struct clock_event_device *evt)
+{
+       u32 tmr = read_tmr0();
+
+       tmr &= ~IOP_TMR_EN;
+       write_tmr0(tmr);
+       return 0;
+}
+
+static int iop_resume(struct clock_event_device *evt)
+{
+       u32 tmr = read_tmr0();
+
+       tmr |= IOP_TMR_EN;
+       write_tmr0(tmr);
+       return 0;
+}
+
+static struct clock_event_device iop_clockevent = {
+       .name                   = "iop_timer0",
+       .features               = CLOCK_EVT_FEAT_PERIODIC |
+                                 CLOCK_EVT_FEAT_ONESHOT,
+       .rating                 = 300,
+       .set_next_event         = iop_set_next_event,
+       .set_state_shutdown     = iop_shutdown,
+       .set_state_periodic     = iop_set_periodic,
+       .tick_resume            = iop_resume,
+       .set_state_oneshot      = iop_set_oneshot,
+};
+
+static irqreturn_t
+iop_timer_interrupt(int irq, void *dev_id)
+{
+       struct clock_event_device *evt = dev_id;
+
+       write_tisr(1);
+       evt->event_handler(evt);
+       return IRQ_HANDLED;
+}
+
+static struct irqaction iop_timer_irq = {
+       .name           = "IOP Timer Tick",
+       .handler        = iop_timer_interrupt,
+       .flags          = IRQF_TIMER | IRQF_IRQPOLL,
+       .dev_id         = &iop_clockevent,
+};
+
+static unsigned long iop_tick_rate;
+unsigned long get_iop_tick_rate(void)
+{
+       return iop_tick_rate;
+}
+EXPORT_SYMBOL(get_iop_tick_rate);
+
+void __init iop_init_time(unsigned long tick_rate)
+{
+       u32 timer_ctl;
+
+       sched_clock_register(iop_read_sched_clock, 32, tick_rate);
+
+       ticks_per_jiffy = DIV_ROUND_CLOSEST(tick_rate, HZ);
+       iop_tick_rate = tick_rate;
+
+       timer_ctl = IOP_TMR_EN | IOP_TMR_PRIVILEGED |
+                       IOP_TMR_RELOAD | IOP_TMR_RATIO_1_1;
+
+       /*
+        * Set up interrupting clockevent timer 0.
+        */
+       write_tmr0(timer_ctl & ~IOP_TMR_EN);
+       write_tisr(1);
+       setup_irq(IRQ_IOP32X_TIMER0, &iop_timer_irq);
+       iop_clockevent.cpumask = cpumask_of(0);
+       clockevents_config_and_register(&iop_clockevent, tick_rate,
+                                       0xf, 0xfffffffe);
+
+       /*
+        * Set up free-running clocksource timer 1.
+        */
+       write_trr1(0xffffffff);
+       write_tcr1(0xffffffff);
+       write_tmr1(timer_ctl);
+       clocksource_register_hz(&iop_clocksource, tick_rate);
+}
diff --git a/arch/arm/plat-iop/Makefile b/arch/arm/plat-iop/Makefile
deleted file mode 100644 (file)
index 86e354b..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-# SPDX-License-Identifier: GPL-2.0
-#
-# Makefile for the linux kernel.
-#
-
-# IOP32X
-obj-$(CONFIG_ARCH_IOP32X) += i2c.o
-obj-$(CONFIG_ARCH_IOP32X) += pci.o
-obj-$(CONFIG_ARCH_IOP32X) += setup.o
-obj-$(CONFIG_ARCH_IOP32X) += time.o
-obj-$(CONFIG_ARCH_IOP32X) += cp6.o
-obj-$(CONFIG_ARCH_IOP32X) += adma.o
-obj-$(CONFIG_ARCH_IOP32X) += pmu.o
-obj-$(CONFIG_ARCH_IOP32X) += restart.o
diff --git a/arch/arm/plat-iop/adma.c b/arch/arm/plat-iop/adma.c
deleted file mode 100644 (file)
index 601cc9c..0000000
+++ /dev/null
@@ -1,161 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * platform device definitions for the iop3xx dma/xor engines
- * Copyright Â© 2006, Intel Corporation.
- */
-#include <linux/platform_device.h>
-#include <asm/hardware/iop3xx.h>
-#include <linux/dma-mapping.h>
-#include <linux/platform_data/dma-iop32x.h>
-
-#define IRQ_DMA0_EOT IRQ_IOP32X_DMA0_EOT
-#define IRQ_DMA0_EOC IRQ_IOP32X_DMA0_EOC
-#define IRQ_DMA0_ERR IRQ_IOP32X_DMA0_ERR
-
-#define IRQ_DMA1_EOT IRQ_IOP32X_DMA1_EOT
-#define IRQ_DMA1_EOC IRQ_IOP32X_DMA1_EOC
-#define IRQ_DMA1_ERR IRQ_IOP32X_DMA1_ERR
-
-#define IRQ_AA_EOT IRQ_IOP32X_AA_EOT
-#define IRQ_AA_EOC IRQ_IOP32X_AA_EOC
-#define IRQ_AA_ERR IRQ_IOP32X_AA_ERR
-
-/* AAU and DMA Channels */
-static struct resource iop3xx_dma_0_resources[] = {
-       [0] = {
-               .start = IOP3XX_DMA_PHYS_BASE(0),
-               .end = IOP3XX_DMA_UPPER_PA(0),
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = IRQ_DMA0_EOT,
-               .end = IRQ_DMA0_EOT,
-               .flags = IORESOURCE_IRQ
-       },
-       [2] = {
-               .start = IRQ_DMA0_EOC,
-               .end = IRQ_DMA0_EOC,
-               .flags = IORESOURCE_IRQ
-       },
-       [3] = {
-               .start = IRQ_DMA0_ERR,
-               .end = IRQ_DMA0_ERR,
-               .flags = IORESOURCE_IRQ
-       }
-};
-
-static struct resource iop3xx_dma_1_resources[] = {
-       [0] = {
-               .start = IOP3XX_DMA_PHYS_BASE(1),
-               .end = IOP3XX_DMA_UPPER_PA(1),
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = IRQ_DMA1_EOT,
-               .end = IRQ_DMA1_EOT,
-               .flags = IORESOURCE_IRQ
-       },
-       [2] = {
-               .start = IRQ_DMA1_EOC,
-               .end = IRQ_DMA1_EOC,
-               .flags = IORESOURCE_IRQ
-       },
-       [3] = {
-               .start = IRQ_DMA1_ERR,
-               .end = IRQ_DMA1_ERR,
-               .flags = IORESOURCE_IRQ
-       }
-};
-
-
-static struct resource iop3xx_aau_resources[] = {
-       [0] = {
-               .start = IOP3XX_AAU_PHYS_BASE,
-               .end = IOP3XX_AAU_UPPER_PA,
-               .flags = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start = IRQ_AA_EOT,
-               .end = IRQ_AA_EOT,
-               .flags = IORESOURCE_IRQ
-       },
-       [2] = {
-               .start = IRQ_AA_EOC,
-               .end = IRQ_AA_EOC,
-               .flags = IORESOURCE_IRQ
-       },
-       [3] = {
-               .start = IRQ_AA_ERR,
-               .end = IRQ_AA_ERR,
-               .flags = IORESOURCE_IRQ
-       }
-};
-
-static u64 iop3xx_adma_dmamask = DMA_BIT_MASK(32);
-
-static struct iop_adma_platform_data iop3xx_dma_0_data = {
-       .hw_id = DMA0_ID,
-       .pool_size = PAGE_SIZE,
-};
-
-static struct iop_adma_platform_data iop3xx_dma_1_data = {
-       .hw_id = DMA1_ID,
-       .pool_size = PAGE_SIZE,
-};
-
-static struct iop_adma_platform_data iop3xx_aau_data = {
-       .hw_id = AAU_ID,
-       .pool_size = 3 * PAGE_SIZE,
-};
-
-struct platform_device iop3xx_dma_0_channel = {
-       .name = "iop-adma",
-       .id = 0,
-       .num_resources = 4,
-       .resource = iop3xx_dma_0_resources,
-       .dev = {
-               .dma_mask = &iop3xx_adma_dmamask,
-               .coherent_dma_mask = DMA_BIT_MASK(32),
-               .platform_data = (void *) &iop3xx_dma_0_data,
-       },
-};
-
-struct platform_device iop3xx_dma_1_channel = {
-       .name = "iop-adma",
-       .id = 1,
-       .num_resources = 4,
-       .resource = iop3xx_dma_1_resources,
-       .dev = {
-               .dma_mask = &iop3xx_adma_dmamask,
-               .coherent_dma_mask = DMA_BIT_MASK(32),
-               .platform_data = (void *) &iop3xx_dma_1_data,
-       },
-};
-
-struct platform_device iop3xx_aau_channel = {
-       .name = "iop-adma",
-       .id = 2,
-       .num_resources = 4,
-       .resource = iop3xx_aau_resources,
-       .dev = {
-               .dma_mask = &iop3xx_adma_dmamask,
-               .coherent_dma_mask = DMA_BIT_MASK(32),
-               .platform_data = (void *) &iop3xx_aau_data,
-       },
-};
-
-static int __init iop3xx_adma_cap_init(void)
-{
-       dma_cap_set(DMA_MEMCPY, iop3xx_dma_0_data.cap_mask);
-       dma_cap_set(DMA_INTERRUPT, iop3xx_dma_0_data.cap_mask);
-
-       dma_cap_set(DMA_MEMCPY, iop3xx_dma_1_data.cap_mask);
-       dma_cap_set(DMA_INTERRUPT, iop3xx_dma_1_data.cap_mask);
-
-       dma_cap_set(DMA_XOR, iop3xx_aau_data.cap_mask);
-       dma_cap_set(DMA_INTERRUPT, iop3xx_aau_data.cap_mask);
-
-       return 0;
-}
-
-arch_initcall(iop3xx_adma_cap_init);
diff --git a/arch/arm/plat-iop/cp6.c b/arch/arm/plat-iop/cp6.c
deleted file mode 100644 (file)
index ec74b07..0000000
+++ /dev/null
@@ -1,38 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * IOP Coprocessor-6 access handler
- * Copyright (c) 2006, Intel Corporation.
- */
-#include <linux/init.h>
-#include <asm/traps.h>
-#include <asm/ptrace.h>
-
-static int cp6_trap(struct pt_regs *regs, unsigned int instr)
-{
-       u32 temp;
-
-        /* enable cp6 access */
-        asm volatile (
-               "mrc    p15, 0, %0, c15, c1, 0\n\t"
-               "orr    %0, %0, #(1 << 6)\n\t"
-               "mcr    p15, 0, %0, c15, c1, 0\n\t"
-               : "=r"(temp));
-
-       return 0;
-}
-
-/* permit kernel space cp6 access
- * deny user space cp6 access
- */
-static struct undef_hook cp6_hook = {
-       .instr_mask     = 0x0f000ff0,
-       .instr_val      = 0x0e000610,
-       .cpsr_mask      = MODE_MASK,
-       .cpsr_val       = SVC_MODE,
-       .fn             = cp6_trap,
-};
-
-void __init iop_init_cp6_handler(void)
-{
-       register_undef_hook(&cp6_hook);
-}
diff --git a/arch/arm/plat-iop/i2c.c b/arch/arm/plat-iop/i2c.c
deleted file mode 100644 (file)
index 8d5fe34..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * arch/arm/plat-iop/i2c.c
- *
- * Author: Nicolas Pitre <nico@cam.org>
- * Copyright (C) 2001 MontaVista Software, Inc.
- * Copyright (C) 2004 Intel Corporation.
- */
-
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/major.h>
-#include <linux/fs.h>
-#include <linux/platform_device.h>
-#include <linux/serial.h>
-#include <linux/tty.h>
-#include <linux/serial_core.h>
-#include <linux/io.h>
-#include <linux/gpio/machine.h>
-#include <asm/pgtable.h>
-#include <asm/page.h>
-#include <asm/mach/map.h>
-#include <asm/setup.h>
-#include <asm/memory.h>
-#include <mach/hardware.h>
-#include <asm/hardware/iop3xx.h>
-#include <asm/mach/arch.h>
-
-/*
- * Each of the I2C busses have corresponding GPIO lines, and the driver
- * need to access these directly to drive the bus low at times.
- */
-
-struct gpiod_lookup_table iop3xx_i2c0_gpio_lookup = {
-       .dev_id = "IOP3xx-I2C.0",
-       .table = {
-               GPIO_LOOKUP("gpio-iop", 7, "scl", GPIO_ACTIVE_HIGH),
-               GPIO_LOOKUP("gpio-iop", 6, "sda", GPIO_ACTIVE_HIGH),
-               { }
-       },
-};
-
-struct gpiod_lookup_table iop3xx_i2c1_gpio_lookup = {
-       .dev_id = "IOP3xx-I2C.1",
-       .table = {
-               GPIO_LOOKUP("gpio-iop", 5, "scl", GPIO_ACTIVE_HIGH),
-               GPIO_LOOKUP("gpio-iop", 4, "sda", GPIO_ACTIVE_HIGH),
-               { }
-       },
-};
-
-static struct resource iop3xx_i2c0_resources[] = {
-       [0] = {
-               .start  = 0xfffff680,
-               .end    = 0xfffff697,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = IRQ_IOP32X_I2C_0,
-               .end    = IRQ_IOP32X_I2C_0,
-               .flags  = IORESOURCE_IRQ,
-       },
-};
-
-struct platform_device iop3xx_i2c0_device = {
-       .name           = "IOP3xx-I2C",
-       .id             = 0,
-       .num_resources  = 2,
-       .resource       = iop3xx_i2c0_resources,
-};
-
-
-static struct resource iop3xx_i2c1_resources[] = {
-       [0] = {
-               .start  = 0xfffff6a0,
-               .end    = 0xfffff6b7,
-               .flags  = IORESOURCE_MEM,
-       },
-       [1] = {
-               .start  = IRQ_IOP32X_I2C_1,
-               .end    = IRQ_IOP32X_I2C_1,
-               .flags  = IORESOURCE_IRQ,
-       }
-};
-
-struct platform_device iop3xx_i2c1_device = {
-       .name           = "IOP3xx-I2C",
-       .id             = 1,
-       .num_resources  = 2,
-       .resource       = iop3xx_i2c1_resources,
-};
diff --git a/arch/arm/plat-iop/pci.c b/arch/arm/plat-iop/pci.c
deleted file mode 100644 (file)
index 4c42c95..0000000
+++ /dev/null
@@ -1,401 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * arch/arm/plat-iop/pci.c
- *
- * PCI support for the Intel IOP32X and IOP33X processors
- *
- * Author: Rory Bolt <rorybolt@pacbell.net>
- * Copyright (C) 2002 Rory Bolt
- */
-
-#include <linux/kernel.h>
-#include <linux/pci.h>
-#include <linux/slab.h>
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <linux/ioport.h>
-#include <linux/io.h>
-#include <asm/irq.h>
-#include <asm/signal.h>
-#include <mach/hardware.h>
-#include <asm/mach/pci.h>
-#include <asm/hardware/iop3xx.h>
-
-// #define DEBUG
-
-#ifdef DEBUG
-#define  DBG(x...) printk(x)
-#else
-#define  DBG(x...) do { } while (0)
-#endif
-
-/*
- * This routine builds either a type0 or type1 configuration command.  If the
- * bus is on the 803xx then a type0 made, else a type1 is created.
- */
-static u32 iop3xx_cfg_address(struct pci_bus *bus, int devfn, int where)
-{
-       struct pci_sys_data *sys = bus->sysdata;
-       u32 addr;
-
-       if (sys->busnr == bus->number)
-               addr = 1 << (PCI_SLOT(devfn) + 16) | (PCI_SLOT(devfn) << 11);
-       else
-               addr = bus->number << 16 | PCI_SLOT(devfn) << 11 | 1;
-
-       addr |= PCI_FUNC(devfn) << 8 | (where & ~3);
-
-       return addr;
-}
-
-/*
- * This routine checks the status of the last configuration cycle.  If an error
- * was detected it returns a 1, else it returns a 0.  The errors being checked
- * are parity, master abort, target abort (master and target).  These types of
- * errors occur during a config cycle where there is no device, like during
- * the discovery stage.
- */
-static int iop3xx_pci_status(void)
-{
-       unsigned int status;
-       int ret = 0;
-
-       /*
-        * Check the status registers.
-        */
-       status = *IOP3XX_ATUSR;
-       if (status & 0xf900) {
-               DBG("\t\t\tPCI: P0 - status = 0x%08x\n", status);
-               *IOP3XX_ATUSR = status & 0xf900;
-               ret = 1;
-       }
-
-       status = *IOP3XX_ATUISR;
-       if (status & 0x679f) {
-               DBG("\t\t\tPCI: P1 - status = 0x%08x\n", status);
-               *IOP3XX_ATUISR = status & 0x679f;
-               ret = 1;
-       }
-
-       return ret;
-}
-
-/*
- * Simply write the address register and read the configuration
- * data.  Note that the 4 nops ensure that we are able to handle
- * a delayed abort (in theory.)
- */
-static u32 iop3xx_read(unsigned long addr)
-{
-       u32 val;
-
-       __asm__ __volatile__(
-               "str    %1, [%2]\n\t"
-               "ldr    %0, [%3]\n\t"
-               "nop\n\t"
-               "nop\n\t"
-               "nop\n\t"
-               "nop\n\t"
-               : "=r" (val)
-               : "r" (addr), "r" (IOP3XX_OCCAR), "r" (IOP3XX_OCCDR));
-
-       return val;
-}
-
-/*
- * The read routines must check the error status of the last configuration
- * cycle.  If there was an error, the routine returns all hex f's.
- */
-static int
-iop3xx_read_config(struct pci_bus *bus, unsigned int devfn, int where,
-               int size, u32 *value)
-{
-       unsigned long addr = iop3xx_cfg_address(bus, devfn, where);
-       u32 val = iop3xx_read(addr) >> ((where & 3) * 8);
-
-       if (iop3xx_pci_status())
-               val = 0xffffffff;
-
-       *value = val;
-
-       return PCIBIOS_SUCCESSFUL;
-}
-
-static int
-iop3xx_write_config(struct pci_bus *bus, unsigned int devfn, int where,
-               int size, u32 value)
-{
-       unsigned long addr = iop3xx_cfg_address(bus, devfn, where);
-       u32 val;
-
-       if (size != 4) {
-               val = iop3xx_read(addr);
-               if (iop3xx_pci_status())
-                       return PCIBIOS_SUCCESSFUL;
-
-               where = (where & 3) * 8;
-
-               if (size == 1)
-                       val &= ~(0xff << where);
-               else
-                       val &= ~(0xffff << where);
-
-               *IOP3XX_OCCDR = val | value << where;
-       } else {
-               asm volatile(
-                       "str    %1, [%2]\n\t"
-                       "str    %0, [%3]\n\t"
-                       "nop\n\t"
-                       "nop\n\t"
-                       "nop\n\t"
-                       "nop\n\t"
-                       :
-                       : "r" (value), "r" (addr),
-                         "r" (IOP3XX_OCCAR), "r" (IOP3XX_OCCDR));
-       }
-
-       return PCIBIOS_SUCCESSFUL;
-}
-
-struct pci_ops iop3xx_ops = {
-       .read   = iop3xx_read_config,
-       .write  = iop3xx_write_config,
-};
-
-/*
- * When a PCI device does not exist during config cycles, the 80200 gets a
- * bus error instead of returning 0xffffffff. This handler simply returns.
- */
-static int
-iop3xx_pci_abort(unsigned long addr, unsigned int fsr, struct pt_regs *regs)
-{
-       DBG("PCI abort: address = 0x%08lx fsr = 0x%03x PC = 0x%08lx LR = 0x%08lx\n",
-               addr, fsr, regs->ARM_pc, regs->ARM_lr);
-
-       /*
-        * If it was an imprecise abort, then we need to correct the
-        * return address to be _after_ the instruction.
-        */
-       if (fsr & (1 << 10))
-               regs->ARM_pc += 4;
-
-       return 0;
-}
-
-int iop3xx_pci_setup(int nr, struct pci_sys_data *sys)
-{
-       struct resource *res;
-
-       if (nr != 0)
-               return 0;
-
-       res = kzalloc(sizeof(struct resource), GFP_KERNEL);
-       if (!res)
-               panic("PCI: unable to alloc resources");
-
-       res->start = IOP3XX_PCI_LOWER_MEM_PA;
-       res->end   = IOP3XX_PCI_LOWER_MEM_PA + IOP3XX_PCI_MEM_WINDOW_SIZE - 1;
-       res->name  = "IOP3XX PCI Memory Space";
-       res->flags = IORESOURCE_MEM;
-       request_resource(&iomem_resource, res);
-
-       /*
-        * Use whatever translation is already setup.
-        */
-       sys->mem_offset = IOP3XX_PCI_LOWER_MEM_PA - *IOP3XX_OMWTVR0;
-
-       pci_add_resource_offset(&sys->resources, res, sys->mem_offset);
-
-       pci_ioremap_io(0, IOP3XX_PCI_LOWER_IO_PA);
-
-       return 1;
-}
-
-void __init iop3xx_atu_setup(void)
-{
-       /* BAR 0 ( Disabled ) */
-       *IOP3XX_IAUBAR0 = 0x0;
-       *IOP3XX_IABAR0  = 0x0;
-       *IOP3XX_IATVR0  = 0x0;
-       *IOP3XX_IALR0   = 0x0;
-
-       /* BAR 1 ( Disabled ) */
-       *IOP3XX_IAUBAR1 = 0x0;
-       *IOP3XX_IABAR1  = 0x0;
-       *IOP3XX_IALR1   = 0x0;
-
-       /* BAR 2 (1:1 mapping with Physical RAM) */
-       /* Set limit and enable */
-       *IOP3XX_IALR2 = ~((u32)IOP3XX_MAX_RAM_SIZE - 1) & ~0x1;
-       *IOP3XX_IAUBAR2 = 0x0;
-
-       /* Align the inbound bar with the base of memory */
-       *IOP3XX_IABAR2 = PHYS_OFFSET |
-                              PCI_BASE_ADDRESS_MEM_TYPE_64 |
-                              PCI_BASE_ADDRESS_MEM_PREFETCH;
-
-       *IOP3XX_IATVR2 = PHYS_OFFSET;
-
-       /* Outbound window 0 */
-       *IOP3XX_OMWTVR0 = IOP3XX_PCI_LOWER_MEM_BA;
-       *IOP3XX_OUMWTVR0 = 0;
-
-       /* Outbound window 1 */
-       *IOP3XX_OMWTVR1 = IOP3XX_PCI_LOWER_MEM_BA +
-                         IOP3XX_PCI_MEM_WINDOW_SIZE / 2;
-       *IOP3XX_OUMWTVR1 = 0;
-
-       /* BAR 3 ( Disabled ) */
-       *IOP3XX_IAUBAR3 = 0x0;
-       *IOP3XX_IABAR3  = 0x0;
-       *IOP3XX_IATVR3  = 0x0;
-       *IOP3XX_IALR3   = 0x0;
-
-       /* Setup the I/O Bar
-        */
-       *IOP3XX_OIOWTVR = IOP3XX_PCI_LOWER_IO_BA;
-
-       /* Enable inbound and outbound cycles
-        */
-       *IOP3XX_ATUCMD |= PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER |
-                              PCI_COMMAND_PARITY | PCI_COMMAND_SERR;
-       *IOP3XX_ATUCR |= IOP3XX_ATUCR_OUT_EN;
-}
-
-void __init iop3xx_atu_disable(void)
-{
-       *IOP3XX_ATUCMD = 0;
-       *IOP3XX_ATUCR = 0;
-
-       /* wait for cycles to quiesce */
-       while (*IOP3XX_PCSR & (IOP3XX_PCSR_OUT_Q_BUSY |
-                                    IOP3XX_PCSR_IN_Q_BUSY))
-               cpu_relax();
-
-       /* BAR 0 ( Disabled ) */
-       *IOP3XX_IAUBAR0 = 0x0;
-       *IOP3XX_IABAR0  = 0x0;
-       *IOP3XX_IATVR0  = 0x0;
-       *IOP3XX_IALR0   = 0x0;
-
-       /* BAR 1 ( Disabled ) */
-       *IOP3XX_IAUBAR1 = 0x0;
-       *IOP3XX_IABAR1  = 0x0;
-       *IOP3XX_IALR1   = 0x0;
-
-       /* BAR 2 ( Disabled ) */
-       *IOP3XX_IAUBAR2 = 0x0;
-       *IOP3XX_IABAR2  = 0x0;
-       *IOP3XX_IATVR2  = 0x0;
-       *IOP3XX_IALR2   = 0x0;
-
-       /* BAR 3 ( Disabled ) */
-       *IOP3XX_IAUBAR3 = 0x0;
-       *IOP3XX_IABAR3  = 0x0;
-       *IOP3XX_IATVR3  = 0x0;
-       *IOP3XX_IALR3   = 0x0;
-
-       /* Clear the outbound windows */
-       *IOP3XX_OIOWTVR  = 0;
-
-       /* Outbound window 0 */
-       *IOP3XX_OMWTVR0 = 0;
-       *IOP3XX_OUMWTVR0 = 0;
-
-       /* Outbound window 1 */
-       *IOP3XX_OMWTVR1 = 0;
-       *IOP3XX_OUMWTVR1 = 0;
-}
-
-/* Flag to determine whether the ATU is initialized and the PCI bus scanned */
-int init_atu;
-
-int iop3xx_get_init_atu(void) {
-       /* check if default has been overridden */
-       if (init_atu != IOP3XX_INIT_ATU_DEFAULT)
-               return init_atu;
-       else
-               return IOP3XX_INIT_ATU_DISABLE;
-}
-
-static void __init iop3xx_atu_debug(void)
-{
-       DBG("PCI: Intel IOP3xx PCI init.\n");
-       DBG("PCI: Outbound memory window 0: PCI 0x%08x%08x\n",
-               *IOP3XX_OUMWTVR0, *IOP3XX_OMWTVR0);
-       DBG("PCI: Outbound memory window 1: PCI 0x%08x%08x\n",
-               *IOP3XX_OUMWTVR1, *IOP3XX_OMWTVR1);
-       DBG("PCI: Outbound IO window: PCI 0x%08x\n",
-               *IOP3XX_OIOWTVR);
-
-       DBG("PCI: Inbound memory window 0: PCI 0x%08x%08x 0x%08x -> 0x%08x\n",
-               *IOP3XX_IAUBAR0, *IOP3XX_IABAR0, *IOP3XX_IALR0, *IOP3XX_IATVR0);
-       DBG("PCI: Inbound memory window 1: PCI 0x%08x%08x 0x%08x\n",
-               *IOP3XX_IAUBAR1, *IOP3XX_IABAR1, *IOP3XX_IALR1);
-       DBG("PCI: Inbound memory window 2: PCI 0x%08x%08x 0x%08x -> 0x%08x\n",
-               *IOP3XX_IAUBAR2, *IOP3XX_IABAR2, *IOP3XX_IALR2, *IOP3XX_IATVR2);
-       DBG("PCI: Inbound memory window 3: PCI 0x%08x%08x 0x%08x -> 0x%08x\n",
-               *IOP3XX_IAUBAR3, *IOP3XX_IABAR3, *IOP3XX_IALR3, *IOP3XX_IATVR3);
-
-       DBG("PCI: Expansion ROM window: PCI 0x%08x%08x 0x%08x -> 0x%08x\n",
-               0, *IOP3XX_ERBAR, *IOP3XX_ERLR, *IOP3XX_ERTVR);
-
-       DBG("ATU: IOP3XX_ATUCMD=0x%04x\n", *IOP3XX_ATUCMD);
-       DBG("ATU: IOP3XX_ATUCR=0x%08x\n", *IOP3XX_ATUCR);
-
-       hook_fault_code(16+6, iop3xx_pci_abort, SIGBUS, 0, "imprecise external abort");
-}
-
-/* for platforms that might be host-bus-adapters */
-void __init iop3xx_pci_preinit_cond(void)
-{
-       if (iop3xx_get_init_atu() == IOP3XX_INIT_ATU_ENABLE) {
-               iop3xx_atu_disable();
-               iop3xx_atu_setup();
-               iop3xx_atu_debug();
-       }
-}
-
-void __init iop3xx_pci_preinit(void)
-{
-       pcibios_min_mem = 0;
-
-       iop3xx_atu_disable();
-       iop3xx_atu_setup();
-       iop3xx_atu_debug();
-}
-
-/* allow init_atu to be user overridden */
-static int __init iop3xx_init_atu_setup(char *str)
-{
-       init_atu = IOP3XX_INIT_ATU_DEFAULT;
-       if (str) {
-               while (*str != '\0') {
-                       switch (*str) {
-                       case 'y':
-                       case 'Y':
-                               init_atu = IOP3XX_INIT_ATU_ENABLE;
-                               break;
-                       case 'n':
-                       case 'N':
-                               init_atu = IOP3XX_INIT_ATU_DISABLE;
-                               break;
-                       case ',':
-                       case '=':
-                               break;
-                       default:
-                               printk(KERN_DEBUG "\"%s\" malformed at "
-                                           "character: \'%c\'",
-                                           __func__,
-                                           *str);
-                               *(str + 1) = '\0';
-                       }
-                       str++;
-               }
-       }
-
-       return 1;
-}
-
-__setup("iop3xx_init_atu", iop3xx_init_atu_setup);
-
diff --git a/arch/arm/plat-iop/pmu.c b/arch/arm/plat-iop/pmu.c
deleted file mode 100644 (file)
index 3834142..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * PMU IRQ registration for the iop3xx xscale PMU families.
- * Copyright (C) 2010 Will Deacon, ARM Ltd.
- */
-
-#include <linux/platform_device.h>
-#include <mach/irqs.h>
-
-static struct resource pmu_resource = {
-       .start  = IRQ_IOP32X_CORE_PMU,
-       .end    = IRQ_IOP32X_CORE_PMU,
-       .flags  = IORESOURCE_IRQ,
-};
-
-static struct platform_device pmu_device = {
-       .name           = "xscale-pmu",
-       .id             = -1,
-       .resource       = &pmu_resource,
-       .num_resources  = 1,
-};
-
-static int __init iop3xx_pmu_init(void)
-{
-       platform_device_register(&pmu_device);
-       return 0;
-}
-
-arch_initcall(iop3xx_pmu_init);
diff --git a/arch/arm/plat-iop/restart.c b/arch/arm/plat-iop/restart.c
deleted file mode 100644 (file)
index cf6d3d9..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * restart.c
- *
- * Copyright (C) 2001 MontaVista Software, Inc.
- */
-#include <asm/hardware/iop3xx.h>
-#include <asm/system_misc.h>
-#include <mach/hardware.h>
-
-void iop3xx_restart(enum reboot_mode mode, const char *cmd)
-{
-       *IOP3XX_PCSR = 0x30;
-
-       /* Jump into ROM at address 0 */
-       soft_restart(0);
-}
diff --git a/arch/arm/plat-iop/setup.c b/arch/arm/plat-iop/setup.c
deleted file mode 100644 (file)
index d10e010..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-only
-/*
- * arch/arm/plat-iop/setup.c
- *
- * Author: Nicolas Pitre <nico@fluxnic.net>
- * Copyright (C) 2001 MontaVista Software, Inc.
- * Copyright (C) 2004 Intel Corporation.
- */
-
-#include <linux/mm.h>
-#include <linux/init.h>
-#include <asm/mach/map.h>
-#include <asm/hardware/iop3xx.h>
-
-/*
- * Standard IO mapping for all IOP3xx based systems.  Note that
- * the IOP3xx OCCDR must be mapped uncached and unbuffered.
- */
-static struct map_desc iop3xx_std_desc[] __initdata = {
-       {       /* mem mapped registers */
-               .virtual        = IOP3XX_PERIPHERAL_VIRT_BASE,
-               .pfn            = __phys_to_pfn(IOP3XX_PERIPHERAL_PHYS_BASE),
-               .length         = IOP3XX_PERIPHERAL_SIZE,
-               .type           = MT_UNCACHED,
-       },
-};
-
-void __init iop3xx_map_io(void)
-{
-       iotable_init(iop3xx_std_desc, ARRAY_SIZE(iop3xx_std_desc));
-}
diff --git a/arch/arm/plat-iop/time.c b/arch/arm/plat-iop/time.c
deleted file mode 100644 (file)
index f9dd1f5..0000000
+++ /dev/null
@@ -1,182 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0-or-later
-/*
- * arch/arm/plat-iop/time.c
- *
- * Timer code for IOP32x and IOP33x based systems
- *
- * Author: Deepak Saxena <dsaxena@mvista.com>
- *
- * Copyright 2002-2003 MontaVista Software Inc.
- */
-
-#include <linux/kernel.h>
-#include <linux/interrupt.h>
-#include <linux/time.h>
-#include <linux/init.h>
-#include <linux/timex.h>
-#include <linux/io.h>
-#include <linux/clocksource.h>
-#include <linux/clockchips.h>
-#include <linux/export.h>
-#include <linux/sched_clock.h>
-#include <mach/hardware.h>
-#include <asm/irq.h>
-#include <linux/uaccess.h>
-#include <asm/mach/irq.h>
-#include <asm/mach/time.h>
-#include <mach/time.h>
-
-/*
- * Minimum clocksource/clockevent timer range in seconds
- */
-#define IOP_MIN_RANGE 4
-
-/*
- * IOP clocksource (free-running timer 1).
- */
-static u64 notrace iop_clocksource_read(struct clocksource *unused)
-{
-       return 0xffffffffu - read_tcr1();
-}
-
-static struct clocksource iop_clocksource = {
-       .name           = "iop_timer1",
-       .rating         = 300,
-       .read           = iop_clocksource_read,
-       .mask           = CLOCKSOURCE_MASK(32),
-       .flags          = CLOCK_SOURCE_IS_CONTINUOUS,
-};
-
-/*
- * IOP sched_clock() implementation via its clocksource.
- */
-static u64 notrace iop_read_sched_clock(void)
-{
-       return 0xffffffffu - read_tcr1();
-}
-
-/*
- * IOP clockevents (interrupting timer 0).
- */
-static int iop_set_next_event(unsigned long delta,
-                             struct clock_event_device *unused)
-{
-       u32 tmr = IOP_TMR_PRIVILEGED | IOP_TMR_RATIO_1_1;
-
-       BUG_ON(delta == 0);
-       write_tmr0(tmr & ~(IOP_TMR_EN | IOP_TMR_RELOAD));
-       write_tcr0(delta);
-       write_tmr0((tmr & ~IOP_TMR_RELOAD) | IOP_TMR_EN);
-
-       return 0;
-}
-
-static unsigned long ticks_per_jiffy;
-
-static int iop_set_periodic(struct clock_event_device *evt)
-{
-       u32 tmr = read_tmr0();
-
-       write_tmr0(tmr & ~IOP_TMR_EN);
-       write_tcr0(ticks_per_jiffy - 1);
-       write_trr0(ticks_per_jiffy - 1);
-       tmr |= (IOP_TMR_RELOAD | IOP_TMR_EN);
-
-       write_tmr0(tmr);
-       return 0;
-}
-
-static int iop_set_oneshot(struct clock_event_device *evt)
-{
-       u32 tmr = read_tmr0();
-
-       /* ->set_next_event sets period and enables timer */
-       tmr &= ~(IOP_TMR_RELOAD | IOP_TMR_EN);
-       write_tmr0(tmr);
-       return 0;
-}
-
-static int iop_shutdown(struct clock_event_device *evt)
-{
-       u32 tmr = read_tmr0();
-
-       tmr &= ~IOP_TMR_EN;
-       write_tmr0(tmr);
-       return 0;
-}
-
-static int iop_resume(struct clock_event_device *evt)
-{
-       u32 tmr = read_tmr0();
-
-       tmr |= IOP_TMR_EN;
-       write_tmr0(tmr);
-       return 0;
-}
-
-static struct clock_event_device iop_clockevent = {
-       .name                   = "iop_timer0",
-       .features               = CLOCK_EVT_FEAT_PERIODIC |
-                                 CLOCK_EVT_FEAT_ONESHOT,
-       .rating                 = 300,
-       .set_next_event         = iop_set_next_event,
-       .set_state_shutdown     = iop_shutdown,
-       .set_state_periodic     = iop_set_periodic,
-       .tick_resume            = iop_resume,
-       .set_state_oneshot      = iop_set_oneshot,
-};
-
-static irqreturn_t
-iop_timer_interrupt(int irq, void *dev_id)
-{
-       struct clock_event_device *evt = dev_id;
-
-       write_tisr(1);
-       evt->event_handler(evt);
-       return IRQ_HANDLED;
-}
-
-static struct irqaction iop_timer_irq = {
-       .name           = "IOP Timer Tick",
-       .handler        = iop_timer_interrupt,
-       .flags          = IRQF_TIMER | IRQF_IRQPOLL,
-       .dev_id         = &iop_clockevent,
-};
-
-static unsigned long iop_tick_rate;
-unsigned long get_iop_tick_rate(void)
-{
-       return iop_tick_rate;
-}
-EXPORT_SYMBOL(get_iop_tick_rate);
-
-void __init iop_init_time(unsigned long tick_rate)
-{
-       u32 timer_ctl;
-
-       sched_clock_register(iop_read_sched_clock, 32, tick_rate);
-
-       ticks_per_jiffy = DIV_ROUND_CLOSEST(tick_rate, HZ);
-       iop_tick_rate = tick_rate;
-
-       timer_ctl = IOP_TMR_EN | IOP_TMR_PRIVILEGED |
-                       IOP_TMR_RELOAD | IOP_TMR_RATIO_1_1;
-
-       /*
-        * Set up interrupting clockevent timer 0.
-        */
-       write_tmr0(timer_ctl & ~IOP_TMR_EN);
-       write_tisr(1);
-       setup_irq(IRQ_IOP_TIMER0, &iop_timer_irq);
-       iop_clockevent.cpumask = cpumask_of(0);
-       clockevents_config_and_register(&iop_clockevent, tick_rate,
-                                       0xf, 0xfffffffe);
-
-       /*
-        * Set up free-running clocksource timer 1.
-        */
-       write_trr1(0xffffffff);
-       write_tcr1(0xffffffff);
-       write_tmr1(timer_ctl);
-       clocksource_register_hz(&iop_clocksource, tick_rate);
-}