From patchwork Wed Jul 19 12:20:14 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Bartosz Golaszewski X-Patchwork-Id: 790989 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=linux-gpio-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=bgdev-pl.20150623.gappssmtp.com header.i=@bgdev-pl.20150623.gappssmtp.com header.b="mxLHiz03"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3xCGMj28pvz9sNc for ; Wed, 19 Jul 2017 22:20:49 +1000 (AEST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753239AbdGSMUq (ORCPT ); Wed, 19 Jul 2017 08:20:46 -0400 Received: from mail-wr0-f175.google.com ([209.85.128.175]:36015 "EHLO mail-wr0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751228AbdGSMUo (ORCPT ); Wed, 19 Jul 2017 08:20:44 -0400 Received: by mail-wr0-f175.google.com with SMTP id y43so57819549wrd.3 for ; Wed, 19 Jul 2017 05:20:43 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bgdev-pl.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EKrRoP+VfFoBw/VoI0ZdE774QOFQmmx313wqqhiPWXk=; b=mxLHiz03eBRIjSlJ+q31507s8nvGrvHCUTca4rWPnRA+S8kIMFNCpWXjIhNvh5CPQh orlhzMOHwzPF/wyLxf3UNDGub5iPbcZCI3QuoRr9cPpuRhQrQB+/smhJhQKgDKZW6+qv nVAsKEuReHZMv/71fCKgo3lIEbO1jWVyDs9EVtAr7aiyxX5jeC+ZcckrsfwLqwQWhwlW OoYXZLmAtUXd1nb4Pn/TkaaCOaR0dSM7vJau26gS0U6+Ca2T9h43zBzaIbDHs33k3bun ReeGj7wNlHBER/gVNvARteeQs5BJWEURCshiZwKNKCoRog2H9FGLFeu5kg0CBmRVcxo8 zB/g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=EKrRoP+VfFoBw/VoI0ZdE774QOFQmmx313wqqhiPWXk=; b=etye3s01MhwORIEUwi6Xj/7iH3eRuJ8hIZHilty9UqMS3qd4s/lY0l16XuwSifBsnx AwTe27BAKtG6HC4FYPG1P1WDk9dfwB568zmC2Lv+dFLGU9pvoDtdqWcEc04ldvJ9Xlft YjiiKM81HA7taugdMJMCVDmQE0vRuh4AXVe4ut1KMKJVRzr0ohJmyxtNh6fLmx8cJP9R 393YzPTk/EgjBqapQvFtO3VPsLZj1gDbakx5+p60i2VgzHRxrRtZB35rts6WPVf+JrMl BGP+0kJp/Tm8D9m2Oov249B4dsV4rNC9b+MtQOMWcmXw1FrLGidSuSS6Yr+xQ0oyfTmj h5Lg== X-Gm-Message-State: AIVw111W4axNJppHrl8JghD+dzN8fyKktLqFitQh7rNJGD83scMRwePU xBEvDllbl4IBs56R X-Received: by 10.223.172.86 with SMTP id v80mr4445480wrc.112.1500466843155; Wed, 19 Jul 2017 05:20:43 -0700 (PDT) Received: from bgdev-debian.lan (dynamic-194-228-20-90.ipv4.broadband.iol.cz. [194.228.20.90]) by smtp.gmail.com with ESMTPSA id 127sm391529wmv.1.2017.07.19.05.20.41 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 19 Jul 2017 05:20:42 -0700 (PDT) From: Bartosz Golaszewski To: Linus Walleij , Thomas Gleixner , Marc Zyngier , Jonathan Corbet , Bamvor Jian Zhang , Jonathan Cameron , Lars-Peter Clausen Cc: linux-kernel@vger.kernel.org, linux-gpio@vger.kernel.org, linux-doc@vger.kernel.org, Bartosz Golaszewski Subject: [PATCH 3/3] gpio: mockup: use irq_sim Date: Wed, 19 Jul 2017 14:20:14 +0200 Message-Id: <1500466814-32679-4-git-send-email-brgl@bgdev.pl> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1500466814-32679-1-git-send-email-brgl@bgdev.pl> References: <1500466814-32679-1-git-send-email-brgl@bgdev.pl> Sender: linux-gpio-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-gpio@vger.kernel.org Shrink the driver by removing the code dealing with dummy interrupts and replacing it with calls to the irq_sim API. Signed-off-by: Bartosz Golaszewski Reviewed-by: Linus Walleij --- drivers/gpio/Kconfig | 2 +- drivers/gpio/gpio-mockup.c | 77 +++++----------------------------------------- 2 files changed, 8 insertions(+), 71 deletions(-) diff --git a/drivers/gpio/Kconfig b/drivers/gpio/Kconfig index f235eae04c16..e2264fb31f87 100644 --- a/drivers/gpio/Kconfig +++ b/drivers/gpio/Kconfig @@ -311,7 +311,7 @@ config GPIO_MOCKUP depends on GPIOLIB && SYSFS select GPIO_SYSFS select GPIOLIB_IRQCHIP - select IRQ_WORK + select IRQ_SIM help This enables GPIO Testing driver, which provides a way to test GPIO subsystem through sysfs(or char device) and debugfs. GPIO_SYSFS diff --git a/drivers/gpio/gpio-mockup.c b/drivers/gpio/gpio-mockup.c index a6565e128f9e..6db7163e6d98 100644 --- a/drivers/gpio/gpio-mockup.c +++ b/drivers/gpio/gpio-mockup.c @@ -20,7 +20,7 @@ #include #include #include -#include +#include #include #include @@ -47,18 +47,12 @@ enum { struct gpio_mockup_line_status { int dir; bool value; - bool irq_enabled; -}; - -struct gpio_mockup_irq_context { - struct irq_work work; - int irq; }; struct gpio_mockup_chip { struct gpio_chip gc; struct gpio_mockup_line_status *lines; - struct gpio_mockup_irq_context irq_ctx; + struct irq_sim irqsim; struct dentry *dbg_dir; }; @@ -144,65 +138,11 @@ static int gpio_mockup_name_lines(struct device *dev, return 0; } -static int gpio_mockup_to_irq(struct gpio_chip *chip, unsigned int offset) -{ - return chip->irq_base + offset; -} - -static void gpio_mockup_irqmask(struct irq_data *data) +static int gpio_mockup_to_irq(struct gpio_chip *gc, unsigned int offset) { - struct gpio_chip *gc = irq_data_get_irq_chip_data(data); struct gpio_mockup_chip *chip = gpiochip_get_data(gc); - chip->lines[data->irq - gc->irq_base].irq_enabled = false; -} - -static void gpio_mockup_irqunmask(struct irq_data *data) -{ - struct gpio_chip *gc = irq_data_get_irq_chip_data(data); - struct gpio_mockup_chip *chip = gpiochip_get_data(gc); - - chip->lines[data->irq - gc->irq_base].irq_enabled = true; -} - -static struct irq_chip gpio_mockup_irqchip = { - .name = GPIO_MOCKUP_NAME, - .irq_mask = gpio_mockup_irqmask, - .irq_unmask = gpio_mockup_irqunmask, -}; - -static void gpio_mockup_handle_irq(struct irq_work *work) -{ - struct gpio_mockup_irq_context *irq_ctx; - - irq_ctx = container_of(work, struct gpio_mockup_irq_context, work); - handle_simple_irq(irq_to_desc(irq_ctx->irq)); -} - -static int gpio_mockup_irqchip_setup(struct device *dev, - struct gpio_mockup_chip *chip) -{ - struct gpio_chip *gc = &chip->gc; - int irq_base, i; - - irq_base = devm_irq_alloc_descs(dev, -1, 0, gc->ngpio, 0); - if (irq_base < 0) - return irq_base; - - gc->irq_base = irq_base; - gc->irqchip = &gpio_mockup_irqchip; - - for (i = 0; i < gc->ngpio; i++) { - irq_set_chip(irq_base + i, gc->irqchip); - irq_set_chip_data(irq_base + i, gc); - irq_set_handler(irq_base + i, &handle_simple_irq); - irq_modify_status(irq_base + i, - IRQ_NOREQUEST | IRQ_NOAUTOEN, IRQ_NOPROBE); - } - - init_irq_work(&chip->irq_ctx.work, gpio_mockup_handle_irq); - - return 0; + return irq_sim_irqnum(&chip->irqsim, offset); } static ssize_t gpio_mockup_event_write(struct file *file, @@ -228,11 +168,8 @@ static ssize_t gpio_mockup_event_write(struct file *file, chip = priv->chip; gc = &chip->gc; - if (chip->lines[priv->offset].irq_enabled) { - gpiod_set_value_cansleep(desc, val); - priv->chip->irq_ctx.irq = gc->irq_base + priv->offset; - irq_work_queue(&priv->chip->irq_ctx.work); - } + gpiod_set_value_cansleep(desc, val); + irq_sim_fire(&chip->irqsim, priv->offset); return size; } @@ -319,7 +256,7 @@ static int gpio_mockup_add(struct device *dev, return ret; } - ret = gpio_mockup_irqchip_setup(dev, chip); + ret = devm_irq_sim_init(dev, &chip->irqsim, gc->ngpio); if (ret) return ret;