Commit afe6fe70 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'armsoc-late' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc

Pull ARM SoC late updates from Arnd Bergmann:
 "Here are two branches that came relatively late during the linux-5.0
  development cycle and have dependencies on the other branches:

   - On the TI OMAP platform, the CPSW Ethernet PHY mode selection
     driver is being replaced, this puts the final pieces in place

   - On the DaVinci platform, the interrupt handling code in arch/arm
     gets moved into a regular device driver in drivers/irqchip.

  Since they both had some time in linux-next after the 5.0-rc8 release,
  I'm sending them along with the other updates"

* tag 'armsoc-late' of git://git.kernel.org/pub/scm/linux/kernel/git/soc/soc: (38 commits)
  net: ethernet: ti: cpsw: deprecate cpsw-phy-sel driver
  ARM: davinci: remove intc related fields from davinci_soc_info
  irqchip: davinci-cp-intc: move the driver to drivers/irqchip
  ARM: davinci: cp-intc: remove redundant comments
  ARM: davinci: cp-intc: drop GPL license boilerplate
  ARM: davinci: cp-intc: use readl/writel_relaxed()
  ARM: davinci: cp-intc: unify error handling
  ARM: davinci: cp-intc: improve coding style
  ARM: davinci: cp-intc: request the memory region before remapping it
  ARM: davinci: cp-intc: use the new-style config structure
  ARM: davinci: cp-intc: convert all hex numbers to lowercase
  ARM: davinci: cp-intc: use a common prefix for all symbols
  ARM: davinci: cp-intc: add the new config structures for da8xx SoCs
  irqchip: davinci-cp-intc: add a new config structure
  ARM: davinci: cp-intc: add a wrapper around cp_intc_init()
  ARM: davinci: cp-intc: remove cp_intc.h
  irqchip: davinci-aintc: move the driver to drivers/irqchip
  ARM: davinci: aintc: remove unnecessary includes
  ARM: davinci: aintc: remove the timer-specific irq_set_handler()
  ARM: davinci: aintc: request memory region before remapping it
  ...
