Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge tag 'mmc-v5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc

Pull MMC updates from Ulf Hansson:
"MMC core:
- Use common polling loop for CMD1
- Add support for DT compatibles for card quirks and use it for ti,wl1251
- Fixup storing of the OCR mask for MMC_QUIRK_NONSTD_SDIO

MMC host:
- dw_mmc: Add support for MMC_GEN_CMDs
- dw_mmc: Fixup calculation of the data timeout
- dw_mmc-exynos: Add support for the ARTPEC-8 variant
- jz4740: Add support for bi-directional DMA channels
- mmci: Add support for eMMC HS200 mode for the stm32 sdmmc variant
- mmci: Add support for stm32 sdmmc variant revision v2.2
- mtk-sd: A couple of various minor improvements
- omap_hsmmc: Drop redundant initialization for the ti,wl1251 chip
- sdhci-esdhc-imx: Add support for the i.MXRT series variant
- sdhci-esdhc-imx: Add Haibo Chen as maintainer
- sdhci-pci: Add support for the Intel ADL variant
- sdhci-pci-gli: GL975[50]: Add support for the Apple ARM64 variant
- sdhci-pci-o2micro: Improve support for SDR104/HS200"

* tag 'mmc-v5.17' of git://git.kernel.org/pub/scm/linux/kernel/git/ulfh/mmc: (54 commits)
dt-bindings: mmc: synopsys-dw-mshc: integrate Altera and Imagination
mmc: pwrseq: Use bitmap_free() to free bitmap
dt-bindings: mmc: PL18x stop relying on order of dma-names
dt-bindings: mmc: sdhci-msm: Add compatible string for msm8994
mmc: au1xmmc: propagate errors from platform_get_irq()
mmc: sdhci-pci-o2micro: Restore the SD clock's base clock frequency
mmc: sdhci-pci-o2micro: Improve card input timing at SDR104/HS200 mode
mmc: mtk-sd: Assign src_clk parent to src_clk_cg for legacy DTs
mmc: mtk-sd: Fix usage of devm_clk_get_optional()
mmc: mtk-sd: Take action for no-sdio device-tree parameter
mmc: mtk-sd: Use BIT() and GENMASK() macros to describe fields
mmc: mtk-sd: Use readl_poll_timeout instead of open-coded polling
MAINTAINERS: Add i.MX sdhci maintainer
mmc: jz4740: Support using a bi-directional DMA channel
dt-bindings: mmc: ingenic: Support using bi-directional DMA channel
mmc: dw_mmc: Do not wait for DTO in case of error
mmc: dw_mmc: Add driver callbacks for data read timeout
mmc: dw_mmc-exynos: Add support for ARTPEC-8
dt-bindings: mmc: exynos-dw-mshc: Add support for ARTPEC-8
mmc: meson-mx-sdio: add IRQ check
...

