From patchwork Thu Nov 22 08:00:00 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nobuhiro Iwamatsu X-Patchwork-Id: 1784421 Return-Path: X-Original-To: patchwork-linux-sh@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork1.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork1.kernel.org (Postfix) with ESMTP id 190FA3FC23 for ; Thu, 22 Nov 2012 18:37:37 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754234Ab2KVShO (ORCPT ); Thu, 22 Nov 2012 13:37:14 -0500 Received: from mail-da0-f46.google.com ([209.85.210.46]:36242 "EHLO mail-da0-f46.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754094Ab2KVShF (ORCPT ); Thu, 22 Nov 2012 13:37:05 -0500 Received: by mail-da0-f46.google.com with SMTP id p5so2299468dak.19 for ; Thu, 22 Nov 2012 10:37:04 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references:x-gm-message-state; bh=EuGKW54Du66zK7btlvK5ZB+VHnMG4t3fdR2ARzOW8/c=; b=Lt7TyFyclnwi2CV8DznGw2zplM9tAu0fO8wuaACowa60V1dtwwbQZh/QHS5tCMDdNB n6PdevORfVM56cHENHMG46o3egPlMDSReS7F8Gr50pZ7KjGLV1NrE2aTRwRUAXU/sz+F hinDFKXvvZUaPCJ5nQH4sxHzCl1IFetB2tAUFiVZ8+3Xyk3jBth6OKVP2abIZfoDgprx b8hJFhkZvrs3pOLBz3bX/cLNU1jdPX8/e6dEIF21+ozb1WeS6E4oA5THlT+hU63dOTsE UrMiX0TMgbZ4DxTTX6t2WATnpGkOBPHwRfZ53RgocUUJtS6RasDMAugH8A9AWO6EsCKz +Deg== Received: by 10.68.137.167 with SMTP id qj7mr2289178pbb.148.1353571232536; Thu, 22 Nov 2012 00:00:32 -0800 (PST) Received: from xps-iwamatsu.renesas.com (49.14.32.202.bf.2iij.net. [202.32.14.49]) by mx.google.com with ESMTPS id s1sm1507624paz.0.2012.11.22.00.00.30 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 22 Nov 2012 00:00:31 -0800 (PST) From: Nobuhiro Iwamatsu To: linux-sh@vger.kernel.org, linux-arm-kernel@lists.infradead.org Cc: magnus.damm@gmail.com, horms@verge.net.au, Nobuhiro Iwamatsu , Magnus Damm Subject: [PATCH v5 03/15] ARM: mach-shmobile: Add support OF of INTC for r8a7740 Date: Thu, 22 Nov 2012 17:00:00 +0900 Message-Id: <1353571213-26006-4-git-send-email-nobuhiro.iwamatsu.yj@renesas.com> X-Mailer: git-send-email 1.7.10.4 In-Reply-To: <1353571213-26006-1-git-send-email-nobuhiro.iwamatsu.yj@renesas.com> References: <1353571213-26006-1-git-send-email-nobuhiro.iwamatsu.yj@renesas.com> X-Gm-Message-State: ALoCoQmMl5LXP5CPeBAbGxl2VXuQshacUGaCGYerl+SiVkS/rJlsJAcbwg1YZQFjJSRnxFd1bYwf Sender: linux-sh-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-sh@vger.kernel.org This CPU has three interrupt controllers (INTCA, INTCS and INTCA IRQ pins). This supports these. Cc: Magnus Damm Signed-off-by: Nobuhiro Iwamatsu Signed-off-by: Simon Horman --- v3 [Nobuhiro Iwamatsu] * Rework the r8a7740 DT INTC init code to reduce the number of #ifdefs. v2 [Simon Horman] * Use #ifdef instead of #if defined * Use CONFIG_OF in place of CONFIG_OF_SH_INTC * Allow OF and non OF code to be compiled in the same binary and provide r8a7740_init_irq_of() as a way to initialise INTC using DT while r8a7740_init_irq() still initialises INTC using the previous code paths. This is because we would like to be able to use a single configuration to compile a kernel for multiple boards and not all r8a7740 boards have DT support yet. v1 [Nobuhiro Iwamatsu] Update r8a7740 Signed-off-by: Nobuhiro Iwamatsu --- arch/arm/mach-shmobile/include/mach/common.h | 1 + arch/arm/mach-shmobile/intc-r8a7740.c | 69 +++++++++++++++++++++++--- 2 files changed, 64 insertions(+), 6 deletions(-) diff --git a/arch/arm/mach-shmobile/include/mach/common.h b/arch/arm/mach-shmobile/include/mach/common.h index d47e215..8402b5d 100644 --- a/arch/arm/mach-shmobile/include/mach/common.h +++ b/arch/arm/mach-shmobile/include/mach/common.h @@ -59,6 +59,7 @@ extern struct clk sh73a0_extal2_clk; extern struct clk sh73a0_extcki_clk; extern struct clk sh73a0_extalr_clk; +extern void r8a7740_init_irq_of(void); extern void r8a7740_init_irq(void); extern void r8a7740_map_io(void); extern void r8a7740_add_early_devices(void); diff --git a/arch/arm/mach-shmobile/intc-r8a7740.c b/arch/arm/mach-shmobile/intc-r8a7740.c index 9a69a31..a28e0ea 100644 --- a/arch/arm/mach-shmobile/intc-r8a7740.c +++ b/arch/arm/mach-shmobile/intc-r8a7740.c @@ -1,8 +1,9 @@ /* * R8A7740 processor support * - * Copyright (C) 2011 Renesas Solutions Corp. + * Copyright (C) 2011, 2012 Renesas Solutions Corp. * Copyright (C) 2011 Kuninori Morimoto + * Copyright (C) 2012 Nobuhiro Iwamatsu * * 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 @@ -623,15 +624,71 @@ static void intcs_demux(unsigned int irq, struct irq_desc *desc) generic_handle_irq(intcs_evt2irq(evtcodeas)); } -void __init r8a7740_init_irq(void) +static void __init r8a7740_init_intc(resource_size_t intcs0_start, + unsigned short vect) { - void __iomem *intevtsa = ioremap_nocache(0xffd20100, PAGE_SIZE); + void __iomem *intevtsa; + + /* demux using INTEVTSA */ + intevtsa = ioremap_nocache(intcs0_start + 0x100, PAGE_SIZE); + irq_set_handler_data(evt2irq(vect), (void *)intevtsa); + irq_set_chained_handler(evt2irq(vect), intcs_demux); +} + +#ifdef CONFIG_OF +static unsigned short intevtsa_vect; + +#define INTC_RES_MAX 2 +static struct { + struct intc_desc intc_desc; + struct resource intc_res[INTC_RES_MAX]; +} intc_data __initdata; + +static int __init intc_of_init(struct device_node *np, + struct device_node *parent) +{ + int ret, i; + + memset(&intc_data, 0, sizeof(intc_data)); + + for (i = 0; i < INTC_RES_MAX; i++) { + ret = of_address_to_resource(np, i, &intc_data.intc_res[i]); + if (ret < 0) + break; + } + + intc_data.intc_desc.name = (char *)of_node_full_name(np); + intc_data.intc_desc.resource = intc_data.intc_res; + intc_data.intc_desc.num_resources = i; + + ret = of_sh_intc_get_intc(np, &intc_data.intc_desc); + if (ret) + return ret; + of_sh_intc_get_intevtsa_vect(np, &intevtsa_vect); + + register_intc_controller(&intc_data.intc_desc); + return 0; +} + +static const struct of_device_id irq_of_match[] __initconst = { + { .compatible = "renesas,sh_intc", .data = intc_of_init }, + { /*sentinel*/ } +}; + +void __init r8a7740_init_irq_of(void) +{ + of_irq_init(irq_of_match); + + r8a7740_init_intc(0xffd20000, intevtsa_vect); +} +#endif /* CONFIG_OF */ + +void __init r8a7740_init_irq(void) +{ register_intc_controller(&intca_desc); register_intc_controller(&intca_irq_pins_desc); register_intc_controller(&intcs_desc); - /* demux using INTEVTSA */ - irq_set_handler_data(evt2irq(0xf80), (void *)intevtsa); - irq_set_chained_handler(evt2irq(0xf80), intcs_demux); + r8a7740_init_intc(intcs_resources[0].start, 0xf80); }