| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0-only */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * linux/drivers/mmc/host/mmci.h - ARM PrimeCell MMCI PL180/1 driver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2003 Deep Blue Solutions, Ltd, All Rights Reserved. |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify |
|---|
| 7 | | - * it under the terms of the GNU General Public License version 2 as |
|---|
| 8 | | - * published by the Free Software Foundation. |
|---|
| 9 | 6 | */ |
|---|
| 10 | 7 | #define MMCIPOWER 0x000 |
|---|
| 11 | 8 | #define MCI_PWR_OFF 0x00 |
|---|
| .. | .. |
|---|
| 23 | 20 | #define MCI_ST_DATA31DIREN (1 << 5) |
|---|
| 24 | 21 | #define MCI_ST_FBCLKEN (1 << 7) |
|---|
| 25 | 22 | #define MCI_ST_DATA74DIREN (1 << 8) |
|---|
| 23 | +/* |
|---|
| 24 | + * The STM32 sdmmc does not have PWR_UP/OD/ROD |
|---|
| 25 | + * and uses the power register for |
|---|
| 26 | + */ |
|---|
| 27 | +#define MCI_STM32_PWR_CYC 0x02 |
|---|
| 28 | +#define MCI_STM32_VSWITCH BIT(2) |
|---|
| 29 | +#define MCI_STM32_VSWITCHEN BIT(3) |
|---|
| 30 | +#define MCI_STM32_DIRPOL BIT(4) |
|---|
| 26 | 31 | |
|---|
| 27 | 32 | #define MMCICLOCK 0x004 |
|---|
| 28 | 33 | #define MCI_CLK_ENABLE (1 << 8) |
|---|
| .. | .. |
|---|
| 50 | 55 | #define MCI_QCOM_CLK_SELECT_IN_FBCLK BIT(15) |
|---|
| 51 | 56 | #define MCI_QCOM_CLK_SELECT_IN_DDR_MODE (BIT(14) | BIT(15)) |
|---|
| 52 | 57 | |
|---|
| 58 | +/* Modified on STM32 sdmmc */ |
|---|
| 59 | +#define MCI_STM32_CLK_CLKDIV_MSK GENMASK(9, 0) |
|---|
| 60 | +#define MCI_STM32_CLK_WIDEBUS_4 BIT(14) |
|---|
| 61 | +#define MCI_STM32_CLK_WIDEBUS_8 BIT(15) |
|---|
| 62 | +#define MCI_STM32_CLK_NEGEDGE BIT(16) |
|---|
| 63 | +#define MCI_STM32_CLK_HWFCEN BIT(17) |
|---|
| 64 | +#define MCI_STM32_CLK_DDR BIT(18) |
|---|
| 65 | +#define MCI_STM32_CLK_BUSSPEED BIT(19) |
|---|
| 66 | +#define MCI_STM32_CLK_SEL_MSK GENMASK(21, 20) |
|---|
| 67 | +#define MCI_STM32_CLK_SELCK (0 << 20) |
|---|
| 68 | +#define MCI_STM32_CLK_SELCKIN (1 << 20) |
|---|
| 69 | +#define MCI_STM32_CLK_SELFBCK (2 << 20) |
|---|
| 70 | + |
|---|
| 53 | 71 | #define MMCIARGUMENT 0x008 |
|---|
| 54 | 72 | |
|---|
| 55 | 73 | /* The command register controls the Command Path State Machine (CPSM) */ |
|---|
| .. | .. |
|---|
| 72 | 90 | #define MCI_CPSM_QCOM_CCSDISABLE BIT(15) |
|---|
| 73 | 91 | #define MCI_CPSM_QCOM_AUTO_CMD19 BIT(16) |
|---|
| 74 | 92 | #define MCI_CPSM_QCOM_AUTO_CMD21 BIT(21) |
|---|
| 93 | +/* Command register in STM32 sdmmc versions */ |
|---|
| 94 | +#define MCI_CPSM_STM32_CMDTRANS BIT(6) |
|---|
| 95 | +#define MCI_CPSM_STM32_CMDSTOP BIT(7) |
|---|
| 96 | +#define MCI_CPSM_STM32_WAITRESP_MASK GENMASK(9, 8) |
|---|
| 97 | +#define MCI_CPSM_STM32_NORSP (0 << 8) |
|---|
| 98 | +#define MCI_CPSM_STM32_SRSP_CRC (1 << 8) |
|---|
| 99 | +#define MCI_CPSM_STM32_SRSP (2 << 8) |
|---|
| 100 | +#define MCI_CPSM_STM32_LRSP_CRC (3 << 8) |
|---|
| 101 | +#define MCI_CPSM_STM32_ENABLE BIT(12) |
|---|
| 75 | 102 | |
|---|
| 76 | 103 | #define MMCIRESPCMD 0x010 |
|---|
| 77 | 104 | #define MMCIRESPONSE0 0x014 |
|---|
| .. | .. |
|---|
| 101 | 128 | /* Control register extensions in the Qualcomm versions */ |
|---|
| 102 | 129 | #define MCI_DPSM_QCOM_DATA_PEND BIT(17) |
|---|
| 103 | 130 | #define MCI_DPSM_QCOM_RX_DATA_PEND BIT(20) |
|---|
| 131 | +/* Control register extensions in STM32 versions */ |
|---|
| 132 | +#define MCI_DPSM_STM32_MODE_BLOCK (0 << 2) |
|---|
| 133 | +#define MCI_DPSM_STM32_MODE_SDIO (1 << 2) |
|---|
| 134 | +#define MCI_DPSM_STM32_MODE_STREAM (2 << 2) |
|---|
| 135 | +#define MCI_DPSM_STM32_MODE_BLOCK_STOP (3 << 2) |
|---|
| 104 | 136 | |
|---|
| 105 | 137 | #define MMCIDATACNT 0x030 |
|---|
| 106 | 138 | #define MMCISTATUS 0x034 |
|---|
| .. | .. |
|---|
| 130 | 162 | #define MCI_ST_SDIOIT (1 << 22) |
|---|
| 131 | 163 | #define MCI_ST_CEATAEND (1 << 23) |
|---|
| 132 | 164 | #define MCI_ST_CARDBUSY (1 << 24) |
|---|
| 165 | +/* Extended status bits for the STM32 variants */ |
|---|
| 166 | +#define MCI_STM32_BUSYD0 BIT(20) |
|---|
| 167 | +#define MCI_STM32_BUSYD0END BIT(21) |
|---|
| 168 | +#define MCI_STM32_VSWEND BIT(25) |
|---|
| 133 | 169 | |
|---|
| 134 | 170 | #define MMCICLEAR 0x038 |
|---|
| 135 | 171 | #define MCI_CMDCRCFAILCLR (1 << 0) |
|---|
| .. | .. |
|---|
| 147 | 183 | #define MCI_ST_SDIOITC (1 << 22) |
|---|
| 148 | 184 | #define MCI_ST_CEATAENDC (1 << 23) |
|---|
| 149 | 185 | #define MCI_ST_BUSYENDC (1 << 24) |
|---|
| 186 | +/* Extended clear bits for the STM32 variants */ |
|---|
| 187 | +#define MCI_STM32_VSWENDC BIT(25) |
|---|
| 188 | +#define MCI_STM32_CKSTOPC BIT(26) |
|---|
| 150 | 189 | |
|---|
| 151 | 190 | #define MMCIMASK0 0x03c |
|---|
| 152 | 191 | #define MCI_CMDCRCFAILMASK (1 << 0) |
|---|
| .. | .. |
|---|
| 175 | 214 | #define MCI_ST_SDIOITMASK (1 << 22) |
|---|
| 176 | 215 | #define MCI_ST_CEATAENDMASK (1 << 23) |
|---|
| 177 | 216 | #define MCI_ST_BUSYENDMASK (1 << 24) |
|---|
| 217 | +/* Extended status bits for the STM32 variants */ |
|---|
| 218 | +#define MCI_STM32_BUSYD0ENDMASK BIT(21) |
|---|
| 178 | 219 | |
|---|
| 179 | 220 | #define MMCIMASK1 0x040 |
|---|
| 180 | 221 | #define MMCIFIFOCNT 0x048 |
|---|
| 181 | 222 | #define MMCIFIFO 0x080 /* to 0x0bc */ |
|---|
| 223 | + |
|---|
| 224 | +/* STM32 sdmmc registers for IDMA (Internal DMA) */ |
|---|
| 225 | +#define MMCI_STM32_IDMACTRLR 0x050 |
|---|
| 226 | +#define MMCI_STM32_IDMAEN BIT(0) |
|---|
| 227 | +#define MMCI_STM32_IDMALLIEN BIT(1) |
|---|
| 228 | + |
|---|
| 229 | +#define MMCI_STM32_IDMABSIZER 0x054 |
|---|
| 230 | +#define MMCI_STM32_IDMABNDT_SHIFT 5 |
|---|
| 231 | +#define MMCI_STM32_IDMABNDT_MASK GENMASK(12, 5) |
|---|
| 232 | + |
|---|
| 233 | +#define MMCI_STM32_IDMABASE0R 0x058 |
|---|
| 234 | + |
|---|
| 235 | +#define MMCI_STM32_IDMALAR 0x64 |
|---|
| 236 | +#define MMCI_STM32_IDMALA_MASK GENMASK(13, 0) |
|---|
| 237 | +#define MMCI_STM32_ABR BIT(29) |
|---|
| 238 | +#define MMCI_STM32_ULS BIT(30) |
|---|
| 239 | +#define MMCI_STM32_ULA BIT(31) |
|---|
| 240 | + |
|---|
| 241 | +#define MMCI_STM32_IDMABAR 0x68 |
|---|
| 182 | 242 | |
|---|
| 183 | 243 | #define MCI_IRQENABLE \ |
|---|
| 184 | 244 | (MCI_CMDCRCFAILMASK | MCI_DATACRCFAILMASK | MCI_CMDTIMEOUTMASK | \ |
|---|
| .. | .. |
|---|
| 186 | 246 | MCI_CMDRESPENDMASK | MCI_CMDSENTMASK) |
|---|
| 187 | 247 | |
|---|
| 188 | 248 | /* These interrupts are directed to IRQ1 when two IRQ lines are available */ |
|---|
| 189 | | -#define MCI_IRQ1MASK \ |
|---|
| 249 | +#define MCI_IRQ_PIO_MASK \ |
|---|
| 190 | 250 | (MCI_RXFIFOHALFFULLMASK | MCI_RXDATAAVLBLMASK | \ |
|---|
| 191 | 251 | MCI_TXFIFOHALFEMPTYMASK) |
|---|
| 252 | + |
|---|
| 253 | +#define MCI_IRQ_PIO_STM32_MASK \ |
|---|
| 254 | + (MCI_RXFIFOHALFFULLMASK | MCI_TXFIFOHALFEMPTYMASK) |
|---|
| 192 | 255 | |
|---|
| 193 | 256 | #define NR_SG 128 |
|---|
| 194 | 257 | |
|---|
| .. | .. |
|---|
| 204 | 267 | * @clkreg_enable: enable value for MMCICLOCK register |
|---|
| 205 | 268 | * @clkreg_8bit_bus_enable: enable value for 8 bit bus |
|---|
| 206 | 269 | * @clkreg_neg_edge_enable: enable value for inverted data/cmd output |
|---|
| 270 | + * @cmdreg_cpsm_enable: enable value for CPSM |
|---|
| 271 | + * @cmdreg_lrsp_crc: enable value for long response with crc |
|---|
| 272 | + * @cmdreg_srsp_crc: enable value for short response with crc |
|---|
| 273 | + * @cmdreg_srsp: enable value for short response without crc |
|---|
| 274 | + * @cmdreg_stop: enable value for stop and abort transmission |
|---|
| 207 | 275 | * @datalength_bits: number of bits in the MMCIDATALENGTH register |
|---|
| 208 | 276 | * @fifosize: number of bytes that can be written when MMCI_TXFIFOEMPTY |
|---|
| 209 | 277 | * is asserted (likewise for RX) |
|---|
| .. | .. |
|---|
| 212 | 280 | * @data_cmd_enable: enable value for data commands. |
|---|
| 213 | 281 | * @st_sdio: enable ST specific SDIO logic |
|---|
| 214 | 282 | * @st_clkdiv: true if using a ST-specific clock divider algorithm |
|---|
| 283 | + * @stm32_clkdiv: true if using a STM32-specific clock divider algorithm |
|---|
| 215 | 284 | * @datactrl_mask_ddrmode: ddr mode mask in datactrl register. |
|---|
| 216 | | - * @blksz_datactrl16: true if Block size is at b16..b30 position in datactrl register |
|---|
| 217 | | - * @blksz_datactrl4: true if Block size is at b4..b16 position in datactrl |
|---|
| 218 | | - * register |
|---|
| 219 | 285 | * @datactrl_mask_sdio: SDIO enable mask in datactrl register |
|---|
| 286 | + * @datactrl_blocksz: block size in power of two |
|---|
| 287 | + * @datactrl_any_blocksz: true if block any block sizes are accepted by |
|---|
| 288 | + * hardware, such as with some SDIO traffic that send |
|---|
| 289 | + * odd packets. |
|---|
| 290 | + * @dma_power_of_2: DMA only works with blocks that are a power of 2. |
|---|
| 291 | + * @datactrl_first: true if data must be setup before send command |
|---|
| 292 | + * @datacnt_useless: true if you could not use datacnt register to read |
|---|
| 293 | + * remaining data |
|---|
| 220 | 294 | * @pwrreg_powerup: power up value for MMCIPOWER register |
|---|
| 221 | 295 | * @f_max: maximum clk frequency supported by the controller. |
|---|
| 222 | 296 | * @signal_direction: input/out direction of bus signals can be indicated |
|---|
| 223 | 297 | * @pwrreg_clkgate: MMCIPOWER register must be used to gate the clock |
|---|
| 224 | 298 | * @busy_detect: true if the variant supports busy detection on DAT0. |
|---|
| 299 | + * @busy_timeout: true if the variant starts data timer when the DPSM |
|---|
| 300 | + * enter in Wait_R or Busy state. |
|---|
| 225 | 301 | * @busy_dpsm_flag: bitmask enabling busy detection in the DPSM |
|---|
| 226 | 302 | * @busy_detect_flag: bitmask identifying the bit in the MMCISTATUS register |
|---|
| 227 | 303 | * indicating that the card is busy |
|---|
| .. | .. |
|---|
| 233 | 309 | * @qcom_dml: enables qcom specific dma glue for dma transfers. |
|---|
| 234 | 310 | * @reversed_irq_handling: handle data irq before cmd irq. |
|---|
| 235 | 311 | * @mmcimask1: true if variant have a MMCIMASK1 register. |
|---|
| 312 | + * @irq_pio_mask: bitmask used to manage interrupt pio transfert in mmcimask |
|---|
| 313 | + * register |
|---|
| 236 | 314 | * @start_err: bitmask identifying the STARTBITERR bit inside MMCISTATUS |
|---|
| 237 | 315 | * register. |
|---|
| 238 | 316 | * @opendrain: bitmask identifying the OPENDRAIN bit inside MMCIPOWER register |
|---|
| 317 | + * @dma_lli: true if variant has dma link list feature. |
|---|
| 318 | + * @stm32_idmabsize_mask: stm32 sdmmc idma buffer size. |
|---|
| 239 | 319 | */ |
|---|
| 240 | 320 | struct variant_data { |
|---|
| 241 | 321 | unsigned int clkreg; |
|---|
| 242 | 322 | unsigned int clkreg_enable; |
|---|
| 243 | 323 | unsigned int clkreg_8bit_bus_enable; |
|---|
| 244 | 324 | unsigned int clkreg_neg_edge_enable; |
|---|
| 325 | + unsigned int cmdreg_cpsm_enable; |
|---|
| 326 | + unsigned int cmdreg_lrsp_crc; |
|---|
| 327 | + unsigned int cmdreg_srsp_crc; |
|---|
| 328 | + unsigned int cmdreg_srsp; |
|---|
| 329 | + unsigned int cmdreg_stop; |
|---|
| 245 | 330 | unsigned int datalength_bits; |
|---|
| 246 | 331 | unsigned int fifosize; |
|---|
| 247 | 332 | unsigned int fifohalfsize; |
|---|
| 248 | 333 | unsigned int data_cmd_enable; |
|---|
| 249 | 334 | unsigned int datactrl_mask_ddrmode; |
|---|
| 250 | 335 | unsigned int datactrl_mask_sdio; |
|---|
| 251 | | - bool st_sdio; |
|---|
| 252 | | - bool st_clkdiv; |
|---|
| 253 | | - bool blksz_datactrl16; |
|---|
| 254 | | - bool blksz_datactrl4; |
|---|
| 336 | + unsigned int datactrl_blocksz; |
|---|
| 337 | + u8 datactrl_any_blocksz:1; |
|---|
| 338 | + u8 dma_power_of_2:1; |
|---|
| 339 | + u8 datactrl_first:1; |
|---|
| 340 | + u8 datacnt_useless:1; |
|---|
| 341 | + u8 st_sdio:1; |
|---|
| 342 | + u8 st_clkdiv:1; |
|---|
| 343 | + u8 stm32_clkdiv:1; |
|---|
| 255 | 344 | u32 pwrreg_powerup; |
|---|
| 256 | 345 | u32 f_max; |
|---|
| 257 | | - bool signal_direction; |
|---|
| 258 | | - bool pwrreg_clkgate; |
|---|
| 259 | | - bool busy_detect; |
|---|
| 346 | + u8 signal_direction:1; |
|---|
| 347 | + u8 pwrreg_clkgate:1; |
|---|
| 348 | + u8 busy_detect:1; |
|---|
| 349 | + u8 busy_timeout:1; |
|---|
| 260 | 350 | u32 busy_dpsm_flag; |
|---|
| 261 | 351 | u32 busy_detect_flag; |
|---|
| 262 | 352 | u32 busy_detect_mask; |
|---|
| 263 | | - bool pwrreg_nopower; |
|---|
| 264 | | - bool explicit_mclk_control; |
|---|
| 265 | | - bool qcom_fifo; |
|---|
| 266 | | - bool qcom_dml; |
|---|
| 267 | | - bool reversed_irq_handling; |
|---|
| 268 | | - bool mmcimask1; |
|---|
| 353 | + u8 pwrreg_nopower:1; |
|---|
| 354 | + u8 explicit_mclk_control:1; |
|---|
| 355 | + u8 qcom_fifo:1; |
|---|
| 356 | + u8 qcom_dml:1; |
|---|
| 357 | + u8 reversed_irq_handling:1; |
|---|
| 358 | + u8 mmcimask1:1; |
|---|
| 359 | + unsigned int irq_pio_mask; |
|---|
| 269 | 360 | u32 start_err; |
|---|
| 270 | 361 | u32 opendrain; |
|---|
| 362 | + u8 dma_lli:1; |
|---|
| 363 | + u32 stm32_idmabsize_mask; |
|---|
| 271 | 364 | void (*init)(struct mmci_host *host); |
|---|
| 272 | 365 | }; |
|---|
| 273 | 366 | |
|---|
| 274 | 367 | /* mmci variant callbacks */ |
|---|
| 275 | 368 | struct mmci_host_ops { |
|---|
| 276 | | - void (*dma_setup)(struct mmci_host *host); |
|---|
| 277 | | -}; |
|---|
| 278 | | - |
|---|
| 279 | | -struct mmci_host_next { |
|---|
| 280 | | - struct dma_async_tx_descriptor *dma_desc; |
|---|
| 281 | | - struct dma_chan *dma_chan; |
|---|
| 282 | | - s32 cookie; |
|---|
| 369 | + int (*validate_data)(struct mmci_host *host, struct mmc_data *data); |
|---|
| 370 | + int (*prep_data)(struct mmci_host *host, struct mmc_data *data, |
|---|
| 371 | + bool next); |
|---|
| 372 | + void (*unprep_data)(struct mmci_host *host, struct mmc_data *data, |
|---|
| 373 | + int err); |
|---|
| 374 | + u32 (*get_datactrl_cfg)(struct mmci_host *host); |
|---|
| 375 | + void (*get_next_data)(struct mmci_host *host, struct mmc_data *data); |
|---|
| 376 | + int (*dma_setup)(struct mmci_host *host); |
|---|
| 377 | + void (*dma_release)(struct mmci_host *host); |
|---|
| 378 | + int (*dma_start)(struct mmci_host *host, unsigned int *datactrl); |
|---|
| 379 | + void (*dma_finalize)(struct mmci_host *host, struct mmc_data *data); |
|---|
| 380 | + void (*dma_error)(struct mmci_host *host); |
|---|
| 381 | + void (*set_clkreg)(struct mmci_host *host, unsigned int desired); |
|---|
| 382 | + void (*set_pwrreg)(struct mmci_host *host, unsigned int pwr); |
|---|
| 383 | + bool (*busy_complete)(struct mmci_host *host, u32 status, u32 err_msk); |
|---|
| 384 | + void (*pre_sig_volt_switch)(struct mmci_host *host); |
|---|
| 385 | + int (*post_sig_volt_switch)(struct mmci_host *host, struct mmc_ios *ios); |
|---|
| 283 | 386 | }; |
|---|
| 284 | 387 | |
|---|
| 285 | 388 | struct mmci_host { |
|---|
| .. | .. |
|---|
| 287 | 390 | void __iomem *base; |
|---|
| 288 | 391 | struct mmc_request *mrq; |
|---|
| 289 | 392 | struct mmc_command *cmd; |
|---|
| 393 | + struct mmc_command stop_abort; |
|---|
| 290 | 394 | struct mmc_data *data; |
|---|
| 291 | 395 | struct mmc_host *mmc; |
|---|
| 292 | 396 | struct clk *clk; |
|---|
| 293 | | - bool singleirq; |
|---|
| 397 | + u8 singleirq:1; |
|---|
| 398 | + |
|---|
| 399 | + struct reset_control *rst; |
|---|
| 294 | 400 | |
|---|
| 295 | 401 | spinlock_t lock; |
|---|
| 296 | 402 | |
|---|
| .. | .. |
|---|
| 301 | 407 | u32 pwr_reg; |
|---|
| 302 | 408 | u32 pwr_reg_add; |
|---|
| 303 | 409 | u32 clk_reg; |
|---|
| 410 | + u32 clk_reg_add; |
|---|
| 304 | 411 | u32 datactrl_reg; |
|---|
| 305 | 412 | u32 busy_status; |
|---|
| 306 | 413 | u32 mask1_reg; |
|---|
| 307 | | - bool vqmmc_enabled; |
|---|
| 414 | + u8 vqmmc_enabled:1; |
|---|
| 308 | 415 | struct mmci_platform_data *plat; |
|---|
| 416 | + struct mmc_host_ops *mmc_ops; |
|---|
| 309 | 417 | struct mmci_host_ops *ops; |
|---|
| 310 | 418 | struct variant_data *variant; |
|---|
| 419 | + void *variant_priv; |
|---|
| 311 | 420 | struct pinctrl *pinctrl; |
|---|
| 312 | | - struct pinctrl_state *pins_default; |
|---|
| 313 | 421 | struct pinctrl_state *pins_opendrain; |
|---|
| 314 | 422 | |
|---|
| 315 | 423 | u8 hw_designer; |
|---|
| .. | .. |
|---|
| 317 | 425 | |
|---|
| 318 | 426 | struct timer_list timer; |
|---|
| 319 | 427 | unsigned int oldstat; |
|---|
| 428 | + u32 irq_action; |
|---|
| 320 | 429 | |
|---|
| 321 | 430 | /* pio stuff */ |
|---|
| 322 | 431 | struct sg_mapping_iter sg_miter; |
|---|
| 323 | 432 | unsigned int size; |
|---|
| 324 | 433 | int (*get_rx_fifocnt)(struct mmci_host *h, u32 status, int remain); |
|---|
| 325 | 434 | |
|---|
| 326 | | -#ifdef CONFIG_DMA_ENGINE |
|---|
| 327 | | - /* DMA stuff */ |
|---|
| 328 | | - struct dma_chan *dma_current; |
|---|
| 329 | | - struct dma_chan *dma_rx_channel; |
|---|
| 330 | | - struct dma_chan *dma_tx_channel; |
|---|
| 331 | | - struct dma_async_tx_descriptor *dma_desc_current; |
|---|
| 332 | | - struct mmci_host_next next_data; |
|---|
| 333 | | - bool dma_in_progress; |
|---|
| 435 | + u8 use_dma:1; |
|---|
| 436 | + u8 dma_in_progress:1; |
|---|
| 437 | + void *dma_priv; |
|---|
| 334 | 438 | |
|---|
| 335 | | -#define dma_inprogress(host) ((host)->dma_in_progress) |
|---|
| 336 | | -#else |
|---|
| 337 | | -#define dma_inprogress(host) (0) |
|---|
| 338 | | -#endif |
|---|
| 439 | + s32 next_cookie; |
|---|
| 339 | 440 | }; |
|---|
| 340 | 441 | |
|---|
| 442 | +#define dma_inprogress(host) ((host)->dma_in_progress) |
|---|
| 443 | + |
|---|
| 444 | +void mmci_write_clkreg(struct mmci_host *host, u32 clk); |
|---|
| 445 | +void mmci_write_pwrreg(struct mmci_host *host, u32 pwr); |
|---|
| 446 | + |
|---|
| 447 | +static inline u32 mmci_dctrl_blksz(struct mmci_host *host) |
|---|
| 448 | +{ |
|---|
| 449 | + return (ffs(host->data->blksz) - 1) << 4; |
|---|
| 450 | +} |
|---|
| 451 | + |
|---|
| 452 | +#ifdef CONFIG_DMA_ENGINE |
|---|
| 453 | +int mmci_dmae_prep_data(struct mmci_host *host, struct mmc_data *data, |
|---|
| 454 | + bool next); |
|---|
| 455 | +void mmci_dmae_unprep_data(struct mmci_host *host, struct mmc_data *data, |
|---|
| 456 | + int err); |
|---|
| 457 | +void mmci_dmae_get_next_data(struct mmci_host *host, struct mmc_data *data); |
|---|
| 458 | +int mmci_dmae_setup(struct mmci_host *host); |
|---|
| 459 | +void mmci_dmae_release(struct mmci_host *host); |
|---|
| 460 | +int mmci_dmae_start(struct mmci_host *host, unsigned int *datactrl); |
|---|
| 461 | +void mmci_dmae_finalize(struct mmci_host *host, struct mmc_data *data); |
|---|
| 462 | +void mmci_dmae_error(struct mmci_host *host); |
|---|
| 463 | +#endif |
|---|
| 464 | + |
|---|
| 465 | +#ifdef CONFIG_MMC_QCOM_DML |
|---|
| 466 | +void qcom_variant_init(struct mmci_host *host); |
|---|
| 467 | +#else |
|---|
| 468 | +static inline void qcom_variant_init(struct mmci_host *host) {} |
|---|
| 469 | +#endif |
|---|
| 470 | + |
|---|
| 471 | +#ifdef CONFIG_MMC_STM32_SDMMC |
|---|
| 472 | +void sdmmc_variant_init(struct mmci_host *host); |
|---|
| 473 | +#else |
|---|
| 474 | +static inline void sdmmc_variant_init(struct mmci_host *host) {} |
|---|
| 475 | +#endif |
|---|