From patchwork Mon Sep 16 08:32:00 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Thierry Reding X-Patchwork-Id: 275163 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 0D19F2C00E4 for ; Mon, 16 Sep 2013 18:35:54 +1000 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754945Ab3IPIfj (ORCPT ); Mon, 16 Sep 2013 04:35:39 -0400 Received: from mail-bk0-f49.google.com ([209.85.214.49]:59090 "EHLO mail-bk0-f49.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1756293Ab3IPIdW (ORCPT ); Mon, 16 Sep 2013 04:33:22 -0400 Received: by mail-bk0-f49.google.com with SMTP id r7so1321888bkg.36 for ; Mon, 16 Sep 2013 01:33:20 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=JQ06vm3mOT6vhyASO1NZxMDlOfAUwQAfgswsZv94mWA=; b=IhweJYDXYxL7jqCbzhXiwEI9c+bw0ggDhDLUND2sItVHE4RTNAMRg+0u0enKi/ieK3 8YB41v7ISQVYX0MQz8taU+uA6XjowZJ4J5WjSpLNSoBGfMt8uQnuVuxH1/yJqXRjg2Xi mnHcfMfEkDlsZ/gG3PZfHKoTJ2jLXDIJFzrjsuwlgZkAH+0zl+ByttHDfRxfGhIlHhX3 QbWjwTclstG8RWVBawduNkmaeesWB8NZiriDBJ4ND9g+zqNKBHUic4GzJ0VDx41Lseqr ZnQhEOXfvjilNBa1cjPa9HFsWu8LnY2Gf7ZHTMvH2RftO9/wEk8IvHpKv1ZCnaFAHl8x wmGA== X-Received: by 10.205.76.133 with SMTP id ze5mr665567bkb.37.1379320400573; Mon, 16 Sep 2013 01:33:20 -0700 (PDT) Received: from localhost (port-49886.pppoe.wtnet.de. [46.59.195.122]) by mx.google.com with ESMTPSA id z6sm6768234bkn.8.1969.12.31.16.00.00 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Mon, 16 Sep 2013 01:33:19 -0700 (PDT) From: Thierry Reding To: Greg Kroah-Hartman , Linus Walleij , Stephen Warren , Wolfram Sang , Grant Likely , Rob Herring , Benjamin Herrenschmidt , Thomas Gleixner Cc: linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, linux-tegra@vger.kernel.org, linux-i2c@vger.kernel.org, devicetree@vger.kernel.org Subject: [PATCH 3/9] irqdomain: Introduce __irq_create_of_mapping() Date: Mon, 16 Sep 2013 10:32:00 +0200 Message-Id: <1379320326-13241-4-git-send-email-treding@nvidia.com> X-Mailer: git-send-email 1.8.4 In-Reply-To: <1379320326-13241-1-git-send-email-treding@nvidia.com> References: <1379320326-13241-1-git-send-email-treding@nvidia.com> Sender: linux-i2c-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-i2c@vger.kernel.org This is a version of irq_create_of_mapping() that propagates the precise error code instead of returning 0 for all errors. It will be used in subsequent patches to allow further propagation of error codes. To avoid code duplication, implement irq_create_of_mapping() as a wrapper around the new __irq_create_of_mapping(). Signed-off-by: Thierry Reding --- include/linux/of_irq.h | 3 +++ kernel/irq/irqdomain.c | 39 +++++++++++++++++++++++++++++---------- 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/include/linux/of_irq.h b/include/linux/of_irq.h index 535cecf..c383dd1 100644 --- a/include/linux/of_irq.h +++ b/include/linux/of_irq.h @@ -63,6 +63,9 @@ extern int of_irq_map_raw(struct device_node *parent, const __be32 *intspec, struct of_irq *out_irq); extern int of_irq_map_one(struct device_node *device, int index, struct of_irq *out_irq); +extern int __irq_create_of_mapping(struct device_node *controller, + const u32 *intspec, unsigned int intsize, + unsigned int *virqp); extern unsigned int irq_create_of_mapping(struct device_node *controller, const u32 *intspec, unsigned int intsize); diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c index d2a3b01..9867616 100644 --- a/kernel/irq/irqdomain.c +++ b/kernel/irq/irqdomain.c @@ -484,39 +484,58 @@ int irq_create_strict_mappings(struct irq_domain *domain, unsigned int irq_base, } EXPORT_SYMBOL_GPL(irq_create_strict_mappings); -unsigned int irq_create_of_mapping(struct device_node *controller, - const u32 *intspec, unsigned int intsize) +int __irq_create_of_mapping(struct device_node *controller, const u32 *intspec, + unsigned int intsize, unsigned int *virqp) { + unsigned int type = IRQ_TYPE_NONE; struct irq_domain *domain; irq_hw_number_t hwirq; - unsigned int type = IRQ_TYPE_NONE; unsigned int virq; + int ret; domain = controller ? irq_find_host(controller) : irq_default_domain; if (!domain) { pr_warn("no irq domain found for %s !\n", of_node_full_name(controller)); - return 0; + return -EPROBE_DEFER; } /* If domain has no translation, then we assume interrupt line */ if (domain->ops->xlate == NULL) hwirq = intspec[0]; else { - if (domain->ops->xlate(domain, controller, intspec, intsize, - &hwirq, &type)) - return 0; + ret = domain->ops->xlate(domain, controller, intspec, intsize, + &hwirq, &type); + if (ret) + return ret; } /* Create mapping */ - virq = irq_create_mapping(domain, hwirq); - if (!virq) - return virq; + ret = __irq_create_mapping(domain, hwirq, &virq); + if (ret) + return ret; /* Set type if specified and different than the current one */ if (type != IRQ_TYPE_NONE && type != irq_get_trigger_type(virq)) irq_set_irq_type(virq, type); + + if (virqp) + *virqp = virq; + + return 0; +} + +unsigned int irq_create_of_mapping(struct device_node *controller, + const u32 *intspec, unsigned int intsize) +{ + unsigned int virq; + int ret; + + ret = __irq_create_of_mapping(controller, intspec, intsize, &virq); + if (ret) + return 0; + return virq; } EXPORT_SYMBOL_GPL(irq_create_of_mapping);