CINXE.COM

LKML: Paul Mundt: [PATCH 4/8] sh: IRQ handler updates.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>LKML: Paul Mundt: [PATCH 4/8] sh: IRQ handler updates.</title><link href="/css/message.css" rel="stylesheet" type="text/css" /><link href="/css/wrap.css" rel="alternate stylesheet" type="text/css" title="wrap" /><link href="/css/nowrap.css" rel="stylesheet" type="text/css" title="nowrap" /><link href="/favicon.ico" rel="shortcut icon" /><script src="/js/simple-calendar.js" type="text/javascript"></script><script src="/js/styleswitcher.js" type="text/javascript"></script><link rel="alternate" type="application/rss+xml" title="lkml.org : last 100 messages" href="/rss.php" /><link rel="alternate" type="application/rss+xml" title="lkml.org : last messages by Paul Mundt" href="/groupie.php?aid=3145" /><!--Matomo--><script> var _paq = window._paq = window._paq || []; /* tracker methods like "setCustomDimension" should be called before "trackPageView" */ _paq.push(["setDoNotTrack", true]); _paq.push(["disableCookies"]); _paq.push(['trackPageView']); _paq.push(['enableLinkTracking']); (function() { var u="//m.lkml.org/"; _paq.push(['setTrackerUrl', u+'matomo.php']); _paq.push(['setSiteId', '1']); var d=document, g=d.createElement('script'), s=d.getElementsByTagName('script')[0]; g.async=true; g.src=u+'matomo.js'; s.parentNode.insertBefore(g,s); })(); </script><!--End Matomo Code--></head><body onload="es.jasper.simpleCalendar.init();" itemscope="itemscope" itemtype="http://schema.org/BlogPosting"><table border="0" cellpadding="0" cellspacing="0"><tr><td width="180" align="center"><a href="/"><img style="border:0;width:135px;height:32px" src="/images/toprowlk.gif" alt="lkml.org" /></a></td><td width="32">聽</td><td class="nb"><div><a class="nb" href="/lkml"> [lkml]</a> 聽 <a class="nb" href="/lkml/2006"> [2006]</a> 聽 <a class="nb" href="/lkml/2006/1"> [Jan]</a> 聽 <a class="nb" href="/lkml/2006/1/14"> [14]</a> 聽 <a class="nb" href="/lkml/last100"> [last100]</a> 聽 <a href="/rss.php"><img src="/images/rss-or.gif" border="0" alt="RSS Feed" /></a></div><div>Views: <a href="#" class="nowrap" onclick="setActiveStyleSheet('wrap');return false;">[wrap]</a><a href="#" class="wrap" onclick="setActiveStyleSheet('nowrap');return false;">[no wrap]</a> 聽 <a class="nb" href="/lkml/mheaders/2006/1/14/269" onclick="this.href='/lkml/headers'+'/2006/1/14/269';">[headers]</a>聽 <a href="/lkml/bounce/2006/1/14/269">[forward]</a>聽 </div></td><td width="32">聽</td></tr><tr><td valign="top"><div class="es-jasper-simpleCalendar" baseurl="/lkml/"></div><div class="threadlist">Messages in this thread</div><ul class="threadlist"><li class="root"><a href="/lkml/2006/1/14/264">First message in thread</a></li><li><a href="/lkml/2006/1/14/264">Paul Mundt</a><ul><li><a href="/lkml/2006/1/14/265">Paul Mundt</a></li><li><a href="/lkml/2006/1/14/267">Paul Mundt</a></li><li><a href="/lkml/2006/1/14/268">Paul Mundt</a></li><li class="origin"><a href="">Paul Mundt</a></li><li><a href="/lkml/2006/1/14/271">Paul Mundt</a></li><li><a href="/lkml/2006/1/14/272">Paul Mundt</a></li><li><a href="/lkml/2006/1/14/273">Paul Mundt</a></li><li><a href="/lkml/2006/1/14/274">Paul Mundt</a></li></ul></li></ul><div class="threadlist">Patches in this message</div><ul class="threadlist"><li><a href="/lkml/diff/2006/1/14/269/1">Get diff 1</a></li><li><a href="/lkml/diff/2006/1/14/269/2">Get diff 2</a></li><li><a href="/lkml/diff/2006/1/14/269/3">Get diff 3</a></li><li><a href="/lkml/diff/2006/1/14/269/4">Get diff 4</a></li><li><a href="/lkml/diff/2006/1/14/269/5">Get diff 5</a></li></ul></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerl.gif" width="32" height="32" alt="/" /></td><td class="c" rowspan="2" valign="top" style="padding-top: 1em"><table><tr><td><table><tr><td class="lp">Date</td><td class="rp" itemprop="datePublished">Sun, 15 Jan 2006 00:53:29 +0200</td></tr><tr><td class="lp">From</td><td class="rp" itemprop="author">Paul Mundt &lt;&gt;</td></tr><tr><td class="lp">Subject</td><td class="rp" itemprop="name">[PATCH 4/8] sh: IRQ handler updates.</td></tr></table></td><td></td></tr></table><pre itemprop="articleBody">This moves the various IRQ controller drivers into a new subdirectory,<br />and also extends the INTC2 IRQ handler to also deal with SH7760 and<br />SH7780 interrupts, rather than just ST-40.<br /><br />The old CONFIG_SH_GENERIC has also been removed from the IRQ definitions,<br />as new ports are expected to be based off of CONFIG_SH_UNKNOWN. Since<br />there are plenty of incompatible machvecs, CONFIG_SH_GENERIC doesn't make<br />sense anymore.<br /><br />Signed-off-by: Paul Mundt &lt;lethal&#64;linux-sh.org&gt;<br /><br />---<br /><br /> arch/sh/kernel/cpu/Makefile | 9 <br /> arch/sh/kernel/cpu/irq/Makefile | 7 <br /> arch/sh/kernel/cpu/irq/imask.c | 110 +++++++++++<br /> arch/sh/kernel/cpu/irq/intc2.c | 284 ++++++++++++++++++++++++++++++<br /> arch/sh/kernel/cpu/irq/ipr.c | 206 +++++++++++++++++++++<br /> arch/sh/kernel/cpu/irq/pint.c | 169 +++++++++++++++++<br /> arch/sh/kernel/cpu/irq_imask.c | 116 ------------<br /> arch/sh/kernel/cpu/irq_ipr.c | 339 -----------------------------------<br /> arch/sh/kernel/cpu/sh4/irq_intc2.c | 222 -----------------------<br /> arch/sh/kernel/irq.c | 64 ++----<br /> include/asm-sh/irq-sh73180.h | 16 -<br /> include/asm-sh/irq-sh7780.h | 349 +++++++++++++++++++++++++++++++++++++<br /> include/asm-sh/irq.h | 143 ++++++++-------<br /> 13 files changed, 1240 insertions(+), 794 deletions(-)<br /><br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/cpu/Makefile sh-2.6.15/arch/sh/kernel/cpu/Makefile<br />--- linux-2.6.15/arch/sh/kernel/cpu/Makefile 2004-08-14 20:27:37.000000000 +0300<br />+++ sh-2.6.15/arch/sh/kernel/cpu/Makefile 2006-01-07 22:13:59.118151154 +0200<br />&#64;&#64; -2,15 +2,12 &#64;&#64;<br /> # Makefile for the Linux/SuperH CPU-specifc backends.<br /> #<br /> <br />-obj-y := irq_ipr.o irq_imask.o init.o bus.o<br />+obj-y += irq/ init.o bus.o clock.o<br /> <br /> obj-$(CONFIG_CPU_SH2) += sh2/<br /> obj-$(CONFIG_CPU_SH3) += sh3/<br /> obj-$(CONFIG_CPU_SH4) += sh4/<br /> <br />-obj-$(CONFIG_SH_RTC) += rtc.o<br />+obj-$(CONFIG_SH_RTC) += rtc.o<br /> obj-$(CONFIG_UBC_WAKEUP) += ubc.o<br />-obj-$(CONFIG_SH_ADC) += adc.o<br />-<br />-USE_STANDARD_AS_RULE := true<br />-<br />+obj-$(CONFIG_SH_ADC) += adc.o<br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/cpu/irq/Makefile sh-2.6.15/arch/sh/kernel/cpu/irq/Makefile<br />--- linux-2.6.15/arch/sh/kernel/cpu/irq/Makefile 1970-01-01 02:00:00.000000000 +0200<br />+++ sh-2.6.15/arch/sh/kernel/cpu/irq/Makefile 2006-01-07 22:13:59.123150761 +0200<br />&#64;&#64; -0,0 +1,7 &#64;&#64;<br />+#<br />+# Makefile for the Linux/SuperH CPU-specifc IRQ handlers.<br />+#<br />+obj-y += ipr.o imask.o<br />+<br />+obj-$(CONFIG_CPU_HAS_PINT_IRQ) += pint.o<br />+obj-$(CONFIG_CPU_HAS_INTC2_IRQ) += intc2.o<br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/cpu/irq/imask.c sh-2.6.15/arch/sh/kernel/cpu/irq/imask.c<br />--- linux-2.6.15/arch/sh/kernel/cpu/irq/imask.c 1970-01-01 02:00:00.000000000 +0200<br />+++ sh-2.6.15/arch/sh/kernel/cpu/irq/imask.c 2006-01-07 22:13:59.127150447 +0200<br />&#64;&#64; -0,0 +1,110 &#64;&#64;<br />+/*<br />+ * arch/sh/kernel/cpu/irq/imask.c<br />+ *<br />+ * Copyright (C) 1999, 2000 Niibe Yutaka<br />+ *<br />+ * Simple interrupt handling using IMASK of SR register.<br />+ *<br />+ */<br />+/* NOTE: Will not work on level 15 */<br />+#include &lt;linux/ptrace.h&gt;<br />+#include &lt;linux/errno.h&gt;<br />+#include &lt;linux/kernel_stat.h&gt;<br />+#include &lt;linux/signal.h&gt;<br />+#include &lt;linux/sched.h&gt;<br />+#include &lt;linux/interrupt.h&gt;<br />+#include &lt;linux/init.h&gt;<br />+#include &lt;linux/bitops.h&gt;<br />+#include &lt;linux/spinlock.h&gt;<br />+#include &lt;linux/cache.h&gt;<br />+#include &lt;linux/irq.h&gt;<br />+#include &lt;asm/system.h&gt;<br />+#include &lt;asm/irq.h&gt;<br />+<br />+/* Bitmap of IRQ masked */<br />+static unsigned long imask_mask = 0x7fff;<br />+static int interrupt_priority = 0;<br />+<br />+static void enable_imask_irq(unsigned int irq);<br />+static void disable_imask_irq(unsigned int irq);<br />+static void shutdown_imask_irq(unsigned int irq);<br />+static void mask_and_ack_imask(unsigned int);<br />+static void end_imask_irq(unsigned int irq);<br />+<br />+#define IMASK_PRIORITY 15<br />+<br />+static unsigned int startup_imask_irq(unsigned int irq)<br />+{<br />+ /* Nothing to do */<br />+ return 0; /* never anything pending */<br />+}<br />+<br />+static struct hw_interrupt_type imask_irq_type = {<br />+ .typename = "SR.IMASK",<br />+ .startup = startup_imask_irq,<br />+ .shutdown = shutdown_imask_irq,<br />+ .enable = enable_imask_irq,<br />+ .disable = disable_imask_irq,<br />+ .ack = mask_and_ack_imask,<br />+ .end = end_imask_irq<br />+};<br />+<br />+void static inline set_interrupt_registers(int ip)<br />+{<br />+ unsigned long __dummy;<br />+<br />+ asm volatile("ldc %2, r6_bank\n\t"<br />+ "stc sr, %0\n\t"<br />+ "and #0xf0, %0\n\t"<br />+ "shlr2 %0\n\t"<br />+ "cmp/eq #0x3c, %0\n\t"<br />+ "bt/s 1f ! CLI-ed\n\t"<br />+ " stc sr, %0\n\t"<br />+ "and %1, %0\n\t"<br />+ "or %2, %0\n\t"<br />+ "ldc %0, sr\n"<br />+ "1:"<br />+ : "=&amp;z" (__dummy)<br />+ : "r" (~0xf0), "r" (ip &lt;&lt; 4)<br />+ : "t");<br />+}<br />+<br />+static void disable_imask_irq(unsigned int irq)<br />+{<br />+ clear_bit(irq, &amp;imask_mask);<br />+ if (interrupt_priority &lt; IMASK_PRIORITY - irq)<br />+ interrupt_priority = IMASK_PRIORITY - irq;<br />+<br />+ set_interrupt_registers(interrupt_priority);<br />+}<br />+<br />+static void enable_imask_irq(unsigned int irq)<br />+{<br />+ set_bit(irq, &amp;imask_mask);<br />+ interrupt_priority = IMASK_PRIORITY - ffz(imask_mask);<br />+<br />+ set_interrupt_registers(interrupt_priority);<br />+}<br />+<br />+static void mask_and_ack_imask(unsigned int irq)<br />+{<br />+ disable_imask_irq(irq);<br />+}<br />+<br />+static void end_imask_irq(unsigned int irq)<br />+{<br />+ if (!(irq_desc[irq].status &amp; (IRQ_DISABLED|IRQ_INPROGRESS)))<br />+ enable_imask_irq(irq);<br />+}<br />+<br />+static void shutdown_imask_irq(unsigned int irq)<br />+{<br />+ /* Nothing to do */<br />+}<br />+<br />+void make_imask_irq(unsigned int irq)<br />+{<br />+ disable_irq_nosync(irq);<br />+ irq_desc[irq].handler = &amp;imask_irq_type;<br />+ enable_irq(irq);<br />+}<br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/cpu/irq/intc2.c sh-2.6.15/arch/sh/kernel/cpu/irq/intc2.c<br />--- linux-2.6.15/arch/sh/kernel/cpu/irq/intc2.c 1970-01-01 02:00:00.000000000 +0200<br />+++ sh-2.6.15/arch/sh/kernel/cpu/irq/intc2.c 2006-01-07 22:13:59.133149975 +0200<br />&#64;&#64; -0,0 +1,284 &#64;&#64;<br />+/*<br />+ * Interrupt handling for INTC2-based IRQ.<br />+ *<br />+ * Copyright (C) 2001 David J. Mckay (david.mckay&#64;st.com)<br />+ * Copyright (C) 2005, 2006 Paul Mundt (lethal&#64;linux-sh.org)<br />+ *<br />+ * May be copied or modified under the terms of the GNU General Public<br />+ * License. See linux/COPYING for more information.<br />+ *<br />+ * These are the "new Hitachi style" interrupts, as present on the<br />+ * Hitachi 7751, the STM ST40 STB1, SH7760, and SH7780.<br />+ */<br />+<br />+#include &lt;linux/kernel.h&gt;<br />+#include &lt;linux/init.h&gt;<br />+#include &lt;linux/irq.h&gt;<br />+#include &lt;asm/system.h&gt;<br />+#include &lt;asm/io.h&gt;<br />+#include &lt;asm/machvec.h&gt;<br />+<br />+struct intc2_data {<br />+ unsigned char msk_offset;<br />+ unsigned char msk_shift;<br />+<br />+ int (*clear_irq) (int);<br />+};<br />+<br />+static struct intc2_data intc2_data[NR_INTC2_IRQS];<br />+<br />+static void enable_intc2_irq(unsigned int irq);<br />+static void disable_intc2_irq(unsigned int irq);<br />+<br />+/* shutdown is same as "disable" */<br />+#define shutdown_intc2_irq disable_intc2_irq<br />+<br />+static void mask_and_ack_intc2(unsigned int);<br />+static void end_intc2_irq(unsigned int irq);<br />+<br />+static unsigned int startup_intc2_irq(unsigned int irq)<br />+{<br />+ enable_intc2_irq(irq);<br />+ return 0; /* never anything pending */<br />+}<br />+<br />+static struct hw_interrupt_type intc2_irq_type = {<br />+ .typename = "INTC2-IRQ",<br />+ .startup = startup_intc2_irq,<br />+ .shutdown = shutdown_intc2_irq,<br />+ .enable = enable_intc2_irq,<br />+ .disable = disable_intc2_irq,<br />+ .ack = mask_and_ack_intc2,<br />+ .end = end_intc2_irq<br />+};<br />+<br />+static void disable_intc2_irq(unsigned int irq)<br />+{<br />+ int irq_offset = irq - INTC2_FIRST_IRQ;<br />+ int msk_shift, msk_offset;<br />+<br />+ /* Sanity check */<br />+ if (unlikely(irq_offset &lt; 0 || irq_offset &gt;= NR_INTC2_IRQS))<br />+ return;<br />+<br />+ msk_shift = intc2_data[irq_offset].msk_shift;<br />+ msk_offset = intc2_data[irq_offset].msk_offset;<br />+<br />+ ctrl_outl(1 &lt;&lt; msk_shift,<br />+ INTC2_BASE + INTC2_INTMSK_OFFSET + msk_offset);<br />+}<br />+<br />+static void enable_intc2_irq(unsigned int irq)<br />+{<br />+ int irq_offset = irq - INTC2_FIRST_IRQ;<br />+ int msk_shift, msk_offset;<br />+<br />+ /* Sanity check */<br />+ if (unlikely(irq_offset &lt; 0 || irq_offset &gt;= NR_INTC2_IRQS))<br />+ return;<br />+<br />+ msk_shift = intc2_data[irq_offset].msk_shift;<br />+ msk_offset = intc2_data[irq_offset].msk_offset;<br />+<br />+ ctrl_outl(1 &lt;&lt; msk_shift,<br />+ INTC2_BASE + INTC2_INTMSKCLR_OFFSET + msk_offset);<br />+}<br />+<br />+static void mask_and_ack_intc2(unsigned int irq)<br />+{<br />+ disable_intc2_irq(irq);<br />+}<br />+<br />+static void end_intc2_irq(unsigned int irq)<br />+{<br />+ if (!(irq_desc[irq].status &amp; (IRQ_DISABLED|IRQ_INPROGRESS)))<br />+ enable_intc2_irq(irq);<br />+<br />+ if (unlikely(intc2_data[irq - INTC2_FIRST_IRQ].clear_irq))<br />+ intc2_data[irq - INTC2_FIRST_IRQ].clear_irq(irq);<br />+}<br />+<br />+/*<br />+ * Setup an INTC2 style interrupt.<br />+ * NOTE: Unlike IPR interrupts, parameters are not shifted by this code,<br />+ * allowing the use of the numbers straight out of the datasheet.<br />+ * For example:<br />+ * PIO1 which is INTPRI00[19,16] and INTMSK00[13]<br />+ * would be: ^ ^ ^ ^<br />+ * | | | |<br />+ * make_intc2_irq(84, 0, 16, 0, 13);<br />+ */<br />+void make_intc2_irq(unsigned int irq,<br />+ unsigned int ipr_offset, unsigned int ipr_shift,<br />+ unsigned int msk_offset, unsigned int msk_shift,<br />+ unsigned int priority)<br />+{<br />+ int irq_offset = irq - INTC2_FIRST_IRQ;<br />+ unsigned int flags;<br />+ unsigned long ipr;<br />+<br />+ if (unlikely(irq_offset &lt; 0 || irq_offset &gt;= NR_INTC2_IRQS))<br />+ return;<br />+<br />+ disable_irq_nosync(irq);<br />+<br />+ /* Fill the data we need */<br />+ intc2_data[irq_offset].msk_offset = msk_offset;<br />+ intc2_data[irq_offset].msk_shift = msk_shift;<br />+ intc2_data[irq_offset].clear_irq = NULL;<br />+<br />+ /* Set the priority level */<br />+ local_irq_save(flags);<br />+<br />+ ipr = ctrl_inl(INTC2_BASE + INTC2_INTPRI_OFFSET + ipr_offset);<br />+ ipr &amp;= ~(0xf &lt;&lt; ipr_shift);<br />+ ipr |= priority &lt;&lt; ipr_shift;<br />+ ctrl_outl(ipr, INTC2_BASE + INTC2_INTPRI_OFFSET + ipr_offset);<br />+<br />+ local_irq_restore(flags);<br />+<br />+ irq_desc[irq].handler = &amp;intc2_irq_type;<br />+<br />+ disable_intc2_irq(irq);<br />+}<br />+<br />+static struct intc2_init {<br />+ unsigned short irq;<br />+ unsigned char ipr_offset, ipr_shift;<br />+ unsigned char msk_offset, msk_shift;<br />+ unsigned char priority;<br />+} intc2_init_data[] __initdata = {<br />+#if defined(CONFIG_CPU_SUBTYPE_ST40)<br />+ {64, 0, 0, 0, 0, 13}, /* PCI serr */<br />+ {65, 0, 4, 0, 1, 13}, /* PCI err */<br />+ {66, 0, 4, 0, 2, 13}, /* PCI ad */<br />+ {67, 0, 4, 0, 3, 13}, /* PCI pwd down */<br />+ {72, 0, 8, 0, 5, 13}, /* DMAC INT0 */<br />+ {73, 0, 8, 0, 6, 13}, /* DMAC INT1 */<br />+ {74, 0, 8, 0, 7, 13}, /* DMAC INT2 */<br />+ {75, 0, 8, 0, 8, 13}, /* DMAC INT3 */<br />+ {76, 0, 8, 0, 9, 13}, /* DMAC INT4 */<br />+ {78, 0, 8, 0, 11, 13}, /* DMAC ERR */<br />+ {80, 0, 12, 0, 12, 13}, /* PIO0 */<br />+ {84, 0, 16, 0, 13, 13}, /* PIO1 */<br />+ {88, 0, 20, 0, 14, 13}, /* PIO2 */<br />+ {112, 4, 0, 4, 0, 13}, /* Mailbox */<br />+ #ifdef CONFIG_CPU_SUBTYPE_ST40GX1<br />+ {116, 4, 4, 4, 4, 13}, /* SSC0 */<br />+ {120, 4, 8, 4, 8, 13}, /* IR Blaster */<br />+ {124, 4, 12, 4, 12, 13}, /* USB host */<br />+ {128, 4, 16, 4, 16, 13}, /* Video processor BLITTER */<br />+ {132, 4, 20, 4, 20, 13}, /* UART0 */<br />+ {134, 4, 20, 4, 22, 13}, /* UART2 */<br />+ {136, 4, 24, 4, 24, 13}, /* IO_PIO0 */<br />+ {140, 4, 28, 4, 28, 13}, /* EMPI */<br />+ {144, 8, 0, 8, 0, 13}, /* MAFE */<br />+ {148, 8, 4, 8, 4, 13}, /* PWM */<br />+ {152, 8, 8, 8, 8, 13}, /* SSC1 */<br />+ {156, 8, 12, 8, 12, 13}, /* IO_PIO1 */<br />+ {160, 8, 16, 8, 16, 13}, /* USB target */<br />+ {164, 8, 20, 8, 20, 13}, /* UART1 */<br />+ {168, 8, 24, 8, 24, 13}, /* Teletext */<br />+ {172, 8, 28, 8, 28, 13}, /* VideoSync VTG */<br />+ {173, 8, 28, 8, 29, 13}, /* VideoSync DVP0 */<br />+ {174, 8, 28, 8, 30, 13}, /* VideoSync DVP1 */<br />+#endif<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7760)<br />+/*<br />+ * SH7760 INTC2-Style interrupts, vectors IRQ48-111 INTEVT 0x800-0xFE0<br />+ */<br />+ /* INTPRIO0 | INTMSK0 */<br />+ {48, 0, 28, 0, 31, 3}, /* IRQ 4 */<br />+ {49, 0, 24, 0, 30, 3}, /* IRQ 3 */<br />+ {50, 0, 20, 0, 29, 3}, /* IRQ 2 */<br />+ {51, 0, 16, 0, 28, 3}, /* IRQ 1 */<br />+ /* 52-55 (INTEVT 0x880-0x8E0) unused/reserved */<br />+ /* INTPRIO4 | INTMSK0 */<br />+ {56, 4, 28, 0, 25, 3}, /* HCAN2_CHAN0 */<br />+ {57, 4, 24, 0, 24, 3}, /* HCAN2_CHAN1 */<br />+ {58, 4, 20, 0, 23, 3}, /* I2S_CHAN0 */<br />+ {59, 4, 16, 0, 22, 3}, /* I2S_CHAN1 */<br />+ {60, 4, 12, 0, 21, 3}, /* AC97_CHAN0 */<br />+ {61, 4, 8, 0, 20, 3}, /* AC97_CHAN1 */<br />+ {62, 4, 4, 0, 19, 3}, /* I2C_CHAN0 */<br />+ {63, 4, 0, 0, 18, 3}, /* I2C_CHAN1 */<br />+ /* INTPRIO8 | INTMSK0 */<br />+ {52, 8, 16, 0, 11, 3}, /* SCIF0_ERI_IRQ */<br />+ {53, 8, 16, 0, 10, 3}, /* SCIF0_RXI_IRQ */<br />+ {54, 8, 16, 0, 9, 3}, /* SCIF0_BRI_IRQ */<br />+ {55, 8, 16, 0, 8, 3}, /* SCIF0_TXI_IRQ */<br />+ {64, 8, 28, 0, 17, 3}, /* USBHI_IRQ */<br />+ {65, 8, 24, 0, 16, 3}, /* LCDC */<br />+ /* 66, 67 unused */<br />+ {68, 8, 20, 0, 14, 13}, /* DMABRGI0_IRQ */<br />+ {69, 8, 20, 0, 13, 13}, /* DMABRGI1_IRQ */<br />+ {70, 8, 20, 0, 12, 13}, /* DMABRGI2_IRQ */<br />+ /* 71 unused */<br />+ {72, 8, 12, 0, 7, 3}, /* SCIF1_ERI_IRQ */<br />+ {73, 8, 12, 0, 6, 3}, /* SCIF1_RXI_IRQ */<br />+ {74, 8, 12, 0, 5, 3}, /* SCIF1_BRI_IRQ */<br />+ {75, 8, 12, 0, 4, 3}, /* SCIF1_TXI_IRQ */<br />+ {76, 8, 8, 0, 3, 3}, /* SCIF2_ERI_IRQ */<br />+ {77, 8, 8, 0, 2, 3}, /* SCIF2_RXI_IRQ */<br />+ {78, 8, 8, 0, 1, 3}, /* SCIF2_BRI_IRQ */<br />+ {79, 8, 8, 0, 0, 3}, /* SCIF2_TXI_IRQ */<br />+ /* | INTMSK4 */<br />+ {80, 8, 4, 4, 23, 3}, /* SIM_ERI */<br />+ {81, 8, 4, 4, 22, 3}, /* SIM_RXI */<br />+ {82, 8, 4, 4, 21, 3}, /* SIM_TXI */<br />+ {83, 8, 4, 4, 20, 3}, /* SIM_TEI */<br />+ {84, 8, 0, 4, 19, 3}, /* HSPII */<br />+ /* INTPRIOC | INTMSK4 */<br />+ /* 85-87 unused/reserved */<br />+ {88, 12, 20, 4, 18, 3}, /* MMCI0 */<br />+ {89, 12, 20, 4, 17, 3}, /* MMCI1 */<br />+ {90, 12, 20, 4, 16, 3}, /* MMCI2 */<br />+ {91, 12, 20, 4, 15, 3}, /* MMCI3 */<br />+ {92, 12, 12, 4, 6, 3}, /* MFI (unsure, bug? in my 7760 manual*/<br />+ /* 93-107 reserved/undocumented */<br />+ {108,12, 4, 4, 1, 3}, /* ADC */<br />+ {109,12, 0, 4, 0, 3}, /* CMTI */<br />+ /* 110-111 reserved/unused */<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7780)<br />+ { TIMER_IRQ, 0, 24, 0, INTC_TMU0_MSK, 2},<br />+#ifdef CONFIG_SH_RTC<br />+ { RTC_IRQ, 4, 0, 0, INTC_RTC_MSK, TIMER_PRIORITY },<br />+#endif<br />+ { SCIF0_ERI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY },<br />+ { SCIF0_RXI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY },<br />+ { SCIF0_BRI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY },<br />+ { SCIF0_TXI_IRQ, 8, 24, 0, INTC_SCIF0_MSK, SCIF0_PRIORITY },<br />+<br />+ { SCIF1_ERI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY },<br />+ { SCIF1_RXI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY },<br />+ { SCIF1_BRI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY },<br />+ { SCIF1_TXI_IRQ, 8, 16, 0, INTC_SCIF1_MSK, SCIF1_PRIORITY },<br />+<br />+ { PCIC0_IRQ, 0x10, 8, 0, INTC_PCIC0_MSK, PCIC0_PRIORITY },<br />+ { PCIC1_IRQ, 0x10, 0, 0, INTC_PCIC1_MSK, PCIC1_PRIORITY },<br />+ { PCIC2_IRQ, 0x14, 24, 0, INTC_PCIC2_MSK, PCIC2_PRIORITY },<br />+ { PCIC3_IRQ, 0x14, 16, 0, INTC_PCIC3_MSK, PCIC3_PRIORITY },<br />+ { PCIC4_IRQ, 0x14, 8, 0, INTC_PCIC4_MSK, PCIC4_PRIORITY },<br />+#endif<br />+};<br />+<br />+void __init init_IRQ_intc2(void)<br />+{<br />+ int i;<br />+<br />+ for (i = 0; i &lt; ARRAY_SIZE(intc2_init_data); i++) {<br />+ struct intc2_init *p = intc2_init_data + i;<br />+ make_intc2_irq(p-&gt;irq, p-&gt;ipr_offset, p-&gt;ipr_shift,<br />+ p-&gt; msk_offset, p-&gt;msk_shift, p-&gt;priority);<br />+ }<br />+}<br />+<br />+/* Adds a termination callback to the interrupt */<br />+void intc2_add_clear_irq(int irq, int (*fn)(int))<br />+{<br />+ if (unlikely(irq &lt; INTC2_FIRST_IRQ))<br />+ return;<br />+<br />+ intc2_data[irq - INTC2_FIRST_IRQ].clear_irq = fn;<br />+}<br />+<br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/cpu/irq/ipr.c sh-2.6.15/arch/sh/kernel/cpu/irq/ipr.c<br />--- linux-2.6.15/arch/sh/kernel/cpu/irq/ipr.c 1970-01-01 02:00:00.000000000 +0200<br />+++ sh-2.6.15/arch/sh/kernel/cpu/irq/ipr.c 2006-01-07 22:13:59.139149503 +0200<br />&#64;&#64; -0,0 +1,206 &#64;&#64;<br />+/*<br />+ * arch/sh/kernel/cpu/irq/ipr.c<br />+ *<br />+ * Copyright (C) 1999 Niibe Yutaka &amp; Takeshi Yaegashi<br />+ * Copyright (C) 2000 Kazumoto Kojima<br />+ * Copyright (C) 2003 Takashi Kusuda &lt;kusuda-takashi&#64;hitachi-ul.co.jp&gt;<br />+ *<br />+ * Interrupt handling for IPR-based IRQ.<br />+ *<br />+ * Supported system:<br />+ * On-chip supporting modules (TMU, RTC, etc.).<br />+ * On-chip supporting modules for SH7709/SH7709A/SH7729/SH7300.<br />+ * Hitachi SolutionEngine external I/O:<br />+ * MS7709SE01, MS7709ASE01, and MS7750SE01<br />+ *<br />+ */<br />+<br />+#include &lt;linux/config.h&gt;<br />+#include &lt;linux/init.h&gt;<br />+#include &lt;linux/irq.h&gt;<br />+#include &lt;linux/module.h&gt;<br />+<br />+#include &lt;asm/system.h&gt;<br />+#include &lt;asm/io.h&gt;<br />+#include &lt;asm/machvec.h&gt;<br />+<br />+struct ipr_data {<br />+ unsigned int addr; /* Address of Interrupt Priority Register */<br />+ int shift; /* Shifts of the 16-bit data */<br />+ int priority; /* The priority */<br />+};<br />+static struct ipr_data ipr_data[NR_IRQS];<br />+<br />+static void enable_ipr_irq(unsigned int irq);<br />+static void disable_ipr_irq(unsigned int irq);<br />+<br />+/* shutdown is same as "disable" */<br />+#define shutdown_ipr_irq disable_ipr_irq<br />+<br />+static void mask_and_ack_ipr(unsigned int);<br />+static void end_ipr_irq(unsigned int irq);<br />+<br />+static unsigned int startup_ipr_irq(unsigned int irq)<br />+{<br />+ enable_ipr_irq(irq);<br />+ return 0; /* never anything pending */<br />+}<br />+<br />+static struct hw_interrupt_type ipr_irq_type = {<br />+ .typename = "IPR-IRQ",<br />+ .startup = startup_ipr_irq,<br />+ .shutdown = shutdown_ipr_irq,<br />+ .enable = enable_ipr_irq,<br />+ .disable = disable_ipr_irq,<br />+ .ack = mask_and_ack_ipr,<br />+ .end = end_ipr_irq<br />+};<br />+<br />+static void disable_ipr_irq(unsigned int irq)<br />+{<br />+ unsigned long val, flags;<br />+ unsigned int addr = ipr_data[irq].addr;<br />+ unsigned short mask = 0xffff ^ (0x0f &lt;&lt; ipr_data[irq].shift);<br />+<br />+ /* Set the priority in IPR to 0 */<br />+ local_irq_save(flags);<br />+ val = ctrl_inw(addr);<br />+ val &amp;= mask;<br />+ ctrl_outw(val, addr);<br />+ local_irq_restore(flags);<br />+}<br />+<br />+static void enable_ipr_irq(unsigned int irq)<br />+{<br />+ unsigned long val, flags;<br />+ unsigned int addr = ipr_data[irq].addr;<br />+ int priority = ipr_data[irq].priority;<br />+ unsigned short value = (priority &lt;&lt; ipr_data[irq].shift);<br />+<br />+ /* Set priority in IPR back to original value */<br />+ local_irq_save(flags);<br />+ val = ctrl_inw(addr);<br />+ val |= value;<br />+ ctrl_outw(val, addr);<br />+ local_irq_restore(flags);<br />+}<br />+<br />+static void mask_and_ack_ipr(unsigned int irq)<br />+{<br />+ disable_ipr_irq(irq);<br />+<br />+#if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \<br />+ defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705)<br />+ /* This is needed when we use edge triggered setting */<br />+ /* XXX: Is it really needed? */<br />+ if (IRQ0_IRQ &lt;= irq &amp;&amp; irq &lt;= IRQ5_IRQ) {<br />+ /* Clear external interrupt request */<br />+ int a = ctrl_inb(INTC_IRR0);<br />+ a &amp;= ~(1 &lt;&lt; (irq - IRQ0_IRQ));<br />+ ctrl_outb(a, INTC_IRR0);<br />+ }<br />+#endif<br />+}<br />+<br />+static void end_ipr_irq(unsigned int irq)<br />+{<br />+ if (!(irq_desc[irq].status &amp; (IRQ_DISABLED|IRQ_INPROGRESS)))<br />+ enable_ipr_irq(irq);<br />+}<br />+<br />+void make_ipr_irq(unsigned int irq, unsigned int addr, int pos,<br />+ int priority, int maskpos)<br />+{<br />+ disable_irq_nosync(irq);<br />+ ipr_data[irq].addr = addr;<br />+ ipr_data[irq].shift = pos*4; /* POSition (0-3) x 4 means shift */<br />+ ipr_data[irq].priority = priority;<br />+<br />+ irq_desc[irq].handler = &amp;ipr_irq_type;<br />+ disable_ipr_irq(irq);<br />+}<br />+<br />+void __init init_IRQ(void)<br />+{<br />+#ifndef CONFIG_CPU_SUBTYPE_SH7780<br />+ make_ipr_irq(TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY, 0);<br />+ make_ipr_irq(TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY, 0);<br />+#if defined(CONFIG_SH_RTC)<br />+ make_ipr_irq(RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY, 0);<br />+#endif<br />+<br />+#ifdef SCI_ERI_IRQ<br />+ make_ipr_irq(SCI_ERI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY, 0);<br />+ make_ipr_irq(SCI_RXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY, 0);<br />+ make_ipr_irq(SCI_TXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY, 0);<br />+#endif<br />+<br />+#ifdef SCIF1_ERI_IRQ<br />+ make_ipr_irq(SCIF1_ERI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY, 0);<br />+ make_ipr_irq(SCIF1_RXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY, 0);<br />+ make_ipr_irq(SCIF1_BRI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY, 0);<br />+ make_ipr_irq(SCIF1_TXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY, 0);<br />+#endif<br />+<br />+#if defined(CONFIG_CPU_SUBTYPE_SH7300)<br />+ make_ipr_irq(SCIF0_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY, 0);<br />+ make_ipr_irq(DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY, 0);<br />+ make_ipr_irq(DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY, 0);<br />+ make_ipr_irq(VIO_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY, 0);<br />+#endif<br />+<br />+#ifdef SCIF_ERI_IRQ<br />+ make_ipr_irq(SCIF_ERI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY, 0);<br />+ make_ipr_irq(SCIF_RXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY, 0);<br />+ make_ipr_irq(SCIF_BRI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY, 0);<br />+ make_ipr_irq(SCIF_TXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY, 0);<br />+#endif<br />+<br />+#ifdef IRDA_ERI_IRQ<br />+ make_ipr_irq(IRDA_ERI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY, 0);<br />+ make_ipr_irq(IRDA_RXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY, 0);<br />+ make_ipr_irq(IRDA_BRI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY, 0);<br />+ make_ipr_irq(IRDA_TXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY, 0);<br />+#endif<br />+<br />+#if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \<br />+ defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705)<br />+ /*<br />+ * Initialize the Interrupt Controller (INTC)<br />+ * registers to their power on values<br />+ */<br />+<br />+ /*<br />+ * Enable external irq (INTC IRQ mode).<br />+ * You should set corresponding bits of PFC to "00"<br />+ * to enable these interrupts.<br />+ */<br />+ make_ipr_irq(IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, IRQ0_PRIORITY, 0);<br />+ make_ipr_irq(IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY, 0);<br />+ make_ipr_irq(IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY, 0);<br />+ make_ipr_irq(IRQ3_IRQ, IRQ3_IPR_ADDR, IRQ3_IPR_POS, IRQ3_PRIORITY, 0);<br />+ make_ipr_irq(IRQ4_IRQ, IRQ4_IPR_ADDR, IRQ4_IPR_POS, IRQ4_PRIORITY, 0);<br />+ make_ipr_irq(IRQ5_IRQ, IRQ5_IPR_ADDR, IRQ5_IPR_POS, IRQ5_PRIORITY, 0);<br />+#endif<br />+#endif<br />+<br />+#ifdef CONFIG_CPU_HAS_PINT_IRQ<br />+ init_IRQ_pint();<br />+#endif<br />+<br />+#ifdef CONFIG_CPU_HAS_INTC2_IRQ<br />+ init_IRQ_intc2();<br />+#endif<br />+ /* Perform the machine specific initialisation */<br />+ if (sh_mv.mv_init_irq != NULL)<br />+ sh_mv.mv_init_irq();<br />+}<br />+<br />+#if !defined(CONFIG_CPU_HAS_PINT_IRQ)<br />+int ipr_irq_demux(int irq)<br />+{<br />+ return irq;<br />+}<br />+#endif<br />+<br />+EXPORT_SYMBOL(make_ipr_irq);<br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/cpu/irq/pint.c sh-2.6.15/arch/sh/kernel/cpu/irq/pint.c<br />--- linux-2.6.15/arch/sh/kernel/cpu/irq/pint.c 1970-01-01 02:00:00.000000000 +0200<br />+++ sh-2.6.15/arch/sh/kernel/cpu/irq/pint.c 2006-01-07 22:13:59.144149110 +0200<br />&#64;&#64; -0,0 +1,169 &#64;&#64;<br />+/*<br />+ * arch/sh/kernel/cpu/irq/pint.c - Interrupt handling for PINT-based IRQs.<br />+ *<br />+ * Copyright (C) 1999 Niibe Yutaka &amp; Takeshi Yaegashi<br />+ * Copyright (C) 2000 Kazumoto Kojima<br />+ * Copyright (C) 2003 Takashi Kusuda &lt;kusuda-takashi&#64;hitachi-ul.co.jp&gt;<br />+ *<br />+ * This file is subject to the terms and conditions of the GNU General Public<br />+ * License. See the file "COPYING" in the main directory of this archive<br />+ * for more details.<br />+ */<br />+<br />+#include &lt;linux/config.h&gt;<br />+#include &lt;linux/init.h&gt;<br />+#include &lt;linux/irq.h&gt;<br />+#include &lt;linux/module.h&gt;<br />+<br />+#include &lt;asm/system.h&gt;<br />+#include &lt;asm/io.h&gt;<br />+#include &lt;asm/machvec.h&gt;<br />+<br />+static unsigned char pint_map[256];<br />+static unsigned long portcr_mask;<br />+<br />+static void enable_pint_irq(unsigned int irq);<br />+static void disable_pint_irq(unsigned int irq);<br />+<br />+/* shutdown is same as "disable" */<br />+#define shutdown_pint_irq disable_pint_irq<br />+<br />+static void mask_and_ack_pint(unsigned int);<br />+static void end_pint_irq(unsigned int irq);<br />+<br />+static unsigned int startup_pint_irq(unsigned int irq)<br />+{<br />+ enable_pint_irq(irq);<br />+ return 0; /* never anything pending */<br />+}<br />+<br />+static struct hw_interrupt_type pint_irq_type = {<br />+ .typename = "PINT-IRQ",<br />+ .startup = startup_pint_irq,<br />+ .shutdown = shutdown_pint_irq,<br />+ .enable = enable_pint_irq,<br />+ .disable = disable_pint_irq,<br />+ .ack = mask_and_ack_pint,<br />+ .end = end_pint_irq<br />+};<br />+<br />+static void disable_pint_irq(unsigned int irq)<br />+{<br />+ unsigned long val, flags;<br />+<br />+ local_irq_save(flags);<br />+ val = ctrl_inw(INTC_INTER);<br />+ val &amp;= ~(1 &lt;&lt; (irq - PINT_IRQ_BASE));<br />+ ctrl_outw(val, INTC_INTER); /* disable PINTn */<br />+ portcr_mask &amp;= ~(3 &lt;&lt; (irq - PINT_IRQ_BASE)*2);<br />+ local_irq_restore(flags);<br />+}<br />+<br />+static void enable_pint_irq(unsigned int irq)<br />+{<br />+ unsigned long val, flags;<br />+<br />+ local_irq_save(flags);<br />+ val = ctrl_inw(INTC_INTER);<br />+ val |= 1 &lt;&lt; (irq - PINT_IRQ_BASE);<br />+ ctrl_outw(val, INTC_INTER); /* enable PINTn */<br />+ portcr_mask |= 3 &lt;&lt; (irq - PINT_IRQ_BASE)*2;<br />+ local_irq_restore(flags);<br />+}<br />+<br />+static void mask_and_ack_pint(unsigned int irq)<br />+{<br />+ disable_pint_irq(irq);<br />+}<br />+<br />+static void end_pint_irq(unsigned int irq)<br />+{<br />+ if (!(irq_desc[irq].status &amp; (IRQ_DISABLED|IRQ_INPROGRESS)))<br />+ enable_pint_irq(irq);<br />+}<br />+<br />+void make_pint_irq(unsigned int irq)<br />+{<br />+ disable_irq_nosync(irq);<br />+ irq_desc[irq].handler = &amp;pint_irq_type;<br />+ disable_pint_irq(irq);<br />+}<br />+<br />+void __init init_IRQ_pint(void)<br />+{<br />+ int i;<br />+<br />+ make_ipr_irq(PINT0_IRQ, PINT0_IPR_ADDR, PINT0_IPR_POS, PINT0_PRIORITY);<br />+ make_ipr_irq(PINT8_IRQ, PINT8_IPR_ADDR, PINT8_IPR_POS, PINT8_PRIORITY);<br />+<br />+ enable_irq(PINT0_IRQ);<br />+ enable_irq(PINT8_IRQ);<br />+<br />+ for(i = 0; i &lt; 16; i++)<br />+ make_pint_irq(PINT_IRQ_BASE + i);<br />+<br />+ for(i = 0; i &lt; 256; i++) {<br />+ if (i &amp; 1)<br />+ pint_map[i] = 0;<br />+ else if (i &amp; 2)<br />+ pint_map[i] = 1;<br />+ else if (i &amp; 4)<br />+ pint_map[i] = 2;<br />+ else if (i &amp; 8)<br />+ pint_map[i] = 3;<br />+ else if (i &amp; 0x10)<br />+ pint_map[i] = 4;<br />+ else if (i &amp; 0x20)<br />+ pint_map[i] = 5;<br />+ else if (i &amp; 0x40)<br />+ pint_map[i] = 6;<br />+ else if (i &amp; 0x80)<br />+ pint_map[i] = 7;<br />+ }<br />+}<br />+<br />+int ipr_irq_demux(int irq)<br />+{<br />+ unsigned long creg, dreg, d, sav;<br />+<br />+ if (irq == PINT0_IRQ) {<br />+#if defined(CONFIG_CPU_SUBTYPE_SH7707)<br />+ creg = PORT_PACR;<br />+ dreg = PORT_PADR;<br />+#else<br />+ creg = PORT_PCCR;<br />+ dreg = PORT_PCDR;<br />+#endif<br />+ sav = ctrl_inw(creg);<br />+ ctrl_outw(sav | portcr_mask, creg);<br />+ d = (~ctrl_inb(dreg) ^ ctrl_inw(INTC_ICR2)) &amp;<br />+ ctrl_inw(INTC_INTER) &amp; 0xff;<br />+ ctrl_outw(sav, creg);<br />+<br />+ if (d == 0)<br />+ return irq;<br />+<br />+ return PINT_IRQ_BASE + pint_map[d];<br />+ } else if (irq == PINT8_IRQ) {<br />+#if defined(CONFIG_CPU_SUBTYPE_SH7707)<br />+ creg = PORT_PBCR;<br />+ dreg = PORT_PBDR;<br />+#else<br />+ creg = PORT_PFCR;<br />+ dreg = PORT_PFDR;<br />+#endif<br />+ sav = ctrl_inw(creg);<br />+ ctrl_outw(sav | (portcr_mask &gt;&gt; 16), creg);<br />+ d = (~ctrl_inb(dreg) ^ (ctrl_inw(INTC_ICR2) &gt;&gt; 8)) &amp;<br />+ (ctrl_inw(INTC_INTER) &gt;&gt; 8) &amp; 0xff;<br />+ ctrl_outw(sav, creg);<br />+<br />+ if (d == 0)<br />+ return irq;<br />+<br />+ return PINT_IRQ_BASE + 8 + pint_map[d];<br />+ }<br />+<br />+ return irq;<br />+}<br />+<br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/cpu/irq_imask.c sh-2.6.15/arch/sh/kernel/cpu/irq_imask.c<br />--- linux-2.6.15/arch/sh/kernel/cpu/irq_imask.c 2005-11-12 20:17:23.000000000 +0200<br />+++ sh-2.6.15/arch/sh/kernel/cpu/irq_imask.c 1970-01-01 02:00:00.000000000 +0200<br />&#64;&#64; -1,116 +0,0 &#64;&#64;<br />-/* $Id: irq_imask.c,v 1.1.2.1 2002/11/17 10:53:43 mrbrown Exp $<br />- *<br />- * linux/arch/sh/kernel/irq_imask.c<br />- *<br />- * Copyright (C) 1999, 2000 Niibe Yutaka<br />- *<br />- * Simple interrupt handling using IMASK of SR register.<br />- *<br />- */<br />-<br />-/* NOTE: Will not work on level 15 */<br />-<br />-<br />-#include &lt;linux/ptrace.h&gt;<br />-#include &lt;linux/errno.h&gt;<br />-#include &lt;linux/kernel_stat.h&gt;<br />-#include &lt;linux/signal.h&gt;<br />-#include &lt;linux/sched.h&gt;<br />-#include &lt;linux/interrupt.h&gt;<br />-#include &lt;linux/init.h&gt;<br />-#include &lt;linux/bitops.h&gt;<br />-<br />-#include &lt;asm/system.h&gt;<br />-#include &lt;asm/irq.h&gt;<br />-<br />-#include &lt;linux/spinlock.h&gt;<br />-#include &lt;linux/cache.h&gt;<br />-#include &lt;linux/irq.h&gt;<br />-<br />-/* Bitmap of IRQ masked */<br />-static unsigned long imask_mask = 0x7fff;<br />-static int interrupt_priority = 0;<br />-<br />-static void enable_imask_irq(unsigned int irq);<br />-static void disable_imask_irq(unsigned int irq);<br />-static void shutdown_imask_irq(unsigned int irq);<br />-static void mask_and_ack_imask(unsigned int);<br />-static void end_imask_irq(unsigned int irq);<br />-<br />-#define IMASK_PRIORITY 15<br />-<br />-static unsigned int startup_imask_irq(unsigned int irq)<br />-{ <br />- /* Nothing to do */<br />- return 0; /* never anything pending */<br />-}<br />-<br />-static struct hw_interrupt_type imask_irq_type = {<br />- .typename = "SR.IMASK",<br />- .startup = startup_imask_irq,<br />- .shutdown = shutdown_imask_irq,<br />- .enable = enable_imask_irq,<br />- .disable = disable_imask_irq,<br />- .ack = mask_and_ack_imask,<br />- .end = end_imask_irq<br />-};<br />-<br />-void static inline set_interrupt_registers(int ip)<br />-{<br />- unsigned long __dummy;<br />-<br />- asm volatile("ldc %2, r6_bank\n\t"<br />- "stc sr, %0\n\t"<br />- "and #0xf0, %0\n\t"<br />- "shlr2 %0\n\t"<br />- "cmp/eq #0x3c, %0\n\t"<br />- "bt/s 1f ! CLI-ed\n\t"<br />- " stc sr, %0\n\t"<br />- "and %1, %0\n\t"<br />- "or %2, %0\n\t"<br />- "ldc %0, sr\n"<br />- "1:"<br />- : "=&amp;z" (__dummy)<br />- : "r" (~0xf0), "r" (ip &lt;&lt; 4)<br />- : "t");<br />-}<br />-<br />-static void disable_imask_irq(unsigned int irq)<br />-{<br />- clear_bit(irq, &amp;imask_mask);<br />- if (interrupt_priority &lt; IMASK_PRIORITY - irq)<br />- interrupt_priority = IMASK_PRIORITY - irq;<br />-<br />- set_interrupt_registers(interrupt_priority);<br />-}<br />-<br />-static void enable_imask_irq(unsigned int irq)<br />-{<br />- set_bit(irq, &amp;imask_mask);<br />- interrupt_priority = IMASK_PRIORITY - ffz(imask_mask);<br />-<br />- set_interrupt_registers(interrupt_priority);<br />-}<br />-<br />-static void mask_and_ack_imask(unsigned int irq)<br />-{<br />- disable_imask_irq(irq);<br />-}<br />-<br />-static void end_imask_irq(unsigned int irq)<br />-{<br />- if (!(irq_desc[irq].status &amp; (IRQ_DISABLED|IRQ_INPROGRESS)))<br />- enable_imask_irq(irq);<br />-}<br />-<br />-static void shutdown_imask_irq(unsigned int irq)<br />-{<br />- /* Nothing to do */<br />-}<br />-<br />-void make_imask_irq(unsigned int irq)<br />-{<br />- disable_irq_nosync(irq);<br />- irq_desc[irq].handler = &amp;imask_irq_type;<br />- enable_irq(irq);<br />-}<br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/cpu/irq_ipr.c sh-2.6.15/arch/sh/kernel/cpu/irq_ipr.c<br />--- linux-2.6.15/arch/sh/kernel/cpu/irq_ipr.c 2005-11-12 20:17:23.000000000 +0200<br />+++ sh-2.6.15/arch/sh/kernel/cpu/irq_ipr.c 1970-01-01 02:00:00.000000000 +0200<br />&#64;&#64; -1,339 +0,0 &#64;&#64;<br />-/* $Id: irq_ipr.c,v 1.1.2.1 2002/11/17 10:53:43 mrbrown Exp $<br />- *<br />- * linux/arch/sh/kernel/irq_ipr.c<br />- *<br />- * Copyright (C) 1999 Niibe Yutaka &amp; Takeshi Yaegashi<br />- * Copyright (C) 2000 Kazumoto Kojima<br />- * Copyright (C) 2003 Takashi Kusuda &lt;kusuda-takashi&#64;hitachi-ul.co.jp&gt;<br />- *<br />- * Interrupt handling for IPR-based IRQ.<br />- *<br />- * Supported system:<br />- * On-chip supporting modules (TMU, RTC, etc.).<br />- * On-chip supporting modules for SH7709/SH7709A/SH7729/SH7300.<br />- * Hitachi SolutionEngine external I/O:<br />- * MS7709SE01, MS7709ASE01, and MS7750SE01<br />- *<br />- */<br />-<br />-#include &lt;linux/config.h&gt;<br />-#include &lt;linux/init.h&gt;<br />-#include &lt;linux/irq.h&gt;<br />-#include &lt;linux/module.h&gt;<br />-<br />-#include &lt;asm/system.h&gt;<br />-#include &lt;asm/io.h&gt;<br />-#include &lt;asm/machvec.h&gt;<br />-<br />-struct ipr_data {<br />- unsigned int addr; /* Address of Interrupt Priority Register */<br />- int shift; /* Shifts of the 16-bit data */<br />- int priority; /* The priority */<br />-};<br />-static struct ipr_data ipr_data[NR_IRQS];<br />-<br />-static void enable_ipr_irq(unsigned int irq);<br />-static void disable_ipr_irq(unsigned int irq);<br />-<br />-/* shutdown is same as "disable" */<br />-#define shutdown_ipr_irq disable_ipr_irq<br />-<br />-static void mask_and_ack_ipr(unsigned int);<br />-static void end_ipr_irq(unsigned int irq);<br />-<br />-static unsigned int startup_ipr_irq(unsigned int irq)<br />-{<br />- enable_ipr_irq(irq);<br />- return 0; /* never anything pending */<br />-}<br />-<br />-static struct hw_interrupt_type ipr_irq_type = {<br />- .typename = "IPR-IRQ",<br />- .startup = startup_ipr_irq,<br />- .shutdown = shutdown_ipr_irq,<br />- .enable = enable_ipr_irq,<br />- .disable = disable_ipr_irq,<br />- .ack = mask_and_ack_ipr,<br />- .end = end_ipr_irq<br />-};<br />-<br />-static void disable_ipr_irq(unsigned int irq)<br />-{<br />- unsigned long val, flags;<br />- unsigned int addr = ipr_data[irq].addr;<br />- unsigned short mask = 0xffff ^ (0x0f &lt;&lt; ipr_data[irq].shift);<br />-<br />- /* Set the priority in IPR to 0 */<br />- local_irq_save(flags);<br />- val = ctrl_inw(addr);<br />- val &amp;= mask;<br />- ctrl_outw(val, addr);<br />- local_irq_restore(flags);<br />-}<br />-<br />-static void enable_ipr_irq(unsigned int irq)<br />-{<br />- unsigned long val, flags;<br />- unsigned int addr = ipr_data[irq].addr;<br />- int priority = ipr_data[irq].priority;<br />- unsigned short value = (priority &lt;&lt; ipr_data[irq].shift);<br />-<br />- /* Set priority in IPR back to original value */<br />- local_irq_save(flags);<br />- val = ctrl_inw(addr);<br />- val |= value;<br />- ctrl_outw(val, addr);<br />- local_irq_restore(flags);<br />-}<br />-<br />-static void mask_and_ack_ipr(unsigned int irq)<br />-{<br />- disable_ipr_irq(irq);<br />-<br />-#if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \<br />- defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705)<br />- /* This is needed when we use edge triggered setting */<br />- /* XXX: Is it really needed? */<br />- if (IRQ0_IRQ &lt;= irq &amp;&amp; irq &lt;= IRQ5_IRQ) {<br />- /* Clear external interrupt request */<br />- int a = ctrl_inb(INTC_IRR0);<br />- a &amp;= ~(1 &lt;&lt; (irq - IRQ0_IRQ));<br />- ctrl_outb(a, INTC_IRR0);<br />- }<br />-#endif<br />-}<br />-<br />-static void end_ipr_irq(unsigned int irq)<br />-{<br />- if (!(irq_desc[irq].status &amp; (IRQ_DISABLED|IRQ_INPROGRESS)))<br />- enable_ipr_irq(irq);<br />-}<br />-<br />-void make_ipr_irq(unsigned int irq, unsigned int addr, int pos, int priority)<br />-{<br />- disable_irq_nosync(irq);<br />- ipr_data[irq].addr = addr;<br />- ipr_data[irq].shift = pos*4; /* POSition (0-3) x 4 means shift */<br />- ipr_data[irq].priority = priority;<br />-<br />- irq_desc[irq].handler = &amp;ipr_irq_type;<br />- disable_ipr_irq(irq);<br />-}<br />-<br />-#if defined(CONFIG_CPU_SUBTYPE_SH7705) || \<br />- defined(CONFIG_CPU_SUBTYPE_SH7707) || \<br />- defined(CONFIG_CPU_SUBTYPE_SH7709)<br />-static unsigned char pint_map[256];<br />-static unsigned long portcr_mask = 0;<br />-<br />-static void enable_pint_irq(unsigned int irq);<br />-static void disable_pint_irq(unsigned int irq);<br />-<br />-/* shutdown is same as "disable" */<br />-#define shutdown_pint_irq disable_pint_irq<br />-<br />-static void mask_and_ack_pint(unsigned int);<br />-static void end_pint_irq(unsigned int irq);<br />-<br />-static unsigned int startup_pint_irq(unsigned int irq)<br />-{<br />- enable_pint_irq(irq);<br />- return 0; /* never anything pending */<br />-}<br />-<br />-static struct hw_interrupt_type pint_irq_type = {<br />- .typename = "PINT-IRQ",<br />- .startup = startup_pint_irq,<br />- .shutdown = shutdown_pint_irq,<br />- .enable = enable_pint_irq,<br />- .disable = disable_pint_irq,<br />- .ack = mask_and_ack_pint,<br />- .end = end_pint_irq<br />-};<br />-<br />-static void disable_pint_irq(unsigned int irq)<br />-{<br />- unsigned long val, flags;<br />-<br />- local_irq_save(flags);<br />- val = ctrl_inw(INTC_INTER);<br />- val &amp;= ~(1 &lt;&lt; (irq - PINT_IRQ_BASE));<br />- ctrl_outw(val, INTC_INTER); /* disable PINTn */<br />- portcr_mask &amp;= ~(3 &lt;&lt; (irq - PINT_IRQ_BASE)*2);<br />- local_irq_restore(flags);<br />-}<br />-<br />-static void enable_pint_irq(unsigned int irq)<br />-{<br />- unsigned long val, flags;<br />-<br />- local_irq_save(flags);<br />- val = ctrl_inw(INTC_INTER);<br />- val |= 1 &lt;&lt; (irq - PINT_IRQ_BASE);<br />- ctrl_outw(val, INTC_INTER); /* enable PINTn */<br />- portcr_mask |= 3 &lt;&lt; (irq - PINT_IRQ_BASE)*2;<br />- local_irq_restore(flags);<br />-}<br />-<br />-static void mask_and_ack_pint(unsigned int irq)<br />-{<br />- disable_pint_irq(irq);<br />-}<br />-<br />-static void end_pint_irq(unsigned int irq)<br />-{<br />- if (!(irq_desc[irq].status &amp; (IRQ_DISABLED|IRQ_INPROGRESS)))<br />- enable_pint_irq(irq);<br />-}<br />-<br />-void make_pint_irq(unsigned int irq)<br />-{<br />- disable_irq_nosync(irq);<br />- irq_desc[irq].handler = &amp;pint_irq_type;<br />- disable_pint_irq(irq);<br />-}<br />-#endif<br />-<br />-void __init init_IRQ(void)<br />-{<br />-#if defined(CONFIG_CPU_SUBTYPE_SH7705) || \<br />- defined(CONFIG_CPU_SUBTYPE_SH7707) || \<br />- defined(CONFIG_CPU_SUBTYPE_SH7709)<br />- int i;<br />-#endif<br />-<br />- make_ipr_irq(TIMER_IRQ, TIMER_IPR_ADDR, TIMER_IPR_POS, TIMER_PRIORITY);<br />- make_ipr_irq(TIMER1_IRQ, TIMER1_IPR_ADDR, TIMER1_IPR_POS, TIMER1_PRIORITY);<br />-#if defined(CONFIG_SH_RTC)<br />- make_ipr_irq(RTC_IRQ, RTC_IPR_ADDR, RTC_IPR_POS, RTC_PRIORITY);<br />-#endif<br />-<br />-#ifdef SCI_ERI_IRQ<br />- make_ipr_irq(SCI_ERI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY);<br />- make_ipr_irq(SCI_RXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY);<br />- make_ipr_irq(SCI_TXI_IRQ, SCI_IPR_ADDR, SCI_IPR_POS, SCI_PRIORITY);<br />-#endif<br />-<br />-#ifdef SCIF1_ERI_IRQ<br />- make_ipr_irq(SCIF1_ERI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY);<br />- make_ipr_irq(SCIF1_RXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY);<br />- make_ipr_irq(SCIF1_BRI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY);<br />- make_ipr_irq(SCIF1_TXI_IRQ, SCIF1_IPR_ADDR, SCIF1_IPR_POS, SCIF1_PRIORITY);<br />-#endif<br />-<br />-#if defined(CONFIG_CPU_SUBTYPE_SH7300)<br />- make_ipr_irq(SCIF0_IRQ, SCIF0_IPR_ADDR, SCIF0_IPR_POS, SCIF0_PRIORITY);<br />- make_ipr_irq(DMTE2_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY);<br />- make_ipr_irq(DMTE3_IRQ, DMA1_IPR_ADDR, DMA1_IPR_POS, DMA1_PRIORITY);<br />- make_ipr_irq(VIO_IRQ, VIO_IPR_ADDR, VIO_IPR_POS, VIO_PRIORITY);<br />-#endif<br />-<br />-#ifdef SCIF_ERI_IRQ<br />- make_ipr_irq(SCIF_ERI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY);<br />- make_ipr_irq(SCIF_RXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY);<br />- make_ipr_irq(SCIF_BRI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY);<br />- make_ipr_irq(SCIF_TXI_IRQ, SCIF_IPR_ADDR, SCIF_IPR_POS, SCIF_PRIORITY);<br />-#endif<br />-<br />-#ifdef IRDA_ERI_IRQ<br />- make_ipr_irq(IRDA_ERI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY);<br />- make_ipr_irq(IRDA_RXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY);<br />- make_ipr_irq(IRDA_BRI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY);<br />- make_ipr_irq(IRDA_TXI_IRQ, IRDA_IPR_ADDR, IRDA_IPR_POS, IRDA_PRIORITY);<br />-#endif<br />-<br />-#if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \<br />- defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705)<br />- /*<br />- * Initialize the Interrupt Controller (INTC)<br />- * registers to their power on values<br />- */<br />-<br />- /*<br />- * Enable external irq (INTC IRQ mode).<br />- * You should set corresponding bits of PFC to "00"<br />- * to enable these interrupts.<br />- */<br />- make_ipr_irq(IRQ0_IRQ, IRQ0_IPR_ADDR, IRQ0_IPR_POS, IRQ0_PRIORITY);<br />- make_ipr_irq(IRQ1_IRQ, IRQ1_IPR_ADDR, IRQ1_IPR_POS, IRQ1_PRIORITY);<br />- make_ipr_irq(IRQ2_IRQ, IRQ2_IPR_ADDR, IRQ2_IPR_POS, IRQ2_PRIORITY);<br />- make_ipr_irq(IRQ3_IRQ, IRQ3_IPR_ADDR, IRQ3_IPR_POS, IRQ3_PRIORITY);<br />- make_ipr_irq(IRQ4_IRQ, IRQ4_IPR_ADDR, IRQ4_IPR_POS, IRQ4_PRIORITY);<br />- make_ipr_irq(IRQ5_IRQ, IRQ5_IPR_ADDR, IRQ5_IPR_POS, IRQ5_PRIORITY);<br />-#if !defined(CONFIG_CPU_SUBTYPE_SH7300)<br />- make_ipr_irq(PINT0_IRQ, PINT0_IPR_ADDR, PINT0_IPR_POS, PINT0_PRIORITY);<br />- make_ipr_irq(PINT8_IRQ, PINT8_IPR_ADDR, PINT8_IPR_POS, PINT8_PRIORITY);<br />- enable_ipr_irq(PINT0_IRQ);<br />- enable_ipr_irq(PINT8_IRQ);<br />-<br />- for(i = 0; i &lt; 16; i++)<br />- make_pint_irq(PINT_IRQ_BASE + i);<br />- for(i = 0; i &lt; 256; i++)<br />- {<br />- if(i &amp; 1) pint_map[i] = 0;<br />- else if(i &amp; 2) pint_map[i] = 1;<br />- else if(i &amp; 4) pint_map[i] = 2;<br />- else if(i &amp; 8) pint_map[i] = 3;<br />- else if(i &amp; 0x10) pint_map[i] = 4;<br />- else if(i &amp; 0x20) pint_map[i] = 5;<br />- else if(i &amp; 0x40) pint_map[i] = 6;<br />- else if(i &amp; 0x80) pint_map[i] = 7;<br />- }<br />-#endif /* !CONFIG_CPU_SUBTYPE_SH7300 */<br />-#endif /* CONFIG_CPU_SUBTYPE_SH7707 || CONFIG_CPU_SUBTYPE_SH7709 || CONFIG_CPU_SUBTYPE_SH7300*/<br />-<br />-#ifdef CONFIG_CPU_SUBTYPE_ST40<br />- init_IRQ_intc2();<br />-#endif<br />-<br />- /* Perform the machine specific initialisation */<br />- if (sh_mv.mv_init_irq != NULL) {<br />- sh_mv.mv_init_irq();<br />- }<br />-}<br />-#if defined(CONFIG_CPU_SUBTYPE_SH7707) || defined(CONFIG_CPU_SUBTYPE_SH7709) || \<br />- defined(CONFIG_CPU_SUBTYPE_SH7300) || defined(CONFIG_CPU_SUBTYPE_SH7705)<br />-int ipr_irq_demux(int irq)<br />-{<br />-#if !defined(CONFIG_CPU_SUBTYPE_SH7300)<br />- unsigned long creg, dreg, d, sav;<br />-<br />- if(irq == PINT0_IRQ)<br />- {<br />-#if defined(CONFIG_CPU_SUBTYPE_SH7707)<br />- creg = PORT_PACR;<br />- dreg = PORT_PADR;<br />-#else<br />- creg = PORT_PCCR;<br />- dreg = PORT_PCDR;<br />-#endif<br />- sav = ctrl_inw(creg);<br />- ctrl_outw(sav | portcr_mask, creg);<br />- d = (~ctrl_inb(dreg) ^ ctrl_inw(INTC_ICR2)) &amp; ctrl_inw(INTC_INTER) &amp; 0xff;<br />- ctrl_outw(sav, creg);<br />- if(d == 0) return irq;<br />- return PINT_IRQ_BASE + pint_map[d];<br />- }<br />- else if(irq == PINT8_IRQ)<br />- {<br />-#if defined(CONFIG_CPU_SUBTYPE_SH7707)<br />- creg = PORT_PBCR;<br />- dreg = PORT_PBDR;<br />-#else<br />- creg = PORT_PFCR;<br />- dreg = PORT_PFDR;<br />-#endif<br />- sav = ctrl_inw(creg);<br />- ctrl_outw(sav | (portcr_mask &gt;&gt; 16), creg);<br />- d = (~ctrl_inb(dreg) ^ (ctrl_inw(INTC_ICR2) &gt;&gt; 8)) &amp; (ctrl_inw(INTC_INTER) &gt;&gt; 8) &amp; 0xff;<br />- ctrl_outw(sav, creg);<br />- if(d == 0) return irq;<br />- return PINT_IRQ_BASE + 8 + pint_map[d];<br />- }<br />-#endif<br />- return irq;<br />-}<br />-#endif<br />-<br />-EXPORT_SYMBOL(make_ipr_irq);<br />-<br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/cpu/sh4/irq_intc2.c sh-2.6.15/arch/sh/kernel/cpu/sh4/irq_intc2.c<br />--- linux-2.6.15/arch/sh/kernel/cpu/sh4/irq_intc2.c 2005-11-12 20:17:23.000000000 +0200<br />+++ sh-2.6.15/arch/sh/kernel/cpu/sh4/irq_intc2.c 1970-01-01 02:00:00.000000000 +0200<br />&#64;&#64; -1,222 +0,0 &#64;&#64;<br />-/*<br />- * linux/arch/sh/kernel/irq_intc2.c<br />- *<br />- * Copyright (C) 2001 David J. Mckay (david.mckay&#64;st.com)<br />- *<br />- * May be copied or modified under the terms of the GNU General Public<br />- * License. See linux/COPYING for more information. <br />- *<br />- * Interrupt handling for INTC2-based IRQ.<br />- *<br />- * These are the "new Hitachi style" interrupts, as present on the <br />- * Hitachi 7751 and the STM ST40 STB1.<br />- */<br />-<br />-#include &lt;linux/kernel.h&gt;<br />-#include &lt;linux/init.h&gt;<br />-#include &lt;linux/irq.h&gt;<br />-<br />-#include &lt;asm/system.h&gt;<br />-#include &lt;asm/io.h&gt;<br />-#include &lt;asm/machvec.h&gt;<br />-<br />-<br />-struct intc2_data {<br />- unsigned char msk_offset;<br />- unsigned char msk_shift;<br />-#ifdef CONFIG_CPU_SUBTYPE_ST40<br />- int (*clear_irq) (int);<br />-#endif<br />-};<br />-<br />-<br />-static struct intc2_data intc2_data[NR_INTC2_IRQS];<br />-<br />-static void enable_intc2_irq(unsigned int irq);<br />-static void disable_intc2_irq(unsigned int irq);<br />-<br />-/* shutdown is same as "disable" */<br />-#define shutdown_intc2_irq disable_intc2_irq<br />-<br />-static void mask_and_ack_intc2(unsigned int);<br />-static void end_intc2_irq(unsigned int irq);<br />-<br />-static unsigned int startup_intc2_irq(unsigned int irq)<br />-{ <br />- enable_intc2_irq(irq);<br />- return 0; /* never anything pending */<br />-}<br />-<br />-static struct hw_interrupt_type intc2_irq_type = {<br />- .typename = "INTC2-IRQ",<br />- .startup = startup_intc2_irq,<br />- .shutdown = shutdown_intc2_irq,<br />- .enable = enable_intc2_irq,<br />- .disable = disable_intc2_irq,<br />- .ack = mask_and_ack_intc2,<br />- .end = end_intc2_irq<br />-};<br />-<br />-static void disable_intc2_irq(unsigned int irq)<br />-{<br />- int irq_offset = irq - INTC2_FIRST_IRQ;<br />- int msk_shift, msk_offset;<br />-<br />- // Sanity check<br />- if((irq_offset&lt;0) || (irq_offset&gt;=NR_INTC2_IRQS))<br />- return;<br />-<br />- msk_shift = intc2_data[irq_offset].msk_shift;<br />- msk_offset = intc2_data[irq_offset].msk_offset;<br />-<br />- ctrl_outl(1&lt;&lt;msk_shift,<br />- INTC2_BASE+INTC2_INTMSK_OFFSET+msk_offset);<br />-}<br />-<br />-static void enable_intc2_irq(unsigned int irq)<br />-{<br />- int irq_offset = irq - INTC2_FIRST_IRQ;<br />- int msk_shift, msk_offset;<br />-<br />- /* Sanity check */<br />- if((irq_offset&lt;0) || (irq_offset&gt;=NR_INTC2_IRQS))<br />- return;<br />-<br />- msk_shift = intc2_data[irq_offset].msk_shift;<br />- msk_offset = intc2_data[irq_offset].msk_offset;<br />-<br />- ctrl_outl(1&lt;&lt;msk_shift,<br />- INTC2_BASE+INTC2_INTMSKCLR_OFFSET+msk_offset);<br />-}<br />-<br />-static void mask_and_ack_intc2(unsigned int irq)<br />-{<br />- disable_intc2_irq(irq);<br />-}<br />-<br />-static void end_intc2_irq(unsigned int irq)<br />-{<br />- if (!(irq_desc[irq].status &amp; (IRQ_DISABLED|IRQ_INPROGRESS)))<br />- enable_intc2_irq(irq);<br />-<br />-#ifdef CONFIG_CPU_SUBTYPE_ST40<br />- if (intc2_data[irq - INTC2_FIRST_IRQ].clear_irq)<br />- intc2_data[irq - INTC2_FIRST_IRQ].clear_irq (irq);<br />-#endif<br />-}<br />-<br />-/*<br />- * Setup an INTC2 style interrupt.<br />- * NOTE: Unlike IPR interrupts, parameters are not shifted by this code,<br />- * allowing the use of the numbers straight out of the datasheet.<br />- * For example:<br />- * PIO1 which is INTPRI00[19,16] and INTMSK00[13]<br />- * would be: ^ ^ ^ ^<br />- * | | | |<br />- * make_intc2_irq(84, 0, 16, 0, 13);<br />- */<br />-void make_intc2_irq(unsigned int irq,<br />- unsigned int ipr_offset, unsigned int ipr_shift,<br />- unsigned int msk_offset, unsigned int msk_shift,<br />- unsigned int priority)<br />-{<br />- int irq_offset = irq - INTC2_FIRST_IRQ;<br />- unsigned int flags;<br />- unsigned long ipr;<br />-<br />- if((irq_offset&lt;0) || (irq_offset&gt;=NR_INTC2_IRQS))<br />- return;<br />-<br />- disable_irq_nosync(irq);<br />-<br />- /* Fill the data we need */<br />- intc2_data[irq_offset].msk_offset = msk_offset;<br />- intc2_data[irq_offset].msk_shift = msk_shift;<br />-#ifdef CONFIG_CPU_SUBTYPE_ST40<br />- intc2_data[irq_offset].clear_irq = NULL;<br />-#endif<br />- <br />- /* Set the priority level */<br />- local_irq_save(flags);<br />-<br />- ipr=ctrl_inl(INTC2_BASE+INTC2_INTPRI_OFFSET+ipr_offset);<br />- ipr&amp;=~(0xf&lt;&lt;ipr_shift);<br />- ipr|=(priority)&lt;&lt;ipr_shift;<br />- ctrl_outl(ipr, INTC2_BASE+INTC2_INTPRI_OFFSET+ipr_offset);<br />-<br />- local_irq_restore(flags);<br />-<br />- irq_desc[irq].handler=&amp;intc2_irq_type;<br />-<br />- disable_intc2_irq(irq);<br />-}<br />-<br />-#ifdef CONFIG_CPU_SUBTYPE_ST40<br />-<br />-struct intc2_init {<br />- unsigned short irq;<br />- unsigned char ipr_offset, ipr_shift;<br />- unsigned char msk_offset, msk_shift;<br />-};<br />-<br />-static struct intc2_init intc2_init_data[] __initdata = {<br />- {64, 0, 0, 0, 0}, /* PCI serr */<br />- {65, 0, 4, 0, 1}, /* PCI err */<br />- {66, 0, 4, 0, 2}, /* PCI ad */<br />- {67, 0, 4, 0, 3}, /* PCI pwd down */<br />- {72, 0, 8, 0, 5}, /* DMAC INT0 */<br />- {73, 0, 8, 0, 6}, /* DMAC INT1 */<br />- {74, 0, 8, 0, 7}, /* DMAC INT2 */<br />- {75, 0, 8, 0, 8}, /* DMAC INT3 */<br />- {76, 0, 8, 0, 9}, /* DMAC INT4 */<br />- {78, 0, 8, 0, 11}, /* DMAC ERR */<br />- {80, 0, 12, 0, 12}, /* PIO0 */<br />- {84, 0, 16, 0, 13}, /* PIO1 */<br />- {88, 0, 20, 0, 14}, /* PIO2 */<br />- {112, 4, 0, 4, 0}, /* Mailbox */<br />-#ifdef CONFIG_CPU_SUBTYPE_ST40GX1<br />- {116, 4, 4, 4, 4}, /* SSC0 */<br />- {120, 4, 8, 4, 8}, /* IR Blaster */<br />- {124, 4, 12, 4, 12}, /* USB host */<br />- {128, 4, 16, 4, 16}, /* Video processor BLITTER */<br />- {132, 4, 20, 4, 20}, /* UART0 */<br />- {134, 4, 20, 4, 22}, /* UART2 */<br />- {136, 4, 24, 4, 24}, /* IO_PIO0 */<br />- {140, 4, 28, 4, 28}, /* EMPI */<br />- {144, 8, 0, 8, 0}, /* MAFE */<br />- {148, 8, 4, 8, 4}, /* PWM */<br />- {152, 8, 8, 8, 8}, /* SSC1 */<br />- {156, 8, 12, 8, 12}, /* IO_PIO1 */<br />- {160, 8, 16, 8, 16}, /* USB target */<br />- {164, 8, 20, 8, 20}, /* UART1 */<br />- {168, 8, 24, 8, 24}, /* Teletext */<br />- {172, 8, 28, 8, 28}, /* VideoSync VTG */<br />- {173, 8, 28, 8, 29}, /* VideoSync DVP0 */<br />- {174, 8, 28, 8, 30}, /* VideoSync DVP1 */<br />-#endif<br />-};<br />-<br />-void __init init_IRQ_intc2(void)<br />-{<br />- struct intc2_init *p;<br />-<br />- printk(KERN_ALERT "init_IRQ_intc2\n");<br />-<br />- for (p = intc2_init_data;<br />- p&lt;intc2_init_data+ARRAY_SIZE(intc2_init_data);<br />- p++) {<br />- make_intc2_irq(p-&gt;irq, p-&gt;ipr_offset, p-&gt;ipr_shift,<br />- p-&gt; msk_offset, p-&gt;msk_shift, 13);<br />- }<br />-}<br />-<br />-/* Adds a termination callback to the interrupt */<br />-void intc2_add_clear_irq(int irq, int (*fn)(int))<br />-{<br />- if (irq &lt; INTC2_FIRST_IRQ)<br />- return;<br />-<br />- intc2_data[irq - INTC2_FIRST_IRQ].clear_irq = fn;<br />-}<br />-<br />-#endif /* CONFIG_CPU_SUBTYPE_ST40 */<br />diff -urN -X exclude linux-2.6.15/arch/sh/kernel/irq.c sh-2.6.15/arch/sh/kernel/irq.c<br />--- linux-2.6.15/arch/sh/kernel/irq.c 2005-06-20 22:45:19.000000000 +0300<br />+++ sh-2.6.15/arch/sh/kernel/irq.c 2006-01-07 22:13:59.229142425 +0200<br />&#64;&#64; -8,38 +8,13 &#64;&#64;<br /> * SuperH version: Copyright (C) 1999 Niibe Yutaka<br /> */<br /> <br />-/*<br />- * IRQs are in fact implemented a bit like signal handlers for the kernel.<br />- * Naturally it's not a 1:1 relation, but there are similarities.<br />- */<br />-<br />-#include &lt;linux/config.h&gt;<br />-#include &lt;linux/module.h&gt;<br />-#include &lt;linux/ptrace.h&gt;<br />-#include &lt;linux/errno.h&gt;<br />-#include &lt;linux/kernel_stat.h&gt;<br />-#include &lt;linux/signal.h&gt;<br />-#include &lt;linux/sched.h&gt;<br />-#include &lt;linux/ioport.h&gt;<br />+#include &lt;linux/irq.h&gt;<br /> #include &lt;linux/interrupt.h&gt;<br />-#include &lt;linux/timex.h&gt;<br />-#include &lt;linux/mm.h&gt;<br />-#include &lt;linux/slab.h&gt;<br />-#include &lt;linux/random.h&gt;<br />-#include &lt;linux/smp.h&gt;<br />-#include &lt;linux/smp_lock.h&gt;<br />-#include &lt;linux/init.h&gt;<br />+#include &lt;linux/kernel_stat.h&gt;<br /> #include &lt;linux/seq_file.h&gt;<br />-#include &lt;linux/kallsyms.h&gt;<br />-#include &lt;linux/bitops.h&gt;<br />-<br />-#include &lt;asm/system.h&gt;<br />-#include &lt;asm/io.h&gt;<br />-#include &lt;asm/pgalloc.h&gt;<br />-#include &lt;asm/delay.h&gt;<br /> #include &lt;asm/irq.h&gt;<br />-#include &lt;linux/irq.h&gt;<br />-<br />+#include &lt;asm/processor.h&gt;<br />+#include &lt;asm/cpu/mmu_context.h&gt;<br /> <br /> /*<br /> * 'what should we do if we get a hw irq event on an illegal vector'.<br />&#64;&#64; -66,7 +41,7 &#64;&#64;<br /> seq_putc(p, '\n');<br /> }<br /> <br />- if (i &lt; ACTUAL_NR_IRQS) {<br />+ if (i &lt; NR_IRQS) {<br /> spin_lock_irqsave(&amp;irq_desc[i].lock, flags);<br /> action = irq_desc[i].action;<br /> if (!action)<br />&#64;&#64; -86,19 +61,32 &#64;&#64;<br /> }<br /> #endif<br /> <br />+<br /> asmlinkage int do_IRQ(unsigned long r4, unsigned long r5,<br /> unsigned long r6, unsigned long r7,<br /> struct pt_regs regs)<br />-{ <br />- int irq;<br />+{<br />+ int irq = r4;<br /> <br /> irq_enter();<br />- asm volatile("stc r2_bank, %0\n\t"<br />- "shlr2 %0\n\t"<br />- "shlr2 %0\n\t"<br />- "shlr %0\n\t"<br />- "add #-16, %0\n\t"<br />- :"=z" (irq));<br />+<br />+#ifdef CONFIG_CPU_HAS_INTEVT<br />+ __asm__ __volatile__ (<br />+#ifdef CONFIG_CPU_HAS_SR_RB<br />+ "stc r2_bank, %0\n\t"<br />+#else<br />+ "mov.l &#64;%1, %0\n\t"<br />+#endif<br />+ "shlr2 %0\n\t"<br />+ "shlr2 %0\n\t"<br />+ "shlr %0\n\t"<br />+ "add #-16, %0\n\t"<br />+ : "=z" (irq), "=r" (r4)<br />+ : "1" (INTEVT)<br />+ : "memory"<br />+ );<br />+#endif<br />+<br /> irq = irq_demux(irq);<br /> __do_IRQ(irq, &amp;regs);<br /> irq_exit();<br />diff -urN -X exclude linux-2.6.15/include/asm-sh/irq-sh73180.h sh-2.6.15/include/asm-sh/irq-sh73180.h<br />--- linux-2.6.15/include/asm-sh/irq-sh73180.h 2004-12-26 05:37:56.000000000 +0200<br />+++ sh-2.6.15/include/asm-sh/irq-sh73180.h 2006-01-04 00:15:30.000000000 +0200<br />&#64;&#64; -12,14 +12,14 &#64;&#64;<br /> #undef INTC_IPRC<br /> #undef INTC_IPRD<br /> <br />-#undef DMTE0_IRQ<br />-#undef DMTE1_IRQ<br />-#undef DMTE2_IRQ<br />-#undef DMTE3_IRQ<br />-#undef DMTE4_IRQ<br />-#undef DMTE5_IRQ<br />-#undef DMTE6_IRQ<br />-#undef DMTE7_IRQ<br />+#undef DMTE0_IRQ <br />+#undef DMTE1_IRQ <br />+#undef DMTE2_IRQ <br />+#undef DMTE3_IRQ <br />+#undef DMTE4_IRQ <br />+#undef DMTE5_IRQ <br />+#undef DMTE6_IRQ <br />+#undef DMTE7_IRQ <br /> #undef DMAE_IRQ<br /> #undef DMA_IPR_ADDR<br /> #undef DMA_IPR_POS<br />diff -urN -X exclude linux-2.6.15/include/asm-sh/irq-sh7780.h sh-2.6.15/include/asm-sh/irq-sh7780.h<br />--- linux-2.6.15/include/asm-sh/irq-sh7780.h 1970-01-01 02:00:00.000000000 +0200<br />+++ sh-2.6.15/include/asm-sh/irq-sh7780.h 2006-01-07 22:13:59.261139909 +0200<br />&#64;&#64; -0,0 +1,349 &#64;&#64;<br />+#ifndef __ASM_SH_IRQ_SH7780_H<br />+#define __ASM_SH_IRQ_SH7780_H<br />+<br />+/*<br />+ * linux/include/asm-sh/irq-sh7780.h<br />+ *<br />+ * Copyright (C) 2004 Takashi SHUDO &lt;shudo&#64;hitachi-ul.co.jp&gt;<br />+ */<br />+<br />+#ifdef CONFIG_IDE<br />+# ifndef IRQ_CFCARD<br />+# define IRQ_CFCARD 14<br />+# endif<br />+# ifndef IRQ_PCMCIA<br />+# define IRQ_PCMCIA 15<br />+# endif<br />+#endif<br />+<br />+#define INTC_BASE 0xffd00000<br />+#define INTC_ICR0 (INTC_BASE+0x0)<br />+#define INTC_ICR1 (INTC_BASE+0x1c)<br />+#define INTC_INTPRI (INTC_BASE+0x10)<br />+#define INTC_INTREQ (INTC_BASE+0x24)<br />+#define INTC_INTMSK0 (INTC_BASE+0x44)<br />+#define INTC_INTMSK1 (INTC_BASE+0x48)<br />+#define INTC_INTMSK2 (INTC_BASE+0x40080)<br />+#define INTC_INTMSKCLR0 (INTC_BASE+0x64)<br />+#define INTC_INTMSKCLR1 (INTC_BASE+0x68)<br />+#define INTC_INTMSKCLR2 (INTC_BASE+0x40084)<br />+#define INTC_NMIFCR (INTC_BASE+0xc0)<br />+#define INTC_USERIMASK (INTC_BASE+0x30000)<br />+<br />+#define INTC_INT2PRI0 (INTC_BASE+0x40000)<br />+#define INTC_INT2PRI1 (INTC_BASE+0x40004)<br />+#define INTC_INT2PRI2 (INTC_BASE+0x40008)<br />+#define INTC_INT2PRI3 (INTC_BASE+0x4000c)<br />+#define INTC_INT2PRI4 (INTC_BASE+0x40010)<br />+#define INTC_INT2PRI5 (INTC_BASE+0x40014)<br />+#define INTC_INT2PRI6 (INTC_BASE+0x40018)<br />+#define INTC_INT2PRI7 (INTC_BASE+0x4001c)<br />+#define INTC_INT2A0 (INTC_BASE+0x40030)<br />+#define INTC_INT2A1 (INTC_BASE+0x40034)<br />+#define INTC_INT2MSKR (INTC_BASE+0x40038)<br />+#define INTC_INT2MSKCR (INTC_BASE+0x4003c)<br />+#define INTC_INT2B0 (INTC_BASE+0x40040)<br />+#define INTC_INT2B1 (INTC_BASE+0x40044)<br />+#define INTC_INT2B2 (INTC_BASE+0x40048)<br />+#define INTC_INT2B3 (INTC_BASE+0x4004c)<br />+#define INTC_INT2B4 (INTC_BASE+0x40050)<br />+#define INTC_INT2B5 (INTC_BASE+0x40054)<br />+#define INTC_INT2B6 (INTC_BASE+0x40058)<br />+#define INTC_INT2B7 (INTC_BASE+0x4005c)<br />+#define INTC_INT2GPIC (INTC_BASE+0x40090)<br />+/*<br />+ NOTE:<br />+ *_IRQ = (INTEVT2 - 0x200)/0x20<br />+*/<br />+/* IRQ 0-7 line external int*/<br />+#define IRQ0_IRQ 2<br />+#define IRQ0_IPR_ADDR INTC_INTPRI<br />+#define IRQ0_IPR_POS 7<br />+#define IRQ0_PRIORITY 2<br />+<br />+#define IRQ1_IRQ 4<br />+#define IRQ1_IPR_ADDR INTC_INTPRI<br />+#define IRQ1_IPR_POS 6<br />+#define IRQ1_PRIORITY 2<br />+<br />+#define IRQ2_IRQ 6<br />+#define IRQ2_IPR_ADDR INTC_INTPRI<br />+#define IRQ2_IPR_POS 5<br />+#define IRQ2_PRIORITY 2<br />+<br />+#define IRQ3_IRQ 8<br />+#define IRQ3_IPR_ADDR INTC_INTPRI<br />+#define IRQ3_IPR_POS 4<br />+#define IRQ3_PRIORITY 2<br />+<br />+#define IRQ4_IRQ 10<br />+#define IRQ4_IPR_ADDR INTC_INTPRI<br />+#define IRQ4_IPR_POS 3<br />+#define IRQ4_PRIORITY 2<br />+<br />+#define IRQ5_IRQ 12<br />+#define IRQ5_IPR_ADDR INTC_INTPRI<br />+#define IRQ5_IPR_POS 2<br />+#define IRQ5_PRIORITY 2<br />+<br />+#define IRQ6_IRQ 14<br />+#define IRQ6_IPR_ADDR INTC_INTPRI<br />+#define IRQ6_IPR_POS 1<br />+#define IRQ6_PRIORITY 2<br />+<br />+#define IRQ7_IRQ 0<br />+#define IRQ7_IPR_ADDR INTC_INTPRI<br />+#define IRQ7_IPR_POS 0<br />+#define IRQ7_PRIORITY 2<br />+<br />+/* TMU */<br />+/* ch0 */<br />+#define TMU_IRQ 28<br />+#define TMU_IPR_ADDR INTC_INT2PRI0<br />+#define TMU_IPR_POS 3<br />+#define TMU_PRIORITY 2<br />+<br />+#define TIMER_IRQ 28<br />+#define TIMER_IPR_ADDR INTC_INT2PRI0<br />+#define TIMER_IPR_POS 3<br />+#define TIMER_PRIORITY 2<br />+<br />+/* ch 1*/<br />+#define TMU_CH1_IRQ 29<br />+#define TMU_CH1_IPR_ADDR INTC_INT2PRI0<br />+#define TMU_CH1_IPR_POS 2<br />+#define TMU_CH1_PRIORITY 2<br />+<br />+#define TIMER1_IRQ 29<br />+#define TIMER1_IPR_ADDR INTC_INT2PRI0<br />+#define TIMER1_IPR_POS 2<br />+#define TIMER1_PRIORITY 2<br />+<br />+/* ch 2*/<br />+#define TMU_CH2_IRQ 30<br />+#define TMU_CH2_IPR_ADDR INTC_INT2PRI0<br />+#define TMU_CH2_IPR_POS 1<br />+#define TMU_CH2_PRIORITY 2<br />+/* ch 2 Input capture */<br />+#define TMU_CH2IC_IRQ 31<br />+#define TMU_CH2IC_IPR_ADDR INTC_INT2PRI0<br />+#define TMU_CH2IC_IPR_POS 0<br />+#define TMU_CH2IC_PRIORITY 2<br />+/* ch 3 */<br />+#define TMU_CH3_IRQ 96<br />+#define TMU_CH3_IPR_ADDR INTC_INT2PRI1<br />+#define TMU_CH3_IPR_POS 3<br />+#define TMU_CH3_PRIORITY 2<br />+/* ch 4 */<br />+#define TMU_CH4_IRQ 97<br />+#define TMU_CH4_IPR_ADDR INTC_INT2PRI1<br />+#define TMU_CH4_IPR_POS 2<br />+#define TMU_CH4_PRIORITY 2<br />+/* ch 5*/<br />+#define TMU_CH5_IRQ 98<br />+#define TMU_CH5_IPR_ADDR INTC_INT2PRI1<br />+#define TMU_CH5_IPR_POS 1<br />+#define TMU_CH5_PRIORITY 2<br />+<br />+#define RTC_IRQ 22<br />+#define RTC_IPR_ADDR INTC_INT2PRI1<br />+#define RTC_IPR_POS 0<br />+#define RTC_PRIORITY TIMER_PRIORITY<br />+<br />+/* SCIF0 */<br />+#define SCIF0_ERI_IRQ 40<br />+#define SCIF0_RXI_IRQ 41<br />+#define SCIF0_BRI_IRQ 42<br />+#define SCIF0_TXI_IRQ 43<br />+#define SCIF0_IPR_ADDR INTC_INT2PRI2<br />+#define SCIF0_IPR_POS 3<br />+#define SCIF0_PRIORITY 3<br />+<br />+/* SCIF1 */<br />+#define SCIF1_ERI_IRQ 76<br />+#define SCIF1_RXI_IRQ 77<br />+#define SCIF1_BRI_IRQ 78<br />+#define SCIF1_TXI_IRQ 79<br />+#define SCIF1_IPR_ADDR INTC_INT2PRI2<br />+#define SCIF1_IPR_POS 2<br />+#define SCIF1_PRIORITY 3<br />+<br />+#define WDT_IRQ 27<br />+#define WDT_IPR_ADDR INTC_INT2PRI2<br />+#define WDT_IPR_POS 1<br />+#define WDT_PRIORITY 2<br />+<br />+/* DMAC(0) */<br />+#define DMINT0_IRQ 34<br />+#define DMINT1_IRQ 35<br />+#define DMINT2_IRQ 36<br />+#define DMINT3_IRQ 37<br />+#define DMINT4_IRQ 44<br />+#define DMINT5_IRQ 45<br />+#define DMINT6_IRQ 46<br />+#define DMINT7_IRQ 47<br />+#define DMAE_IRQ 38<br />+#define DMA0_IPR_ADDR INTC_INT2PRI3<br />+#define DMA0_IPR_POS 2<br />+#define DMA0_PRIORITY 7<br />+<br />+/* DMAC(1) */<br />+#define DMINT8_IRQ 92<br />+#define DMINT9_IRQ 93<br />+#define DMINT10_IRQ 94<br />+#define DMINT11_IRQ 95<br />+#define DMA1_IPR_ADDR INTC_INT2PRI3<br />+#define DMA1_IPR_POS 1<br />+#define DMA1_PRIORITY 7<br />+<br />+#define DMTE0_IRQ DMINT0_IRQ<br />+#define DMTE4_IRQ DMINT4_IRQ<br />+#define DMA_IPR_ADDR DMA0_IPR_ADDR<br />+#define DMA_IPR_POS DMA0_IPR_POS<br />+#define DMA_PRIORITY DMA0_PRIORITY<br />+<br />+/* CMT */<br />+#define CMT_IRQ 56<br />+#define CMT_IPR_ADDR INTC_INT2PRI4<br />+#define CMT_IPR_POS 3<br />+#define CMT_PRIORITY 0<br />+<br />+/* HAC */<br />+#define HAC_IRQ 60<br />+#define HAC_IPR_ADDR INTC_INT2PRI4<br />+#define HAC_IPR_POS 2<br />+#define CMT_PRIORITY 0<br />+<br />+/* PCIC(0) */<br />+#define PCIC0_IRQ 64<br />+#define PCIC0_IPR_ADDR INTC_INT2PRI4<br />+#define PCIC0_IPR_POS 1<br />+#define PCIC0_PRIORITY 2<br />+<br />+/* PCIC(1) */<br />+#define PCIC1_IRQ 65<br />+#define PCIC1_IPR_ADDR INTC_INT2PRI4<br />+#define PCIC1_IPR_POS 0<br />+#define PCIC1_PRIORITY 2<br />+<br />+/* PCIC(2) */<br />+#define PCIC2_IRQ 66<br />+#define PCIC2_IPR_ADDR INTC_INT2PRI5<br />+#define PCIC2_IPR_POS 3<br />+#define PCIC2_PRIORITY 2<br />+<br />+/* PCIC(3) */<br />+#define PCIC3_IRQ 67<br />+#define PCIC3_IPR_ADDR INTC_INT2PRI5<br />+#define PCIC3_IPR_POS 2<br />+#define PCIC3_PRIORITY 2<br />+<br />+/* PCIC(4) */<br />+#define PCIC4_IRQ 68<br />+#define PCIC4_IPR_ADDR INTC_INT2PRI5<br />+#define PCIC4_IPR_POS 1<br />+#define PCIC4_PRIORITY 2<br />+<br />+/* PCIC(5) */<br />+#define PCICERR_IRQ 69<br />+#define PCICPWD3_IRQ 70<br />+#define PCICPWD2_IRQ 71<br />+#define PCICPWD1_IRQ 72<br />+#define PCICPWD0_IRQ 73<br />+#define PCIC5_IPR_ADDR INTC_INT2PRI5<br />+#define PCIC5_IPR_POS 0<br />+#define PCIC5_PRIORITY 2<br />+<br />+/* SIOF */<br />+#define SIOF_IRQ 80<br />+#define SIOF_IPR_ADDR INTC_INT2PRI6<br />+#define SIOF_IPR_POS 3<br />+#define SIOF_PRIORITY 3<br />+<br />+/* HSPI */<br />+#define HSPI_IRQ 84<br />+#define HSPI_IPR_ADDR INTC_INT2PRI6<br />+#define HSPI_IPR_POS 2<br />+#define HSPI_PRIORITY 3<br />+<br />+/* MMCIF */<br />+#define MMCIF_FSTAT_IRQ 88<br />+#define MMCIF_TRAN_IRQ 89<br />+#define MMCIF_ERR_IRQ 90<br />+#define MMCIF_FRDY_IRQ 91<br />+#define MMCIF_IPR_ADDR INTC_INT2PRI6<br />+#define MMCIF_IPR_POS 1<br />+#define HSPI_PRIORITY 3<br />+<br />+/* SSI */<br />+#define SSI_IRQ 100<br />+#define SSI_IPR_ADDR INTC_INT2PRI6<br />+#define SSI_IPR_POS 0<br />+#define SSI_PRIORITY 3<br />+<br />+/* FLCTL */<br />+#define FLCTL_FLSTE_IRQ 104<br />+#define FLCTL_FLTEND_IRQ 105<br />+#define FLCTL_FLTRQ0_IRQ 106<br />+#define FLCTL_FLTRQ1_IRQ 107<br />+#define FLCTL_IPR_ADDR INTC_INT2PRI7<br />+#define FLCTL_IPR_POS 3<br />+#define FLCTL_PRIORITY 3<br />+<br />+/* GPIO */<br />+#define GPIO0_IRQ 108<br />+#define GPIO1_IRQ 109<br />+#define GPIO2_IRQ 110<br />+#define GPIO3_IRQ 111<br />+#define GPIO_IPR_ADDR INTC_INT2PRI7<br />+#define GPIO_IPR_POS 2<br />+#define GPIO_PRIORITY 3<br />+<br />+/* ONCHIP_NR_IRQS */<br />+#define NR_IRQS 150 /* 111 + 16 */<br />+<br />+/* In a generic kernel, NR_IRQS is an upper bound, and we should use<br />+ * ACTUAL_NR_IRQS (which uses the machine vector) to get the correct value.<br />+ */<br />+#define ACTUAL_NR_IRQS NR_IRQS<br />+<br />+extern void disable_irq(unsigned int);<br />+extern void disable_irq_nosync(unsigned int);<br />+extern void enable_irq(unsigned int);<br />+<br />+/*<br />+ * Simple Mask Register Support<br />+ */<br />+extern void make_maskreg_irq(unsigned int irq);<br />+extern unsigned short *irq_mask_register;<br />+<br />+/*<br />+ * Function for "on chip support modules".<br />+ */<br />+extern void make_imask_irq(unsigned int irq);<br />+<br />+#define INTC_TMU0_MSK 0<br />+#define INTC_TMU3_MSK 1<br />+#define INTC_RTC_MSK 2<br />+#define INTC_SCIF0_MSK 3<br />+#define INTC_SCIF1_MSK 4<br />+#define INTC_WDT_MSK 5<br />+#define INTC_HUID_MSK 7<br />+#define INTC_DMAC0_MSK 8<br />+#define INTC_DMAC1_MSK 9<br />+#define INTC_CMT_MSK 12<br />+#define INTC_HAC_MSK 13<br />+#define INTC_PCIC0_MSK 14<br />+#define INTC_PCIC1_MSK 15<br />+#define INTC_PCIC2_MSK 16<br />+#define INTC_PCIC3_MSK 17<br />+#define INTC_PCIC4_MSK 18<br />+#define INTC_PCIC5_MSK 19<br />+#define INTC_SIOF_MSK 20<br />+#define INTC_HSPI_MSK 21<br />+#define INTC_MMCIF_MSK 22<br />+#define INTC_SSI_MSK 23<br />+#define INTC_FLCTL_MSK 24<br />+#define INTC_GPIO_MSK 25<br />+<br />+#endif /* __ASM_SH_IRQ_SH7780_H */<br />diff -urN -X exclude linux-2.6.15/include/asm-sh/irq.h sh-2.6.15/include/asm-sh/irq.h<br />--- linux-2.6.15/include/asm-sh/irq.h 2005-11-12 20:18:07.000000000 +0200<br />+++ sh-2.6.15/include/asm-sh/irq.h 2006-01-07 22:13:59.279138493 +0200<br />&#64;&#64; -15,13 +15,20 &#64;&#64;<br /> #include &lt;asm/machvec.h&gt;<br /> #include &lt;asm/ptrace.h&gt; /* for pt_regs */<br /> <br />-#if defined(CONFIG_SH_HP600) || \<br />+#if defined(CONFIG_SH_HP6XX) || \<br /> defined(CONFIG_SH_RTS7751R2D) || \<br /> defined(CONFIG_SH_HS7751RVOIP) || \<br />- defined(CONFIG_SH_SH03)<br />+ defined(CONFIG_SH_HS7751RVOIP) || \<br />+ defined(CONFIG_SH_SH03) || \<br />+ defined(CONFIG_SH_R7780RP) || \<br />+ defined(CONFIG_SH_LANDISK)<br /> #include &lt;asm/mach/ide.h&gt;<br /> #endif<br /> <br />+#ifndef CONFIG_CPU_SUBTYPE_SH7780<br />+<br />+#define INTC_DMAC0_MSK 0<br />+<br /> #if defined(CONFIG_CPU_SH3)<br /> #define INTC_IPRA 0xfffffee2UL<br /> #define INTC_IPRB 0xfffffee4UL<br />&#64;&#64; -235,8 +242,9 &#64;&#64;<br /> #define SCIF1_IPR_ADDR INTC_IPRB<br /> #define SCIF1_IPR_POS 1<br /> #define SCIF1_PRIORITY 3<br />-#endif<br />-#endif<br />+#endif /* ST40STB1 */<br />+<br />+#endif /* 775x / SH4-202 / ST40STB1 */<br /> <br /> /* NR_IRQS is made from three components:<br /> * 1. ONCHIP_NR_IRQS - number of IRLS + on-chip peripherial modules<br />&#64;&#64; -245,37 +253,35 &#64;&#64;<br /> */<br /> <br /> /* 1. ONCHIP_NR_IRQS */<br />-#ifdef CONFIG_SH_GENERIC<br />+#if defined(CONFIG_CPU_SUBTYPE_SH7604)<br />+# define ONCHIP_NR_IRQS 24 // Actually 21<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7707)<br />+# define ONCHIP_NR_IRQS 64<br />+# define PINT_NR_IRQS 16<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7708)<br />+# define ONCHIP_NR_IRQS 32<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7709) || \<br />+ defined(CONFIG_CPU_SUBTYPE_SH7705)<br />+# define ONCHIP_NR_IRQS 64 // Actually 61<br />+# define PINT_NR_IRQS 16<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7750)<br />+# define ONCHIP_NR_IRQS 48 // Actually 44<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7751)<br />+# define ONCHIP_NR_IRQS 72<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7760)<br />+# define ONCHIP_NR_IRQS 112 /* XXX */<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH4_202)<br />+# define ONCHIP_NR_IRQS 72<br />+#elif defined(CONFIG_CPU_SUBTYPE_ST40STB1)<br />+# define ONCHIP_NR_IRQS 144<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7300)<br />+# define ONCHIP_NR_IRQS 109<br />+#elif defined(CONFIG_SH_UNKNOWN) /* Most be last */<br /> # define ONCHIP_NR_IRQS 144<br />-#else<br />-# if defined(CONFIG_CPU_SUBTYPE_SH7604)<br />-# define ONCHIP_NR_IRQS 24 // Actually 21<br />-# elif defined(CONFIG_CPU_SUBTYPE_SH7707)<br />-# define ONCHIP_NR_IRQS 64<br />-# define PINT_NR_IRQS 16<br />-# elif defined(CONFIG_CPU_SUBTYPE_SH7708)<br />-# define ONCHIP_NR_IRQS 32<br />-# elif defined(CONFIG_CPU_SUBTYPE_SH7709) || \<br />- defined(CONFIG_CPU_SUBTYPE_SH7705)<br />-# define ONCHIP_NR_IRQS 64 // Actually 61<br />-# define PINT_NR_IRQS 16<br />-# elif defined(CONFIG_CPU_SUBTYPE_SH7750)<br />-# define ONCHIP_NR_IRQS 48 // Actually 44<br />-# elif defined(CONFIG_CPU_SUBTYPE_SH7751)<br />-# define ONCHIP_NR_IRQS 72<br />-# elif defined(CONFIG_CPU_SUBTYPE_SH7760)<br />-# define ONCHIP_NR_IRQS 110<br />-# elif defined(CONFIG_CPU_SUBTYPE_SH4_202)<br />-# define ONCHIP_NR_IRQS 72<br />-# elif defined(CONFIG_CPU_SUBTYPE_ST40STB1)<br />-# define ONCHIP_NR_IRQS 144<br />-# elif defined(CONFIG_CPU_SUBTYPE_SH7300)<br />-# define ONCHIP_NR_IRQS 109<br />-# endif<br /> #endif<br /> <br /> /* 2. PINT_NR_IRQS */<br />-#ifdef CONFIG_SH_GENERIC<br />+#ifdef CONFIG_SH_UNKNOWN<br /> # define PINT_NR_IRQS 16<br /> #else<br /> # ifndef PINT_NR_IRQS<br />&#64;&#64; -288,22 +294,22 &#64;&#64;<br /> #endif<br /> <br /> /* 3. OFFCHIP_NR_IRQS */<br />-#ifdef CONFIG_SH_GENERIC<br />+#if defined(CONFIG_HD64461)<br />+# define OFFCHIP_NR_IRQS 18<br />+#elif defined (CONFIG_SH_BIGSUR) /* must be before CONFIG_HD64465 */<br />+# define OFFCHIP_NR_IRQS 48<br />+#elif defined(CONFIG_HD64465)<br /> # define OFFCHIP_NR_IRQS 16<br />+#elif defined (CONFIG_SH_EC3104)<br />+# define OFFCHIP_NR_IRQS 16<br />+#elif defined (CONFIG_SH_DREAMCAST)<br />+# define OFFCHIP_NR_IRQS 96<br />+#elif defined (CONFIG_SH_TITAN)<br />+# define OFFCHIP_NR_IRQS 4<br />+#elif defined(CONFIG_SH_UNKNOWN)<br />+# define OFFCHIP_NR_IRQS 16 /* Must also be last */<br /> #else<br />-# if defined(CONFIG_HD64461)<br />-# define OFFCHIP_NR_IRQS 18<br />-# elif defined (CONFIG_SH_BIGSUR) /* must be before CONFIG_HD64465 */<br />-# define OFFCHIP_NR_IRQS 48<br />-# elif defined(CONFIG_HD64465)<br />-# define OFFCHIP_NR_IRQS 16<br />-# elif defined (CONFIG_SH_EC3104)<br />-# define OFFCHIP_NR_IRQS 16<br />-# elif defined (CONFIG_SH_DREAMCAST)<br />-# define OFFCHIP_NR_IRQS 96<br />-# else<br />-# define OFFCHIP_NR_IRQS 0<br />-# endif<br />+# define OFFCHIP_NR_IRQS 0<br /> #endif<br /> <br /> #if OFFCHIP_NR_IRQS &gt; 0<br />&#64;&#64; -313,16 +319,6 &#64;&#64;<br /> /* NR_IRQS. 1+2+3 */<br /> #define NR_IRQS (ONCHIP_NR_IRQS + PINT_NR_IRQS + OFFCHIP_NR_IRQS)<br /> <br />-/* In a generic kernel, NR_IRQS is an upper bound, and we should use<br />- * ACTUAL_NR_IRQS (which uses the machine vector) to get the correct value.<br />- */<br />-#ifdef CONFIG_SH_GENERIC<br />-# define ACTUAL_NR_IRQS (sh_mv.mv_nr_irqs)<br />-#else<br />-# define ACTUAL_NR_IRQS NR_IRQS<br />-#endif<br />-<br />-<br /> extern void disable_irq(unsigned int);<br /> extern void disable_irq_nosync(unsigned int);<br /> extern void enable_irq(unsigned int);<br />&#64;&#64; -542,9 +538,6 &#64;&#64;<br /> <br /> extern int ipr_irq_demux(int irq);<br /> #define __irq_demux(irq) ipr_irq_demux(irq)<br />-<br />-#else<br />-#define __irq_demux(irq) irq<br /> #endif /* CONFIG_CPU_SUBTYPE_SH7707 || CONFIG_CPU_SUBTYPE_SH7709 */<br /> <br /> #if defined(CONFIG_CPU_SUBTYPE_SH7750) || defined(CONFIG_CPU_SUBTYPE_SH7751) || \<br />&#64;&#64; -557,18 +550,35 &#64;&#64;<br /> #define INTC_ICR_IRLM (1&lt;&lt;7)<br /> #endif<br /> <br />-#ifdef CONFIG_CPU_SUBTYPE_ST40STB1<br />+#else<br />+#include &lt;asm/irq-sh7780.h&gt;<br />+#endif<br /> <br />+/* SH with INTC2-style interrupts */<br />+#ifdef CONFIG_CPU_HAS_INTC2_IRQ<br />+#if defined(CONFIG_CPU_SUBTYPE_ST40STB1)<br />+#define INTC2_BASE 0xfe080000<br /> #define INTC2_FIRST_IRQ 64<br />-#define NR_INTC2_IRQS 25<br />-<br />+#define INTC2_INTREQ_OFFSET 0x20<br />+#define INTC2_INTMSK_OFFSET 0x40<br />+#define INTC2_INTMSKCLR_OFFSET 0x60<br />+#define NR_INTC2_IRQS 25<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7760)<br /> #define INTC2_BASE 0xfe080000<br />-#define INTC2_INTC2MODE (INTC2_BASE+0x80)<br />-<br />-#define INTC2_INTPRI_OFFSET 0x00<br />+#define INTC2_FIRST_IRQ 48 /* INTEVT 0x800 */<br /> #define INTC2_INTREQ_OFFSET 0x20<br /> #define INTC2_INTMSK_OFFSET 0x40<br /> #define INTC2_INTMSKCLR_OFFSET 0x60<br />+#define NR_INTC2_IRQS 64<br />+#elif defined(CONFIG_CPU_SUBTYPE_SH7780)<br />+#define INTC2_BASE 0xffd40000<br />+#define INTC2_FIRST_IRQ 22<br />+#define INTC2_INTMSK_OFFSET (0x38)<br />+#define INTC2_INTMSKCLR_OFFSET (0x3c)<br />+#define NR_INTC2_IRQS 60<br />+#endif<br />+<br />+#define INTC2_INTPRI_OFFSET 0x00<br /> <br /> void make_intc2_irq(unsigned int irq,<br /> unsigned int ipr_offset, unsigned int ipr_shift,<br />&#64;&#64; -577,13 +587,16 &#64;&#64;<br /> void init_IRQ_intc2(void);<br /> void intc2_add_clear_irq(int irq, int (*fn)(int));<br /> <br />-#endif /* CONFIG_CPU_SUBTYPE_ST40STB1 */<br />+#endif<br /> <br /> static inline int generic_irq_demux(int irq)<br /> {<br /> return irq;<br /> }<br /> <br />+#ifndef __irq_demux<br />+#define __irq_demux(irq) (irq)<br />+#endif<br /> #define irq_canonicalize(irq) (irq)<br /> #define irq_demux(irq) __irq_demux(sh_mv.mv_irq_demux(irq))<br />-<br />To unsubscribe from this list: send the line "unsubscribe linux-kernel" in<br />the body of a message to majordomo&#64;vger.kernel.org<br />More majordomo info at <a href="http://vger.kernel.org/majordomo-info.html">http://vger.kernel.org/majordomo-info.html</a><br />Please read the FAQ at <a href="http://www.tux.org/lkml/">http://www.tux.org/lkml/</a><br /></pre></td><td width="32" rowspan="2" class="c" valign="top"><img src="/images/icornerr.gif" width="32" height="32" alt="\" /></td></tr><tr><td align="right" valign="bottom"> 聽 </td></tr><tr><td align="right" valign="bottom">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerl.gif" width="32" height="32" alt="\" /></td><td class="c">聽</td><td class="c" valign="bottom" style="padding-bottom: 0px"><img src="/images/bcornerr.gif" width="32" height="32" alt="/" /></td></tr><tr><td align="right" valign="top" colspan="2"> 聽 </td><td class="lm">Last update: 2006-01-14 23:56 聽聽 [from the cache]<br />漏2003-2020 <a href="http://blog.jasper.es/"><span itemprop="editor">Jasper Spaans</span></a>|hosted at <a href="https://www.digitalocean.com/?refcode=9a8e99d24cf9">Digital Ocean</a> and my Meterkast|<a href="http://blog.jasper.es/categories.html#lkml-ref">Read the blog</a></td><td>聽</td></tr></table><script language="javascript" src="/js/styleswitcher.js" type="text/javascript"></script></body></html>

Pages: 1 2 3 4 5 6 7 8 9 10