Received: by 2002:a05:6a10:af89:0:0:0:0 with SMTP id iu9csp2957712pxb; Mon, 17 Jan 2022 09:00:36 -0800 (PST) X-Google-Smtp-Source: ABdhPJzaaY6F1RpTCErI5F9eK1E6YbJoT8+/XalJzIGUpSILV3o5e5+mQsKDT36IgxbgARt0fFYt X-Received: by 2002:a17:90b:2252:: with SMTP id hk18mr6695858pjb.53.1642438835794; Mon, 17 Jan 2022 09:00:35 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1642438835; cv=none; d=google.com; s=arc-20160816; b=zp1uyQ74o3xEw5FSCS1kHwaQIzLPWrlHpa3IsZWoHtS5d46hS8axt/RE1YCyuR7dpr dxJ6oEZTB/uFG23b7z08GYOjZjXv4jfNzqco4imUFkrkOZqwmLYtMyKPvcWpdyicQGlE y9iyHsjUlPKnmHpnVxCA2+zpZN+0Yrgc6haglUF6JSF5bLAYXG0ktJ2f53cFm+VYmTBS yHvvtTk3O/FXXLG0dDb3RKWVYG0mPjFI4Ub2AYk/JhSsKIOFxO8oV+n682cUFShgiGgd A3EFE0BhMfkloMXtO7WepJ3gO6TIgZZdCh9SYj/pLxYtV13Eou5SgMCO871yDSqArPv7 EQiQ== 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=j60We3n8EsYlkjXHBAbvBjLd1xrPp9q4HIbjLKc8EbRwwIhCfkzyWSld6ZmbED+1Yk WKmOkUl/mhcd0md50Plh/zZjij23e0rQxvf4eRc4NpGZlKrZemy8N1raHxJn+i8UPNHI c0eAZq/B9yeW/5UTDpGJxBmiIdHxnAFqcQ6OXS/XLavRIbKhMsVMgDIyeGdM+EzLNdPu Re6RLmIewUhfAZ2jYJ+NPv2+7b8u6DR/3zOptdwqmn5SpfG7C0UZHnr6ncs5FcKBDYsJ 77S6mybJI1O047Ofp92JyaNDKeSImFHzsRdFFtZoJNCTOd+1sPKGCMeuvevfcQ6OaZ2p bang== 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 mp17si17093347pjb.44.2022.01.17.09.00.22; Mon, 17 Jan 2022 09:00:35 -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 S238096AbiAQI0E (ORCPT + 99 others); Mon, 17 Jan 2022 03:26:04 -0500 Received: from mailgw01.mediatek.com ([60.244.123.138]:46736 "EHLO mailgw01.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S238079AbiAQI0A (ORCPT ); Mon, 17 Jan 2022 03:26:00 -0500 X-UUID: af56425bf82342bb9c0e7c269051e853-20220117 X-UUID: af56425bf82342bb9c0e7c269051e853-20220117 Received: from mtkcas11.mediatek.inc [(172.21.101.40)] by mailgw01.mediatek.com (envelope-from ) (Generic MTA with TLSv1.2 ECDHE-RSA-AES256-SHA384 256/256) with ESMTP id 670344733; Mon, 17 Jan 2022 16:25:57 +0800 Received: from mtkcas11.mediatek.inc (172.21.101.40) by mtkmbs10n1.mediatek.inc (172.21.101.34) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384) id 15.2.792.15; Mon, 17 Jan 2022 16:25:56 +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 16:25:54 +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: [RESEND v3 2/3] mmc: core: Add support for SDIO async interrupt Date: Mon, 17 Jan 2022 16:25:38 +0800 Message-ID: <20220117082539.18713-3-axe.yang@mediatek.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220117082539.18713-1-axe.yang@mediatek.com> References: <20220117082539.18713-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