Received: by 2002:ac0:98c7:0:0:0:0:0 with SMTP id g7-v6csp6351599imd; Wed, 31 Oct 2018 10:20:42 -0700 (PDT) X-Google-Smtp-Source: AJdET5dst/y9czx/Fy3KSCa+gOuneePHN9Pa/5KLg4Ya4AYF6FHh/trAWX0DtDnzCyIzcRuaUADE X-Received: by 2002:a17:902:8342:: with SMTP id z2-v6mr4195081pln.147.1541006442437; Wed, 31 Oct 2018 10:20:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1541006442; cv=none; d=google.com; s=arc-20160816; b=KaPTcJ1JKHJp5tWuqsWBqlsgXoEYS1kULUQqq1HC2LLFd1xOVBzt9iOUNv7LkWAhf3 cgMtRnm66kYE+ZGiRYUvKNuyIhUHiZzD55l2f6bOsYVCCdHqqREoj6omSy1o3BkciLzk /A3P4BZ/gTRu/HUS9soT15Fl8OwuF+4rFQh4tRtvkDYaRtXvoq3ERr9FAS79JNiT0WrQ tau+TLD7VJG5MiZiHc7ifLcPVGKh4qtLCB0pkPVXh3aTS4HLNX+gWl4CrCZSWIIt8bnX pqXsw50wQoYdO/w3tRvQ7PdWtDan7DhlvGPaMVZSenlEcPWI4oRRuGFrt6m67ZuFyWY3 qdyQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:user-agent:content-disposition :mime-version:message-id:subject:cc:to:from:date:dkim-signature; bh=zc1khfAyWUBOdyCwV25jhN5KvcyQAnzVbTRxc9EZz0w=; b=M3sfTOcLuo+nWn1NUUsEZJ/761dK3cjMVH3kfmxM9+EpmMzl3WaHWnuC8BK2E85LX1 iBuU+XI8AdXhJ8qSi/wQJT7rSP1/eeRlhe7+RvpQF/tlQyoABziXT0RMAz3CWckZTGq9 +7TsRjJTcaihnpmFY5Y7U1NPvrjg+JajYktY+aivJGkoIv/PplEjklPKSlUZiKsmuCle p4k0oHAOFVMaqeJtqDoRPkyYdSPgf6w26UK6MyNkAEImcbMCUoH+hLgHqauDD5qyHizL Fkp1hfaiHLdioStOKfdAItGp/yMpBx7u0DWWATLfag5fV3SVCt7JY5ZCKhLxZ2QEFgNl ImzQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ngcRJtrb; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id v123-v6si25605605pfb.65.2018.10.31.10.20.26; Wed, 31 Oct 2018 10:20:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=ngcRJtrb; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729754AbeKACP4 (ORCPT + 99 others); Wed, 31 Oct 2018 22:15:56 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:43508 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1728128AbeKACPz (ORCPT ); Wed, 31 Oct 2018 22:15:55 -0400 Received: by mail-pf1-f194.google.com with SMTP id h4-v6so7913552pfi.10 for ; Wed, 31 Oct 2018 10:17:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=date:from:to:cc:subject:message-id:mime-version:content-disposition :user-agent; bh=zc1khfAyWUBOdyCwV25jhN5KvcyQAnzVbTRxc9EZz0w=; b=ngcRJtrbPPju3/owhv5DE1bhMXH+J7tl5kR9fODo+O7gQbmnMlNFbDLAPO7jOMC3cG d2SWbPCp5cbiMEbA+UM3MaVmqgW9mg8GZUkxUVjGBo7uHIQgT0z9t8qjyG9b+/jXap52 zPKMxFwbF4rV100XWb3czvsxi3QbHP+jZs280WPAG3DnmLdQoZU1x3tYDUB78L20D3/R eowrQwcwXPZy79YL3oUQBQdhZ9BkYMLfbSBPyx1Z0bXcrlAhTsanloI4qHCghbI8q9m2 SQ/Pwuk93jWtTohqEJlCBIQrA8kXwEwF3Bgd0veipfWFrxJUjpr8dJqD212CdXBSudmv JQOw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:mime-version :content-disposition:user-agent; bh=zc1khfAyWUBOdyCwV25jhN5KvcyQAnzVbTRxc9EZz0w=; b=Q+SULxX1PD683wzvUYEOtyybjb7H/JaQzX6G1lCsTKqrULjr7yqo1m3zIELpH3e088 ZcV8JsNZkM9pijOKcQ4VdFxwMKAXyMnaYpmtusEpOk5G3yckBpVQL8GIzfE6Mn9pXrR8 Q0QQiAE8ro8aPxVBnV9bNqLCOP5k8WZ/sZdp1tE600JWra2V5hTma9CvmM1ACr4QBd/q 9Q6/qAJ9uQRdbK6B3a8S3ZIelvToh6phxFe5CseHohNy+ohppSDrgVVIIZ2TegJoH4vj 8nC7itf/FRlvOIvuYG6FOYDT2Nj8/TfPC5BETz3wHRldMrAQvyu+swmRI/0R2OzU25I6 +uhQ== X-Gm-Message-State: AGRZ1gJj5mUGPaq6Z1rDJTTehQ3SaqDARRsiXzXLsxx1uVQJwxpwnVb1 bkVp4BwGN/kVHEwjiyZBxVk= X-Received: by 2002:a63:6c4a:: with SMTP id h71-v6mr3990075pgc.326.1541006220352; Wed, 31 Oct 2018 10:17:00 -0700 (PDT) Received: from nishad ([106.51.27.228]) by smtp.gmail.com with ESMTPSA id h2-v6sm5879263pfc.6.2018.10.31.10.16.57 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Wed, 31 Oct 2018 10:16:59 -0700 (PDT) Date: Wed, 31 Oct 2018 22:46:54 +0530 From: Nishad Kamdar To: Johan Hovold , Alex Elder , Greg Kroah-Hartman Cc: Rui Miguel Silva , greybus-dev@lists.linaro.org, devel@driverdev.osuosl.org, linux-kernel@vger.kernel.org Subject: [PATCH] greybus: gpio: switch GPIO portions to use GPIOLIB_IRQCHIP Message-ID: <20181031171649.GA16800@nishad> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.9.4 (2018-02-28) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Convert the GPIO driver to use the GPIO irqchip library GPIOLIB_IRQCHIP instead of reimplementing the same. Signed-off-by: Nishad Kamdar --- drivers/staging/greybus/Kconfig | 1 + drivers/staging/greybus/gpio.c | 123 ++++++-------------------------- 2 files changed, 21 insertions(+), 103 deletions(-) diff --git a/drivers/staging/greybus/Kconfig b/drivers/staging/greybus/Kconfig index ab096bcef98c..b571e4e8060b 100644 --- a/drivers/staging/greybus/Kconfig +++ b/drivers/staging/greybus/Kconfig @@ -148,6 +148,7 @@ if GREYBUS_BRIDGED_PHY config GREYBUS_GPIO tristate "Greybus GPIO Bridged PHY driver" depends on GPIOLIB + select GPIOLIB_IRQCHIP ---help--- Select this option if you have a device that follows the Greybus GPIO Bridged PHY Class specification. diff --git a/drivers/staging/greybus/gpio.c b/drivers/staging/greybus/gpio.c index b1d4698019a1..32c228bad33a 100644 --- a/drivers/staging/greybus/gpio.c +++ b/drivers/staging/greybus/gpio.c @@ -9,9 +9,7 @@ #include #include #include -#include -#include -#include +#include #include #include "greybus.h" @@ -40,8 +38,6 @@ struct gb_gpio_controller { struct gpio_chip chip; struct irq_chip irqc; struct irq_chip *irqchip; - struct irq_domain *irqdomain; - unsigned int irq_base; irq_flow_handler_t irq_handler; unsigned int irq_default_type; struct mutex irq_lock; @@ -365,6 +361,7 @@ static int gb_gpio_request_handler(struct gb_operation *op) { struct gb_connection *connection = op->connection; struct gb_gpio_controller *ggc = gb_connection_get_data(connection); + struct gpio_chip *gc = &ggc->chip; struct device *dev = &ggc->gbphy_dev->dev; struct gb_message *request; struct gb_gpio_irq_event_request *event; @@ -391,7 +388,7 @@ static int gb_gpio_request_handler(struct gb_operation *op) return -EINVAL; } - irq = irq_find_mapping(ggc->irqdomain, event->which); + irq = irq_find_mapping(gc->irq.domain, event->which); if (!irq) { dev_err(dev, "failed to find IRQ\n"); return -EINVAL; @@ -506,68 +503,6 @@ static int gb_gpio_controller_setup(struct gb_gpio_controller *ggc) return ret; } -/** - * gb_gpio_irq_map() - maps an IRQ into a GB gpio irqchip - * @d: the irqdomain used by this irqchip - * @irq: the global irq number used by this GB gpio irqchip irq - * @hwirq: the local IRQ/GPIO line offset on this GB gpio - * - * This function will set up the mapping for a certain IRQ line on a - * GB gpio by assigning the GB gpio as chip data, and using the irqchip - * stored inside the GB gpio. - */ -static int gb_gpio_irq_map(struct irq_domain *domain, unsigned int irq, - irq_hw_number_t hwirq) -{ - struct gpio_chip *chip = domain->host_data; - struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip); - - irq_set_chip_data(irq, ggc); - irq_set_chip_and_handler(irq, ggc->irqchip, ggc->irq_handler); - irq_set_noprobe(irq); - /* - * No set-up of the hardware will happen if IRQ_TYPE_NONE - * is passed as default type. - */ - if (ggc->irq_default_type != IRQ_TYPE_NONE) - irq_set_irq_type(irq, ggc->irq_default_type); - - return 0; -} - -static void gb_gpio_irq_unmap(struct irq_domain *d, unsigned int irq) -{ - irq_set_chip_and_handler(irq, NULL, NULL); - irq_set_chip_data(irq, NULL); -} - -static const struct irq_domain_ops gb_gpio_domain_ops = { - .map = gb_gpio_irq_map, - .unmap = gb_gpio_irq_unmap, -}; - -/** - * gb_gpio_irqchip_remove() - removes an irqchip added to a gb_gpio_controller - * @ggc: the gb_gpio_controller to remove the irqchip from - * - * This is called only from gb_gpio_remove() - */ -static void gb_gpio_irqchip_remove(struct gb_gpio_controller *ggc) -{ - unsigned int offset; - - /* Remove all IRQ mappings and delete the domain */ - if (ggc->irqdomain) { - for (offset = 0; offset < (ggc->line_max + 1); offset++) - irq_dispose_mapping(irq_find_mapping(ggc->irqdomain, - offset)); - irq_domain_remove(ggc->irqdomain); - } - - if (ggc->irqchip) - ggc->irqchip = NULL; -} - /** * gb_gpio_irqchip_add() - adds an irqchip to a gpio chip * @chip: the gpio chip to add the irqchip to @@ -595,8 +530,7 @@ static int gb_gpio_irqchip_add(struct gpio_chip *chip, unsigned int type) { struct gb_gpio_controller *ggc; - unsigned int offset; - unsigned int irq_base; + unsigned int err; if (!chip || !irqchip) return -EINVAL; @@ -606,35 +540,21 @@ static int gb_gpio_irqchip_add(struct gpio_chip *chip, ggc->irqchip = irqchip; ggc->irq_handler = handler; ggc->irq_default_type = type; - ggc->irqdomain = irq_domain_add_simple(NULL, - ggc->line_max + 1, first_irq, - &gb_gpio_domain_ops, chip); - if (!ggc->irqdomain) { - ggc->irqchip = NULL; - return -EINVAL; - } - /* - * Prepare the mapping since the irqchip shall be orthogonal to - * any gpio calls. If the first_irq was zero, this is - * necessary to allocate descriptors for all IRQs. - */ - for (offset = 0; offset < (ggc->line_max + 1); offset++) { - irq_base = irq_create_mapping(ggc->irqdomain, offset); - if (offset == 0) - ggc->irq_base = irq_base; + err = gpiochip_irqchip_add(chip, + irqchip, + first_irq, + ggc->irq_handler, + type + ); + if (err) { + ggc->irqchip = NULL; + return err; } return 0; } -static int gb_gpio_to_irq(struct gpio_chip *chip, unsigned int offset) -{ - struct gb_gpio_controller *ggc = gpio_chip_to_gb_gpio_controller(chip); - - return irq_find_mapping(ggc->irqdomain, offset); -} - static int gb_gpio_probe(struct gbphy_device *gbphy_dev, const struct gbphy_device_id *id) { @@ -693,7 +613,6 @@ static int gb_gpio_probe(struct gbphy_device *gbphy_dev, gpio->get = gb_gpio_get; gpio->set = gb_gpio_set; gpio->set_config = gb_gpio_set_config; - gpio->to_irq = gb_gpio_to_irq; gpio->base = -1; /* Allocate base dynamically */ gpio->ngpio = ggc->line_max + 1; gpio->can_sleep = true; @@ -702,24 +621,23 @@ static int gb_gpio_probe(struct gbphy_device *gbphy_dev, if (ret) goto exit_line_free; - ret = gb_gpio_irqchip_add(gpio, irqc, 0, - handle_level_irq, IRQ_TYPE_NONE); + ret = gpiochip_add(gpio); if (ret) { - dev_err(&gbphy_dev->dev, "failed to add irq chip: %d\n", ret); + dev_err(&gbphy_dev->dev, "failed to add gpio chip: %d\n", ret); goto exit_line_free; } - ret = gpiochip_add(gpio); + ret = gb_gpio_irqchip_add(gpio, irqc, 0, + handle_level_irq, IRQ_TYPE_NONE); if (ret) { - dev_err(&gbphy_dev->dev, "failed to add gpio chip: %d\n", ret); - goto exit_gpio_irqchip_remove; + dev_err(&gbphy_dev->dev, "failed to add irq chip: %d\n", ret); + gpiochip_remove(gpio); + goto exit_line_free; } gbphy_runtime_put_autosuspend(gbphy_dev); return 0; -exit_gpio_irqchip_remove: - gb_gpio_irqchip_remove(ggc); exit_line_free: kfree(ggc->lines); exit_connection_disable: @@ -743,7 +661,6 @@ static void gb_gpio_remove(struct gbphy_device *gbphy_dev) gb_connection_disable_rx(connection); gpiochip_remove(&ggc->chip); - gb_gpio_irqchip_remove(ggc); gb_connection_disable(connection); gb_connection_destroy(connection); kfree(ggc->lines); -- 2.17.1