+925 -549
+3
Documentation/devicetree/bindings/mmc/arasan,sdhci.yaml
··· 118 118 phy-names: 119 119 const: phy_arasan 120 120 121 + resets: 122 + maxItems: 1 123 + 121 124 arasan,soc-ctl-syscon: 122 125 $ref: /schemas/types.yaml#/definitions/phandle 123 126 description:
+18 -1
Documentation/devicetree/bindings/mmc/arm,pl18x.yaml
··· 53 53 items: 54 54 - const: arm,pl18x 55 55 - const: arm,primecell 56 + - description: Entry for STMicroelectronics variant of PL18x. 57 + This dedicated compatible is used by bootloaders. 58 + items: 59 + - const: st,stm32-sdmmc2 60 + - const: arm,pl18x 61 + - const: arm,primecell 56 62 57 63 clocks: 58 64 description: One or two clocks, the "apb_pclk" and the "MCLK" 59 65 which is the core block clock. The names are not compulsory. 60 66 minItems: 1 61 67 maxItems: 2 68 + 69 + dmas: 70 + maxItems: 2 71 + 72 + dma-names: 73 + oneOf: 74 + - items: 75 + - const: tx 76 + - const: rx 77 + - items: 78 + - const: rx 79 + - const: tx 62 80 63 81 power-domains: true 64 82 ··· 231 213 arm,primecell-periphid = <0x10153180>; 232 214 reg = <0x52007000 0x1000>; 233 215 interrupts = <49>; 234 - interrupt-names = "cmd_irq"; 235 216 clocks = <&rcc 0>; 236 217 clock-names = "apb_pclk"; 237 218 resets = <&rcc 1>;
-53
Documentation/devicetree/bindings/mmc/brcm,sdhci-brcmstb.txt
··· 1 - * BROADCOM BRCMSTB/BMIPS SDHCI Controller 2 - 3 - This file documents differences between the core properties in mmc.txt 4 - and the properties used by the sdhci-brcmstb driver. 5 - 6 - NOTE: The driver disables all UHS speed modes by default and depends 7 - on Device Tree properties to enable them for SoC/Board combinations 8 - that support them. 9 - 10 - Required properties: 11 - - compatible: should be one of the following 12 - - "brcm,bcm7425-sdhci" 13 - - "brcm,bcm7445-sdhci" 14 - - "brcm,bcm7216-sdhci" 15 - 16 - Refer to clocks/clock-bindings.txt for generic clock consumer properties. 17 - 18 - Example: 19 - 20 - sdhci@84b0000 { 21 - sd-uhs-sdr50; 22 - sd-uhs-ddr50; 23 - sd-uhs-sdr104; 24 - sdhci,auto-cmd12; 25 - compatible = "brcm,bcm7216-sdhci", 26 - "brcm,bcm7445-sdhci", 27 - "brcm,sdhci-brcmstb"; 28 - reg = <0x84b0000 0x260 0x84b0300 0x200>; 29 - reg-names = "host", "cfg"; 30 - interrupts = <0x0 0x26 0x4>; 31 - interrupt-names = "sdio0_0"; 32 - clocks = <&scmi_clk 245>; 33 - clock-names = "sw_sdio"; 34 - }; 35 - 36 - sdhci@84b1000 { 37 - mmc-ddr-1_8v; 38 - mmc-hs200-1_8v; 39 - mmc-hs400-1_8v; 40 - mmc-hs400-enhanced-strobe; 41 - supports-cqe; 42 - non-removable; 43 - bus-width = <0x8>; 44 - compatible = "brcm,bcm7216-sdhci", 45 - "brcm,bcm7445-sdhci", 46 - "brcm,sdhci-brcmstb"; 47 - reg = <0x84b1000 0x260 0x84b1300 0x200>; 48 - reg-names = "host", "cfg"; 49 - interrupts = <0x0 0x27 0x4>; 50 - interrupt-names = "sdio1_0"; 51 - clocks = <&scmi_clk 245>; 52 - clock-names = "sw_sdio"; 53 - };
+100
Documentation/devicetree/bindings/mmc/brcm,sdhci-brcmstb.yaml
··· 1 + # SPDX-License-Identifier: (GPL-2.0-only OR BSD-2-Clause) 2 + %YAML 1.2 3 + --- 4 + $id: http://devicetree.org/schemas/mmc/brcm,sdhci-brcmstb.yaml# 5 + $schema: http://devicetree.org/meta-schemas/core.yaml# 6 + 7 + title: Broadcom BRCMSTB/BMIPS SDHCI Controller binding 8 + 9 + maintainers: 10 + - Al Cooper <alcooperx@gmail.com> 11 + - Florian Fainelli <f.fainelli@gmail.com> 12 + 13 + allOf: 14 + - $ref: mmc-controller.yaml# 15 + 16 + properties: 17 + compatible: 18 + oneOf: 19 + - items: 20 + - enum: 21 + - brcm,bcm7216-sdhci 22 + - const: brcm,bcm7445-sdhci 23 + - const: brcm,sdhci-brcmstb 24 + - items: 25 + - enum: 26 + - brcm,bcm7445-sdhci 27 + - const: brcm,sdhci-brcmstb 28 + - items: 29 + - enum: 30 + - brcm,bcm7425-sdhci 31 + - const: brcm,sdhci-brcmstb 32 + 33 + reg: 34 + minItems: 2 35 + 36 + reg-names: 37 + items: 38 + - const: host 39 + - const: cfg 40 + 41 + interrupts: 42 + maxItems: 1 43 + 44 + clocks: 45 + maxItems: 1 46 + description: 47 + handle to core clock for the sdhci controller. 48 + 49 + clock-names: 50 + items: 51 + - const: sw_sdio 52 + 53 + sdhci,auto-cmd12: 54 + type: boolean 55 + description: Specifies that controller should use auto CMD12 56 + 57 + required: 58 + - compatible 59 + - reg 60 + - interrupts 61 + - clocks 62 + 63 + unevaluatedProperties: false 64 + 65 + examples: 66 + - | 67 + mmc@84b0000 { 68 + sd-uhs-sdr50; 69 + sd-uhs-ddr50; 70 + sd-uhs-sdr104; 71 + sdhci,auto-cmd12; 72 + compatible = "brcm,bcm7216-sdhci", 73 + "brcm,bcm7445-sdhci", 74 + "brcm,sdhci-brcmstb"; 75 + reg = <0x84b0000 0x260>, <0x84b0300 0x200>; 76 + reg-names = "host", "cfg"; 77 + interrupts = <0x0 0x26 0x4>; 78 + interrupt-names = "sdio0_0"; 79 + clocks = <&scmi_clk 245>; 80 + clock-names = "sw_sdio"; 81 + }; 82 + 83 + mmc@84b1000 { 84 + mmc-ddr-1_8v; 85 + mmc-hs200-1_8v; 86 + mmc-hs400-1_8v; 87 + mmc-hs400-enhanced-strobe; 88 + supports-cqe; 89 + non-removable; 90 + bus-width = <0x8>; 91 + compatible = "brcm,bcm7216-sdhci", 92 + "brcm,bcm7445-sdhci", 93 + "brcm,sdhci-brcmstb"; 94 + reg = <0x84b1000 0x260>, <0x84b1300 0x200>; 95 + reg-names = "host", "cfg"; 96 + interrupts = <0x0 0x27 0x4>; 97 + interrupt-names = "sdio1_0"; 98 + clocks = <&scmi_clk 245>; 99 + clock-names = "sw_sdio"; 100 + };
+2
Documentation/devicetree/bindings/mmc/exynos-dw-mshc.txt
··· 22 22 specific extensions. 23 23 - "samsung,exynos7-dw-mshc-smu": for controllers with Samsung Exynos7 24 24 specific extensions having an SMU. 25 + - "axis,artpec8-dw-mshc": for controllers with ARTPEC-8 specific 26 + extensions. 25 27 26 28 * samsung,dw-mshc-ciu-div: Specifies the divider value for the card interface 27 29 unit (ciu) clock. This property is applicable only for Exynos5 SoC's and
+8
Documentation/devicetree/bindings/mmc/fsl-imx-esdhc.yaml
··· 34 34 - fsl,imx6ull-usdhc 35 35 - fsl,imx7d-usdhc 36 36 - fsl,imx7ulp-usdhc 37 + - fsl,imxrt1050-usdhc 37 38 - nxp,s32g2-usdhc 38 39 - items: 39 40 - enum: ··· 45 44 - fsl,imx8qm-usdhc 46 45 - fsl,imx8qxp-usdhc 47 46 - const: fsl,imx7d-usdhc 47 + - items: 48 + - enum: 49 + - fsl,imx8ulp-usdhc 50 + - const: fsl,imx8mm-usdhc 48 51 49 52 reg: 50 53 maxItems: 1 ··· 120 115 - const: ipg 121 116 - const: ahb 122 117 - const: per 118 + 119 + power-domains: 120 + maxItems: 1 123 121 124 122 pinctrl-names: 125 123 oneOf:
-28
Documentation/devicetree/bindings/mmc/img-dw-mshc.txt
··· 1 - * Imagination specific extensions to the Synopsys Designware Mobile Storage 2 - Host Controller 3 - 4 - The Synopsys designware mobile storage host controller is used to interface 5 - a SoC with storage medium such as eMMC or SD/MMC cards. This file documents 6 - differences between the core Synopsys dw mshc controller properties described 7 - by synopsys-dw-mshc.txt and the properties used by the Imagination specific 8 - extensions to the Synopsys Designware Mobile Storage Host Controller. 9 - 10 - Required Properties: 11 - 12 - * compatible: should be 13 - - "img,pistachio-dw-mshc": for Pistachio SoCs 14 - 15 - Example: 16 - 17 - mmc@18142000 { 18 - compatible = "img,pistachio-dw-mshc"; 19 - reg = <0x18142000 0x400>; 20 - interrupts = <GIC_SHARED 39 IRQ_TYPE_LEVEL_HIGH>; 21 - 22 - clocks = <&system_clk>, <&sdhost_clk>; 23 - clock-names = "biu", "ciu"; 24 - 25 - fifo-depth = <0x20>; 26 - bus-width = <4>; 27 - disable-wp; 28 - };
+31 -6
Documentation/devicetree/bindings/mmc/ingenic,mmc.yaml
··· 39 39 const: mmc 40 40 41 41 dmas: 42 - items: 43 - - description: DMA controller phandle and request line for RX 44 - - description: DMA controller phandle and request line for TX 42 + minItems: 1 43 + maxItems: 2 45 44 46 45 dma-names: 47 - items: 48 - - const: rx 49 - - const: tx 46 + oneOf: 47 + - items: 48 + - const: rx 49 + - const: tx 50 + - const: tx-rx 50 51 51 52 required: 52 53 - compatible ··· 80 79 dmas = <&dma JZ4780_DMA_MSC0_RX 0xffffffff>, 81 80 <&dma JZ4780_DMA_MSC0_TX 0xffffffff>; 82 81 dma-names = "rx", "tx"; 82 + }; 83 + - | 84 + #include <dt-bindings/clock/ingenic,jz4780-cgu.h> 85 + #include <dt-bindings/dma/jz4780-dma.h> 86 + /* 87 + * Alternative version of the example above, 88 + * but using one single DMA channel for both 89 + * TX and RX. 90 + */ 91 + mmc1: mmc@13460000 { 92 + compatible = "ingenic,jz4780-mmc"; 93 + reg = <0x13460000 0x1000>; 94 + 95 + interrupt-parent = <&intc>; 96 + interrupts = <36>; 97 + 98 + clocks = <&cgu JZ4780_CLK_MSC1>; 99 + clock-names = "mmc"; 100 + 101 + cap-sd-highspeed; 102 + cap-mmc-highspeed; 103 + cap-sdio-irq; 104 + dmas = <&dma JZ4780_DMA_MSC1_TX JZ4780_DMA_MSC1_RX 0xffffffff>; 105 + dma-names = "tx-rx"; 83 106 };
+6
Documentation/devicetree/bindings/mmc/mtk-sd.yaml
··· 36 36 - const: mediatek,mt8195-mmc 37 37 - const: mediatek,mt8183-mmc 38 38 39 + reg: 40 + maxItems: 1 41 + 39 42 clocks: 40 43 description: 41 44 Should contain phandle for the clock feeding the MMC controller. ··· 64 61 - const: pclk_cg 65 62 - const: axi_cg 66 63 - const: ahb_cg 64 + 65 + interrupts: 66 + maxItems: 1 67 67 68 68 pinctrl-names: 69 69 items:
+2
Documentation/devicetree/bindings/mmc/sdhci-am654.yaml
··· 48 48 - const: clk_ahb 49 49 - const: clk_xin 50 50 51 + sdhci-caps-mask: true 52 + 51 53 # PHY output tap delays: 52 54 # Used to delay the data valid window and align it to the sampling clock. 53 55 # Binding needs to be provided for each supported speed mode otherwise the
+1
Documentation/devicetree/bindings/mmc/sdhci-msm.txt
··· 17 17 "qcom,msm8974-sdhci", "qcom,sdhci-msm-v4" 18 18 "qcom,msm8916-sdhci", "qcom,sdhci-msm-v4" 19 19 "qcom,msm8992-sdhci", "qcom,sdhci-msm-v4" 20 + "qcom,msm8994-sdhci", "qcom,sdhci-msm-v4" 20 21 "qcom,msm8996-sdhci", "qcom,sdhci-msm-v4" 21 22 "qcom,qcs404-sdhci", "qcom,sdhci-msm-v5" 22 23 "qcom,sc7180-sdhci", "qcom,sdhci-msm-v5";
-23
Documentation/devicetree/bindings/mmc/socfpga-dw-mshc.txt
··· 1 - * Altera SOCFPGA specific extensions to the Synopsys Designware Mobile 2 - Storage Host Controller 3 - 4 - The Synopsys designware mobile storage host controller is used to interface 5 - a SoC with storage medium such as eMMC or SD/MMC cards. This file documents 6 - differences between the core Synopsys dw mshc controller properties described 7 - by synopsys-dw-mshc.txt and the properties used by the Altera SOCFPGA specific 8 - extensions to the Synopsys Designware Mobile Storage Host Controller. 9 - 10 - Required Properties: 11 - 12 - * compatible: should be 13 - - "altr,socfpga-dw-mshc": for Altera's SOCFPGA platform 14 - 15 - Example: 16 - 17 - mmc: dwmmc0@ff704000 { 18 - compatible = "altr,socfpga-dw-mshc"; 19 - reg = <0xff704000 0x1000>; 20 - interrupts = <0 129 4>; 21 - #address-cells = <1>; 22 - #size-cells = <0>; 23 - };
+6
Documentation/devicetree/bindings/mmc/socionext,uniphier-sd.yaml
··· 26 26 clocks: 27 27 maxItems: 1 28 28 29 + dmas: 30 + maxItems: 1 31 + 32 + dma-names: 33 + const: rx-tx 34 + 29 35 reset-names: 30 36 description: | 31 37 There are three reset signals at maximum
+4 -1
Documentation/devicetree/bindings/mmc/synopsys-dw-mshc.yaml
··· 15 15 # Everything else is described in the common file 16 16 properties: 17 17 compatible: 18 - const: snps,dw-mshc 18 + enum: 19 + - altr,socfpga-dw-mshc 20 + - img,pistachio-dw-mshc 21 + - snps,dw-mshc 19 22 20 23 reg: 21 24 maxItems: 1
+7
MAINTAINERS
··· 17251 17251 S: Maintained 17252 17252 F: drivers/mmc/host/sdhci-omap.c 17253 17253 17254 + SECURE DIGITAL HOST CONTROLLER INTERFACE (SDHCI) NXP i.MX DRIVER 17255 + M: Haibo Chen <haibo.chen@nxp.com> 17256 + L: linux-imx@nxp.com 17257 + L: linux-mmc@vger.kernel.org 17258 + S: Maintained 17259 + F: drivers/mmc/host/sdhci-esdhc-imx.c 17260 + 17254 17261 SECURE ENCRYPTING DEVICE (SED) OPAL DRIVER 17255 17262 M: Jonathan Derrick <jonathan.derrick@intel.com> 17256 17263 M: Revanth Rajashekar <revanth.rajashekar@intel.com>
+2 -2
drivers/mmc/core/block.c
··· 1908 1908 1909 1909 cb_data.card = card; 1910 1910 cb_data.status = 0; 1911 - err = __mmc_poll_for_busy(card, MMC_BLK_TIMEOUT_MS, &mmc_blk_busy_cb, 1912 - &cb_data); 1911 + err = __mmc_poll_for_busy(card->host, MMC_BLK_TIMEOUT_MS, 1912 + &mmc_blk_busy_cb, &cb_data); 1913 1913 1914 1914 /* 1915 1915 * Do not assume data transferred correctly if there are any error bits
-11
drivers/mmc/core/bus.c
··· 53 53 }; 54 54 ATTRIBUTE_GROUPS(mmc_dev); 55 55 56 - /* 57 - * This currently matches any MMC driver to any MMC card - drivers 58 - * themselves make the decision whether to drive this card in their 59 - * probe method. 60 - */ 61 - static int mmc_bus_match(struct device *dev, struct device_driver *drv) 62 - { 63 - return 1; 64 - } 65 - 66 56 static int 67 57 mmc_bus_uevent(struct device *dev, struct kobj_uevent_env *env) 68 58 { ··· 216 226 static struct bus_type mmc_bus_type = { 217 227 .name = "mmc", 218 228 .dev_groups = mmc_dev_groups, 219 - .match = mmc_bus_match, 220 229 .uevent = mmc_bus_uevent, 221 230 .probe = mmc_bus_probe, 222 231 .remove = mmc_bus_remove,
+36
drivers/mmc/core/card.h
··· 59 59 /* for MMC cards */ 60 60 unsigned int ext_csd_rev; 61 61 62 + /* Match against functions declared in device tree */ 63 + const char *of_compatible; 64 + 62 65 void (*vendor_fixup)(struct mmc_card *card, int data); 63 66 int data; 64 67 }; ··· 122 119 _vendor, _device, \ 123 120 _fixup, _data, EXT_CSD_REV_ANY) \ 124 121 122 + #define SDIO_FIXUP_COMPATIBLE(_compatible, _fixup, _data) \ 123 + { \ 124 + .name = CID_NAME_ANY, \ 125 + .manfid = CID_MANFID_ANY, \ 126 + .oemid = CID_OEMID_ANY, \ 127 + .rev_start = 0, \ 128 + .rev_end = -1ull, \ 129 + .cis_vendor = SDIO_ANY_ID, \ 130 + .cis_device = SDIO_ANY_ID, \ 131 + .vendor_fixup = (_fixup), \ 132 + .data = (_data), \ 133 + .ext_csd_rev = EXT_CSD_REV_ANY, \ 134 + .of_compatible = _compatible, \ 135 + } 136 + 125 137 #define cid_rev(hwrev, fwrev, year, month) \ 126 138 (((u64) hwrev) << 40 | \ 127 139 ((u64) fwrev) << 32 | \ ··· 166 148 int data) 167 149 { 168 150 card->quirk_max_rate = data; 151 + } 152 + 153 + static inline void __maybe_unused wl1251_quirk(struct mmc_card *card, 154 + int data) 155 + { 156 + /* 157 + * We have TI wl1251 attached to this mmc. Pass this 158 + * information to the SDIO core because it can't be 159 + * probed by normal methods. 160 + */ 161 + 162 + dev_info(card->host->parent, "found wl1251\n"); 163 + card->quirks |= MMC_QUIRK_NONSTD_SDIO; 164 + card->cccr.wide_bus = 1; 165 + card->cis.vendor = 0x104c; 166 + card->cis.device = 0x9066; 167 + card->cis.blksize = 512; 168 + card->cis.max_dtr = 24000000; 169 169 } 170 170 171 171 /*
+1 -1
drivers/mmc/core/mmc.c
··· 1962 1962 goto out_release; 1963 1963 } 1964 1964 1965 - err = __mmc_poll_for_busy(card, timeout_ms, &mmc_sleep_busy_cb, host); 1965 + err = __mmc_poll_for_busy(host, timeout_ms, &mmc_sleep_busy_cb, host); 1966 1966 1967 1967 out_release: 1968 1968 mmc_retune_release(host);
+57 -32
drivers/mmc/core/mmc_ops.c
··· 58 58 enum mmc_busy_cmd busy_cmd; 59 59 }; 60 60 61 + struct mmc_op_cond_busy_data { 62 + struct mmc_host *host; 63 + u32 ocr; 64 + struct mmc_command *cmd; 65 + }; 66 + 61 67 int __mmc_send_status(struct mmc_card *card, u32 *status, unsigned int retries) 62 68 { 63 69 int err; ··· 179 173 return err; 180 174 } 181 175 176 + static int __mmc_send_op_cond_cb(void *cb_data, bool *busy) 177 + { 178 + struct mmc_op_cond_busy_data *data = cb_data; 179 + struct mmc_host *host = data->host; 180 + struct mmc_command *cmd = data->cmd; 181 + u32 ocr = data->ocr; 182 + int err = 0; 183 + 184 + err = mmc_wait_for_cmd(host, cmd, 0); 185 + if (err) 186 + return err; 187 + 188 + if (mmc_host_is_spi(host)) { 189 + if (!(cmd->resp[0] & R1_SPI_IDLE)) { 190 + *busy = false; 191 + return 0; 192 + } 193 + } else { 194 + if (cmd->resp[0] & MMC_CARD_BUSY) { 195 + *busy = false; 196 + return 0; 197 + } 198 + } 199 + 200 + *busy = true; 201 + 202 + /* 203 + * According to eMMC specification v5.1 section 6.4.3, we 204 + * should issue CMD1 repeatedly in the idle state until 205 + * the eMMC is ready. Otherwise some eMMC devices seem to enter 206 + * the inactive mode after mmc_init_card() issued CMD0 when 207 + * the eMMC device is busy. 208 + */ 209 + if (!ocr && !mmc_host_is_spi(host)) 210 + cmd->arg = cmd->resp[0] | BIT(30); 211 + 212 + return 0; 213 + } 214 + 182 215 int mmc_send_op_cond(struct mmc_host *host, u32 ocr, u32 *rocr) 183 216 { 184 217 struct mmc_command cmd = {}; 185 - int i, err = 0; 218 + int err = 0; 219 + struct mmc_op_cond_busy_data cb_data = { 220 + .host = host, 221 + .ocr = ocr, 222 + .cmd = &cmd 223 + }; 186 224 187 225 cmd.opcode = MMC_SEND_OP_COND; 188 226 cmd.arg = mmc_host_is_spi(host) ? 0 : ocr; 189 227 cmd.flags = MMC_RSP_SPI_R1 | MMC_RSP_R3 | MMC_CMD_BCR; 190 228 191 - for (i = 100; i; i--) { 192 - err = mmc_wait_for_cmd(host, &cmd, 0); 193 - if (err) 194 - break; 195 - 196 - /* wait until reset completes */ 197 - if (mmc_host_is_spi(host)) { 198 - if (!(cmd.resp[0] & R1_SPI_IDLE)) 199 - break; 200 - } else { 201 - if (cmd.resp[0] & MMC_CARD_BUSY) 202 - break; 203 - } 204 - 205 - err = -ETIMEDOUT; 206 - 207 - mmc_delay(10); 208 - 209 - /* 210 - * According to eMMC specification v5.1 section 6.4.3, we 211 - * should issue CMD1 repeatedly in the idle state until 212 - * the eMMC is ready. Otherwise some eMMC devices seem to enter 213 - * the inactive mode after mmc_init_card() issued CMD0 when 214 - * the eMMC device is busy. 215 - */ 216 - if (!ocr && !mmc_host_is_spi(host)) 217 - cmd.arg = cmd.resp[0] | BIT(30); 218 - } 229 + err = __mmc_poll_for_busy(host, 1000, &__mmc_send_op_cond_cb, &cb_data); 230 + if (err) 231 + return err; 219 232 220 233 if (rocr && !mmc_host_is_spi(host)) 221 234 *rocr = cmd.resp[0]; ··· 495 470 return 0; 496 471 } 497 472 498 - int __mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, 473 + int __mmc_poll_for_busy(struct mmc_host *host, unsigned int timeout_ms, 499 474 int (*busy_cb)(void *cb_data, bool *busy), 500 475 void *cb_data) 501 476 { 502 - struct mmc_host *host = card->host; 503 477 int err; 504 478 unsigned long timeout; 505 479 unsigned int udelay = 32, udelay_max = 32768; ··· 539 515 int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, 540 516 bool retry_crc_err, enum mmc_busy_cmd busy_cmd) 541 517 { 518 + struct mmc_host *host = card->host; 542 519 struct mmc_busy_data cb_data; 543 520 544 521 cb_data.card = card; 545 522 cb_data.retry_crc_err = retry_crc_err; 546 523 cb_data.busy_cmd = busy_cmd; 547 524 548 - return __mmc_poll_for_busy(card, timeout_ms, &mmc_busy_cb, &cb_data); 525 + return __mmc_poll_for_busy(host, timeout_ms, &mmc_busy_cb, &cb_data); 549 526 } 550 527 EXPORT_SYMBOL_GPL(mmc_poll_for_busy); 551 528
+1 -1
drivers/mmc/core/mmc_ops.h
··· 41 41 int mmc_switch_status(struct mmc_card *card, bool crc_err_fatal); 42 42 bool mmc_prepare_busy_cmd(struct mmc_host *host, struct mmc_command *cmd, 43 43 unsigned int timeout_ms); 44 - int __mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms, 44 + int __mmc_poll_for_busy(struct mmc_host *host, unsigned int timeout_ms, 45 45 int (*busy_cb)(void *cb_data, bool *busy), 46 46 void *cb_data); 47 47 int mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
+1 -1
drivers/mmc/core/pwrseq_simple.c
··· 54 54 gpiod_set_array_value_cansleep(nvalues, reset_gpios->desc, 55 55 reset_gpios->info, values); 56 56 57 - kfree(values); 57 + bitmap_free(values); 58 58 } 59 59 } 60 60
+1 -1
drivers/mmc/core/queue.c
··· 234 234 enum mmc_issue_type issue_type; 235 235 enum mmc_issued issued; 236 236 bool get_card, cqe_retune_ok; 237 - int ret; 237 + blk_status_t ret; 238 238 239 239 if (mmc_card_removed(mq->card)) { 240 240 req->rq_flags |= RQF_QUIET;
+47 -17
drivers/mmc/core/quirks.h
··· 10 10 * 11 11 */ 12 12 13 + #include <linux/of.h> 13 14 #include <linux/mmc/sdio_ids.h> 14 15 15 16 #include "card.h" ··· 146 145 END_FIXUP 147 146 }; 148 147 148 + static const struct mmc_fixup __maybe_unused sdio_card_init_methods[] = { 149 + SDIO_FIXUP_COMPATIBLE("ti,wl1251", wl1251_quirk, 0), 150 + 151 + END_FIXUP 152 + }; 153 + 154 + static inline bool mmc_fixup_of_compatible_match(struct mmc_card *card, 155 + const char *compatible) 156 + { 157 + struct device_node *np; 158 + 159 + for_each_child_of_node(mmc_dev(card->host)->of_node, np) { 160 + if (of_device_is_compatible(np, compatible)) 161 + return true; 162 + } 163 + 164 + return false; 165 + } 166 + 149 167 static inline void mmc_fixup_device(struct mmc_card *card, 150 168 const struct mmc_fixup *table) 151 169 { ··· 172 152 u64 rev = cid_rev_card(card); 173 153 174 154 for (f = table; f->vendor_fixup; f++) { 175 - if ((f->manfid == CID_MANFID_ANY || 176 - f->manfid == card->cid.manfid) && 177 - (f->oemid == CID_OEMID_ANY || 178 - f->oemid == card->cid.oemid) && 179 - (f->name == CID_NAME_ANY || 180 - !strncmp(f->name, card->cid.prod_name, 181 - sizeof(card->cid.prod_name))) && 182 - (f->cis_vendor == card->cis.vendor || 183 - f->cis_vendor == (u16) SDIO_ANY_ID) && 184 - (f->cis_device == card->cis.device || 185 - f->cis_device == (u16) SDIO_ANY_ID) && 186 - (f->ext_csd_rev == EXT_CSD_REV_ANY || 187 - f->ext_csd_rev == card->ext_csd.rev) && 188 - rev >= f->rev_start && rev <= f->rev_end) { 189 - dev_dbg(&card->dev, "calling %ps\n", f->vendor_fixup); 190 - f->vendor_fixup(card, f->data); 191 - } 155 + if (f->manfid != CID_MANFID_ANY && 156 + f->manfid != card->cid.manfid) 157 + continue; 158 + if (f->oemid != CID_OEMID_ANY && 159 + f->oemid != card->cid.oemid) 160 + continue; 161 + if (f->name != CID_NAME_ANY && 162 + strncmp(f->name, card->cid.prod_name, 163 + sizeof(card->cid.prod_name))) 164 + continue; 165 + if (f->cis_vendor != (u16)SDIO_ANY_ID && 166 + f->cis_vendor != card->cis.vendor) 167 + continue; 168 + if (f->cis_device != (u16)SDIO_ANY_ID && 169 + f->cis_device != card->cis.device) 170 + continue; 171 + if (f->ext_csd_rev != EXT_CSD_REV_ANY && 172 + f->ext_csd_rev != card->ext_csd.rev) 173 + continue; 174 + if (rev < f->rev_start || rev > f->rev_end) 175 + continue; 176 + if (f->of_compatible && 177 + !mmc_fixup_of_compatible_match(card, f->of_compatible)) 178 + continue; 179 + 180 + dev_dbg(&card->dev, "calling %ps\n", f->vendor_fixup); 181 + f->vendor_fixup(card, f->data); 192 182 } 193 183 }
+1 -1
drivers/mmc/core/sd.c
··· 1666 1666 1667 1667 cb_data.card = card; 1668 1668 cb_data.reg_buf = reg_buf; 1669 - err = __mmc_poll_for_busy(card, SD_POWEROFF_NOTIFY_TIMEOUT_MS, 1669 + err = __mmc_poll_for_busy(card->host, SD_POWEROFF_NOTIFY_TIMEOUT_MS, 1670 1670 &sd_busy_poweroff_notify_cb, &cb_data); 1671 1671 1672 1672 out:
+4 -1
drivers/mmc/core/sdio.c
··· 707 707 */ 708 708 if (host->ops->init_card) 709 709 host->ops->init_card(host, card); 710 + mmc_fixup_device(card, sdio_card_init_methods); 711 + 712 + card->ocr = ocr_card; 710 713 711 714 /* 712 715 * If the host and card support UHS-I mode request the card ··· 823 820 goto mismatch; 824 821 } 825 822 } 826 - card->ocr = ocr_card; 823 + 827 824 mmc_fixup_device(card, sdio_fixup_methods); 828 825 829 826 if (card->type == MMC_TYPE_SD_COMBO) {
+3 -1
drivers/mmc/host/au1xmmc.c
··· 969 969 } 970 970 971 971 host->irq = platform_get_irq(pdev, 0); 972 - if (host->irq < 0) 972 + if (host->irq < 0) { 973 + ret = host->irq; 973 974 goto out3; 975 + } 974 976 975 977 mmc->ops = &au1xmmc_ops; 976 978
+95 -15
drivers/mmc/host/dw_mmc-exynos.c
··· 28 28 DW_MCI_TYPE_EXYNOS5420_SMU, 29 29 DW_MCI_TYPE_EXYNOS7, 30 30 DW_MCI_TYPE_EXYNOS7_SMU, 31 + DW_MCI_TYPE_ARTPEC8, 31 32 }; 32 33 33 34 /* Exynos implementation specific driver private data */ ··· 70 69 }, { 71 70 .compatible = "samsung,exynos7-dw-mshc-smu", 72 71 .ctrl_type = DW_MCI_TYPE_EXYNOS7_SMU, 72 + }, { 73 + .compatible = "axis,artpec8-dw-mshc", 74 + .ctrl_type = DW_MCI_TYPE_ARTPEC8, 73 75 }, 74 76 }; 75 77 ··· 85 81 else if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS4210) 86 82 return EXYNOS4210_FIXED_CIU_CLK_DIV; 87 83 else if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 88 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 84 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 85 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 89 86 return SDMMC_CLKSEL_GET_DIV(mci_readl(host, CLKSEL64)) + 1; 90 87 else 91 88 return SDMMC_CLKSEL_GET_DIV(mci_readl(host, CLKSEL)) + 1; ··· 127 122 DQS_CTRL_GET_RD_DELAY(priv->saved_strobe_ctrl); 128 123 } 129 124 125 + if (priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) { 126 + /* Quirk needed for the ARTPEC-8 SoC */ 127 + host->quirks |= DW_MMC_QUIRK_EXTENDED_TMOUT; 128 + } 129 + 130 130 host->bus_hz /= (priv->ciu_div + 1); 131 131 132 132 return 0; ··· 143 133 u32 clksel; 144 134 145 135 if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 146 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 136 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 137 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 147 138 clksel = mci_readl(host, CLKSEL64); 148 139 else 149 140 clksel = mci_readl(host, CLKSEL); ··· 152 141 clksel = (clksel & ~SDMMC_CLKSEL_TIMING_MASK) | timing; 153 142 154 143 if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 155 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 144 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 145 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 156 146 mci_writel(host, CLKSEL64, clksel); 157 147 else 158 148 mci_writel(host, CLKSEL, clksel); ··· 222 210 return ret; 223 211 224 212 if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 225 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 213 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 214 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 226 215 clksel = mci_readl(host, CLKSEL64); 227 216 else 228 217 clksel = mci_readl(host, CLKSEL); 229 218 230 219 if (clksel & SDMMC_CLKSEL_WAKEUP_INT) { 231 220 if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 232 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 221 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 222 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 233 223 mci_writel(host, CLKSEL64, clksel); 234 224 else 235 225 mci_writel(host, CLKSEL, clksel); ··· 252 238 * Not supported to configure register 253 239 * related to HS400 254 240 */ 255 - if (priv->ctrl_type < DW_MCI_TYPE_EXYNOS5420) { 241 + if ((priv->ctrl_type < DW_MCI_TYPE_EXYNOS5420) || 242 + (priv->ctrl_type == DW_MCI_TYPE_ARTPEC8)) { 256 243 if (timing == MMC_TIMING_MMC_HS400) 257 244 dev_warn(host->dev, 258 245 "cannot configure HS400, unsupported chipset\n"); ··· 409 394 struct dw_mci_exynos_priv_data *priv = host->priv; 410 395 411 396 if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 412 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 397 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 398 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 413 399 return SDMMC_CLKSEL_CCLK_SAMPLE(mci_readl(host, CLKSEL64)); 414 400 else 415 401 return SDMMC_CLKSEL_CCLK_SAMPLE(mci_readl(host, CLKSEL)); ··· 422 406 struct dw_mci_exynos_priv_data *priv = host->priv; 423 407 424 408 if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 425 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 409 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 410 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 426 411 clksel = mci_readl(host, CLKSEL64); 427 412 else 428 413 clksel = mci_readl(host, CLKSEL); 429 414 clksel = SDMMC_CLKSEL_UP_SAMPLE(clksel, sample); 430 415 if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 431 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 416 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 417 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 432 418 mci_writel(host, CLKSEL64, clksel); 433 419 else 434 420 mci_writel(host, CLKSEL, clksel); ··· 443 425 u8 sample; 444 426 445 427 if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 446 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 428 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 429 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 447 430 clksel = mci_readl(host, CLKSEL64); 448 431 else 449 432 clksel = mci_readl(host, CLKSEL); ··· 453 434 clksel = SDMMC_CLKSEL_UP_SAMPLE(clksel, sample); 454 435 455 436 if (priv->ctrl_type == DW_MCI_TYPE_EXYNOS7 || 456 - priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU) 437 + priv->ctrl_type == DW_MCI_TYPE_EXYNOS7_SMU || 438 + priv->ctrl_type == DW_MCI_TYPE_ARTPEC8) 457 439 mci_writel(host, CLKSEL64, clksel); 458 440 else 459 441 mci_writel(host, CLKSEL, clksel); ··· 544 524 return 0; 545 525 } 546 526 527 + static void dw_mci_exynos_set_data_timeout(struct dw_mci *host, 528 + unsigned int timeout_ns) 529 + { 530 + u32 clk_div, tmout; 531 + u64 tmp; 532 + unsigned int tmp2; 533 + 534 + clk_div = (mci_readl(host, CLKDIV) & 0xFF) * 2; 535 + if (clk_div == 0) 536 + clk_div = 1; 537 + 538 + tmp = DIV_ROUND_UP_ULL((u64)timeout_ns * host->bus_hz, NSEC_PER_SEC); 539 + tmp = DIV_ROUND_UP_ULL(tmp, clk_div); 540 + 541 + /* TMOUT[7:0] (RESPONSE_TIMEOUT) */ 542 + tmout = 0xFF; /* Set maximum */ 543 + 544 + /* 545 + * Extended HW timer (max = 0x6FFFFF2): 546 + * ((TMOUT[10:8] - 1) * 0xFFFFFF + TMOUT[31:11] * 8) 547 + */ 548 + if (!tmp || tmp > 0x6FFFFF2) 549 + tmout |= (0xFFFFFF << 8); 550 + else { 551 + /* TMOUT[10:8] */ 552 + tmp2 = (((unsigned int)tmp / 0xFFFFFF) + 1) & 0x7; 553 + tmout |= tmp2 << 8; 554 + 555 + /* TMOUT[31:11] */ 556 + tmp = tmp - ((tmp2 - 1) * 0xFFFFFF); 557 + tmout |= (tmp & 0xFFFFF8) << 8; 558 + } 559 + 560 + mci_writel(host, TMOUT, tmout); 561 + dev_dbg(host->dev, "timeout_ns: %u => TMOUT[31:8]: %#08x", 562 + timeout_ns, tmout >> 8); 563 + } 564 + 565 + static u32 dw_mci_exynos_get_drto_clks(struct dw_mci *host) 566 + { 567 + u32 drto_clks; 568 + 569 + drto_clks = mci_readl(host, TMOUT) >> 8; 570 + 571 + return (((drto_clks & 0x7) - 1) * 0xFFFFFF) + ((drto_clks & 0xFFFFF8)); 572 + } 573 + 547 574 /* Common capabilities of Exynos4/Exynos5 SoC */ 548 575 static unsigned long exynos_dwmmc_caps[4] = { 549 - MMC_CAP_1_8V_DDR | MMC_CAP_8_BIT_DATA | MMC_CAP_CMD23, 550 - MMC_CAP_CMD23, 551 - MMC_CAP_CMD23, 552 - MMC_CAP_CMD23, 576 + MMC_CAP_1_8V_DDR | MMC_CAP_8_BIT_DATA, 577 + 0, 578 + 0, 579 + 0, 553 580 }; 554 581 555 582 static const struct dw_mci_drv_data exynos_drv_data = { 556 583 .caps = exynos_dwmmc_caps, 557 584 .num_caps = ARRAY_SIZE(exynos_dwmmc_caps), 585 + .common_caps = MMC_CAP_CMD23, 558 586 .init = dw_mci_exynos_priv_init, 559 587 .set_ios = dw_mci_exynos_set_ios, 560 588 .parse_dt = dw_mci_exynos_parse_dt, 561 589 .execute_tuning = dw_mci_exynos_execute_tuning, 562 590 .prepare_hs400_tuning = dw_mci_exynos_prepare_hs400_tuning, 591 + }; 592 + 593 + static const struct dw_mci_drv_data artpec_drv_data = { 594 + .common_caps = MMC_CAP_CMD23, 595 + .init = dw_mci_exynos_priv_init, 596 + .set_ios = dw_mci_exynos_set_ios, 597 + .parse_dt = dw_mci_exynos_parse_dt, 598 + .execute_tuning = dw_mci_exynos_execute_tuning, 599 + .set_data_timeout = dw_mci_exynos_set_data_timeout, 600 + .get_drto_clks = dw_mci_exynos_get_drto_clks, 563 601 }; 564 602 565 603 static const struct of_device_id dw_mci_exynos_match[] = { ··· 633 555 .data = &exynos_drv_data, }, 634 556 { .compatible = "samsung,exynos7-dw-mshc-smu", 635 557 .data = &exynos_drv_data, }, 558 + { .compatible = "axis,artpec8-dw-mshc", 559 + .data = &artpec_drv_data, }, 636 560 {}, 637 561 }; 638 562 MODULE_DEVICE_TABLE(of, dw_mci_exynos_match);
+1 -8
drivers/mmc/host/dw_mmc-hi3798cv200.c
··· 23 23 struct clk *drive_clk; 24 24 }; 25 25 26 - static unsigned long dw_mci_hi3798cv200_caps[] = { 27 - MMC_CAP_CMD23, 28 - MMC_CAP_CMD23, 29 - MMC_CAP_CMD23 30 - }; 31 - 32 26 static void dw_mci_hi3798cv200_set_ios(struct dw_mci *host, struct mmc_ios *ios) 33 27 { 34 28 struct hi3798cv200_priv *priv = host->priv; ··· 160 166 } 161 167 162 168 static const struct dw_mci_drv_data hi3798cv200_data = { 163 - .caps = dw_mci_hi3798cv200_caps, 164 - .num_caps = ARRAY_SIZE(dw_mci_hi3798cv200_caps), 169 + .common_caps = MMC_CAP_CMD23, 165 170 .init = dw_mci_hi3798cv200_init, 166 171 .set_ios = dw_mci_hi3798cv200_set_ios, 167 172 .execute_tuning = dw_mci_hi3798cv200_execute_tuning,
+1 -10
drivers/mmc/host/dw_mmc-rockchip.c
··· 300 300 return 0; 301 301 } 302 302 303 - /* Common capabilities of RK3288 SoC */ 304 - static unsigned long dw_mci_rk3288_dwmmc_caps[4] = { 305 - MMC_CAP_CMD23, 306 - MMC_CAP_CMD23, 307 - MMC_CAP_CMD23, 308 - MMC_CAP_CMD23, 309 - }; 310 - 311 303 static const struct dw_mci_drv_data rk2928_drv_data = { 312 304 .init = dw_mci_rockchip_init, 313 305 }; 314 306 315 307 static const struct dw_mci_drv_data rk3288_drv_data = { 316 - .caps = dw_mci_rk3288_dwmmc_caps, 317 - .num_caps = ARRAY_SIZE(dw_mci_rk3288_dwmmc_caps), 308 + .common_caps = MMC_CAP_CMD23, 318 309 .set_ios = dw_mci_rk3288_set_ios, 319 310 .execute_tuning = dw_mci_rk3288_execute_tuning, 320 311 .parse_dt = dw_mci_rk3288_parse_dt,
+53 -3
drivers/mmc/host/dw_mmc.c
··· 335 335 cmdr == MMC_WRITE_BLOCK || 336 336 cmdr == MMC_WRITE_MULTIPLE_BLOCK || 337 337 cmdr == MMC_SEND_TUNING_BLOCK || 338 - cmdr == MMC_SEND_TUNING_BLOCK_HS200) { 338 + cmdr == MMC_SEND_TUNING_BLOCK_HS200 || 339 + cmdr == MMC_GEN_CMD) { 339 340 stop->opcode = MMC_STOP_TRANSMISSION; 340 341 stop->arg = 0; 341 342 stop->flags = MMC_RSP_R1B | MMC_CMD_AC; ··· 1284 1283 mci_writel(host, CTYPE, (slot->ctype << slot->id)); 1285 1284 } 1286 1285 1286 + static void dw_mci_set_data_timeout(struct dw_mci *host, 1287 + unsigned int timeout_ns) 1288 + { 1289 + const struct dw_mci_drv_data *drv_data = host->drv_data; 1290 + u32 clk_div, tmout; 1291 + u64 tmp; 1292 + 1293 + if (drv_data && drv_data->set_data_timeout) 1294 + return drv_data->set_data_timeout(host, timeout_ns); 1295 + 1296 + clk_div = (mci_readl(host, CLKDIV) & 0xFF) * 2; 1297 + if (clk_div == 0) 1298 + clk_div = 1; 1299 + 1300 + tmp = DIV_ROUND_UP_ULL((u64)timeout_ns * host->bus_hz, NSEC_PER_SEC); 1301 + tmp = DIV_ROUND_UP_ULL(tmp, clk_div); 1302 + 1303 + /* TMOUT[7:0] (RESPONSE_TIMEOUT) */ 1304 + tmout = 0xFF; /* Set maximum */ 1305 + 1306 + /* TMOUT[31:8] (DATA_TIMEOUT) */ 1307 + if (!tmp || tmp > 0xFFFFFF) 1308 + tmout |= (0xFFFFFF << 8); 1309 + else 1310 + tmout |= (tmp & 0xFFFFFF) << 8; 1311 + 1312 + mci_writel(host, TMOUT, tmout); 1313 + dev_dbg(host->dev, "timeout_ns: %u => TMOUT[31:8]: %#08x", 1314 + timeout_ns, tmout >> 8); 1315 + } 1316 + 1287 1317 static void __dw_mci_start_request(struct dw_mci *host, 1288 1318 struct dw_mci_slot *slot, 1289 1319 struct mmc_command *cmd) ··· 1335 1303 1336 1304 data = cmd->data; 1337 1305 if (data) { 1338 - mci_writel(host, TMOUT, 0xFFFFFFFF); 1306 + dw_mci_set_data_timeout(host, data->timeout_ns); 1339 1307 mci_writel(host, BYTCNT, data->blksz*data->blocks); 1340 1308 mci_writel(host, BLKSIZ, data->blksz); 1341 1309 } ··· 1999 1967 2000 1968 static void dw_mci_set_drto(struct dw_mci *host) 2001 1969 { 1970 + const struct dw_mci_drv_data *drv_data = host->drv_data; 2002 1971 unsigned int drto_clks; 2003 1972 unsigned int drto_div; 2004 1973 unsigned int drto_ms; 2005 1974 unsigned long irqflags; 2006 1975 2007 - drto_clks = mci_readl(host, TMOUT) >> 8; 1976 + if (drv_data && drv_data->get_drto_clks) 1977 + drto_clks = drv_data->get_drto_clks(host); 1978 + else 1979 + drto_clks = mci_readl(host, TMOUT) >> 8; 2008 1980 drto_div = (mci_readl(host, CLKDIV) & 0xff) * 2; 2009 1981 if (drto_div == 0) 2010 1982 drto_div = 1; 2011 1983 2012 1984 drto_ms = DIV_ROUND_UP_ULL((u64)MSEC_PER_SEC * drto_clks * drto_div, 2013 1985 host->bus_hz); 1986 + 1987 + dev_dbg(host->dev, "drto_ms: %u\n", drto_ms); 2014 1988 2015 1989 /* add a bit spare time */ 2016 1990 drto_ms += 10; ··· 2762 2724 if (pending & DW_MCI_DATA_ERROR_FLAGS) { 2763 2725 spin_lock(&host->irq_lock); 2764 2726 2727 + if (host->quirks & DW_MMC_QUIRK_EXTENDED_TMOUT) 2728 + del_timer(&host->dto_timer); 2729 + 2765 2730 /* if there is an error report DATA_ERROR */ 2766 2731 mci_writel(host, RINTSTS, DW_MCI_DATA_ERROR_FLAGS); 2767 2732 host->data_status = pending; 2768 2733 smp_wmb(); /* drain writebuffer */ 2769 2734 set_bit(EVENT_DATA_ERROR, &host->pending_events); 2735 + 2736 + if (host->quirks & DW_MMC_QUIRK_EXTENDED_TMOUT) 2737 + /* In case of error, we cannot expect a DTO */ 2738 + set_bit(EVENT_DATA_COMPLETE, 2739 + &host->pending_events); 2740 + 2770 2741 tasklet_schedule(&host->tasklet); 2771 2742 2772 2743 spin_unlock(&host->irq_lock); ··· 2874 2827 2875 2828 if (host->pdata->pm_caps) 2876 2829 mmc->pm_caps = host->pdata->pm_caps; 2830 + 2831 + if (drv_data) 2832 + mmc->caps |= drv_data->common_caps; 2877 2833 2878 2834 if (host->dev->of_node) { 2879 2835 ctrl_id = of_alias_get_id(host->dev->of_node, "mshc");
+13
drivers/mmc/host/dw_mmc.h
··· 118 118 * @part_buf: Simple buffer for partial fifo reads/writes. 119 119 * @push_data: Pointer to FIFO push function. 120 120 * @pull_data: Pointer to FIFO pull function. 121 + * @quirks: Set of quirks that apply to specific versions of the IP. 121 122 * @vqmmc_enabled: Status of vqmmc, should be true or false. 122 123 * @irq_flags: The flags to be passed to request_irq. 123 124 * @irq: The irq value to be passed to request_irq. ··· 224 223 void (*push_data)(struct dw_mci *host, void *buf, int cnt); 225 224 void (*pull_data)(struct dw_mci *host, void *buf, int cnt); 226 225 226 + u32 quirks; 227 227 bool vqmmc_enabled; 228 228 unsigned long irq_flags; /* IRQ flags */ 229 229 int irq; ··· 275 273 struct dw_mci_dma_ops *dma_ops; 276 274 struct dma_pdata *data; 277 275 }; 276 + 277 + /* Support for longer data read timeout */ 278 + #define DW_MMC_QUIRK_EXTENDED_TMOUT BIT(0) 278 279 279 280 #define DW_MMC_240A 0x240a 280 281 #define DW_MMC_280A 0x280a ··· 555 550 * dw_mci driver data - dw-mshc implementation specific driver data. 556 551 * @caps: mmc subsystem specified capabilities of the controller(s). 557 552 * @num_caps: number of capabilities specified by @caps. 553 + * @common_caps: mmc subsystem specified capabilities applicable to all of 554 + * the controllers 558 555 * @init: early implementation specific initialization. 559 556 * @set_ios: handle bus specific extensions. 560 557 * @parse_dt: parse implementation specific device tree properties. 561 558 * @execute_tuning: implementation specific tuning procedure. 559 + * @set_data_timeout: implementation specific timeout. 560 + * @get_drto_clks: implementation specific cycle count for data read timeout. 562 561 * 563 562 * Provide controller implementation specific extensions. The usage of this 564 563 * data structure is fully optional and usage of each member in this structure ··· 571 562 struct dw_mci_drv_data { 572 563 unsigned long *caps; 573 564 u32 num_caps; 565 + u32 common_caps; 574 566 int (*init)(struct dw_mci *host); 575 567 void (*set_ios)(struct dw_mci *host, struct mmc_ios *ios); 576 568 int (*parse_dt)(struct dw_mci *host); ··· 580 570 struct mmc_ios *ios); 581 571 int (*switch_voltage)(struct mmc_host *mmc, 582 572 struct mmc_ios *ios); 573 + void (*set_data_timeout)(struct dw_mci *host, 574 + unsigned int timeout_ns); 575 + u32 (*get_drto_clks)(struct dw_mci *host); 583 576 }; 584 577 #endif /* _DW_MMC_H_ */
+17 -2
drivers/mmc/host/jz4740_mmc.c
··· 217 217 return; 218 218 219 219 dma_release_channel(host->dma_tx); 220 - dma_release_channel(host->dma_rx); 220 + if (host->dma_rx) 221 + dma_release_channel(host->dma_rx); 221 222 } 222 223 223 224 static int jz4740_mmc_acquire_dma_channels(struct jz4740_mmc_host *host) 224 225 { 226 + struct device *dev = mmc_dev(host->mmc); 227 + 228 + host->dma_tx = dma_request_chan(dev, "tx-rx"); 229 + if (!IS_ERR(host->dma_tx)) 230 + return 0; 231 + 232 + if (PTR_ERR(host->dma_tx) != -ENODEV) { 233 + dev_err(dev, "Failed to get dma tx-rx channel\n"); 234 + return PTR_ERR(host->dma_tx); 235 + } 236 + 225 237 host->dma_tx = dma_request_chan(mmc_dev(host->mmc), "tx"); 226 238 if (IS_ERR(host->dma_tx)) { 227 239 dev_err(mmc_dev(host->mmc), "Failed to get dma_tx channel\n"); ··· 253 241 static inline struct dma_chan *jz4740_mmc_get_dma_chan(struct jz4740_mmc_host *host, 254 242 struct mmc_data *data) 255 243 { 256 - return (data->flags & MMC_DATA_READ) ? host->dma_rx : host->dma_tx; 244 + if ((data->flags & MMC_DATA_READ) && host->dma_rx) 245 + return host->dma_rx; 246 + else 247 + return host->dma_tx; 257 248 } 258 249 259 250 static void jz4740_mmc_dma_unmap(struct jz4740_mmc_host *host,
-2
drivers/mmc/host/meson-mx-sdhc-clkc.c
··· 12 12 13 13 #include "meson-mx-sdhc.h" 14 14 15 - #define MESON_SDHC_NUM_BUILTIN_CLKS 6 16 - 17 15 struct meson_mx_sdhc_clkc { 18 16 struct clk_mux src_sel; 19 17 struct clk_divider div;
+5
drivers/mmc/host/meson-mx-sdhc-mmc.c
··· 854 854 goto err_disable_pclk; 855 855 856 856 irq = platform_get_irq(pdev, 0); 857 + if (irq < 0) { 858 + ret = irq; 859 + goto err_disable_pclk; 860 + } 861 + 857 862 ret = devm_request_threaded_irq(dev, irq, meson_mx_sdhc_irq, 858 863 meson_mx_sdhc_irq_thread, IRQF_ONESHOT, 859 864 NULL, host);
+5
drivers/mmc/host/meson-mx-sdio.c
··· 662 662 } 663 663 664 664 irq = platform_get_irq(pdev, 0); 665 + if (irq < 0) { 666 + ret = irq; 667 + goto error_free_mmc; 668 + } 669 + 665 670 ret = devm_request_threaded_irq(host->controller_dev, irq, 666 671 meson_mx_mmc_irq, 667 672 meson_mx_mmc_irq_thread, IRQF_ONESHOT,
+6 -10
drivers/mmc/host/mmc_spi.c
··· 547 547 static void 548 548 mmc_spi_setup_data_message( 549 549 struct mmc_spi_host *host, 550 - int multiple, 550 + bool multiple, 551 551 enum dma_data_direction direction) 552 552 { 553 553 struct spi_transfer *t; ··· 859 859 struct spi_device *spi = host->spi; 860 860 struct device *dma_dev = host->dma_dev; 861 861 struct spi_transfer *t; 862 - enum dma_data_direction direction; 862 + enum dma_data_direction direction = mmc_get_dma_dir(data); 863 863 struct scatterlist *sg; 864 864 unsigned n_sg; 865 - int multiple = (data->blocks > 1); 865 + bool multiple = (data->blocks > 1); 866 + const char *write_or_read = (direction == DMA_TO_DEVICE) ? "write" : "read"; 866 867 u32 clock_rate; 867 868 unsigned long timeout; 868 869 869 - direction = mmc_get_dma_dir(data); 870 870 mmc_spi_setup_data_message(host, multiple, direction); 871 871 t = &host->t; 872 872 ··· 921 921 while (length) { 922 922 t->len = min(length, blk_size); 923 923 924 - dev_dbg(&host->spi->dev, " %s block, %d bytes\n", 925 - (direction == DMA_TO_DEVICE) ? "write" : "read", 926 - t->len); 924 + dev_dbg(&spi->dev, " %s block, %d bytes\n", write_or_read, t->len); 927 925 928 926 if (direction == DMA_TO_DEVICE) 929 927 status = mmc_spi_writeblock(host, t, timeout); ··· 946 948 947 949 if (status < 0) { 948 950 data->error = status; 949 - dev_dbg(&spi->dev, "%s status %d\n", 950 - (direction == DMA_TO_DEVICE) ? "write" : "read", 951 - status); 951 + dev_dbg(&spi->dev, "%s status %d\n", write_or_read, status); 952 952 break; 953 953 } 954 954 }
+6 -1
drivers/mmc/host/mmci.c
··· 280 280 static struct variant_data variant_stm32_sdmmcv2 = { 281 281 .fifosize = 16 * 4, 282 282 .fifohalfsize = 8 * 4, 283 - .f_max = 208000000, 283 + .f_max = 267000000, 284 284 .stm32_clkdiv = true, 285 285 .cmdreg_cpsm_enable = MCI_CPSM_STM32_ENABLE, 286 286 .cmdreg_lrsp_crc = MCI_CPSM_STM32_LRSP_CRC, ··· 2432 2432 }, 2433 2433 { 2434 2434 .id = 0x00253180, 2435 + .mask = 0xf0ffffff, 2436 + .data = &variant_stm32_sdmmcv2, 2437 + }, 2438 + { 2439 + .id = 0x20253180, 2435 2440 .mask = 0xf0ffffff, 2436 2441 .data = &variant_stm32_sdmmcv2, 2437 2442 },
+3 -2
drivers/mmc/host/mmci_stm32_sdmmc.c
··· 241 241 242 242 /* 243 243 * SDMMC_FBCK is selected when an external Delay Block is needed 244 - * with SDR104. 244 + * with SDR104 or HS200. 245 245 */ 246 246 if (host->mmc->ios.timing >= MMC_TIMING_UHS_SDR50) { 247 247 clk |= MCI_STM32_CLK_BUSSPEED; 248 - if (host->mmc->ios.timing == MMC_TIMING_UHS_SDR104) { 248 + if (host->mmc->ios.timing == MMC_TIMING_UHS_SDR104 || 249 + host->mmc->ios.timing == MMC_TIMING_MMC_HS200) { 249 250 clk &= ~MCI_STM32_CLK_SEL_MSK; 250 251 clk |= MCI_STM32_CLK_SELFBCK; 251 252 }
+282 -258
drivers/mmc/host/mtk-sd.c
··· 5 5 */ 6 6 7 7 #include <linux/module.h> 8 + #include <linux/bitops.h> 8 9 #include <linux/clk.h> 9 10 #include <linux/delay.h> 10 11 #include <linux/dma-mapping.h> ··· 99 98 /*--------------------------------------------------------------------------*/ 100 99 101 100 /* MSDC_CFG mask */ 102 - #define MSDC_CFG_MODE (0x1 << 0) /* RW */ 103 - #define MSDC_CFG_CKPDN (0x1 << 1) /* RW */ 104 - #define MSDC_CFG_RST (0x1 << 2) /* RW */ 105 - #define MSDC_CFG_PIO (0x1 << 3) /* RW */ 106 - #define MSDC_CFG_CKDRVEN (0x1 << 4) /* RW */ 107 - #define MSDC_CFG_BV18SDT (0x1 << 5) /* RW */ 108 - #define MSDC_CFG_BV18PSS (0x1 << 6) /* R */ 109 - #define MSDC_CFG_CKSTB (0x1 << 7) /* R */ 110 - #define MSDC_CFG_CKDIV (0xff << 8) /* RW */ 111 - #define MSDC_CFG_CKMOD (0x3 << 16) /* RW */ 112 - #define MSDC_CFG_HS400_CK_MODE (0x1 << 18) /* RW */ 113 - #define MSDC_CFG_HS400_CK_MODE_EXTRA (0x1 << 22) /* RW */ 114 - #define MSDC_CFG_CKDIV_EXTRA (0xfff << 8) /* RW */ 115 - #define MSDC_CFG_CKMOD_EXTRA (0x3 << 20) /* RW */ 101 + #define MSDC_CFG_MODE BIT(0) /* RW */ 102 + #define MSDC_CFG_CKPDN BIT(1) /* RW */ 103 + #define MSDC_CFG_RST BIT(2) /* RW */ 104 + #define MSDC_CFG_PIO BIT(3) /* RW */ 105 + #define MSDC_CFG_CKDRVEN BIT(4) /* RW */ 106 + #define MSDC_CFG_BV18SDT BIT(5) /* RW */ 107 + #define MSDC_CFG_BV18PSS BIT(6) /* R */ 108 + #define MSDC_CFG_CKSTB BIT(7) /* R */ 109 + #define MSDC_CFG_CKDIV GENMASK(15, 8) /* RW */ 110 + #define MSDC_CFG_CKMOD GENMASK(17, 16) /* RW */ 111 + #define MSDC_CFG_HS400_CK_MODE BIT(18) /* RW */ 112 + #define MSDC_CFG_HS400_CK_MODE_EXTRA BIT(22) /* RW */ 113 + #define MSDC_CFG_CKDIV_EXTRA GENMASK(19, 8) /* RW */ 114 + #define MSDC_CFG_CKMOD_EXTRA GENMASK(21, 20) /* RW */ 116 115 117 116 /* MSDC_IOCON mask */ 118 - #define MSDC_IOCON_SDR104CKS (0x1 << 0) /* RW */ 119 - #define MSDC_IOCON_RSPL (0x1 << 1) /* RW */ 120 - #define MSDC_IOCON_DSPL (0x1 << 2) /* RW */ 121 - #define MSDC_IOCON_DDLSEL (0x1 << 3) /* RW */ 122 - #define MSDC_IOCON_DDR50CKD (0x1 << 4) /* RW */ 123 - #define MSDC_IOCON_DSPLSEL (0x1 << 5) /* RW */ 124 - #define MSDC_IOCON_W_DSPL (0x1 << 8) /* RW */ 125 - #define MSDC_IOCON_D0SPL (0x1 << 16) /* RW */ 126 - #define MSDC_IOCON_D1SPL (0x1 << 17) /* RW */ 127 - #define MSDC_IOCON_D2SPL (0x1 << 18) /* RW */ 128 - #define MSDC_IOCON_D3SPL (0x1 << 19) /* RW */ 129 - #define MSDC_IOCON_D4SPL (0x1 << 20) /* RW */ 130 - #define MSDC_IOCON_D5SPL (0x1 << 21) /* RW */ 131 - #define MSDC_IOCON_D6SPL (0x1 << 22) /* RW */ 132 - #define MSDC_IOCON_D7SPL (0x1 << 23) /* RW */ 133 - #define MSDC_IOCON_RISCSZ (0x3 << 24) /* RW */ 117 + #define MSDC_IOCON_SDR104CKS BIT(0) /* RW */ 118 + #define MSDC_IOCON_RSPL BIT(1) /* RW */ 119 + #define MSDC_IOCON_DSPL BIT(2) /* RW */ 120 + #define MSDC_IOCON_DDLSEL BIT(3) /* RW */ 121 + #define MSDC_IOCON_DDR50CKD BIT(4) /* RW */ 122 + #define MSDC_IOCON_DSPLSEL BIT(5) /* RW */ 123 + #define MSDC_IOCON_W_DSPL BIT(8) /* RW */ 124 + #define MSDC_IOCON_D0SPL BIT(16) /* RW */ 125 + #define MSDC_IOCON_D1SPL BIT(17) /* RW */ 126 + #define MSDC_IOCON_D2SPL BIT(18) /* RW */ 127 + #define MSDC_IOCON_D3SPL BIT(19) /* RW */ 128 + #define MSDC_IOCON_D4SPL BIT(20) /* RW */ 129 + #define MSDC_IOCON_D5SPL BIT(21) /* RW */ 130 + #define MSDC_IOCON_D6SPL BIT(22) /* RW */ 131 + #define MSDC_IOCON_D7SPL BIT(23) /* RW */ 132 + #define MSDC_IOCON_RISCSZ GENMASK(25, 24) /* RW */ 134 133 135 134 /* MSDC_PS mask */ 136 - #define MSDC_PS_CDEN (0x1 << 0) /* RW */ 137 - #define MSDC_PS_CDSTS (0x1 << 1) /* R */ 138 - #define MSDC_PS_CDDEBOUNCE (0xf << 12) /* RW */ 139 - #define MSDC_PS_DAT (0xff << 16) /* R */ 140 - #define MSDC_PS_DATA1 (0x1 << 17) /* R */ 141 - #define MSDC_PS_CMD (0x1 << 24) /* R */ 142 - #define MSDC_PS_WP (0x1 << 31) /* R */ 135 + #define MSDC_PS_CDEN BIT(0) /* RW */ 136 + #define MSDC_PS_CDSTS BIT(1) /* R */ 137 + #define MSDC_PS_CDDEBOUNCE GENMASK(15, 12) /* RW */ 138 + #define MSDC_PS_DAT GENMASK(23, 16) /* R */ 139 + #define MSDC_PS_DATA1 BIT(17) /* R */ 140 + #define MSDC_PS_CMD BIT(24) /* R */ 141 + #define MSDC_PS_WP BIT(31) /* R */ 143 142 144 143 /* MSDC_INT mask */ 145 - #define MSDC_INT_MMCIRQ (0x1 << 0) /* W1C */ 146 - #define MSDC_INT_CDSC (0x1 << 1) /* W1C */ 147 - #define MSDC_INT_ACMDRDY (0x1 << 3) /* W1C */ 148 - #define MSDC_INT_ACMDTMO (0x1 << 4) /* W1C */ 149 - #define MSDC_INT_ACMDCRCERR (0x1 << 5) /* W1C */ 150 - #define MSDC_INT_DMAQ_EMPTY (0x1 << 6) /* W1C */ 151 - #define MSDC_INT_SDIOIRQ (0x1 << 7) /* W1C */ 152 - #define MSDC_INT_CMDRDY (0x1 << 8) /* W1C */ 153 - #define MSDC_INT_CMDTMO (0x1 << 9) /* W1C */ 154 - #define MSDC_INT_RSPCRCERR (0x1 << 10) /* W1C */ 155 - #define MSDC_INT_CSTA (0x1 << 11) /* R */ 156 - #define MSDC_INT_XFER_COMPL (0x1 << 12) /* W1C */ 157 - #define MSDC_INT_DXFER_DONE (0x1 << 13) /* W1C */ 158 - #define MSDC_INT_DATTMO (0x1 << 14) /* W1C */ 159 - #define MSDC_INT_DATCRCERR (0x1 << 15) /* W1C */ 160 - #define MSDC_INT_ACMD19_DONE (0x1 << 16) /* W1C */ 161 - #define MSDC_INT_DMA_BDCSERR (0x1 << 17) /* W1C */ 162 - #define MSDC_INT_DMA_GPDCSERR (0x1 << 18) /* W1C */ 163 - #define MSDC_INT_DMA_PROTECT (0x1 << 19) /* W1C */ 164 - #define MSDC_INT_CMDQ (0x1 << 28) /* W1C */ 144 + #define MSDC_INT_MMCIRQ BIT(0) /* W1C */ 145 + #define MSDC_INT_CDSC BIT(1) /* W1C */ 146 + #define MSDC_INT_ACMDRDY BIT(3) /* W1C */ 147 + #define MSDC_INT_ACMDTMO BIT(4) /* W1C */ 148 + #define MSDC_INT_ACMDCRCERR BIT(5) /* W1C */ 149 + #define MSDC_INT_DMAQ_EMPTY BIT(6) /* W1C */ 150 + #define MSDC_INT_SDIOIRQ BIT(7) /* W1C */ 151 + #define MSDC_INT_CMDRDY BIT(8) /* W1C */ 152 + #define MSDC_INT_CMDTMO BIT(9) /* W1C */ 153 + #define MSDC_INT_RSPCRCERR BIT(10) /* W1C */ 154 + #define MSDC_INT_CSTA BIT(11) /* R */ 155 + #define MSDC_INT_XFER_COMPL BIT(12) /* W1C */ 156 + #define MSDC_INT_DXFER_DONE BIT(13) /* W1C */ 157 + #define MSDC_INT_DATTMO BIT(14) /* W1C */ 158 + #define MSDC_INT_DATCRCERR BIT(15) /* W1C */ 159 + #define MSDC_INT_ACMD19_DONE BIT(16) /* W1C */ 160 + #define MSDC_INT_DMA_BDCSERR BIT(17) /* W1C */ 161 + #define MSDC_INT_DMA_GPDCSERR BIT(18) /* W1C */ 162 + #define MSDC_INT_DMA_PROTECT BIT(19) /* W1C */ 163 + #define MSDC_INT_CMDQ BIT(28) /* W1C */ 165 164 166 165 /* MSDC_INTEN mask */ 167 - #define MSDC_INTEN_MMCIRQ (0x1 << 0) /* RW */ 168 - #define MSDC_INTEN_CDSC (0x1 << 1) /* RW */ 169 - #define MSDC_INTEN_ACMDRDY (0x1 << 3) /* RW */ 170 - #define MSDC_INTEN_ACMDTMO (0x1 << 4) /* RW */ 171 - #define MSDC_INTEN_ACMDCRCERR (0x1 << 5) /* RW */ 172 - #define MSDC_INTEN_DMAQ_EMPTY (0x1 << 6) /* RW */ 173 - #define MSDC_INTEN_SDIOIRQ (0x1 << 7) /* RW */ 174 - #define MSDC_INTEN_CMDRDY (0x1 << 8) /* RW */ 175 - #define MSDC_INTEN_CMDTMO (0x1 << 9) /* RW */ 176 - #define MSDC_INTEN_RSPCRCERR (0x1 << 10) /* RW */ 177 - #define MSDC_INTEN_CSTA (0x1 << 11) /* RW */ 178 - #define MSDC_INTEN_XFER_COMPL (0x1 << 12) /* RW */ 179 - #define MSDC_INTEN_DXFER_DONE (0x1 << 13) /* RW */ 180 - #define MSDC_INTEN_DATTMO (0x1 << 14) /* RW */ 181 - #define MSDC_INTEN_DATCRCERR (0x1 << 15) /* RW */ 182 - #define MSDC_INTEN_ACMD19_DONE (0x1 << 16) /* RW */ 183 - #define MSDC_INTEN_DMA_BDCSERR (0x1 << 17) /* RW */ 184 - #define MSDC_INTEN_DMA_GPDCSERR (0x1 << 18) /* RW */ 185 - #define MSDC_INTEN_DMA_PROTECT (0x1 << 19) /* RW */ 166 + #define MSDC_INTEN_MMCIRQ BIT(0) /* RW */ 167 + #define MSDC_INTEN_CDSC BIT(1) /* RW */ 168 + #define MSDC_INTEN_ACMDRDY BIT(3) /* RW */ 169 + #define MSDC_INTEN_ACMDTMO BIT(4) /* RW */ 170 + #define MSDC_INTEN_ACMDCRCERR BIT(5) /* RW */ 171 + #define MSDC_INTEN_DMAQ_EMPTY BIT(6) /* RW */ 172 + #define MSDC_INTEN_SDIOIRQ BIT(7) /* RW */ 173 + #define MSDC_INTEN_CMDRDY BIT(8) /* RW */ 174 + #define MSDC_INTEN_CMDTMO BIT(9) /* RW */ 175 + #define MSDC_INTEN_RSPCRCERR BIT(10) /* RW */ 176 + #define MSDC_INTEN_CSTA BIT(11) /* RW */ 177 + #define MSDC_INTEN_XFER_COMPL BIT(12) /* RW */ 178 + #define MSDC_INTEN_DXFER_DONE BIT(13) /* RW */ 179 + #define MSDC_INTEN_DATTMO BIT(14) /* RW */ 180 + #define MSDC_INTEN_DATCRCERR BIT(15) /* RW */ 181 + #define MSDC_INTEN_ACMD19_DONE BIT(16) /* RW */ 182 + #define MSDC_INTEN_DMA_BDCSERR BIT(17) /* RW */ 183 + #define MSDC_INTEN_DMA_GPDCSERR BIT(18) /* RW */ 184 + #define MSDC_INTEN_DMA_PROTECT BIT(19) /* RW */ 186 185 187 186 /* MSDC_FIFOCS mask */ 188 - #define MSDC_FIFOCS_RXCNT (0xff << 0) /* R */ 189 - #define MSDC_FIFOCS_TXCNT (0xff << 16) /* R */ 190 - #define MSDC_FIFOCS_CLR (0x1 << 31) /* RW */ 187 + #define MSDC_FIFOCS_RXCNT GENMASK(7, 0) /* R */ 188 + #define MSDC_FIFOCS_TXCNT GENMASK(23, 16) /* R */ 189 + #define MSDC_FIFOCS_CLR BIT(31) /* RW */ 191 190 192 191 /* SDC_CFG mask */ 193 - #define SDC_CFG_SDIOINTWKUP (0x1 << 0) /* RW */ 194 - #define SDC_CFG_INSWKUP (0x1 << 1) /* RW */ 195 - #define SDC_CFG_WRDTOC (0x1fff << 2) /* RW */ 196 - #define SDC_CFG_BUSWIDTH (0x3 << 16) /* RW */ 197 - #define SDC_CFG_SDIO (0x1 << 19) /* RW */ 198 - #define SDC_CFG_SDIOIDE (0x1 << 20) /* RW */ 199 - #define SDC_CFG_INTATGAP (0x1 << 21) /* RW */ 200 - #define SDC_CFG_DTOC (0xff << 24) /* RW */ 192 + #define SDC_CFG_SDIOINTWKUP BIT(0) /* RW */ 193 + #define SDC_CFG_INSWKUP BIT(1) /* RW */ 194 + #define SDC_CFG_WRDTOC GENMASK(14, 2) /* RW */ 195 + #define SDC_CFG_BUSWIDTH GENMASK(17, 16) /* RW */ 196 + #define SDC_CFG_SDIO BIT(19) /* RW */ 197 + #define SDC_CFG_SDIOIDE BIT(20) /* RW */ 198 + #define SDC_CFG_INTATGAP BIT(21) /* RW */ 199 + #define SDC_CFG_DTOC GENMASK(31, 24) /* RW */ 201 200 202 201 /* SDC_STS mask */ 203 - #define SDC_STS_SDCBUSY (0x1 << 0) /* RW */ 204 - #define SDC_STS_CMDBUSY (0x1 << 1) /* RW */ 205 - #define SDC_STS_SWR_COMPL (0x1 << 31) /* RW */ 202 + #define SDC_STS_SDCBUSY BIT(0) /* RW */ 203 + #define SDC_STS_CMDBUSY BIT(1) /* RW */ 204 + #define SDC_STS_SWR_COMPL BIT(31) /* RW */ 206 205 207 - #define SDC_DAT1_IRQ_TRIGGER (0x1 << 19) /* RW */ 206 + #define SDC_DAT1_IRQ_TRIGGER BIT(19) /* RW */ 208 207 /* SDC_ADV_CFG0 mask */ 209 - #define SDC_RX_ENHANCE_EN (0x1 << 20) /* RW */ 208 + #define SDC_RX_ENHANCE_EN BIT(20) /* RW */ 210 209 211 210 /* DMA_SA_H4BIT mask */ 212 - #define DMA_ADDR_HIGH_4BIT (0xf << 0) /* RW */ 211 + #define DMA_ADDR_HIGH_4BIT GENMASK(3, 0) /* RW */ 213 212 214 213 /* MSDC_DMA_CTRL mask */ 215 - #define MSDC_DMA_CTRL_START (0x1 << 0) /* W */ 216 - #define MSDC_DMA_CTRL_STOP (0x1 << 1) /* W */ 217 - #define MSDC_DMA_CTRL_RESUME (0x1 << 2) /* W */ 218 - #define MSDC_DMA_CTRL_MODE (0x1 << 8) /* RW */ 219 - #define MSDC_DMA_CTRL_LASTBUF (0x1 << 10) /* RW */ 220 - #define MSDC_DMA_CTRL_BRUSTSZ (0x7 << 12) /* RW */ 214 + #define MSDC_DMA_CTRL_START BIT(0) /* W */ 215 + #define MSDC_DMA_CTRL_STOP BIT(1) /* W */ 216 + #define MSDC_DMA_CTRL_RESUME BIT(2) /* W */ 217 + #define MSDC_DMA_CTRL_MODE BIT(8) /* RW */ 218 + #define MSDC_DMA_CTRL_LASTBUF BIT(10) /* RW */ 219 + #define MSDC_DMA_CTRL_BRUSTSZ GENMASK(14, 12) /* RW */ 221 220 222 221 /* MSDC_DMA_CFG mask */ 223 - #define MSDC_DMA_CFG_STS (0x1 << 0) /* R */ 224 - #define MSDC_DMA_CFG_DECSEN (0x1 << 1) /* RW */ 225 - #define MSDC_DMA_CFG_AHBHPROT2 (0x2 << 8) /* RW */ 226 - #define MSDC_DMA_CFG_ACTIVEEN (0x2 << 12) /* RW */ 227 - #define MSDC_DMA_CFG_CS12B16B (0x1 << 16) /* RW */ 222 + #define MSDC_DMA_CFG_STS BIT(0) /* R */ 223 + #define MSDC_DMA_CFG_DECSEN BIT(1) /* RW */ 224 + #define MSDC_DMA_CFG_AHBHPROT2 BIT(9) /* RW */ 225 + #define MSDC_DMA_CFG_ACTIVEEN BIT(13) /* RW */ 226 + #define MSDC_DMA_CFG_CS12B16B BIT(16) /* RW */ 228 227 229 228 /* MSDC_PATCH_BIT mask */ 230 - #define MSDC_PATCH_BIT_ODDSUPP (0x1 << 1) /* RW */ 231 - #define MSDC_INT_DAT_LATCH_CK_SEL (0x7 << 7) 232 - #define MSDC_CKGEN_MSDC_DLY_SEL (0x1f << 10) 233 - #define MSDC_PATCH_BIT_IODSSEL (0x1 << 16) /* RW */ 234 - #define MSDC_PATCH_BIT_IOINTSEL (0x1 << 17) /* RW */ 235 - #define MSDC_PATCH_BIT_BUSYDLY (0xf << 18) /* RW */ 236 - #define MSDC_PATCH_BIT_WDOD (0xf << 22) /* RW */ 237 - #define MSDC_PATCH_BIT_IDRTSEL (0x1 << 26) /* RW */ 238 - #define MSDC_PATCH_BIT_CMDFSEL (0x1 << 27) /* RW */ 239 - #define MSDC_PATCH_BIT_INTDLSEL (0x1 << 28) /* RW */ 240 - #define MSDC_PATCH_BIT_SPCPUSH (0x1 << 29) /* RW */ 241 - #define MSDC_PATCH_BIT_DECRCTMO (0x1 << 30) /* RW */ 229 + #define MSDC_PATCH_BIT_ODDSUPP BIT(1) /* RW */ 230 + #define MSDC_INT_DAT_LATCH_CK_SEL GENMASK(9, 7) 231 + #define MSDC_CKGEN_MSDC_DLY_SEL GENMASK(14, 10) 232 + #define MSDC_PATCH_BIT_IODSSEL BIT(16) /* RW */ 233 + #define MSDC_PATCH_BIT_IOINTSEL BIT(17) /* RW */ 234 + #define MSDC_PATCH_BIT_BUSYDLY GENMASK(21, 18) /* RW */ 235 + #define MSDC_PATCH_BIT_WDOD GENMASK(25, 22) /* RW */ 236 + #define MSDC_PATCH_BIT_IDRTSEL BIT(26) /* RW */ 237 + #define MSDC_PATCH_BIT_CMDFSEL BIT(27) /* RW */ 238 + #define MSDC_PATCH_BIT_INTDLSEL BIT(28) /* RW */ 239 + #define MSDC_PATCH_BIT_SPCPUSH BIT(29) /* RW */ 240 + #define MSDC_PATCH_BIT_DECRCTMO BIT(30) /* RW */ 242 241 243 - #define MSDC_PATCH_BIT1_CMDTA (0x7 << 3) /* RW */ 244 - #define MSDC_PB1_BUSY_CHECK_SEL (0x1 << 7) /* RW */ 245 - #define MSDC_PATCH_BIT1_STOP_DLY (0xf << 8) /* RW */ 242 + #define MSDC_PATCH_BIT1_CMDTA GENMASK(5, 3) /* RW */ 243 + #define MSDC_PB1_BUSY_CHECK_SEL BIT(7) /* RW */ 244 + #define MSDC_PATCH_BIT1_STOP_DLY GENMASK(11, 8) /* RW */ 246 245 247 - #define MSDC_PATCH_BIT2_CFGRESP (0x1 << 15) /* RW */ 248 - #define MSDC_PATCH_BIT2_CFGCRCSTS (0x1 << 28) /* RW */ 249 - #define MSDC_PB2_SUPPORT_64G (0x1 << 1) /* RW */ 250 - #define MSDC_PB2_RESPWAIT (0x3 << 2) /* RW */ 251 - #define MSDC_PB2_RESPSTSENSEL (0x7 << 16) /* RW */ 252 - #define MSDC_PB2_CRCSTSENSEL (0x7 << 29) /* RW */ 246 + #define MSDC_PATCH_BIT2_CFGRESP BIT(15) /* RW */ 247 + #define MSDC_PATCH_BIT2_CFGCRCSTS BIT(28) /* RW */ 248 + #define MSDC_PB2_SUPPORT_64G BIT(1) /* RW */ 249 + #define MSDC_PB2_RESPWAIT GENMASK(3, 2) /* RW */ 250 + #define MSDC_PB2_RESPSTSENSEL GENMASK(18, 16) /* RW */ 251 + #define MSDC_PB2_CRCSTSENSEL GENMASK(31, 29) /* RW */ 253 252 254 - #define MSDC_PAD_TUNE_DATWRDLY (0x1f << 0) /* RW */ 255 - #define MSDC_PAD_TUNE_DATRRDLY (0x1f << 8) /* RW */ 256 - #define MSDC_PAD_TUNE_CMDRDLY (0x1f << 16) /* RW */ 257 - #define MSDC_PAD_TUNE_CMDRRDLY (0x1f << 22) /* RW */ 258 - #define MSDC_PAD_TUNE_CLKTDLY (0x1f << 27) /* RW */ 259 - #define MSDC_PAD_TUNE_RXDLYSEL (0x1 << 15) /* RW */ 260 - #define MSDC_PAD_TUNE_RD_SEL (0x1 << 13) /* RW */ 261 - #define MSDC_PAD_TUNE_CMD_SEL (0x1 << 21) /* RW */ 253 + #define MSDC_PAD_TUNE_DATWRDLY GENMASK(4, 0) /* RW */ 254 + #define MSDC_PAD_TUNE_DATRRDLY GENMASK(12, 8) /* RW */ 255 + #define MSDC_PAD_TUNE_CMDRDLY GENMASK(20, 16) /* RW */ 256 + #define MSDC_PAD_TUNE_CMDRRDLY GENMASK(26, 22) /* RW */ 257 + #define MSDC_PAD_TUNE_CLKTDLY GENMASK(31, 27) /* RW */ 258 + #define MSDC_PAD_TUNE_RXDLYSEL BIT(15) /* RW */ 259 + #define MSDC_PAD_TUNE_RD_SEL BIT(13) /* RW */ 260 + #define MSDC_PAD_TUNE_CMD_SEL BIT(21) /* RW */ 262 261 263 - #define PAD_DS_TUNE_DLY_SEL (0x1 << 0) /* RW */ 264 - #define PAD_DS_TUNE_DLY1 (0x1f << 2) /* RW */ 265 - #define PAD_DS_TUNE_DLY2 (0x1f << 7) /* RW */ 266 - #define PAD_DS_TUNE_DLY3 (0x1f << 12) /* RW */ 262 + #define PAD_DS_TUNE_DLY_SEL BIT(0) /* RW */ 263 + #define PAD_DS_TUNE_DLY1 GENMASK(6, 2) /* RW */ 264 + #define PAD_DS_TUNE_DLY2 GENMASK(11, 7) /* RW */ 265 + #define PAD_DS_TUNE_DLY3 GENMASK(16, 12) /* RW */ 267 266 268 - #define PAD_CMD_TUNE_RX_DLY3 (0x1f << 1) /* RW */ 267 + #define PAD_CMD_TUNE_RX_DLY3 GENMASK(5, 1) /* RW */ 269 268 270 269 /* EMMC51_CFG0 mask */ 271 - #define CMDQ_RDAT_CNT (0x3ff << 12) /* RW */ 270 + #define CMDQ_RDAT_CNT GENMASK(21, 12) /* RW */ 272 271 273 - #define EMMC50_CFG_PADCMD_LATCHCK (0x1 << 0) /* RW */ 274 - #define EMMC50_CFG_CRCSTS_EDGE (0x1 << 3) /* RW */ 275 - #define EMMC50_CFG_CFCSTS_SEL (0x1 << 4) /* RW */ 276 - #define EMMC50_CFG_CMD_RESP_SEL (0x1 << 9) /* RW */ 272 + #define EMMC50_CFG_PADCMD_LATCHCK BIT(0) /* RW */ 273 + #define EMMC50_CFG_CRCSTS_EDGE BIT(3) /* RW */ 274 + #define EMMC50_CFG_CFCSTS_SEL BIT(4) /* RW */ 275 + #define EMMC50_CFG_CMD_RESP_SEL BIT(9) /* RW */ 277 276 278 277 /* EMMC50_CFG1 mask */ 279 - #define EMMC50_CFG1_DS_CFG (0x1 << 28) /* RW */ 278 + #define EMMC50_CFG1_DS_CFG BIT(28) /* RW */ 280 279 281 - #define EMMC50_CFG3_OUTS_WR (0x1f << 0) /* RW */ 280 + #define EMMC50_CFG3_OUTS_WR GENMASK(4, 0) /* RW */ 282 281 283 - #define SDC_FIFO_CFG_WRVALIDSEL (0x1 << 24) /* RW */ 284 - #define SDC_FIFO_CFG_RDVALIDSEL (0x1 << 25) /* RW */ 282 + #define SDC_FIFO_CFG_WRVALIDSEL BIT(24) /* RW */ 283 + #define SDC_FIFO_CFG_RDVALIDSEL BIT(25) /* RW */ 285 284 286 285 /* CQHCI_SETTING */ 287 - #define CQHCI_RD_CMD_WND_SEL (0x1 << 14) /* RW */ 288 - #define CQHCI_WR_CMD_WND_SEL (0x1 << 15) /* RW */ 286 + #define CQHCI_RD_CMD_WND_SEL BIT(14) /* RW */ 287 + #define CQHCI_WR_CMD_WND_SEL BIT(15) /* RW */ 289 288 290 289 /* EMMC_TOP_CONTROL mask */ 291 - #define PAD_RXDLY_SEL (0x1 << 0) /* RW */ 292 - #define DELAY_EN (0x1 << 1) /* RW */ 293 - #define PAD_DAT_RD_RXDLY2 (0x1f << 2) /* RW */ 294 - #define PAD_DAT_RD_RXDLY (0x1f << 7) /* RW */ 295 - #define PAD_DAT_RD_RXDLY2_SEL (0x1 << 12) /* RW */ 296 - #define PAD_DAT_RD_RXDLY_SEL (0x1 << 13) /* RW */ 297 - #define DATA_K_VALUE_SEL (0x1 << 14) /* RW */ 298 - #define SDC_RX_ENH_EN (0x1 << 15) /* TW */ 290 + #define PAD_RXDLY_SEL BIT(0) /* RW */ 291 + #define DELAY_EN BIT(1) /* RW */ 292 + #define PAD_DAT_RD_RXDLY2 GENMASK(6, 2) /* RW */ 293 + #define PAD_DAT_RD_RXDLY GENMASK(11, 7) /* RW */ 294 + #define PAD_DAT_RD_RXDLY2_SEL BIT(12) /* RW */ 295 + #define PAD_DAT_RD_RXDLY_SEL BIT(13) /* RW */ 296 + #define DATA_K_VALUE_SEL BIT(14) /* RW */ 297 + #define SDC_RX_ENH_EN BIT(15) /* TW */ 299 298 300 299 /* EMMC_TOP_CMD mask */ 301 - #define PAD_CMD_RXDLY2 (0x1f << 0) /* RW */ 302 - #define PAD_CMD_RXDLY (0x1f << 5) /* RW */ 303 - #define PAD_CMD_RD_RXDLY2_SEL (0x1 << 10) /* RW */ 304 - #define PAD_CMD_RD_RXDLY_SEL (0x1 << 11) /* RW */ 305 - #define PAD_CMD_TX_DLY (0x1f << 12) /* RW */ 300 + #define PAD_CMD_RXDLY2 GENMASK(4, 0) /* RW */ 301 + #define PAD_CMD_RXDLY GENMASK(9, 5) /* RW */ 302 + #define PAD_CMD_RD_RXDLY2_SEL BIT(10) /* RW */ 303 + #define PAD_CMD_RD_RXDLY_SEL BIT(11) /* RW */ 304 + #define PAD_CMD_TX_DLY GENMASK(16, 12) /* RW */ 306 305 307 306 /* EMMC50_PAD_DS_TUNE mask */ 308 - #define PAD_DS_DLY_SEL (0x1 << 16) /* RW */ 309 - #define PAD_DS_DLY1 (0x1f << 10) /* RW */ 310 - #define PAD_DS_DLY3 (0x1f << 0) /* RW */ 307 + #define PAD_DS_DLY_SEL BIT(16) /* RW */ 308 + #define PAD_DS_DLY1 GENMASK(14, 10) /* RW */ 309 + #define PAD_DS_DLY3 GENMASK(4, 0) /* RW */ 311 310 312 - #define REQ_CMD_EIO (0x1 << 0) 313 - #define REQ_CMD_TMO (0x1 << 1) 314 - #define REQ_DAT_ERR (0x1 << 2) 315 - #define REQ_STOP_EIO (0x1 << 3) 316 - #define REQ_STOP_TMO (0x1 << 4) 317 - #define REQ_CMD_BUSY (0x1 << 5) 311 + #define REQ_CMD_EIO BIT(0) 312 + #define REQ_CMD_TMO BIT(1) 313 + #define REQ_DAT_ERR BIT(2) 314 + #define REQ_STOP_EIO BIT(3) 315 + #define REQ_STOP_TMO BIT(4) 316 + #define REQ_CMD_BUSY BIT(5) 318 317 319 - #define MSDC_PREPARE_FLAG (0x1 << 0) 320 - #define MSDC_ASYNC_FLAG (0x1 << 1) 321 - #define MSDC_MMAP_FLAG (0x1 << 2) 318 + #define MSDC_PREPARE_FLAG BIT(0) 319 + #define MSDC_ASYNC_FLAG BIT(1) 320 + #define MSDC_MMAP_FLAG BIT(2) 322 321 323 322 #define MTK_MMC_AUTOSUSPEND_DELAY 50 324 323 #define CMD_TIMEOUT (HZ/10 * 5) /* 100ms x5 */ ··· 332 331 /*--------------------------------------------------------------------------*/ 333 332 struct mt_gpdma_desc { 334 333 u32 gpd_info; 335 - #define GPDMA_DESC_HWO (0x1 << 0) 336 - #define GPDMA_DESC_BDP (0x1 << 1) 337 - #define GPDMA_DESC_CHECKSUM (0xff << 8) /* bit8 ~ bit15 */ 338 - #define GPDMA_DESC_INT (0x1 << 16) 339 - #define GPDMA_DESC_NEXT_H4 (0xf << 24) 340 - #define GPDMA_DESC_PTR_H4 (0xf << 28) 334 + #define GPDMA_DESC_HWO BIT(0) 335 + #define GPDMA_DESC_BDP BIT(1) 336 + #define GPDMA_DESC_CHECKSUM GENMASK(15, 8) 337 + #define GPDMA_DESC_INT BIT(16) 338 + #define GPDMA_DESC_NEXT_H4 GENMASK(27, 24) 339 + #define GPDMA_DESC_PTR_H4 GENMASK(31, 28) 341 340 u32 next; 342 341 u32 ptr; 343 342 u32 gpd_data_len; 344 - #define GPDMA_DESC_BUFLEN (0xffff) /* bit0 ~ bit15 */ 345 - #define GPDMA_DESC_EXTLEN (0xff << 16) /* bit16 ~ bit23 */ 343 + #define GPDMA_DESC_BUFLEN GENMASK(15, 0) 344 + #define GPDMA_DESC_EXTLEN GENMASK(23, 16) 346 345 u32 arg; 347 346 u32 blknum; 348 347 u32 cmd; ··· 350 349 351 350 struct mt_bdma_desc { 352 351 u32 bd_info; 353 - #define BDMA_DESC_EOL (0x1 << 0) 354 - #define BDMA_DESC_CHECKSUM (0xff << 8) /* bit8 ~ bit15 */ 355 - #define BDMA_DESC_BLKPAD (0x1 << 17) 356 - #define BDMA_DESC_DWPAD (0x1 << 18) 357 - #define BDMA_DESC_NEXT_H4 (0xf << 24) 358 - #define BDMA_DESC_PTR_H4 (0xf << 28) 352 + #define BDMA_DESC_EOL BIT(0) 353 + #define BDMA_DESC_CHECKSUM GENMASK(15, 8) 354 + #define BDMA_DESC_BLKPAD BIT(17) 355 + #define BDMA_DESC_DWPAD BIT(18) 356 + #define BDMA_DESC_NEXT_H4 GENMASK(27, 24) 357 + #define BDMA_DESC_PTR_H4 GENMASK(31, 28) 359 358 u32 next; 360 359 u32 ptr; 361 360 u32 bd_data_len; 362 - #define BDMA_DESC_BUFLEN (0xffff) /* bit0 ~ bit15 */ 363 - #define BDMA_DESC_BUFLEN_EXT (0xffffff) /* bit0 ~ bit23 */ 361 + #define BDMA_DESC_BUFLEN GENMASK(15, 0) 362 + #define BDMA_DESC_BUFLEN_EXT GENMASK(23, 0) 364 363 }; 365 364 366 365 struct msdc_dma { ··· 637 636 u32 val; 638 637 639 638 sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_RST); 640 - while (readl(host->base + MSDC_CFG) & MSDC_CFG_RST) 641 - cpu_relax(); 639 + readl_poll_timeout(host->base + MSDC_CFG, val, !(val & MSDC_CFG_RST), 0, 0); 642 640 643 641 sdr_set_bits(host->base + MSDC_FIFOCS, MSDC_FIFOCS_CLR); 644 - while (readl(host->base + MSDC_FIFOCS) & MSDC_FIFOCS_CLR) 645 - cpu_relax(); 642 + readl_poll_timeout(host->base + MSDC_FIFOCS, val, 643 + !(val & MSDC_FIFOCS_CLR), 0, 0); 646 644 647 645 val = readl(host->base + MSDC_INT); 648 646 writel(val, host->base + MSDC_INT); ··· 725 725 sdr_set_field(host->base + MSDC_DMA_CFG, MSDC_DMA_CFG_DECSEN, 1); 726 726 dma_ctrl = readl_relaxed(host->base + MSDC_DMA_CTRL); 727 727 dma_ctrl &= ~(MSDC_DMA_CTRL_BRUSTSZ | MSDC_DMA_CTRL_MODE); 728 - dma_ctrl |= (MSDC_BURST_64B << 12 | 1 << 8); 728 + dma_ctrl |= (MSDC_BURST_64B << 12 | BIT(8)); 729 729 writel_relaxed(dma_ctrl, host->base + MSDC_DMA_CTRL); 730 730 if (host->dev_comp->support_64g) 731 731 sdr_set_field(host->base + DMA_SA_H4BIT, DMA_ADDR_HIGH_4BIT, ··· 769 769 do_div(timeout, clk_ns); 770 770 timeout += clks; 771 771 /* in 1048576 sclk cycle unit */ 772 - timeout = DIV_ROUND_UP(timeout, (0x1 << 20)); 772 + timeout = DIV_ROUND_UP(timeout, BIT(20)); 773 773 if (host->dev_comp->clk_div_bits == 8) 774 774 sdr_get_field(host->base + MSDC_CFG, 775 775 MSDC_CFG_CKMOD, &mode); ··· 814 814 clk_disable_unprepare(host->h_clk); 815 815 } 816 816 817 - static void msdc_ungate_clock(struct msdc_host *host) 817 + static int msdc_ungate_clock(struct msdc_host *host) 818 818 { 819 + u32 val; 819 820 int ret; 820 821 821 822 clk_prepare_enable(host->h_clk); ··· 826 825 ret = clk_bulk_prepare_enable(MSDC_NR_CLOCKS, host->bulk_clks); 827 826 if (ret) { 828 827 dev_err(host->dev, "Cannot enable pclk/axi/ahb clock gates\n"); 829 - return; 828 + return ret; 830 829 } 831 830 832 - while (!(readl(host->base + MSDC_CFG) & MSDC_CFG_CKSTB)) 833 - cpu_relax(); 831 + return readl_poll_timeout(host->base + MSDC_CFG, val, 832 + (val & MSDC_CFG_CKSTB), 1, 20000); 834 833 } 835 834 836 835 static void msdc_set_mclk(struct msdc_host *host, unsigned char timing, u32 hz) ··· 841 840 u32 div; 842 841 u32 sclk; 843 842 u32 tune_reg = host->dev_comp->pad_tune_reg; 843 + u32 val; 844 844 845 845 if (!hz) { 846 846 dev_dbg(host->dev, "set mclk to 0\n"); ··· 901 899 } 902 900 } 903 901 sdr_clr_bits(host->base + MSDC_CFG, MSDC_CFG_CKPDN); 904 - /* 905 - * As src_clk/HCLK use the same bit to gate/ungate, 906 - * So if want to only gate src_clk, need gate its parent(mux). 907 - */ 908 - if (host->src_clk_cg) 909 - clk_disable_unprepare(host->src_clk_cg); 910 - else 911 - clk_disable_unprepare(clk_get_parent(host->src_clk)); 902 + 903 + clk_disable_unprepare(host->src_clk_cg); 912 904 if (host->dev_comp->clk_div_bits == 8) 913 905 sdr_set_field(host->base + MSDC_CFG, 914 906 MSDC_CFG_CKMOD | MSDC_CFG_CKDIV, ··· 911 915 sdr_set_field(host->base + MSDC_CFG, 912 916 MSDC_CFG_CKMOD_EXTRA | MSDC_CFG_CKDIV_EXTRA, 913 917 (mode << 12) | div); 914 - if (host->src_clk_cg) 915 - clk_prepare_enable(host->src_clk_cg); 916 - else 917 - clk_prepare_enable(clk_get_parent(host->src_clk)); 918 918 919 - while (!(readl(host->base + MSDC_CFG) & MSDC_CFG_CKSTB)) 920 - cpu_relax(); 919 + clk_prepare_enable(host->src_clk_cg); 920 + readl_poll_timeout(host->base + MSDC_CFG, val, (val & MSDC_CFG_CKSTB), 0, 0); 921 921 sdr_set_bits(host->base + MSDC_CFG, MSDC_CFG_CKPDN); 922 922 mmc->actual_clock = sclk; 923 923 host->mclk = hz; ··· 1005 1013 1006 1014 if ((opcode == SD_IO_RW_DIRECT && cmd->flags == (unsigned int) -1) || 1007 1015 opcode == MMC_STOP_TRANSMISSION) 1008 - rawcmd |= (0x1 << 14); 1016 + rawcmd |= BIT(14); 1009 1017 else if (opcode == SD_SWITCH_VOLTAGE) 1010 - rawcmd |= (0x1 << 30); 1018 + rawcmd |= BIT(30); 1011 1019 else if (opcode == SD_APP_SEND_SCR || 1012 1020 opcode == SD_APP_SEND_NUM_WR_BLKS || 1013 1021 (opcode == SD_SWITCH && mmc_cmd_type(cmd) == MMC_CMD_ADTC) || 1014 1022 (opcode == SD_APP_SD_STATUS && mmc_cmd_type(cmd) == MMC_CMD_ADTC) || 1015 1023 (opcode == MMC_SEND_EXT_CSD && mmc_cmd_type(cmd) == MMC_CMD_ADTC)) 1016 - rawcmd |= (0x1 << 11); 1024 + rawcmd |= BIT(11); 1017 1025 1018 1026 if (cmd->data) { 1019 1027 struct mmc_data *data = cmd->data; ··· 1021 1029 if (mmc_op_multi(opcode)) { 1022 1030 if (mmc_card_mmc(mmc->card) && mrq->sbc && 1023 1031 !(mrq->sbc->arg & 0xFFFF0000)) 1024 - rawcmd |= 0x2 << 28; /* AutoCMD23 */ 1032 + rawcmd |= BIT(29); /* AutoCMD23 */ 1025 1033 } 1026 1034 1027 1035 rawcmd |= ((data->blksz & 0xFFF) << 16); 1028 1036 if (data->flags & MMC_DATA_WRITE) 1029 - rawcmd |= (0x1 << 13); 1037 + rawcmd |= BIT(13); 1030 1038 if (data->blocks > 1) 1031 - rawcmd |= (0x2 << 11); 1039 + rawcmd |= BIT(12); 1032 1040 else 1033 - rawcmd |= (0x1 << 11); 1041 + rawcmd |= BIT(11); 1034 1042 /* Always use dma mode */ 1035 1043 sdr_clr_bits(host->base + MSDC_CFG, MSDC_CFG_PIO); 1036 1044 ··· 1223 1231 static inline bool msdc_cmd_is_ready(struct msdc_host *host, 1224 1232 struct mmc_request *mrq, struct mmc_command *cmd) 1225 1233 { 1226 - /* The max busy time we can endure is 20ms */ 1227 - unsigned long tmo = jiffies + msecs_to_jiffies(20); 1234 + u32 val; 1235 + int ret; 1228 1236 1229 - while ((readl(host->base + SDC_STS) & SDC_STS_CMDBUSY) && 1230 - time_before(jiffies, tmo)) 1231 - cpu_relax(); 1232 - if (readl(host->base + SDC_STS) & SDC_STS_CMDBUSY) { 1237 + /* The max busy time we can endure is 20ms */ 1238 + ret = readl_poll_timeout_atomic(host->base + SDC_STS, val, 1239 + !(val & SDC_STS_CMDBUSY), 1, 20000); 1240 + if (ret) { 1233 1241 dev_err(host->dev, "CMD bus busy detected\n"); 1234 1242 host->error |= REQ_CMD_BUSY; 1235 1243 msdc_cmd_done(host, MSDC_INT_CMDTMO, mrq, cmd); ··· 1237 1245 } 1238 1246 1239 1247 if (mmc_resp_type(cmd) == MMC_RSP_R1B || cmd->data) { 1240 - tmo = jiffies + msecs_to_jiffies(20); 1241 1248 /* R1B or with data, should check SDCBUSY */ 1242 - while ((readl(host->base + SDC_STS) & SDC_STS_SDCBUSY) && 1243 - time_before(jiffies, tmo)) 1244 - cpu_relax(); 1245 - if (readl(host->base + SDC_STS) & SDC_STS_SDCBUSY) { 1249 + ret = readl_poll_timeout_atomic(host->base + SDC_STS, val, 1250 + !(val & SDC_STS_SDCBUSY), 1, 20000); 1251 + if (ret) { 1246 1252 dev_err(host->dev, "Controller busy detected\n"); 1247 1253 host->error |= REQ_CMD_BUSY; 1248 1254 msdc_cmd_done(host, MSDC_INT_CMDTMO, mrq, cmd); ··· 1366 1376 (MSDC_INT_XFER_COMPL | MSDC_INT_DATCRCERR | MSDC_INT_DATTMO 1367 1377 | MSDC_INT_DMA_BDCSERR | MSDC_INT_DMA_GPDCSERR 1368 1378 | MSDC_INT_DMA_PROTECT); 1379 + u32 val; 1380 + int ret; 1369 1381 1370 1382 spin_lock_irqsave(&host->lock, flags); 1371 1383 done = !host->data; ··· 1384 1392 readl(host->base + MSDC_DMA_CFG)); 1385 1393 sdr_set_field(host->base + MSDC_DMA_CTRL, MSDC_DMA_CTRL_STOP, 1386 1394 1); 1387 - while (readl(host->base + MSDC_DMA_CFG) & MSDC_DMA_CFG_STS) 1388 - cpu_relax(); 1395 + 1396 + ret = readl_poll_timeout_atomic(host->base + MSDC_DMA_CFG, val, 1397 + !(val & MSDC_DMA_CFG_STS), 1, 20000); 1398 + if (ret) { 1399 + dev_dbg(host->dev, "DMA stop timed out\n"); 1400 + return false; 1401 + } 1402 + 1389 1403 sdr_clr_bits(host->base + MSDC_INTEN, data_ints_mask); 1390 1404 dev_dbg(host->dev, "DMA stop\n"); 1391 1405 ··· 1629 1631 { 1630 1632 u32 val; 1631 1633 u32 tune_reg = host->dev_comp->pad_tune_reg; 1634 + struct mmc_host *mmc = mmc_from_priv(host); 1632 1635 1633 1636 if (host->reset) { 1634 1637 reset_control_assert(host->reset); ··· 1684 1685 } 1685 1686 1686 1687 if (host->dev_comp->busy_check) 1687 - sdr_clr_bits(host->base + MSDC_PATCH_BIT1, (1 << 7)); 1688 + sdr_clr_bits(host->base + MSDC_PATCH_BIT1, BIT(7)); 1688 1689 1689 1690 if (host->dev_comp->async_fifo) { 1690 1691 sdr_set_field(host->base + MSDC_PATCH_BIT2, ··· 1735 1736 MSDC_PAD_TUNE_RXDLYSEL); 1736 1737 } 1737 1738 1738 - /* Configure to enable SDIO mode. 1739 - * it's must otherwise sdio cmd5 failed 1740 - */ 1741 - sdr_set_bits(host->base + SDC_CFG, SDC_CFG_SDIO); 1739 + if (mmc->caps2 & MMC_CAP2_NO_SDIO) { 1740 + sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_SDIO); 1741 + sdr_clr_bits(host->base + MSDC_INTEN, MSDC_INTEN_SDIOIRQ); 1742 + sdr_clr_bits(host->base + SDC_ADV_CFG0, SDC_DAT1_IRQ_TRIGGER); 1743 + } else { 1744 + /* Configure to enable SDIO mode, otherwise SDIO CMD5 fails */ 1745 + sdr_set_bits(host->base + SDC_CFG, SDC_CFG_SDIO); 1742 1746 1743 - /* Config SDIO device detect interrupt function */ 1744 - sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_SDIOIDE); 1745 - sdr_set_bits(host->base + SDC_ADV_CFG0, SDC_DAT1_IRQ_TRIGGER); 1747 + /* Config SDIO device detect interrupt function */ 1748 + sdr_clr_bits(host->base + SDC_CFG, SDC_CFG_SDIOIDE); 1749 + sdr_set_bits(host->base + SDC_ADV_CFG0, SDC_DAT1_IRQ_TRIGGER); 1750 + } 1746 1751 1747 1752 /* Configure to default data timeout */ 1748 1753 sdr_set_field(host->base + SDC_CFG, SDC_CFG_DTOC, 3); ··· 1868 1865 static u32 test_delay_bit(u32 delay, u32 bit) 1869 1866 { 1870 1867 bit %= PAD_DELAY_MAX; 1871 - return delay & (1 << bit); 1868 + return delay & BIT(bit); 1872 1869 } 1873 1870 1874 1871 static int get_delay_len(u32 delay, u32 start_bit) ··· 1973 1970 for (j = 0; j < 3; j++) { 1974 1971 mmc_send_tuning(mmc, opcode, &cmd_err); 1975 1972 if (!cmd_err) { 1976 - rise_delay |= (1 << i); 1973 + rise_delay |= BIT(i); 1977 1974 } else { 1978 - rise_delay &= ~(1 << i); 1975 + rise_delay &= ~BIT(i); 1979 1976 break; 1980 1977 } 1981 1978 } ··· 1997 1994 for (j = 0; j < 3; j++) { 1998 1995 mmc_send_tuning(mmc, opcode, &cmd_err); 1999 1996 if (!cmd_err) { 2000 - fall_delay |= (1 << i); 1997 + fall_delay |= BIT(i); 2001 1998 } else { 2002 - fall_delay &= ~(1 << i); 1999 + fall_delay &= ~BIT(i); 2003 2000 break; 2004 2001 } 2005 2002 } ··· 2027 2024 MSDC_PAD_TUNE_CMDRRDLY, i); 2028 2025 mmc_send_tuning(mmc, opcode, &cmd_err); 2029 2026 if (!cmd_err) 2030 - internal_delay |= (1 << i); 2027 + internal_delay |= BIT(i); 2031 2028 } 2032 2029 dev_dbg(host->dev, "Final internal delay: 0x%x\n", internal_delay); 2033 2030 internal_delay_phase = get_best_delay(host, internal_delay); ··· 2072 2069 for (j = 0; j < 3; j++) { 2073 2070 mmc_send_tuning(mmc, opcode, &cmd_err); 2074 2071 if (!cmd_err) { 2075 - cmd_delay |= (1 << i); 2072 + cmd_delay |= BIT(i); 2076 2073 } else { 2077 - cmd_delay &= ~(1 << i); 2074 + cmd_delay &= ~BIT(i); 2078 2075 break; 2079 2076 } 2080 2077 } ··· 2104 2101 msdc_set_data_delay(host, i); 2105 2102 ret = mmc_send_tuning(mmc, opcode, NULL); 2106 2103 if (!ret) 2107 - rise_delay |= (1 << i); 2104 + rise_delay |= BIT(i); 2108 2105 } 2109 2106 final_rise_delay = get_best_delay(host, rise_delay); 2110 2107 /* if rising edge has enough margin, then do not scan falling edge */ ··· 2118 2115 msdc_set_data_delay(host, i); 2119 2116 ret = mmc_send_tuning(mmc, opcode, NULL); 2120 2117 if (!ret) 2121 - fall_delay |= (1 << i); 2118 + fall_delay |= BIT(i); 2122 2119 } 2123 2120 final_fall_delay = get_best_delay(host, fall_delay); 2124 2121 ··· 2162 2159 msdc_set_data_delay(host, i); 2163 2160 ret = mmc_send_tuning(mmc, opcode, NULL); 2164 2161 if (!ret) 2165 - rise_delay |= (1 << i); 2162 + rise_delay |= BIT(i); 2166 2163 } 2167 2164 final_rise_delay = get_best_delay(host, rise_delay); 2168 2165 /* if rising edge has enough margin, then do not scan falling edge */ ··· 2178 2175 msdc_set_data_delay(host, i); 2179 2176 ret = mmc_send_tuning(mmc, opcode, NULL); 2180 2177 if (!ret) 2181 - fall_delay |= (1 << i); 2178 + fall_delay |= BIT(i); 2182 2179 } 2183 2180 final_fall_delay = get_best_delay(host, fall_delay); 2184 2181 ··· 2295 2292 PAD_DS_TUNE_DLY1, i); 2296 2293 ret = mmc_get_ext_csd(card, &ext_csd); 2297 2294 if (!ret) { 2298 - result_dly1 |= (1 << i); 2295 + result_dly1 |= BIT(i); 2299 2296 kfree(ext_csd); 2300 2297 } 2301 2298 } ··· 2519 2516 /*source clock control gate is optional clock*/ 2520 2517 host->src_clk_cg = devm_clk_get_optional(&pdev->dev, "source_cg"); 2521 2518 if (IS_ERR(host->src_clk_cg)) 2522 - host->src_clk_cg = NULL; 2519 + return PTR_ERR(host->src_clk_cg); 2520 + 2521 + /* 2522 + * Fallback for legacy device-trees: src_clk and HCLK use the same 2523 + * bit to control gating but they are parented to a different mux, 2524 + * hence if our intention is to gate only the source, required 2525 + * during a clk mode switch to avoid hw hangs, we need to gate 2526 + * its parent (specified as a different clock only on new DTs). 2527 + */ 2528 + if (!host->src_clk_cg) { 2529 + host->src_clk_cg = clk_get_parent(host->src_clk); 2530 + if (IS_ERR(host->src_clk_cg)) 2531 + return PTR_ERR(host->src_clk_cg); 2532 + } 2523 2533 2524 2534 host->sys_clk_cg = devm_clk_get_optional(&pdev->dev, "sys_cg"); 2525 2535 if (IS_ERR(host->sys_clk_cg)) ··· 2690 2674 spin_lock_init(&host->lock); 2691 2675 2692 2676 platform_set_drvdata(pdev, mmc); 2693 - msdc_ungate_clock(host); 2677 + ret = msdc_ungate_clock(host); 2678 + if (ret) { 2679 + dev_err(&pdev->dev, "Cannot ungate clocks!\n"); 2680 + goto release_mem; 2681 + } 2694 2682 msdc_init_hw(host); 2695 2683 2696 2684 if (mmc->caps2 & MMC_CAP2_CQE) { ··· 2853 2833 { 2854 2834 struct mmc_host *mmc = dev_get_drvdata(dev); 2855 2835 struct msdc_host *host = mmc_priv(mmc); 2836 + int ret; 2856 2837 2857 - msdc_ungate_clock(host); 2838 + ret = msdc_ungate_clock(host); 2839 + if (ret) 2840 + return ret; 2841 + 2858 2842 msdc_restore_reg(host); 2859 2843 return 0; 2860 2844 }
-36
drivers/mmc/host/omap_hsmmc.c
··· 1499 1499 omap_hsmmc_set_bus_mode(host); 1500 1500 } 1501 1501 1502 - static void omap_hsmmc_init_card(struct mmc_host *mmc, struct mmc_card *card) 1503 - { 1504 - struct omap_hsmmc_host *host = mmc_priv(mmc); 1505 - 1506 - if (card->type == MMC_TYPE_SDIO || card->type == MMC_TYPE_SD_COMBO) { 1507 - struct device_node *np = mmc_dev(mmc)->of_node; 1508 - 1509 - /* 1510 - * REVISIT: should be moved to sdio core and made more 1511 - * general e.g. by expanding the DT bindings of child nodes 1512 - * to provide a mechanism to provide this information: 1513 - * Documentation/devicetree/bindings/mmc/mmc-card.yaml 1514 - */ 1515 - 1516 - np = of_get_compatible_child(np, "ti,wl1251"); 1517 - if (np) { 1518 - /* 1519 - * We have TI wl1251 attached to MMC3. Pass this 1520 - * information to the SDIO core because it can't be 1521 - * probed by normal methods. 1522 - */ 1523 - 1524 - dev_info(host->dev, "found wl1251\n"); 1525 - card->quirks |= MMC_QUIRK_NONSTD_SDIO; 1526 - card->cccr.wide_bus = 1; 1527 - card->cis.vendor = 0x104c; 1528 - card->cis.device = 0x9066; 1529 - card->cis.blksize = 512; 1530 - card->cis.max_dtr = 24000000; 1531 - card->ocr = 0x80; 1532 - of_node_put(np); 1533 - } 1534 - } 1535 - } 1536 - 1537 1502 static void omap_hsmmc_enable_sdio_irq(struct mmc_host *mmc, int enable) 1538 1503 { 1539 1504 struct omap_hsmmc_host *host = mmc_priv(mmc); ··· 1625 1660 .set_ios = omap_hsmmc_set_ios, 1626 1661 .get_cd = mmc_gpio_get_cd, 1627 1662 .get_ro = mmc_gpio_get_ro, 1628 - .init_card = omap_hsmmc_init_card, 1629 1663 .enable_sdio_irq = omap_hsmmc_enable_sdio_irq, 1630 1664 }; 1631 1665
+4
drivers/mmc/host/sdhci-esdhc-imx.c
··· 305 305 | ESDHC_FLAG_PMQOS | ESDHC_FLAG_HS400 306 306 | ESDHC_FLAG_STATE_LOST_IN_LPMODE, 307 307 }; 308 + static struct esdhc_soc_data usdhc_imxrt1050_data = { 309 + .flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_HS200 | ESDHC_FLAG_ERR004536, 310 + }; 308 311 309 312 static struct esdhc_soc_data usdhc_imx8qxp_data = { 310 313 .flags = ESDHC_FLAG_USDHC | ESDHC_FLAG_STD_TUNING ··· 358 355 { .compatible = "fsl,imx7ulp-usdhc", .data = &usdhc_imx7ulp_data, }, 359 356 { .compatible = "fsl,imx8qxp-usdhc", .data = &usdhc_imx8qxp_data, }, 360 357 { .compatible = "fsl,imx8mm-usdhc", .data = &usdhc_imx8mm_data, }, 358 + { .compatible = "fsl,imxrt1050-usdhc", .data = &usdhc_imxrt1050_data, }, 361 359 { .compatible = "nxp,s32g2-usdhc", .data = &usdhc_s32g2_data, }, 362 360 { /* sentinel */ } 363 361 };
+1
drivers/mmc/host/sdhci-pci-core.c
··· 1866 1866 SDHCI_PCI_DEVICE(INTEL, JSL_SD, intel_byt_sd), 1867 1867 SDHCI_PCI_DEVICE(INTEL, LKF_EMMC, intel_glk_emmc), 1868 1868 SDHCI_PCI_DEVICE(INTEL, LKF_SD, intel_byt_sd), 1869 + SDHCI_PCI_DEVICE(INTEL, ADL_EMMC, intel_glk_emmc), 1869 1870 SDHCI_PCI_DEVICE(O2, 8120, o2), 1870 1871 SDHCI_PCI_DEVICE(O2, 8220, o2), 1871 1872 SDHCI_PCI_DEVICE(O2, 8221, o2),
+34
drivers/mmc/host/sdhci-pci-gli.c
··· 12 12 #include <linux/pci.h> 13 13 #include <linux/mmc/mmc.h> 14 14 #include <linux/delay.h> 15 + #include <linux/of.h> 15 16 #include "sdhci.h" 16 17 #include "sdhci-pci.h" 17 18 #include "cqhci.h" ··· 117 116 #define PCI_GLI_9755_PECONF 0x44 118 117 #define PCI_GLI_9755_LFCLK GENMASK(14, 12) 119 118 #define PCI_GLI_9755_DMACLK BIT(29) 119 + #define PCI_GLI_9755_INVERT_CD BIT(30) 120 + #define PCI_GLI_9755_INVERT_WP BIT(31) 120 121 121 122 #define PCI_GLI_9755_CFG2 0x48 122 123 #define PCI_GLI_9755_CFG2_L1DLY GENMASK(28, 24) ··· 573 570 gl9755_wt_on(pdev); 574 571 575 572 pci_read_config_dword(pdev, PCI_GLI_9755_PECONF, &value); 573 + /* 574 + * Apple ARM64 platforms using these chips may have 575 + * inverted CD/WP detection. 576 + */ 577 + if (of_property_read_bool(pdev->dev.of_node, "cd-inverted")) 578 + value |= PCI_GLI_9755_INVERT_CD; 579 + if (of_property_read_bool(pdev->dev.of_node, "wp-inverted")) 580 + value |= PCI_GLI_9755_INVERT_WP; 576 581 value &= ~PCI_GLI_9755_LFCLK; 577 582 value &= ~PCI_GLI_9755_DMACLK; 578 583 pci_write_config_dword(pdev, PCI_GLI_9755_PECONF, value); ··· 902 891 return 0; 903 892 } 904 893 894 + #define REG_OFFSET_IN_BITS(reg) ((reg) << 3 & 0x18) 895 + 896 + static u16 sdhci_gli_readw(struct sdhci_host *host, int reg) 897 + { 898 + u32 val = readl(host->ioaddr + (reg & ~3)); 899 + u16 word; 900 + 901 + word = (val >> REG_OFFSET_IN_BITS(reg)) & 0xffff; 902 + return word; 903 + } 904 + 905 + static u8 sdhci_gli_readb(struct sdhci_host *host, int reg) 906 + { 907 + u32 val = readl(host->ioaddr + (reg & ~3)); 908 + u8 byte = (val >> REG_OFFSET_IN_BITS(reg)) & 0xff; 909 + 910 + return byte; 911 + } 912 + 905 913 static const struct sdhci_ops sdhci_gl9755_ops = { 914 + .read_w = sdhci_gli_readw, 915 + .read_b = sdhci_gli_readb, 906 916 .set_clock = sdhci_gl9755_set_clock, 907 917 .enable_dma = sdhci_pci_enable_dma, 908 918 .set_bus_width = sdhci_set_bus_width, ··· 943 911 }; 944 912 945 913 static const struct sdhci_ops sdhci_gl9750_ops = { 914 + .read_w = sdhci_gli_readw, 915 + .read_b = sdhci_gli_readb, 946 916 .read_l = sdhci_gl9750_readl, 947 917 .set_clock = sdhci_gl9750_set_clock, 948 918 .enable_dma = sdhci_pci_enable_dma,
+53 -9
drivers/mmc/host/sdhci-pci-o2micro.c
··· 12 12 #include <linux/mmc/mmc.h> 13 13 #include <linux/delay.h> 14 14 #include <linux/iopoll.h> 15 + #include <linux/bitfield.h> 15 16 16 17 #include "sdhci.h" 17 18 #include "sdhci-pci.h" ··· 44 43 #define O2_SD_CAP_REG0 0x334 45 44 #define O2_SD_UHS1_CAP_SETTING 0x33C 46 45 #define O2_SD_DELAY_CTRL 0x350 46 + #define O2_SD_OUTPUT_CLK_SOURCE_SWITCH 0x354 47 47 #define O2_SD_UHS2_L1_CTRL 0x35C 48 48 #define O2_SD_FUNC_REG3 0x3E0 49 49 #define O2_SD_FUNC_REG4 0x3E4 50 50 #define O2_SD_LED_ENABLE BIT(6) 51 51 #define O2_SD_FREG0_LEDOFF BIT(13) 52 + #define O2_SD_SEL_DLL BIT(16) 52 53 #define O2_SD_FREG4_ENABLE_CLK_SET BIT(22) 54 + #define O2_SD_PHASE_MASK GENMASK(23, 20) 55 + #define O2_SD_FIX_PHASE FIELD_PREP(O2_SD_PHASE_MASK, 0x9) 53 56 54 57 #define O2_SD_VENDOR_SETTING 0x110 55 58 #define O2_SD_VENDOR_SETTING2 0x1C8 ··· 306 301 static int sdhci_o2_execute_tuning(struct mmc_host *mmc, u32 opcode) 307 302 { 308 303 struct sdhci_host *host = mmc_priv(mmc); 304 + struct sdhci_pci_slot *slot = sdhci_priv(host); 305 + struct sdhci_pci_chip *chip = slot->chip; 309 306 int current_bus_width = 0; 310 307 u32 scratch32 = 0; 311 308 u16 scratch = 0; 309 + u8 scratch_8 = 0; 310 + u32 reg_val; 312 311 313 312 /* 314 313 * This handler only implements the eMMC tuning that is specific to ··· 330 321 scratch = sdhci_readw(host, O2_SD_MISC_CTRL); 331 322 scratch |= O2_SD_PWR_FORCE_L0; 332 323 sdhci_writew(host, scratch, O2_SD_MISC_CTRL); 324 + 325 + /* Stop clk */ 326 + reg_val = sdhci_readw(host, SDHCI_CLOCK_CONTROL); 327 + reg_val &= ~SDHCI_CLOCK_CARD_EN; 328 + sdhci_writew(host, reg_val, SDHCI_CLOCK_CONTROL); 329 + 330 + /* UnLock WP */ 331 + pci_read_config_byte(chip->pdev, O2_SD_LOCK_WP, &scratch_8); 332 + scratch_8 &= 0x7f; 333 + pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch_8); 334 + 335 + /* Set pcr 0x354[16] to choose dll clock, and set the default phase */ 336 + pci_read_config_dword(chip->pdev, O2_SD_OUTPUT_CLK_SOURCE_SWITCH, &reg_val); 337 + reg_val &= ~(O2_SD_SEL_DLL | O2_SD_PHASE_MASK); 338 + reg_val |= (O2_SD_SEL_DLL | O2_SD_FIX_PHASE); 339 + pci_write_config_dword(chip->pdev, O2_SD_OUTPUT_CLK_SOURCE_SWITCH, reg_val); 340 + 341 + /* Lock WP */ 342 + pci_read_config_byte(chip->pdev, O2_SD_LOCK_WP, &scratch_8); 343 + scratch_8 |= 0x80; 344 + pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch_8); 345 + 346 + /* Start clk */ 347 + reg_val = sdhci_readw(host, SDHCI_CLOCK_CONTROL); 348 + reg_val |= SDHCI_CLOCK_CARD_EN; 349 + sdhci_writew(host, reg_val, SDHCI_CLOCK_CONTROL); 333 350 334 351 /* wait DLL lock, timeout value 5ms */ 335 352 if (readx_poll_timeout(sdhci_o2_pll_dll_wdt_control, host, ··· 568 533 if (clock == 0) 569 534 return; 570 535 536 + /* UnLock WP */ 537 + pci_read_config_byte(chip->pdev, O2_SD_LOCK_WP, &scratch); 538 + scratch &= 0x7f; 539 + pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch); 540 + 571 541 if ((host->timing == MMC_TIMING_UHS_SDR104) && (clock == 200000000)) { 572 - pci_read_config_byte(chip->pdev, O2_SD_LOCK_WP, &scratch); 573 - 574 - scratch &= 0x7f; 575 - pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch); 576 - 577 542 pci_read_config_dword(chip->pdev, O2_SD_PLL_SETTING, &scratch_32); 578 543 579 544 if ((scratch_32 & 0xFFFF0000) != 0x2c280000) 580 545 o2_pci_set_baseclk(chip, 0x2c280000); 546 + } else { 547 + pci_read_config_dword(chip->pdev, O2_SD_PLL_SETTING, &scratch_32); 581 548 582 - pci_read_config_byte(chip->pdev, O2_SD_LOCK_WP, &scratch); 583 - 584 - scratch |= 0x80; 585 - pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch); 549 + if ((scratch_32 & 0xFFFF0000) != 0x25100000) 550 + o2_pci_set_baseclk(chip, 0x25100000); 586 551 } 552 + 553 + pci_read_config_dword(chip->pdev, O2_SD_OUTPUT_CLK_SOURCE_SWITCH, &scratch_32); 554 + scratch_32 &= ~(O2_SD_SEL_DLL | O2_SD_PHASE_MASK); 555 + pci_write_config_dword(chip->pdev, O2_SD_OUTPUT_CLK_SOURCE_SWITCH, scratch_32); 556 + 557 + /* Lock WP */ 558 + pci_read_config_byte(chip->pdev, O2_SD_LOCK_WP, &scratch); 559 + scratch |= 0x80; 560 + pci_write_config_byte(chip->pdev, O2_SD_LOCK_WP, scratch); 587 561 588 562 clk = sdhci_calc_clk(host, clock, &host->mmc->actual_clock); 589 563 sdhci_o2_enable_clk(host, clk);
+1
drivers/mmc/host/sdhci-pci.h
··· 59 59 #define PCI_DEVICE_ID_INTEL_JSL_SD 0x4df8 60 60 #define PCI_DEVICE_ID_INTEL_LKF_EMMC 0x98c4 61 61 #define PCI_DEVICE_ID_INTEL_LKF_SD 0x98f8 62 + #define PCI_DEVICE_ID_INTEL_ADL_EMMC 0x54c4 62 63 63 64 #define PCI_DEVICE_ID_SYSKONNECT_8000 0x8000 64 65 #define PCI_DEVICE_ID_VIA_95D0 0x95d0
+3 -12
drivers/mmc/host/tmio_mmc_core.c
··· 960 960 case MMC_POWER_OFF: 961 961 tmio_mmc_power_off(host); 962 962 /* For R-Car Gen2+, we need to reset SDHI specific SCC */ 963 - if (host->pdata->flags & TMIO_MMC_MIN_RCAR2) { 964 - host->reset(host); 965 - 966 - if (host->native_hotplug) 967 - tmio_mmc_enable_mmc_irqs(host, 968 - TMIO_STAT_CARD_REMOVE | 969 - TMIO_STAT_CARD_INSERT); 970 - } 963 + if (host->pdata->flags & TMIO_MMC_MIN_RCAR2) 964 + tmio_mmc_reset(host); 971 965 972 966 host->set_clock(host, 0); 973 967 break; ··· 1169 1175 if (mmc_can_gpio_cd(mmc)) 1170 1176 _host->ops.get_cd = mmc_gpio_get_cd; 1171 1177 1178 + /* must be set before tmio_mmc_reset() */ 1172 1179 _host->native_hotplug = !(mmc_can_gpio_cd(mmc) || 1173 1180 mmc->caps & MMC_CAP_NEEDS_POLL || 1174 1181 !mmc_card_is_removable(mmc)); ··· 1289 1294 1290 1295 if (host->clk_cache) 1291 1296 host->set_clock(host, host->clk_cache); 1292 - 1293 - if (host->native_hotplug) 1294 - tmio_mmc_enable_mmc_irqs(host, 1295 - TMIO_STAT_CARD_REMOVE | TMIO_STAT_CARD_INSERT); 1296 1297 1297 1298 tmio_mmc_enable_dma(host, true); 1298 1299