mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-04 17:26:47 +07:00
Merge branch 'next/irq-s3c24xx' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung into next/drivers
From Kukjin Kim <kgene.kim@samsung.com>: Here is finish the irq rework for s3c2412, s3c2440 and s3c2442 into the new structure and eint0 to 3 on the s3c2412. * 'next/irq-s3c24xx' of git://git.kernel.org/pub/scm/linux/kernel/git/kgene/linux-samsung: gpio: samsung: fixes build warning with s3c2410_defconfig ARM: S3C24XX: handle s3c2412 eints using new infrastructure ARM: S3C24XX: add soc_is_s3c2412 option ARM: S3C24XX: include first 4 bits of the eint register in irq mapping ARM: S3C24XX: transform s3c2412 irqs into new structure ARM: S3C24XX: modify s3c2412 irq init to initialize all irqs ARM: S3C24XX: move s3c2412 irq init to common code ARM: S3C24XX: use samsung_sync_wakemask in s3c2412 pm ARM: S3C24XX: transform s3c2440 irqs into new structure ARM: S3C24XX: transform s3c2442 irqs into new structure ARM: S3C24XX: integrate s3c2440 irqs into common init ARM: S3C24XX: move s3c2440 irqs to common irq code ARM: S3C24XX: create dedicated irq init functions for s3c2440 and s3c2442 ARM: S3C24XX: move s3c244x irq init to common irq code Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
cabaf3edf8
@ -407,6 +407,7 @@ config S3C2412_DMA
|
||||
config S3C2412_PM
|
||||
bool
|
||||
select S3C2412_PM_SLEEP
|
||||
select SAMSUNG_WAKEMASK
|
||||
help
|
||||
Internal config node to apply S3C2412 power management
|
||||
|
||||
|
@ -22,7 +22,7 @@ obj-$(CONFIG_S3C2410_DMA) += dma-s3c2410.o
|
||||
obj-$(CONFIG_S3C2410_PLL) += pll-s3c2410.o
|
||||
obj-$(CONFIG_S3C2410_PM) += pm-s3c2410.o sleep-s3c2410.o
|
||||
|
||||
obj-$(CONFIG_CPU_S3C2412) += s3c2412.o irq-s3c2412.o clock-s3c2412.o
|
||||
obj-$(CONFIG_CPU_S3C2412) += s3c2412.o clock-s3c2412.o
|
||||
obj-$(CONFIG_S3C2412_CPUFREQ) += cpufreq-s3c2412.o
|
||||
obj-$(CONFIG_S3C2412_DMA) += dma-s3c2412.o
|
||||
obj-$(CONFIG_S3C2412_PM) += pm-s3c2412.o
|
||||
@ -31,9 +31,9 @@ obj-$(CONFIG_S3C2412_PM_SLEEP) += sleep-s3c2412.o
|
||||
obj-$(CONFIG_CPU_S3C2416) += s3c2416.o clock-s3c2416.o
|
||||
obj-$(CONFIG_S3C2416_PM) += pm-s3c2416.o
|
||||
|
||||
obj-$(CONFIG_CPU_S3C2440) += s3c2440.o irq-s3c2440.o clock-s3c2440.o
|
||||
obj-$(CONFIG_CPU_S3C2440) += s3c2440.o clock-s3c2440.o
|
||||
obj-$(CONFIG_CPU_S3C2442) += s3c2442.o
|
||||
obj-$(CONFIG_CPU_S3C244X) += s3c244x.o irq-s3c244x.o clock-s3c244x.o
|
||||
obj-$(CONFIG_CPU_S3C244X) += s3c244x.o clock-s3c244x.o
|
||||
obj-$(CONFIG_S3C2440_CPUFREQ) += cpufreq-s3c2440.o
|
||||
obj-$(CONFIG_S3C2440_DMA) += dma-s3c2440.o
|
||||
obj-$(CONFIG_S3C2440_PLL_12000000) += pll-s3c2440-12000000.o
|
||||
|
@ -36,6 +36,7 @@ extern void s3c2412_init_uarts(struct s3c2410_uartcfg *cfg, int no);
|
||||
extern void s3c2412_init_clocks(int xtal);
|
||||
extern int s3c2412_baseclk_add(void);
|
||||
extern void s3c2412_restart(char mode, const char *cmd);
|
||||
extern void s3c2412_init_irq(void);
|
||||
#else
|
||||
#define s3c2412_init_clocks NULL
|
||||
#define s3c2412_init_uarts NULL
|
||||
@ -73,6 +74,7 @@ extern void s3c244x_restart(char mode, const char *cmd);
|
||||
#ifdef CONFIG_CPU_S3C2440
|
||||
extern int s3c2440_init(void);
|
||||
extern void s3c2440_map_io(void);
|
||||
extern void s3c2440_init_irq(void);
|
||||
#else
|
||||
#define s3c2440_init NULL
|
||||
#define s3c2440_map_io NULL
|
||||
@ -81,6 +83,7 @@ extern void s3c2440_map_io(void);
|
||||
#ifdef CONFIG_CPU_S3C2442
|
||||
extern int s3c2442_init(void);
|
||||
extern void s3c2442_map_io(void);
|
||||
extern void s3c2442_init_irq(void);
|
||||
#else
|
||||
#define s3c2442_init NULL
|
||||
#define s3c2442_map_io NULL
|
||||
|
@ -59,49 +59,53 @@
|
||||
#define IRQ_ADCPARENT S3C2410_IRQ(31)
|
||||
|
||||
/* interrupts generated from the external interrupts sources */
|
||||
#define IRQ_EINT4 S3C2410_IRQ(32) /* 48 */
|
||||
#define IRQ_EINT5 S3C2410_IRQ(33)
|
||||
#define IRQ_EINT6 S3C2410_IRQ(34)
|
||||
#define IRQ_EINT7 S3C2410_IRQ(35)
|
||||
#define IRQ_EINT8 S3C2410_IRQ(36)
|
||||
#define IRQ_EINT9 S3C2410_IRQ(37)
|
||||
#define IRQ_EINT10 S3C2410_IRQ(38)
|
||||
#define IRQ_EINT11 S3C2410_IRQ(39)
|
||||
#define IRQ_EINT12 S3C2410_IRQ(40)
|
||||
#define IRQ_EINT13 S3C2410_IRQ(41)
|
||||
#define IRQ_EINT14 S3C2410_IRQ(42)
|
||||
#define IRQ_EINT15 S3C2410_IRQ(43)
|
||||
#define IRQ_EINT16 S3C2410_IRQ(44)
|
||||
#define IRQ_EINT17 S3C2410_IRQ(45)
|
||||
#define IRQ_EINT18 S3C2410_IRQ(46)
|
||||
#define IRQ_EINT19 S3C2410_IRQ(47)
|
||||
#define IRQ_EINT20 S3C2410_IRQ(48) /* 64 */
|
||||
#define IRQ_EINT21 S3C2410_IRQ(49)
|
||||
#define IRQ_EINT22 S3C2410_IRQ(50)
|
||||
#define IRQ_EINT23 S3C2410_IRQ(51)
|
||||
#define IRQ_EINT0_2412 S3C2410_IRQ(32)
|
||||
#define IRQ_EINT1_2412 S3C2410_IRQ(33)
|
||||
#define IRQ_EINT2_2412 S3C2410_IRQ(34)
|
||||
#define IRQ_EINT3_2412 S3C2410_IRQ(35)
|
||||
#define IRQ_EINT4 S3C2410_IRQ(36) /* 52 */
|
||||
#define IRQ_EINT5 S3C2410_IRQ(37)
|
||||
#define IRQ_EINT6 S3C2410_IRQ(38)
|
||||
#define IRQ_EINT7 S3C2410_IRQ(39)
|
||||
#define IRQ_EINT8 S3C2410_IRQ(40)
|
||||
#define IRQ_EINT9 S3C2410_IRQ(41)
|
||||
#define IRQ_EINT10 S3C2410_IRQ(42)
|
||||
#define IRQ_EINT11 S3C2410_IRQ(43)
|
||||
#define IRQ_EINT12 S3C2410_IRQ(44)
|
||||
#define IRQ_EINT13 S3C2410_IRQ(45)
|
||||
#define IRQ_EINT14 S3C2410_IRQ(46)
|
||||
#define IRQ_EINT15 S3C2410_IRQ(47)
|
||||
#define IRQ_EINT16 S3C2410_IRQ(48)
|
||||
#define IRQ_EINT17 S3C2410_IRQ(49)
|
||||
#define IRQ_EINT18 S3C2410_IRQ(50)
|
||||
#define IRQ_EINT19 S3C2410_IRQ(51)
|
||||
#define IRQ_EINT20 S3C2410_IRQ(52) /* 68 */
|
||||
#define IRQ_EINT21 S3C2410_IRQ(53)
|
||||
#define IRQ_EINT22 S3C2410_IRQ(54)
|
||||
#define IRQ_EINT23 S3C2410_IRQ(55)
|
||||
|
||||
#define IRQ_EINT_BIT(x) ((x) - IRQ_EINT4 + 4)
|
||||
#define IRQ_EINT(x) (((x) >= 4) ? (IRQ_EINT4 + (x) - 4) : (IRQ_EINT0 + (x)))
|
||||
|
||||
#define IRQ_LCD_FIFO S3C2410_IRQ(52)
|
||||
#define IRQ_LCD_FRAME S3C2410_IRQ(53)
|
||||
#define IRQ_LCD_FIFO S3C2410_IRQ(56)
|
||||
#define IRQ_LCD_FRAME S3C2410_IRQ(57)
|
||||
|
||||
/* IRQs for the interal UARTs, and ADC
|
||||
* these need to be ordered in number of appearance in the
|
||||
* SUBSRC mask register
|
||||
*/
|
||||
|
||||
#define S3C2410_IRQSUB(x) S3C2410_IRQ((x)+54)
|
||||
#define S3C2410_IRQSUB(x) S3C2410_IRQ((x)+58)
|
||||
|
||||
#define IRQ_S3CUART_RX0 S3C2410_IRQSUB(0) /* 70 */
|
||||
#define IRQ_S3CUART_RX0 S3C2410_IRQSUB(0) /* 74 */
|
||||
#define IRQ_S3CUART_TX0 S3C2410_IRQSUB(1)
|
||||
#define IRQ_S3CUART_ERR0 S3C2410_IRQSUB(2)
|
||||
|
||||
#define IRQ_S3CUART_RX1 S3C2410_IRQSUB(3) /* 73 */
|
||||
#define IRQ_S3CUART_RX1 S3C2410_IRQSUB(3) /* 77 */
|
||||
#define IRQ_S3CUART_TX1 S3C2410_IRQSUB(4)
|
||||
#define IRQ_S3CUART_ERR1 S3C2410_IRQSUB(5)
|
||||
|
||||
#define IRQ_S3CUART_RX2 S3C2410_IRQSUB(6) /* 76 */
|
||||
#define IRQ_S3CUART_RX2 S3C2410_IRQSUB(6) /* 80 */
|
||||
#define IRQ_S3CUART_TX2 S3C2410_IRQSUB(7)
|
||||
#define IRQ_S3CUART_ERR2 S3C2410_IRQSUB(8)
|
||||
|
||||
@ -136,7 +140,7 @@
|
||||
|
||||
/* second interrupt-register of s3c2416/s3c2450 */
|
||||
|
||||
#define S3C2416_IRQ(x) S3C2410_IRQ((x) + 54 + 29)
|
||||
#define S3C2416_IRQ(x) S3C2410_IRQ((x) + 58 + 29)
|
||||
#define IRQ_S3C2416_2D S3C2416_IRQ(0)
|
||||
#define IRQ_S3C2416_IIC1 S3C2416_IRQ(1)
|
||||
#define IRQ_S3C2416_RESERVED2 S3C2416_IRQ(2)
|
||||
|
@ -1,215 +0,0 @@
|
||||
/* linux/arch/arm/mach-s3c2412/irq.c
|
||||
*
|
||||
* Copyright (c) 2006 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/regs-irq.h>
|
||||
#include <mach/regs-gpio.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/irq.h>
|
||||
#include <plat/pm.h>
|
||||
|
||||
#include "s3c2412-power.h"
|
||||
|
||||
#define INTMSK(start, end) ((1 << ((end) + 1 - (start))) - 1)
|
||||
#define INTMSK_SUB(start, end) (INTMSK(start, end) << ((start - S3C2410_IRQSUB(0))))
|
||||
|
||||
/* the s3c2412 changes the behaviour of IRQ_EINT0 through IRQ_EINT3 by
|
||||
* having them turn up in both the INT* and the EINT* registers. Whilst
|
||||
* both show the status, they both now need to be acked when the IRQs
|
||||
* go off.
|
||||
*/
|
||||
|
||||
static void
|
||||
s3c2412_irq_mask(struct irq_data *data)
|
||||
{
|
||||
unsigned long bitval = 1UL << (data->irq - IRQ_EINT0);
|
||||
unsigned long mask;
|
||||
|
||||
mask = __raw_readl(S3C2410_INTMSK);
|
||||
__raw_writel(mask | bitval, S3C2410_INTMSK);
|
||||
|
||||
mask = __raw_readl(S3C2412_EINTMASK);
|
||||
__raw_writel(mask | bitval, S3C2412_EINTMASK);
|
||||
}
|
||||
|
||||
static inline void
|
||||
s3c2412_irq_ack(struct irq_data *data)
|
||||
{
|
||||
unsigned long bitval = 1UL << (data->irq - IRQ_EINT0);
|
||||
|
||||
__raw_writel(bitval, S3C2412_EINTPEND);
|
||||
__raw_writel(bitval, S3C2410_SRCPND);
|
||||
__raw_writel(bitval, S3C2410_INTPND);
|
||||
}
|
||||
|
||||
static inline void
|
||||
s3c2412_irq_maskack(struct irq_data *data)
|
||||
{
|
||||
unsigned long bitval = 1UL << (data->irq - IRQ_EINT0);
|
||||
unsigned long mask;
|
||||
|
||||
mask = __raw_readl(S3C2410_INTMSK);
|
||||
__raw_writel(mask|bitval, S3C2410_INTMSK);
|
||||
|
||||
mask = __raw_readl(S3C2412_EINTMASK);
|
||||
__raw_writel(mask | bitval, S3C2412_EINTMASK);
|
||||
|
||||
__raw_writel(bitval, S3C2412_EINTPEND);
|
||||
__raw_writel(bitval, S3C2410_SRCPND);
|
||||
__raw_writel(bitval, S3C2410_INTPND);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c2412_irq_unmask(struct irq_data *data)
|
||||
{
|
||||
unsigned long bitval = 1UL << (data->irq - IRQ_EINT0);
|
||||
unsigned long mask;
|
||||
|
||||
mask = __raw_readl(S3C2412_EINTMASK);
|
||||
__raw_writel(mask & ~bitval, S3C2412_EINTMASK);
|
||||
|
||||
mask = __raw_readl(S3C2410_INTMSK);
|
||||
__raw_writel(mask & ~bitval, S3C2410_INTMSK);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c2412_irq_eint0t4 = {
|
||||
.irq_ack = s3c2412_irq_ack,
|
||||
.irq_mask = s3c2412_irq_mask,
|
||||
.irq_unmask = s3c2412_irq_unmask,
|
||||
.irq_set_wake = s3c_irq_wake,
|
||||
.irq_set_type = s3c_irqext_type,
|
||||
};
|
||||
|
||||
#define INTBIT(x) (1 << ((x) - S3C2410_IRQSUB(0)))
|
||||
|
||||
/* CF and SDI sub interrupts */
|
||||
|
||||
static void s3c2412_irq_demux_cfsdi(unsigned int irq, struct irq_desc *desc)
|
||||
{
|
||||
unsigned int subsrc, submsk;
|
||||
|
||||
subsrc = __raw_readl(S3C2410_SUBSRCPND);
|
||||
submsk = __raw_readl(S3C2410_INTSUBMSK);
|
||||
|
||||
subsrc &= ~submsk;
|
||||
|
||||
if (subsrc & INTBIT(IRQ_S3C2412_SDI))
|
||||
generic_handle_irq(IRQ_S3C2412_SDI);
|
||||
|
||||
if (subsrc & INTBIT(IRQ_S3C2412_CF))
|
||||
generic_handle_irq(IRQ_S3C2412_CF);
|
||||
}
|
||||
|
||||
#define INTMSK_CFSDI (1UL << (IRQ_S3C2412_CFSDI - IRQ_EINT0))
|
||||
#define SUBMSK_CFSDI INTMSK_SUB(IRQ_S3C2412_SDI, IRQ_S3C2412_CF)
|
||||
|
||||
static void s3c2412_irq_cfsdi_mask(struct irq_data *data)
|
||||
{
|
||||
s3c_irqsub_mask(data->irq, INTMSK_CFSDI, SUBMSK_CFSDI);
|
||||
}
|
||||
|
||||
static void s3c2412_irq_cfsdi_unmask(struct irq_data *data)
|
||||
{
|
||||
s3c_irqsub_unmask(data->irq, INTMSK_CFSDI);
|
||||
}
|
||||
|
||||
static void s3c2412_irq_cfsdi_ack(struct irq_data *data)
|
||||
{
|
||||
s3c_irqsub_maskack(data->irq, INTMSK_CFSDI, SUBMSK_CFSDI);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c2412_irq_cfsdi = {
|
||||
.name = "s3c2412-cfsdi",
|
||||
.irq_ack = s3c2412_irq_cfsdi_ack,
|
||||
.irq_mask = s3c2412_irq_cfsdi_mask,
|
||||
.irq_unmask = s3c2412_irq_cfsdi_unmask,
|
||||
};
|
||||
|
||||
static int s3c2412_irq_rtc_wake(struct irq_data *data, unsigned int state)
|
||||
{
|
||||
unsigned long pwrcfg;
|
||||
|
||||
pwrcfg = __raw_readl(S3C2412_PWRCFG);
|
||||
if (state)
|
||||
pwrcfg &= ~S3C2412_PWRCFG_RTC_MASKIRQ;
|
||||
else
|
||||
pwrcfg |= S3C2412_PWRCFG_RTC_MASKIRQ;
|
||||
__raw_writel(pwrcfg, S3C2412_PWRCFG);
|
||||
|
||||
return s3c_irq_chip.irq_set_wake(data, state);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c2412_irq_rtc_chip;
|
||||
|
||||
static int s3c2412_irq_add(struct device *dev, struct subsys_interface *sif)
|
||||
{
|
||||
unsigned int irqno;
|
||||
|
||||
for (irqno = IRQ_EINT0; irqno <= IRQ_EINT3; irqno++) {
|
||||
irq_set_chip_and_handler(irqno, &s3c2412_irq_eint0t4,
|
||||
handle_edge_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
/* add demux support for CF/SDI */
|
||||
|
||||
irq_set_chained_handler(IRQ_S3C2412_CFSDI, s3c2412_irq_demux_cfsdi);
|
||||
|
||||
for (irqno = IRQ_S3C2412_SDI; irqno <= IRQ_S3C2412_CF; irqno++) {
|
||||
irq_set_chip_and_handler(irqno, &s3c2412_irq_cfsdi,
|
||||
handle_level_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
/* change RTC IRQ's set wake method */
|
||||
|
||||
s3c2412_irq_rtc_chip = s3c_irq_chip;
|
||||
s3c2412_irq_rtc_chip.irq_set_wake = s3c2412_irq_rtc_wake;
|
||||
|
||||
irq_set_chip(IRQ_RTC, &s3c2412_irq_rtc_chip);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct subsys_interface s3c2412_irq_interface = {
|
||||
.name = "s3c2412_irq",
|
||||
.subsys = &s3c2412_subsys,
|
||||
.add_dev = s3c2412_irq_add,
|
||||
};
|
||||
|
||||
static int s3c2412_irq_init(void)
|
||||
{
|
||||
return subsys_interface_register(&s3c2412_irq_interface);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2412_irq_init);
|
@ -1,128 +0,0 @@
|
||||
/* linux/arch/arm/mach-s3c2440/irq.c
|
||||
*
|
||||
* Copyright (c) 2003-2004 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/regs-irq.h>
|
||||
#include <mach/regs-gpio.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/pm.h>
|
||||
#include <plat/irq.h>
|
||||
|
||||
/* WDT/AC97 */
|
||||
|
||||
static void s3c_irq_demux_wdtac97(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
unsigned int subsrc, submsk;
|
||||
|
||||
/* read the current pending interrupts, and the mask
|
||||
* for what it is available */
|
||||
|
||||
subsrc = __raw_readl(S3C2410_SUBSRCPND);
|
||||
submsk = __raw_readl(S3C2410_INTSUBMSK);
|
||||
|
||||
subsrc &= ~submsk;
|
||||
subsrc >>= 13;
|
||||
subsrc &= 3;
|
||||
|
||||
if (subsrc != 0) {
|
||||
if (subsrc & 1) {
|
||||
generic_handle_irq(IRQ_S3C2440_WDT);
|
||||
}
|
||||
if (subsrc & 2) {
|
||||
generic_handle_irq(IRQ_S3C2440_AC97);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
#define INTMSK_WDT (1UL << (IRQ_WDT - IRQ_EINT0))
|
||||
|
||||
static void
|
||||
s3c_irq_wdtac97_mask(struct irq_data *data)
|
||||
{
|
||||
s3c_irqsub_mask(data->irq, INTMSK_WDT, 3 << 13);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_wdtac97_unmask(struct irq_data *data)
|
||||
{
|
||||
s3c_irqsub_unmask(data->irq, INTMSK_WDT);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_wdtac97_ack(struct irq_data *data)
|
||||
{
|
||||
s3c_irqsub_maskack(data->irq, INTMSK_WDT, 3 << 13);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c_irq_wdtac97 = {
|
||||
.irq_mask = s3c_irq_wdtac97_mask,
|
||||
.irq_unmask = s3c_irq_wdtac97_unmask,
|
||||
.irq_ack = s3c_irq_wdtac97_ack,
|
||||
};
|
||||
|
||||
static int s3c2440_irq_add(struct device *dev, struct subsys_interface *sif)
|
||||
{
|
||||
unsigned int irqno;
|
||||
|
||||
printk("S3C2440: IRQ Support\n");
|
||||
|
||||
/* add new chained handler for wdt, ac7 */
|
||||
|
||||
irq_set_chip_and_handler(IRQ_WDT, &s3c_irq_level_chip,
|
||||
handle_level_irq);
|
||||
irq_set_chained_handler(IRQ_WDT, s3c_irq_demux_wdtac97);
|
||||
|
||||
for (irqno = IRQ_S3C2440_WDT; irqno <= IRQ_S3C2440_AC97; irqno++) {
|
||||
irq_set_chip_and_handler(irqno, &s3c_irq_wdtac97,
|
||||
handle_level_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct subsys_interface s3c2440_irq_interface = {
|
||||
.name = "s3c2440_irq",
|
||||
.subsys = &s3c2440_subsys,
|
||||
.add_dev = s3c2440_irq_add,
|
||||
};
|
||||
|
||||
static int s3c2440_irq_init(void)
|
||||
{
|
||||
return subsys_interface_register(&s3c2440_irq_interface);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2440_irq_init);
|
||||
|
@ -1,142 +0,0 @@
|
||||
/* linux/arch/arm/plat-s3c24xx/s3c244x-irq.c
|
||||
*
|
||||
* Copyright (c) 2003-2004 Simtec Electronics
|
||||
* Ben Dooks <ben@simtec.co.uk>
|
||||
*
|
||||
* 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/io.h>
|
||||
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#include <asm/mach/irq.h>
|
||||
|
||||
#include <mach/regs-irq.h>
|
||||
#include <mach/regs-gpio.h>
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/pm.h>
|
||||
#include <plat/irq.h>
|
||||
|
||||
/* camera irq */
|
||||
|
||||
static void s3c_irq_demux_cam(unsigned int irq,
|
||||
struct irq_desc *desc)
|
||||
{
|
||||
unsigned int subsrc, submsk;
|
||||
|
||||
/* read the current pending interrupts, and the mask
|
||||
* for what it is available */
|
||||
|
||||
subsrc = __raw_readl(S3C2410_SUBSRCPND);
|
||||
submsk = __raw_readl(S3C2410_INTSUBMSK);
|
||||
|
||||
subsrc &= ~submsk;
|
||||
subsrc >>= 11;
|
||||
subsrc &= 3;
|
||||
|
||||
if (subsrc != 0) {
|
||||
if (subsrc & 1) {
|
||||
generic_handle_irq(IRQ_S3C2440_CAM_C);
|
||||
}
|
||||
if (subsrc & 2) {
|
||||
generic_handle_irq(IRQ_S3C2440_CAM_P);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#define INTMSK_CAM (1UL << (IRQ_CAM - IRQ_EINT0))
|
||||
|
||||
static void
|
||||
s3c_irq_cam_mask(struct irq_data *data)
|
||||
{
|
||||
s3c_irqsub_mask(data->irq, INTMSK_CAM, 3 << 11);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_cam_unmask(struct irq_data *data)
|
||||
{
|
||||
s3c_irqsub_unmask(data->irq, INTMSK_CAM);
|
||||
}
|
||||
|
||||
static void
|
||||
s3c_irq_cam_ack(struct irq_data *data)
|
||||
{
|
||||
s3c_irqsub_maskack(data->irq, INTMSK_CAM, 3 << 11);
|
||||
}
|
||||
|
||||
static struct irq_chip s3c_irq_cam = {
|
||||
.irq_mask = s3c_irq_cam_mask,
|
||||
.irq_unmask = s3c_irq_cam_unmask,
|
||||
.irq_ack = s3c_irq_cam_ack,
|
||||
};
|
||||
|
||||
static int s3c244x_irq_add(struct device *dev, struct subsys_interface *sif)
|
||||
{
|
||||
unsigned int irqno;
|
||||
|
||||
irq_set_chip_and_handler(IRQ_NFCON, &s3c_irq_level_chip,
|
||||
handle_level_irq);
|
||||
set_irq_flags(IRQ_NFCON, IRQF_VALID);
|
||||
|
||||
/* add chained handler for camera */
|
||||
|
||||
irq_set_chip_and_handler(IRQ_CAM, &s3c_irq_level_chip,
|
||||
handle_level_irq);
|
||||
irq_set_chained_handler(IRQ_CAM, s3c_irq_demux_cam);
|
||||
|
||||
for (irqno = IRQ_S3C2440_CAM_C; irqno <= IRQ_S3C2440_CAM_P; irqno++) {
|
||||
irq_set_chip_and_handler(irqno, &s3c_irq_cam,
|
||||
handle_level_irq);
|
||||
set_irq_flags(irqno, IRQF_VALID);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct subsys_interface s3c2440_irq_interface = {
|
||||
.name = "s3c2440_irq",
|
||||
.subsys = &s3c2440_subsys,
|
||||
.add_dev = s3c244x_irq_add,
|
||||
};
|
||||
|
||||
static int s3c2440_irq_init(void)
|
||||
{
|
||||
return subsys_interface_register(&s3c2440_irq_interface);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2440_irq_init);
|
||||
|
||||
static struct subsys_interface s3c2442_irq_interface = {
|
||||
.name = "s3c2442_irq",
|
||||
.subsys = &s3c2442_subsys,
|
||||
.add_dev = s3c244x_irq_add,
|
||||
};
|
||||
|
||||
|
||||
static int s3c2442_irq_init(void)
|
||||
{
|
||||
return subsys_interface_register(&s3c2442_irq_interface);
|
||||
}
|
||||
|
||||
arch_initcall(s3c2442_irq_init);
|
@ -342,7 +342,10 @@ static int s3c24xx_irq_map(struct irq_domain *h, unsigned int virq,
|
||||
case S3C_IRQTYPE_NONE:
|
||||
return 0;
|
||||
case S3C_IRQTYPE_EINT:
|
||||
if (irq_data->parent_irq)
|
||||
/* On the S3C2412, the EINT0to3 have a parent irq
|
||||
* but need the s3c_irq_eint0t4 chip
|
||||
*/
|
||||
if (irq_data->parent_irq && (!soc_is_s3c2412() || hw >= 4))
|
||||
irq_set_chip_and_handler(virq, &s3c_irqext_chip,
|
||||
handle_edge_irq);
|
||||
else
|
||||
@ -450,7 +453,6 @@ struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np,
|
||||
void __iomem *base = (void *)0xf6000000; /* static mapping */
|
||||
int irq_num;
|
||||
int irq_start;
|
||||
int irq_offset;
|
||||
int ret;
|
||||
|
||||
intc = kzalloc(sizeof(struct s3c_irq_intc), GFP_KERNEL);
|
||||
@ -474,7 +476,6 @@ struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np,
|
||||
intc->reg_intpnd = base + 0x10;
|
||||
irq_num = 32;
|
||||
irq_start = S3C2410_IRQ(0);
|
||||
irq_offset = 0;
|
||||
break;
|
||||
case 0x4a000018:
|
||||
pr_debug("irq: found subintc\n");
|
||||
@ -482,7 +483,6 @@ struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np,
|
||||
intc->reg_mask = base + 0x1c;
|
||||
irq_num = 29;
|
||||
irq_start = S3C2410_IRQSUB(0);
|
||||
irq_offset = 0;
|
||||
break;
|
||||
case 0x4a000040:
|
||||
pr_debug("irq: found intc2\n");
|
||||
@ -491,7 +491,6 @@ struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np,
|
||||
intc->reg_intpnd = base + 0x50;
|
||||
irq_num = 8;
|
||||
irq_start = S3C2416_IRQ(0);
|
||||
irq_offset = 0;
|
||||
break;
|
||||
case 0x560000a4:
|
||||
pr_debug("irq: found eintc\n");
|
||||
@ -499,9 +498,8 @@ struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np,
|
||||
|
||||
intc->reg_mask = base + 0xa4;
|
||||
intc->reg_pending = base + 0x08;
|
||||
irq_num = 20;
|
||||
irq_num = 24;
|
||||
irq_start = S3C2410_IRQ(32);
|
||||
irq_offset = 4;
|
||||
break;
|
||||
default:
|
||||
pr_err("irq: unsupported controller address\n");
|
||||
@ -512,7 +510,7 @@ struct s3c_irq_intc *s3c24xx_init_intc(struct device_node *np,
|
||||
/* now that all the data is complete, init the irq-domain */
|
||||
s3c24xx_clear_intc(intc);
|
||||
intc->domain = irq_domain_add_legacy(np, irq_num, irq_start,
|
||||
irq_offset, &s3c24xx_irq_ops,
|
||||
0, &s3c24xx_irq_ops,
|
||||
intc);
|
||||
if (!intc->domain) {
|
||||
pr_err("irq: could not create irq-domain\n");
|
||||
@ -626,6 +624,108 @@ void __init s3c24xx_init_irq(void)
|
||||
s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2412
|
||||
static struct s3c_irq_data init_s3c2412base[32] = {
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT0 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT1 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT2 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT3 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */
|
||||
{ .type = S3C_IRQTYPE_NONE, }, /* reserved */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TICK */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* WDT */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* LCD */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* SDI/CF */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */
|
||||
{ .type = S3C_IRQTYPE_NONE, }, /* reserved */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* USBD */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* USBH */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* IIC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* RTC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */
|
||||
};
|
||||
|
||||
static struct s3c_irq_data init_s3c2412eint[32] = {
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 0 }, /* EINT0 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 1 }, /* EINT1 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 2 }, /* EINT2 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 3 }, /* EINT3 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT4 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT5 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT6 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 4 }, /* EINT7 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT8 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT9 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT10 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT11 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT12 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT13 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT14 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT15 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT16 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT17 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT18 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT19 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT20 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT21 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT22 */
|
||||
{ .type = S3C_IRQTYPE_EINT, .parent_irq = 5 }, /* EINT23 */
|
||||
};
|
||||
|
||||
static struct s3c_irq_data init_s3c2412subint[32] = {
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */
|
||||
{ .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */
|
||||
{ .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */
|
||||
{ .type = S3C_IRQTYPE_NONE, },
|
||||
{ .type = S3C_IRQTYPE_NONE, },
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 21 }, /* SDI */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 21 }, /* CF */
|
||||
};
|
||||
|
||||
void s3c2412_init_irq(void)
|
||||
{
|
||||
struct s3c_irq_intc *main_intc;
|
||||
|
||||
pr_info("S3C2412: IRQ Support\n");
|
||||
|
||||
#ifdef CONFIG_FIQ
|
||||
init_FIQ(FIQ_START);
|
||||
#endif
|
||||
|
||||
main_intc = s3c24xx_init_intc(NULL, &init_s3c2412base[0], NULL, 0x4a000000);
|
||||
if (IS_ERR(main_intc)) {
|
||||
pr_err("irq: could not create main interrupt controller\n");
|
||||
return;
|
||||
}
|
||||
|
||||
s3c24xx_init_intc(NULL, &init_s3c2412eint[0], main_intc, 0x560000a4);
|
||||
s3c24xx_init_intc(NULL, &init_s3c2412subint[0], main_intc, 0x4a000018);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2416
|
||||
static struct s3c_irq_data init_s3c2416base[32] = {
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT0 */
|
||||
@ -729,6 +829,154 @@ void __init s3c2416_init_irq(void)
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2440
|
||||
static struct s3c_irq_data init_s3c2440base[32] = {
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT0 */
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT1 */
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT2 */
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT3 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* CAM */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TICK */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* WDT/AC97 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* LCD */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* SDI */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* NFCON */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* USBD */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* USBH */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* IIC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* RTC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */
|
||||
};
|
||||
|
||||
static struct s3c_irq_data init_s3c2440subint[32] = {
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */
|
||||
{ .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */
|
||||
{ .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* TC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* ADC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* WDT */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 9 }, /* AC97 */
|
||||
};
|
||||
|
||||
void __init s3c2440_init_irq(void)
|
||||
{
|
||||
struct s3c_irq_intc *main_intc;
|
||||
|
||||
pr_info("S3C2440: IRQ Support\n");
|
||||
|
||||
#ifdef CONFIG_FIQ
|
||||
init_FIQ(FIQ_START);
|
||||
#endif
|
||||
|
||||
main_intc = s3c24xx_init_intc(NULL, &init_s3c2440base[0], NULL, 0x4a000000);
|
||||
if (IS_ERR(main_intc)) {
|
||||
pr_err("irq: could not create main interrupt controller\n");
|
||||
return;
|
||||
}
|
||||
|
||||
s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4);
|
||||
s3c24xx_init_intc(NULL, &init_s3c2440subint[0], main_intc, 0x4a000018);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2442
|
||||
static struct s3c_irq_data init_s3c2442base[32] = {
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT0 */
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT1 */
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT2 */
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT3 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT4to7 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* EINT8to23 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* CAM */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* nBATT_FLT */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TICK */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* WDT */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER0 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER1 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER2 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER3 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* TIMER4 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* UART2 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* LCD */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA0 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA1 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA2 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* DMA3 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* SDI */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* SPI0 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* UART1 */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* NFCON */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* USBD */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* USBH */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* IIC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* UART0 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* SPI1 */
|
||||
{ .type = S3C_IRQTYPE_EDGE, }, /* RTC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, }, /* ADCPARENT */
|
||||
};
|
||||
|
||||
static struct s3c_irq_data init_s3c2442subint[32] = {
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-RX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-TX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 28 }, /* UART0-ERR */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-RX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-TX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 23 }, /* UART1-ERR */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-RX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-TX */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 15 }, /* UART2-ERR */
|
||||
{ .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* TC */
|
||||
{ .type = S3C_IRQTYPE_EDGE, .parent_irq = 31 }, /* ADC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* TC */
|
||||
{ .type = S3C_IRQTYPE_LEVEL, .parent_irq = 6 }, /* ADC */
|
||||
};
|
||||
|
||||
void __init s3c2442_init_irq(void)
|
||||
{
|
||||
struct s3c_irq_intc *main_intc;
|
||||
|
||||
pr_info("S3C2442: IRQ Support\n");
|
||||
|
||||
#ifdef CONFIG_FIQ
|
||||
init_FIQ(FIQ_START);
|
||||
#endif
|
||||
|
||||
main_intc = s3c24xx_init_intc(NULL, &init_s3c2442base[0], NULL, 0x4a000000);
|
||||
if (IS_ERR(main_intc)) {
|
||||
pr_err("irq: could not create main interrupt controller\n");
|
||||
return;
|
||||
}
|
||||
|
||||
s3c24xx_init_intc(NULL, &init_eint[0], main_intc, 0x560000a4);
|
||||
s3c24xx_init_intc(NULL, &init_s3c2442subint[0], main_intc, 0x4a000018);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_CPU_S3C2443
|
||||
static struct s3c_irq_data init_s3c2443base[32] = {
|
||||
{ .type = S3C_IRQTYPE_EINT, }, /* EINT0 */
|
||||
|
@ -445,7 +445,7 @@ MACHINE_START(ANUBIS, "Simtec-Anubis")
|
||||
.atag_offset = 0x100,
|
||||
.map_io = anubis_map_io,
|
||||
.init_machine = anubis_init,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2440_init_irq,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
@ -211,7 +211,7 @@ MACHINE_START(AT2440EVB, "AT2440EVB")
|
||||
.atag_offset = 0x100,
|
||||
.map_io = at2440evb_map_io,
|
||||
.init_machine = at2440evb_init,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2440_init_irq,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
@ -589,7 +589,7 @@ MACHINE_START(NEO1973_GTA02, "GTA02")
|
||||
/* Maintainer: Nelson Castillo <arhuaco@freaks-unidos.net> */
|
||||
.atag_offset = 0x100,
|
||||
.map_io = gta02_map_io,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2442_init_irq,
|
||||
.init_machine = gta02_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c244x_restart,
|
||||
|
@ -660,7 +660,7 @@ MACHINE_START(JIVE, "JIVE")
|
||||
/* Maintainer: Ben Dooks <ben-linux@fluff.org> */
|
||||
.atag_offset = 0x100,
|
||||
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2412_init_irq,
|
||||
.map_io = jive_map_io,
|
||||
.init_machine = jive_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
|
@ -688,7 +688,7 @@ MACHINE_START(MINI2440, "MINI2440")
|
||||
.atag_offset = 0x100,
|
||||
.map_io = mini2440_map_io,
|
||||
.init_machine = mini2440_init,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2440_init_irq,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
@ -152,7 +152,7 @@ MACHINE_START(NEXCODER_2440, "NexVision - Nexcoder 2440")
|
||||
.atag_offset = 0x100,
|
||||
.map_io = nexcoder_map_io,
|
||||
.init_machine = nexcoder_init,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2440_init_irq,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c244x_restart,
|
||||
MACHINE_END
|
||||
|
@ -426,7 +426,7 @@ MACHINE_START(OSIRIS, "Simtec-OSIRIS")
|
||||
/* Maintainer: Ben Dooks <ben@simtec.co.uk> */
|
||||
.atag_offset = 0x100,
|
||||
.map_io = osiris_map_io,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2440_init_irq,
|
||||
.init_machine = osiris_init,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c244x_restart,
|
||||
|
@ -813,7 +813,7 @@ MACHINE_START(RX1950, "HP iPAQ RX1950")
|
||||
.atag_offset = 0x100,
|
||||
.map_io = rx1950_map_io,
|
||||
.reserve = rx1950_reserve,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2442_init_irq,
|
||||
.init_machine = rx1950_init_machine,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c244x_restart,
|
||||
|
@ -190,11 +190,6 @@ static void __init rx3715_reserve(void)
|
||||
memblock_reserve(0x30081000, 0x1000);
|
||||
}
|
||||
|
||||
static void __init rx3715_init_irq(void)
|
||||
{
|
||||
s3c24xx_init_irq();
|
||||
}
|
||||
|
||||
static void __init rx3715_init_machine(void)
|
||||
{
|
||||
#ifdef CONFIG_PM_H1940
|
||||
@ -212,7 +207,7 @@ MACHINE_START(RX3715, "IPAQ-RX3715")
|
||||
.atag_offset = 0x100,
|
||||
.map_io = rx3715_map_io,
|
||||
.reserve = rx3715_reserve,
|
||||
.init_irq = rx3715_init_irq,
|
||||
.init_irq = s3c2440_init_irq,
|
||||
.init_machine = rx3715_init_machine,
|
||||
.init_time = samsung_timer_init,
|
||||
.restart = s3c244x_restart,
|
||||
|
@ -130,7 +130,7 @@ MACHINE_START(S3C2413, "S3C2413")
|
||||
.atag_offset = 0x100,
|
||||
|
||||
.fixup = smdk2413_fixup,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2412_init_irq,
|
||||
.map_io = smdk2413_map_io,
|
||||
.init_machine = smdk2413_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
@ -142,7 +142,7 @@ MACHINE_START(SMDK2412, "SMDK2412")
|
||||
.atag_offset = 0x100,
|
||||
|
||||
.fixup = smdk2413_fixup,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2412_init_irq,
|
||||
.map_io = smdk2413_map_io,
|
||||
.init_machine = smdk2413_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
@ -154,7 +154,7 @@ MACHINE_START(SMDK2413, "SMDK2413")
|
||||
.atag_offset = 0x100,
|
||||
|
||||
.fixup = smdk2413_fixup,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2412_init_irq,
|
||||
.map_io = smdk2413_map_io,
|
||||
.init_machine = smdk2413_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
|
@ -177,7 +177,7 @@ MACHINE_START(S3C2440, "SMDK2440")
|
||||
/* Maintainer: Ben Dooks <ben-linux@fluff.org> */
|
||||
.atag_offset = 0x100,
|
||||
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2440_init_irq,
|
||||
.map_io = smdk2440_map_io,
|
||||
.init_machine = smdk2440_machine_init,
|
||||
.init_time = samsung_timer_init,
|
||||
|
@ -158,7 +158,7 @@ MACHINE_START(VSTMS, "VSTMS")
|
||||
.atag_offset = 0x100,
|
||||
|
||||
.fixup = vstms_fixup,
|
||||
.init_irq = s3c24xx_init_irq,
|
||||
.init_irq = s3c2412_init_irq,
|
||||
.init_machine = vstms_init,
|
||||
.map_io = vstms_map_io,
|
||||
.init_time = samsung_timer_init,
|
||||
|
@ -29,6 +29,7 @@
|
||||
|
||||
#include <plat/cpu.h>
|
||||
#include <plat/pm.h>
|
||||
#include <plat/wakeup-mask.h>
|
||||
|
||||
#include "regs-dsc.h"
|
||||
#include "s3c2412-power.h"
|
||||
@ -51,8 +52,15 @@ static int s3c2412_cpu_suspend(unsigned long arg)
|
||||
return 1; /* Aborting suspend */
|
||||
}
|
||||
|
||||
/* mapping of interrupts to parts of the wakeup mask */
|
||||
static struct samsung_wakeup_mask wake_irqs[] = {
|
||||
{ .irq = IRQ_RTC, .bit = S3C2412_PWRCFG_RTC_MASKIRQ, },
|
||||
};
|
||||
|
||||
static void s3c2412_pm_prepare(void)
|
||||
{
|
||||
samsung_sync_wakemask(S3C2412_PWRCFG,
|
||||
wake_irqs, ARRAY_SIZE(wake_irqs));
|
||||
}
|
||||
|
||||
static int s3c2412_pm_add(struct device *dev, struct subsys_interface *sif)
|
||||
|
@ -23,6 +23,9 @@ extern unsigned long samsung_cpu_id;
|
||||
#define S3C24XX_CPU_ID 0x32400000
|
||||
#define S3C24XX_CPU_MASK 0xFFF00000
|
||||
|
||||
#define S3C2412_CPU_ID 0x32412000
|
||||
#define S3C2412_CPU_MASK 0xFFFFF000
|
||||
|
||||
#define S3C6400_CPU_ID 0x36400000
|
||||
#define S3C6410_CPU_ID 0x36410000
|
||||
#define S3C64XX_CPU_MASK 0xFFFFF000
|
||||
@ -53,6 +56,7 @@ static inline int is_samsung_##name(void) \
|
||||
}
|
||||
|
||||
IS_SAMSUNG_CPU(s3c24xx, S3C24XX_CPU_ID, S3C24XX_CPU_MASK)
|
||||
IS_SAMSUNG_CPU(s3c2412, S3C2412_CPU_ID, S3C2412_CPU_MASK)
|
||||
IS_SAMSUNG_CPU(s3c6400, S3C6400_CPU_ID, S3C64XX_CPU_MASK)
|
||||
IS_SAMSUNG_CPU(s3c6410, S3C6410_CPU_ID, S3C64XX_CPU_MASK)
|
||||
IS_SAMSUNG_CPU(s5p6440, S5P6440_CPU_ID, S5P64XX_CPU_MASK)
|
||||
@ -74,6 +78,12 @@ IS_SAMSUNG_CPU(exynos5440, EXYNOS5440_SOC_ID, EXYNOS5_SOC_MASK)
|
||||
# define soc_is_s3c24xx() 0
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_S3C2412)
|
||||
# define soc_is_s3c2412() is_samsung_s3c2412()
|
||||
#else
|
||||
# define soc_is_s3c2412() 0
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_CPU_S3C6400) || defined(CONFIG_CPU_S3C6410)
|
||||
# define soc_is_s3c64xx() (is_samsung_s3c6400() || is_samsung_s3c6410())
|
||||
#else
|
||||
|
@ -1122,8 +1122,12 @@ int samsung_gpiolib_to_irq(struct gpio_chip *chip, unsigned int offset)
|
||||
#ifdef CONFIG_PLAT_S3C24XX
|
||||
static int s3c24xx_gpiolib_fbank_to_irq(struct gpio_chip *chip, unsigned offset)
|
||||
{
|
||||
if (offset < 4)
|
||||
return IRQ_EINT0 + offset;
|
||||
if (offset < 4) {
|
||||
if (soc_is_s3c2412())
|
||||
return IRQ_EINT0_2412 + offset;
|
||||
else
|
||||
return IRQ_EINT0 + offset;
|
||||
}
|
||||
|
||||
if (offset < 8)
|
||||
return IRQ_EINT4 + offset - 4;
|
||||
|
Loading…
Reference in New Issue
Block a user