* [PATCH v5 0/5] mmc: mediatek: add mmc cqhci support @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu This series provides MediaTek cqhci implementations as below: - Extend mmc_of_parse() to parse CQE bindings - Remove redundant host CQE bindings - Refine msdc timeout api to reduce redundant code - MediaTek command queue support - dt-bindings for mt6779 v1 -> v2: - Add more patch details in commit message - Separate msdc timeout api refine to individual patch v2 -> v3: - Remove CR-Id, Change-Id and Feature in patches - Add Signed-off-by in patches v3 -> v4: - Refine CQE bindings in mmc_of_parse (Ulf Hansson) - Remove redundant host CQE bindings (Linux Walleij) v4 -> v5: - Add Acked-by and more maintainers Chun-Hung Wu (5): [1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings [2/5] mmc: host: Remove redundant CQE bindings [3/5] mmc: mediatek: refine msdc timeout api [4/5] mmc: mediatek: command queue support [5/5] dt-bindings: mmc: mediatek: Add document for mt6779 Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + drivers/mmc/core/host.c | 5 + drivers/mmc/host/mtk-sd.c | 151 +++++++++++++++++++++-- drivers/mmc/host/sdhci-brcmstb.c | 11 +- drivers/mmc/host/sdhci-msm.c | 3 +- drivers/mmc/host/sdhci-of-arasan.c | 3 - drivers/mmc/host/sdhci-tegra.c | 2 +- 7 files changed, 155 insertions(+), 21 deletions(-) -- 2.6.4 ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v5 0/5] mmc: mediatek: add mmc cqhci support @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel This series provides MediaTek cqhci implementations as below: - Extend mmc_of_parse() to parse CQE bindings - Remove redundant host CQE bindings - Refine msdc timeout api to reduce redundant code - MediaTek command queue support - dt-bindings for mt6779 v1 -> v2: - Add more patch details in commit message - Separate msdc timeout api refine to individual patch v2 -> v3: - Remove CR-Id, Change-Id and Feature in patches - Add Signed-off-by in patches v3 -> v4: - Refine CQE bindings in mmc_of_parse (Ulf Hansson) - Remove redundant host CQE bindings (Linux Walleij) v4 -> v5: - Add Acked-by and more maintainers Chun-Hung Wu (5): [1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings [2/5] mmc: host: Remove redundant CQE bindings [3/5] mmc: mediatek: refine msdc timeout api [4/5] mmc: mediatek: command queue support [5/5] dt-bindings: mmc: mediatek: Add document for mt6779 Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + drivers/mmc/core/host.c | 5 + drivers/mmc/host/mtk-sd.c | 151 +++++++++++++++++++++-- drivers/mmc/host/sdhci-brcmstb.c | 11 +- drivers/mmc/host/sdhci-msm.c | 3 +- drivers/mmc/host/sdhci-of-arasan.c | 3 - drivers/mmc/host/sdhci-tegra.c | 2 +- 7 files changed, 155 insertions(+), 21 deletions(-) -- 2.6.4 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v5 0/5] mmc: mediatek: add mmc cqhci support @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel This series provides MediaTek cqhci implementations as below: - Extend mmc_of_parse() to parse CQE bindings - Remove redundant host CQE bindings - Refine msdc timeout api to reduce redundant code - MediaTek command queue support - dt-bindings for mt6779 v1 -> v2: - Add more patch details in commit message - Separate msdc timeout api refine to individual patch v2 -> v3: - Remove CR-Id, Change-Id and Feature in patches - Add Signed-off-by in patches v3 -> v4: - Refine CQE bindings in mmc_of_parse (Ulf Hansson) - Remove redundant host CQE bindings (Linux Walleij) v4 -> v5: - Add Acked-by and more maintainers Chun-Hung Wu (5): [1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings [2/5] mmc: host: Remove redundant CQE bindings [3/5] mmc: mediatek: refine msdc timeout api [4/5] mmc: mediatek: command queue support [5/5] dt-bindings: mmc: mediatek: Add document for mt6779 Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + drivers/mmc/core/host.c | 5 + drivers/mmc/host/mtk-sd.c | 151 +++++++++++++++++++++-- drivers/mmc/host/sdhci-brcmstb.c | 11 +- drivers/mmc/host/sdhci-msm.c | 3 +- drivers/mmc/host/sdhci-of-arasan.c | 3 - drivers/mmc/host/sdhci-tegra.c | 2 +- 7 files changed, 155 insertions(+), 21 deletions(-) -- 2.6.4 _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v5 0/5] mmc: mediatek: add mmc cqhci support @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu This series provides MediaTek cqhci implementations as below: - Extend mmc_of_parse() to parse CQE bindings - Remove redundant host CQE bindings - Refine msdc timeout api to reduce redundant code - MediaTek command queue support - dt-bindings for mt6779 v1 -> v2: - Add more patch details in commit message - Separate msdc timeout api refine to individual patch v2 -> v3: - Remove CR-Id, Change-Id and Feature in patches - Add Signed-off-by in patches v3 -> v4: - Refine CQE bindings in mmc_of_parse (Ulf Hansson) - Remove redundant host CQE bindings (Linux Walleij) v4 -> v5: - Add Acked-by and more maintainers Chun-Hung Wu (5): [1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings [2/5] mmc: host: Remove redundant CQE bindings [3/5] mmc: mediatek: refine msdc timeout api [4/5] mmc: mediatek: command queue support [5/5] dt-bindings: mmc: mediatek: Add document for mt6779 Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + drivers/mmc/core/host.c | 5 + drivers/mmc/host/mtk-sd.c | 151 +++++++++++++++++++++-- drivers/mmc/host/sdhci-brcmstb.c | 11 +- drivers/mmc/host/sdhci-msm.c | 3 +- drivers/mmc/host/sdhci-of-arasan.c | 3 - drivers/mmc/host/sdhci-tegra.c | 2 +- 7 files changed, 155 insertions(+), 21 deletions(-) -- 2.6.4 ^ permalink raw reply [flat|nested] 53+ messages in thread
[parent not found: <1588031768-23677-1-git-send-email-chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>]
* [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings 2020-04-27 23:56 ` Chun-Hung Wu (?) (?) @ 2020-04-27 23:56 ` Chun-Hung Wu -1 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux-CoA6ZxLDdyEEUmgCuDUIdw, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list-dY08KVG/lbpWk0Htik3J/w, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Cc: kernel-team-z5hGa2qSFaRBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mmc-u79uwXL29TY76Z2rM5mHXA, linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, devicetree-u79uwXL29TY76Z2rM5mHXA, wsd_upstream-NuS5LvNUpcJWk0Htik3J/w, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, Chun-Hung Wu Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" in mmc_of_parse(). Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/core/host.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index c876872..47521c6 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) host->caps2 |= MMC_CAP2_NO_SD; if (device_property_read_bool(dev, "no-mmc")) host->caps2 |= MMC_CAP2_NO_MMC; + if (device_property_read_bool(dev, "supports-cqe")) + host->caps2 |= MMC_CAP2_CQE; + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { + host->caps2 |= MMC_CAP2_CQE_DCMD; + } /* Must be after "non-removable" check */ if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" in mmc_of_parse(). Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/core/host.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index c876872..47521c6 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) host->caps2 |= MMC_CAP2_NO_SD; if (device_property_read_bool(dev, "no-mmc")) host->caps2 |= MMC_CAP2_NO_MMC; + if (device_property_read_bool(dev, "supports-cqe")) + host->caps2 |= MMC_CAP2_CQE; + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { + host->caps2 |= MMC_CAP2_CQE_DCMD; + } /* Must be after "non-removable" check */ if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { -- 2.6.4 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" in mmc_of_parse(). Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/core/host.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index c876872..47521c6 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) host->caps2 |= MMC_CAP2_NO_SD; if (device_property_read_bool(dev, "no-mmc")) host->caps2 |= MMC_CAP2_NO_MMC; + if (device_property_read_bool(dev, "supports-cqe")) + host->caps2 |= MMC_CAP2_CQE; + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { + host->caps2 |= MMC_CAP2_CQE_DCMD; + } /* Must be after "non-removable" check */ if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { -- 2.6.4 _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" in mmc_of_parse(). Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/core/host.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c index c876872..47521c6 100644 --- a/drivers/mmc/core/host.c +++ b/drivers/mmc/core/host.c @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) host->caps2 |= MMC_CAP2_NO_SD; if (device_property_read_bool(dev, "no-mmc")) host->caps2 |= MMC_CAP2_NO_MMC; + if (device_property_read_bool(dev, "supports-cqe")) + host->caps2 |= MMC_CAP2_CQE; + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { + host->caps2 |= MMC_CAP2_CQE_DCMD; + } /* Must be after "non-removable" check */ if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings 2020-04-27 23:56 ` Chun-Hung Wu (?) (?) @ 2020-05-06 13:00 ` Veerabhadrarao Badiganti -1 siblings, 0 replies; 53+ messages in thread From: Veerabhadrarao Badiganti @ 2020-05-06 13:00 UTC (permalink / raw) To: Chun-Hung Wu, mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > in mmc_of_parse(). > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > --- > drivers/mmc/core/host.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > index c876872..47521c6 100644 > --- a/drivers/mmc/core/host.c > +++ b/drivers/mmc/core/host.c > @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > host->caps2 |= MMC_CAP2_NO_SD; > if (device_property_read_bool(dev, "no-mmc")) > host->caps2 |= MMC_CAP2_NO_MMC; > + if (device_property_read_bool(dev, "supports-cqe")) > + host->caps2 |= MMC_CAP2_CQE; This change is breaking emmc driver on qcom platforms where this dt property is defined. [ 1.543453] cqhci_deactivate+0xc/0x38 [ 1.545627] sdhci_msm_reset+0x40/0x58 [ 1.549447] sdhci_do_reset+0x48/0x7c [ 1.553180] __sdhci_read_caps+0x7c/0x214 [ 1.556913] sdhci_setup_host+0x58/0xce8 [ 1.560905] sdhci_msm_probe+0x588/0x8a4 [ 1.564900] platform_drv_probe+0x4c/0xb0 So, we cant have this flag defined before sdhci_setup_host(). I will have to clear this cap and re-enable it in our initialization. > + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { > + host->caps2 |= MMC_CAP2_CQE_DCMD; > + } > > /* Must be after "non-removable" check */ > if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-06 13:00 ` Veerabhadrarao Badiganti 0 siblings, 0 replies; 53+ messages in thread From: Veerabhadrarao Badiganti @ 2020-05-06 13:00 UTC (permalink / raw) To: Chun-Hung Wu, mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > in mmc_of_parse(). > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > --- > drivers/mmc/core/host.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > index c876872..47521c6 100644 > --- a/drivers/mmc/core/host.c > +++ b/drivers/mmc/core/host.c > @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > host->caps2 |= MMC_CAP2_NO_SD; > if (device_property_read_bool(dev, "no-mmc")) > host->caps2 |= MMC_CAP2_NO_MMC; > + if (device_property_read_bool(dev, "supports-cqe")) > + host->caps2 |= MMC_CAP2_CQE; This change is breaking emmc driver on qcom platforms where this dt property is defined. [ 1.543453] cqhci_deactivate+0xc/0x38 [ 1.545627] sdhci_msm_reset+0x40/0x58 [ 1.549447] sdhci_do_reset+0x48/0x7c [ 1.553180] __sdhci_read_caps+0x7c/0x214 [ 1.556913] sdhci_setup_host+0x58/0xce8 [ 1.560905] sdhci_msm_probe+0x588/0x8a4 [ 1.564900] platform_drv_probe+0x4c/0xb0 So, we cant have this flag defined before sdhci_setup_host(). I will have to clear this cap and re-enable it in our initialization. > + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { > + host->caps2 |= MMC_CAP2_CQE_DCMD; > + } > > /* Must be after "non-removable" check */ > if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-06 13:00 ` Veerabhadrarao Badiganti 0 siblings, 0 replies; 53+ messages in thread From: Veerabhadrarao Badiganti @ 2020-05-06 13:00 UTC (permalink / raw) To: Chun-Hung Wu, mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > in mmc_of_parse(). > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > --- > drivers/mmc/core/host.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > index c876872..47521c6 100644 > --- a/drivers/mmc/core/host.c > +++ b/drivers/mmc/core/host.c > @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > host->caps2 |= MMC_CAP2_NO_SD; > if (device_property_read_bool(dev, "no-mmc")) > host->caps2 |= MMC_CAP2_NO_MMC; > + if (device_property_read_bool(dev, "supports-cqe")) > + host->caps2 |= MMC_CAP2_CQE; This change is breaking emmc driver on qcom platforms where this dt property is defined. [ 1.543453] cqhci_deactivate+0xc/0x38 [ 1.545627] sdhci_msm_reset+0x40/0x58 [ 1.549447] sdhci_do_reset+0x48/0x7c [ 1.553180] __sdhci_read_caps+0x7c/0x214 [ 1.556913] sdhci_setup_host+0x58/0xce8 [ 1.560905] sdhci_msm_probe+0x588/0x8a4 [ 1.564900] platform_drv_probe+0x4c/0xb0 So, we cant have this flag defined before sdhci_setup_host(). I will have to clear this cap and re-enable it in our initialization. > + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { > + host->caps2 |= MMC_CAP2_CQE_DCMD; > + } > > /* Must be after "non-removable" check */ > if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-06 13:00 ` Veerabhadrarao Badiganti 0 siblings, 0 replies; 53+ messages in thread From: Veerabhadrarao Badiganti @ 2020-05-06 13:00 UTC (permalink / raw) To: Chun-Hung Wu, mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > in mmc_of_parse(). > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > --- > drivers/mmc/core/host.c | 5 +++++ > 1 file changed, 5 insertions(+) > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > index c876872..47521c6 100644 > --- a/drivers/mmc/core/host.c > +++ b/drivers/mmc/core/host.c > @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > host->caps2 |= MMC_CAP2_NO_SD; > if (device_property_read_bool(dev, "no-mmc")) > host->caps2 |= MMC_CAP2_NO_MMC; > + if (device_property_read_bool(dev, "supports-cqe")) > + host->caps2 |= MMC_CAP2_CQE; This change is breaking emmc driver on qcom platforms where this dt property is defined. [ 1.543453] cqhci_deactivate+0xc/0x38 [ 1.545627] sdhci_msm_reset+0x40/0x58 [ 1.549447] sdhci_do_reset+0x48/0x7c [ 1.553180] __sdhci_read_caps+0x7c/0x214 [ 1.556913] sdhci_setup_host+0x58/0xce8 [ 1.560905] sdhci_msm_probe+0x588/0x8a4 [ 1.564900] platform_drv_probe+0x4c/0xb0 So, we cant have this flag defined before sdhci_setup_host(). I will have to clear this cap and re-enable it in our initialization. > + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { > + host->caps2 |= MMC_CAP2_CQE_DCMD; > + } > > /* Must be after "non-removable" check */ > if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { ^ permalink raw reply [flat|nested] 53+ messages in thread
[parent not found: <9bc2454f-0b42-e256-7927-2564b56f369f-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>]
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings 2020-05-06 13:00 ` Veerabhadrarao Badiganti (?) (?) @ 2020-05-06 16:36 ` Ulf Hansson -1 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-06 16:36 UTC (permalink / raw) To: Veerabhadrarao Badiganti Cc: Chun-Hung Wu, Michał Mirosław, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, BCM Kernel Feedback, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti <vbadigan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> wrote: > > > On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > > Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > > in mmc_of_parse(). > > > > Signed-off-by: Chun-Hung Wu <chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> > > --- > > drivers/mmc/core/host.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > > index c876872..47521c6 100644 > > --- a/drivers/mmc/core/host.c > > +++ b/drivers/mmc/core/host.c > > @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > > host->caps2 |= MMC_CAP2_NO_SD; > > if (device_property_read_bool(dev, "no-mmc")) > > host->caps2 |= MMC_CAP2_NO_MMC; > > + if (device_property_read_bool(dev, "supports-cqe")) > > + host->caps2 |= MMC_CAP2_CQE; > > This change is breaking emmc driver on qcom platforms where this dt > property is defined. > > [ 1.543453] cqhci_deactivate+0xc/0x38 > [ 1.545627] sdhci_msm_reset+0x40/0x58 > [ 1.549447] sdhci_do_reset+0x48/0x7c > [ 1.553180] __sdhci_read_caps+0x7c/0x214 > [ 1.556913] sdhci_setup_host+0x58/0xce8 > [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > [ 1.564900] platform_drv_probe+0x4c/0xb0 > > So, we cant have this flag defined before sdhci_setup_host(). > > I will have to clear this cap and re-enable it in our initialization. Thanks for reporting! I have dropped all the four patches from Chun-Hung, so we can figure out how to fix this. Please help to review the next version of the series. > > > + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { > > + host->caps2 |= MMC_CAP2_CQE_DCMD; > > + } > > > > /* Must be after "non-removable" check */ > > if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { Kind regards Uffe ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-06 16:36 ` Ulf Hansson 0 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-06 16:36 UTC (permalink / raw) To: Veerabhadrarao Badiganti Cc: Mark Rutland, Kate Stewart, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, BCM Kernel Feedback, Allison Randal, Android Kernel Team, Pan Bian, DTML, Martin Blumenstingl, linux-arm-msm, Chun-Hung Wu, Michał Mirosław, Rob Herring, moderated list:ARM/Mediatek SoC support, Matthias Brugger, Thomas Gleixner, Stanley Chu, Chaotian Jing, Linux ARM, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, Yong Mao, Linux Kernel Mailing List On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti <vbadigan@codeaurora.org> wrote: > > > On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > > Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > > in mmc_of_parse(). > > > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > > --- > > drivers/mmc/core/host.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > > index c876872..47521c6 100644 > > --- a/drivers/mmc/core/host.c > > +++ b/drivers/mmc/core/host.c > > @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > > host->caps2 |= MMC_CAP2_NO_SD; > > if (device_property_read_bool(dev, "no-mmc")) > > host->caps2 |= MMC_CAP2_NO_MMC; > > + if (device_property_read_bool(dev, "supports-cqe")) > > + host->caps2 |= MMC_CAP2_CQE; > > This change is breaking emmc driver on qcom platforms where this dt > property is defined. > > [ 1.543453] cqhci_deactivate+0xc/0x38 > [ 1.545627] sdhci_msm_reset+0x40/0x58 > [ 1.549447] sdhci_do_reset+0x48/0x7c > [ 1.553180] __sdhci_read_caps+0x7c/0x214 > [ 1.556913] sdhci_setup_host+0x58/0xce8 > [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > [ 1.564900] platform_drv_probe+0x4c/0xb0 > > So, we cant have this flag defined before sdhci_setup_host(). > > I will have to clear this cap and re-enable it in our initialization. Thanks for reporting! I have dropped all the four patches from Chun-Hung, so we can figure out how to fix this. Please help to review the next version of the series. > > > + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { > > + host->caps2 |= MMC_CAP2_CQE_DCMD; > > + } > > > > /* Must be after "non-removable" check */ > > if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { Kind regards Uffe _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-06 16:36 ` Ulf Hansson 0 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-06 16:36 UTC (permalink / raw) To: Veerabhadrarao Badiganti Cc: Mark Rutland, Kate Stewart, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, BCM Kernel Feedback, Allison Randal, Android Kernel Team, Pan Bian, DTML, Martin Blumenstingl, linux-arm-msm, Chun-Hung Wu, Michał Mirosław, Rob Herring, moderated list:ARM/Mediatek SoC support, Matthias Brugger, Thomas Gleixner, Stanley Chu, Chaotian Jing, Linux ARM, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, Yong Mao, Linux Kernel Mailing List On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti <vbadigan@codeaurora.org> wrote: > > > On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > > Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > > in mmc_of_parse(). > > > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > > --- > > drivers/mmc/core/host.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > > index c876872..47521c6 100644 > > --- a/drivers/mmc/core/host.c > > +++ b/drivers/mmc/core/host.c > > @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > > host->caps2 |= MMC_CAP2_NO_SD; > > if (device_property_read_bool(dev, "no-mmc")) > > host->caps2 |= MMC_CAP2_NO_MMC; > > + if (device_property_read_bool(dev, "supports-cqe")) > > + host->caps2 |= MMC_CAP2_CQE; > > This change is breaking emmc driver on qcom platforms where this dt > property is defined. > > [ 1.543453] cqhci_deactivate+0xc/0x38 > [ 1.545627] sdhci_msm_reset+0x40/0x58 > [ 1.549447] sdhci_do_reset+0x48/0x7c > [ 1.553180] __sdhci_read_caps+0x7c/0x214 > [ 1.556913] sdhci_setup_host+0x58/0xce8 > [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > [ 1.564900] platform_drv_probe+0x4c/0xb0 > > So, we cant have this flag defined before sdhci_setup_host(). > > I will have to clear this cap and re-enable it in our initialization. Thanks for reporting! I have dropped all the four patches from Chun-Hung, so we can figure out how to fix this. Please help to review the next version of the series. > > > + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { > > + host->caps2 |= MMC_CAP2_CQE_DCMD; > > + } > > > > /* Must be after "non-removable" check */ > > if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { Kind regards Uffe _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-06 16:36 ` Ulf Hansson 0 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-06 16:36 UTC (permalink / raw) To: Veerabhadrarao Badiganti Cc: Chun-Hung Wu, Michał Mirosław, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, BCM Kernel Feedback, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao, Android Kernel Team, Linux Kernel Mailing List, linux-mmc, moderated list:ARM/Mediatek SoC support, DTML, wsd_upstream, Linux ARM, linux-arm-msm, linux-tegra On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti <vbadigan@codeaurora.org> wrote: > > > On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > > Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > > in mmc_of_parse(). > > > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > > --- > > drivers/mmc/core/host.c | 5 +++++ > > 1 file changed, 5 insertions(+) > > > > diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > > index c876872..47521c6 100644 > > --- a/drivers/mmc/core/host.c > > +++ b/drivers/mmc/core/host.c > > @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > > host->caps2 |= MMC_CAP2_NO_SD; > > if (device_property_read_bool(dev, "no-mmc")) > > host->caps2 |= MMC_CAP2_NO_MMC; > > + if (device_property_read_bool(dev, "supports-cqe")) > > + host->caps2 |= MMC_CAP2_CQE; > > This change is breaking emmc driver on qcom platforms where this dt > property is defined. > > [ 1.543453] cqhci_deactivate+0xc/0x38 > [ 1.545627] sdhci_msm_reset+0x40/0x58 > [ 1.549447] sdhci_do_reset+0x48/0x7c > [ 1.553180] __sdhci_read_caps+0x7c/0x214 > [ 1.556913] sdhci_setup_host+0x58/0xce8 > [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > [ 1.564900] platform_drv_probe+0x4c/0xb0 > > So, we cant have this flag defined before sdhci_setup_host(). > > I will have to clear this cap and re-enable it in our initialization. Thanks for reporting! I have dropped all the four patches from Chun-Hung, so we can figure out how to fix this. Please help to review the next version of the series. > > > + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { > > + host->caps2 |= MMC_CAP2_CQE_DCMD; > > + } > > > > /* Must be after "non-removable" check */ > > if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { Kind regards Uffe ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings 2020-05-06 16:36 ` Ulf Hansson (?) (?) @ 2020-05-07 16:33 ` Veerabhadrarao Badiganti -1 siblings, 0 replies; 53+ messages in thread From: Veerabhadrarao Badiganti @ 2020-05-07 16:33 UTC (permalink / raw) To: Ulf Hansson Cc: Chun-Hung Wu, Michał Mirosław, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, BCM Kernel Feedback, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart On 5/6/2020 10:06 PM, Ulf Hansson wrote: > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > <vbadigan@codeaurora.org> wrote: >> >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" >>> in mmc_of_parse(). >>> >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> >>> --- >>> drivers/mmc/core/host.c | 5 +++++ >>> 1 file changed, 5 insertions(+) >>> >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c >>> index c876872..47521c6 100644 >>> --- a/drivers/mmc/core/host.c >>> +++ b/drivers/mmc/core/host.c >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) >>> host->caps2 |= MMC_CAP2_NO_SD; >>> if (device_property_read_bool(dev, "no-mmc")) >>> host->caps2 |= MMC_CAP2_NO_MMC; >>> + if (device_property_read_bool(dev, "supports-cqe")) >>> + host->caps2 |= MMC_CAP2_CQE; >> This change is breaking emmc driver on qcom platforms where this dt >> property is defined. >> >> [ 1.543453] cqhci_deactivate+0xc/0x38 >> [ 1.545627] sdhci_msm_reset+0x40/0x58 >> [ 1.549447] sdhci_do_reset+0x48/0x7c >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 >> [ 1.556913] sdhci_setup_host+0x58/0xce8 >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 >> [ 1.564900] platform_drv_probe+0x4c/0xb0 >> >> So, we cant have this flag defined before sdhci_setup_host(). >> >> I will have to clear this cap and re-enable it in our initialization. > Thanks for reporting! I have dropped all the four patches from > Chun-Hung, so we can figure out how to fix this. > > Please help to review the next version of the series. Thanks Ulf. Hi Chun-Hung, On qcom controller CQE also gets reset when SDHC is reset. So we have to explicitly disable CQE by invoking cqhci_deactivate() during sdhc reset SDHC gets reset in sdhci_setup_host() even before cqe is initialized. With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are getting null pointer access with cqhci_deactivate(). If CQE getting reset with SDHC reset is generic (applicable to other controllers) then you have revisit your logic. If its not the case then only qcom driver would get affected. I see you are updating sdhci-msm.c file as-well. How about including below change besides your change? @@ -1658,6 +1658,8 @@ static int sdhci_msm_cqe_add_host(struct sdhci_host *host, if (host->caps & SDHCI_CAN_64BIT) host->alloc_desc_sz = 16; + /* Clear the CQE cap during setup host */ + msm_host->mmc->caps2 &= ~MMC_CAP2_CQE; + ret = sdhci_setup_host(host); >>> + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { >>> + host->caps2 |= MMC_CAP2_CQE_DCMD; >>> + } >>> >>> /* Must be after "non-removable" check */ >>> if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { > Kind regards > Uffe ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-07 16:33 ` Veerabhadrarao Badiganti 0 siblings, 0 replies; 53+ messages in thread From: Veerabhadrarao Badiganti @ 2020-05-07 16:33 UTC (permalink / raw) To: Ulf Hansson Cc: Mark Rutland, Kate Stewart, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, BCM Kernel Feedback, Allison Randal, Android Kernel Team, Pan Bian, DTML, Martin Blumenstingl, linux-arm-msm, Chun-Hung Wu, Michał Mirosław, Rob Herring, moderated list:ARM/Mediatek SoC support, Matthias Brugger, Thomas Gleixner, Stanley Chu, Chaotian Jing, Linux ARM, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, Yong Mao, Linux Kernel Mailing List On 5/6/2020 10:06 PM, Ulf Hansson wrote: > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > <vbadigan@codeaurora.org> wrote: >> >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" >>> in mmc_of_parse(). >>> >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> >>> --- >>> drivers/mmc/core/host.c | 5 +++++ >>> 1 file changed, 5 insertions(+) >>> >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c >>> index c876872..47521c6 100644 >>> --- a/drivers/mmc/core/host.c >>> +++ b/drivers/mmc/core/host.c >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) >>> host->caps2 |= MMC_CAP2_NO_SD; >>> if (device_property_read_bool(dev, "no-mmc")) >>> host->caps2 |= MMC_CAP2_NO_MMC; >>> + if (device_property_read_bool(dev, "supports-cqe")) >>> + host->caps2 |= MMC_CAP2_CQE; >> This change is breaking emmc driver on qcom platforms where this dt >> property is defined. >> >> [ 1.543453] cqhci_deactivate+0xc/0x38 >> [ 1.545627] sdhci_msm_reset+0x40/0x58 >> [ 1.549447] sdhci_do_reset+0x48/0x7c >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 >> [ 1.556913] sdhci_setup_host+0x58/0xce8 >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 >> [ 1.564900] platform_drv_probe+0x4c/0xb0 >> >> So, we cant have this flag defined before sdhci_setup_host(). >> >> I will have to clear this cap and re-enable it in our initialization. > Thanks for reporting! I have dropped all the four patches from > Chun-Hung, so we can figure out how to fix this. > > Please help to review the next version of the series. Thanks Ulf. Hi Chun-Hung, On qcom controller CQE also gets reset when SDHC is reset. So we have to explicitly disable CQE by invoking cqhci_deactivate() during sdhc reset SDHC gets reset in sdhci_setup_host() even before cqe is initialized. With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are getting null pointer access with cqhci_deactivate(). If CQE getting reset with SDHC reset is generic (applicable to other controllers) then you have revisit your logic. If its not the case then only qcom driver would get affected. I see you are updating sdhci-msm.c file as-well. How about including below change besides your change? @@ -1658,6 +1658,8 @@ static int sdhci_msm_cqe_add_host(struct sdhci_host *host, if (host->caps & SDHCI_CAN_64BIT) host->alloc_desc_sz = 16; + /* Clear the CQE cap during setup host */ + msm_host->mmc->caps2 &= ~MMC_CAP2_CQE; + ret = sdhci_setup_host(host); >>> + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { >>> + host->caps2 |= MMC_CAP2_CQE_DCMD; >>> + } >>> >>> /* Must be after "non-removable" check */ >>> if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { > Kind regards > Uffe _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-07 16:33 ` Veerabhadrarao Badiganti 0 siblings, 0 replies; 53+ messages in thread From: Veerabhadrarao Badiganti @ 2020-05-07 16:33 UTC (permalink / raw) To: Ulf Hansson Cc: Mark Rutland, Kate Stewart, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, BCM Kernel Feedback, Allison Randal, Android Kernel Team, Pan Bian, DTML, Martin Blumenstingl, linux-arm-msm, Chun-Hung Wu, Michał Mirosław, Rob Herring, moderated list:ARM/Mediatek SoC support, Matthias Brugger, Thomas Gleixner, Stanley Chu, Chaotian Jing, Linux ARM, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, Yong Mao, Linux Kernel Mailing List On 5/6/2020 10:06 PM, Ulf Hansson wrote: > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > <vbadigan@codeaurora.org> wrote: >> >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" >>> in mmc_of_parse(). >>> >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> >>> --- >>> drivers/mmc/core/host.c | 5 +++++ >>> 1 file changed, 5 insertions(+) >>> >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c >>> index c876872..47521c6 100644 >>> --- a/drivers/mmc/core/host.c >>> +++ b/drivers/mmc/core/host.c >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) >>> host->caps2 |= MMC_CAP2_NO_SD; >>> if (device_property_read_bool(dev, "no-mmc")) >>> host->caps2 |= MMC_CAP2_NO_MMC; >>> + if (device_property_read_bool(dev, "supports-cqe")) >>> + host->caps2 |= MMC_CAP2_CQE; >> This change is breaking emmc driver on qcom platforms where this dt >> property is defined. >> >> [ 1.543453] cqhci_deactivate+0xc/0x38 >> [ 1.545627] sdhci_msm_reset+0x40/0x58 >> [ 1.549447] sdhci_do_reset+0x48/0x7c >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 >> [ 1.556913] sdhci_setup_host+0x58/0xce8 >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 >> [ 1.564900] platform_drv_probe+0x4c/0xb0 >> >> So, we cant have this flag defined before sdhci_setup_host(). >> >> I will have to clear this cap and re-enable it in our initialization. > Thanks for reporting! I have dropped all the four patches from > Chun-Hung, so we can figure out how to fix this. > > Please help to review the next version of the series. Thanks Ulf. Hi Chun-Hung, On qcom controller CQE also gets reset when SDHC is reset. So we have to explicitly disable CQE by invoking cqhci_deactivate() during sdhc reset SDHC gets reset in sdhci_setup_host() even before cqe is initialized. With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are getting null pointer access with cqhci_deactivate(). If CQE getting reset with SDHC reset is generic (applicable to other controllers) then you have revisit your logic. If its not the case then only qcom driver would get affected. I see you are updating sdhci-msm.c file as-well. How about including below change besides your change? @@ -1658,6 +1658,8 @@ static int sdhci_msm_cqe_add_host(struct sdhci_host *host, if (host->caps & SDHCI_CAN_64BIT) host->alloc_desc_sz = 16; + /* Clear the CQE cap during setup host */ + msm_host->mmc->caps2 &= ~MMC_CAP2_CQE; + ret = sdhci_setup_host(host); >>> + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { >>> + host->caps2 |= MMC_CAP2_CQE_DCMD; >>> + } >>> >>> /* Must be after "non-removable" check */ >>> if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { > Kind regards > Uffe _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-07 16:33 ` Veerabhadrarao Badiganti 0 siblings, 0 replies; 53+ messages in thread From: Veerabhadrarao Badiganti @ 2020-05-07 16:33 UTC (permalink / raw) To: Ulf Hansson Cc: Chun-Hung Wu, Michał Mirosław, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, BCM Kernel Feedback, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao, Android Kernel Team, Linux Kernel Mailing List, linux-mmc, moderated list:ARM/Mediatek SoC support, DTML, wsd_upstream, Linux ARM, linux-arm-msm, linux-tegra On 5/6/2020 10:06 PM, Ulf Hansson wrote: > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > <vbadigan@codeaurora.org> wrote: >> >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" >>> in mmc_of_parse(). >>> >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> >>> --- >>> drivers/mmc/core/host.c | 5 +++++ >>> 1 file changed, 5 insertions(+) >>> >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c >>> index c876872..47521c6 100644 >>> --- a/drivers/mmc/core/host.c >>> +++ b/drivers/mmc/core/host.c >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) >>> host->caps2 |= MMC_CAP2_NO_SD; >>> if (device_property_read_bool(dev, "no-mmc")) >>> host->caps2 |= MMC_CAP2_NO_MMC; >>> + if (device_property_read_bool(dev, "supports-cqe")) >>> + host->caps2 |= MMC_CAP2_CQE; >> This change is breaking emmc driver on qcom platforms where this dt >> property is defined. >> >> [ 1.543453] cqhci_deactivate+0xc/0x38 >> [ 1.545627] sdhci_msm_reset+0x40/0x58 >> [ 1.549447] sdhci_do_reset+0x48/0x7c >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 >> [ 1.556913] sdhci_setup_host+0x58/0xce8 >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 >> [ 1.564900] platform_drv_probe+0x4c/0xb0 >> >> So, we cant have this flag defined before sdhci_setup_host(). >> >> I will have to clear this cap and re-enable it in our initialization. > Thanks for reporting! I have dropped all the four patches from > Chun-Hung, so we can figure out how to fix this. > > Please help to review the next version of the series. Thanks Ulf. Hi Chun-Hung, On qcom controller CQE also gets reset when SDHC is reset. So we have to explicitly disable CQE by invoking cqhci_deactivate() during sdhc reset SDHC gets reset in sdhci_setup_host() even before cqe is initialized. With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are getting null pointer access with cqhci_deactivate(). If CQE getting reset with SDHC reset is generic (applicable to other controllers) then you have revisit your logic. If its not the case then only qcom driver would get affected. I see you are updating sdhci-msm.c file as-well. How about including below change besides your change? @@ -1658,6 +1658,8 @@ static int sdhci_msm_cqe_add_host(struct sdhci_host *host, if (host->caps & SDHCI_CAN_64BIT) host->alloc_desc_sz = 16; + /* Clear the CQE cap during setup host */ + msm_host->mmc->caps2 &= ~MMC_CAP2_CQE; + ret = sdhci_setup_host(host); >>> + if (!device_property_read_bool(dev, "disable-cqe-dcmd")) { >>> + host->caps2 |= MMC_CAP2_CQE_DCMD; >>> + } >>> >>> /* Must be after "non-removable" check */ >>> if (device_property_read_u32(dev, "fixed-emmc-driver-type", &drv_type) == 0) { > Kind regards > Uffe ^ permalink raw reply [flat|nested] 53+ messages in thread
[parent not found: <f9fa0232-3945-4e47-9238-0b51f6531199-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org>]
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings 2020-05-07 16:33 ` Veerabhadrarao Badiganti (?) (?) @ 2020-05-08 5:05 ` Ulf Hansson -1 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-08 5:05 UTC (permalink / raw) To: Veerabhadrarao Badiganti, Chun-Hung Wu Cc: Michał Mirosław, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, BCM Kernel Feedback, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman On Thu, 7 May 2020 at 18:33, Veerabhadrarao Badiganti <vbadigan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> wrote: > > > On 5/6/2020 10:06 PM, Ulf Hansson wrote: > > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > > <vbadigan-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> wrote: > >> > >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > >>> in mmc_of_parse(). > >>> > >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> > >>> --- > >>> drivers/mmc/core/host.c | 5 +++++ > >>> 1 file changed, 5 insertions(+) > >>> > >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > >>> index c876872..47521c6 100644 > >>> --- a/drivers/mmc/core/host.c > >>> +++ b/drivers/mmc/core/host.c > >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > >>> host->caps2 |= MMC_CAP2_NO_SD; > >>> if (device_property_read_bool(dev, "no-mmc")) > >>> host->caps2 |= MMC_CAP2_NO_MMC; > >>> + if (device_property_read_bool(dev, "supports-cqe")) > >>> + host->caps2 |= MMC_CAP2_CQE; > >> This change is breaking emmc driver on qcom platforms where this dt > >> property is defined. > >> > >> [ 1.543453] cqhci_deactivate+0xc/0x38 > >> [ 1.545627] sdhci_msm_reset+0x40/0x58 > >> [ 1.549447] sdhci_do_reset+0x48/0x7c > >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 > >> [ 1.556913] sdhci_setup_host+0x58/0xce8 > >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > >> [ 1.564900] platform_drv_probe+0x4c/0xb0 > >> > >> So, we cant have this flag defined before sdhci_setup_host(). > >> > >> I will have to clear this cap and re-enable it in our initialization. > > Thanks for reporting! I have dropped all the four patches from > > Chun-Hung, so we can figure out how to fix this. > > > > Please help to review the next version of the series. > > Thanks Ulf. > > Hi Chun-Hung, > > On qcom controller CQE also gets reset when SDHC is reset. So we have to > explicitly disable CQE > by invoking cqhci_deactivate() during sdhc reset > > SDHC gets reset in sdhci_setup_host() even before cqe is initialized. > With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are > getting null pointer access with cqhci_deactivate(). > > If CQE getting reset with SDHC reset is generic (applicable to other > controllers) then you have revisit your logic. > If its not the case then only qcom driver would get affected. Thanks for clarifying the problem, much appreciated. To me, it looks like the DT parsing of the CQE properties are better suited to be managed by each sdhci variant, to continue to leave some room for flexibility. Chun-Hung, can you please drop patch 1 and patch2 from the series and adapt to this change in the mediatek variant? [...] Kind regards Uffe ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-08 5:05 ` Ulf Hansson 0 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-08 5:05 UTC (permalink / raw) To: Veerabhadrarao Badiganti, Chun-Hung Wu Cc: Mark Rutland, Kate Stewart, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, BCM Kernel Feedback, Chaotian Jing, Android Kernel Team, Pan Bian, DTML, Martin Blumenstingl, linux-arm-msm, Michał Mirosław, Rob Herring, moderated list:ARM/Mediatek SoC support, Matthias Brugger, Thomas Gleixner, Stanley Chu, Allison Randal, Linux ARM, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, Yong Mao, Linux Kernel Mailing List On Thu, 7 May 2020 at 18:33, Veerabhadrarao Badiganti <vbadigan@codeaurora.org> wrote: > > > On 5/6/2020 10:06 PM, Ulf Hansson wrote: > > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > > <vbadigan@codeaurora.org> wrote: > >> > >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > >>> in mmc_of_parse(). > >>> > >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > >>> --- > >>> drivers/mmc/core/host.c | 5 +++++ > >>> 1 file changed, 5 insertions(+) > >>> > >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > >>> index c876872..47521c6 100644 > >>> --- a/drivers/mmc/core/host.c > >>> +++ b/drivers/mmc/core/host.c > >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > >>> host->caps2 |= MMC_CAP2_NO_SD; > >>> if (device_property_read_bool(dev, "no-mmc")) > >>> host->caps2 |= MMC_CAP2_NO_MMC; > >>> + if (device_property_read_bool(dev, "supports-cqe")) > >>> + host->caps2 |= MMC_CAP2_CQE; > >> This change is breaking emmc driver on qcom platforms where this dt > >> property is defined. > >> > >> [ 1.543453] cqhci_deactivate+0xc/0x38 > >> [ 1.545627] sdhci_msm_reset+0x40/0x58 > >> [ 1.549447] sdhci_do_reset+0x48/0x7c > >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 > >> [ 1.556913] sdhci_setup_host+0x58/0xce8 > >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > >> [ 1.564900] platform_drv_probe+0x4c/0xb0 > >> > >> So, we cant have this flag defined before sdhci_setup_host(). > >> > >> I will have to clear this cap and re-enable it in our initialization. > > Thanks for reporting! I have dropped all the four patches from > > Chun-Hung, so we can figure out how to fix this. > > > > Please help to review the next version of the series. > > Thanks Ulf. > > Hi Chun-Hung, > > On qcom controller CQE also gets reset when SDHC is reset. So we have to > explicitly disable CQE > by invoking cqhci_deactivate() during sdhc reset > > SDHC gets reset in sdhci_setup_host() even before cqe is initialized. > With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are > getting null pointer access with cqhci_deactivate(). > > If CQE getting reset with SDHC reset is generic (applicable to other > controllers) then you have revisit your logic. > If its not the case then only qcom driver would get affected. Thanks for clarifying the problem, much appreciated. To me, it looks like the DT parsing of the CQE properties are better suited to be managed by each sdhci variant, to continue to leave some room for flexibility. Chun-Hung, can you please drop patch 1 and patch2 from the series and adapt to this change in the mediatek variant? [...] Kind regards Uffe _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-08 5:05 ` Ulf Hansson 0 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-08 5:05 UTC (permalink / raw) To: Veerabhadrarao Badiganti, Chun-Hung Wu Cc: Mark Rutland, Kate Stewart, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, BCM Kernel Feedback, Chaotian Jing, Android Kernel Team, Pan Bian, DTML, Martin Blumenstingl, linux-arm-msm, Michał Mirosław, Rob Herring, moderated list:ARM/Mediatek SoC support, Matthias Brugger, Thomas Gleixner, Stanley Chu, Allison Randal, Linux ARM, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, Yong Mao, Linux Kernel Mailing List On Thu, 7 May 2020 at 18:33, Veerabhadrarao Badiganti <vbadigan@codeaurora.org> wrote: > > > On 5/6/2020 10:06 PM, Ulf Hansson wrote: > > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > > <vbadigan@codeaurora.org> wrote: > >> > >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > >>> in mmc_of_parse(). > >>> > >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > >>> --- > >>> drivers/mmc/core/host.c | 5 +++++ > >>> 1 file changed, 5 insertions(+) > >>> > >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > >>> index c876872..47521c6 100644 > >>> --- a/drivers/mmc/core/host.c > >>> +++ b/drivers/mmc/core/host.c > >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > >>> host->caps2 |= MMC_CAP2_NO_SD; > >>> if (device_property_read_bool(dev, "no-mmc")) > >>> host->caps2 |= MMC_CAP2_NO_MMC; > >>> + if (device_property_read_bool(dev, "supports-cqe")) > >>> + host->caps2 |= MMC_CAP2_CQE; > >> This change is breaking emmc driver on qcom platforms where this dt > >> property is defined. > >> > >> [ 1.543453] cqhci_deactivate+0xc/0x38 > >> [ 1.545627] sdhci_msm_reset+0x40/0x58 > >> [ 1.549447] sdhci_do_reset+0x48/0x7c > >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 > >> [ 1.556913] sdhci_setup_host+0x58/0xce8 > >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > >> [ 1.564900] platform_drv_probe+0x4c/0xb0 > >> > >> So, we cant have this flag defined before sdhci_setup_host(). > >> > >> I will have to clear this cap and re-enable it in our initialization. > > Thanks for reporting! I have dropped all the four patches from > > Chun-Hung, so we can figure out how to fix this. > > > > Please help to review the next version of the series. > > Thanks Ulf. > > Hi Chun-Hung, > > On qcom controller CQE also gets reset when SDHC is reset. So we have to > explicitly disable CQE > by invoking cqhci_deactivate() during sdhc reset > > SDHC gets reset in sdhci_setup_host() even before cqe is initialized. > With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are > getting null pointer access with cqhci_deactivate(). > > If CQE getting reset with SDHC reset is generic (applicable to other > controllers) then you have revisit your logic. > If its not the case then only qcom driver would get affected. Thanks for clarifying the problem, much appreciated. To me, it looks like the DT parsing of the CQE properties are better suited to be managed by each sdhci variant, to continue to leave some room for flexibility. Chun-Hung, can you please drop patch 1 and patch2 from the series and adapt to this change in the mediatek variant? [...] Kind regards Uffe _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-08 5:05 ` Ulf Hansson 0 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-08 5:05 UTC (permalink / raw) To: Veerabhadrarao Badiganti, Chun-Hung Wu Cc: Michał Mirosław, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, BCM Kernel Feedback, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao, Android Kernel Team, Linux Kernel Mailing List, linux-mmc, moderated list:ARM/Mediatek SoC support, DTML, wsd_upstream, Linux ARM, linux-arm-msm, linux-tegra On Thu, 7 May 2020 at 18:33, Veerabhadrarao Badiganti <vbadigan@codeaurora.org> wrote: > > > On 5/6/2020 10:06 PM, Ulf Hansson wrote: > > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > > <vbadigan@codeaurora.org> wrote: > >> > >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > >>> in mmc_of_parse(). > >>> > >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > >>> --- > >>> drivers/mmc/core/host.c | 5 +++++ > >>> 1 file changed, 5 insertions(+) > >>> > >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > >>> index c876872..47521c6 100644 > >>> --- a/drivers/mmc/core/host.c > >>> +++ b/drivers/mmc/core/host.c > >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > >>> host->caps2 |= MMC_CAP2_NO_SD; > >>> if (device_property_read_bool(dev, "no-mmc")) > >>> host->caps2 |= MMC_CAP2_NO_MMC; > >>> + if (device_property_read_bool(dev, "supports-cqe")) > >>> + host->caps2 |= MMC_CAP2_CQE; > >> This change is breaking emmc driver on qcom platforms where this dt > >> property is defined. > >> > >> [ 1.543453] cqhci_deactivate+0xc/0x38 > >> [ 1.545627] sdhci_msm_reset+0x40/0x58 > >> [ 1.549447] sdhci_do_reset+0x48/0x7c > >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 > >> [ 1.556913] sdhci_setup_host+0x58/0xce8 > >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > >> [ 1.564900] platform_drv_probe+0x4c/0xb0 > >> > >> So, we cant have this flag defined before sdhci_setup_host(). > >> > >> I will have to clear this cap and re-enable it in our initialization. > > Thanks for reporting! I have dropped all the four patches from > > Chun-Hung, so we can figure out how to fix this. > > > > Please help to review the next version of the series. > > Thanks Ulf. > > Hi Chun-Hung, > > On qcom controller CQE also gets reset when SDHC is reset. So we have to > explicitly disable CQE > by invoking cqhci_deactivate() during sdhc reset > > SDHC gets reset in sdhci_setup_host() even before cqe is initialized. > With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are > getting null pointer access with cqhci_deactivate(). > > If CQE getting reset with SDHC reset is generic (applicable to other > controllers) then you have revisit your logic. > If its not the case then only qcom driver would get affected. Thanks for clarifying the problem, much appreciated. To me, it looks like the DT parsing of the CQE properties are better suited to be managed by each sdhci variant, to continue to leave some room for flexibility. Chun-Hung, can you please drop patch 1 and patch2 from the series and adapt to this change in the mediatek variant? [...] Kind regards Uffe ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings 2020-05-08 5:05 ` Ulf Hansson (?) @ 2020-05-12 1:16 ` Chun-Hung Wu -1 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-05-12 1:16 UTC (permalink / raw) To: Ulf Hansson Cc: Mark Rutland, Kate Stewart, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, BCM Kernel Feedback, Allison Randal, Android Kernel Team, Pan Bian, Veerabhadrarao Badiganti, DTML, Martin Blumenstingl On Fri, 2020-05-08 at 13:05 +0800, Ulf Hansson wrote: > On Thu, 7 May 2020 at 18:33, Veerabhadrarao Badiganti > <vbadigan@codeaurora.org> wrote: > > > > > > On 5/6/2020 10:06 PM, Ulf Hansson wrote: > > > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > > > <vbadigan@codeaurora.org> wrote: > > >> > > >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > > >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > > >>> in mmc_of_parse(). > > >>> > > >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > > >>> --- > > >>> drivers/mmc/core/host.c | 5 +++++ > > >>> 1 file changed, 5 insertions(+) > > >>> > > >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > > >>> index c876872..47521c6 100644 > > >>> --- a/drivers/mmc/core/host.c > > >>> +++ b/drivers/mmc/core/host.c > > >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > > >>> host->caps2 |= MMC_CAP2_NO_SD; > > >>> if (device_property_read_bool(dev, "no-mmc")) > > >>> host->caps2 |= MMC_CAP2_NO_MMC; > > >>> + if (device_property_read_bool(dev, "supports-cqe")) > > >>> + host->caps2 |= MMC_CAP2_CQE; > > >> This change is breaking emmc driver on qcom platforms where this dt > > >> property is defined. > > >> > > >> [ 1.543453] cqhci_deactivate+0xc/0x38 > > >> [ 1.545627] sdhci_msm_reset+0x40/0x58 > > >> [ 1.549447] sdhci_do_reset+0x48/0x7c > > >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 > > >> [ 1.556913] sdhci_setup_host+0x58/0xce8 > > >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > > >> [ 1.564900] platform_drv_probe+0x4c/0xb0 > > >> > > >> So, we cant have this flag defined before sdhci_setup_host(). > > >> > > >> I will have to clear this cap and re-enable it in our initialization. > > > Thanks for reporting! I have dropped all the four patches from > > > Chun-Hung, so we can figure out how to fix this. > > > > > > Please help to review the next version of the series. > > > > Thanks Ulf. > > > > Hi Chun-Hung, > > > > On qcom controller CQE also gets reset when SDHC is reset. So we have to > > explicitly disable CQE > > by invoking cqhci_deactivate() during sdhc reset > > > > SDHC gets reset in sdhci_setup_host() even before cqe is initialized. > > With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are > > getting null pointer access with cqhci_deactivate(). > > > > If CQE getting reset with SDHC reset is generic (applicable to other > > controllers) then you have revisit your logic. > > If its not the case then only qcom driver would get affected. > > Thanks for clarifying the problem, much appreciated. > > To me, it looks like the DT parsing of the CQE properties are better > suited to be managed by each sdhci variant, to continue to leave some > room for flexibility. > > Chun-Hung, can you please drop patch 1 and patch2 from the series and > adapt to this change in the mediatek variant? Ok, I will rollback patch1 and patch2 from series and keep DT parsing of the CQE properties by each sdhci/msdc variant. CQE properties will move to mediatek variant. > > [...] > > Kind regards > Uffe ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-12 1:16 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-05-12 1:16 UTC (permalink / raw) To: Ulf Hansson Cc: Mark Rutland, Kate Stewart, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, BCM Kernel Feedback, Allison Randal, Android Kernel Team, Pan Bian, Veerabhadrarao Badiganti, DTML, Martin Blumenstingl, linux-arm-msm, Michał Mirosław, Rob Herring, moderated list:ARM/Mediatek SoC support, Matthias Brugger, Thomas Gleixner, Stanley Chu (朱原陞), Chaotian Jing (井朝天), Linux ARM, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang (王國鴻), Adrian Hunter, Yong Mao (毛勇), Linux Kernel Mailing List On Fri, 2020-05-08 at 13:05 +0800, Ulf Hansson wrote: > On Thu, 7 May 2020 at 18:33, Veerabhadrarao Badiganti > <vbadigan@codeaurora.org> wrote: > > > > > > On 5/6/2020 10:06 PM, Ulf Hansson wrote: > > > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > > > <vbadigan@codeaurora.org> wrote: > > >> > > >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > > >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > > >>> in mmc_of_parse(). > > >>> > > >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > > >>> --- > > >>> drivers/mmc/core/host.c | 5 +++++ > > >>> 1 file changed, 5 insertions(+) > > >>> > > >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > > >>> index c876872..47521c6 100644 > > >>> --- a/drivers/mmc/core/host.c > > >>> +++ b/drivers/mmc/core/host.c > > >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > > >>> host->caps2 |= MMC_CAP2_NO_SD; > > >>> if (device_property_read_bool(dev, "no-mmc")) > > >>> host->caps2 |= MMC_CAP2_NO_MMC; > > >>> + if (device_property_read_bool(dev, "supports-cqe")) > > >>> + host->caps2 |= MMC_CAP2_CQE; > > >> This change is breaking emmc driver on qcom platforms where this dt > > >> property is defined. > > >> > > >> [ 1.543453] cqhci_deactivate+0xc/0x38 > > >> [ 1.545627] sdhci_msm_reset+0x40/0x58 > > >> [ 1.549447] sdhci_do_reset+0x48/0x7c > > >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 > > >> [ 1.556913] sdhci_setup_host+0x58/0xce8 > > >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > > >> [ 1.564900] platform_drv_probe+0x4c/0xb0 > > >> > > >> So, we cant have this flag defined before sdhci_setup_host(). > > >> > > >> I will have to clear this cap and re-enable it in our initialization. > > > Thanks for reporting! I have dropped all the four patches from > > > Chun-Hung, so we can figure out how to fix this. > > > > > > Please help to review the next version of the series. > > > > Thanks Ulf. > > > > Hi Chun-Hung, > > > > On qcom controller CQE also gets reset when SDHC is reset. So we have to > > explicitly disable CQE > > by invoking cqhci_deactivate() during sdhc reset > > > > SDHC gets reset in sdhci_setup_host() even before cqe is initialized. > > With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are > > getting null pointer access with cqhci_deactivate(). > > > > If CQE getting reset with SDHC reset is generic (applicable to other > > controllers) then you have revisit your logic. > > If its not the case then only qcom driver would get affected. > > Thanks for clarifying the problem, much appreciated. > > To me, it looks like the DT parsing of the CQE properties are better > suited to be managed by each sdhci variant, to continue to leave some > room for flexibility. > > Chun-Hung, can you please drop patch 1 and patch2 from the series and > adapt to this change in the mediatek variant? Ok, I will rollback patch1 and patch2 from series and keep DT parsing of the CQE properties by each sdhci/msdc variant. CQE properties will move to mediatek variant. > > [...] > > Kind regards > Uffe _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings @ 2020-05-12 1:16 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-05-12 1:16 UTC (permalink / raw) To: Ulf Hansson Cc: Mark Rutland, Kate Stewart, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, BCM Kernel Feedback, Allison Randal, Android Kernel Team, Pan Bian, Veerabhadrarao Badiganti, DTML, Martin Blumenstingl, linux-arm-msm, Michał Mirosław, Rob Herring, moderated list:ARM/Mediatek SoC support, Matthias Brugger, Thomas Gleixner, Stanley Chu (朱原陞), Chaotian Jing (井朝天), Linux ARM, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang (王國鴻), Adrian Hunter, Yong Mao (毛勇), Linux Kernel Mailing List On Fri, 2020-05-08 at 13:05 +0800, Ulf Hansson wrote: > On Thu, 7 May 2020 at 18:33, Veerabhadrarao Badiganti > <vbadigan@codeaurora.org> wrote: > > > > > > On 5/6/2020 10:06 PM, Ulf Hansson wrote: > > > On Wed, 6 May 2020 at 15:01, Veerabhadrarao Badiganti > > > <vbadigan@codeaurora.org> wrote: > > >> > > >> On 4/28/2020 5:26 AM, Chun-Hung Wu wrote: > > >>> Parse CQE bindings "supports-cqe" and "disable-cqe-dcmd" > > >>> in mmc_of_parse(). > > >>> > > >>> Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > > >>> --- > > >>> drivers/mmc/core/host.c | 5 +++++ > > >>> 1 file changed, 5 insertions(+) > > >>> > > >>> diff --git a/drivers/mmc/core/host.c b/drivers/mmc/core/host.c > > >>> index c876872..47521c6 100644 > > >>> --- a/drivers/mmc/core/host.c > > >>> +++ b/drivers/mmc/core/host.c > > >>> @@ -302,6 +302,11 @@ int mmc_of_parse(struct mmc_host *host) > > >>> host->caps2 |= MMC_CAP2_NO_SD; > > >>> if (device_property_read_bool(dev, "no-mmc")) > > >>> host->caps2 |= MMC_CAP2_NO_MMC; > > >>> + if (device_property_read_bool(dev, "supports-cqe")) > > >>> + host->caps2 |= MMC_CAP2_CQE; > > >> This change is breaking emmc driver on qcom platforms where this dt > > >> property is defined. > > >> > > >> [ 1.543453] cqhci_deactivate+0xc/0x38 > > >> [ 1.545627] sdhci_msm_reset+0x40/0x58 > > >> [ 1.549447] sdhci_do_reset+0x48/0x7c > > >> [ 1.553180] __sdhci_read_caps+0x7c/0x214 > > >> [ 1.556913] sdhci_setup_host+0x58/0xce8 > > >> [ 1.560905] sdhci_msm_probe+0x588/0x8a4 > > >> [ 1.564900] platform_drv_probe+0x4c/0xb0 > > >> > > >> So, we cant have this flag defined before sdhci_setup_host(). > > >> > > >> I will have to clear this cap and re-enable it in our initialization. > > > Thanks for reporting! I have dropped all the four patches from > > > Chun-Hung, so we can figure out how to fix this. > > > > > > Please help to review the next version of the series. > > > > Thanks Ulf. > > > > Hi Chun-Hung, > > > > On qcom controller CQE also gets reset when SDHC is reset. So we have to > > explicitly disable CQE > > by invoking cqhci_deactivate() during sdhc reset > > > > SDHC gets reset in sdhci_setup_host() even before cqe is initialized. > > With MMC_CAP2_CQE_DCMD cap set even before sdhci_set_host(), we are > > getting null pointer access with cqhci_deactivate(). > > > > If CQE getting reset with SDHC reset is generic (applicable to other > > controllers) then you have revisit your logic. > > If its not the case then only qcom driver would get affected. > > Thanks for clarifying the problem, much appreciated. > > To me, it looks like the DT parsing of the CQE properties are better > suited to be managed by each sdhci variant, to continue to leave some > room for flexibility. > > Chun-Hung, can you please drop patch 1 and patch2 from the series and > adapt to this change in the mediatek variant? Ok, I will rollback patch1 and patch2 from series and keep DT parsing of the CQE properties by each sdhci/msdc variant. CQE properties will move to mediatek variant. > > [...] > > Kind regards > Uffe _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v5 4/5] mmc: mediatek: command queue support 2020-04-27 23:56 ` Chun-Hung Wu (?) (?) @ 2020-04-27 23:56 ` Chun-Hung Wu -1 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux-CoA6ZxLDdyEEUmgCuDUIdw, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list-dY08KVG/lbpWk0Htik3J/w, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Cc: kernel-team-z5hGa2qSFaRBDgjK7y7TUQ, linux-kernel-u79uwXL29TY76Z2rM5mHXA, linux-mmc-u79uwXL29TY76Z2rM5mHXA, linux-mediatek-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, devicetree-u79uwXL29TY76Z2rM5mHXA, wsd_upstream-NuS5LvNUpcJWk0Htik3J/w, linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r, linux-arm-msm-u79uwXL29TY76Z2rM5mHXA, linux-tegra-u79uwXL29TY76Z2rM5mHXA, Chun-Hung Wu Support command queue for mt6779 platform. a. Add msdc_set_busy_timeout() to calculate emmc write timeout b. Connect mtk msdc driver to cqhci driver through host->cq_host->ops = &msdc_cmdq_ops; c. msdc_cmdq_irq() will link up with cqchi_irq(). Besides, it provides more irq error messages like RSPCRCERR/CMDTO/DATACRCERR/DATTMO. d. Use the options below to separate support for CQHCI or not, because some of our platform does not support CQHCI hence no kernel option: CONFIG_MMC_CQHCI. #if IS_ENABLED(CONFIG_MMC_CQHCI) XXX //Support CQHCI #else XXX //Not support CQHCI #endif Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/host/mtk-sd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index a2328fb..8516888 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -31,6 +31,8 @@ #include <linux/mmc/sdio.h> #include <linux/mmc/slot-gpio.h> +#include "cqhci.h" + #define MAX_BD_NUM 1024 /*--------------------------------------------------------------------------*/ @@ -151,6 +153,7 @@ #define MSDC_INT_DMA_BDCSERR (0x1 << 17) /* W1C */ #define MSDC_INT_DMA_GPDCSERR (0x1 << 18) /* W1C */ #define MSDC_INT_DMA_PROTECT (0x1 << 19) /* W1C */ +#define MSDC_INT_CMDQ (0x1 << 28) /* W1C */ /* MSDC_INTEN mask */ #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */ @@ -181,6 +184,7 @@ /* SDC_CFG mask */ #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */ #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */ +#define SDC_CFG_WRDTOC (0x1fff << 2) /* RW */ #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */ #define SDC_CFG_SDIO (0x1 << 19) /* RW */ #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */ @@ -229,6 +233,7 @@ #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ #define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ +#define MSDC_PB1_BUSY_CHECK_SEL (0x1 << 7) /* RW */ #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ @@ -432,6 +437,7 @@ struct msdc_host { struct msdc_save_para save_para; /* used when gate HCLK */ struct msdc_tune_para def_tune_para; /* default tune setting */ struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */ + struct cqhci_host *cq_host; }; static const struct mtk_mmc_compatible mt8135_compat = { @@ -528,6 +534,18 @@ static const struct mtk_mmc_compatible mt7620_compat = { .use_internal_cd = true, }; +static const struct mtk_mmc_compatible mt6779_compat = { + .clk_div_bits = 12, + .hs400_tune = false, + .pad_tune_reg = MSDC_PAD_TUNE0, + .async_fifo = true, + .data_tune = true, + .busy_check = true, + .stop_clk_fix = true, + .enhance_rx = true, + .support_64g = true, +}; + static const struct of_device_id msdc_of_ids[] = { { .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat}, { .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat}, @@ -537,6 +555,7 @@ static const struct of_device_id msdc_of_ids[] = { { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, + { .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, {} }; MODULE_DEVICE_TABLE(of, msdc_of_ids); @@ -740,6 +759,15 @@ static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) (u32)(timeout > 255 ? 255 : timeout)); } +static void msdc_set_busy_timeout(struct msdc_host *host, u64 ns, u64 clks) +{ + u64 timeout; + + timeout = msdc_timeout_cal(host, ns, clks); + sdr_set_field(host->base + SDC_CFG, SDC_CFG_WRDTOC, + (u32)(timeout > 8191 ? 8191 : timeout)); +} + static void msdc_gate_clock(struct msdc_host *host) { clk_disable_unprepare(host->src_clk_cg); @@ -1426,6 +1454,36 @@ static void msdc_enable_sdio_irq(struct mmc_host *mmc, int enb) pm_runtime_put_noidle(host->dev); } +#if IS_ENABLED(CONFIG_MMC_CQHCI) +static irqreturn_t msdc_cmdq_irq(struct msdc_host *host, u32 intsts) +{ + int cmd_err = 0, dat_err = 0; + + if (intsts & MSDC_INT_RSPCRCERR) { + cmd_err = (unsigned int)-EILSEQ; + dev_err(host->dev, "%s: CMD CRC ERR", __func__); + } else if (intsts & MSDC_INT_CMDTMO) { + cmd_err = (unsigned int)-ETIMEDOUT; + dev_err(host->dev, "%s: CMD TIMEOUT ERR", __func__); + } + + if (intsts & MSDC_INT_DATCRCERR) { + dat_err = (unsigned int)-EILSEQ; + dev_err(host->dev, "%s: DATA CRC ERR", __func__); + } else if (intsts & MSDC_INT_DATTMO) { + dat_err = (unsigned int)-ETIMEDOUT; + dev_err(host->dev, "%s: DATA TIMEOUT ERR", __func__); + } + + if (cmd_err || dat_err) { + dev_err(host->dev, "cmd_err = %d, dat_err =%d, intsts = 0x%x", + cmd_err, dat_err, intsts); + } + + return cqhci_irq(host->mmc, 0, cmd_err, dat_err); +} +#endif + static irqreturn_t msdc_irq(int irq, void *dev_id) { struct msdc_host *host = (struct msdc_host *) dev_id; @@ -1462,6 +1520,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ))) break; +#if IS_ENABLED(CONFIG_MMC_CQHCI) + if ((host->mmc->caps2 & MMC_CAP2_CQE) && + (events & MSDC_INT_CMDQ)) { + msdc_cmdq_irq(host, events); + /* clear interrupts */ + writel(events, host->base + MSDC_INT); + return IRQ_HANDLED; + } +#endif + if (!mrq) { dev_err(host->dev, "%s: MRQ=NULL; events=%08X; event_mask=%08X\n", @@ -2146,6 +2214,36 @@ static int msdc_get_cd(struct mmc_host *mmc) return !val; } +static void msdc_cqe_enable(struct mmc_host *mmc) +{ + struct msdc_host *host = mmc_priv(mmc); + + /* enable cmdq irq */ + writel(MSDC_INT_CMDQ, host->base + MSDC_INTEN); + /* enable busy check */ + sdr_set_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); + /* default write data / busy timeout 20s */ + msdc_set_busy_timeout(host, 20 * 1000000000ULL, 0); + /* default read data timeout 1s */ + msdc_set_timeout(host, 1000000000ULL, 0); +} + +void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) +{ + struct msdc_host *host = mmc_priv(mmc); + + /* disable cmdq irq */ + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INT_CMDQ); + /* disable busy check */ + sdr_clr_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); + + if (recovery) { + sdr_set_field(host->base + MSDC_DMA_CTRL, + MSDC_DMA_CTRL_STOP, 1); + msdc_reset_hw(host); + } +} + static const struct mmc_host_ops mt_msdc_ops = { .post_req = msdc_post_req, .pre_req = msdc_pre_req, @@ -2162,6 +2260,11 @@ static const struct mmc_host_ops mt_msdc_ops = { .hw_reset = msdc_hw_reset, }; +static const struct cqhci_host_ops msdc_cmdq_ops = { + .enable = msdc_cqe_enable, + .disable = msdc_cqe_disable, +}; + static void msdc_of_property_parse(struct platform_device *pdev, struct msdc_host *host) { @@ -2312,6 +2415,22 @@ static int msdc_drv_probe(struct platform_device *pdev) host->dma_mask = DMA_BIT_MASK(32); mmc_dev(mmc)->dma_mask = &host->dma_mask; +#if IS_ENABLED(CONFIG_MMC_CQHCI) + if (mmc->caps2 & MMC_CAP2_CQE) { + host->cq_host = devm_kzalloc(host->mmc->parent, + sizeof(*host->cq_host), + GFP_KERNEL); + host->cq_host->caps |= CQHCI_TASK_DESC_SZ_128; + host->cq_host->mmio = host->base + 0x800; + host->cq_host->ops = &msdc_cmdq_ops; + cqhci_init(host->cq_host, mmc, true); + mmc->max_segs = 128; + /* cqhci 16bit length */ + /* 0 size, means 65536 so we don't have to -1 here */ + mmc->max_seg_size = 64 * 1024; + } +#endif + host->timeout_clks = 3 * 1048576; host->dma.gpd = dma_alloc_coherent(&pdev->dev, 2 * sizeof(struct mt_gpdma_desc), -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 4/5] mmc: mediatek: command queue support @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel Support command queue for mt6779 platform. a. Add msdc_set_busy_timeout() to calculate emmc write timeout b. Connect mtk msdc driver to cqhci driver through host->cq_host->ops = &msdc_cmdq_ops; c. msdc_cmdq_irq() will link up with cqchi_irq(). Besides, it provides more irq error messages like RSPCRCERR/CMDTO/DATACRCERR/DATTMO. d. Use the options below to separate support for CQHCI or not, because some of our platform does not support CQHCI hence no kernel option: CONFIG_MMC_CQHCI. #if IS_ENABLED(CONFIG_MMC_CQHCI) XXX //Support CQHCI #else XXX //Not support CQHCI #endif Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/host/mtk-sd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index a2328fb..8516888 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -31,6 +31,8 @@ #include <linux/mmc/sdio.h> #include <linux/mmc/slot-gpio.h> +#include "cqhci.h" + #define MAX_BD_NUM 1024 /*--------------------------------------------------------------------------*/ @@ -151,6 +153,7 @@ #define MSDC_INT_DMA_BDCSERR (0x1 << 17) /* W1C */ #define MSDC_INT_DMA_GPDCSERR (0x1 << 18) /* W1C */ #define MSDC_INT_DMA_PROTECT (0x1 << 19) /* W1C */ +#define MSDC_INT_CMDQ (0x1 << 28) /* W1C */ /* MSDC_INTEN mask */ #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */ @@ -181,6 +184,7 @@ /* SDC_CFG mask */ #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */ #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */ +#define SDC_CFG_WRDTOC (0x1fff << 2) /* RW */ #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */ #define SDC_CFG_SDIO (0x1 << 19) /* RW */ #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */ @@ -229,6 +233,7 @@ #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ #define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ +#define MSDC_PB1_BUSY_CHECK_SEL (0x1 << 7) /* RW */ #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ @@ -432,6 +437,7 @@ struct msdc_host { struct msdc_save_para save_para; /* used when gate HCLK */ struct msdc_tune_para def_tune_para; /* default tune setting */ struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */ + struct cqhci_host *cq_host; }; static const struct mtk_mmc_compatible mt8135_compat = { @@ -528,6 +534,18 @@ static const struct mtk_mmc_compatible mt7620_compat = { .use_internal_cd = true, }; +static const struct mtk_mmc_compatible mt6779_compat = { + .clk_div_bits = 12, + .hs400_tune = false, + .pad_tune_reg = MSDC_PAD_TUNE0, + .async_fifo = true, + .data_tune = true, + .busy_check = true, + .stop_clk_fix = true, + .enhance_rx = true, + .support_64g = true, +}; + static const struct of_device_id msdc_of_ids[] = { { .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat}, { .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat}, @@ -537,6 +555,7 @@ static const struct of_device_id msdc_of_ids[] = { { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, + { .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, {} }; MODULE_DEVICE_TABLE(of, msdc_of_ids); @@ -740,6 +759,15 @@ static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) (u32)(timeout > 255 ? 255 : timeout)); } +static void msdc_set_busy_timeout(struct msdc_host *host, u64 ns, u64 clks) +{ + u64 timeout; + + timeout = msdc_timeout_cal(host, ns, clks); + sdr_set_field(host->base + SDC_CFG, SDC_CFG_WRDTOC, + (u32)(timeout > 8191 ? 8191 : timeout)); +} + static void msdc_gate_clock(struct msdc_host *host) { clk_disable_unprepare(host->src_clk_cg); @@ -1426,6 +1454,36 @@ static void msdc_enable_sdio_irq(struct mmc_host *mmc, int enb) pm_runtime_put_noidle(host->dev); } +#if IS_ENABLED(CONFIG_MMC_CQHCI) +static irqreturn_t msdc_cmdq_irq(struct msdc_host *host, u32 intsts) +{ + int cmd_err = 0, dat_err = 0; + + if (intsts & MSDC_INT_RSPCRCERR) { + cmd_err = (unsigned int)-EILSEQ; + dev_err(host->dev, "%s: CMD CRC ERR", __func__); + } else if (intsts & MSDC_INT_CMDTMO) { + cmd_err = (unsigned int)-ETIMEDOUT; + dev_err(host->dev, "%s: CMD TIMEOUT ERR", __func__); + } + + if (intsts & MSDC_INT_DATCRCERR) { + dat_err = (unsigned int)-EILSEQ; + dev_err(host->dev, "%s: DATA CRC ERR", __func__); + } else if (intsts & MSDC_INT_DATTMO) { + dat_err = (unsigned int)-ETIMEDOUT; + dev_err(host->dev, "%s: DATA TIMEOUT ERR", __func__); + } + + if (cmd_err || dat_err) { + dev_err(host->dev, "cmd_err = %d, dat_err =%d, intsts = 0x%x", + cmd_err, dat_err, intsts); + } + + return cqhci_irq(host->mmc, 0, cmd_err, dat_err); +} +#endif + static irqreturn_t msdc_irq(int irq, void *dev_id) { struct msdc_host *host = (struct msdc_host *) dev_id; @@ -1462,6 +1520,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ))) break; +#if IS_ENABLED(CONFIG_MMC_CQHCI) + if ((host->mmc->caps2 & MMC_CAP2_CQE) && + (events & MSDC_INT_CMDQ)) { + msdc_cmdq_irq(host, events); + /* clear interrupts */ + writel(events, host->base + MSDC_INT); + return IRQ_HANDLED; + } +#endif + if (!mrq) { dev_err(host->dev, "%s: MRQ=NULL; events=%08X; event_mask=%08X\n", @@ -2146,6 +2214,36 @@ static int msdc_get_cd(struct mmc_host *mmc) return !val; } +static void msdc_cqe_enable(struct mmc_host *mmc) +{ + struct msdc_host *host = mmc_priv(mmc); + + /* enable cmdq irq */ + writel(MSDC_INT_CMDQ, host->base + MSDC_INTEN); + /* enable busy check */ + sdr_set_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); + /* default write data / busy timeout 20s */ + msdc_set_busy_timeout(host, 20 * 1000000000ULL, 0); + /* default read data timeout 1s */ + msdc_set_timeout(host, 1000000000ULL, 0); +} + +void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) +{ + struct msdc_host *host = mmc_priv(mmc); + + /* disable cmdq irq */ + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INT_CMDQ); + /* disable busy check */ + sdr_clr_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); + + if (recovery) { + sdr_set_field(host->base + MSDC_DMA_CTRL, + MSDC_DMA_CTRL_STOP, 1); + msdc_reset_hw(host); + } +} + static const struct mmc_host_ops mt_msdc_ops = { .post_req = msdc_post_req, .pre_req = msdc_pre_req, @@ -2162,6 +2260,11 @@ static const struct mmc_host_ops mt_msdc_ops = { .hw_reset = msdc_hw_reset, }; +static const struct cqhci_host_ops msdc_cmdq_ops = { + .enable = msdc_cqe_enable, + .disable = msdc_cqe_disable, +}; + static void msdc_of_property_parse(struct platform_device *pdev, struct msdc_host *host) { @@ -2312,6 +2415,22 @@ static int msdc_drv_probe(struct platform_device *pdev) host->dma_mask = DMA_BIT_MASK(32); mmc_dev(mmc)->dma_mask = &host->dma_mask; +#if IS_ENABLED(CONFIG_MMC_CQHCI) + if (mmc->caps2 & MMC_CAP2_CQE) { + host->cq_host = devm_kzalloc(host->mmc->parent, + sizeof(*host->cq_host), + GFP_KERNEL); + host->cq_host->caps |= CQHCI_TASK_DESC_SZ_128; + host->cq_host->mmio = host->base + 0x800; + host->cq_host->ops = &msdc_cmdq_ops; + cqhci_init(host->cq_host, mmc, true); + mmc->max_segs = 128; + /* cqhci 16bit length */ + /* 0 size, means 65536 so we don't have to -1 here */ + mmc->max_seg_size = 64 * 1024; + } +#endif + host->timeout_clks = 3 * 1048576; host->dma.gpd = dma_alloc_coherent(&pdev->dev, 2 * sizeof(struct mt_gpdma_desc), -- 2.6.4 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 4/5] mmc: mediatek: command queue support @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel Support command queue for mt6779 platform. a. Add msdc_set_busy_timeout() to calculate emmc write timeout b. Connect mtk msdc driver to cqhci driver through host->cq_host->ops = &msdc_cmdq_ops; c. msdc_cmdq_irq() will link up with cqchi_irq(). Besides, it provides more irq error messages like RSPCRCERR/CMDTO/DATACRCERR/DATTMO. d. Use the options below to separate support for CQHCI or not, because some of our platform does not support CQHCI hence no kernel option: CONFIG_MMC_CQHCI. #if IS_ENABLED(CONFIG_MMC_CQHCI) XXX //Support CQHCI #else XXX //Not support CQHCI #endif Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/host/mtk-sd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index a2328fb..8516888 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -31,6 +31,8 @@ #include <linux/mmc/sdio.h> #include <linux/mmc/slot-gpio.h> +#include "cqhci.h" + #define MAX_BD_NUM 1024 /*--------------------------------------------------------------------------*/ @@ -151,6 +153,7 @@ #define MSDC_INT_DMA_BDCSERR (0x1 << 17) /* W1C */ #define MSDC_INT_DMA_GPDCSERR (0x1 << 18) /* W1C */ #define MSDC_INT_DMA_PROTECT (0x1 << 19) /* W1C */ +#define MSDC_INT_CMDQ (0x1 << 28) /* W1C */ /* MSDC_INTEN mask */ #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */ @@ -181,6 +184,7 @@ /* SDC_CFG mask */ #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */ #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */ +#define SDC_CFG_WRDTOC (0x1fff << 2) /* RW */ #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */ #define SDC_CFG_SDIO (0x1 << 19) /* RW */ #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */ @@ -229,6 +233,7 @@ #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ #define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ +#define MSDC_PB1_BUSY_CHECK_SEL (0x1 << 7) /* RW */ #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ @@ -432,6 +437,7 @@ struct msdc_host { struct msdc_save_para save_para; /* used when gate HCLK */ struct msdc_tune_para def_tune_para; /* default tune setting */ struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */ + struct cqhci_host *cq_host; }; static const struct mtk_mmc_compatible mt8135_compat = { @@ -528,6 +534,18 @@ static const struct mtk_mmc_compatible mt7620_compat = { .use_internal_cd = true, }; +static const struct mtk_mmc_compatible mt6779_compat = { + .clk_div_bits = 12, + .hs400_tune = false, + .pad_tune_reg = MSDC_PAD_TUNE0, + .async_fifo = true, + .data_tune = true, + .busy_check = true, + .stop_clk_fix = true, + .enhance_rx = true, + .support_64g = true, +}; + static const struct of_device_id msdc_of_ids[] = { { .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat}, { .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat}, @@ -537,6 +555,7 @@ static const struct of_device_id msdc_of_ids[] = { { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, + { .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, {} }; MODULE_DEVICE_TABLE(of, msdc_of_ids); @@ -740,6 +759,15 @@ static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) (u32)(timeout > 255 ? 255 : timeout)); } +static void msdc_set_busy_timeout(struct msdc_host *host, u64 ns, u64 clks) +{ + u64 timeout; + + timeout = msdc_timeout_cal(host, ns, clks); + sdr_set_field(host->base + SDC_CFG, SDC_CFG_WRDTOC, + (u32)(timeout > 8191 ? 8191 : timeout)); +} + static void msdc_gate_clock(struct msdc_host *host) { clk_disable_unprepare(host->src_clk_cg); @@ -1426,6 +1454,36 @@ static void msdc_enable_sdio_irq(struct mmc_host *mmc, int enb) pm_runtime_put_noidle(host->dev); } +#if IS_ENABLED(CONFIG_MMC_CQHCI) +static irqreturn_t msdc_cmdq_irq(struct msdc_host *host, u32 intsts) +{ + int cmd_err = 0, dat_err = 0; + + if (intsts & MSDC_INT_RSPCRCERR) { + cmd_err = (unsigned int)-EILSEQ; + dev_err(host->dev, "%s: CMD CRC ERR", __func__); + } else if (intsts & MSDC_INT_CMDTMO) { + cmd_err = (unsigned int)-ETIMEDOUT; + dev_err(host->dev, "%s: CMD TIMEOUT ERR", __func__); + } + + if (intsts & MSDC_INT_DATCRCERR) { + dat_err = (unsigned int)-EILSEQ; + dev_err(host->dev, "%s: DATA CRC ERR", __func__); + } else if (intsts & MSDC_INT_DATTMO) { + dat_err = (unsigned int)-ETIMEDOUT; + dev_err(host->dev, "%s: DATA TIMEOUT ERR", __func__); + } + + if (cmd_err || dat_err) { + dev_err(host->dev, "cmd_err = %d, dat_err =%d, intsts = 0x%x", + cmd_err, dat_err, intsts); + } + + return cqhci_irq(host->mmc, 0, cmd_err, dat_err); +} +#endif + static irqreturn_t msdc_irq(int irq, void *dev_id) { struct msdc_host *host = (struct msdc_host *) dev_id; @@ -1462,6 +1520,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ))) break; +#if IS_ENABLED(CONFIG_MMC_CQHCI) + if ((host->mmc->caps2 & MMC_CAP2_CQE) && + (events & MSDC_INT_CMDQ)) { + msdc_cmdq_irq(host, events); + /* clear interrupts */ + writel(events, host->base + MSDC_INT); + return IRQ_HANDLED; + } +#endif + if (!mrq) { dev_err(host->dev, "%s: MRQ=NULL; events=%08X; event_mask=%08X\n", @@ -2146,6 +2214,36 @@ static int msdc_get_cd(struct mmc_host *mmc) return !val; } +static void msdc_cqe_enable(struct mmc_host *mmc) +{ + struct msdc_host *host = mmc_priv(mmc); + + /* enable cmdq irq */ + writel(MSDC_INT_CMDQ, host->base + MSDC_INTEN); + /* enable busy check */ + sdr_set_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); + /* default write data / busy timeout 20s */ + msdc_set_busy_timeout(host, 20 * 1000000000ULL, 0); + /* default read data timeout 1s */ + msdc_set_timeout(host, 1000000000ULL, 0); +} + +void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) +{ + struct msdc_host *host = mmc_priv(mmc); + + /* disable cmdq irq */ + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INT_CMDQ); + /* disable busy check */ + sdr_clr_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); + + if (recovery) { + sdr_set_field(host->base + MSDC_DMA_CTRL, + MSDC_DMA_CTRL_STOP, 1); + msdc_reset_hw(host); + } +} + static const struct mmc_host_ops mt_msdc_ops = { .post_req = msdc_post_req, .pre_req = msdc_pre_req, @@ -2162,6 +2260,11 @@ static const struct mmc_host_ops mt_msdc_ops = { .hw_reset = msdc_hw_reset, }; +static const struct cqhci_host_ops msdc_cmdq_ops = { + .enable = msdc_cqe_enable, + .disable = msdc_cqe_disable, +}; + static void msdc_of_property_parse(struct platform_device *pdev, struct msdc_host *host) { @@ -2312,6 +2415,22 @@ static int msdc_drv_probe(struct platform_device *pdev) host->dma_mask = DMA_BIT_MASK(32); mmc_dev(mmc)->dma_mask = &host->dma_mask; +#if IS_ENABLED(CONFIG_MMC_CQHCI) + if (mmc->caps2 & MMC_CAP2_CQE) { + host->cq_host = devm_kzalloc(host->mmc->parent, + sizeof(*host->cq_host), + GFP_KERNEL); + host->cq_host->caps |= CQHCI_TASK_DESC_SZ_128; + host->cq_host->mmio = host->base + 0x800; + host->cq_host->ops = &msdc_cmdq_ops; + cqhci_init(host->cq_host, mmc, true); + mmc->max_segs = 128; + /* cqhci 16bit length */ + /* 0 size, means 65536 so we don't have to -1 here */ + mmc->max_seg_size = 64 * 1024; + } +#endif + host->timeout_clks = 3 * 1048576; host->dma.gpd = dma_alloc_coherent(&pdev->dev, 2 * sizeof(struct mt_gpdma_desc), -- 2.6.4 _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 4/5] mmc: mediatek: command queue support @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu Support command queue for mt6779 platform. a. Add msdc_set_busy_timeout() to calculate emmc write timeout b. Connect mtk msdc driver to cqhci driver through host->cq_host->ops = &msdc_cmdq_ops; c. msdc_cmdq_irq() will link up with cqchi_irq(). Besides, it provides more irq error messages like RSPCRCERR/CMDTO/DATACRCERR/DATTMO. d. Use the options below to separate support for CQHCI or not, because some of our platform does not support CQHCI hence no kernel option: CONFIG_MMC_CQHCI. #if IS_ENABLED(CONFIG_MMC_CQHCI) XXX //Support CQHCI #else XXX //Not support CQHCI #endif Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/host/mtk-sd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 119 insertions(+) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index a2328fb..8516888 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -31,6 +31,8 @@ #include <linux/mmc/sdio.h> #include <linux/mmc/slot-gpio.h> +#include "cqhci.h" + #define MAX_BD_NUM 1024 /*--------------------------------------------------------------------------*/ @@ -151,6 +153,7 @@ #define MSDC_INT_DMA_BDCSERR (0x1 << 17) /* W1C */ #define MSDC_INT_DMA_GPDCSERR (0x1 << 18) /* W1C */ #define MSDC_INT_DMA_PROTECT (0x1 << 19) /* W1C */ +#define MSDC_INT_CMDQ (0x1 << 28) /* W1C */ /* MSDC_INTEN mask */ #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */ @@ -181,6 +184,7 @@ /* SDC_CFG mask */ #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */ #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */ +#define SDC_CFG_WRDTOC (0x1fff << 2) /* RW */ #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */ #define SDC_CFG_SDIO (0x1 << 19) /* RW */ #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */ @@ -229,6 +233,7 @@ #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ #define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ +#define MSDC_PB1_BUSY_CHECK_SEL (0x1 << 7) /* RW */ #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ @@ -432,6 +437,7 @@ struct msdc_host { struct msdc_save_para save_para; /* used when gate HCLK */ struct msdc_tune_para def_tune_para; /* default tune setting */ struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */ + struct cqhci_host *cq_host; }; static const struct mtk_mmc_compatible mt8135_compat = { @@ -528,6 +534,18 @@ static const struct mtk_mmc_compatible mt7620_compat = { .use_internal_cd = true, }; +static const struct mtk_mmc_compatible mt6779_compat = { + .clk_div_bits = 12, + .hs400_tune = false, + .pad_tune_reg = MSDC_PAD_TUNE0, + .async_fifo = true, + .data_tune = true, + .busy_check = true, + .stop_clk_fix = true, + .enhance_rx = true, + .support_64g = true, +}; + static const struct of_device_id msdc_of_ids[] = { { .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat}, { .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat}, @@ -537,6 +555,7 @@ static const struct of_device_id msdc_of_ids[] = { { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, + { .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, {} }; MODULE_DEVICE_TABLE(of, msdc_of_ids); @@ -740,6 +759,15 @@ static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) (u32)(timeout > 255 ? 255 : timeout)); } +static void msdc_set_busy_timeout(struct msdc_host *host, u64 ns, u64 clks) +{ + u64 timeout; + + timeout = msdc_timeout_cal(host, ns, clks); + sdr_set_field(host->base + SDC_CFG, SDC_CFG_WRDTOC, + (u32)(timeout > 8191 ? 8191 : timeout)); +} + static void msdc_gate_clock(struct msdc_host *host) { clk_disable_unprepare(host->src_clk_cg); @@ -1426,6 +1454,36 @@ static void msdc_enable_sdio_irq(struct mmc_host *mmc, int enb) pm_runtime_put_noidle(host->dev); } +#if IS_ENABLED(CONFIG_MMC_CQHCI) +static irqreturn_t msdc_cmdq_irq(struct msdc_host *host, u32 intsts) +{ + int cmd_err = 0, dat_err = 0; + + if (intsts & MSDC_INT_RSPCRCERR) { + cmd_err = (unsigned int)-EILSEQ; + dev_err(host->dev, "%s: CMD CRC ERR", __func__); + } else if (intsts & MSDC_INT_CMDTMO) { + cmd_err = (unsigned int)-ETIMEDOUT; + dev_err(host->dev, "%s: CMD TIMEOUT ERR", __func__); + } + + if (intsts & MSDC_INT_DATCRCERR) { + dat_err = (unsigned int)-EILSEQ; + dev_err(host->dev, "%s: DATA CRC ERR", __func__); + } else if (intsts & MSDC_INT_DATTMO) { + dat_err = (unsigned int)-ETIMEDOUT; + dev_err(host->dev, "%s: DATA TIMEOUT ERR", __func__); + } + + if (cmd_err || dat_err) { + dev_err(host->dev, "cmd_err = %d, dat_err =%d, intsts = 0x%x", + cmd_err, dat_err, intsts); + } + + return cqhci_irq(host->mmc, 0, cmd_err, dat_err); +} +#endif + static irqreturn_t msdc_irq(int irq, void *dev_id) { struct msdc_host *host = (struct msdc_host *) dev_id; @@ -1462,6 +1520,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ))) break; +#if IS_ENABLED(CONFIG_MMC_CQHCI) + if ((host->mmc->caps2 & MMC_CAP2_CQE) && + (events & MSDC_INT_CMDQ)) { + msdc_cmdq_irq(host, events); + /* clear interrupts */ + writel(events, host->base + MSDC_INT); + return IRQ_HANDLED; + } +#endif + if (!mrq) { dev_err(host->dev, "%s: MRQ=NULL; events=%08X; event_mask=%08X\n", @@ -2146,6 +2214,36 @@ static int msdc_get_cd(struct mmc_host *mmc) return !val; } +static void msdc_cqe_enable(struct mmc_host *mmc) +{ + struct msdc_host *host = mmc_priv(mmc); + + /* enable cmdq irq */ + writel(MSDC_INT_CMDQ, host->base + MSDC_INTEN); + /* enable busy check */ + sdr_set_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); + /* default write data / busy timeout 20s */ + msdc_set_busy_timeout(host, 20 * 1000000000ULL, 0); + /* default read data timeout 1s */ + msdc_set_timeout(host, 1000000000ULL, 0); +} + +void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) +{ + struct msdc_host *host = mmc_priv(mmc); + + /* disable cmdq irq */ + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INT_CMDQ); + /* disable busy check */ + sdr_clr_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); + + if (recovery) { + sdr_set_field(host->base + MSDC_DMA_CTRL, + MSDC_DMA_CTRL_STOP, 1); + msdc_reset_hw(host); + } +} + static const struct mmc_host_ops mt_msdc_ops = { .post_req = msdc_post_req, .pre_req = msdc_pre_req, @@ -2162,6 +2260,11 @@ static const struct mmc_host_ops mt_msdc_ops = { .hw_reset = msdc_hw_reset, }; +static const struct cqhci_host_ops msdc_cmdq_ops = { + .enable = msdc_cqe_enable, + .disable = msdc_cqe_disable, +}; + static void msdc_of_property_parse(struct platform_device *pdev, struct msdc_host *host) { @@ -2312,6 +2415,22 @@ static int msdc_drv_probe(struct platform_device *pdev) host->dma_mask = DMA_BIT_MASK(32); mmc_dev(mmc)->dma_mask = &host->dma_mask; +#if IS_ENABLED(CONFIG_MMC_CQHCI) + if (mmc->caps2 & MMC_CAP2_CQE) { + host->cq_host = devm_kzalloc(host->mmc->parent, + sizeof(*host->cq_host), + GFP_KERNEL); + host->cq_host->caps |= CQHCI_TASK_DESC_SZ_128; + host->cq_host->mmio = host->base + 0x800; + host->cq_host->ops = &msdc_cmdq_ops; + cqhci_init(host->cq_host, mmc, true); + mmc->max_segs = 128; + /* cqhci 16bit length */ + /* 0 size, means 65536 so we don't have to -1 here */ + mmc->max_seg_size = 64 * 1024; + } +#endif + host->timeout_clks = 3 * 1048576; host->dma.gpd = dma_alloc_coherent(&pdev->dev, 2 * sizeof(struct mt_gpdma_desc), -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
[parent not found: <1588031768-23677-5-git-send-email-chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>]
* Re: [PATCH v5 4/5] mmc: mediatek: command queue support 2020-04-27 23:56 ` Chun-Hung Wu (?) (?) @ 2020-04-28 13:02 ` yong.mao -1 siblings, 0 replies; 53+ messages in thread From: yong.mao-NuS5LvNUpcJWk0Htik3J/w @ 2020-04-28 13:02 UTC (permalink / raw) To: Chun-Hung Wu Cc: mirq-linux-CoA6ZxLDdyEEUmgCuDUIdw, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list-dY08KVG/lbpWk0Htik3J/w, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman On Tue, 2020-04-28 at 07:56 +0800, Chun-Hung Wu wrote: > Support command queue for mt6779 platform. > a. Add msdc_set_busy_timeout() to calculate emmc write timeout > b. Connect mtk msdc driver to cqhci driver through > host->cq_host->ops = &msdc_cmdq_ops; > c. msdc_cmdq_irq() will link up with cqchi_irq(). Besides, it provides > more irq error messages like RSPCRCERR/CMDTO/DATACRCERR/DATTMO. > d. Use the options below to separate support for CQHCI or not, because > some of our platform does not support CQHCI hence no kernel option: > CONFIG_MMC_CQHCI. > #if IS_ENABLED(CONFIG_MMC_CQHCI) > XXX //Support CQHCI > #else > XXX //Not support CQHCI > #endif > Please split this patch into following patches 1. support mt6779 in mtk-sd.c 2. add new API for calculate timeout 3. support cmdq feature > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > --- > drivers/mmc/host/mtk-sd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 119 insertions(+) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index a2328fb..8516888 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -31,6 +31,8 @@ > #include <linux/mmc/sdio.h> > #include <linux/mmc/slot-gpio.h> > > +#include "cqhci.h" > + > #define MAX_BD_NUM 1024 > > /*--------------------------------------------------------------------------*/ > @@ -151,6 +153,7 @@ > #define MSDC_INT_DMA_BDCSERR (0x1 << 17) /* W1C */ > #define MSDC_INT_DMA_GPDCSERR (0x1 << 18) /* W1C */ > #define MSDC_INT_DMA_PROTECT (0x1 << 19) /* W1C */ > +#define MSDC_INT_CMDQ (0x1 << 28) /* W1C */ > > /* MSDC_INTEN mask */ > #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */ > @@ -181,6 +184,7 @@ > /* SDC_CFG mask */ > #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */ > #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */ > +#define SDC_CFG_WRDTOC (0x1fff << 2) /* RW */ > #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */ > #define SDC_CFG_SDIO (0x1 << 19) /* RW */ > #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */ > @@ -229,6 +233,7 @@ > #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ > > #define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ > +#define MSDC_PB1_BUSY_CHECK_SEL (0x1 << 7) /* RW */ > #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ > > #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ > @@ -432,6 +437,7 @@ struct msdc_host { > struct msdc_save_para save_para; /* used when gate HCLK */ > struct msdc_tune_para def_tune_para; /* default tune setting */ > struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */ > + struct cqhci_host *cq_host; > }; > > static const struct mtk_mmc_compatible mt8135_compat = { > @@ -528,6 +534,18 @@ static const struct mtk_mmc_compatible mt7620_compat = { > .use_internal_cd = true, > }; > > +static const struct mtk_mmc_compatible mt6779_compat = { > + .clk_div_bits = 12, > + .hs400_tune = false, > + .pad_tune_reg = MSDC_PAD_TUNE0, > + .async_fifo = true, > + .data_tune = true, > + .busy_check = true, > + .stop_clk_fix = true, > + .enhance_rx = true, > + .support_64g = true, > +}; > + > static const struct of_device_id msdc_of_ids[] = { > { .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat}, > { .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat}, > @@ -537,6 +555,7 @@ static const struct of_device_id msdc_of_ids[] = { > { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, > { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, > { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, > + { .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, > {} > }; > MODULE_DEVICE_TABLE(of, msdc_of_ids); > @@ -740,6 +759,15 @@ static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) > (u32)(timeout > 255 ? 255 : timeout)); > } > > +static void msdc_set_busy_timeout(struct msdc_host *host, u64 ns, u64 clks) > +{ > + u64 timeout; > + > + timeout = msdc_timeout_cal(host, ns, clks); > + sdr_set_field(host->base + SDC_CFG, SDC_CFG_WRDTOC, > + (u32)(timeout > 8191 ? 8191 : timeout)); > +} > + > static void msdc_gate_clock(struct msdc_host *host) > { > clk_disable_unprepare(host->src_clk_cg); > @@ -1426,6 +1454,36 @@ static void msdc_enable_sdio_irq(struct mmc_host *mmc, int enb) > pm_runtime_put_noidle(host->dev); > } > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > +static irqreturn_t msdc_cmdq_irq(struct msdc_host *host, u32 intsts) > +{ > + int cmd_err = 0, dat_err = 0; > + > + if (intsts & MSDC_INT_RSPCRCERR) { > + cmd_err = (unsigned int)-EILSEQ; > + dev_err(host->dev, "%s: CMD CRC ERR", __func__); > + } else if (intsts & MSDC_INT_CMDTMO) { > + cmd_err = (unsigned int)-ETIMEDOUT; > + dev_err(host->dev, "%s: CMD TIMEOUT ERR", __func__); > + } > + > + if (intsts & MSDC_INT_DATCRCERR) { > + dat_err = (unsigned int)-EILSEQ; > + dev_err(host->dev, "%s: DATA CRC ERR", __func__); > + } else if (intsts & MSDC_INT_DATTMO) { > + dat_err = (unsigned int)-ETIMEDOUT; > + dev_err(host->dev, "%s: DATA TIMEOUT ERR", __func__); > + } > + > + if (cmd_err || dat_err) { > + dev_err(host->dev, "cmd_err = %d, dat_err =%d, intsts = 0x%x", > + cmd_err, dat_err, intsts); > + } > + > + return cqhci_irq(host->mmc, 0, cmd_err, dat_err); > +} > +#endif > + > static irqreturn_t msdc_irq(int irq, void *dev_id) > { > struct msdc_host *host = (struct msdc_host *) dev_id; > @@ -1462,6 +1520,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) > if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ))) > break; > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > + if ((host->mmc->caps2 & MMC_CAP2_CQE) && > + (events & MSDC_INT_CMDQ)) { > + msdc_cmdq_irq(host, events); > + /* clear interrupts */ > + writel(events, host->base + MSDC_INT); > + return IRQ_HANDLED; > + } > +#endif > + > if (!mrq) { > dev_err(host->dev, > "%s: MRQ=NULL; events=%08X; event_mask=%08X\n", > @@ -2146,6 +2214,36 @@ static int msdc_get_cd(struct mmc_host *mmc) > return !val; > } > > +static void msdc_cqe_enable(struct mmc_host *mmc) > +{ > + struct msdc_host *host = mmc_priv(mmc); > + > + /* enable cmdq irq */ > + writel(MSDC_INT_CMDQ, host->base + MSDC_INTEN); > + /* enable busy check */ > + sdr_set_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); > + /* default write data / busy timeout 20s */ > + msdc_set_busy_timeout(host, 20 * 1000000000ULL, 0); > + /* default read data timeout 1s */ > + msdc_set_timeout(host, 1000000000ULL, 0); > +} > + > +void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) > +{ > + struct msdc_host *host = mmc_priv(mmc); > + > + /* disable cmdq irq */ > + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INT_CMDQ); > + /* disable busy check */ > + sdr_clr_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); > + > + if (recovery) { > + sdr_set_field(host->base + MSDC_DMA_CTRL, > + MSDC_DMA_CTRL_STOP, 1); > + msdc_reset_hw(host); > + } > +} > + > static const struct mmc_host_ops mt_msdc_ops = { > .post_req = msdc_post_req, > .pre_req = msdc_pre_req, > @@ -2162,6 +2260,11 @@ static const struct mmc_host_ops mt_msdc_ops = { > .hw_reset = msdc_hw_reset, > }; > > +static const struct cqhci_host_ops msdc_cmdq_ops = { > + .enable = msdc_cqe_enable, > + .disable = msdc_cqe_disable, > +}; > + > static void msdc_of_property_parse(struct platform_device *pdev, > struct msdc_host *host) > { > @@ -2312,6 +2415,22 @@ static int msdc_drv_probe(struct platform_device *pdev) > host->dma_mask = DMA_BIT_MASK(32); > mmc_dev(mmc)->dma_mask = &host->dma_mask; > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > + if (mmc->caps2 & MMC_CAP2_CQE) { > + host->cq_host = devm_kzalloc(host->mmc->parent, > + sizeof(*host->cq_host), > + GFP_KERNEL); should free this memory if it is not used any more. > + host->cq_host->caps |= CQHCI_TASK_DESC_SZ_128; > + host->cq_host->mmio = host->base + 0x800; > + host->cq_host->ops = &msdc_cmdq_ops; > + cqhci_init(host->cq_host, mmc, true); > + mmc->max_segs = 128; > + /* cqhci 16bit length */ > + /* 0 size, means 65536 so we don't have to -1 here */ > + mmc->max_seg_size = 64 * 1024; > + } > +#endif > + > host->timeout_clks = 3 * 1048576; > host->dma.gpd = dma_alloc_coherent(&pdev->dev, > 2 * sizeof(struct mt_gpdma_desc), ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 4/5] mmc: mediatek: command queue support @ 2020-04-28 13:02 ` yong.mao 0 siblings, 0 replies; 53+ messages in thread From: yong.mao @ 2020-04-28 13:02 UTC (permalink / raw) To: Chun-Hung Wu Cc: Mark Rutland, Kate Stewart, Ulf Hansson, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, bcm-kernel-feedback-list, Allison Randal, kernel-team, Pan Bian, devicetree, Martin Blumenstingl, linux-arm-msm, mirq-linux, Rob Herring, linux-mediatek, Matthias Brugger, Thomas Gleixner, Stanley Chu, Chaotian Jing, linux-arm-kernel, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, linux-kernel On Tue, 2020-04-28 at 07:56 +0800, Chun-Hung Wu wrote: > Support command queue for mt6779 platform. > a. Add msdc_set_busy_timeout() to calculate emmc write timeout > b. Connect mtk msdc driver to cqhci driver through > host->cq_host->ops = &msdc_cmdq_ops; > c. msdc_cmdq_irq() will link up with cqchi_irq(). Besides, it provides > more irq error messages like RSPCRCERR/CMDTO/DATACRCERR/DATTMO. > d. Use the options below to separate support for CQHCI or not, because > some of our platform does not support CQHCI hence no kernel option: > CONFIG_MMC_CQHCI. > #if IS_ENABLED(CONFIG_MMC_CQHCI) > XXX //Support CQHCI > #else > XXX //Not support CQHCI > #endif > Please split this patch into following patches 1. support mt6779 in mtk-sd.c 2. add new API for calculate timeout 3. support cmdq feature > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > --- > drivers/mmc/host/mtk-sd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 119 insertions(+) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index a2328fb..8516888 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -31,6 +31,8 @@ > #include <linux/mmc/sdio.h> > #include <linux/mmc/slot-gpio.h> > > +#include "cqhci.h" > + > #define MAX_BD_NUM 1024 > > /*--------------------------------------------------------------------------*/ > @@ -151,6 +153,7 @@ > #define MSDC_INT_DMA_BDCSERR (0x1 << 17) /* W1C */ > #define MSDC_INT_DMA_GPDCSERR (0x1 << 18) /* W1C */ > #define MSDC_INT_DMA_PROTECT (0x1 << 19) /* W1C */ > +#define MSDC_INT_CMDQ (0x1 << 28) /* W1C */ > > /* MSDC_INTEN mask */ > #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */ > @@ -181,6 +184,7 @@ > /* SDC_CFG mask */ > #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */ > #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */ > +#define SDC_CFG_WRDTOC (0x1fff << 2) /* RW */ > #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */ > #define SDC_CFG_SDIO (0x1 << 19) /* RW */ > #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */ > @@ -229,6 +233,7 @@ > #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ > > #define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ > +#define MSDC_PB1_BUSY_CHECK_SEL (0x1 << 7) /* RW */ > #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ > > #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ > @@ -432,6 +437,7 @@ struct msdc_host { > struct msdc_save_para save_para; /* used when gate HCLK */ > struct msdc_tune_para def_tune_para; /* default tune setting */ > struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */ > + struct cqhci_host *cq_host; > }; > > static const struct mtk_mmc_compatible mt8135_compat = { > @@ -528,6 +534,18 @@ static const struct mtk_mmc_compatible mt7620_compat = { > .use_internal_cd = true, > }; > > +static const struct mtk_mmc_compatible mt6779_compat = { > + .clk_div_bits = 12, > + .hs400_tune = false, > + .pad_tune_reg = MSDC_PAD_TUNE0, > + .async_fifo = true, > + .data_tune = true, > + .busy_check = true, > + .stop_clk_fix = true, > + .enhance_rx = true, > + .support_64g = true, > +}; > + > static const struct of_device_id msdc_of_ids[] = { > { .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat}, > { .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat}, > @@ -537,6 +555,7 @@ static const struct of_device_id msdc_of_ids[] = { > { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, > { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, > { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, > + { .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, > {} > }; > MODULE_DEVICE_TABLE(of, msdc_of_ids); > @@ -740,6 +759,15 @@ static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) > (u32)(timeout > 255 ? 255 : timeout)); > } > > +static void msdc_set_busy_timeout(struct msdc_host *host, u64 ns, u64 clks) > +{ > + u64 timeout; > + > + timeout = msdc_timeout_cal(host, ns, clks); > + sdr_set_field(host->base + SDC_CFG, SDC_CFG_WRDTOC, > + (u32)(timeout > 8191 ? 8191 : timeout)); > +} > + > static void msdc_gate_clock(struct msdc_host *host) > { > clk_disable_unprepare(host->src_clk_cg); > @@ -1426,6 +1454,36 @@ static void msdc_enable_sdio_irq(struct mmc_host *mmc, int enb) > pm_runtime_put_noidle(host->dev); > } > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > +static irqreturn_t msdc_cmdq_irq(struct msdc_host *host, u32 intsts) > +{ > + int cmd_err = 0, dat_err = 0; > + > + if (intsts & MSDC_INT_RSPCRCERR) { > + cmd_err = (unsigned int)-EILSEQ; > + dev_err(host->dev, "%s: CMD CRC ERR", __func__); > + } else if (intsts & MSDC_INT_CMDTMO) { > + cmd_err = (unsigned int)-ETIMEDOUT; > + dev_err(host->dev, "%s: CMD TIMEOUT ERR", __func__); > + } > + > + if (intsts & MSDC_INT_DATCRCERR) { > + dat_err = (unsigned int)-EILSEQ; > + dev_err(host->dev, "%s: DATA CRC ERR", __func__); > + } else if (intsts & MSDC_INT_DATTMO) { > + dat_err = (unsigned int)-ETIMEDOUT; > + dev_err(host->dev, "%s: DATA TIMEOUT ERR", __func__); > + } > + > + if (cmd_err || dat_err) { > + dev_err(host->dev, "cmd_err = %d, dat_err =%d, intsts = 0x%x", > + cmd_err, dat_err, intsts); > + } > + > + return cqhci_irq(host->mmc, 0, cmd_err, dat_err); > +} > +#endif > + > static irqreturn_t msdc_irq(int irq, void *dev_id) > { > struct msdc_host *host = (struct msdc_host *) dev_id; > @@ -1462,6 +1520,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) > if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ))) > break; > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > + if ((host->mmc->caps2 & MMC_CAP2_CQE) && > + (events & MSDC_INT_CMDQ)) { > + msdc_cmdq_irq(host, events); > + /* clear interrupts */ > + writel(events, host->base + MSDC_INT); > + return IRQ_HANDLED; > + } > +#endif > + > if (!mrq) { > dev_err(host->dev, > "%s: MRQ=NULL; events=%08X; event_mask=%08X\n", > @@ -2146,6 +2214,36 @@ static int msdc_get_cd(struct mmc_host *mmc) > return !val; > } > > +static void msdc_cqe_enable(struct mmc_host *mmc) > +{ > + struct msdc_host *host = mmc_priv(mmc); > + > + /* enable cmdq irq */ > + writel(MSDC_INT_CMDQ, host->base + MSDC_INTEN); > + /* enable busy check */ > + sdr_set_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); > + /* default write data / busy timeout 20s */ > + msdc_set_busy_timeout(host, 20 * 1000000000ULL, 0); > + /* default read data timeout 1s */ > + msdc_set_timeout(host, 1000000000ULL, 0); > +} > + > +void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) > +{ > + struct msdc_host *host = mmc_priv(mmc); > + > + /* disable cmdq irq */ > + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INT_CMDQ); > + /* disable busy check */ > + sdr_clr_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); > + > + if (recovery) { > + sdr_set_field(host->base + MSDC_DMA_CTRL, > + MSDC_DMA_CTRL_STOP, 1); > + msdc_reset_hw(host); > + } > +} > + > static const struct mmc_host_ops mt_msdc_ops = { > .post_req = msdc_post_req, > .pre_req = msdc_pre_req, > @@ -2162,6 +2260,11 @@ static const struct mmc_host_ops mt_msdc_ops = { > .hw_reset = msdc_hw_reset, > }; > > +static const struct cqhci_host_ops msdc_cmdq_ops = { > + .enable = msdc_cqe_enable, > + .disable = msdc_cqe_disable, > +}; > + > static void msdc_of_property_parse(struct platform_device *pdev, > struct msdc_host *host) > { > @@ -2312,6 +2415,22 @@ static int msdc_drv_probe(struct platform_device *pdev) > host->dma_mask = DMA_BIT_MASK(32); > mmc_dev(mmc)->dma_mask = &host->dma_mask; > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > + if (mmc->caps2 & MMC_CAP2_CQE) { > + host->cq_host = devm_kzalloc(host->mmc->parent, > + sizeof(*host->cq_host), > + GFP_KERNEL); should free this memory if it is not used any more. > + host->cq_host->caps |= CQHCI_TASK_DESC_SZ_128; > + host->cq_host->mmio = host->base + 0x800; > + host->cq_host->ops = &msdc_cmdq_ops; > + cqhci_init(host->cq_host, mmc, true); > + mmc->max_segs = 128; > + /* cqhci 16bit length */ > + /* 0 size, means 65536 so we don't have to -1 here */ > + mmc->max_seg_size = 64 * 1024; > + } > +#endif > + > host->timeout_clks = 3 * 1048576; > host->dma.gpd = dma_alloc_coherent(&pdev->dev, > 2 * sizeof(struct mt_gpdma_desc), _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 4/5] mmc: mediatek: command queue support @ 2020-04-28 13:02 ` yong.mao 0 siblings, 0 replies; 53+ messages in thread From: yong.mao @ 2020-04-28 13:02 UTC (permalink / raw) To: Chun-Hung Wu Cc: Mark Rutland, Kate Stewart, Ulf Hansson, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, bcm-kernel-feedback-list, Allison Randal, kernel-team, Pan Bian, devicetree, Martin Blumenstingl, linux-arm-msm, mirq-linux, Rob Herring, linux-mediatek, Matthias Brugger, Thomas Gleixner, Stanley Chu, Chaotian Jing, linux-arm-kernel, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, linux-kernel On Tue, 2020-04-28 at 07:56 +0800, Chun-Hung Wu wrote: > Support command queue for mt6779 platform. > a. Add msdc_set_busy_timeout() to calculate emmc write timeout > b. Connect mtk msdc driver to cqhci driver through > host->cq_host->ops = &msdc_cmdq_ops; > c. msdc_cmdq_irq() will link up with cqchi_irq(). Besides, it provides > more irq error messages like RSPCRCERR/CMDTO/DATACRCERR/DATTMO. > d. Use the options below to separate support for CQHCI or not, because > some of our platform does not support CQHCI hence no kernel option: > CONFIG_MMC_CQHCI. > #if IS_ENABLED(CONFIG_MMC_CQHCI) > XXX //Support CQHCI > #else > XXX //Not support CQHCI > #endif > Please split this patch into following patches 1. support mt6779 in mtk-sd.c 2. add new API for calculate timeout 3. support cmdq feature > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > --- > drivers/mmc/host/mtk-sd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 119 insertions(+) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index a2328fb..8516888 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -31,6 +31,8 @@ > #include <linux/mmc/sdio.h> > #include <linux/mmc/slot-gpio.h> > > +#include "cqhci.h" > + > #define MAX_BD_NUM 1024 > > /*--------------------------------------------------------------------------*/ > @@ -151,6 +153,7 @@ > #define MSDC_INT_DMA_BDCSERR (0x1 << 17) /* W1C */ > #define MSDC_INT_DMA_GPDCSERR (0x1 << 18) /* W1C */ > #define MSDC_INT_DMA_PROTECT (0x1 << 19) /* W1C */ > +#define MSDC_INT_CMDQ (0x1 << 28) /* W1C */ > > /* MSDC_INTEN mask */ > #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */ > @@ -181,6 +184,7 @@ > /* SDC_CFG mask */ > #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */ > #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */ > +#define SDC_CFG_WRDTOC (0x1fff << 2) /* RW */ > #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */ > #define SDC_CFG_SDIO (0x1 << 19) /* RW */ > #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */ > @@ -229,6 +233,7 @@ > #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ > > #define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ > +#define MSDC_PB1_BUSY_CHECK_SEL (0x1 << 7) /* RW */ > #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ > > #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ > @@ -432,6 +437,7 @@ struct msdc_host { > struct msdc_save_para save_para; /* used when gate HCLK */ > struct msdc_tune_para def_tune_para; /* default tune setting */ > struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */ > + struct cqhci_host *cq_host; > }; > > static const struct mtk_mmc_compatible mt8135_compat = { > @@ -528,6 +534,18 @@ static const struct mtk_mmc_compatible mt7620_compat = { > .use_internal_cd = true, > }; > > +static const struct mtk_mmc_compatible mt6779_compat = { > + .clk_div_bits = 12, > + .hs400_tune = false, > + .pad_tune_reg = MSDC_PAD_TUNE0, > + .async_fifo = true, > + .data_tune = true, > + .busy_check = true, > + .stop_clk_fix = true, > + .enhance_rx = true, > + .support_64g = true, > +}; > + > static const struct of_device_id msdc_of_ids[] = { > { .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat}, > { .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat}, > @@ -537,6 +555,7 @@ static const struct of_device_id msdc_of_ids[] = { > { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, > { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, > { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, > + { .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, > {} > }; > MODULE_DEVICE_TABLE(of, msdc_of_ids); > @@ -740,6 +759,15 @@ static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) > (u32)(timeout > 255 ? 255 : timeout)); > } > > +static void msdc_set_busy_timeout(struct msdc_host *host, u64 ns, u64 clks) > +{ > + u64 timeout; > + > + timeout = msdc_timeout_cal(host, ns, clks); > + sdr_set_field(host->base + SDC_CFG, SDC_CFG_WRDTOC, > + (u32)(timeout > 8191 ? 8191 : timeout)); > +} > + > static void msdc_gate_clock(struct msdc_host *host) > { > clk_disable_unprepare(host->src_clk_cg); > @@ -1426,6 +1454,36 @@ static void msdc_enable_sdio_irq(struct mmc_host *mmc, int enb) > pm_runtime_put_noidle(host->dev); > } > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > +static irqreturn_t msdc_cmdq_irq(struct msdc_host *host, u32 intsts) > +{ > + int cmd_err = 0, dat_err = 0; > + > + if (intsts & MSDC_INT_RSPCRCERR) { > + cmd_err = (unsigned int)-EILSEQ; > + dev_err(host->dev, "%s: CMD CRC ERR", __func__); > + } else if (intsts & MSDC_INT_CMDTMO) { > + cmd_err = (unsigned int)-ETIMEDOUT; > + dev_err(host->dev, "%s: CMD TIMEOUT ERR", __func__); > + } > + > + if (intsts & MSDC_INT_DATCRCERR) { > + dat_err = (unsigned int)-EILSEQ; > + dev_err(host->dev, "%s: DATA CRC ERR", __func__); > + } else if (intsts & MSDC_INT_DATTMO) { > + dat_err = (unsigned int)-ETIMEDOUT; > + dev_err(host->dev, "%s: DATA TIMEOUT ERR", __func__); > + } > + > + if (cmd_err || dat_err) { > + dev_err(host->dev, "cmd_err = %d, dat_err =%d, intsts = 0x%x", > + cmd_err, dat_err, intsts); > + } > + > + return cqhci_irq(host->mmc, 0, cmd_err, dat_err); > +} > +#endif > + > static irqreturn_t msdc_irq(int irq, void *dev_id) > { > struct msdc_host *host = (struct msdc_host *) dev_id; > @@ -1462,6 +1520,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) > if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ))) > break; > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > + if ((host->mmc->caps2 & MMC_CAP2_CQE) && > + (events & MSDC_INT_CMDQ)) { > + msdc_cmdq_irq(host, events); > + /* clear interrupts */ > + writel(events, host->base + MSDC_INT); > + return IRQ_HANDLED; > + } > +#endif > + > if (!mrq) { > dev_err(host->dev, > "%s: MRQ=NULL; events=%08X; event_mask=%08X\n", > @@ -2146,6 +2214,36 @@ static int msdc_get_cd(struct mmc_host *mmc) > return !val; > } > > +static void msdc_cqe_enable(struct mmc_host *mmc) > +{ > + struct msdc_host *host = mmc_priv(mmc); > + > + /* enable cmdq irq */ > + writel(MSDC_INT_CMDQ, host->base + MSDC_INTEN); > + /* enable busy check */ > + sdr_set_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); > + /* default write data / busy timeout 20s */ > + msdc_set_busy_timeout(host, 20 * 1000000000ULL, 0); > + /* default read data timeout 1s */ > + msdc_set_timeout(host, 1000000000ULL, 0); > +} > + > +void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) > +{ > + struct msdc_host *host = mmc_priv(mmc); > + > + /* disable cmdq irq */ > + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INT_CMDQ); > + /* disable busy check */ > + sdr_clr_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); > + > + if (recovery) { > + sdr_set_field(host->base + MSDC_DMA_CTRL, > + MSDC_DMA_CTRL_STOP, 1); > + msdc_reset_hw(host); > + } > +} > + > static const struct mmc_host_ops mt_msdc_ops = { > .post_req = msdc_post_req, > .pre_req = msdc_pre_req, > @@ -2162,6 +2260,11 @@ static const struct mmc_host_ops mt_msdc_ops = { > .hw_reset = msdc_hw_reset, > }; > > +static const struct cqhci_host_ops msdc_cmdq_ops = { > + .enable = msdc_cqe_enable, > + .disable = msdc_cqe_disable, > +}; > + > static void msdc_of_property_parse(struct platform_device *pdev, > struct msdc_host *host) > { > @@ -2312,6 +2415,22 @@ static int msdc_drv_probe(struct platform_device *pdev) > host->dma_mask = DMA_BIT_MASK(32); > mmc_dev(mmc)->dma_mask = &host->dma_mask; > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > + if (mmc->caps2 & MMC_CAP2_CQE) { > + host->cq_host = devm_kzalloc(host->mmc->parent, > + sizeof(*host->cq_host), > + GFP_KERNEL); should free this memory if it is not used any more. > + host->cq_host->caps |= CQHCI_TASK_DESC_SZ_128; > + host->cq_host->mmio = host->base + 0x800; > + host->cq_host->ops = &msdc_cmdq_ops; > + cqhci_init(host->cq_host, mmc, true); > + mmc->max_segs = 128; > + /* cqhci 16bit length */ > + /* 0 size, means 65536 so we don't have to -1 here */ > + mmc->max_seg_size = 64 * 1024; > + } > +#endif > + > host->timeout_clks = 3 * 1048576; > host->dma.gpd = dma_alloc_coherent(&pdev->dev, > 2 * sizeof(struct mt_gpdma_desc), _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 4/5] mmc: mediatek: command queue support @ 2020-04-28 13:02 ` yong.mao 0 siblings, 0 replies; 53+ messages in thread From: yong.mao @ 2020-04-28 13:02 UTC (permalink / raw) To: Chun-Hung Wu Cc: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, devicetree, wsd_upstream, linux-arm-msm, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel On Tue, 2020-04-28 at 07:56 +0800, Chun-Hung Wu wrote: > Support command queue for mt6779 platform. > a. Add msdc_set_busy_timeout() to calculate emmc write timeout > b. Connect mtk msdc driver to cqhci driver through > host->cq_host->ops = &msdc_cmdq_ops; > c. msdc_cmdq_irq() will link up with cqchi_irq(). Besides, it provides > more irq error messages like RSPCRCERR/CMDTO/DATACRCERR/DATTMO. > d. Use the options below to separate support for CQHCI or not, because > some of our platform does not support CQHCI hence no kernel option: > CONFIG_MMC_CQHCI. > #if IS_ENABLED(CONFIG_MMC_CQHCI) > XXX //Support CQHCI > #else > XXX //Not support CQHCI > #endif > Please split this patch into following patches 1. support mt6779 in mtk-sd.c 2. add new API for calculate timeout 3. support cmdq feature > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> > --- > drivers/mmc/host/mtk-sd.c | 119 ++++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 119 insertions(+) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index a2328fb..8516888 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -31,6 +31,8 @@ > #include <linux/mmc/sdio.h> > #include <linux/mmc/slot-gpio.h> > > +#include "cqhci.h" > + > #define MAX_BD_NUM 1024 > > /*--------------------------------------------------------------------------*/ > @@ -151,6 +153,7 @@ > #define MSDC_INT_DMA_BDCSERR (0x1 << 17) /* W1C */ > #define MSDC_INT_DMA_GPDCSERR (0x1 << 18) /* W1C */ > #define MSDC_INT_DMA_PROTECT (0x1 << 19) /* W1C */ > +#define MSDC_INT_CMDQ (0x1 << 28) /* W1C */ > > /* MSDC_INTEN mask */ > #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */ > @@ -181,6 +184,7 @@ > /* SDC_CFG mask */ > #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */ > #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */ > +#define SDC_CFG_WRDTOC (0x1fff << 2) /* RW */ > #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */ > #define SDC_CFG_SDIO (0x1 << 19) /* RW */ > #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */ > @@ -229,6 +233,7 @@ > #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ > > #define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ > +#define MSDC_PB1_BUSY_CHECK_SEL (0x1 << 7) /* RW */ > #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ > > #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ > @@ -432,6 +437,7 @@ struct msdc_host { > struct msdc_save_para save_para; /* used when gate HCLK */ > struct msdc_tune_para def_tune_para; /* default tune setting */ > struct msdc_tune_para saved_tune_para; /* tune result of CMD21/CMD19 */ > + struct cqhci_host *cq_host; > }; > > static const struct mtk_mmc_compatible mt8135_compat = { > @@ -528,6 +534,18 @@ static const struct mtk_mmc_compatible mt7620_compat = { > .use_internal_cd = true, > }; > > +static const struct mtk_mmc_compatible mt6779_compat = { > + .clk_div_bits = 12, > + .hs400_tune = false, > + .pad_tune_reg = MSDC_PAD_TUNE0, > + .async_fifo = true, > + .data_tune = true, > + .busy_check = true, > + .stop_clk_fix = true, > + .enhance_rx = true, > + .support_64g = true, > +}; > + > static const struct of_device_id msdc_of_ids[] = { > { .compatible = "mediatek,mt8135-mmc", .data = &mt8135_compat}, > { .compatible = "mediatek,mt8173-mmc", .data = &mt8173_compat}, > @@ -537,6 +555,7 @@ static const struct of_device_id msdc_of_ids[] = { > { .compatible = "mediatek,mt7622-mmc", .data = &mt7622_compat}, > { .compatible = "mediatek,mt8516-mmc", .data = &mt8516_compat}, > { .compatible = "mediatek,mt7620-mmc", .data = &mt7620_compat}, > + { .compatible = "mediatek,mt6779-mmc", .data = &mt6779_compat}, > {} > }; > MODULE_DEVICE_TABLE(of, msdc_of_ids); > @@ -740,6 +759,15 @@ static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) > (u32)(timeout > 255 ? 255 : timeout)); > } > > +static void msdc_set_busy_timeout(struct msdc_host *host, u64 ns, u64 clks) > +{ > + u64 timeout; > + > + timeout = msdc_timeout_cal(host, ns, clks); > + sdr_set_field(host->base + SDC_CFG, SDC_CFG_WRDTOC, > + (u32)(timeout > 8191 ? 8191 : timeout)); > +} > + > static void msdc_gate_clock(struct msdc_host *host) > { > clk_disable_unprepare(host->src_clk_cg); > @@ -1426,6 +1454,36 @@ static void msdc_enable_sdio_irq(struct mmc_host *mmc, int enb) > pm_runtime_put_noidle(host->dev); > } > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > +static irqreturn_t msdc_cmdq_irq(struct msdc_host *host, u32 intsts) > +{ > + int cmd_err = 0, dat_err = 0; > + > + if (intsts & MSDC_INT_RSPCRCERR) { > + cmd_err = (unsigned int)-EILSEQ; > + dev_err(host->dev, "%s: CMD CRC ERR", __func__); > + } else if (intsts & MSDC_INT_CMDTMO) { > + cmd_err = (unsigned int)-ETIMEDOUT; > + dev_err(host->dev, "%s: CMD TIMEOUT ERR", __func__); > + } > + > + if (intsts & MSDC_INT_DATCRCERR) { > + dat_err = (unsigned int)-EILSEQ; > + dev_err(host->dev, "%s: DATA CRC ERR", __func__); > + } else if (intsts & MSDC_INT_DATTMO) { > + dat_err = (unsigned int)-ETIMEDOUT; > + dev_err(host->dev, "%s: DATA TIMEOUT ERR", __func__); > + } > + > + if (cmd_err || dat_err) { > + dev_err(host->dev, "cmd_err = %d, dat_err =%d, intsts = 0x%x", > + cmd_err, dat_err, intsts); > + } > + > + return cqhci_irq(host->mmc, 0, cmd_err, dat_err); > +} > +#endif > + > static irqreturn_t msdc_irq(int irq, void *dev_id) > { > struct msdc_host *host = (struct msdc_host *) dev_id; > @@ -1462,6 +1520,16 @@ static irqreturn_t msdc_irq(int irq, void *dev_id) > if (!(events & (event_mask & ~MSDC_INT_SDIOIRQ))) > break; > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > + if ((host->mmc->caps2 & MMC_CAP2_CQE) && > + (events & MSDC_INT_CMDQ)) { > + msdc_cmdq_irq(host, events); > + /* clear interrupts */ > + writel(events, host->base + MSDC_INT); > + return IRQ_HANDLED; > + } > +#endif > + > if (!mrq) { > dev_err(host->dev, > "%s: MRQ=NULL; events=%08X; event_mask=%08X\n", > @@ -2146,6 +2214,36 @@ static int msdc_get_cd(struct mmc_host *mmc) > return !val; > } > > +static void msdc_cqe_enable(struct mmc_host *mmc) > +{ > + struct msdc_host *host = mmc_priv(mmc); > + > + /* enable cmdq irq */ > + writel(MSDC_INT_CMDQ, host->base + MSDC_INTEN); > + /* enable busy check */ > + sdr_set_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); > + /* default write data / busy timeout 20s */ > + msdc_set_busy_timeout(host, 20 * 1000000000ULL, 0); > + /* default read data timeout 1s */ > + msdc_set_timeout(host, 1000000000ULL, 0); > +} > + > +void msdc_cqe_disable(struct mmc_host *mmc, bool recovery) > +{ > + struct msdc_host *host = mmc_priv(mmc); > + > + /* disable cmdq irq */ > + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INT_CMDQ); > + /* disable busy check */ > + sdr_clr_bits(host->base + MSDC_PATCH_BIT1, MSDC_PB1_BUSY_CHECK_SEL); > + > + if (recovery) { > + sdr_set_field(host->base + MSDC_DMA_CTRL, > + MSDC_DMA_CTRL_STOP, 1); > + msdc_reset_hw(host); > + } > +} > + > static const struct mmc_host_ops mt_msdc_ops = { > .post_req = msdc_post_req, > .pre_req = msdc_pre_req, > @@ -2162,6 +2260,11 @@ static const struct mmc_host_ops mt_msdc_ops = { > .hw_reset = msdc_hw_reset, > }; > > +static const struct cqhci_host_ops msdc_cmdq_ops = { > + .enable = msdc_cqe_enable, > + .disable = msdc_cqe_disable, > +}; > + > static void msdc_of_property_parse(struct platform_device *pdev, > struct msdc_host *host) > { > @@ -2312,6 +2415,22 @@ static int msdc_drv_probe(struct platform_device *pdev) > host->dma_mask = DMA_BIT_MASK(32); > mmc_dev(mmc)->dma_mask = &host->dma_mask; > > +#if IS_ENABLED(CONFIG_MMC_CQHCI) > + if (mmc->caps2 & MMC_CAP2_CQE) { > + host->cq_host = devm_kzalloc(host->mmc->parent, > + sizeof(*host->cq_host), > + GFP_KERNEL); should free this memory if it is not used any more. > + host->cq_host->caps |= CQHCI_TASK_DESC_SZ_128; > + host->cq_host->mmio = host->base + 0x800; > + host->cq_host->ops = &msdc_cmdq_ops; > + cqhci_init(host->cq_host, mmc, true); > + mmc->max_segs = 128; > + /* cqhci 16bit length */ > + /* 0 size, means 65536 so we don't have to -1 here */ > + mmc->max_seg_size = 64 * 1024; > + } > +#endif > + > host->timeout_clks = 3 * 1048576; > host->dma.gpd = dma_alloc_coherent(&pdev->dev, > 2 * sizeof(struct mt_gpdma_desc), ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v5 2/5] mmc: host: Remove redundant CQE bindings 2020-04-27 23:56 ` Chun-Hung Wu (?) (?) @ 2020-04-27 23:56 ` Chun-Hung Wu -1 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu CQE bindings "supports-cqe" and "disable-cqe-dcmd" is parsed in mmc_of_parse(). Remove vendor code which parses CQE bindings, and use mmc_host->caps2 to decide support CQE or not. Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Al Cooper <alcooperx@gmail.com> --- drivers/mmc/host/sdhci-brcmstb.c | 11 ++++++----- drivers/mmc/host/sdhci-msm.c | 3 +-- drivers/mmc/host/sdhci-of-arasan.c | 3 --- drivers/mmc/host/sdhci-tegra.c | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c index ad01f64..07c90c6 100644 --- a/drivers/mmc/host/sdhci-brcmstb.c +++ b/drivers/mmc/host/sdhci-brcmstb.c @@ -247,10 +247,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) return res; memset(&brcmstb_pdata, 0, sizeof(brcmstb_pdata)); - if (device_property_read_bool(&pdev->dev, "supports-cqe")) { - has_cqe = true; - match_priv->ops->irq = sdhci_brcmstb_cqhci_irq; - } brcmstb_pdata.ops = match_priv->ops; host = sdhci_pltfm_init(pdev, &brcmstb_pdata, sizeof(struct sdhci_brcmstb_priv)); @@ -261,7 +257,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) pltfm_host = sdhci_priv(host); priv = sdhci_pltfm_priv(pltfm_host); - priv->has_cqe = has_cqe; /* Map in the non-standard CFG registers */ iomem = platform_get_resource(pdev, IORESOURCE_MEM, 1); @@ -276,6 +271,12 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) if (res) goto err; + if (host->mmc->caps2 & MMC_CAP2_CQE) { + has_cqe = true; + match_priv->ops->irq = sdhci_brcmstb_cqhci_irq; + } + priv->has_cqe = has_cqe; + /* * If the chip has enhanced strobe and it's enabled, add * callback diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index c3a160c..fbb2f57 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -1880,7 +1880,6 @@ static int sdhci_msm_probe(struct platform_device *pdev) u8 core_major; const struct sdhci_msm_offset *msm_offset; const struct sdhci_msm_variant_info *var_info; - struct device_node *node = pdev->dev.of_node; host = sdhci_pltfm_init(pdev, &sdhci_msm_pdata, sizeof(*msm_host)); if (IS_ERR(host)) @@ -2076,7 +2075,7 @@ static int sdhci_msm_probe(struct platform_device *pdev) pm_runtime_use_autosuspend(&pdev->dev); host->mmc_host_ops.execute_tuning = sdhci_msm_execute_tuning; - if (of_property_read_bool(node, "supports-cqe")) + if (host->mmc->caps2 & MMC_CAP2_CQE) ret = sdhci_msm_cqe_add_host(host, pdev); else ret = sdhci_add_host(host); diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c index e49b44b..359eff6 100644 --- a/drivers/mmc/host/sdhci-of-arasan.c +++ b/drivers/mmc/host/sdhci-of-arasan.c @@ -1281,9 +1281,6 @@ static int sdhci_arasan_probe(struct platform_device *pdev) sdhci_arasan_voltage_switch; sdhci_arasan->has_cqe = true; host->mmc->caps2 |= MMC_CAP2_CQE; - - if (!of_property_read_bool(np, "disable-cqe-dcmd")) - host->mmc->caps2 |= MMC_CAP2_CQE_DCMD; } ret = sdhci_arasan_add_host(sdhci_arasan); diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 403ac44..d09abdd 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -715,7 +715,7 @@ static void tegra_sdhci_parse_dt(struct sdhci_host *host) struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host); - if (device_property_read_bool(host->mmc->parent, "supports-cqe")) + if (host->mmc->caps2 & MMC_CAP2_CQE) tegra_host->enable_hwcq = true; else tegra_host->enable_hwcq = false; -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 2/5] mmc: host: Remove redundant CQE bindings @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel CQE bindings "supports-cqe" and "disable-cqe-dcmd" is parsed in mmc_of_parse(). Remove vendor code which parses CQE bindings, and use mmc_host->caps2 to decide support CQE or not. Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Al Cooper <alcooperx@gmail.com> --- drivers/mmc/host/sdhci-brcmstb.c | 11 ++++++----- drivers/mmc/host/sdhci-msm.c | 3 +-- drivers/mmc/host/sdhci-of-arasan.c | 3 --- drivers/mmc/host/sdhci-tegra.c | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c index ad01f64..07c90c6 100644 --- a/drivers/mmc/host/sdhci-brcmstb.c +++ b/drivers/mmc/host/sdhci-brcmstb.c @@ -247,10 +247,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) return res; memset(&brcmstb_pdata, 0, sizeof(brcmstb_pdata)); - if (device_property_read_bool(&pdev->dev, "supports-cqe")) { - has_cqe = true; - match_priv->ops->irq = sdhci_brcmstb_cqhci_irq; - } brcmstb_pdata.ops = match_priv->ops; host = sdhci_pltfm_init(pdev, &brcmstb_pdata, sizeof(struct sdhci_brcmstb_priv)); @@ -261,7 +257,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) pltfm_host = sdhci_priv(host); priv = sdhci_pltfm_priv(pltfm_host); - priv->has_cqe = has_cqe; /* Map in the non-standard CFG registers */ iomem = platform_get_resource(pdev, IORESOURCE_MEM, 1); @@ -276,6 +271,12 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) if (res) goto err; + if (host->mmc->caps2 & MMC_CAP2_CQE) { + has_cqe = true; + match_priv->ops->irq = sdhci_brcmstb_cqhci_irq; + } + priv->has_cqe = has_cqe; + /* * If the chip has enhanced strobe and it's enabled, add * callback diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index c3a160c..fbb2f57 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -1880,7 +1880,6 @@ static int sdhci_msm_probe(struct platform_device *pdev) u8 core_major; const struct sdhci_msm_offset *msm_offset; const struct sdhci_msm_variant_info *var_info; - struct device_node *node = pdev->dev.of_node; host = sdhci_pltfm_init(pdev, &sdhci_msm_pdata, sizeof(*msm_host)); if (IS_ERR(host)) @@ -2076,7 +2075,7 @@ static int sdhci_msm_probe(struct platform_device *pdev) pm_runtime_use_autosuspend(&pdev->dev); host->mmc_host_ops.execute_tuning = sdhci_msm_execute_tuning; - if (of_property_read_bool(node, "supports-cqe")) + if (host->mmc->caps2 & MMC_CAP2_CQE) ret = sdhci_msm_cqe_add_host(host, pdev); else ret = sdhci_add_host(host); diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c index e49b44b..359eff6 100644 --- a/drivers/mmc/host/sdhci-of-arasan.c +++ b/drivers/mmc/host/sdhci-of-arasan.c @@ -1281,9 +1281,6 @@ static int sdhci_arasan_probe(struct platform_device *pdev) sdhci_arasan_voltage_switch; sdhci_arasan->has_cqe = true; host->mmc->caps2 |= MMC_CAP2_CQE; - - if (!of_property_read_bool(np, "disable-cqe-dcmd")) - host->mmc->caps2 |= MMC_CAP2_CQE_DCMD; } ret = sdhci_arasan_add_host(sdhci_arasan); diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 403ac44..d09abdd 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -715,7 +715,7 @@ static void tegra_sdhci_parse_dt(struct sdhci_host *host) struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host); - if (device_property_read_bool(host->mmc->parent, "supports-cqe")) + if (host->mmc->caps2 & MMC_CAP2_CQE) tegra_host->enable_hwcq = true; else tegra_host->enable_hwcq = false; -- 2.6.4 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 2/5] mmc: host: Remove redundant CQE bindings @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel CQE bindings "supports-cqe" and "disable-cqe-dcmd" is parsed in mmc_of_parse(). Remove vendor code which parses CQE bindings, and use mmc_host->caps2 to decide support CQE or not. Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Al Cooper <alcooperx@gmail.com> --- drivers/mmc/host/sdhci-brcmstb.c | 11 ++++++----- drivers/mmc/host/sdhci-msm.c | 3 +-- drivers/mmc/host/sdhci-of-arasan.c | 3 --- drivers/mmc/host/sdhci-tegra.c | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c index ad01f64..07c90c6 100644 --- a/drivers/mmc/host/sdhci-brcmstb.c +++ b/drivers/mmc/host/sdhci-brcmstb.c @@ -247,10 +247,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) return res; memset(&brcmstb_pdata, 0, sizeof(brcmstb_pdata)); - if (device_property_read_bool(&pdev->dev, "supports-cqe")) { - has_cqe = true; - match_priv->ops->irq = sdhci_brcmstb_cqhci_irq; - } brcmstb_pdata.ops = match_priv->ops; host = sdhci_pltfm_init(pdev, &brcmstb_pdata, sizeof(struct sdhci_brcmstb_priv)); @@ -261,7 +257,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) pltfm_host = sdhci_priv(host); priv = sdhci_pltfm_priv(pltfm_host); - priv->has_cqe = has_cqe; /* Map in the non-standard CFG registers */ iomem = platform_get_resource(pdev, IORESOURCE_MEM, 1); @@ -276,6 +271,12 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) if (res) goto err; + if (host->mmc->caps2 & MMC_CAP2_CQE) { + has_cqe = true; + match_priv->ops->irq = sdhci_brcmstb_cqhci_irq; + } + priv->has_cqe = has_cqe; + /* * If the chip has enhanced strobe and it's enabled, add * callback diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index c3a160c..fbb2f57 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -1880,7 +1880,6 @@ static int sdhci_msm_probe(struct platform_device *pdev) u8 core_major; const struct sdhci_msm_offset *msm_offset; const struct sdhci_msm_variant_info *var_info; - struct device_node *node = pdev->dev.of_node; host = sdhci_pltfm_init(pdev, &sdhci_msm_pdata, sizeof(*msm_host)); if (IS_ERR(host)) @@ -2076,7 +2075,7 @@ static int sdhci_msm_probe(struct platform_device *pdev) pm_runtime_use_autosuspend(&pdev->dev); host->mmc_host_ops.execute_tuning = sdhci_msm_execute_tuning; - if (of_property_read_bool(node, "supports-cqe")) + if (host->mmc->caps2 & MMC_CAP2_CQE) ret = sdhci_msm_cqe_add_host(host, pdev); else ret = sdhci_add_host(host); diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c index e49b44b..359eff6 100644 --- a/drivers/mmc/host/sdhci-of-arasan.c +++ b/drivers/mmc/host/sdhci-of-arasan.c @@ -1281,9 +1281,6 @@ static int sdhci_arasan_probe(struct platform_device *pdev) sdhci_arasan_voltage_switch; sdhci_arasan->has_cqe = true; host->mmc->caps2 |= MMC_CAP2_CQE; - - if (!of_property_read_bool(np, "disable-cqe-dcmd")) - host->mmc->caps2 |= MMC_CAP2_CQE_DCMD; } ret = sdhci_arasan_add_host(sdhci_arasan); diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 403ac44..d09abdd 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -715,7 +715,7 @@ static void tegra_sdhci_parse_dt(struct sdhci_host *host) struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host); - if (device_property_read_bool(host->mmc->parent, "supports-cqe")) + if (host->mmc->caps2 & MMC_CAP2_CQE) tegra_host->enable_hwcq = true; else tegra_host->enable_hwcq = false; -- 2.6.4 _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 2/5] mmc: host: Remove redundant CQE bindings @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu CQE bindings "supports-cqe" and "disable-cqe-dcmd" is parsed in mmc_of_parse(). Remove vendor code which parses CQE bindings, and use mmc_host->caps2 to decide support CQE or not. Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Al Cooper <alcooperx@gmail.com> --- drivers/mmc/host/sdhci-brcmstb.c | 11 ++++++----- drivers/mmc/host/sdhci-msm.c | 3 +-- drivers/mmc/host/sdhci-of-arasan.c | 3 --- drivers/mmc/host/sdhci-tegra.c | 2 +- 4 files changed, 8 insertions(+), 11 deletions(-) diff --git a/drivers/mmc/host/sdhci-brcmstb.c b/drivers/mmc/host/sdhci-brcmstb.c index ad01f64..07c90c6 100644 --- a/drivers/mmc/host/sdhci-brcmstb.c +++ b/drivers/mmc/host/sdhci-brcmstb.c @@ -247,10 +247,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) return res; memset(&brcmstb_pdata, 0, sizeof(brcmstb_pdata)); - if (device_property_read_bool(&pdev->dev, "supports-cqe")) { - has_cqe = true; - match_priv->ops->irq = sdhci_brcmstb_cqhci_irq; - } brcmstb_pdata.ops = match_priv->ops; host = sdhci_pltfm_init(pdev, &brcmstb_pdata, sizeof(struct sdhci_brcmstb_priv)); @@ -261,7 +257,6 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) pltfm_host = sdhci_priv(host); priv = sdhci_pltfm_priv(pltfm_host); - priv->has_cqe = has_cqe; /* Map in the non-standard CFG registers */ iomem = platform_get_resource(pdev, IORESOURCE_MEM, 1); @@ -276,6 +271,12 @@ static int sdhci_brcmstb_probe(struct platform_device *pdev) if (res) goto err; + if (host->mmc->caps2 & MMC_CAP2_CQE) { + has_cqe = true; + match_priv->ops->irq = sdhci_brcmstb_cqhci_irq; + } + priv->has_cqe = has_cqe; + /* * If the chip has enhanced strobe and it's enabled, add * callback diff --git a/drivers/mmc/host/sdhci-msm.c b/drivers/mmc/host/sdhci-msm.c index c3a160c..fbb2f57 100644 --- a/drivers/mmc/host/sdhci-msm.c +++ b/drivers/mmc/host/sdhci-msm.c @@ -1880,7 +1880,6 @@ static int sdhci_msm_probe(struct platform_device *pdev) u8 core_major; const struct sdhci_msm_offset *msm_offset; const struct sdhci_msm_variant_info *var_info; - struct device_node *node = pdev->dev.of_node; host = sdhci_pltfm_init(pdev, &sdhci_msm_pdata, sizeof(*msm_host)); if (IS_ERR(host)) @@ -2076,7 +2075,7 @@ static int sdhci_msm_probe(struct platform_device *pdev) pm_runtime_use_autosuspend(&pdev->dev); host->mmc_host_ops.execute_tuning = sdhci_msm_execute_tuning; - if (of_property_read_bool(node, "supports-cqe")) + if (host->mmc->caps2 & MMC_CAP2_CQE) ret = sdhci_msm_cqe_add_host(host, pdev); else ret = sdhci_add_host(host); diff --git a/drivers/mmc/host/sdhci-of-arasan.c b/drivers/mmc/host/sdhci-of-arasan.c index e49b44b..359eff6 100644 --- a/drivers/mmc/host/sdhci-of-arasan.c +++ b/drivers/mmc/host/sdhci-of-arasan.c @@ -1281,9 +1281,6 @@ static int sdhci_arasan_probe(struct platform_device *pdev) sdhci_arasan_voltage_switch; sdhci_arasan->has_cqe = true; host->mmc->caps2 |= MMC_CAP2_CQE; - - if (!of_property_read_bool(np, "disable-cqe-dcmd")) - host->mmc->caps2 |= MMC_CAP2_CQE_DCMD; } ret = sdhci_arasan_add_host(sdhci_arasan); diff --git a/drivers/mmc/host/sdhci-tegra.c b/drivers/mmc/host/sdhci-tegra.c index 403ac44..d09abdd 100644 --- a/drivers/mmc/host/sdhci-tegra.c +++ b/drivers/mmc/host/sdhci-tegra.c @@ -715,7 +715,7 @@ static void tegra_sdhci_parse_dt(struct sdhci_host *host) struct sdhci_pltfm_host *pltfm_host = sdhci_priv(host); struct sdhci_tegra *tegra_host = sdhci_pltfm_priv(pltfm_host); - if (device_property_read_bool(host->mmc->parent, "supports-cqe")) + if (host->mmc->caps2 & MMC_CAP2_CQE) tegra_host->enable_hwcq = true; else tegra_host->enable_hwcq = false; -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 3/5] mmc: mediatek: refine msdc timeout api 2020-04-27 23:56 ` Chun-Hung Wu (?) (?) @ 2020-04-27 23:56 ` Chun-Hung Wu -1 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu Extract msdc timeout api common part to have better code architecture and avoid redundent code. Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/host/mtk-sd.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index 7726dcf..a2328fb 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -699,21 +699,21 @@ static void msdc_unprepare_data(struct msdc_host *host, struct mmc_request *mrq) } } -/* clock control primitives */ -static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) +static u64 msdc_timeout_cal(struct msdc_host *host, u64 ns, u64 clks) { - u32 timeout, clk_ns; + u64 timeout, clk_ns; u32 mode = 0; - host->timeout_ns = ns; - host->timeout_clks = clks; if (host->mmc->actual_clock == 0) { timeout = 0; } else { - clk_ns = 1000000000UL / host->mmc->actual_clock; - timeout = (ns + clk_ns - 1) / clk_ns + clks; + clk_ns = 1000000000ULL; + do_div(clk_ns, host->mmc->actual_clock); + timeout = ns + clk_ns - 1; + do_div(timeout, clk_ns); + timeout += clks; /* in 1048576 sclk cycle unit */ - timeout = (timeout + (0x1 << 20) - 1) >> 20; + timeout = DIV_ROUND_UP(timeout, (0x1 << 20)); if (host->dev_comp->clk_div_bits == 8) sdr_get_field(host->base + MSDC_CFG, MSDC_CFG_CKMOD, &mode); @@ -723,9 +723,21 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) /*DDR mode will double the clk cycles for data timeout */ timeout = mode >= 2 ? timeout * 2 : timeout; timeout = timeout > 1 ? timeout - 1 : 0; - timeout = timeout > 255 ? 255 : timeout; } - sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, timeout); + return timeout; +} + +/* clock control primitives */ +static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) +{ + u64 timeout; + + host->timeout_ns = ns; + host->timeout_clks = clks; + + timeout = msdc_timeout_cal(host, ns, clks); + sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, + (u32)(timeout > 255 ? 255 : timeout)); } static void msdc_gate_clock(struct msdc_host *host) -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 3/5] mmc: mediatek: refine msdc timeout api @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel Extract msdc timeout api common part to have better code architecture and avoid redundent code. Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/host/mtk-sd.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index 7726dcf..a2328fb 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -699,21 +699,21 @@ static void msdc_unprepare_data(struct msdc_host *host, struct mmc_request *mrq) } } -/* clock control primitives */ -static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) +static u64 msdc_timeout_cal(struct msdc_host *host, u64 ns, u64 clks) { - u32 timeout, clk_ns; + u64 timeout, clk_ns; u32 mode = 0; - host->timeout_ns = ns; - host->timeout_clks = clks; if (host->mmc->actual_clock == 0) { timeout = 0; } else { - clk_ns = 1000000000UL / host->mmc->actual_clock; - timeout = (ns + clk_ns - 1) / clk_ns + clks; + clk_ns = 1000000000ULL; + do_div(clk_ns, host->mmc->actual_clock); + timeout = ns + clk_ns - 1; + do_div(timeout, clk_ns); + timeout += clks; /* in 1048576 sclk cycle unit */ - timeout = (timeout + (0x1 << 20) - 1) >> 20; + timeout = DIV_ROUND_UP(timeout, (0x1 << 20)); if (host->dev_comp->clk_div_bits == 8) sdr_get_field(host->base + MSDC_CFG, MSDC_CFG_CKMOD, &mode); @@ -723,9 +723,21 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) /*DDR mode will double the clk cycles for data timeout */ timeout = mode >= 2 ? timeout * 2 : timeout; timeout = timeout > 1 ? timeout - 1 : 0; - timeout = timeout > 255 ? 255 : timeout; } - sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, timeout); + return timeout; +} + +/* clock control primitives */ +static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) +{ + u64 timeout; + + host->timeout_ns = ns; + host->timeout_clks = clks; + + timeout = msdc_timeout_cal(host, ns, clks); + sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, + (u32)(timeout > 255 ? 255 : timeout)); } static void msdc_gate_clock(struct msdc_host *host) -- 2.6.4 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 3/5] mmc: mediatek: refine msdc timeout api @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel Extract msdc timeout api common part to have better code architecture and avoid redundent code. Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/host/mtk-sd.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index 7726dcf..a2328fb 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -699,21 +699,21 @@ static void msdc_unprepare_data(struct msdc_host *host, struct mmc_request *mrq) } } -/* clock control primitives */ -static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) +static u64 msdc_timeout_cal(struct msdc_host *host, u64 ns, u64 clks) { - u32 timeout, clk_ns; + u64 timeout, clk_ns; u32 mode = 0; - host->timeout_ns = ns; - host->timeout_clks = clks; if (host->mmc->actual_clock == 0) { timeout = 0; } else { - clk_ns = 1000000000UL / host->mmc->actual_clock; - timeout = (ns + clk_ns - 1) / clk_ns + clks; + clk_ns = 1000000000ULL; + do_div(clk_ns, host->mmc->actual_clock); + timeout = ns + clk_ns - 1; + do_div(timeout, clk_ns); + timeout += clks; /* in 1048576 sclk cycle unit */ - timeout = (timeout + (0x1 << 20) - 1) >> 20; + timeout = DIV_ROUND_UP(timeout, (0x1 << 20)); if (host->dev_comp->clk_div_bits == 8) sdr_get_field(host->base + MSDC_CFG, MSDC_CFG_CKMOD, &mode); @@ -723,9 +723,21 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) /*DDR mode will double the clk cycles for data timeout */ timeout = mode >= 2 ? timeout * 2 : timeout; timeout = timeout > 1 ? timeout - 1 : 0; - timeout = timeout > 255 ? 255 : timeout; } - sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, timeout); + return timeout; +} + +/* clock control primitives */ +static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) +{ + u64 timeout; + + host->timeout_ns = ns; + host->timeout_clks = clks; + + timeout = msdc_timeout_cal(host, ns, clks); + sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, + (u32)(timeout > 255 ? 255 : timeout)); } static void msdc_gate_clock(struct msdc_host *host) -- 2.6.4 _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 3/5] mmc: mediatek: refine msdc timeout api @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu Extract msdc timeout api common part to have better code architecture and avoid redundent code. Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> --- drivers/mmc/host/mtk-sd.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c index 7726dcf..a2328fb 100644 --- a/drivers/mmc/host/mtk-sd.c +++ b/drivers/mmc/host/mtk-sd.c @@ -699,21 +699,21 @@ static void msdc_unprepare_data(struct msdc_host *host, struct mmc_request *mrq) } } -/* clock control primitives */ -static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) +static u64 msdc_timeout_cal(struct msdc_host *host, u64 ns, u64 clks) { - u32 timeout, clk_ns; + u64 timeout, clk_ns; u32 mode = 0; - host->timeout_ns = ns; - host->timeout_clks = clks; if (host->mmc->actual_clock == 0) { timeout = 0; } else { - clk_ns = 1000000000UL / host->mmc->actual_clock; - timeout = (ns + clk_ns - 1) / clk_ns + clks; + clk_ns = 1000000000ULL; + do_div(clk_ns, host->mmc->actual_clock); + timeout = ns + clk_ns - 1; + do_div(timeout, clk_ns); + timeout += clks; /* in 1048576 sclk cycle unit */ - timeout = (timeout + (0x1 << 20) - 1) >> 20; + timeout = DIV_ROUND_UP(timeout, (0x1 << 20)); if (host->dev_comp->clk_div_bits == 8) sdr_get_field(host->base + MSDC_CFG, MSDC_CFG_CKMOD, &mode); @@ -723,9 +723,21 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) /*DDR mode will double the clk cycles for data timeout */ timeout = mode >= 2 ? timeout * 2 : timeout; timeout = timeout > 1 ? timeout - 1 : 0; - timeout = timeout > 255 ? 255 : timeout; } - sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, timeout); + return timeout; +} + +/* clock control primitives */ +static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) +{ + u64 timeout; + + host->timeout_ns = ns; + host->timeout_clks = clks; + + timeout = msdc_timeout_cal(host, ns, clks); + sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, + (u32)(timeout > 255 ? 255 : timeout)); } static void msdc_gate_clock(struct msdc_host *host) -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
[parent not found: <1588031768-23677-4-git-send-email-chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org>]
* Re: [PATCH v5 3/5] mmc: mediatek: refine msdc timeout api 2020-04-27 23:56 ` Chun-Hung Wu (?) (?) @ 2020-04-28 12:28 ` yong.mao -1 siblings, 0 replies; 53+ messages in thread From: yong.mao-NuS5LvNUpcJWk0Htik3J/w @ 2020-04-28 12:28 UTC (permalink / raw) To: Chun-Hung Wu Cc: mirq-linux-CoA6ZxLDdyEEUmgCuDUIdw, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list-dY08KVG/lbpWk0Htik3J/w, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman On Tue, 2020-04-28 at 07:56 +0800, Chun-Hung Wu wrote: > Extract msdc timeout api common part to have > better code architecture and avoid redundent please correct the word "redundant" in next version > code. > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Yong Mao <yong.mao@mediatek.com> > --- > drivers/mmc/host/mtk-sd.c | 32 ++++++++++++++++++++++---------- > 1 file changed, 22 insertions(+), 10 deletions(-) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index 7726dcf..a2328fb 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -699,21 +699,21 @@ static void msdc_unprepare_data(struct msdc_host *host, struct mmc_request *mrq) > } > } > > -/* clock control primitives */ > -static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) > +static u64 msdc_timeout_cal(struct msdc_host *host, u64 ns, u64 clks) > { > - u32 timeout, clk_ns; > + u64 timeout, clk_ns; > u32 mode = 0; > > - host->timeout_ns = ns; > - host->timeout_clks = clks; > if (host->mmc->actual_clock == 0) { > timeout = 0; > } else { > - clk_ns = 1000000000UL / host->mmc->actual_clock; > - timeout = (ns + clk_ns - 1) / clk_ns + clks; > + clk_ns = 1000000000ULL; > + do_div(clk_ns, host->mmc->actual_clock); > + timeout = ns + clk_ns - 1; > + do_div(timeout, clk_ns); > + timeout += clks; > /* in 1048576 sclk cycle unit */ > - timeout = (timeout + (0x1 << 20) - 1) >> 20; > + timeout = DIV_ROUND_UP(timeout, (0x1 << 20)); > if (host->dev_comp->clk_div_bits == 8) > sdr_get_field(host->base + MSDC_CFG, > MSDC_CFG_CKMOD, &mode); > @@ -723,9 +723,21 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) > /*DDR mode will double the clk cycles for data timeout */ > timeout = mode >= 2 ? timeout * 2 : timeout; > timeout = timeout > 1 ? timeout - 1 : 0; > - timeout = timeout > 255 ? 255 : timeout; > } > - sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, timeout); > + return timeout; > +} > + > +/* clock control primitives */ > +static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) > +{ > + u64 timeout; > + > + host->timeout_ns = ns; > + host->timeout_clks = clks; > + > + timeout = msdc_timeout_cal(host, ns, clks); > + sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, > + (u32)(timeout > 255 ? 255 : timeout)); > } > > static void msdc_gate_clock(struct msdc_host *host) ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 3/5] mmc: mediatek: refine msdc timeout api @ 2020-04-28 12:28 ` yong.mao 0 siblings, 0 replies; 53+ messages in thread From: yong.mao @ 2020-04-28 12:28 UTC (permalink / raw) To: Chun-Hung Wu Cc: Mark Rutland, Kate Stewart, Ulf Hansson, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, bcm-kernel-feedback-list, Allison Randal, kernel-team, Pan Bian, devicetree, Martin Blumenstingl, linux-arm-msm, mirq-linux, Rob Herring, linux-mediatek, Matthias Brugger, Thomas Gleixner, Stanley Chu, Chaotian Jing, linux-arm-kernel, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, linux-kernel On Tue, 2020-04-28 at 07:56 +0800, Chun-Hung Wu wrote: > Extract msdc timeout api common part to have > better code architecture and avoid redundent please correct the word "redundant" in next version > code. > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Yong Mao <yong.mao@mediatek.com> > --- > drivers/mmc/host/mtk-sd.c | 32 ++++++++++++++++++++++---------- > 1 file changed, 22 insertions(+), 10 deletions(-) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index 7726dcf..a2328fb 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -699,21 +699,21 @@ static void msdc_unprepare_data(struct msdc_host *host, struct mmc_request *mrq) > } > } > > -/* clock control primitives */ > -static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) > +static u64 msdc_timeout_cal(struct msdc_host *host, u64 ns, u64 clks) > { > - u32 timeout, clk_ns; > + u64 timeout, clk_ns; > u32 mode = 0; > > - host->timeout_ns = ns; > - host->timeout_clks = clks; > if (host->mmc->actual_clock == 0) { > timeout = 0; > } else { > - clk_ns = 1000000000UL / host->mmc->actual_clock; > - timeout = (ns + clk_ns - 1) / clk_ns + clks; > + clk_ns = 1000000000ULL; > + do_div(clk_ns, host->mmc->actual_clock); > + timeout = ns + clk_ns - 1; > + do_div(timeout, clk_ns); > + timeout += clks; > /* in 1048576 sclk cycle unit */ > - timeout = (timeout + (0x1 << 20) - 1) >> 20; > + timeout = DIV_ROUND_UP(timeout, (0x1 << 20)); > if (host->dev_comp->clk_div_bits == 8) > sdr_get_field(host->base + MSDC_CFG, > MSDC_CFG_CKMOD, &mode); > @@ -723,9 +723,21 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) > /*DDR mode will double the clk cycles for data timeout */ > timeout = mode >= 2 ? timeout * 2 : timeout; > timeout = timeout > 1 ? timeout - 1 : 0; > - timeout = timeout > 255 ? 255 : timeout; > } > - sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, timeout); > + return timeout; > +} > + > +/* clock control primitives */ > +static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) > +{ > + u64 timeout; > + > + host->timeout_ns = ns; > + host->timeout_clks = clks; > + > + timeout = msdc_timeout_cal(host, ns, clks); > + sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, > + (u32)(timeout > 255 ? 255 : timeout)); > } > > static void msdc_gate_clock(struct msdc_host *host) _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 3/5] mmc: mediatek: refine msdc timeout api @ 2020-04-28 12:28 ` yong.mao 0 siblings, 0 replies; 53+ messages in thread From: yong.mao @ 2020-04-28 12:28 UTC (permalink / raw) To: Chun-Hung Wu Cc: Mark Rutland, Kate Stewart, Ulf Hansson, wsd_upstream, linux-mmc, Linus Walleij, Al Cooper, Bjorn Andersson, linux-tegra, Thierry Reding, Pavel Machek, Florian Fainelli, Michal Simek, Jonathan Hunter, Andy Gross, bcm-kernel-feedback-list, Allison Randal, kernel-team, Pan Bian, devicetree, Martin Blumenstingl, linux-arm-msm, mirq-linux, Rob Herring, linux-mediatek, Matthias Brugger, Thomas Gleixner, Stanley Chu, Chaotian Jing, linux-arm-kernel, Mathieu Malaterre, Greg Kroah-Hartman, Kuohong Wang, Adrian Hunter, linux-kernel On Tue, 2020-04-28 at 07:56 +0800, Chun-Hung Wu wrote: > Extract msdc timeout api common part to have > better code architecture and avoid redundent please correct the word "redundant" in next version > code. > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Yong Mao <yong.mao@mediatek.com> > --- > drivers/mmc/host/mtk-sd.c | 32 ++++++++++++++++++++++---------- > 1 file changed, 22 insertions(+), 10 deletions(-) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index 7726dcf..a2328fb 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -699,21 +699,21 @@ static void msdc_unprepare_data(struct msdc_host *host, struct mmc_request *mrq) > } > } > > -/* clock control primitives */ > -static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) > +static u64 msdc_timeout_cal(struct msdc_host *host, u64 ns, u64 clks) > { > - u32 timeout, clk_ns; > + u64 timeout, clk_ns; > u32 mode = 0; > > - host->timeout_ns = ns; > - host->timeout_clks = clks; > if (host->mmc->actual_clock == 0) { > timeout = 0; > } else { > - clk_ns = 1000000000UL / host->mmc->actual_clock; > - timeout = (ns + clk_ns - 1) / clk_ns + clks; > + clk_ns = 1000000000ULL; > + do_div(clk_ns, host->mmc->actual_clock); > + timeout = ns + clk_ns - 1; > + do_div(timeout, clk_ns); > + timeout += clks; > /* in 1048576 sclk cycle unit */ > - timeout = (timeout + (0x1 << 20) - 1) >> 20; > + timeout = DIV_ROUND_UP(timeout, (0x1 << 20)); > if (host->dev_comp->clk_div_bits == 8) > sdr_get_field(host->base + MSDC_CFG, > MSDC_CFG_CKMOD, &mode); > @@ -723,9 +723,21 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) > /*DDR mode will double the clk cycles for data timeout */ > timeout = mode >= 2 ? timeout * 2 : timeout; > timeout = timeout > 1 ? timeout - 1 : 0; > - timeout = timeout > 255 ? 255 : timeout; > } > - sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, timeout); > + return timeout; > +} > + > +/* clock control primitives */ > +static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) > +{ > + u64 timeout; > + > + host->timeout_ns = ns; > + host->timeout_clks = clks; > + > + timeout = msdc_timeout_cal(host, ns, clks); > + sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, > + (u32)(timeout > 255 ? 255 : timeout)); > } > > static void msdc_gate_clock(struct msdc_host *host) _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 3/5] mmc: mediatek: refine msdc timeout api @ 2020-04-28 12:28 ` yong.mao 0 siblings, 0 replies; 53+ messages in thread From: yong.mao @ 2020-04-28 12:28 UTC (permalink / raw) To: Chun-Hung Wu Cc: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, devicetree, wsd_upstream, linux-arm-msm, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel On Tue, 2020-04-28 at 07:56 +0800, Chun-Hung Wu wrote: > Extract msdc timeout api common part to have > better code architecture and avoid redundent please correct the word "redundant" in next version > code. > > Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Yong Mao <yong.mao@mediatek.com> > --- > drivers/mmc/host/mtk-sd.c | 32 ++++++++++++++++++++++---------- > 1 file changed, 22 insertions(+), 10 deletions(-) > > diff --git a/drivers/mmc/host/mtk-sd.c b/drivers/mmc/host/mtk-sd.c > index 7726dcf..a2328fb 100644 > --- a/drivers/mmc/host/mtk-sd.c > +++ b/drivers/mmc/host/mtk-sd.c > @@ -699,21 +699,21 @@ static void msdc_unprepare_data(struct msdc_host *host, struct mmc_request *mrq) > } > } > > -/* clock control primitives */ > -static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) > +static u64 msdc_timeout_cal(struct msdc_host *host, u64 ns, u64 clks) > { > - u32 timeout, clk_ns; > + u64 timeout, clk_ns; > u32 mode = 0; > > - host->timeout_ns = ns; > - host->timeout_clks = clks; > if (host->mmc->actual_clock == 0) { > timeout = 0; > } else { > - clk_ns = 1000000000UL / host->mmc->actual_clock; > - timeout = (ns + clk_ns - 1) / clk_ns + clks; > + clk_ns = 1000000000ULL; > + do_div(clk_ns, host->mmc->actual_clock); > + timeout = ns + clk_ns - 1; > + do_div(timeout, clk_ns); > + timeout += clks; > /* in 1048576 sclk cycle unit */ > - timeout = (timeout + (0x1 << 20) - 1) >> 20; > + timeout = DIV_ROUND_UP(timeout, (0x1 << 20)); > if (host->dev_comp->clk_div_bits == 8) > sdr_get_field(host->base + MSDC_CFG, > MSDC_CFG_CKMOD, &mode); > @@ -723,9 +723,21 @@ static void msdc_set_timeout(struct msdc_host *host, u32 ns, u32 clks) > /*DDR mode will double the clk cycles for data timeout */ > timeout = mode >= 2 ? timeout * 2 : timeout; > timeout = timeout > 1 ? timeout - 1 : 0; > - timeout = timeout > 255 ? 255 : timeout; > } > - sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, timeout); > + return timeout; > +} > + > +/* clock control primitives */ > +static void msdc_set_timeout(struct msdc_host *host, u64 ns, u64 clks) > +{ > + u64 timeout; > + > + host->timeout_ns = ns; > + host->timeout_clks = clks; > + > + timeout = msdc_timeout_cal(host, ns, clks); > + sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, > + (u32)(timeout > 255 ? 255 : timeout)); > } > > static void msdc_gate_clock(struct msdc_host *host) ^ permalink raw reply [flat|nested] 53+ messages in thread
* [PATCH v5 5/5] dt-bindings: mmc: mediatek: Add document for mt6779 2020-04-27 23:56 ` Chun-Hung Wu (?) (?) @ 2020-04-27 23:56 ` Chun-Hung Wu -1 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu Add compatible node for mt6779 mmc Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Rob Herring <robh@kernel.org> --- Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.txt b/Documentation/devicetree/bindings/mmc/mtk-sd.txt index 8a532f4..0c9cf6a 100644 --- a/Documentation/devicetree/bindings/mmc/mtk-sd.txt +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.txt @@ -12,6 +12,7 @@ Required properties: "mediatek,mt8173-mmc": for mmc host ip compatible with mt8173 "mediatek,mt8183-mmc": for mmc host ip compatible with mt8183 "mediatek,mt8516-mmc": for mmc host ip compatible with mt8516 + "mediatek,mt6779-mmc": for mmc host ip compatible with mt6779 "mediatek,mt2701-mmc": for mmc host ip compatible with mt2701 "mediatek,mt2712-mmc": for mmc host ip compatible with mt2712 "mediatek,mt7622-mmc": for MT7622 SoC -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 5/5] dt-bindings: mmc: mediatek: Add document for mt6779 @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel Add compatible node for mt6779 mmc Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Rob Herring <robh@kernel.org> --- Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.txt b/Documentation/devicetree/bindings/mmc/mtk-sd.txt index 8a532f4..0c9cf6a 100644 --- a/Documentation/devicetree/bindings/mmc/mtk-sd.txt +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.txt @@ -12,6 +12,7 @@ Required properties: "mediatek,mt8173-mmc": for mmc host ip compatible with mt8173 "mediatek,mt8183-mmc": for mmc host ip compatible with mt8183 "mediatek,mt8516-mmc": for mmc host ip compatible with mt8516 + "mediatek,mt6779-mmc": for mmc host ip compatible with mt6779 "mediatek,mt2701-mmc": for mmc host ip compatible with mt2701 "mediatek,mt2712-mmc": for mmc host ip compatible with mt2712 "mediatek,mt7622-mmc": for MT7622 SoC -- 2.6.4 _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 5/5] dt-bindings: mmc: mediatek: Add document for mt6779 @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: devicetree, wsd_upstream, linux-arm-msm, Chun-Hung Wu, linux-mmc, linux-kernel, linux-mediatek, linux-tegra, kernel-team, linux-arm-kernel Add compatible node for mt6779 mmc Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Rob Herring <robh@kernel.org> --- Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.txt b/Documentation/devicetree/bindings/mmc/mtk-sd.txt index 8a532f4..0c9cf6a 100644 --- a/Documentation/devicetree/bindings/mmc/mtk-sd.txt +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.txt @@ -12,6 +12,7 @@ Required properties: "mediatek,mt8173-mmc": for mmc host ip compatible with mt8173 "mediatek,mt8183-mmc": for mmc host ip compatible with mt8183 "mediatek,mt8516-mmc": for mmc host ip compatible with mt8516 + "mediatek,mt6779-mmc": for mmc host ip compatible with mt6779 "mediatek,mt2701-mmc": for mmc host ip compatible with mt2701 "mediatek,mt2712-mmc": for mmc host ip compatible with mt2712 "mediatek,mt7622-mmc": for MT7622 SoC -- 2.6.4 _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek ^ permalink raw reply related [flat|nested] 53+ messages in thread
* [PATCH v5 5/5] dt-bindings: mmc: mediatek: Add document for mt6779 @ 2020-04-27 23:56 ` Chun-Hung Wu 0 siblings, 0 replies; 53+ messages in thread From: Chun-Hung Wu @ 2020-04-27 23:56 UTC (permalink / raw) To: mirq-linux, Jonathan Hunter, Al Cooper, Adrian Hunter, Florian Fainelli, bcm-kernel-feedback-list, Andy Gross, Bjorn Andersson, Michal Simek, Thierry Reding, Chaotian Jing, Ulf Hansson, Rob Herring, Mark Rutland, Matthias Brugger, Linus Walleij, Pavel Machek, Kate Stewart, Greg Kroah-Hartman, Martin Blumenstingl, Pan Bian, Thomas Gleixner, Allison Randal, Mathieu Malaterre, Stanley Chu, Kuohong Wang, Yong Mao Cc: kernel-team, linux-kernel, linux-mmc, linux-mediatek, devicetree, wsd_upstream, linux-arm-kernel, linux-arm-msm, linux-tegra, Chun-Hung Wu Add compatible node for mt6779 mmc Signed-off-by: Chun-Hung Wu <chun-hung.wu@mediatek.com> Acked-by: Rob Herring <robh@kernel.org> --- Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/Documentation/devicetree/bindings/mmc/mtk-sd.txt b/Documentation/devicetree/bindings/mmc/mtk-sd.txt index 8a532f4..0c9cf6a 100644 --- a/Documentation/devicetree/bindings/mmc/mtk-sd.txt +++ b/Documentation/devicetree/bindings/mmc/mtk-sd.txt @@ -12,6 +12,7 @@ Required properties: "mediatek,mt8173-mmc": for mmc host ip compatible with mt8173 "mediatek,mt8183-mmc": for mmc host ip compatible with mt8183 "mediatek,mt8516-mmc": for mmc host ip compatible with mt8516 + "mediatek,mt6779-mmc": for mmc host ip compatible with mt6779 "mediatek,mt2701-mmc": for mmc host ip compatible with mt2701 "mediatek,mt2712-mmc": for mmc host ip compatible with mt2712 "mediatek,mt7622-mmc": for MT7622 SoC -- 2.6.4 ^ permalink raw reply related [flat|nested] 53+ messages in thread
* Re: [PATCH v5 0/5] mmc: mediatek: add mmc cqhci support 2020-04-27 23:56 ` Chun-Hung Wu @ 2020-05-05 11:33 ` Ulf Hansson -1 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-05 11:33 UTC (permalink / raw) To: Chun-Hung Wu Cc: Adrian Hunter, Chaotian Jing, Stanley Chu, Kuohong Wang, Yong Mao, Linux Kernel Mailing List, linux-mmc, Linux ARM - trimmed cc-list (Please do so also for you next submission) On Tue, 28 Apr 2020 at 01:57, Chun-Hung Wu <chun-hung.wu@mediatek.com> wrote: > > This series provides MediaTek cqhci implementations as below: > - Extend mmc_of_parse() to parse CQE bindings > - Remove redundant host CQE bindings > - Refine msdc timeout api to reduce redundant code > - MediaTek command queue support > - dt-bindings for mt6779 > > v1 -> v2: > - Add more patch details in commit message > - Separate msdc timeout api refine to individual patch > > v2 -> v3: > - Remove CR-Id, Change-Id and Feature in patches > - Add Signed-off-by in patches > > v3 -> v4: > - Refine CQE bindings in mmc_of_parse (Ulf Hansson) > - Remove redundant host CQE bindings (Linux Walleij) > > v4 -> v5: > - Add Acked-by and more maintainers > > Chun-Hung Wu (5): > [1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings > [2/5] mmc: host: Remove redundant CQE bindings > [3/5] mmc: mediatek: refine msdc timeout api > [4/5] mmc: mediatek: command queue support > [5/5] dt-bindings: mmc: mediatek: Add document for mt6779 > > Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + > drivers/mmc/core/host.c | 5 + > drivers/mmc/host/mtk-sd.c | 151 +++++++++++++++++++++-- > drivers/mmc/host/sdhci-brcmstb.c | 11 +- > drivers/mmc/host/sdhci-msm.c | 3 +- > drivers/mmc/host/sdhci-of-arasan.c | 3 - > drivers/mmc/host/sdhci-tegra.c | 2 +- > 7 files changed, 155 insertions(+), 21 deletions(-) > > -- > 2.6.4 While awaiting a respin of patch4, due to comments from Yong, I decided to apply the other patches on my next branch. Thanks! Kind regards Uffe ^ permalink raw reply [flat|nested] 53+ messages in thread
* Re: [PATCH v5 0/5] mmc: mediatek: add mmc cqhci support @ 2020-05-05 11:33 ` Ulf Hansson 0 siblings, 0 replies; 53+ messages in thread From: Ulf Hansson @ 2020-05-05 11:33 UTC (permalink / raw) To: Chun-Hung Wu Cc: linux-mmc, Kuohong Wang, Adrian Hunter, Yong Mao, Linux Kernel Mailing List, Linux ARM, Stanley Chu, Chaotian Jing - trimmed cc-list (Please do so also for you next submission) On Tue, 28 Apr 2020 at 01:57, Chun-Hung Wu <chun-hung.wu@mediatek.com> wrote: > > This series provides MediaTek cqhci implementations as below: > - Extend mmc_of_parse() to parse CQE bindings > - Remove redundant host CQE bindings > - Refine msdc timeout api to reduce redundant code > - MediaTek command queue support > - dt-bindings for mt6779 > > v1 -> v2: > - Add more patch details in commit message > - Separate msdc timeout api refine to individual patch > > v2 -> v3: > - Remove CR-Id, Change-Id and Feature in patches > - Add Signed-off-by in patches > > v3 -> v4: > - Refine CQE bindings in mmc_of_parse (Ulf Hansson) > - Remove redundant host CQE bindings (Linux Walleij) > > v4 -> v5: > - Add Acked-by and more maintainers > > Chun-Hung Wu (5): > [1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings > [2/5] mmc: host: Remove redundant CQE bindings > [3/5] mmc: mediatek: refine msdc timeout api > [4/5] mmc: mediatek: command queue support > [5/5] dt-bindings: mmc: mediatek: Add document for mt6779 > > Documentation/devicetree/bindings/mmc/mtk-sd.txt | 1 + > drivers/mmc/core/host.c | 5 + > drivers/mmc/host/mtk-sd.c | 151 +++++++++++++++++++++-- > drivers/mmc/host/sdhci-brcmstb.c | 11 +- > drivers/mmc/host/sdhci-msm.c | 3 +- > drivers/mmc/host/sdhci-of-arasan.c | 3 - > drivers/mmc/host/sdhci-tegra.c | 2 +- > 7 files changed, 155 insertions(+), 21 deletions(-) > > -- > 2.6.4 While awaiting a respin of patch4, due to comments from Yong, I decided to apply the other patches on my next branch. Thanks! Kind regards Uffe _______________________________________________ linux-arm-kernel mailing list linux-arm-kernel@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-arm-kernel ^ permalink raw reply [flat|nested] 53+ messages in thread
end of thread, other threads:[~2020-05-12 1:17 UTC | newest] Thread overview: 53+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2020-04-27 23:56 [PATCH v5 0/5] mmc: mediatek: add mmc cqhci support Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu [not found] ` <1588031768-23677-1-git-send-email-chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> 2020-04-27 23:56 ` [PATCH v5 1/5] mmc: core: Extend mmc_of_parse() to parse CQE bindings Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-05-06 13:00 ` Veerabhadrarao Badiganti 2020-05-06 13:00 ` Veerabhadrarao Badiganti 2020-05-06 13:00 ` Veerabhadrarao Badiganti 2020-05-06 13:00 ` Veerabhadrarao Badiganti [not found] ` <9bc2454f-0b42-e256-7927-2564b56f369f-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> 2020-05-06 16:36 ` Ulf Hansson 2020-05-06 16:36 ` Ulf Hansson 2020-05-06 16:36 ` Ulf Hansson 2020-05-06 16:36 ` Ulf Hansson 2020-05-07 16:33 ` Veerabhadrarao Badiganti 2020-05-07 16:33 ` Veerabhadrarao Badiganti 2020-05-07 16:33 ` Veerabhadrarao Badiganti 2020-05-07 16:33 ` Veerabhadrarao Badiganti [not found] ` <f9fa0232-3945-4e47-9238-0b51f6531199-sgV2jX0FEOL9JmXXK+q4OQ@public.gmane.org> 2020-05-08 5:05 ` Ulf Hansson 2020-05-08 5:05 ` Ulf Hansson 2020-05-08 5:05 ` Ulf Hansson 2020-05-08 5:05 ` Ulf Hansson 2020-05-12 1:16 ` Chun-Hung Wu 2020-05-12 1:16 ` Chun-Hung Wu 2020-05-12 1:16 ` Chun-Hung Wu 2020-04-27 23:56 ` [PATCH v5 4/5] mmc: mediatek: command queue support Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu [not found] ` <1588031768-23677-5-git-send-email-chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> 2020-04-28 13:02 ` yong.mao-NuS5LvNUpcJWk0Htik3J/w 2020-04-28 13:02 ` yong.mao 2020-04-28 13:02 ` yong.mao 2020-04-28 13:02 ` yong.mao 2020-04-27 23:56 ` [PATCH v5 2/5] mmc: host: Remove redundant CQE bindings Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` [PATCH v5 3/5] mmc: mediatek: refine msdc timeout api Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu [not found] ` <1588031768-23677-4-git-send-email-chun-hung.wu-NuS5LvNUpcJWk0Htik3J/w@public.gmane.org> 2020-04-28 12:28 ` yong.mao-NuS5LvNUpcJWk0Htik3J/w 2020-04-28 12:28 ` yong.mao 2020-04-28 12:28 ` yong.mao 2020-04-28 12:28 ` yong.mao 2020-04-27 23:56 ` [PATCH v5 5/5] dt-bindings: mmc: mediatek: Add document for mt6779 Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-04-27 23:56 ` Chun-Hung Wu 2020-05-05 11:33 ` [PATCH v5 0/5] mmc: mediatek: add mmc cqhci support Ulf Hansson 2020-05-05 11:33 ` Ulf Hansson
This is an external index of several public inboxes, see mirroring instructions on how to clone and mirror all data and code used by this external index.