Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp2901113pxb; Mon, 17 Jan 2022 07:57:37 -0800 (PST) X-Google-Smtp-Source: ABdhPJzPleHmI69gCnBT1hE4tPqGB4u+svQdGeNLkGif17rGY2V3U3jI+cGfu78IvhZ/DXWamC3f X-Received: by 2002:a17:903:32c8:b0:14a:695a:f381 with SMTP id i8-20020a17090332c800b0014a695af381mr23093365plr.156.1642435057285; Mon, 17 Jan 2022 07:57:37 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642435057; cv=none; d=google.com; s=arc-20160816; b=M43BCQiv/4ediERcZYd1nfY5KicSHeevyFNzx3TJBWI6T/JVTfk1wgIHTnO0qdvDBz i2+n4At//BFTI+gSfFMcAI676aLxuq4oEa426BpeRO9I5gldaBTaS4cb7U8AHk2ROmQN +gtnhWoz0DUY35PdA7z67hNHpDGOidTYHwyp6Vvkq6cU+Sis5sIlR9DG5FxaXD/zB6nQ 6gGulmslppI8GoK87wjYZnNyvPxclQzOS9R/iGEhmgHFftYWW/QQgYajCIvMgjKdV3ib JFG+u5xlcvelYnUivExGv3dM/Ra4eg4sJVefpAbOIZVN+/r37lvJrWbwC0T5sQlAjn+Z 2JHA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from; bh=I2ihdQuEsCN70Apr4n75QP2rk7hr9gCSa1H5DCtoMgI=; b=YS7liuWWMrydxD4rtPMhHazS98qYwXpWxQZlQj6J34pxSUb/khHgkhh4CVZB+WVfj4 h/B8SbxI4YD7I9HClO2r7FtZBX0i593y3eAfFIyCVW53g3byBhtFZK0MXXH+czgekg4X 8p/OU8EQ1igaW/DqYSYCuZob3ZgZuMgQ9+RYgv7YD0+shP6tx1RkZLYnR7txedy+e/Dr K5CcmjTHXnpLQifEZmrj3z1BMG0k1WBkY3vEoo6YZHBmcYjFL9yvwVyt7BDCcTB5GNIe qCMZnEYMIkN43ExujVhFida3svO5FWdwje2QzTjZ4QLTX9ZSqZRmLfk5+4EYnjqHvD+m QRlQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id u185si5924265pgd.282.2022.01.17.07.57.25; Mon, 17 Jan 2022 07:57:37 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=mediatek.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S232341AbiAQHMi (ORCPT + 99 others); Mon, 17 Jan 2022 02:12:38 -0500 Received: from mailgw01.mediatek.com ([60.244.123.138]:46574 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S233293AbiAQHMd (ORCPT ); Mon, 17 Jan 2022 02:12:33 -0500 X-UUID: abcb8049a4344e7c8688b8cf0b50afc4-20220117 X-UUID: abcb8049a4344e7c8688b8cf0b50afc4-20220117 Received: from mtkcas10.mediatek.inc [(172.21.101.39)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 187564446; Mon, 17 Jan 2022 15:12:30 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs07n1.mediatek.inc (172.21.101.16) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Mon, 17 Jan 2022 15:12:29 +0800 Received: from localhost.localdomain (10.17.3.154) by mtkcas11.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Mon, 17 Jan 2022 15:12:28 +0800 From: Axe Yang To: Ulf Hansson , Rob Herring , Chaotian Jing , Matthias Brugger , Adrian Hunter CC: Yoshihiro Shimoda , Satya Tangirala , Andy Shevchenko , Wolfram Sang , Axe Yang , Lucas Stach , Eric Biggers , Andrew Jeffery , Stephen Boyd , Kiwoong Kim , Yue Hu , Tian Tao , , , , , , Subject: [PATCH 2/3] mmc: core: Add support for SDIO async interrupt Date: Mon, 17 Jan 2022 15:12:19 +0800 Message-ID: <20220117071220.17330-3-axe.yang@mediatek.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220117071220.17330-1-axe.yang@mediatek.com> References: <20220117071220.17330-1-axe.yang@mediatek.com> MIME-Version: 1.0 Content-Transfer-Encoding: 7BIT Content-Type: text/plain; charset=US-ASCII X-MTK: N Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org If cap-sdio-async-irq flag is set in host dts node, parse EAI information from SDIO CCCR interrupt externsion segment. If async interrupt is supported by SDIO card then send command to card to enable it and set enable_async_irq flag in sdio_cccr structure to 1. The parse flow is implemented in sdio_read_cccr(). Acked-by: AngeloGioacchino Del Regno Signed-off-by: Axe Yang --- drivers/mmc/core/host.c | 2 ++ drivers/mmc/core/sdio.c | 17 +++++++++++++++++ include/linux/mmc/card.h | 3 ++- include/linux/mmc/host.h | 1 + include/linux/mmc/sdio.h | 5 +++++ 5 files changed, 27 insertions(+), 1 deletion(-) diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index cf140f4ec864..a972241548b4 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -410,6 +410,8 @@ int mmc_of_parse(struct mmc_host *host) if (device_property_read_bool(dev, "no-mmc-hs400")) host->caps2 &= ~(MMC_CAP2_HS400_1_8V | MMC_CAP2_HS400_1_2V | MMC_CAP2_HS400_ES); + if (device_property_read_bool(dev, "cap-sdio-async-irq")) + host->caps2 |= MMC_CAP2_SDIO_ASYNC_IRQ; /* Must be after "non-removable" check */ if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { diff --git a/drivers/mmc/core/sdio.c b/drivers/mmc/core/sdio.c index 41164748723d..771fb5d18585 100644 --- a/drivers/mmc/core/sdio.c +++ b/drivers/mmc/core/sdio.c @@ -225,6 +225,23 @@ static int sdio_read_cccr(struct mmc_card *card, u32 ocr) card->sw_caps.sd3_drv_type |= SD_DRIVER_TYPE_C; if (data & SDIO_DRIVE_SDTD) card->sw_caps.sd3_drv_type |= SD_DRIVER_TYPE_D; + + if (card->host->caps2 & MMC_CAP2_SDIO_ASYNC_IRQ) { + ret = mmc_io_rw_direct(card, 0, 0, SDIO_CCCR_INTERRUPT_EXT, 0, + &data); + if (ret) + goto out; + + if (data & SDIO_INTERRUPT_EXT_SAI) { + data |= SDIO_INTERRUPT_EXT_EAI; + ret = mmc_io_rw_direct(card, 1, 0, SDIO_CCCR_INTERRUPT_EXT, + data, NULL); + if (ret) + goto out; + + card->cccr.enable_async_irq = 1; + } + } } /* if no uhs mode ensure we check for high speed */ diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h index 37f975875102..4df9182bc0e6 100644 --- a/include/linux/mmc/card.h +++ b/include/linux/mmc/card.h @@ -219,7 +219,8 @@ struct sdio_cccr { wide_bus:1, high_power:1, high_speed:1, - disable_cd:1; + disable_cd:1, + enable_async_irq:1; }; struct sdio_cis { diff --git a/include/linux/mmc/host.h b/include/linux/mmc/host.h index 7afb57cab00b..502a5418264c 100644 --- a/include/linux/mmc/host.h +++ b/include/linux/mmc/host.h @@ -402,6 +402,7 @@ struct mmc_host { #define MMC_CAP2_CRYPTO 0 #endif #define MMC_CAP2_ALT_GPT_TEGRA (1 << 28) /* Host with eMMC that has GPT entry at a non-standard location */ +#define MMC_CAP2_SDIO_ASYNC_IRQ (1 << 29) /* SDIO host supports asynchronous interrupt */ int fixed_drv_type; /* fixed driver type for non-removable media */ diff --git a/include/linux/mmc/sdio.h b/include/linux/mmc/sdio.h index 2a05d1ac4f0e..1ef400f28642 100644 --- a/include/linux/mmc/sdio.h +++ b/include/linux/mmc/sdio.h @@ -159,6 +159,11 @@ #define SDIO_DTSx_SET_TYPE_A (1 << SDIO_DRIVE_DTSx_SHIFT) #define SDIO_DTSx_SET_TYPE_C (2 << SDIO_DRIVE_DTSx_SHIFT) #define SDIO_DTSx_SET_TYPE_D (3 << SDIO_DRIVE_DTSx_SHIFT) + +#define SDIO_CCCR_INTERRUPT_EXT 0x16 +#define SDIO_INTERRUPT_EXT_SAI (1 << 0) +#define SDIO_INTERRUPT_EXT_EAI (1 << 1) + /* * Function Basic Registers (FBR) */ -- 2.25.1