parents 64b1b217 25476350
...@@ -590,11 +590,13 @@ config ARCH_DAVINCI ...@@ -590,11 +590,13 @@ config ARCH_DAVINCI
select GENERIC_ALLOCATOR select GENERIC_ALLOCATOR
select GENERIC_CLOCKEVENTS select GENERIC_CLOCKEVENTS
select GENERIC_IRQ_CHIP select GENERIC_IRQ_CHIP
select GENERIC_IRQ_MULTI_HANDLER
select GPIOLIB select GPIOLIB
select HAVE_IDE select HAVE_IDE
select PM_GENERIC_DOMAINS if PM select PM_GENERIC_DOMAINS if PM
select PM_GENERIC_DOMAINS_OF if PM && OF select PM_GENERIC_DOMAINS_OF if PM && OF
select RESET_CONTROLLER select RESET_CONTROLLER
select SPARSE_IRQ
select USE_OF select USE_OF
select ZONE_DMA select ZONE_DMA
help help
......
# SPDX-License-Identifier: GPL-2.0 # SPDX-License-Identifier: GPL-2.0
if ARCH_DAVINCI if ARCH_DAVINCI
config AINTC
bool
config CP_INTC
bool
select IRQ_DOMAIN
config ARCH_DAVINCI_DMx config ARCH_DAVINCI_DMx
bool bool
...@@ -17,17 +10,17 @@ comment "DaVinci Core Type" ...@@ -17,17 +10,17 @@ comment "DaVinci Core Type"
config ARCH_DAVINCI_DM644x config ARCH_DAVINCI_DM644x
bool "DaVinci 644x based system" bool "DaVinci 644x based system"
select AINTC select DAVINCI_AINTC
select ARCH_DAVINCI_DMx select ARCH_DAVINCI_DMx
config ARCH_DAVINCI_DM355 config ARCH_DAVINCI_DM355
bool "DaVinci 355 based system" bool "DaVinci 355 based system"
select AINTC select DAVINCI_AINTC
select ARCH_DAVINCI_DMx select ARCH_DAVINCI_DMx
config ARCH_DAVINCI_DM646x config ARCH_DAVINCI_DM646x
bool "DaVinci 646x based system" bool "DaVinci 646x based system"
select AINTC select DAVINCI_AINTC
select ARCH_DAVINCI_DMx select ARCH_DAVINCI_DMx
config ARCH_DAVINCI_DA830 config ARCH_DAVINCI_DA830
...@@ -36,20 +29,20 @@ config ARCH_DAVINCI_DA830 ...@@ -36,20 +29,20 @@ config ARCH_DAVINCI_DA830
select ARCH_DAVINCI_DA8XX select ARCH_DAVINCI_DA8XX
# needed on silicon revs 1.0, 1.1: # needed on silicon revs 1.0, 1.1:
select CPU_DCACHE_WRITETHROUGH if !CPU_DCACHE_DISABLE select CPU_DCACHE_WRITETHROUGH if !CPU_DCACHE_DISABLE
select CP_INTC select DAVINCI_CP_INTC
config ARCH_DAVINCI_DA850 config ARCH_DAVINCI_DA850
bool "DA850/OMAP-L138/AM18x based system" bool "DA850/OMAP-L138/AM18x based system"
depends on !ARCH_DAVINCI_DMx || (AUTO_ZRELADDR && ARM_PATCH_PHYS_VIRT) depends on !ARCH_DAVINCI_DMx || (AUTO_ZRELADDR && ARM_PATCH_PHYS_VIRT)
select ARCH_DAVINCI_DA8XX select ARCH_DAVINCI_DA8XX
select CP_INTC select DAVINCI_CP_INTC
config ARCH_DAVINCI_DA8XX config ARCH_DAVINCI_DA8XX
bool bool
config ARCH_DAVINCI_DM365 config ARCH_DAVINCI_DM365
bool "DaVinci 365 based system" bool "DaVinci 365 based system"
select AINTC select DAVINCI_AINTC
select ARCH_DAVINCI_DMx select ARCH_DAVINCI_DMx
comment "DaVinci Board Type" comment "DaVinci Board Type"
......
...@@ -18,9 +18,6 @@ obj-$(CONFIG_ARCH_DAVINCI_DM365) += dm365.o devices.o ...@@ -18,9 +18,6 @@ obj-$(CONFIG_ARCH_DAVINCI_DM365) += dm365.o devices.o
obj-$(CONFIG_ARCH_DAVINCI_DA830) += da830.o devices-da8xx.o usb-da8xx.o obj-$(CONFIG_ARCH_DAVINCI_DA830) += da830.o devices-da8xx.o usb-da8xx.o
obj-$(CONFIG_ARCH_DAVINCI_DA850) += da850.o devices-da8xx.o usb-da8xx.o obj-$(CONFIG_ARCH_DAVINCI_DA850) += da850.o devices-da8xx.o usb-da8xx.o
obj-$(CONFIG_AINTC) += irq.o
obj-$(CONFIG_CP_INTC) += cp_intc.o
# Board specific # Board specific
obj-$(CONFIG_MACH_DA8XX_DT) += da8xx-dt.o pdata-quirks.o obj-$(CONFIG_MACH_DA8XX_DT) += da8xx-dt.o pdata-quirks.o
obj-$(CONFIG_MACH_DAVINCI_EVM) += board-dm644x-evm.o obj-$(CONFIG_MACH_DAVINCI_EVM) += board-dm644x-evm.o
......
...@@ -49,9 +49,9 @@ ...@@ -49,9 +49,9 @@
#define DAVINCI_DA830_DMA_MCASP2_AXEVT 5 #define DAVINCI_DA830_DMA_MCASP2_AXEVT 5
/* Interrupts */ /* Interrupts */
#define DAVINCI_ASP0_RX_INT IRQ_MBRINT #define DAVINCI_ASP0_RX_INT DAVINCI_INTC_IRQ(IRQ_MBRINT)
#define DAVINCI_ASP0_TX_INT IRQ_MBXINT #define DAVINCI_ASP0_TX_INT DAVINCI_INTC_IRQ(IRQ_MBXINT)
#define DAVINCI_ASP1_RX_INT IRQ_MBRINT #define DAVINCI_ASP1_RX_INT DAVINCI_INTC_IRQ(IRQ_MBRINT)
#define DAVINCI_ASP1_TX_INT IRQ_MBXINT #define DAVINCI_ASP1_TX_INT DAVINCI_INTC_IRQ(IRQ_MBXINT)
#endif /* __ASM_ARCH_DAVINCI_ASP_H */ #endif /* __ASM_ARCH_DAVINCI_ASP_H */
...@@ -36,10 +36,11 @@ ...@@ -36,10 +36,11 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <mach/common.h> #include <mach/common.h>
#include "cp_intc.h"
#include <mach/mux.h> #include <mach/mux.h>
#include <mach/da8xx.h> #include <mach/da8xx.h>
#include "irqs.h"
#define DA830_EVM_PHY_ID "" #define DA830_EVM_PHY_ID ""
/* /*
* USB1 VBUS is controlled by GPIO1[15], over-current is reported on GPIO2[4]. * USB1 VBUS is controlled by GPIO1[15], over-current is reported on GPIO2[4].
...@@ -633,7 +634,7 @@ static void __init da830_evm_map_io(void) ...@@ -633,7 +634,7 @@ static void __init da830_evm_map_io(void)
MACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP-L137/AM17x EVM") MACHINE_START(DAVINCI_DA830_EVM, "DaVinci DA830/OMAP-L137/AM17x EVM")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = da830_evm_map_io, .map_io = da830_evm_map_io,
.init_irq = cp_intc_init, .init_irq = da830_init_irq,
.init_time = da830_init_time, .init_time = da830_init_time,
.init_machine = da830_evm_init, .init_machine = da830_evm_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -43,9 +43,10 @@ ...@@ -43,9 +43,10 @@
#include <linux/spi/flash.h> #include <linux/spi/flash.h>
#include <mach/common.h> #include <mach/common.h>
#include "cp_intc.h"
#include <mach/da8xx.h> #include <mach/da8xx.h>
#include <mach/mux.h> #include <mach/mux.h>
#include "irqs.h"
#include "sram.h" #include "sram.h"
#include <asm/mach-types.h> #include <asm/mach-types.h>
...@@ -1499,7 +1500,7 @@ static void __init da850_evm_map_io(void) ...@@ -1499,7 +1500,7 @@ static void __init da850_evm_map_io(void)
MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM") MACHINE_START(DAVINCI_DA850_EVM, "DaVinci DA850/OMAP-L138/AM18x EVM")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = da850_evm_map_io, .map_io = da850_evm_map_io,
.init_irq = cp_intc_init, .init_irq = da850_init_irq,
.init_time = da850_init_time, .init_time = da850_init_time,
.init_machine = da850_evm_init, .init_machine = da850_evm_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -438,7 +438,7 @@ static __init void dm355_evm_init(void) ...@@ -438,7 +438,7 @@ static __init void dm355_evm_init(void)
MACHINE_START(DAVINCI_DM355_EVM, "DaVinci DM355 EVM") MACHINE_START(DAVINCI_DM355_EVM, "DaVinci DM355 EVM")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = dm355_evm_map_io, .map_io = dm355_evm_map_io,
.init_irq = davinci_irq_init, .init_irq = dm355_init_irq,
.init_time = dm355_init_time, .init_time = dm355_init_time,
.init_machine = dm355_evm_init, .init_machine = dm355_evm_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -273,7 +273,7 @@ static __init void dm355_leopard_init(void) ...@@ -273,7 +273,7 @@ static __init void dm355_leopard_init(void)
MACHINE_START(DM355_LEOPARD, "DaVinci DM355 leopard") MACHINE_START(DM355_LEOPARD, "DaVinci DM355 leopard")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = dm355_leopard_map_io, .map_io = dm355_leopard_map_io,
.init_irq = davinci_irq_init, .init_irq = dm355_init_irq,
.init_time = dm355_init_time, .init_time = dm355_init_time,
.init_machine = dm355_leopard_init, .init_machine = dm355_leopard_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -831,7 +831,7 @@ static __init void dm365_evm_init(void) ...@@ -831,7 +831,7 @@ static __init void dm365_evm_init(void)
MACHINE_START(DAVINCI_DM365_EVM, "DaVinci DM365 EVM") MACHINE_START(DAVINCI_DM365_EVM, "DaVinci DM365 EVM")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = dm365_evm_map_io, .map_io = dm365_evm_map_io,
.init_irq = davinci_irq_init, .init_irq = dm365_init_irq,
.init_time = dm365_init_time, .init_time = dm365_init_time,
.init_machine = dm365_evm_init, .init_machine = dm365_evm_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -36,9 +36,10 @@ ...@@ -36,9 +36,10 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <mach/common.h> #include <mach/common.h>
#include <linux/platform_data/i2c-davinci.h>
#include <mach/serial.h>
#include <mach/mux.h> #include <mach/mux.h>
#include <mach/serial.h>
#include <linux/platform_data/i2c-davinci.h>
#include <linux/platform_data/mtd-davinci.h> #include <linux/platform_data/mtd-davinci.h>
#include <linux/platform_data/mmc-davinci.h> #include <linux/platform_data/mmc-davinci.h>
#include <linux/platform_data/usb-davinci.h> #include <linux/platform_data/usb-davinci.h>
...@@ -46,6 +47,7 @@ ...@@ -46,6 +47,7 @@
#include <linux/platform_data/ti-aemif.h> #include <linux/platform_data/ti-aemif.h>
#include "davinci.h" #include "davinci.h"
#include "irqs.h"
#define DM644X_EVM_PHY_ID "davinci_mdio-0:01" #define DM644X_EVM_PHY_ID "davinci_mdio-0:01"
#define LXT971_PHY_ID (0x001378e2) #define LXT971_PHY_ID (0x001378e2)
...@@ -886,7 +888,7 @@ MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM") ...@@ -886,7 +888,7 @@ MACHINE_START(DAVINCI_EVM, "DaVinci DM644x EVM")
/* Maintainer: MontaVista Software <source@mvista.com> */ /* Maintainer: MontaVista Software <source@mvista.com> */
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = davinci_evm_map_io, .map_io = davinci_evm_map_io,
.init_irq = davinci_irq_init, .init_irq = dm644x_init_irq,
.init_time = dm644x_init_time, .init_time = dm644x_init_time,
.init_machine = davinci_evm_init, .init_machine = davinci_evm_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -44,10 +44,10 @@ ...@@ -44,10 +44,10 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <mach/common.h> #include <mach/common.h>
#include <mach/irqs.h>
#include <mach/serial.h> #include <mach/serial.h>
#include "davinci.h" #include "davinci.h"
#include "irqs.h"
#define NAND_BLOCK_SIZE SZ_128K #define NAND_BLOCK_SIZE SZ_128K
...@@ -860,7 +860,7 @@ static __init void evm_init(void) ...@@ -860,7 +860,7 @@ static __init void evm_init(void)
MACHINE_START(DAVINCI_DM6467_EVM, "DaVinci DM646x EVM") MACHINE_START(DAVINCI_DM6467_EVM, "DaVinci DM646x EVM")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = davinci_map_io, .map_io = davinci_map_io,
.init_irq = davinci_irq_init, .init_irq = dm646x_init_irq,
.init_time = dm646x_evm_init_time, .init_time = dm646x_evm_init_time,
.init_machine = evm_init, .init_machine = evm_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
...@@ -870,7 +870,7 @@ MACHINE_END ...@@ -870,7 +870,7 @@ MACHINE_END
MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM") MACHINE_START(DAVINCI_DM6467TEVM, "DaVinci DM6467T EVM")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = davinci_map_io, .map_io = davinci_map_io,
.init_irq = davinci_irq_init, .init_irq = dm646x_init_irq,
.init_time = dm6467t_evm_init_time, .init_time = dm6467t_evm_init_time,
.init_machine = evm_init, .init_machine = evm_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -29,7 +29,6 @@ ...@@ -29,7 +29,6 @@
#include <asm/mach-types.h> #include <asm/mach-types.h>
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <mach/common.h> #include <mach/common.h>
#include "cp_intc.h"
#include <mach/da8xx.h> #include <mach/da8xx.h>
#include <linux/platform_data/mtd-davinci.h> #include <linux/platform_data/mtd-davinci.h>
#include <linux/platform_data/mtd-davinci-aemif.h> #include <linux/platform_data/mtd-davinci-aemif.h>
...@@ -628,7 +627,7 @@ static void __init mityomapl138_map_io(void) ...@@ -628,7 +627,7 @@ static void __init mityomapl138_map_io(void)
MACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808") MACHINE_START(MITYOMAPL138, "MityDSP-L138/MityARM-1808")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = mityomapl138_map_io, .map_io = mityomapl138_map_io,
.init_irq = cp_intc_init, .init_irq = da850_init_irq,
.init_time = da850_init_time, .init_time = da850_init_time,
.init_machine = mityomapl138_init, .init_machine = mityomapl138_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -231,7 +231,7 @@ MACHINE_START(NEUROS_OSD2, "Neuros OSD2") ...@@ -231,7 +231,7 @@ MACHINE_START(NEUROS_OSD2, "Neuros OSD2")
/* Maintainer: Neuros Technologies <neuros@groups.google.com> */ /* Maintainer: Neuros Technologies <neuros@groups.google.com> */
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = davinci_ntosd2_map_io, .map_io = davinci_ntosd2_map_io,
.init_irq = davinci_irq_init, .init_irq = dm644x_init_irq,
.init_time = dm644x_init_time, .init_time = dm644x_init_time,
.init_machine = davinci_ntosd2_init, .init_machine = davinci_ntosd2_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -27,7 +27,6 @@ ...@@ -27,7 +27,6 @@
#include <asm/mach/arch.h> #include <asm/mach/arch.h>
#include <mach/common.h> #include <mach/common.h>
#include "cp_intc.h"
#include <mach/da8xx.h> #include <mach/da8xx.h>
#include <mach/mux.h> #include <mach/mux.h>
...@@ -399,7 +398,7 @@ static void __init omapl138_hawk_map_io(void) ...@@ -399,7 +398,7 @@ static void __init omapl138_hawk_map_io(void)
MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard") MACHINE_START(OMAPL138_HAWKBOARD, "AM18x/OMAP-L138 Hawkboard")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = omapl138_hawk_map_io, .map_io = omapl138_hawk_map_io,
.init_irq = cp_intc_init, .init_irq = da850_init_irq,
.init_time = da850_init_time, .init_time = da850_init_time,
.init_machine = omapl138_hawk_init, .init_machine = omapl138_hawk_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -152,7 +152,7 @@ static __init void davinci_sffsdr_init(void) ...@@ -152,7 +152,7 @@ static __init void davinci_sffsdr_init(void)
MACHINE_START(SFFSDR, "Lyrtech SFFSDR") MACHINE_START(SFFSDR, "Lyrtech SFFSDR")
.atag_offset = 0x100, .atag_offset = 0x100,
.map_io = davinci_sffsdr_map_io, .map_io = davinci_sffsdr_map_io,
.init_irq = davinci_irq_init, .init_irq = dm644x_init_irq,
.init_time = dm644x_init_time, .init_time = dm644x_init_time,
.init_machine = davinci_sffsdr_init, .init_machine = davinci_sffsdr_init,
.init_late = davinci_init_late, .init_late = davinci_init_late,
......
...@@ -23,9 +23,6 @@ ...@@ -23,9 +23,6 @@
struct davinci_soc_info davinci_soc_info; struct davinci_soc_info davinci_soc_info;
EXPORT_SYMBOL(davinci_soc_info); EXPORT_SYMBOL(davinci_soc_info);
void __iomem *davinci_intc_base;
int davinci_intc_type;
static int __init davinci_init_id(struct davinci_soc_info *soc_info) static int __init davinci_init_id(struct davinci_soc_info *soc_info)
{ {
int i; int i;
......
/*
* TI Common Platform Interrupt Controller (cp_intc) driver
*
* Author: Steve Chen <schen@mvista.com>
* Copyright (C) 2008-2009, MontaVista Software, Inc. <source@mvista.com>
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*/
#include <linux/export.h>
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/irqchip.h>
#include <linux/irqdomain.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <mach/common.h>
#include "cp_intc.h"
static inline unsigned int cp_intc_read(unsigned offset)
{
return __raw_readl(davinci_intc_base + offset);
}
static inline void cp_intc_write(unsigned long value, unsigned offset)
{
__raw_writel(value, davinci_intc_base + offset);
}
static void cp_intc_ack_irq(struct irq_data *d)
{
cp_intc_write(d->hwirq, CP_INTC_SYS_STAT_IDX_CLR);
}
/* Disable interrupt */
static void cp_intc_mask_irq(struct irq_data *d)
{
/* XXX don't know why we need to disable nIRQ here... */
cp_intc_write(1, CP_INTC_HOST_ENABLE_IDX_CLR);
cp_intc_write(d->hwirq, CP_INTC_SYS_ENABLE_IDX_CLR);
cp_intc_write(1, CP_INTC_HOST_ENABLE_IDX_SET);
}
/* Enable interrupt */
static void cp_intc_unmask_irq(struct irq_data *d)
{
cp_intc_write(d->hwirq, CP_INTC_SYS_ENABLE_IDX_SET);
}
static int cp_intc_set_irq_type(struct irq_data *d, unsigned int flow_type)
{
unsigned reg = BIT_WORD(d->hwirq);
unsigned mask = BIT_MASK(d->hwirq);
unsigned polarity = cp_intc_read(CP_INTC_SYS_POLARITY(reg));
unsigned type = cp_intc_read(CP_INTC_SYS_TYPE(reg));
switch (flow_type) {
case IRQ_TYPE_EDGE_RISING:
polarity |= mask;
type |= mask;
break;
case IRQ_TYPE_EDGE_FALLING:
polarity &= ~mask;
type |= mask;
break;
case IRQ_TYPE_LEVEL_HIGH:
polarity |= mask;
type &= ~mask;
break;
case IRQ_TYPE_LEVEL_LOW:
polarity &= ~mask;
type &= ~mask;
break;
default:
return -EINVAL;
}
cp_intc_write(polarity, CP_INTC_SYS_POLARITY(reg));
cp_intc_write(type, CP_INTC_SYS_TYPE(reg));
return 0;
}
static struct irq_chip cp_intc_irq_chip = {
.name = "cp_intc",
.irq_ack = cp_intc_ack_irq,
.irq_mask = cp_intc_mask_irq,
.irq_unmask = cp_intc_unmask_irq,
.irq_set_type = cp_intc_set_irq_type,
.flags = IRQCHIP_SKIP_SET_WAKE,
};
static struct irq_domain *cp_intc_domain;
static int cp_intc_host_map(struct irq_domain *h, unsigned int virq,
irq_hw_number_t hw)
{
pr_debug("cp_intc_host_map(%d, 0x%lx)\n", virq, hw);
irq_set_chip(virq, &cp_intc_irq_chip);
irq_set_probe(virq);
irq_set_handler(virq, handle_edge_irq);
return 0;
}
static const struct irq_domain_ops cp_intc_host_ops = {
.map = cp_intc_host_map,
.xlate = irq_domain_xlate_onetwocell,
};
int __init cp_intc_of_init(struct device_node *node, struct device_node *parent)
{
u32 num_irq = davinci_soc_info.intc_irq_num;
u8 *irq_prio = davinci_soc_info.intc_irq_prios;
u32 *host_map = davinci_soc_info.intc_host_map;
unsigned num_reg = BITS_TO_LONGS(num_irq);
int i, irq_base;
davinci_intc_type = DAVINCI_INTC_TYPE_CP_INTC;
if (node) {
davinci_intc_base = of_iomap(node, 0);
if (of_property_read_u32(node, "ti,intc-size", &num_irq))
pr_warn("unable to get intc-size, default to %d\n",
num_irq);
} else {
davinci_intc_base = ioremap(davinci_soc_info.intc_base, SZ_8K);
}
if (WARN_ON(!davinci_intc_base))
return -EINVAL;
cp_intc_write(0, CP_INTC_GLOBAL_ENABLE);
/* Disable all host interrupts */
cp_intc_write(0, CP_INTC_HOST_ENABLE(0));
/* Disable system interrupts */
for (i = 0; i < num_reg; i++)
cp_intc_write(~0, CP_INTC_SYS_ENABLE_CLR(i));
/* Set to normal mode, no nesting, no priority hold */
cp_intc_write(0, CP_INTC_CTRL);
cp_intc_write(0, CP_INTC_HOST_CTRL);
/* Clear system interrupt status */
for (i = 0; i < num_reg; i++)
cp_intc_write(~0, CP_INTC_SYS_STAT_CLR(i));
/* Enable nIRQ (what about nFIQ?) */
cp_intc_write(1, CP_INTC_HOST_ENABLE_IDX_SET);
/*
* Priority is determined by host channel: lower channel number has
* higher priority i.e. channel 0 has highest priority and channel 31
* had the lowest priority.
*/
num_reg = (num_irq + 3) >> 2; /* 4 channels per register */
if (irq_prio) {
unsigned j, k;
u32 val;
for (k = i = 0; i < num_reg; i++) {
for (val = j = 0; j < 4; j++, k++) {
val >>= 8;
if (k < num_irq)
val |= irq_prio[k] << 24;
}
cp_intc_write(val, CP_INTC_CHAN_MAP(i));
}
} else {
/*
* Default everything to channel 15 if priority not specified.
* Note that channel 0-1 are mapped to nFIQ and channels 2-31
* are mapped to nIRQ.
*/
for (i = 0; i < num_reg; i++)
cp_intc_write(0x0f0f0f0f, CP_INTC_CHAN_MAP(i));
}
if (host_map)
for (i = 0; host_map[i] != -1; i++)
cp_intc_write(host_map[i], CP_INTC_HOST_MAP(i));
irq_base = irq_alloc_descs(-1, 0, num_irq, 0);
if (irq_base < 0) {
pr_warn("Couldn't allocate IRQ numbers\n");
irq_base = 0;
}
/* create a legacy host */
cp_intc_domain = irq_domain_add_legacy(node, num_irq,
irq_base, 0, &cp_intc_host_ops, NULL);
if (!cp_intc_domain) {
pr_err("cp_intc: failed to allocate irq host!\n");
return -EINVAL;
}
/* Enable global interrupt */
cp_intc_write(1, CP_INTC_GLOBAL_ENABLE);
return 0;
}
void __init cp_intc_init(void)
{
cp_intc_of_init(NULL, NULL);
}
IRQCHIP_DECLARE(cp_intc, "ti,cp-intc", cp_intc_of_init);
/*
* TI Common Platform Interrupt Controller (cp_intc) definitions
*
* Author: Steve Chen <schen@mvista.com>
* Copyright (C) 2008-2009, MontaVista Software, Inc. <source@mvista.com>
*
* This file is licensed under the terms of the GNU General Public License
* version 2. This program is licensed "as is" without any warranty of any
* kind, whether express or implied.
*/
#ifndef __ASM_HARDWARE_CP_INTC_H
#define __ASM_HARDWARE_CP_INTC_H
#define CP_INTC_REV 0x00
#define CP_INTC_CTRL 0x04
#define CP_INTC_HOST_CTRL 0x0C
#define CP_INTC_GLOBAL_ENABLE 0x10
#define CP_INTC_GLOBAL_NESTING_LEVEL 0x1C
#define CP_INTC_SYS_STAT_IDX_SET 0x20
#define CP_INTC_SYS_STAT_IDX_CLR 0x24
#define CP_INTC_SYS_ENABLE_IDX_SET 0x28
#define CP_INTC_SYS_ENABLE_IDX_CLR 0x2C
#define CP_INTC_GLOBAL_WAKEUP_ENABLE 0x30
#define CP_INTC_HOST_ENABLE_IDX_SET 0x34
#define CP_INTC_HOST_ENABLE_IDX_CLR 0x38
#define CP_INTC_PACING_PRESCALE 0x40
#define CP_INTC_VECTOR_BASE 0x50
#define CP_INTC_VECTOR_SIZE 0x54
#define CP_INTC_VECTOR_NULL 0x58
#define CP_INTC_PRIO_IDX 0x80
#define CP_INTC_PRIO_VECTOR 0x84
#define CP_INTC_SECURE_ENABLE 0x90
#define CP_INTC_SECURE_PRIO_IDX 0x94
#define CP_INTC_PACING_PARAM(n) (0x0100 + (n << 4))
#define CP_INTC_PACING_DEC(n) (0x0104 + (n << 4))
#define CP_INTC_PACING_MAP(n) (0x0108 + (n << 4))
#define CP_INTC_SYS_RAW_STAT(n) (0x0200 + (n << 2))
#define CP_INTC_SYS_STAT_CLR(n) (0x0280 + (n << 2))
#define CP_INTC_SYS_ENABLE_SET(n) (0x0300 + (n << 2))
#define CP_INTC_SYS_ENABLE_CLR(n) (0x0380 + (n << 2))
#define CP_INTC_CHAN_MAP(n) (0x0400 + (n << 2))
#define CP_INTC_HOST_MAP(n) (0x0800 + (n << 2))
#define CP_INTC_HOST_PRIO_IDX(n) (0x0900 + (n << 2))
#define CP_INTC_SYS_POLARITY(n) (0x0D00 + (n << 2))
#define CP_INTC_SYS_TYPE(n) (0x0D80 + (n << 2))
#define CP_INTC_WAKEUP_ENABLE(n) (0x0E00 + (n << 2))
#define CP_INTC_DEBUG_SELECT(n) (0x0F00 + (n << 2))
#define CP_INTC_SYS_SECURE_ENABLE(n) (0x1000 + (n << 2))
#define CP_INTC_HOST_NESTING_LEVEL(n) (0x1100 + (n << 2))
#define CP_INTC_HOST_ENABLE(n) (0x1500 + (n << 2))
#define CP_INTC_HOST_PRIO_VECTOR(n) (0x1600 + (n << 2))
#define CP_INTC_VECTOR_ADDR(n) (0x2000 + (n << 2))
void cp_intc_init(void);
int cp_intc_of_init(struct device_node *, struct device_node *);
#endif /* __ASM_HARDWARE_CP_INTC_H */
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include <linux/clk/davinci.h> #include <linux/clk/davinci.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irqchip/irq-davinci-cp-intc.h>
#include <linux/platform_data/gpio-davinci.h> #include <linux/platform_data/gpio-davinci.h>
#include <asm/mach/map.h> #include <asm/mach/map.h>
...@@ -19,9 +20,9 @@ ...@@ -19,9 +20,9 @@
#include <mach/common.h> #include <mach/common.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/da8xx.h> #include <mach/da8xx.h>
#include <mach/irqs.h>
#include <mach/time.h> #include <mach/time.h>
#include "irqs.h"
#include "mux.h" #include "mux.h"
/* Offsets of the 8 compare registers on the da830 */ /* Offsets of the 8 compare registers on the da830 */
...@@ -623,101 +624,6 @@ const short da830_eqep1_pins[] __initconst = { ...@@ -623,101 +624,6 @@ const short da830_eqep1_pins[] __initconst = {
-1 -1
}; };
/* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */
static u8 da830_default_priorities[DA830_N_CP_INTC_IRQ] = {
[IRQ_DA8XX_COMMTX] = 7,
[IRQ_DA8XX_COMMRX] = 7,
[IRQ_DA8XX_NINT] = 7,
[IRQ_DA8XX_EVTOUT0] = 7,
[IRQ_DA8XX_EVTOUT1] = 7,
[IRQ_DA8XX_EVTOUT2] = 7,
[IRQ_DA8XX_EVTOUT3] = 7,
[IRQ_DA8XX_EVTOUT4] = 7,
[IRQ_DA8XX_EVTOUT5] = 7,
[IRQ_DA8XX_EVTOUT6] = 7,
[IRQ_DA8XX_EVTOUT7] = 7,
[IRQ_DA8XX_CCINT0] = 7,
[IRQ_DA8XX_CCERRINT] = 7,
[IRQ_DA8XX_TCERRINT0] = 7,
[IRQ_DA8XX_AEMIFINT] = 7,
[IRQ_DA8XX_I2CINT0] = 7,
[IRQ_DA8XX_MMCSDINT0] = 7,
[IRQ_DA8XX_MMCSDINT1] = 7,
[IRQ_DA8XX_ALLINT0] = 7,
[IRQ_DA8XX_RTC] = 7,
[IRQ_DA8XX_SPINT0] = 7,
[IRQ_DA8XX_TINT12_0] = 7,
[IRQ_DA8XX_TINT34_0] = 7,
[IRQ_DA8XX_TINT12_1] = 7,
[IRQ_DA8XX_TINT34_1] = 7,
[IRQ_DA8XX_UARTINT0] = 7,
[IRQ_DA8XX_KEYMGRINT] = 7,
[IRQ_DA830_MPUERR] = 7,
[IRQ_DA8XX_CHIPINT0] = 7,
[IRQ_DA8XX_CHIPINT1] = 7,
[IRQ_DA8XX_CHIPINT2] = 7,
[IRQ_DA8XX_CHIPINT3] = 7,
[IRQ_DA8XX_TCERRINT1] = 7,
[IRQ_DA8XX_C0_RX_THRESH_PULSE] = 7,
[IRQ_DA8XX_C0_RX_PULSE] = 7,
[IRQ_DA8XX_C0_TX_PULSE] = 7,
[IRQ_DA8XX_C0_MISC_PULSE] = 7,
[IRQ_DA8XX_C1_RX_THRESH_PULSE] = 7,
[IRQ_DA8XX_C1_RX_PULSE] = 7,
[IRQ_DA8XX_C1_TX_PULSE] = 7,
[IRQ_DA8XX_C1_MISC_PULSE] = 7,
[IRQ_DA8XX_MEMERR] = 7,
[IRQ_DA8XX_GPIO0] = 7,
[IRQ_DA8XX_GPIO1] = 7,
[IRQ_DA8XX_GPIO2] = 7,
[IRQ_DA8XX_GPIO3] = 7,
[IRQ_DA8XX_GPIO4] = 7,
[IRQ_DA8XX_GPIO5] = 7,
[IRQ_DA8XX_GPIO6] = 7,
[IRQ_DA8XX_GPIO7] = 7,
[IRQ_DA8XX_GPIO8] = 7,
[IRQ_DA8XX_I2CINT1] = 7,
[IRQ_DA8XX_LCDINT] = 7,
[IRQ_DA8XX_UARTINT1] = 7,
[IRQ_DA8XX_MCASPINT] = 7,
[IRQ_DA8XX_ALLINT1] = 7,
[IRQ_DA8XX_SPINT1] = 7,
[IRQ_DA8XX_UHPI_INT1] = 7,
[IRQ_DA8XX_USB_INT] = 7,
[IRQ_DA8XX_IRQN] = 7,
[IRQ_DA8XX_RWAKEUP] = 7,
[IRQ_DA8XX_UARTINT2] = 7,
[IRQ_DA8XX_DFTSSINT] = 7,
[IRQ_DA8XX_EHRPWM0] = 7,
[IRQ_DA8XX_EHRPWM0TZ] = 7,
[IRQ_DA8XX_EHRPWM1] = 7,
[IRQ_DA8XX_EHRPWM1TZ] = 7,
[IRQ_DA830_EHRPWM2] = 7,
[IRQ_DA830_EHRPWM2TZ] = 7,
[IRQ_DA8XX_ECAP0] = 7,
[IRQ_DA8XX_ECAP1] = 7,
[IRQ_DA8XX_ECAP2] = 7,
[IRQ_DA830_EQEP0] = 7,
[IRQ_DA830_EQEP1] = 7,
[IRQ_DA830_T12CMPINT0_0] = 7,
[IRQ_DA830_T12CMPINT1_0] = 7,
[IRQ_DA830_T12CMPINT2_0] = 7,
[IRQ_DA830_T12CMPINT3_0] = 7,
[IRQ_DA830_T12CMPINT4_0] = 7,
[IRQ_DA830_T12CMPINT5_0] = 7,
[IRQ_DA830_T12CMPINT6_0] = 7,
[IRQ_DA830_T12CMPINT7_0] = 7,
[IRQ_DA830_T12CMPINT0_1] = 7,
[IRQ_DA830_T12CMPINT1_1] = 7,
[IRQ_DA830_T12CMPINT2_1] = 7,
[IRQ_DA830_T12CMPINT3_1] = 7,
[IRQ_DA830_T12CMPINT4_1] = 7,
[IRQ_DA830_T12CMPINT5_1] = 7,
[IRQ_DA830_T12CMPINT6_1] = 7,
[IRQ_DA830_T12CMPINT7_1] = 7,
[IRQ_DA8XX_ARMCLKSTOPREQ] = 7,
};
static struct map_desc da830_io_desc[] = { static struct map_desc da830_io_desc[] = {
{ {
.virtual = IO_VIRT, .virtual = IO_VIRT,
...@@ -772,17 +678,17 @@ int __init da830_register_gpio(void) ...@@ -772,17 +678,17 @@ int __init da830_register_gpio(void)
static struct davinci_timer_instance da830_timer_instance[2] = { static struct davinci_timer_instance da830_timer_instance[2] = {
{ {
.base = DA8XX_TIMER64P0_BASE, .base = DA8XX_TIMER64P0_BASE,
.bottom_irq = IRQ_DA8XX_TINT12_0, .bottom_irq = DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT12_0),
.top_irq = IRQ_DA8XX_TINT34_0, .top_irq = DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT34_0),
.cmp_off = DA830_CMP12_0, .cmp_off = DA830_CMP12_0,
.cmp_irq = IRQ_DA830_T12CMPINT0_0, .cmp_irq = DAVINCI_INTC_IRQ(IRQ_DA830_T12CMPINT0_0),
}, },
{ {
.base = DA8XX_TIMER64P1_BASE, .base = DA8XX_TIMER64P1_BASE,
.bottom_irq = IRQ_DA8XX_TINT12_1, .bottom_irq = DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT12_1),
.top_irq = IRQ_DA8XX_TINT34_1, .top_irq = DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT34_1),
.cmp_off = DA830_CMP12_0, .cmp_off = DA830_CMP12_0,
.cmp_irq = IRQ_DA830_T12CMPINT0_1, .cmp_irq = DAVINCI_INTC_IRQ(IRQ_DA830_T12CMPINT0_1),
}, },
}; };
...@@ -806,10 +712,6 @@ static const struct davinci_soc_info davinci_soc_info_da830 = { ...@@ -806,10 +712,6 @@ static const struct davinci_soc_info davinci_soc_info_da830 = {
.pinmux_base = DA8XX_SYSCFG0_BASE + 0x120, .pinmux_base = DA8XX_SYSCFG0_BASE + 0x120,
.pinmux_pins = da830_pins, .pinmux_pins = da830_pins,
.pinmux_pins_num = ARRAY_SIZE(da830_pins), .pinmux_pins_num = ARRAY_SIZE(da830_pins),
.intc_base = DA8XX_CP_INTC_BASE,
.intc_type = DAVINCI_INTC_TYPE_CP_INTC,
.intc_irq_prios = da830_default_priorities,
.intc_irq_num = DA830_N_CP_INTC_IRQ,
.timer_info = &da830_timer_info, .timer_info = &da830_timer_info,
.emac_pdata = &da8xx_emac_pdata, .emac_pdata = &da8xx_emac_pdata,
}; };
...@@ -822,6 +724,20 @@ void __init da830_init(void) ...@@ -822,6 +724,20 @@ void __init da830_init(void)
WARN(!da8xx_syscfg0_base, "Unable to map syscfg0 module"); WARN(!da8xx_syscfg0_base, "Unable to map syscfg0 module");
} }
static const struct davinci_cp_intc_config da830_cp_intc_config = {
.reg = {
.start = DA8XX_CP_INTC_BASE,
.end = DA8XX_CP_INTC_BASE + SZ_8K - 1,
.flags = IORESOURCE_MEM,
},
.num_irqs = DA830_N_CP_INTC_IRQ,
};
void __init da830_init_irq(void)
{
davinci_cp_intc_init(&da830_cp_intc_config);
}
void __init da830_init_time(void) void __init da830_init_time(void)
{ {
void __iomem *pll; void __iomem *pll;
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
#include <linux/cpufreq.h> #include <linux/cpufreq.h>
#include <linux/gpio.h> #include <linux/gpio.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irqchip/irq-davinci-cp-intc.h>
#include <linux/mfd/da8xx-cfgchip.h> #include <linux/mfd/da8xx-cfgchip.h>
#include <linux/platform_data/clk-da8xx-cfgchip.h> #include <linux/platform_data/clk-da8xx-cfgchip.h>
#include <linux/platform_data/clk-davinci-pll.h> #include <linux/platform_data/clk-davinci-pll.h>
...@@ -32,10 +33,10 @@ ...@@ -32,10 +33,10 @@
#include <mach/cpufreq.h> #include <mach/cpufreq.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/da8xx.h> #include <mach/da8xx.h>
#include <mach/irqs.h>
#include <mach/pm.h> #include <mach/pm.h>
#include <mach/time.h> #include <mach/time.h>
#include "irqs.h"
#include "mux.h" #include "mux.h"
#define DA850_PLL1_BASE 0x01e1a000 #define DA850_PLL1_BASE 0x01e1a000
...@@ -298,111 +299,6 @@ const short da850_vpif_display_pins[] __initconst = { ...@@ -298,111 +299,6 @@ const short da850_vpif_display_pins[] __initconst = {
-1 -1
}; };
/* FIQ are pri 0-1; otherwise 2-7, with 7 lowest priority */
static u8 da850_default_priorities[DA850_N_CP_INTC_IRQ] = {
[IRQ_DA8XX_COMMTX] = 7,
[IRQ_DA8XX_COMMRX] = 7,
[IRQ_DA8XX_NINT] = 7,
[IRQ_DA8XX_EVTOUT0] = 7,
[IRQ_DA8XX_EVTOUT1] = 7,
[IRQ_DA8XX_EVTOUT2] = 7,
[IRQ_DA8XX_EVTOUT3] = 7,
[IRQ_DA8XX_EVTOUT4] = 7,
[IRQ_DA8XX_EVTOUT5] = 7,
[IRQ_DA8XX_EVTOUT6] = 7,
[IRQ_DA8XX_EVTOUT7] = 7,
[IRQ_DA8XX_CCINT0] = 7,
[IRQ_DA8XX_CCERRINT] = 7,
[IRQ_DA8XX_TCERRINT0] = 7,
[IRQ_DA8XX_AEMIFINT] = 7,
[IRQ_DA8XX_I2CINT0] = 7,
[IRQ_DA8XX_MMCSDINT0] = 7,
[IRQ_DA8XX_MMCSDINT1] = 7,
[IRQ_DA8XX_ALLINT0] = 7,
[IRQ_DA8XX_RTC] = 7,
[IRQ_DA8XX_SPINT0] = 7,
[IRQ_DA8XX_TINT12_0] = 7,
[IRQ_DA8XX_TINT34_0] = 7,
[IRQ_DA8XX_TINT12_1] = 7,
[IRQ_DA8XX_TINT34_1] = 7,
[IRQ_DA8XX_UARTINT0] = 7,
[IRQ_DA8XX_KEYMGRINT] = 7,
[IRQ_DA850_MPUADDRERR0] = 7,
[IRQ_DA8XX_CHIPINT0] = 7,
[IRQ_DA8XX_CHIPINT1] = 7,
[IRQ_DA8XX_CHIPINT2] = 7,
[IRQ_DA8XX_CHIPINT3] = 7,
[IRQ_DA8XX_TCERRINT1] = 7,
[IRQ_DA8XX_C0_RX_THRESH_PULSE] = 7,
[IRQ_DA8XX_C0_RX_PULSE] = 7,
[IRQ_DA8XX_C0_TX_PULSE] = 7,
[IRQ_DA8XX_C0_MISC_PULSE] = 7,
[IRQ_DA8XX_C1_RX_THRESH_PULSE] = 7,
[IRQ_DA8XX_C1_RX_PULSE] = 7,
[IRQ_DA8XX_C1_TX_PULSE] = 7,
[IRQ_DA8XX_C1_MISC_PULSE] = 7,
[IRQ_DA8XX_MEMERR] = 7,
[IRQ_DA8XX_GPIO0] = 7,
[IRQ_DA8XX_GPIO1] = 7,
[IRQ_DA8XX_GPIO2] = 7,
[IRQ_DA8XX_GPIO3] = 7,
[IRQ_DA8XX_GPIO4] = 7,
[IRQ_DA8XX_GPIO5] = 7,
[IRQ_DA8XX_GPIO6] = 7,
[IRQ_DA8XX_GPIO7] = 7,
[IRQ_DA8XX_GPIO8] = 7,
[IRQ_DA8XX_I2CINT1] = 7,
[IRQ_DA8XX_LCDINT] = 7,
[IRQ_DA8XX_UARTINT1] = 7,
[IRQ_DA8XX_MCASPINT] = 7,
[IRQ_DA8XX_ALLINT1] = 7,
[IRQ_DA8XX_SPINT1] = 7,
[IRQ_DA8XX_UHPI_INT1] = 7,
[IRQ_DA8XX_USB_INT] = 7,
[IRQ_DA8XX_IRQN] = 7,
[IRQ_DA8XX_RWAKEUP] = 7,
[IRQ_DA8XX_UARTINT2] = 7,
[IRQ_DA8XX_DFTSSINT] = 7,
[IRQ_DA8XX_EHRPWM0] = 7,
[IRQ_DA8XX_EHRPWM0TZ] = 7,
[IRQ_DA8XX_EHRPWM1] = 7,
[IRQ_DA8XX_EHRPWM1TZ] = 7,
[IRQ_DA850_SATAINT] = 7,
[IRQ_DA850_TINTALL_2] = 7,
[IRQ_DA8XX_ECAP0] = 7,
[IRQ_DA8XX_ECAP1] = 7,
[IRQ_DA8XX_ECAP2] = 7,
[IRQ_DA850_MMCSDINT0_1] = 7,
[IRQ_DA850_MMCSDINT1_1] = 7,
[IRQ_DA850_T12CMPINT0_2] = 7,
[IRQ_DA850_T12CMPINT1_2] = 7,
[IRQ_DA850_T12CMPINT2_2] = 7,
[IRQ_DA850_T12CMPINT3_2] = 7,
[IRQ_DA850_T12CMPINT4_2] = 7,
[IRQ_DA850_T12CMPINT5_2] = 7,
[IRQ_DA850_T12CMPINT6_2] = 7,
[IRQ_DA850_T12CMPINT7_2] = 7,
[IRQ_DA850_T12CMPINT0_3] = 7,
[IRQ_DA850_T12CMPINT1_3] = 7,
[IRQ_DA850_T12CMPINT2_3] = 7,
[IRQ_DA850_T12CMPINT3_3] = 7,
[IRQ_DA850_T12CMPINT4_3] = 7,
[IRQ_DA850_T12CMPINT5_3] = 7,
[IRQ_DA850_T12CMPINT6_3] = 7,
[IRQ_DA850_T12CMPINT7_3] = 7,
[IRQ_DA850_RPIINT] = 7,
[IRQ_DA850_VPIFINT] = 7,
[IRQ_DA850_CCINT1] = 7,
[IRQ_DA850_CCERRINT1] = 7,
[IRQ_DA850_TCERRINT2] = 7,
[IRQ_DA850_TINTALL_3] = 7,
[IRQ_DA850_MCBSP0RINT] = 7,
[IRQ_DA850_MCBSP0XINT] = 7,
[IRQ_DA850_MCBSP1RINT] = 7,
[IRQ_DA850_MCBSP1XINT] = 7,
[IRQ_DA8XX_ARMCLKSTOPREQ] = 7,
};
static struct map_desc da850_io_desc[] = { static struct map_desc da850_io_desc[] = {
{ {
.virtual = IO_VIRT, .virtual = IO_VIRT,
...@@ -439,23 +335,23 @@ static struct davinci_id da850_ids[] = { ...@@ -439,23 +335,23 @@ static struct davinci_id da850_ids[] = {
static struct davinci_timer_instance da850_timer_instance[4] = { static struct davinci_timer_instance da850_timer_instance[4] = {
{ {
.base = DA8XX_TIMER64P0_BASE, .base = DA8XX_TIMER64P0_BASE,
.bottom_irq = IRQ_DA8XX_TINT12_0, .bottom_irq = DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT12_0),
.top_irq = IRQ_DA8XX_TINT34_0, .top_irq = DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT34_0),
}, },
{ {
.base = DA8XX_TIMER64P1_BASE, .base = DA8XX_TIMER64P1_BASE,
.bottom_irq = IRQ_DA8XX_TINT12_1, .bottom_irq = DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT12_1),
.top_irq = IRQ_DA8XX_TINT34_1, .top_irq = DAVINCI_INTC_IRQ(IRQ_DA8XX_TINT34_1),
}, },
{ {
.base = DA850_TIMER64P2_BASE, .base = DA850_TIMER64P2_BASE,
.bottom_irq = IRQ_DA850_TINT12_2, .bottom_irq = DAVINCI_INTC_IRQ(IRQ_DA850_TINT12_2),
.top_irq = IRQ_DA850_TINT34_2, .top_irq = DAVINCI_INTC_IRQ(IRQ_DA850_TINT34_2),
}, },
{ {
.base = DA850_TIMER64P3_BASE, .base = DA850_TIMER64P3_BASE,
.bottom_irq = IRQ_DA850_TINT12_3, .bottom_irq = DAVINCI_INTC_IRQ(IRQ_DA850_TINT12_3),
.top_irq = IRQ_DA850_TINT34_3, .top_irq = DAVINCI_INTC_IRQ(IRQ_DA850_TINT34_3),
}, },
}; };
...@@ -658,8 +554,8 @@ static struct platform_device da850_vpif_dev = { ...@@ -658,8 +554,8 @@ static struct platform_device da850_vpif_dev = {
static struct resource da850_vpif_display_resource[] = { static struct resource da850_vpif_display_resource[] = {
{ {
.start = IRQ_DA850_VPIFINT, .start = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT),
.end = IRQ_DA850_VPIFINT, .end = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -677,13 +573,13 @@ static struct platform_device da850_vpif_display_dev = { ...@@ -677,13 +573,13 @@ static struct platform_device da850_vpif_display_dev = {
static struct resource da850_vpif_capture_resource[] = { static struct resource da850_vpif_capture_resource[] = {
{ {
.start = IRQ_DA850_VPIFINT, .start = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT),
.end = IRQ_DA850_VPIFINT, .end = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DA850_VPIFINT, .start = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT),
.end = IRQ_DA850_VPIFINT, .end = DAVINCI_INTC_IRQ(IRQ_DA850_VPIFINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -738,10 +634,6 @@ static const struct davinci_soc_info davinci_soc_info_da850 = { ...@@ -738,10 +634,6 @@ static const struct davinci_soc_info davinci_soc_info_da850 = {
.pinmux_base = DA8XX_SYSCFG0_BASE + 0x120, .pinmux_base = DA8XX_SYSCFG0_BASE + 0x120,
.pinmux_pins = da850_pins, .pinmux_pins = da850_pins,
.pinmux_pins_num = ARRAY_SIZE(da850_pins), .pinmux_pins_num = ARRAY_SIZE(da850_pins),
.intc_base = DA8XX_CP_INTC_BASE,
.intc_type = DAVINCI_INTC_TYPE_CP_INTC,
.intc_irq_prios = da850_default_priorities,
.intc_irq_num = DA850_N_CP_INTC_IRQ,
.timer_info = &da850_timer_info, .timer_info = &da850_timer_info,
.emac_pdata = &da8xx_emac_pdata, .emac_pdata = &da8xx_emac_pdata,
.sram_dma = DA8XX_SHARED_RAM_BASE, .sram_dma = DA8XX_SHARED_RAM_BASE,
...@@ -760,6 +652,20 @@ void __init da850_init(void) ...@@ -760,6 +652,20 @@ void __init da850_init(void)
WARN(!da8xx_syscfg1_base, "Unable to map syscfg1 module"); WARN(!da8xx_syscfg1_base, "Unable to map syscfg1 module");
} }
static const struct davinci_cp_intc_config da850_cp_intc_config = {
.reg = {
.start = DA8XX_CP_INTC_BASE,
.end = DA8XX_CP_INTC_BASE + SZ_8K - 1,
.flags = IORESOURCE_MEM,
},
.num_irqs = DA850_N_CP_INTC_IRQ,
};
void __init da850_init_irq(void)
{
davinci_cp_intc_init(&da850_cp_intc_config);
}
void __init da850_init_time(void) void __init da850_init_time(void)
{ {
void __iomem *pll0; void __iomem *pll0;
......
...@@ -88,6 +88,7 @@ int davinci_init_wdt(void); ...@@ -88,6 +88,7 @@ int davinci_init_wdt(void);
/* DM355 function declarations */ /* DM355 function declarations */
void dm355_init(void); void dm355_init(void);
void dm355_init_time(void); void dm355_init_time(void);
void dm355_init_irq(void);
void dm355_register_clocks(void); void dm355_register_clocks(void);
void dm355_init_spi0(unsigned chipselect_mask, void dm355_init_spi0(unsigned chipselect_mask,
const struct spi_board_info *info, unsigned len); const struct spi_board_info *info, unsigned len);
...@@ -97,6 +98,7 @@ int dm355_gpio_register(void); ...@@ -97,6 +98,7 @@ int dm355_gpio_register(void);
/* DM365 function declarations */ /* DM365 function declarations */
void dm365_init(void); void dm365_init(void);
void dm365_init_irq(void);
void dm365_init_time(void); void dm365_init_time(void);
void dm365_register_clocks(void); void dm365_register_clocks(void);
void dm365_init_asp(void); void dm365_init_asp(void);
...@@ -110,6 +112,7 @@ int dm365_gpio_register(void); ...@@ -110,6 +112,7 @@ int dm365_gpio_register(void);
/* DM644x function declarations */ /* DM644x function declarations */
void dm644x_init(void); void dm644x_init(void);
void dm644x_init_irq(void);
void dm644x_init_devices(void); void dm644x_init_devices(void);
void dm644x_init_time(void); void dm644x_init_time(void);
void dm644x_register_clocks(void); void dm644x_register_clocks(void);
...@@ -119,6 +122,7 @@ int dm644x_gpio_register(void); ...@@ -119,6 +122,7 @@ int dm644x_gpio_register(void);
/* DM646x function declarations */ /* DM646x function declarations */
void dm646x_init(void); void dm646x_init(void);
void dm646x_init_irq(void);
void dm646x_init_time(unsigned long ref_clk_rate, unsigned long aux_clkin_rate); void dm646x_init_time(unsigned long ref_clk_rate, unsigned long aux_clkin_rate);
void dm646x_register_clocks(void); void dm646x_register_clocks(void);
void dm646x_init_mcasp0(struct snd_platform_data *pdata); void dm646x_init_mcasp0(struct snd_platform_data *pdata);
......
This diff is collapsed.
...@@ -11,21 +11,20 @@ ...@@ -11,21 +11,20 @@
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/platform_data/i2c-davinci.h>
#include <linux/platform_data/mmc-davinci.h>
#include <linux/platform_data/edma.h>
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <mach/hardware.h> #include <mach/hardware.h>
#include <linux/platform_data/i2c-davinci.h>
#include <mach/irqs.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/mux.h> #include <mach/mux.h>
#include <linux/platform_data/mmc-davinci.h>
#include <mach/time.h> #include <mach/time.h>
#include <linux/platform_data/edma.h>
#include "davinci.h" #include "davinci.h"
#include "irqs.h"
#define DAVINCI_I2C_BASE 0x01C21000 #define DAVINCI_I2C_BASE 0x01C21000
#define DAVINCI_ATA_BASE 0x01C66000 #define DAVINCI_ATA_BASE 0x01C66000
...@@ -56,7 +55,7 @@ static struct resource i2c_resources[] = { ...@@ -56,7 +55,7 @@ static struct resource i2c_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_I2C, .start = DAVINCI_INTC_IRQ(IRQ_I2C),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -84,8 +83,8 @@ static struct resource ide_resources[] = { ...@@ -84,8 +83,8 @@ static struct resource ide_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_IDE, .start = DAVINCI_INTC_IRQ(IRQ_IDE),
.end = IRQ_IDE, .end = DAVINCI_INTC_IRQ(IRQ_IDE),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -133,11 +132,11 @@ static struct resource mmcsd0_resources[] = { ...@@ -133,11 +132,11 @@ static struct resource mmcsd0_resources[] = {
}, },
/* IRQs: MMC/SD, then SDIO */ /* IRQs: MMC/SD, then SDIO */
{ {
.start = IRQ_MMCINT, .start = DAVINCI_INTC_IRQ(IRQ_MMCINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, { }, {
/* different on dm355 */ /* different on dm355 */
.start = IRQ_SDIOINT, .start = DAVINCI_INTC_IRQ(IRQ_SDIOINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -163,10 +162,10 @@ static struct resource mmcsd1_resources[] = { ...@@ -163,10 +162,10 @@ static struct resource mmcsd1_resources[] = {
}, },
/* IRQs: MMC/SD, then SDIO */ /* IRQs: MMC/SD, then SDIO */
{ {
.start = IRQ_DM355_MMCINT1, .start = DAVINCI_INTC_IRQ(IRQ_DM355_MMCINT1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, { }, {
.start = IRQ_DM355_SDIOINT1, .start = DAVINCI_INTC_IRQ(IRQ_DM355_SDIOINT1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -219,7 +218,8 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) ...@@ -219,7 +218,8 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)
mmcsd1_resources[0].start = DM365_MMCSD1_BASE; mmcsd1_resources[0].start = DM365_MMCSD1_BASE;
mmcsd1_resources[0].end = DM365_MMCSD1_BASE + mmcsd1_resources[0].end = DM365_MMCSD1_BASE +
SZ_4K - 1; SZ_4K - 1;
mmcsd1_resources[2].start = IRQ_DM365_SDIOINT1; mmcsd1_resources[2].start = DAVINCI_INTC_IRQ(
IRQ_DM365_SDIOINT1);
davinci_mmcsd1_device.name = "da830-mmc"; davinci_mmcsd1_device.name = "da830-mmc";
} else } else
break; break;
...@@ -230,7 +230,8 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) ...@@ -230,7 +230,8 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)
if (cpu_is_davinci_dm355()) { if (cpu_is_davinci_dm355()) {
mmcsd0_resources[0].start = DM355_MMCSD0_BASE; mmcsd0_resources[0].start = DM355_MMCSD0_BASE;
mmcsd0_resources[0].end = DM355_MMCSD0_BASE + SZ_4K - 1; mmcsd0_resources[0].end = DM355_MMCSD0_BASE + SZ_4K - 1;
mmcsd0_resources[2].start = IRQ_DM355_SDIOINT0; mmcsd0_resources[2].start = DAVINCI_INTC_IRQ(
IRQ_DM355_SDIOINT0);
/* expose all 6 MMC0 signals: CLK, CMD, DATA[0..3] */ /* expose all 6 MMC0 signals: CLK, CMD, DATA[0..3] */
davinci_cfg_reg(DM355_MMCSD0); davinci_cfg_reg(DM355_MMCSD0);
...@@ -241,7 +242,8 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config) ...@@ -241,7 +242,8 @@ void __init davinci_setup_mmc(int module, struct davinci_mmc_config *config)
mmcsd0_resources[0].start = DM365_MMCSD0_BASE; mmcsd0_resources[0].start = DM365_MMCSD0_BASE;
mmcsd0_resources[0].end = DM365_MMCSD0_BASE + mmcsd0_resources[0].end = DM365_MMCSD0_BASE +
SZ_4K - 1; SZ_4K - 1;
mmcsd0_resources[2].start = IRQ_DM365_SDIOINT0; mmcsd0_resources[2].start = DAVINCI_INTC_IRQ(
IRQ_DM365_SDIOINT0);
davinci_mmcsd0_device.name = "da830-mmc"; davinci_mmcsd0_device.name = "da830-mmc";
} else if (cpu_is_davinci_dm644x()) { } else if (cpu_is_davinci_dm644x()) {
/* REVISIT: should this be in board-init code? */ /* REVISIT: should this be in board-init code? */
...@@ -313,13 +315,13 @@ int davinci_gpio_register(struct resource *res, int size, void *pdata) ...@@ -313,13 +315,13 @@ int davinci_gpio_register(struct resource *res, int size, void *pdata)
struct davinci_timer_instance davinci_timer_instance[2] = { struct davinci_timer_instance davinci_timer_instance[2] = {
{ {
.base = DAVINCI_TIMER0_BASE, .base = DAVINCI_TIMER0_BASE,
.bottom_irq = IRQ_TINT0_TINT12, .bottom_irq = DAVINCI_INTC_IRQ(IRQ_TINT0_TINT12),
.top_irq = IRQ_TINT0_TINT34, .top_irq = DAVINCI_INTC_IRQ(IRQ_TINT0_TINT34),
}, },
{ {
.base = DAVINCI_TIMER1_BASE, .base = DAVINCI_TIMER1_BASE,
.bottom_irq = IRQ_TINT1_TINT12, .bottom_irq = DAVINCI_INTC_IRQ(IRQ_TINT1_TINT12),
.top_irq = IRQ_TINT1_TINT34, .top_irq = DAVINCI_INTC_IRQ(IRQ_TINT1_TINT34),
}, },
}; };
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irqchip/irq-davinci-aintc.h>
#include <linux/platform_data/edma.h> #include <linux/platform_data/edma.h>
#include <linux/platform_data/gpio-davinci.h> #include <linux/platform_data/gpio-davinci.h>
#include <linux/platform_data/spi-davinci.h> #include <linux/platform_data/spi-davinci.h>
...@@ -26,13 +27,13 @@ ...@@ -26,13 +27,13 @@
#include <mach/common.h> #include <mach/common.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/irqs.h>
#include <mach/mux.h> #include <mach/mux.h>
#include <mach/serial.h> #include <mach/serial.h>
#include <mach/time.h> #include <mach/time.h>
#include "asp.h" #include "asp.h"
#include "davinci.h" #include "davinci.h"
#include "irqs.h"
#include "mux.h" #include "mux.h"
#define DM355_UART2_BASE (IO_PHYS + 0x206000) #define DM355_UART2_BASE (IO_PHYS + 0x206000)
...@@ -53,7 +54,7 @@ static struct resource dm355_spi0_resources[] = { ...@@ -53,7 +54,7 @@ static struct resource dm355_spi0_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_DM355_SPINT0_0, .start = DAVINCI_INTC_IRQ(IRQ_DM355_SPINT0_0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -273,12 +274,12 @@ static struct resource edma_resources[] = { ...@@ -273,12 +274,12 @@ static struct resource edma_resources[] = {
}, },
{ {
.name = "edma3_ccint", .name = "edma3_ccint",
.start = IRQ_CCINT0, .start = DAVINCI_INTC_IRQ(IRQ_CCINT0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.name = "edma3_ccerrint", .name = "edma3_ccerrint",
.start = IRQ_CCERRINT, .start = DAVINCI_INTC_IRQ(IRQ_CCERRINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
/* not using (or muxing) TC*_ERR */ /* not using (or muxing) TC*_ERR */
...@@ -358,13 +359,13 @@ static struct platform_device dm355_vpss_device = { ...@@ -358,13 +359,13 @@ static struct platform_device dm355_vpss_device = {
static struct resource vpfe_resources[] = { static struct resource vpfe_resources[] = {
{ {
.start = IRQ_VDINT0, .start = DAVINCI_INTC_IRQ(IRQ_VDINT0),
.end = IRQ_VDINT0, .end = DAVINCI_INTC_IRQ(IRQ_VDINT0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_VDINT1, .start = DAVINCI_INTC_IRQ(IRQ_VDINT1),
.end = IRQ_VDINT1, .end = DAVINCI_INTC_IRQ(IRQ_VDINT1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -422,8 +423,8 @@ static struct platform_device dm355_osd_dev = { ...@@ -422,8 +423,8 @@ static struct platform_device dm355_osd_dev = {
static struct resource dm355_venc_resources[] = { static struct resource dm355_venc_resources[] = {
{ {
.start = IRQ_VENCINT, .start = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.end = IRQ_VENCINT, .end = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
/* venc registers io space */ /* venc registers io space */
...@@ -442,8 +443,8 @@ static struct resource dm355_venc_resources[] = { ...@@ -442,8 +443,8 @@ static struct resource dm355_venc_resources[] = {
static struct resource dm355_v4l2_disp_resources[] = { static struct resource dm355_v4l2_disp_resources[] = {
{ {
.start = IRQ_VENCINT, .start = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.end = IRQ_VENCINT, .end = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
/* venc registers io space */ /* venc registers io space */
...@@ -547,38 +548,38 @@ static struct resource dm355_gpio_resources[] = { ...@@ -547,38 +548,38 @@ static struct resource dm355_gpio_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ /* interrupt */ { /* interrupt */
.start = IRQ_DM355_GPIOBNK0, .start = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK0),
.end = IRQ_DM355_GPIOBNK0, .end = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM355_GPIOBNK1, .start = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK1),
.end = IRQ_DM355_GPIOBNK1, .end = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM355_GPIOBNK2, .start = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK2),
.end = IRQ_DM355_GPIOBNK2, .end = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK2),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM355_GPIOBNK3, .start = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK3),
.end = IRQ_DM355_GPIOBNK3, .end = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK3),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM355_GPIOBNK4, .start = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK4),
.end = IRQ_DM355_GPIOBNK4, .end = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK4),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM355_GPIOBNK5, .start = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK5),
.end = IRQ_DM355_GPIOBNK5, .end = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK5),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM355_GPIOBNK6, .start = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK6),
.end = IRQ_DM355_GPIOBNK6, .end = DAVINCI_INTC_IRQ(IRQ_DM355_GPIOBNK6),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -632,7 +633,7 @@ static struct davinci_timer_info dm355_timer_info = { ...@@ -632,7 +633,7 @@ static struct davinci_timer_info dm355_timer_info = {
static struct plat_serial8250_port dm355_serial0_platform_data[] = { static struct plat_serial8250_port dm355_serial0_platform_data[] = {
{ {
.mapbase = DAVINCI_UART0_BASE, .mapbase = DAVINCI_UART0_BASE,
.irq = IRQ_UARTINT0, .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT0),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM, .iotype = UPIO_MEM,
...@@ -645,7 +646,7 @@ static struct plat_serial8250_port dm355_serial0_platform_data[] = { ...@@ -645,7 +646,7 @@ static struct plat_serial8250_port dm355_serial0_platform_data[] = {
static struct plat_serial8250_port dm355_serial1_platform_data[] = { static struct plat_serial8250_port dm355_serial1_platform_data[] = {
{ {
.mapbase = DAVINCI_UART1_BASE, .mapbase = DAVINCI_UART1_BASE,
.irq = IRQ_UARTINT1, .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT1),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM, .iotype = UPIO_MEM,
...@@ -658,7 +659,7 @@ static struct plat_serial8250_port dm355_serial1_platform_data[] = { ...@@ -658,7 +659,7 @@ static struct plat_serial8250_port dm355_serial1_platform_data[] = {
static struct plat_serial8250_port dm355_serial2_platform_data[] = { static struct plat_serial8250_port dm355_serial2_platform_data[] = {
{ {
.mapbase = DM355_UART2_BASE, .mapbase = DM355_UART2_BASE,
.irq = IRQ_DM355_UARTINT2, .irq = DAVINCI_INTC_IRQ(IRQ_DM355_UARTINT2),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM, .iotype = UPIO_MEM,
...@@ -704,10 +705,6 @@ static const struct davinci_soc_info davinci_soc_info_dm355 = { ...@@ -704,10 +705,6 @@ static const struct davinci_soc_info davinci_soc_info_dm355 = {
.pinmux_base = DAVINCI_SYSTEM_MODULE_BASE, .pinmux_base = DAVINCI_SYSTEM_MODULE_BASE,
.pinmux_pins = dm355_pins, .pinmux_pins = dm355_pins,
.pinmux_pins_num = ARRAY_SIZE(dm355_pins), .pinmux_pins_num = ARRAY_SIZE(dm355_pins),
.intc_base = DAVINCI_ARM_INTC_BASE,
.intc_type = DAVINCI_INTC_TYPE_AINTC,
.intc_irq_prios = dm355_default_priorities,
.intc_irq_num = DAVINCI_N_AINTC_IRQ,
.timer_info = &dm355_timer_info, .timer_info = &dm355_timer_info,
.sram_dma = 0x00010000, .sram_dma = 0x00010000,
.sram_len = SZ_32K, .sram_len = SZ_32K,
...@@ -793,6 +790,21 @@ int __init dm355_init_video(struct vpfe_config *vpfe_cfg, ...@@ -793,6 +790,21 @@ int __init dm355_init_video(struct vpfe_config *vpfe_cfg,
return 0; return 0;
} }
static const struct davinci_aintc_config dm355_aintc_config = {
.reg = {
.start = DAVINCI_ARM_INTC_BASE,
.end = DAVINCI_ARM_INTC_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
.num_irqs = 64,
.prios = dm355_default_priorities,
};
void __init dm355_init_irq(void)
{
davinci_aintc_init(&dm355_aintc_config);
}
static int __init dm355_init_devices(void) static int __init dm355_init_devices(void)
{ {
struct platform_device *edma_pdev; struct platform_device *edma_pdev;
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irqchip/irq-davinci-aintc.h>
#include <linux/platform_data/edma.h> #include <linux/platform_data/edma.h>
#include <linux/platform_data/gpio-davinci.h> #include <linux/platform_data/gpio-davinci.h>
#include <linux/platform_data/keyscan-davinci.h> #include <linux/platform_data/keyscan-davinci.h>
...@@ -31,13 +32,13 @@ ...@@ -31,13 +32,13 @@
#include <mach/common.h> #include <mach/common.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/irqs.h>
#include <mach/mux.h> #include <mach/mux.h>
#include <mach/serial.h> #include <mach/serial.h>
#include <mach/time.h> #include <mach/time.h>
#include "asp.h" #include "asp.h"
#include "davinci.h" #include "davinci.h"
#include "irqs.h"
#include "mux.h" #include "mux.h"
#define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */ #define DM365_REF_FREQ 24000000 /* 24 MHz on the DM365 EVM */
...@@ -224,7 +225,7 @@ static struct resource dm365_spi0_resources[] = { ...@@ -224,7 +225,7 @@ static struct resource dm365_spi0_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_DM365_SPIINT0_0, .start = DAVINCI_INTC_IRQ(IRQ_DM365_SPIINT0_0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -266,43 +267,43 @@ static struct resource dm365_gpio_resources[] = { ...@@ -266,43 +267,43 @@ static struct resource dm365_gpio_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ /* interrupt */ { /* interrupt */
.start = IRQ_DM365_GPIO0, .start = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO0),
.end = IRQ_DM365_GPIO0, .end = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_GPIO1, .start = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO1),
.end = IRQ_DM365_GPIO1, .end = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_GPIO2, .start = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO2),
.end = IRQ_DM365_GPIO2, .end = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO2),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_GPIO3, .start = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO3),
.end = IRQ_DM365_GPIO3, .end = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO3),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_GPIO4, .start = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO4),
.end = IRQ_DM365_GPIO4, .end = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO4),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_GPIO5, .start = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO5),
.end = IRQ_DM365_GPIO5, .end = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO5),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_GPIO6, .start = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO6),
.end = IRQ_DM365_GPIO6, .end = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO6),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_GPIO7, .start = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO7),
.end = IRQ_DM365_GPIO7, .end = DAVINCI_INTC_IRQ(IRQ_DM365_GPIO7),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -336,23 +337,23 @@ static struct resource dm365_emac_resources[] = { ...@@ -336,23 +337,23 @@ static struct resource dm365_emac_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_DM365_EMAC_RXTHRESH, .start = DAVINCI_INTC_IRQ(IRQ_DM365_EMAC_RXTHRESH),
.end = IRQ_DM365_EMAC_RXTHRESH, .end = DAVINCI_INTC_IRQ(IRQ_DM365_EMAC_RXTHRESH),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_EMAC_RXPULSE, .start = DAVINCI_INTC_IRQ(IRQ_DM365_EMAC_RXPULSE),
.end = IRQ_DM365_EMAC_RXPULSE, .end = DAVINCI_INTC_IRQ(IRQ_DM365_EMAC_RXPULSE),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_EMAC_TXPULSE, .start = DAVINCI_INTC_IRQ(IRQ_DM365_EMAC_TXPULSE),
.end = IRQ_DM365_EMAC_TXPULSE, .end = DAVINCI_INTC_IRQ(IRQ_DM365_EMAC_TXPULSE),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM365_EMAC_MISCPULSE, .start = DAVINCI_INTC_IRQ(IRQ_DM365_EMAC_MISCPULSE),
.end = IRQ_DM365_EMAC_MISCPULSE, .end = DAVINCI_INTC_IRQ(IRQ_DM365_EMAC_MISCPULSE),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -518,12 +519,12 @@ static struct resource edma_resources[] = { ...@@ -518,12 +519,12 @@ static struct resource edma_resources[] = {
}, },
{ {
.name = "edma3_ccint", .name = "edma3_ccint",
.start = IRQ_CCINT0, .start = DAVINCI_INTC_IRQ(IRQ_CCINT0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.name = "edma3_ccerrint", .name = "edma3_ccerrint",
.start = IRQ_CCERRINT, .start = DAVINCI_INTC_IRQ(IRQ_CCERRINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
/* not using TC*_ERR */ /* not using TC*_ERR */
...@@ -597,7 +598,7 @@ static struct resource dm365_rtc_resources[] = { ...@@ -597,7 +598,7 @@ static struct resource dm365_rtc_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_DM365_RTCINT, .start = DAVINCI_INTC_IRQ(IRQ_DM365_RTCINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -627,8 +628,8 @@ static struct resource dm365_ks_resources[] = { ...@@ -627,8 +628,8 @@ static struct resource dm365_ks_resources[] = {
}, },
{ {
/* interrupt */ /* interrupt */
.start = IRQ_DM365_KEYINT, .start = DAVINCI_INTC_IRQ(IRQ_DM365_KEYINT),
.end = IRQ_DM365_KEYINT, .end = DAVINCI_INTC_IRQ(IRQ_DM365_KEYINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -669,7 +670,7 @@ static struct davinci_timer_info dm365_timer_info = { ...@@ -669,7 +670,7 @@ static struct davinci_timer_info dm365_timer_info = {
static struct plat_serial8250_port dm365_serial0_platform_data[] = { static struct plat_serial8250_port dm365_serial0_platform_data[] = {
{ {
.mapbase = DAVINCI_UART0_BASE, .mapbase = DAVINCI_UART0_BASE,
.irq = IRQ_UARTINT0, .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT0),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM, .iotype = UPIO_MEM,
...@@ -682,7 +683,7 @@ static struct plat_serial8250_port dm365_serial0_platform_data[] = { ...@@ -682,7 +683,7 @@ static struct plat_serial8250_port dm365_serial0_platform_data[] = {
static struct plat_serial8250_port dm365_serial1_platform_data[] = { static struct plat_serial8250_port dm365_serial1_platform_data[] = {
{ {
.mapbase = DM365_UART1_BASE, .mapbase = DM365_UART1_BASE,
.irq = IRQ_UARTINT1, .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT1),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM, .iotype = UPIO_MEM,
...@@ -721,10 +722,6 @@ static const struct davinci_soc_info davinci_soc_info_dm365 = { ...@@ -721,10 +722,6 @@ static const struct davinci_soc_info davinci_soc_info_dm365 = {
.pinmux_base = DAVINCI_SYSTEM_MODULE_BASE, .pinmux_base = DAVINCI_SYSTEM_MODULE_BASE,
.pinmux_pins = dm365_pins, .pinmux_pins = dm365_pins,
.pinmux_pins_num = ARRAY_SIZE(dm365_pins), .pinmux_pins_num = ARRAY_SIZE(dm365_pins),
.intc_base = DAVINCI_ARM_INTC_BASE,
.intc_type = DAVINCI_INTC_TYPE_AINTC,
.intc_irq_prios = dm365_default_priorities,
.intc_irq_num = DAVINCI_N_AINTC_IRQ,
.timer_info = &dm365_timer_info, .timer_info = &dm365_timer_info,
.emac_pdata = &dm365_emac_pdata, .emac_pdata = &dm365_emac_pdata,
.sram_dma = 0x00010000, .sram_dma = 0x00010000,
...@@ -822,13 +819,13 @@ static struct platform_device dm365_vpss_device = { ...@@ -822,13 +819,13 @@ static struct platform_device dm365_vpss_device = {
static struct resource vpfe_resources[] = { static struct resource vpfe_resources[] = {
{ {
.start = IRQ_VDINT0, .start = DAVINCI_INTC_IRQ(IRQ_VDINT0),
.end = IRQ_VDINT0, .end = DAVINCI_INTC_IRQ(IRQ_VDINT0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_VDINT1, .start = DAVINCI_INTC_IRQ(IRQ_VDINT1),
.end = IRQ_VDINT1, .end = DAVINCI_INTC_IRQ(IRQ_VDINT1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -909,8 +906,8 @@ static struct platform_device dm365_osd_dev = { ...@@ -909,8 +906,8 @@ static struct platform_device dm365_osd_dev = {
static struct resource dm365_venc_resources[] = { static struct resource dm365_venc_resources[] = {
{ {
.start = IRQ_VENCINT, .start = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.end = IRQ_VENCINT, .end = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
/* venc registers io space */ /* venc registers io space */
...@@ -929,8 +926,8 @@ static struct resource dm365_venc_resources[] = { ...@@ -929,8 +926,8 @@ static struct resource dm365_venc_resources[] = {
static struct resource dm365_v4l2_disp_resources[] = { static struct resource dm365_v4l2_disp_resources[] = {
{ {
.start = IRQ_VENCINT, .start = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.end = IRQ_VENCINT, .end = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
/* venc registers io space */ /* venc registers io space */
...@@ -1052,6 +1049,21 @@ int __init dm365_init_video(struct vpfe_config *vpfe_cfg, ...@@ -1052,6 +1049,21 @@ int __init dm365_init_video(struct vpfe_config *vpfe_cfg,
return 0; return 0;
} }
static const struct davinci_aintc_config dm365_aintc_config = {
.reg = {
.start = DAVINCI_ARM_INTC_BASE,
.end = DAVINCI_ARM_INTC_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
.num_irqs = 64,
.prios = dm365_default_priorities,
};
void __init dm365_init_irq(void)
{
davinci_aintc_init(&dm365_aintc_config);
}
static int __init dm365_init_devices(void) static int __init dm365_init_devices(void)
{ {
struct platform_device *edma_pdev; struct platform_device *edma_pdev;
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
#include <linux/clkdev.h> #include <linux/clkdev.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irqchip/irq-davinci-aintc.h>
#include <linux/platform_data/edma.h> #include <linux/platform_data/edma.h>
#include <linux/platform_data/gpio-davinci.h> #include <linux/platform_data/gpio-davinci.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -23,13 +24,13 @@ ...@@ -23,13 +24,13 @@
#include <mach/common.h> #include <mach/common.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/irqs.h>
#include <mach/mux.h> #include <mach/mux.h>
#include <mach/serial.h> #include <mach/serial.h>
#include <mach/time.h> #include <mach/time.h>
#include "asp.h" #include "asp.h"
#include "davinci.h" #include "davinci.h"
#include "irqs.h"
#include "mux.h" #include "mux.h"
/* /*
...@@ -59,8 +60,8 @@ static struct resource dm644x_emac_resources[] = { ...@@ -59,8 +60,8 @@ static struct resource dm644x_emac_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_EMACINT, .start = DAVINCI_INTC_IRQ(IRQ_EMACINT),
.end = IRQ_EMACINT, .end = DAVINCI_INTC_IRQ(IRQ_EMACINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -260,12 +261,12 @@ static struct resource edma_resources[] = { ...@@ -260,12 +261,12 @@ static struct resource edma_resources[] = {
}, },
{ {
.name = "edma3_ccint", .name = "edma3_ccint",
.start = IRQ_CCINT0, .start = DAVINCI_INTC_IRQ(IRQ_CCINT0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.name = "edma3_ccerrint", .name = "edma3_ccerrint",
.start = IRQ_CCERRINT, .start = DAVINCI_INTC_IRQ(IRQ_CCERRINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
/* not using TC*_ERR */ /* not using TC*_ERR */
...@@ -330,13 +331,13 @@ static struct platform_device dm644x_vpss_device = { ...@@ -330,13 +331,13 @@ static struct platform_device dm644x_vpss_device = {
static struct resource dm644x_vpfe_resources[] = { static struct resource dm644x_vpfe_resources[] = {
{ {
.start = IRQ_VDINT0, .start = DAVINCI_INTC_IRQ(IRQ_VDINT0),
.end = IRQ_VDINT0, .end = DAVINCI_INTC_IRQ(IRQ_VDINT0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_VDINT1, .start = DAVINCI_INTC_IRQ(IRQ_VDINT1),
.end = IRQ_VDINT1, .end = DAVINCI_INTC_IRQ(IRQ_VDINT1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -442,8 +443,8 @@ static int dm644x_venc_setup_clock(enum vpbe_enc_timings_type type, ...@@ -442,8 +443,8 @@ static int dm644x_venc_setup_clock(enum vpbe_enc_timings_type type,
static struct resource dm644x_v4l2_disp_resources[] = { static struct resource dm644x_v4l2_disp_resources[] = {
{ {
.start = IRQ_VENCINT, .start = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.end = IRQ_VENCINT, .end = DAVINCI_INTC_IRQ(IRQ_VENCINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -491,28 +492,28 @@ static struct resource dm644_gpio_resources[] = { ...@@ -491,28 +492,28 @@ static struct resource dm644_gpio_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ /* interrupt */ { /* interrupt */
.start = IRQ_GPIOBNK0, .start = DAVINCI_INTC_IRQ(IRQ_GPIOBNK0),
.end = IRQ_GPIOBNK0, .end = DAVINCI_INTC_IRQ(IRQ_GPIOBNK0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_GPIOBNK1, .start = DAVINCI_INTC_IRQ(IRQ_GPIOBNK1),
.end = IRQ_GPIOBNK1, .end = DAVINCI_INTC_IRQ(IRQ_GPIOBNK1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_GPIOBNK2, .start = DAVINCI_INTC_IRQ(IRQ_GPIOBNK2),
.end = IRQ_GPIOBNK2, .end = DAVINCI_INTC_IRQ(IRQ_GPIOBNK2),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_GPIOBNK3, .start = DAVINCI_INTC_IRQ(IRQ_GPIOBNK3),
.end = IRQ_GPIOBNK3, .end = DAVINCI_INTC_IRQ(IRQ_GPIOBNK3),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_GPIOBNK4, .start = DAVINCI_INTC_IRQ(IRQ_GPIOBNK4),
.end = IRQ_GPIOBNK4, .end = DAVINCI_INTC_IRQ(IRQ_GPIOBNK4),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -573,7 +574,7 @@ static struct davinci_timer_info dm644x_timer_info = { ...@@ -573,7 +574,7 @@ static struct davinci_timer_info dm644x_timer_info = {
static struct plat_serial8250_port dm644x_serial0_platform_data[] = { static struct plat_serial8250_port dm644x_serial0_platform_data[] = {
{ {
.mapbase = DAVINCI_UART0_BASE, .mapbase = DAVINCI_UART0_BASE,
.irq = IRQ_UARTINT0, .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT0),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM, .iotype = UPIO_MEM,
...@@ -586,7 +587,7 @@ static struct plat_serial8250_port dm644x_serial0_platform_data[] = { ...@@ -586,7 +587,7 @@ static struct plat_serial8250_port dm644x_serial0_platform_data[] = {
static struct plat_serial8250_port dm644x_serial1_platform_data[] = { static struct plat_serial8250_port dm644x_serial1_platform_data[] = {
{ {
.mapbase = DAVINCI_UART1_BASE, .mapbase = DAVINCI_UART1_BASE,
.irq = IRQ_UARTINT1, .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT1),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM, .iotype = UPIO_MEM,
...@@ -599,7 +600,7 @@ static struct plat_serial8250_port dm644x_serial1_platform_data[] = { ...@@ -599,7 +600,7 @@ static struct plat_serial8250_port dm644x_serial1_platform_data[] = {
static struct plat_serial8250_port dm644x_serial2_platform_data[] = { static struct plat_serial8250_port dm644x_serial2_platform_data[] = {
{ {
.mapbase = DAVINCI_UART2_BASE, .mapbase = DAVINCI_UART2_BASE,
.irq = IRQ_UARTINT2, .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT2),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM, .iotype = UPIO_MEM,
...@@ -645,10 +646,6 @@ static const struct davinci_soc_info davinci_soc_info_dm644x = { ...@@ -645,10 +646,6 @@ static const struct davinci_soc_info davinci_soc_info_dm644x = {
.pinmux_base = DAVINCI_SYSTEM_MODULE_BASE, .pinmux_base = DAVINCI_SYSTEM_MODULE_BASE,
.pinmux_pins = dm644x_pins, .pinmux_pins = dm644x_pins,
.pinmux_pins_num = ARRAY_SIZE(dm644x_pins), .pinmux_pins_num = ARRAY_SIZE(dm644x_pins),
.intc_base = DAVINCI_ARM_INTC_BASE,
.intc_type = DAVINCI_INTC_TYPE_AINTC,
.intc_irq_prios = dm644x_default_priorities,
.intc_irq_num = DAVINCI_N_AINTC_IRQ,
.timer_info = &dm644x_timer_info, .timer_info = &dm644x_timer_info,
.emac_pdata = &dm644x_emac_pdata, .emac_pdata = &dm644x_emac_pdata,
.sram_dma = 0x00008000, .sram_dma = 0x00008000,
...@@ -729,6 +726,21 @@ int __init dm644x_init_video(struct vpfe_config *vpfe_cfg, ...@@ -729,6 +726,21 @@ int __init dm644x_init_video(struct vpfe_config *vpfe_cfg,
return 0; return 0;
} }
static const struct davinci_aintc_config dm644x_aintc_config = {
.reg = {
.start = DAVINCI_ARM_INTC_BASE,
.end = DAVINCI_ARM_INTC_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
.num_irqs = 64,
.prios = dm644x_default_priorities,
};
void __init dm644x_init_irq(void)
{
davinci_aintc_init(&dm644x_aintc_config);
}
void __init dm644x_init_devices(void) void __init dm644x_init_devices(void)
{ {
struct platform_device *edma_pdev; struct platform_device *edma_pdev;
......
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
#include <linux/dma-mapping.h> #include <linux/dma-mapping.h>
#include <linux/dmaengine.h> #include <linux/dmaengine.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/irqchip/irq-davinci-aintc.h>
#include <linux/platform_data/edma.h> #include <linux/platform_data/edma.h>
#include <linux/platform_data/gpio-davinci.h> #include <linux/platform_data/gpio-davinci.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
...@@ -24,13 +25,13 @@ ...@@ -24,13 +25,13 @@
#include <mach/common.h> #include <mach/common.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/irqs.h>
#include <mach/mux.h> #include <mach/mux.h>
#include <mach/serial.h> #include <mach/serial.h>
#include <mach/time.h> #include <mach/time.h>
#include "asp.h" #include "asp.h"
#include "davinci.h" #include "davinci.h"
#include "irqs.h"
#include "mux.h" #include "mux.h"
#define DAVINCI_VPIF_BASE (0x01C12000) #define DAVINCI_VPIF_BASE (0x01C12000)
...@@ -62,23 +63,23 @@ static struct resource dm646x_emac_resources[] = { ...@@ -62,23 +63,23 @@ static struct resource dm646x_emac_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_DM646X_EMACRXTHINT, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACRXTHINT),
.end = IRQ_DM646X_EMACRXTHINT, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACRXTHINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM646X_EMACRXINT, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACRXINT),
.end = IRQ_DM646X_EMACRXINT, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACRXINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM646X_EMACTXINT, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACTXINT),
.end = IRQ_DM646X_EMACTXINT, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACTXINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM646X_EMACMISCINT, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACMISCINT),
.end = IRQ_DM646X_EMACMISCINT, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_EMACMISCINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -273,12 +274,12 @@ static struct resource edma_resources[] = { ...@@ -273,12 +274,12 @@ static struct resource edma_resources[] = {
}, },
{ {
.name = "edma3_ccint", .name = "edma3_ccint",
.start = IRQ_CCINT0, .start = DAVINCI_INTC_IRQ(IRQ_CCINT0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.name = "edma3_ccerrint", .name = "edma3_ccerrint",
.start = IRQ_CCERRINT, .start = DAVINCI_INTC_IRQ(IRQ_CCERRINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
/* not using TC*_ERR */ /* not using TC*_ERR */
...@@ -315,12 +316,12 @@ static struct resource dm646x_mcasp0_resources[] = { ...@@ -315,12 +316,12 @@ static struct resource dm646x_mcasp0_resources[] = {
}, },
{ {
.name = "tx", .name = "tx",
.start = IRQ_DM646X_MCASP0TXINT, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_MCASP0TXINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.name = "rx", .name = "rx",
.start = IRQ_DM646X_MCASP0RXINT, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_MCASP0RXINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -341,7 +342,7 @@ static struct resource dm646x_mcasp1_resources[] = { ...@@ -341,7 +342,7 @@ static struct resource dm646x_mcasp1_resources[] = {
}, },
{ {
.name = "tx", .name = "tx",
.start = IRQ_DM646X_MCASP1TXINT, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_MCASP1TXINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -388,13 +389,13 @@ static struct platform_device vpif_dev = { ...@@ -388,13 +389,13 @@ static struct platform_device vpif_dev = {
static struct resource vpif_display_resource[] = { static struct resource vpif_display_resource[] = {
{ {
.start = IRQ_DM646X_VP_VERTINT2, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT2),
.end = IRQ_DM646X_VP_VERTINT2, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT2),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM646X_VP_VERTINT3, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT3),
.end = IRQ_DM646X_VP_VERTINT3, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT3),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -412,13 +413,13 @@ static struct platform_device vpif_display_dev = { ...@@ -412,13 +413,13 @@ static struct platform_device vpif_display_dev = {
static struct resource vpif_capture_resource[] = { static struct resource vpif_capture_resource[] = {
{ {
.start = IRQ_DM646X_VP_VERTINT0, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT0),
.end = IRQ_DM646X_VP_VERTINT0, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM646X_VP_VERTINT1, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT1),
.end = IRQ_DM646X_VP_VERTINT1, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_VP_VERTINT1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -441,18 +442,18 @@ static struct resource dm646x_gpio_resources[] = { ...@@ -441,18 +442,18 @@ static struct resource dm646x_gpio_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ /* interrupt */ { /* interrupt */
.start = IRQ_DM646X_GPIOBNK0, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK0),
.end = IRQ_DM646X_GPIOBNK0, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK0),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM646X_GPIOBNK1, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK1),
.end = IRQ_DM646X_GPIOBNK1, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK1),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
{ {
.start = IRQ_DM646X_GPIOBNK2, .start = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK2),
.end = IRQ_DM646X_GPIOBNK2, .end = DAVINCI_INTC_IRQ(IRQ_DM646X_GPIOBNK2),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
...@@ -513,7 +514,7 @@ static struct davinci_timer_info dm646x_timer_info = { ...@@ -513,7 +514,7 @@ static struct davinci_timer_info dm646x_timer_info = {
static struct plat_serial8250_port dm646x_serial0_platform_data[] = { static struct plat_serial8250_port dm646x_serial0_platform_data[] = {
{ {
.mapbase = DAVINCI_UART0_BASE, .mapbase = DAVINCI_UART0_BASE,
.irq = IRQ_UARTINT0, .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT0),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM32, .iotype = UPIO_MEM32,
...@@ -526,7 +527,7 @@ static struct plat_serial8250_port dm646x_serial0_platform_data[] = { ...@@ -526,7 +527,7 @@ static struct plat_serial8250_port dm646x_serial0_platform_data[] = {
static struct plat_serial8250_port dm646x_serial1_platform_data[] = { static struct plat_serial8250_port dm646x_serial1_platform_data[] = {
{ {
.mapbase = DAVINCI_UART1_BASE, .mapbase = DAVINCI_UART1_BASE,
.irq = IRQ_UARTINT1, .irq = DAVINCI_INTC_IRQ(IRQ_UARTINT1),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM32, .iotype = UPIO_MEM32,
...@@ -539,7 +540,7 @@ static struct plat_serial8250_port dm646x_serial1_platform_data[] = { ...@@ -539,7 +540,7 @@ static struct plat_serial8250_port dm646x_serial1_platform_data[] = {
static struct plat_serial8250_port dm646x_serial2_platform_data[] = { static struct plat_serial8250_port dm646x_serial2_platform_data[] = {
{ {
.mapbase = DAVINCI_UART2_BASE, .mapbase = DAVINCI_UART2_BASE,
.irq = IRQ_DM646X_UARTINT2, .irq = DAVINCI_INTC_IRQ(IRQ_DM646X_UARTINT2),
.flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST | .flags = UPF_BOOT_AUTOCONF | UPF_SKIP_TEST |
UPF_IOREMAP, UPF_IOREMAP,
.iotype = UPIO_MEM32, .iotype = UPIO_MEM32,
...@@ -585,10 +586,6 @@ static const struct davinci_soc_info davinci_soc_info_dm646x = { ...@@ -585,10 +586,6 @@ static const struct davinci_soc_info davinci_soc_info_dm646x = {
.pinmux_base = DAVINCI_SYSTEM_MODULE_BASE, .pinmux_base = DAVINCI_SYSTEM_MODULE_BASE,
.pinmux_pins = dm646x_pins, .pinmux_pins = dm646x_pins,
.pinmux_pins_num = ARRAY_SIZE(dm646x_pins), .pinmux_pins_num = ARRAY_SIZE(dm646x_pins),
.intc_base = DAVINCI_ARM_INTC_BASE,
.intc_type = DAVINCI_INTC_TYPE_AINTC,
.intc_irq_prios = dm646x_default_priorities,
.intc_irq_num = DAVINCI_N_AINTC_IRQ,
.timer_info = &dm646x_timer_info, .timer_info = &dm646x_timer_info,
.emac_pdata = &dm646x_emac_pdata, .emac_pdata = &dm646x_emac_pdata,
.sram_dma = 0x10010000, .sram_dma = 0x10010000,
...@@ -690,6 +687,21 @@ void __init dm646x_register_clocks(void) ...@@ -690,6 +687,21 @@ void __init dm646x_register_clocks(void)
platform_device_register(&dm646x_pll2_device); platform_device_register(&dm646x_pll2_device);
} }
static const struct davinci_aintc_config dm646x_aintc_config = {
.reg = {
.start = DAVINCI_ARM_INTC_BASE,
.end = DAVINCI_ARM_INTC_BASE + SZ_4K - 1,
.flags = IORESOURCE_MEM,
},
.num_irqs = 64,
.prios = dm646x_default_priorities,
};
void __init dm646x_init_irq(void)
{
davinci_aintc_init(&dm646x_aintc_config);
}
static int __init dm646x_init_devices(void) static int __init dm646x_init_devices(void)
{ {
int ret = 0; int ret = 0;
......
...@@ -17,11 +17,12 @@ ...@@ -17,11 +17,12 @@
#include <linux/types.h> #include <linux/types.h>
#include <linux/reboot.h> #include <linux/reboot.h>
void davinci_timer_init(struct clk *clk); #include <asm/irq.h>
#define DAVINCI_INTC_START NR_IRQS
#define DAVINCI_INTC_IRQ(_irqnum) (DAVINCI_INTC_START + (_irqnum))
extern void davinci_irq_init(void); void davinci_timer_init(struct clk *clk);
extern void __iomem *davinci_intc_base;
extern int davinci_intc_type;
struct davinci_timer_instance { struct davinci_timer_instance {
u32 base; u32 base;
...@@ -57,11 +58,6 @@ struct davinci_soc_info { ...@@ -57,11 +58,6 @@ struct davinci_soc_info {
u32 pinmux_base; u32 pinmux_base;
const struct mux_config *pinmux_pins; const struct mux_config *pinmux_pins;
unsigned long pinmux_pins_num; unsigned long pinmux_pins_num;
u32 intc_base;
int intc_type;
u8 *intc_irq_prios;
unsigned long intc_irq_num;
u32 *intc_host_map;
struct davinci_timer_info *timer_info; struct davinci_timer_info *timer_info;
int gpio_type; int gpio_type;
u32 gpio_base; u32 gpio_base;
......
...@@ -88,10 +88,12 @@ extern unsigned int da850_max_speed; ...@@ -88,10 +88,12 @@ extern unsigned int da850_max_speed;
#define DA8XX_ARM_RAM_BASE 0xffff0000 #define DA8XX_ARM_RAM_BASE 0xffff0000
void da830_init(void); void da830_init(void);
void da830_init_irq(void);
void da830_init_time(void); void da830_init_time(void);
void da830_register_clocks(void); void da830_register_clocks(void);
void da850_init(void); void da850_init(void);
void da850_init_irq(void);
void da850_init_time(void); void da850_init_time(void);
void da850_register_clocks(void); void da850_register_clocks(void);
......
/*
* Low-level IRQ helper macros for TI DaVinci-based platforms
*
* Author: Kevin Hilman, MontaVista Software, Inc. <source@mvista.com>
*
* 2007 (c) MontaVista Software, Inc. This file is licensed under
* the terms of the GNU General Public License version 2. This program
* is licensed "as is" without any warranty of any kind, whether express
* or implied.
*/
#include <mach/irqs.h>
.macro get_irqnr_preamble, base, tmp
ldr \base, =davinci_intc_base
ldr \base, [\base]
.endm
.macro get_irqnr_and_base, irqnr, irqstat, base, tmp
#if defined(CONFIG_AINTC) && defined(CONFIG_CP_INTC)
ldr \tmp, =davinci_intc_type
ldr \tmp, [\tmp]
cmp \tmp, #DAVINCI_INTC_TYPE_CP_INTC
beq 1001f
#endif
#if defined(CONFIG_AINTC)
ldr \tmp, [\base, #0x14]
movs \tmp, \tmp, lsr #2
sub \irqnr, \tmp, #1
b 1002f
#endif
#if defined(CONFIG_CP_INTC)
1001: ldr \irqnr, [\base, #0x80] /* get irq number */
mov \tmp, \irqnr, lsr #31
and \irqnr, \irqnr, #0xff /* irq is in bits 0-9 */
and \tmp, \tmp, #0x1
cmp \tmp, #0x1
#endif
1002:
.endm
/*
* Interrupt handler for DaVinci boards.
*
* Copyright (C) 2006 Texas Instruments.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*/
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/io.h>
#include <mach/hardware.h>
#include <mach/cputype.h>
#include <mach/common.h>
#include <asm/mach/irq.h>
#define FIQ_REG0_OFFSET 0x0000
#define FIQ_REG1_OFFSET 0x0004
#define IRQ_REG0_OFFSET 0x0008
#define IRQ_REG1_OFFSET 0x000C
#define IRQ_ENT_REG0_OFFSET 0x0018
#define IRQ_ENT_REG1_OFFSET 0x001C
#define IRQ_INCTL_REG_OFFSET 0x0020
#define IRQ_EABASE_REG_OFFSET 0x0024
#define IRQ_INTPRI0_REG_OFFSET 0x0030
#define IRQ_INTPRI7_REG_OFFSET 0x004C
static inline void davinci_irq_writel(unsigned long value, int offset)
{
__raw_writel(value, davinci_intc_base + offset);
}
static __init void
davinci_alloc_gc(void __iomem *base, unsigned int irq_start, unsigned int num)
{
struct irq_chip_generic *gc;
struct irq_chip_type *ct;
gc = irq_alloc_generic_chip("AINTC", 1, irq_start, base, handle_edge_irq);
if (!gc) {
pr_err("%s: irq_alloc_generic_chip for IRQ %u failed\n",
__func__, irq_start);
return;
}
ct = gc->chip_types;
ct->chip.irq_ack = irq_gc_ack_set_bit;
ct->chip.irq_mask = irq_gc_mask_clr_bit;
ct->chip.irq_unmask = irq_gc_mask_set_bit;
ct->regs.ack = IRQ_REG0_OFFSET;
ct->regs.mask = IRQ_ENT_REG0_OFFSET;
irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
IRQ_NOREQUEST | IRQ_NOPROBE, 0);
}
/* ARM Interrupt Controller Initialization */
void __init davinci_irq_init(void)
{
unsigned i, j;
const u8 *davinci_def_priorities = davinci_soc_info.intc_irq_prios;
davinci_intc_type = DAVINCI_INTC_TYPE_AINTC;
davinci_intc_base = ioremap(davinci_soc_info.intc_base, SZ_4K);
if (WARN_ON(!davinci_intc_base))
return;
/* Clear all interrupt requests */
davinci_irq_writel(~0x0, FIQ_REG0_OFFSET);
davinci_irq_writel(~0x0, FIQ_REG1_OFFSET);
davinci_irq_writel(~0x0, IRQ_REG0_OFFSET);
davinci_irq_writel(~0x0, IRQ_REG1_OFFSET);
/* Disable all interrupts */
davinci_irq_writel(0x0, IRQ_ENT_REG0_OFFSET);
davinci_irq_writel(0x0, IRQ_ENT_REG1_OFFSET);
/* Interrupts disabled immediately, IRQ entry reflects all */
davinci_irq_writel(0x0, IRQ_INCTL_REG_OFFSET);
/* we don't use the hardware vector table, just its entry addresses */
davinci_irq_writel(0, IRQ_EABASE_REG_OFFSET);
/* Clear all interrupt requests */
davinci_irq_writel(~0x0, FIQ_REG0_OFFSET);
davinci_irq_writel(~0x0, FIQ_REG1_OFFSET);
davinci_irq_writel(~0x0, IRQ_REG0_OFFSET);
davinci_irq_writel(~0x0, IRQ_REG1_OFFSET);
for (i = IRQ_INTPRI0_REG_OFFSET; i <= IRQ_INTPRI7_REG_OFFSET; i += 4) {
u32 pri;
for (j = 0, pri = 0; j < 32; j += 4, davinci_def_priorities++)
pri |= (*davinci_def_priorities & 0x07) << j;
davinci_irq_writel(pri, i);
}
for (i = 0, j = 0; i < davinci_soc_info.intc_irq_num; i += 32, j += 0x04)
davinci_alloc_gc(davinci_intc_base + j, i, 32);
irq_set_handler(IRQ_TINT1_TINT34, handle_level_irq);
}
...@@ -30,9 +30,6 @@ ...@@ -30,9 +30,6 @@
/* Base address */ /* Base address */
#define DAVINCI_ARM_INTC_BASE 0x01C48000 #define DAVINCI_ARM_INTC_BASE 0x01C48000
#define DAVINCI_INTC_TYPE_AINTC 0
#define DAVINCI_INTC_TYPE_CP_INTC 1
/* Interrupt lines */ /* Interrupt lines */
#define IRQ_VDINT0 0 #define IRQ_VDINT0 0
#define IRQ_VDINT1 1 #define IRQ_VDINT1 1
...@@ -404,6 +401,5 @@ ...@@ -404,6 +401,5 @@
/* da850 currently has the most gpio pins (144) */ /* da850 currently has the most gpio pins (144) */
#define DAVINCI_N_GPIO 144 #define DAVINCI_N_GPIO 144
/* da850 currently has the most irqs so use DA850_N_CP_INTC_IRQ */ /* da850 currently has the most irqs so use DA850_N_CP_INTC_IRQ */
#define NR_IRQS (DA850_N_CP_INTC_IRQ + DAVINCI_N_GPIO)
#endif /* __ASM_ARCH_IRQS_H */ #endif /* __ASM_ARCH_IRQS_H */
...@@ -18,7 +18,8 @@ ...@@ -18,7 +18,8 @@
#include <mach/common.h> #include <mach/common.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <mach/da8xx.h> #include <mach/da8xx.h>
#include <mach/irqs.h>
#include "irqs.h"
#define DA8XX_USB0_BASE 0x01e00000 #define DA8XX_USB0_BASE 0x01e00000
#define DA8XX_USB1_BASE 0x01e25000 #define DA8XX_USB1_BASE 0x01e25000
...@@ -70,7 +71,7 @@ static struct resource da8xx_usb20_resources[] = { ...@@ -70,7 +71,7 @@ static struct resource da8xx_usb20_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_DA8XX_USB_INT, .start = DAVINCI_INTC_IRQ(IRQ_DA8XX_USB_INT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
.name = "mc", .name = "mc",
}, },
...@@ -105,8 +106,8 @@ static struct resource da8xx_usb11_resources[] = { ...@@ -105,8 +106,8 @@ static struct resource da8xx_usb11_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
[1] = { [1] = {
.start = IRQ_DA8XX_IRQN, .start = DAVINCI_INTC_IRQ(IRQ_DA8XX_IRQN),
.end = IRQ_DA8XX_IRQN, .end = DAVINCI_INTC_IRQ(IRQ_DA8XX_IRQN),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
}, },
}; };
......
...@@ -2,16 +2,16 @@ ...@@ -2,16 +2,16 @@
/* /*
* USB * USB
*/ */
#include <linux/dma-mapping.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/dma-mapping.h> #include <linux/platform_data/usb-davinci.h>
#include <linux/usb/musb.h> #include <linux/usb/musb.h>
#include <mach/common.h> #include <mach/common.h>
#include <mach/irqs.h>
#include <mach/cputype.h> #include <mach/cputype.h>
#include <linux/platform_data/usb-davinci.h>
#include "irqs.h"
#define DAVINCI_USB_OTG_BASE 0x01c64000 #define DAVINCI_USB_OTG_BASE 0x01c64000
...@@ -38,7 +38,7 @@ static struct resource usb_resources[] = { ...@@ -38,7 +38,7 @@ static struct resource usb_resources[] = {
.flags = IORESOURCE_MEM, .flags = IORESOURCE_MEM,
}, },
{ {
.start = IRQ_USBINT, .start = DAVINCI_INTC_IRQ(IRQ_USBINT),
.flags = IORESOURCE_IRQ, .flags = IORESOURCE_IRQ,
.name = "mc" .name = "mc"
}, },
...@@ -70,8 +70,9 @@ void __init davinci_setup_usb(unsigned mA, unsigned potpgt_ms) ...@@ -70,8 +70,9 @@ void __init davinci_setup_usb(unsigned mA, unsigned potpgt_ms)
if (cpu_is_davinci_dm646x()) { if (cpu_is_davinci_dm646x()) {
/* Override the defaults as DM6467 uses different IRQs. */ /* Override the defaults as DM6467 uses different IRQs. */
usb_dev.resource[1].start = IRQ_DM646X_USBINT; usb_dev.resource[1].start = DAVINCI_INTC_IRQ(IRQ_DM646X_USBINT);
usb_dev.resource[2].start = IRQ_DM646X_USBDMAINT; usb_dev.resource[2].start = DAVINCI_INTC_IRQ(
IRQ_DM646X_USBDMAINT);
} else /* other devices don't have dedicated CPPI IRQ */ } else /* other devices don't have dedicated CPPI IRQ */
usb_dev.num_resources = 2; usb_dev.num_resources = 2;
......
...@@ -32,10 +32,6 @@ ...@@ -32,10 +32,6 @@
#include <linux/errno.h> #include <linux/errno.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <asm/irq.h>
#include <mach/hardware.h>
#include <mach/irqs.h>
#include <linux/platform_data/keyscan-davinci.h> #include <linux/platform_data/keyscan-davinci.h>
/* Key scan registers */ /* Key scan registers */
......
...@@ -129,6 +129,16 @@ config BRCMSTB_L2_IRQ ...@@ -129,6 +129,16 @@ config BRCMSTB_L2_IRQ
select GENERIC_IRQ_CHIP select GENERIC_IRQ_CHIP
select IRQ_DOMAIN select IRQ_DOMAIN
config DAVINCI_AINTC
bool
select GENERIC_IRQ_CHIP
select IRQ_DOMAIN
config DAVINCI_CP_INTC
bool
select GENERIC_IRQ_CHIP
select IRQ_DOMAIN
config DW_APB_ICTL config DW_APB_ICTL
bool bool
select GENERIC_IRQ_CHIP select GENERIC_IRQ_CHIP
......
...@@ -6,6 +6,8 @@ obj-$(CONFIG_ATH79) += irq-ath79-cpu.o ...@@ -6,6 +6,8 @@ obj-$(CONFIG_ATH79) += irq-ath79-cpu.o
obj-$(CONFIG_ATH79) += irq-ath79-misc.o obj-$(CONFIG_ATH79) += irq-ath79-misc.o
obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2835.o
obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2836.o obj-$(CONFIG_ARCH_BCM2835) += irq-bcm2836.o
obj-$(CONFIG_DAVINCI_AINTC) += irq-davinci-aintc.o
obj-$(CONFIG_DAVINCI_CP_INTC) += irq-davinci-cp-intc.o
obj-$(CONFIG_ARCH_EXYNOS) += exynos-combiner.o obj-$(CONFIG_ARCH_EXYNOS) += exynos-combiner.o
obj-$(CONFIG_FARADAY_FTINTC010) += irq-ftintc010.o obj-$(CONFIG_FARADAY_FTINTC010) += irq-ftintc010.o
obj-$(CONFIG_ARCH_HIP04) += irq-hip04.o obj-$(CONFIG_ARCH_HIP04) += irq-hip04.o
......
// SPDX-License-Identifier: GPL-2.0-or-later
//
// Copyright (C) 2006, 2019 Texas Instruments.
//
// Interrupt handler for DaVinci boards.
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/interrupt.h>
#include <linux/irq.h>
#include <linux/irqchip/irq-davinci-aintc.h>
#include <linux/io.h>
#include <linux/irqdomain.h>
#include <asm/exception.h>
#define DAVINCI_AINTC_FIQ_REG0 0x00
#define DAVINCI_AINTC_FIQ_REG1 0x04
#define DAVINCI_AINTC_IRQ_REG0 0x08
#define DAVINCI_AINTC_IRQ_REG1 0x0c
#define DAVINCI_AINTC_IRQ_IRQENTRY 0x14
#define DAVINCI_AINTC_IRQ_ENT_REG0 0x18
#define DAVINCI_AINTC_IRQ_ENT_REG1 0x1c
#define DAVINCI_AINTC_IRQ_INCTL_REG 0x20
#define DAVINCI_AINTC_IRQ_EABASE_REG 0x24
#define DAVINCI_AINTC_IRQ_INTPRI0_REG 0x30
#define DAVINCI_AINTC_IRQ_INTPRI7_REG 0x4c
static void __iomem *davinci_aintc_base;
static struct irq_domain *davinci_aintc_irq_domain;
static inline void davinci_aintc_writel(unsigned long value, int offset)
{
writel_relaxed(value, davinci_aintc_base + offset);
}
static inline unsigned long davinci_aintc_readl(int offset)
{
return readl_relaxed(davinci_aintc_base + offset);
}
static __init void
davinci_aintc_setup_gc(void __iomem *base,
unsigned int irq_start, unsigned int num)
{
struct irq_chip_generic *gc;
struct irq_chip_type *ct;
gc = irq_get_domain_generic_chip(davinci_aintc_irq_domain, irq_start);
gc->reg_base = base;
gc->irq_base = irq_start;
ct = gc->chip_types;
ct->chip.irq_ack = irq_gc_ack_set_bit;
ct->chip.irq_mask = irq_gc_mask_clr_bit;
ct->chip.irq_unmask = irq_gc_mask_set_bit;
ct->regs.ack = DAVINCI_AINTC_IRQ_REG0;
ct->regs.mask = DAVINCI_AINTC_IRQ_ENT_REG0;
irq_setup_generic_chip(gc, IRQ_MSK(num), IRQ_GC_INIT_MASK_CACHE,
IRQ_NOREQUEST | IRQ_NOPROBE, 0);
}
static asmlinkage void __exception_irq_entry
davinci_aintc_handle_irq(struct pt_regs *regs)
{
int irqnr = davinci_aintc_readl(DAVINCI_AINTC_IRQ_IRQENTRY);
/*
* Use the formula for entry vector index generation from section
* 8.3.3 of the manual.
*/
irqnr >>= 2;
irqnr -= 1;
handle_domain_irq(davinci_aintc_irq_domain, irqnr, regs);
}
/* ARM Interrupt Controller Initialization */
void __init davinci_aintc_init(const struct davinci_aintc_config *config)
{
unsigned int irq_off, reg_off, prio, shift;
void __iomem *req;
int ret, irq_base;
const u8 *prios;
req = request_mem_region(config->reg.start,
resource_size(&config->reg),
"davinci-cp-intc");
if (!req) {
pr_err("%s: register range busy\n", __func__);
return;
}
davinci_aintc_base = ioremap(config->reg.start,
resource_size(&config->reg));
if (!davinci_aintc_base) {
pr_err("%s: unable to ioremap register range\n", __func__);
return;
}
/* Clear all interrupt requests */
davinci_aintc_writel(~0x0, DAVINCI_AINTC_FIQ_REG0);
davinci_aintc_writel(~0x0, DAVINCI_AINTC_FIQ_REG1);
davinci_aintc_writel(~0x0, DAVINCI_AINTC_IRQ_REG0);
davinci_aintc_writel(~0x0, DAVINCI_AINTC_IRQ_REG1);
/* Disable all interrupts */
davinci_aintc_writel(0x0, DAVINCI_AINTC_IRQ_ENT_REG0);
davinci_aintc_writel(0x0, DAVINCI_AINTC_IRQ_ENT_REG1);
/* Interrupts disabled immediately, IRQ entry reflects all */
davinci_aintc_writel(0x0, DAVINCI_AINTC_IRQ_INCTL_REG);
/* we don't use the hardware vector table, just its entry addresses */
davinci_aintc_writel(0, DAVINCI_AINTC_IRQ_EABASE_REG);
/* Clear all interrupt requests */
davinci_aintc_writel(~0x0, DAVINCI_AINTC_FIQ_REG0);
davinci_aintc_writel(~0x0, DAVINCI_AINTC_FIQ_REG1);
davinci_aintc_writel(~0x0, DAVINCI_AINTC_IRQ_REG0);
davinci_aintc_writel(~0x0, DAVINCI_AINTC_IRQ_REG1);
prios = config->prios;
for (reg_off = DAVINCI_AINTC_IRQ_INTPRI0_REG;
reg_off <= DAVINCI_AINTC_IRQ_INTPRI7_REG; reg_off += 4) {
for (shift = 0, prio = 0; shift < 32; shift += 4, prios++)
prio |= (*prios & 0x07) << shift;
davinci_aintc_writel(prio, reg_off);
}
irq_base = irq_alloc_descs(-1, 0, config->num_irqs, 0);
if (irq_base < 0) {
pr_err("%s: unable to allocate interrupt descriptors: %d\n",
__func__, irq_base);
return;
}
davinci_aintc_irq_domain = irq_domain_add_legacy(NULL,
config->num_irqs, irq_base, 0,
&irq_domain_simple_ops, NULL);
if (!davinci_aintc_irq_domain) {
pr_err("%s: unable to create interrupt domain\n", __func__);
return;
}
ret = irq_alloc_domain_generic_chips(davinci_aintc_irq_domain, 32, 1,
"AINTC", handle_edge_irq,
IRQ_NOREQUEST | IRQ_NOPROBE, 0, 0);
if (ret) {
pr_err("%s: unable to allocate generic irq chips for domain\n",
__func__);
return;
}
for (irq_off = 0, reg_off = 0;
irq_off < config->num_irqs;
irq_off += 32, reg_off += 0x04)
davinci_aintc_setup_gc(davinci_aintc_base + reg_off,
irq_base + irq_off, 32);
set_handle_irq(davinci_aintc_handle_irq);
}
// SPDX-License-Identifier: GPL-2.0-only
//
// Author: Steve Chen <schen@mvista.com>
// Copyright (C) 2008-2009, MontaVista Software, Inc. <source@mvista.com>
// Author: Bartosz Golaszewski <bgolaszewski@baylibre.com>
// Copyright (C) 2019, Texas Instruments
//
// TI Common Platform Interrupt Controller (cp_intc) driver
#include <linux/export.h>
#include <linux/init.h>
#include <linux/irq.h>
#include <linux/irqchip.h>
#include <linux/irqchip/irq-davinci-cp-intc.h>
#include <linux/irqdomain.h>
#include <linux/io.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_irq.h>
#include <asm/exception.h>
#define DAVINCI_CP_INTC_CTRL 0x04
#define DAVINCI_CP_INTC_HOST_CTRL 0x0c
#define DAVINCI_CP_INTC_GLOBAL_ENABLE 0x10
#define DAVINCI_CP_INTC_SYS_STAT_IDX_CLR 0x24
#define DAVINCI_CP_INTC_SYS_ENABLE_IDX_SET 0x28
#define DAVINCI_CP_INTC_SYS_ENABLE_IDX_CLR 0x2c
#define DAVINCI_CP_INTC_HOST_ENABLE_IDX_SET 0x34
#define DAVINCI_CP_INTC_HOST_ENABLE_IDX_CLR 0x38
#define DAVINCI_CP_INTC_PRIO_IDX 0x80
#define DAVINCI_CP_INTC_SYS_STAT_CLR(n) (0x0280 + (n << 2))
#define DAVINCI_CP_INTC_SYS_ENABLE_CLR(n) (0x0380 + (n << 2))
#define DAVINCI_CP_INTC_CHAN_MAP(n) (0x0400 + (n << 2))
#define DAVINCI_CP_INTC_SYS_POLARITY(n) (0x0d00 + (n << 2))
#define DAVINCI_CP_INTC_SYS_TYPE(n) (0x0d80 + (n << 2))
#define DAVINCI_CP_INTC_HOST_ENABLE(n) (0x1500 + (n << 2))
#define DAVINCI_CP_INTC_PRI_INDX_MASK GENMASK(9, 0)
#define DAVINCI_CP_INTC_GPIR_NONE BIT(31)
static void __iomem *davinci_cp_intc_base;
static struct irq_domain *davinci_cp_intc_irq_domain;
static inline unsigned int davinci_cp_intc_read(unsigned int offset)
{
return readl_relaxed(davinci_cp_intc_base + offset);
}
static inline void davinci_cp_intc_write(unsigned long value,
unsigned int offset)
{
writel_relaxed(value, davinci_cp_intc_base + offset);
}
static void davinci_cp_intc_ack_irq(struct irq_data *d)
{
davinci_cp_intc_write(d->hwirq, DAVINCI_CP_INTC_SYS_STAT_IDX_CLR);
}
static void davinci_cp_intc_mask_irq(struct irq_data *d)
{
/* XXX don't know why we need to disable nIRQ here... */
davinci_cp_intc_write(1, DAVINCI_CP_INTC_HOST_ENABLE_IDX_CLR);
davinci_cp_intc_write(d->hwirq, DAVINCI_CP_INTC_SYS_ENABLE_IDX_CLR);
davinci_cp_intc_write(1, DAVINCI_CP_INTC_HOST_ENABLE_IDX_SET);
}
static void davinci_cp_intc_unmask_irq(struct irq_data *d)
{
davinci_cp_intc_write(d->hwirq, DAVINCI_CP_INTC_SYS_ENABLE_IDX_SET);
}
static int davinci_cp_intc_set_irq_type(struct irq_data *d,
unsigned int flow_type)
{
unsigned int reg, mask, polarity, type;
reg = BIT_WORD(d->hwirq);
mask = BIT_MASK(d->hwirq);
polarity = davinci_cp_intc_read(DAVINCI_CP_INTC_SYS_POLARITY(reg));
type = davinci_cp_intc_read(DAVINCI_CP_INTC_SYS_TYPE(reg));
switch (flow_type) {
case IRQ_TYPE_EDGE_RISING:
polarity |= mask;
type |= mask;
break;
case IRQ_TYPE_EDGE_FALLING:
polarity &= ~mask;
type |= mask;
break;
case IRQ_TYPE_LEVEL_HIGH:
polarity |= mask;
type &= ~mask;
break;
case IRQ_TYPE_LEVEL_LOW:
polarity &= ~mask;
type &= ~mask;
break;
default:
return -EINVAL;
}
davinci_cp_intc_write(polarity, DAVINCI_CP_INTC_SYS_POLARITY(reg));
davinci_cp_intc_write(type, DAVINCI_CP_INTC_SYS_TYPE(reg));
return 0;
}
static struct irq_chip davinci_cp_intc_irq_chip = {
.name = "cp_intc",
.irq_ack = davinci_cp_intc_ack_irq,
.irq_mask = davinci_cp_intc_mask_irq,
.irq_unmask = davinci_cp_intc_unmask_irq,
.irq_set_type = davinci_cp_intc_set_irq_type,
.flags = IRQCHIP_SKIP_SET_WAKE,
};
static asmlinkage void __exception_irq_entry
davinci_cp_intc_handle_irq(struct pt_regs *regs)
{
int gpir, irqnr, none;
/*
* The interrupt number is in first ten bits. The NONE field set to 1
* indicates a spurious irq.
*/
gpir = davinci_cp_intc_read(DAVINCI_CP_INTC_PRIO_IDX);
irqnr = gpir & DAVINCI_CP_INTC_PRI_INDX_MASK;
none = gpir & DAVINCI_CP_INTC_GPIR_NONE;
if (unlikely(none)) {
pr_err_once("%s: spurious irq!\n", __func__);
return;
}
handle_domain_irq(davinci_cp_intc_irq_domain, irqnr, regs);
}
static int davinci_cp_intc_host_map(struct irq_domain *h, unsigned int virq,
irq_hw_number_t hw)
{
pr_debug("cp_intc_host_map(%d, 0x%lx)\n", virq, hw);
irq_set_chip(virq, &davinci_cp_intc_irq_chip);
irq_set_probe(virq);
irq_set_handler(virq, handle_edge_irq);
return 0;
}
static const struct irq_domain_ops davinci_cp_intc_irq_domain_ops = {
.map = davinci_cp_intc_host_map,
.xlate = irq_domain_xlate_onetwocell,
};
static int __init
davinci_cp_intc_do_init(const struct davinci_cp_intc_config *config,
struct device_node *node)
{
unsigned int num_regs = BITS_TO_LONGS(config->num_irqs);
int offset, irq_base;
void __iomem *req;
req = request_mem_region(config->reg.start,
resource_size(&config->reg),
"davinci-cp-intc");
if (!req) {
pr_err("%s: register range busy\n", __func__);
return -EBUSY;
}
davinci_cp_intc_base = ioremap(config->reg.start,
resource_size(&config->reg));
if (!davinci_cp_intc_base) {
pr_err("%s: unable to ioremap register range\n", __func__);
return -EINVAL;
}
davinci_cp_intc_write(0, DAVINCI_CP_INTC_GLOBAL_ENABLE);
/* Disable all host interrupts */
davinci_cp_intc_write(0, DAVINCI_CP_INTC_HOST_ENABLE(0));
/* Disable system interrupts */
for (offset = 0; offset < num_regs; offset++)
davinci_cp_intc_write(~0,
DAVINCI_CP_INTC_SYS_ENABLE_CLR(offset));
/* Set to normal mode, no nesting, no priority hold */
davinci_cp_intc_write(0, DAVINCI_CP_INTC_CTRL);
davinci_cp_intc_write(0, DAVINCI_CP_INTC_HOST_CTRL);
/* Clear system interrupt status */
for (offset = 0; offset < num_regs; offset++)
davinci_cp_intc_write(~0,
DAVINCI_CP_INTC_SYS_STAT_CLR(offset));
/* Enable nIRQ (what about nFIQ?) */
davinci_cp_intc_write(1, DAVINCI_CP_INTC_HOST_ENABLE_IDX_SET);
/* Default all priorities to channel 7. */
num_regs = (config->num_irqs + 3) >> 2; /* 4 channels per register */
for (offset = 0; offset < num_regs; offset++)
davinci_cp_intc_write(0x07070707,
DAVINCI_CP_INTC_CHAN_MAP(offset));
irq_base = irq_alloc_descs(-1, 0, config->num_irqs, 0);
if (irq_base < 0) {
pr_err("%s: unable to allocate interrupt descriptors: %d\n",
__func__, irq_base);
return irq_base;
}
davinci_cp_intc_irq_domain = irq_domain_add_legacy(
node, config->num_irqs, irq_base, 0,
&davinci_cp_intc_irq_domain_ops, NULL);
if (!davinci_cp_intc_irq_domain) {
pr_err("%s: unable to create an interrupt domain\n", __func__);
return -EINVAL;
}
set_handle_irq(davinci_cp_intc_handle_irq);
/* Enable global interrupt */
davinci_cp_intc_write(1, DAVINCI_CP_INTC_GLOBAL_ENABLE);
return 0;
}
int __init davinci_cp_intc_init(const struct davinci_cp_intc_config *config)
{
return davinci_cp_intc_do_init(config, NULL);
}
static int __init davinci_cp_intc_of_init(struct device_node *node,
struct device_node *parent)
{
struct davinci_cp_intc_config config = { };
int ret;
ret = of_address_to_resource(node, 0, &config.reg);
if (ret) {
pr_err("%s: unable to get the register range from device-tree\n",
__func__);
return ret;
}
ret = of_property_read_u32(node, "ti,intc-size", &config.num_irqs);
if (ret) {
pr_err("%s: unable to read the 'ti,intc-size' property\n",
__func__);
return ret;
}
return davinci_cp_intc_do_init(&config, node);
}
IRQCHIP_DECLARE(cp_intc, "ti,cp-intc", davinci_cp_intc_of_init);
...@@ -49,10 +49,11 @@ config TI_DAVINCI_CPDMA ...@@ -49,10 +49,11 @@ config TI_DAVINCI_CPDMA
will be called davinci_cpdma. This is recommended. will be called davinci_cpdma. This is recommended.
config TI_CPSW_PHY_SEL config TI_CPSW_PHY_SEL
bool bool "TI CPSW Phy mode Selection (DEPRECATED)"
default n
---help--- ---help---
This driver supports configuring of the phy mode connected to This driver supports configuring of the phy mode connected to
the CPSW. the CPSW. DEPRECATED: use PHY_TI_GMII_SEL.
config TI_CPSW_ALE config TI_CPSW_ALE
tristate "TI CPSW ALE Support" tristate "TI CPSW ALE Support"
...@@ -64,7 +65,6 @@ config TI_CPSW ...@@ -64,7 +65,6 @@ config TI_CPSW
depends on ARCH_DAVINCI || ARCH_OMAP2PLUS || COMPILE_TEST depends on ARCH_DAVINCI || ARCH_OMAP2PLUS || COMPILE_TEST
select TI_DAVINCI_CPDMA select TI_DAVINCI_CPDMA
select TI_DAVINCI_MDIO select TI_DAVINCI_MDIO
select TI_CPSW_PHY_SEL
select TI_CPSW_ALE select TI_CPSW_ALE
select MFD_SYSCON select MFD_SYSCON
select REGMAP select REGMAP
......
...@@ -21,7 +21,13 @@ ...@@ -21,7 +21,13 @@
((mac)[2] << 16) | ((mac)[3] << 24)) ((mac)[2] << 16) | ((mac)[3] << 24))
#define mac_lo(mac) (((mac)[4] << 0) | ((mac)[5] << 8)) #define mac_lo(mac) (((mac)[4] << 0) | ((mac)[5] << 8))
#if IS_ENABLED(CONFIG_TI_CPSW_PHY_SEL)
void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave); void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave);
#else
static inline
void cpsw_phy_sel(struct device *dev, phy_interface_t phy_mode, int slave)
{}
#endif
int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr); int ti_cm_get_macid(struct device *dev, int slave, u8 *mac_addr);
#endif /* __CPSW_H__ */ #endif /* __CPSW_H__ */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2019 Texas Instruments
*/
#ifndef _LINUX_IRQ_DAVINCI_AINTC_
#define _LINUX_IRQ_DAVINCI_AINTC_
#include <linux/ioport.h>
/**
* struct davinci_aintc_config - configuration data for davinci-aintc driver.
*
* @reg: register range to map
* @num_irqs: number of HW interrupts supported by the controller
* @prios: an array of size num_irqs containing priority settings for
* each interrupt
*/
struct davinci_aintc_config {
struct resource reg;
unsigned int num_irqs;
u8 *prios;
};
void davinci_aintc_init(const struct davinci_aintc_config *config);
#endif /* _LINUX_IRQ_DAVINCI_AINTC_ */
/* SPDX-License-Identifier: GPL-2.0-or-later */
/*
* Copyright (C) 2019 Texas Instruments
*/
#ifndef _LINUX_IRQ_DAVINCI_CP_INTC_
#define _LINUX_IRQ_DAVINCI_CP_INTC_
#include <linux/ioport.h>
/**
* struct davinci_cp_intc_config - configuration data for davinci-cp-intc
* driver.
*
* @reg: register range to map
* @num_irqs: number of HW interrupts supported by the controller
*/
struct davinci_cp_intc_config {
struct resource reg;
unsigned int num_irqs;
};
int davinci_cp_intc_init(const struct davinci_cp_intc_config *config);
#endif /* _LINUX_IRQ_DAVINCI_CP_INTC_ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment