From patchwork Thu Oct 3 15:52:56 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Greg Kroah-Hartman X-Patchwork-Id: 175162 Delivered-To: patch@linaro.org Received: by 2002:a92:7e96:0:0:0:0:0 with SMTP id q22csp578852ill; Thu, 3 Oct 2019 09:47:43 -0700 (PDT) X-Google-Smtp-Source: APXvYqxnR9EQQykXLrsamruwfpCb24uDMZO3OGA/9ISJVRUkjGE/x4+mFtIIuxHq56WHlgwBBAxW X-Received: by 2002:a50:e718:: with SMTP id a24mr10608790edn.289.1570121263385; Thu, 03 Oct 2019 09:47:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1570121263; cv=none; d=google.com; s=arc-20160816; b=ukZ/OkeBEnz8hTvNLoXoUnA17nRO8ohwZ4k4Pz4CYjWC9iHeTIrabGgih/GnuTQmEB TM9S5lOZ4IA83qofmHK8S4XyWGG5uv9N9TJDQ4fwq0ILo6AzcWStaIhmskD/nknPZuTg Ncd348lnsCsf06GaHlVGDGmakE/t/gS29CG2IGnbN312s1fFhu50yM1PRUTRj7a7v/mi zhqHrgx4hZDGekkuQ2mbhgUn6Xc3iIA0Y0CmS9ahabc+1d3g06hNh6+OHNoN2e2Lk36I DDfjEWJitXENweZiKsYsp5FwGBbCCDnnIY0QObJ8x1STMM78EVjzerJPO1ff3da3r4Dp Nmzg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :user-agent:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature; bh=WQOBTEIzsv07ILh61mY90MH4XlQMjbDffp9gqdfr29o=; b=lrI455Kgr4vT2TcJrHHPGW+Iy4hmPJSnXeLn25KC1z7GkxjYhy8L73t7sr5SvDox2b 4aCHSqPiUm7Su4YqEV3UwKMChyiSmlBTdqtXsfIyPMQvzEDjGfUOFA3jt3kIaIjjGlFX CaN1VwwdlaKq8owkflYHQHxlD6T8BscwYp5Mi7kGgXRL4/BZ6NzlZsXqqXzZrixPCoBF 5kn15c4LNQqTAIoXiDiYT6knmz7gXkG64Tbys14on12HbdDvdORc3QjfNbr1olEQf+b7 E7vveya8TLPgIGe5lMMnBoQv9OeHF8CWVJqmn3YbIVt3/0SGYI+WMw1sycawTSt6xAIy hBeA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=default header.b=KFl0yU4v; 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 Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id b42si1857543eda.367.2019.10.03.09.47.43; Thu, 03 Oct 2019 09:47:43 -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=@kernel.org header.s=default header.b=KFl0yU4v; 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 Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2405527AbfJCQrm (ORCPT + 27 others); Thu, 3 Oct 2019 12:47:42 -0400 Received: from mail.kernel.org ([198.145.29.99]:33014 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405290AbfJCQrh (ORCPT ); Thu, 3 Oct 2019 12:47:37 -0400 Received: from localhost (83-86-89-107.cable.dynamic.v4.ziggo.nl [83.86.89.107]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPSA id 42CB621848; Thu, 3 Oct 2019 16:47:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=default; t=1570121256; bh=tNKTrgo6pekEMV7o4Yg/oW12mfaytm7NtZ+DZIXJrIo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=KFl0yU4vP0N2nc1iQMt54+J5quF0FkgrW8vpTpgluFUZPJ1VUOWo6daaucoeQ9s+4 7GSRV6+9D+0K2/J1B879VrnuiKTyQ9YxS+xGoAqmwv+BE9Ptbg6+b60Qil5ZqPfhAh 1OgcQkVEj10cBt+iBdyFfRqBHa0uBVoInFfm44nk= From: Greg Kroah-Hartman To: linux-kernel@vger.kernel.org Cc: Greg Kroah-Hartman , stable@vger.kernel.org, Matthias Kaehlcke , Ulf Hansson , Douglas Anderson , Sasha Levin Subject: [PATCH 5.3 211/344] mmc: core: Clarify sdio_irq_pending flag for MMC_CAP2_SDIO_IRQ_NOTHREAD Date: Thu, 3 Oct 2019 17:52:56 +0200 Message-Id: <20191003154601.098886365@linuxfoundation.org> X-Mailer: git-send-email 2.23.0 In-Reply-To: <20191003154540.062170222@linuxfoundation.org> References: <20191003154540.062170222@linuxfoundation.org> User-Agent: quilt/0.66 MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: Ulf Hansson [ Upstream commit 36d57efb4af534dd6b442ea0b9a04aa6dfa37abe ] The sdio_irq_pending flag is used to let host drivers indicate that it has signaled an IRQ. If that is the case and we only have a single SDIO func that have claimed an SDIO IRQ, our assumption is that we can avoid reading the SDIO_CCCR_INTx register and just call the SDIO func irq handler immediately. This makes sense, but the flag is set/cleared in a somewhat messy order, let's fix that up according to below. First, the flag is currently set in sdio_run_irqs(), which is executed as a work that was scheduled from sdio_signal_irq(). To make it more implicit that the host have signaled an IRQ, let's instead immediately set the flag in sdio_signal_irq(). This also makes the behavior consistent with host drivers that uses the legacy, mmc_signal_sdio_irq() API. This have no functional impact, because we don't expect host drivers to call sdio_signal_irq() until after the work (sdio_run_irqs()) have been executed anyways. Second, currently we never clears the flag when using the sdio_run_irqs() work, but only when using the sdio_irq_thread(). Let make the behavior consistent, by moving the flag to be cleared inside the common process_sdio_pending_irqs() function. Additionally, tweak the behavior of the flag slightly, by avoiding to clear it unless we processed the SDIO IRQ. The purpose with this at this point, is to keep the information about whether there have been an SDIO IRQ signaled by the host, so at system resume we can decide to process it without reading the SDIO_CCCR_INTx register. Tested-by: Matthias Kaehlcke Reviewed-by: Matthias Kaehlcke Signed-off-by: Ulf Hansson Reviewed-by: Douglas Anderson Signed-off-by: Ulf Hansson Signed-off-by: Sasha Levin --- drivers/mmc/core/sdio_irq.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) -- 2.20.1 diff --git a/drivers/mmc/core/sdio_irq.c b/drivers/mmc/core/sdio_irq.c index 0bcc5e83bd1a0..40109a6159228 100644 --- a/drivers/mmc/core/sdio_irq.c +++ b/drivers/mmc/core/sdio_irq.c @@ -31,6 +31,7 @@ static int process_sdio_pending_irqs(struct mmc_host *host) { struct mmc_card *card = host->card; int i, ret, count; + bool sdio_irq_pending = host->sdio_irq_pending; unsigned char pending; struct sdio_func *func; @@ -38,13 +39,16 @@ static int process_sdio_pending_irqs(struct mmc_host *host) if (mmc_card_suspended(card)) return 0; + /* Clear the flag to indicate that we have processed the IRQ. */ + host->sdio_irq_pending = false; + /* * Optimization, if there is only 1 function interrupt registered * and we know an IRQ was signaled then call irq handler directly. * Otherwise do the full probe. */ func = card->sdio_single_irq; - if (func && host->sdio_irq_pending) { + if (func && sdio_irq_pending) { func->irq_handler(func); return 1; } @@ -96,7 +100,6 @@ static void sdio_run_irqs(struct mmc_host *host) { mmc_claim_host(host); if (host->sdio_irqs) { - host->sdio_irq_pending = true; process_sdio_pending_irqs(host); if (host->ops->ack_sdio_irq) host->ops->ack_sdio_irq(host); @@ -114,6 +117,7 @@ void sdio_irq_work(struct work_struct *work) void sdio_signal_irq(struct mmc_host *host) { + host->sdio_irq_pending = true; queue_delayed_work(system_wq, &host->sdio_irq_work, 0); } EXPORT_SYMBOL_GPL(sdio_signal_irq); @@ -159,7 +163,6 @@ static int sdio_irq_thread(void *_host) if (ret) break; ret = process_sdio_pending_irqs(host); - host->sdio_irq_pending = false; mmc_release_host(host); /*