Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754267AbdDKK1i (ORCPT ); Tue, 11 Apr 2017 06:27:38 -0400 Received: from mx0a-0016f401.pphosted.com ([67.231.148.174]:33982 "EHLO mx0b-0016f401.pphosted.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1751685AbdDKK0C (ORCPT ); Tue, 11 Apr 2017 06:26:02 -0400 From: Jisheng Zhang To: , CC: , , , Jisheng Zhang Subject: [PATCH 2/2] mmc: sdhci: provide isr for card-detect interrupts Date: Tue, 11 Apr 2017 18:20:56 +0800 Message-ID: <20170411102056.2869-3-jszhang@marvell.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170411102056.2869-1-jszhang@marvell.com> References: <20170411102056.2869-1-jszhang@marvell.com> MIME-Version: 1.0 Content-Type: text/plain X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:,, definitions=2017-04-11_08:,, signatures=0 X-Proofpoint-Details: rule=outbound_notspam policy=outbound score=0 priorityscore=1501 malwarescore=0 suspectscore=0 phishscore=0 bulkscore=0 spamscore=0 clxscore=1015 lowpriorityscore=0 impostorscore=0 adultscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1702020001 definitions=main-1704110085 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 1536 Lines: 48 We found one issue on BG4CT platforms with GPIO for sdcar card detect interrupt: remove sdcard when there's read write access to the sdcard, sometimes the card remove event can't be handled for a long time, so the system still think the sdcard is still plugged in. It turns out that the sdhci_card_event() is missing in common slot gpio's card detect isr. We fix this issue by providing sdhci's own isr for card-detect interrupts. In this own isr, we call sdhci_card_event() then process the change of state. Signed-off-by: Jisheng Zhang --- drivers/mmc/host/sdhci.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/drivers/mmc/host/sdhci.c b/drivers/mmc/host/sdhci.c index 63bc33a54d0d..b6c5021a5892 100644 --- a/drivers/mmc/host/sdhci.c +++ b/drivers/mmc/host/sdhci.c @@ -2777,6 +2777,16 @@ static irqreturn_t sdhci_irq(int irq, void *dev_id) return result; } +static irqreturn_t sdhci_cd_irq(int irq, void *dev_id) +{ + struct mmc_host *mmc = dev_id; + struct sdhci_host *host = mmc_priv(mmc); + + mmc->ops->card_event(mmc); + mmc_detect_change(host->mmc, msecs_to_jiffies(200)); + return IRQ_HANDLED; +} + static irqreturn_t sdhci_thread_irq(int irq, void *dev_id) { struct sdhci_host *host = dev_id; @@ -3617,6 +3627,8 @@ int __sdhci_add_host(struct sdhci_host *host) sdhci_init(host, 0); + mmc_gpio_set_cd_isr(mmc, sdhci_cd_irq); + ret = request_threaded_irq(host->irq, sdhci_irq, sdhci_thread_irq, IRQF_SHARED, mmc_hostname(mmc), host); if (ret) { -- 2.11.0