From patchwork Mon May 24 16:25:15 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Martyn Welch X-Patchwork-Id: 101901 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by demeter.kernel.org (8.14.3/8.14.3) with ESMTP id o4OGPL0I021833 for ; Mon, 24 May 2010 16:25:21 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1757666Ab0EXQZU (ORCPT ); Mon, 24 May 2010 12:25:20 -0400 Received: from exprod5og105.obsmtp.com ([64.18.0.180]:57578 "EHLO exprod5og105.obsmtp.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1757652Ab0EXQZT (ORCPT ); Mon, 24 May 2010 12:25:19 -0400 Received: from source ([4.79.213.129]) (using TLSv1) by exprod5ob105.postini.com ([64.18.4.12]) with SMTP ID DSNKS/qobvDhaaWhbnnBA1cJ5n883ATjJUZ+@postini.com; Mon, 24 May 2010 09:25:19 PDT Received: from unknown (HELO cinmlip01.e2k.ad.ge.com) ([3.159.213.48]) by Alpmlip07.e2k.ad.ge.com with ESMTP; 24 May 2010 12:25:18 -0400 Received: from es-j7s4d2j.amer.consind.ge.com ([3.138.54.92]) by cinmlip01.e2k.ad.ge.com with ESMTP; 24 May 2010 12:25:18 -0400 From: Martyn Welch Subject: [PATCH v2] powerpc: Add i8042 keyboard and mouse irq parsing To: Grant Likely , benh@kernel.crashing.org Cc: Dmitry Torokhov , linuxppc-dev@ozlabs.org, linux-input@vger.kernel.org Date: Mon, 24 May 2010 17:25:15 +0100 Message-ID: <20100524162325.11133.8579.stgit@ES-J7S4D2J.amer.consind.ge.com> User-Agent: StGIT/0.13 MIME-Version: 1.0 Sender: linux-input-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-input@vger.kernel.org X-Greylist: IP, sender and recipient auto-whitelisted, not delayed by milter-greylist-4.2.3 (demeter.kernel.org [140.211.167.41]); Mon, 24 May 2010 16:25:21 +0000 (UTC) diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 48f0a00..7f1bb99 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c @@ -94,6 +94,10 @@ struct screen_info screen_info = { .orig_video_points = 16 }; +/* Variables required to store legacy IO irq routing */ +int of_i8042_kbd_irq; +int of_i8042_aux_irq; + #ifdef __DO_IRQ_CANON /* XXX should go elsewhere eventually */ int ppc_do_canonicalize_irqs; @@ -558,13 +562,52 @@ void probe_machine(void) /* Match a class of boards, not a specific device configuration. */ int check_legacy_ioport(unsigned long base_port) { - struct device_node *parent, *np = NULL; + struct device_node *parent, *np = NULL, *np_aux = NULL; int ret = -ENODEV; switch(base_port) { case I8042_DATA_REG: - if (!(np = of_find_compatible_node(NULL, NULL, "pnpPNP,303"))) - np = of_find_compatible_node(NULL, NULL, "pnpPNP,f03"); + np = of_find_compatible_node(NULL, NULL, "pnpPNP,303"); + if (np) { + /* Interrupt routing in parent node */ + parent = of_get_parent(np); + if (parent) { + /* + * Attempt to parse DTS for keyboard irq, + * fallback to standard. + */ + of_i8042_kbd_irq = irq_of_parse_and_map(parent, + 0); + if (!of_i8042_kbd_irq) + of_i8042_kbd_irq = 1; + + of_node_put(parent); + } + } + + np_aux = of_find_compatible_node(NULL, NULL, "pnpPNP,f03"); + if (np_aux) { + if (!np) { + of_node_put(np); + np = np_aux; + } + + /* Interrupt routing in parent node */ + parent = of_get_parent(np_aux); + if (parent) { + /* + * Attempt to parse DTS for mouse (aux) irq, + * fallback to standard. + */ + of_i8042_aux_irq = irq_of_parse_and_map(parent, + 1); + if (!of_i8042_aux_irq) + of_i8042_aux_irq = 12; + + of_node_put(parent); + } + } + if (np) { parent = of_get_parent(np); of_node_put(np); diff --git a/drivers/input/serio/i8042-io.h b/drivers/input/serio/i8042-io.h index 847f4aa..8fc8753 100644 --- a/drivers/input/serio/i8042-io.h +++ b/drivers/input/serio/i8042-io.h @@ -19,6 +19,11 @@ * IRQs. */ +#if defined(CONFIG_PPC) +extern int of_i8042_kbd_irq; +extern int of_i8042_aux_irq; +#endif + #ifdef __alpha__ # define I8042_KBD_IRQ 1 # define I8042_AUX_IRQ (RTC_PORT(0) == 0x170 ? 9 : 12) /* Jensen is special */ @@ -27,6 +32,9 @@ #include #elif defined(CONFIG_SH_CAYMAN) #include +#elif defined(CONFIG_PPC) +#define I8042_KBD_IRQ of_i8042_kbd_irq +#define I8042_AUX_IRQ of_i8042_aux_irq #else # define I8042_KBD_IRQ 1 # define I8042_AUX_IRQ 12