13d0407baSopenharmony_ci/* 23d0407baSopenharmony_ci * Synopsys DesignWare Multimedia Card Interface driver 33d0407baSopenharmony_ci * (Based on NXP driver for lpc 31xx) 43d0407baSopenharmony_ci * 53d0407baSopenharmony_ci * Copyright (C) 2009 NXP Semiconductors 63d0407baSopenharmony_ci * Copyright (C) 2009, 2010 Imagination Technologies Ltd. 73d0407baSopenharmony_ci * 83d0407baSopenharmony_ci * Copyright (C) 2014 Fuzhou Rockchip Electronics Co.Ltd. 93d0407baSopenharmony_ci * 103d0407baSopenharmony_ci * This program is free software; you can redistribute it and/or modify 113d0407baSopenharmony_ci * it under the terms of the GNU General Public License as published by 123d0407baSopenharmony_ci * the Free Software Foundation; either version 2 of the License, or 133d0407baSopenharmony_ci * (at your option) any later version. 143d0407baSopenharmony_ci */ 153d0407baSopenharmony_ci 163d0407baSopenharmony_ci#ifndef _DW_MMC_H_ 173d0407baSopenharmony_ci#define _DW_MMC_H_ 183d0407baSopenharmony_ci#include "rk_sdmmc_dbg.h" 193d0407baSopenharmony_ci 203d0407baSopenharmony_ci#define DW_MMC_240A 0x240a 213d0407baSopenharmony_ci#define DW_MMC_270A 0x270a 223d0407baSopenharmony_ci 233d0407baSopenharmony_ci#define SDMMC_CTRL 0x000 243d0407baSopenharmony_ci#define SDMMC_PWREN 0x004 253d0407baSopenharmony_ci#define SDMMC_CLKDIV 0x008 263d0407baSopenharmony_ci#define SDMMC_CLKSRC 0x00c 273d0407baSopenharmony_ci#define SDMMC_CLKENA 0x010 283d0407baSopenharmony_ci#define SDMMC_TMOUT 0x014 293d0407baSopenharmony_ci#define SDMMC_CTYPE 0x018 303d0407baSopenharmony_ci#define SDMMC_BLKSIZ 0x01c 313d0407baSopenharmony_ci#define SDMMC_BYTCNT 0x020 323d0407baSopenharmony_ci#define SDMMC_INTMASK 0x024 333d0407baSopenharmony_ci#define SDMMC_CMDARG 0x028 343d0407baSopenharmony_ci#define SDMMC_CMD 0x02c 353d0407baSopenharmony_ci#define SDMMC_RESP0 0x030 363d0407baSopenharmony_ci#define SDMMC_RESP1 0x034 373d0407baSopenharmony_ci#define SDMMC_RESP2 0x038 383d0407baSopenharmony_ci#define SDMMC_RESP3 0x03c 393d0407baSopenharmony_ci#define SDMMC_MINTSTS 0x040 403d0407baSopenharmony_ci#define SDMMC_RINTSTS 0x044 413d0407baSopenharmony_ci#define SDMMC_STATUS 0x048 423d0407baSopenharmony_ci#define SDMMC_FIFOTH 0x04c 433d0407baSopenharmony_ci#define SDMMC_CDETECT 0x050 443d0407baSopenharmony_ci#define SDMMC_WRTPRT 0x054 453d0407baSopenharmony_ci#define SDMMC_GPIO 0x058 463d0407baSopenharmony_ci#define SDMMC_TCBCNT 0x05c 473d0407baSopenharmony_ci#define SDMMC_TBBCNT 0x060 483d0407baSopenharmony_ci#define SDMMC_DEBNCE 0x064 493d0407baSopenharmony_ci#define SDMMC_USRID 0x068 503d0407baSopenharmony_ci#define SDMMC_VERID 0x06c 513d0407baSopenharmony_ci#define SDMMC_HCON 0x070 523d0407baSopenharmony_ci#define SDMMC_UHS_REG 0x074 533d0407baSopenharmony_ci#define SDMMC_RST_N 0x078 543d0407baSopenharmony_ci#define SDMMC_BMOD 0x080 553d0407baSopenharmony_ci#define SDMMC_PLDMND 0x084 563d0407baSopenharmony_ci#define SDMMC_DBADDR 0x088 573d0407baSopenharmony_ci#define SDMMC_IDSTS 0x08c 583d0407baSopenharmony_ci#define SDMMC_IDINTEN 0x090 593d0407baSopenharmony_ci#define SDMMC_DSCADDR 0x094 603d0407baSopenharmony_ci#define SDMMC_BUFADDR 0x098 613d0407baSopenharmony_ci#define SDMMC_CDTHRCTL 0x100 623d0407baSopenharmony_ci#define SDMMC_DATA(x) (x) 633d0407baSopenharmony_ci 643d0407baSopenharmony_ci 653d0407baSopenharmony_cistatic const u8 tuning_blk_pattern_4bit[] = { 663d0407baSopenharmony_ci 0xff, 0x0f, 0xff, 0x00, 0xff, 0xcc, 0xc3, 0xcc, 673d0407baSopenharmony_ci 0xc3, 0x3c, 0xcc, 0xff, 0xfe, 0xff, 0xfe, 0xef, 683d0407baSopenharmony_ci 0xff, 0xdf, 0xff, 0xdd, 0xff, 0xfb, 0xff, 0xfb, 693d0407baSopenharmony_ci 0xbf, 0xff, 0x7f, 0xff, 0x77, 0xf7, 0xbd, 0xef, 703d0407baSopenharmony_ci 0xff, 0xf0, 0xff, 0xf0, 0x0f, 0xfc, 0xcc, 0x3c, 713d0407baSopenharmony_ci 0xcc, 0x33, 0xcc, 0xcf, 0xff, 0xef, 0xff, 0xee, 723d0407baSopenharmony_ci 0xff, 0xfd, 0xff, 0xfd, 0xdf, 0xff, 0xbf, 0xff, 733d0407baSopenharmony_ci 0xbb, 0xff, 0xf7, 0xff, 0xf7, 0x7f, 0x7b, 0xde, 743d0407baSopenharmony_ci}; 753d0407baSopenharmony_ci 763d0407baSopenharmony_cistatic const u8 tuning_blk_pattern_8bit[] = { 773d0407baSopenharmony_ci 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 783d0407baSopenharmony_ci 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc, 0xcc, 793d0407baSopenharmony_ci 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff, 0xff, 803d0407baSopenharmony_ci 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee, 0xff, 813d0407baSopenharmony_ci 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd, 0xdd, 823d0407baSopenharmony_ci 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 0xbb, 833d0407baSopenharmony_ci 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 0xff, 843d0407baSopenharmony_ci 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee, 0xff, 853d0407baSopenharmony_ci 0xff, 0xff, 0xff, 0x00, 0xff, 0xff, 0xff, 0x00, 863d0407baSopenharmony_ci 0x00, 0xff, 0xff, 0xcc, 0xcc, 0xcc, 0x33, 0xcc, 873d0407baSopenharmony_ci 0xcc, 0xcc, 0x33, 0x33, 0xcc, 0xcc, 0xcc, 0xff, 883d0407baSopenharmony_ci 0xff, 0xff, 0xee, 0xff, 0xff, 0xff, 0xee, 0xee, 893d0407baSopenharmony_ci 0xff, 0xff, 0xff, 0xdd, 0xff, 0xff, 0xff, 0xdd, 903d0407baSopenharmony_ci 0xdd, 0xff, 0xff, 0xff, 0xbb, 0xff, 0xff, 0xff, 913d0407baSopenharmony_ci 0xbb, 0xbb, 0xff, 0xff, 0xff, 0x77, 0xff, 0xff, 923d0407baSopenharmony_ci 0xff, 0x77, 0x77, 0xff, 0x77, 0xbb, 0xdd, 0xee, 933d0407baSopenharmony_ci}; 943d0407baSopenharmony_ci 953d0407baSopenharmony_ci/* 963d0407baSopenharmony_ci * Data offset is difference according to Version 973d0407baSopenharmony_ci * Lower than 2.40a : data register offest is 0x100 983d0407baSopenharmony_ci */ 993d0407baSopenharmony_ci#define DATA_OFFSET 0x100 1003d0407baSopenharmony_ci#define DATA_240A_OFFSET 0x200 1013d0407baSopenharmony_ci 1023d0407baSopenharmony_ci/* shift bit field */ 1033d0407baSopenharmony_ci#define _SBF(f, v) ((v) << (f)) 1043d0407baSopenharmony_ci 1053d0407baSopenharmony_ci 1063d0407baSopenharmony_cistruct sdmmc_reg { 1073d0407baSopenharmony_ciu32 addr; 1083d0407baSopenharmony_cichar *name; 1093d0407baSopenharmony_ci}; 1103d0407baSopenharmony_ci 1113d0407baSopenharmony_cistatic const struct sdmmc_reg dw_mci_regs[] = { 1123d0407baSopenharmony_ci{ 0x0000, "CTRL" }, 1133d0407baSopenharmony_ci{ 0x0004, "PWREN" }, 1143d0407baSopenharmony_ci{ 0x0008, "CLKDIV" }, 1153d0407baSopenharmony_ci{ 0x000C, "CLKSRC" }, 1163d0407baSopenharmony_ci{ 0x0010, "CLKENA" }, 1173d0407baSopenharmony_ci{ 0x0014, "TMOUT" }, 1183d0407baSopenharmony_ci{ 0x0018, "CTYPE" }, 1193d0407baSopenharmony_ci{ 0x001C, "BLKSIZ" }, 1203d0407baSopenharmony_ci{ 0x0020, "BYTCNT" }, 1213d0407baSopenharmony_ci{ 0x0024, "INTMASK" }, 1223d0407baSopenharmony_ci{ 0x0028, "CMDARG" }, 1233d0407baSopenharmony_ci{ 0x002C, "CMD" }, 1243d0407baSopenharmony_ci{ 0x0030, "RESP0" }, 1253d0407baSopenharmony_ci{ 0x0034, "RESP1" }, 1263d0407baSopenharmony_ci{ 0x0038, "RESP2" }, 1273d0407baSopenharmony_ci{ 0x003C, "RESP3" }, 1283d0407baSopenharmony_ci{ 0x0040, "MINSTS" }, 1293d0407baSopenharmony_ci{ 0x0044, "RINTSTS" }, 1303d0407baSopenharmony_ci{ 0x0048, "STATUS" }, 1313d0407baSopenharmony_ci{ 0x004C, "FIFOTH" }, 1323d0407baSopenharmony_ci{ 0x0050, "CDETECT" }, 1333d0407baSopenharmony_ci{ 0x0054, "WRTPRT" }, 1343d0407baSopenharmony_ci{ 0x0058, "GPIO" }, 1353d0407baSopenharmony_ci{ 0x005C, "TCBCNT" }, 1363d0407baSopenharmony_ci{ 0x0060, "TBBCNT" }, 1373d0407baSopenharmony_ci{ 0x0064, "DEBNCE" }, 1383d0407baSopenharmony_ci{ 0x0068, "USRID" }, 1393d0407baSopenharmony_ci{ 0x006C, "VERID" }, 1403d0407baSopenharmony_ci{ 0x0070, "HCON" }, 1413d0407baSopenharmony_ci{ 0x0074, "UHS_REG" }, 1423d0407baSopenharmony_ci{ 0x0078, "RST_n" }, 1433d0407baSopenharmony_ci{ 0x0080, "BMOD" }, 1443d0407baSopenharmony_ci{ 0x0084, "PLDMND" }, 1453d0407baSopenharmony_ci{ 0x0088, "DBADDR" }, 1463d0407baSopenharmony_ci{ 0x008C, "IDSTS" }, 1473d0407baSopenharmony_ci{ 0x0090, "IDINTEN" }, 1483d0407baSopenharmony_ci{ 0x0094, "DSCADDR" }, 1493d0407baSopenharmony_ci{ 0x0098, "BUFADDR" }, 1503d0407baSopenharmony_ci{ 0x0100, "CARDTHRCTL" }, 1513d0407baSopenharmony_ci{ 0x0104, "BackEndPwr" }, 1523d0407baSopenharmony_ci{ 0, 0 } 1533d0407baSopenharmony_ci}; 1543d0407baSopenharmony_ci 1553d0407baSopenharmony_ci 1563d0407baSopenharmony_ci/* Control register defines */ 1573d0407baSopenharmony_ci#define SDMMC_CTRL_USE_IDMAC BIT(25) 1583d0407baSopenharmony_ci#define SDMMC_CTRL_CEATA_INT_EN BIT(11) 1593d0407baSopenharmony_ci#define SDMMC_CTRL_SEND_AS_CCSD BIT(10) 1603d0407baSopenharmony_ci#define SDMMC_CTRL_SEND_CCSD BIT(9) 1613d0407baSopenharmony_ci#define SDMMC_CTRL_ABRT_READ_DATA BIT(8) 1623d0407baSopenharmony_ci#define SDMMC_CTRL_SEND_IRQ_RESP BIT(7) 1633d0407baSopenharmony_ci#define SDMMC_CTRL_READ_WAIT BIT(6) 1643d0407baSopenharmony_ci#define SDMMC_CTRL_DMA_ENABLE BIT(5) 1653d0407baSopenharmony_ci#define SDMMC_CTRL_INT_ENABLE BIT(4) 1663d0407baSopenharmony_ci#define SDMMC_CTRL_DMA_RESET BIT(2) 1673d0407baSopenharmony_ci#define SDMMC_CTRL_FIFO_RESET BIT(1) 1683d0407baSopenharmony_ci#define SDMMC_CTRL_RESET BIT(0) 1693d0407baSopenharmony_ci/* Clock Enable register defines */ 1703d0407baSopenharmony_ci#define SDMMC_CLKEN_LOW_PWR BIT(16) 1713d0407baSopenharmony_ci#define SDMMC_CLKEN_ENABLE BIT(0) 1723d0407baSopenharmony_ci/* time-out register defines */ 1733d0407baSopenharmony_ci#define SDMMC_TMOUT_DATA(n) _SBF(8, (n)) 1743d0407baSopenharmony_ci#define SDMMC_TMOUT_DATA_MSK 0xFFFFFF00 1753d0407baSopenharmony_ci#define SDMMC_TMOUT_RESP(n) ((n) & 0xFF) 1763d0407baSopenharmony_ci#define SDMMC_TMOUT_RESP_MSK 0xFF 1773d0407baSopenharmony_ci/* card-type register defines */ 1783d0407baSopenharmony_ci#define SDMMC_CTYPE_8BIT BIT(16) 1793d0407baSopenharmony_ci#define SDMMC_CTYPE_4BIT BIT(0) 1803d0407baSopenharmony_ci#define SDMMC_CTYPE_1BIT 0 1813d0407baSopenharmony_ci/* Interrupt status & mask register defines */ 1823d0407baSopenharmony_ci#define SDMMC_INT_SDIO(n) BIT(16 + (n)) 1833d0407baSopenharmony_ci#define SDMMC_INT_EBE BIT(15) 1843d0407baSopenharmony_ci#define SDMMC_INT_ACD BIT(14) 1853d0407baSopenharmony_ci#define SDMMC_INT_SBE BIT(13) 1863d0407baSopenharmony_ci#define SDMMC_INT_HLE BIT(12) 1873d0407baSopenharmony_ci#define SDMMC_INT_FRUN BIT(11) 1883d0407baSopenharmony_ci#define SDMMC_INT_HTO BIT(10) 1893d0407baSopenharmony_ci#define SDMMC_INT_VSI SDMMC_INT_HTO 1903d0407baSopenharmony_ci#define SDMMC_INT_DRTO BIT(9) 1913d0407baSopenharmony_ci#define SDMMC_INT_RTO BIT(8) 1923d0407baSopenharmony_ci#define SDMMC_INT_DCRC BIT(7) 1933d0407baSopenharmony_ci#define SDMMC_INT_RCRC BIT(6) 1943d0407baSopenharmony_ci#define SDMMC_INT_RXDR BIT(5) 1953d0407baSopenharmony_ci#define SDMMC_INT_TXDR BIT(4) 1963d0407baSopenharmony_ci#define SDMMC_INT_DATA_OVER BIT(3) 1973d0407baSopenharmony_ci#define SDMMC_INT_CMD_DONE BIT(2) 1983d0407baSopenharmony_ci#define SDMMC_INT_RESP_ERR BIT(1) 1993d0407baSopenharmony_ci#define SDMMC_INT_CD BIT(0) 2003d0407baSopenharmony_ci#define SDMMC_INT_ERROR 0xbfc2 2013d0407baSopenharmony_ci/* Command register defines */ 2023d0407baSopenharmony_ci#define SDMMC_CMD_START BIT(31) 2033d0407baSopenharmony_ci#define SDMMC_CMD_USE_HOLD_REG BIT(29) 2043d0407baSopenharmony_ci#define SDMMC_CMD_VOLT_SWITCH BIT(28) 2053d0407baSopenharmony_ci#define SDMMC_CMD_BOOT_MODE BIT(27) 2063d0407baSopenharmony_ci#define SDMMC_CMD_DISABLE_BOOT BIT(26) 2073d0407baSopenharmony_ci#define SDMMC_CMD_EXPECT_BOOT_ACK BIT(25) 2083d0407baSopenharmony_ci#define SDMMC_CMD_ENABLE_BOOT BIT(24) 2093d0407baSopenharmony_ci#define SDMMC_CMD_CCS_EXP BIT(23) 2103d0407baSopenharmony_ci#define SDMMC_CMD_CEATA_RD BIT(22) 2113d0407baSopenharmony_ci#define SDMMC_CMD_UPD_CLK BIT(21) 2123d0407baSopenharmony_ci#define SDMMC_CMD_INIT BIT(15) 2133d0407baSopenharmony_ci#define SDMMC_CMD_STOP BIT(14) 2143d0407baSopenharmony_ci#define SDMMC_CMD_PRV_DAT_WAIT BIT(13) 2153d0407baSopenharmony_ci#define SDMMC_CMD_SEND_STOP BIT(12) 2163d0407baSopenharmony_ci#define SDMMC_CMD_STRM_MODE BIT(11) 2173d0407baSopenharmony_ci#define SDMMC_CMD_DAT_WR BIT(10) 2183d0407baSopenharmony_ci#define SDMMC_CMD_DAT_EXP BIT(9) 2193d0407baSopenharmony_ci#define SDMMC_CMD_RESP_CRC BIT(8) 2203d0407baSopenharmony_ci#define SDMMC_CMD_RESP_LONG BIT(7) 2213d0407baSopenharmony_ci#define SDMMC_CMD_RESP_EXP BIT(6) 2223d0407baSopenharmony_ci#define SDMMC_CMD_INDX(n) ((n) & 0x1F) 2233d0407baSopenharmony_ci/* Status register defines */ 2243d0407baSopenharmony_ci#define SDMMC_GET_FCNT(x) (((x)>>17) & 0x1FFF) 2253d0407baSopenharmony_ci#define SDMMC_STAUTS_MC_BUSY BIT(10) 2263d0407baSopenharmony_ci#define SDMMC_STAUTS_DATA_BUSY BIT(9) 2273d0407baSopenharmony_ci#define SDMMC_CMD_FSM_MASK (0x0F << 4) 2283d0407baSopenharmony_ci#define SDMMC_CMD_FSM_IDLE (0x00) 2293d0407baSopenharmony_ci#define SDMMC_STAUTS_FIFO_FULL BIT(3) 2303d0407baSopenharmony_ci#define SDMMC_STAUTS_FIFO_EMPTY BIT(2) 2313d0407baSopenharmony_ci 2323d0407baSopenharmony_ci/* Control SDMMC_UHS_REG defines (base+ 0x74)*/ 2333d0407baSopenharmony_ci#define SDMMC_UHS_DDR_MODE BIT(16) 2343d0407baSopenharmony_ci#define SDMMC_UHS_VOLT_REG_18 BIT(0) 2353d0407baSopenharmony_ci 2363d0407baSopenharmony_ci/* FIFOTH register defines */ 2373d0407baSopenharmony_ci#define SDMMC_SET_FIFOTH(m, r, t) (((m) & 0x7) << 28 | \ 2383d0407baSopenharmony_ci ((r) & 0xFFF) << 16 | \ 2393d0407baSopenharmony_ci ((t) & 0xFFF)) 2403d0407baSopenharmony_ci/* Internal DMAC interrupt defines */ 2413d0407baSopenharmony_ci#define SDMMC_IDMAC_INT_AI BIT(9) 2423d0407baSopenharmony_ci#define SDMMC_IDMAC_INT_NI BIT(8) 2433d0407baSopenharmony_ci#define SDMMC_IDMAC_INT_CES BIT(5) 2443d0407baSopenharmony_ci#define SDMMC_IDMAC_INT_DU BIT(4) 2453d0407baSopenharmony_ci#define SDMMC_IDMAC_INT_FBE BIT(2) 2463d0407baSopenharmony_ci#define SDMMC_IDMAC_INT_RI BIT(1) 2473d0407baSopenharmony_ci#define SDMMC_IDMAC_INT_TI BIT(0) 2483d0407baSopenharmony_ci/* Internal DMAC bus mode bits */ 2493d0407baSopenharmony_ci#define SDMMC_IDMAC_ENABLE BIT(7) 2503d0407baSopenharmony_ci#define SDMMC_IDMAC_FB BIT(1) 2513d0407baSopenharmony_ci#define SDMMC_IDMAC_SWRESET BIT(0) 2523d0407baSopenharmony_ci/* Version ID register define */ 2533d0407baSopenharmony_ci#define SDMMC_GET_VERID(x) ((x) & 0xFFFF) 2543d0407baSopenharmony_ci/* Card read threshold */ 2553d0407baSopenharmony_ci#define SDMMC_SET_RD_THLD(v, x) (((v) & 0xFFF) << 16 | (x)) 2563d0407baSopenharmony_ci 2573d0407baSopenharmony_ci/* Register access macros */ 2583d0407baSopenharmony_ci#define mci_readl(dev, reg) \ 2593d0407baSopenharmony_ci __raw_readl((dev)->regs + SDMMC_##reg) 2603d0407baSopenharmony_ci#define mci_writel(dev, reg, value) \ 2613d0407baSopenharmony_ci __raw_writel((value), (dev)->regs + SDMMC_##reg) 2623d0407baSopenharmony_ci#define mci_readreg(dev, addr) \ 2633d0407baSopenharmony_ci __raw_readl((dev)->regs + addr) 2643d0407baSopenharmony_ci#define mci_writereg(dev, addr, value) \ 2653d0407baSopenharmony_ci __raw_writel((value), (dev)->regs + addr) 2663d0407baSopenharmony_ci 2673d0407baSopenharmony_ci 2683d0407baSopenharmony_ci/* 16-bit FIFO access macros */ 2693d0407baSopenharmony_ci#define mci_readw(dev, reg) \ 2703d0407baSopenharmony_ci __raw_readw((dev)->regs + SDMMC_##reg) 2713d0407baSopenharmony_ci#define mci_writew(dev, reg, value) \ 2723d0407baSopenharmony_ci __raw_writew((value), (dev)->regs + SDMMC_##reg) 2733d0407baSopenharmony_ci 2743d0407baSopenharmony_ci/* 64-bit FIFO access macros */ 2753d0407baSopenharmony_ci#ifdef readq 2763d0407baSopenharmony_ci#define mci_readq(dev, reg) \ 2773d0407baSopenharmony_ci __raw_readq((dev)->regs + SDMMC_##reg) 2783d0407baSopenharmony_ci#define mci_writeq(dev, reg, value) \ 2793d0407baSopenharmony_ci __raw_writeq((value), (dev)->regs + SDMMC_##reg) 2803d0407baSopenharmony_ci#else 2813d0407baSopenharmony_ci/* 2823d0407baSopenharmony_ci * Dummy readq implementation for architectures that don't define it. 2833d0407baSopenharmony_ci * 2843d0407baSopenharmony_ci * We would assume that none of these architectures would configure 2853d0407baSopenharmony_ci * the IP block with a 64bit FIFO width, so this code will never be 2863d0407baSopenharmony_ci * executed on those machines. Defining these macros here keeps the 2873d0407baSopenharmony_ci * rest of the code free from ifdefs. 2883d0407baSopenharmony_ci */ 2893d0407baSopenharmony_ci#define mci_readq(dev, reg) \ 2903d0407baSopenharmony_ci (*(u64 __force *)((dev)->regs + SDMMC_##reg)) 2913d0407baSopenharmony_ci#define mci_writeq(dev, reg, value) \ 2923d0407baSopenharmony_ci (*(u64 __force *)((dev)->regs + SDMMC_##reg) = (value)) 2933d0407baSopenharmony_ci#endif 2943d0407baSopenharmony_ci#ifdef CONFIG_PM 2953d0407baSopenharmony_ciextern int dw_mci_suspend(struct dw_mci *host); 2963d0407baSopenharmony_ciextern int dw_mci_resume(struct dw_mci *host); 2973d0407baSopenharmony_ci#endif 2983d0407baSopenharmony_cistatic const struct dw_mci_rst_ops dw_mci_pdrst_ops; 2993d0407baSopenharmony_ci 3003d0407baSopenharmony_ci/** 3013d0407baSopenharmony_ci * struct dw_mci_slot - MMC slot state 3023d0407baSopenharmony_ci * @mmc: The mmc_host representing this slot. 3033d0407baSopenharmony_ci * @host: The MMC controller this slot is using. 3043d0407baSopenharmony_ci * @quirks: Slot-level quirks (DW_MCI_SLOT_QUIRK_XXX) 3053d0407baSopenharmony_ci * @wp_gpio: If gpio_is_valid() we'll use this to read write protect. 3063d0407baSopenharmony_ci * @ctype: Card type for this slot. 3073d0407baSopenharmony_ci * @mrq: mmc_request currently being processed or waiting to be 3083d0407baSopenharmony_ci * processed, or NULL when the slot is idle. 3093d0407baSopenharmony_ci * @queue_node: List node for placing this node in the @queue list of 3103d0407baSopenharmony_ci * &struct dw_mci. 3113d0407baSopenharmony_ci * @clock: Clock rate configured by set_ios(). Protected by host->lock. 3123d0407baSopenharmony_ci * @__clk_old: The last updated clock with reflecting clock divider. 3133d0407baSopenharmony_ci * Keeping track of this helps us to avoid spamming the console 3143d0407baSopenharmony_ci * with CONFIG_MMC_CLKGATE. 3153d0407baSopenharmony_ci * @flags: Random state bits associated with the slot. 3163d0407baSopenharmony_ci * @id: Number of this slot. 3173d0407baSopenharmony_ci * @last_detect_state: Most recently observed card detect state. 3183d0407baSopenharmony_ci */ 3193d0407baSopenharmony_cistruct dw_mci_slot { 3203d0407baSopenharmony_cistruct mmc_host *mmc; 3213d0407baSopenharmony_cistruct dw_mci *host; 3223d0407baSopenharmony_ciint quirks; 3233d0407baSopenharmony_ciint wp_gpio; 3243d0407baSopenharmony_ciint cd_gpio; 3253d0407baSopenharmony_ciint pwr_en_gpio; 3263d0407baSopenharmony_ciu32 ctype; 3273d0407baSopenharmony_ciu32 pre_ctype; 3283d0407baSopenharmony_ci 3293d0407baSopenharmony_cistruct mmc_request *mrq; 3303d0407baSopenharmony_cistruct list_head queue_node; 3313d0407baSopenharmony_ci 3323d0407baSopenharmony_ciunsigned int clock; 3333d0407baSopenharmony_ciunsigned int __clk_old; 3343d0407baSopenharmony_ci 3353d0407baSopenharmony_ciunsigned long flags; 3363d0407baSopenharmony_ci#define DW_MMC_CARD_PRESENT 0 3373d0407baSopenharmony_ci#define DW_MMC_CARD_NEED_INIT 1 3383d0407baSopenharmony_ciint id; 3393d0407baSopenharmony_ciint last_detect_state; 3403d0407baSopenharmony_ci}; 3413d0407baSopenharmony_ci 3423d0407baSopenharmony_cistruct dw_mci_tuning_data { 3433d0407baSopenharmony_ci const u8 *blk_pattern; 3443d0407baSopenharmony_ci unsigned int blksz; 3453d0407baSopenharmony_ci}; 3463d0407baSopenharmony_ci 3473d0407baSopenharmony_ci/** 3483d0407baSopenharmony_ci * dw_mci driver data - dw-mshc implementation specific driver data. 3493d0407baSopenharmony_ci * @caps: mmc subsystem specified capabilities of the controller(s). 3503d0407baSopenharmony_ci * @hold_reg_flag: Fixed the value of HOLG_REG 3513d0407baSopenharmony_ci * @init: early implementation specific initialization. 3523d0407baSopenharmony_ci * @setup_clock: implementation specific clock configuration. 3533d0407baSopenharmony_ci * @prepare_command: handle CMD register extensions. 3543d0407baSopenharmony_ci * @set_ios: handle bus specific extensions. 3553d0407baSopenharmony_ci * @parse_dt: parse implementation specific device tree properties. 3563d0407baSopenharmony_ci * 3573d0407baSopenharmony_ci * Provide controller implementation specific extensions. The usage of this 3583d0407baSopenharmony_ci * data structure is fully optional and usage of each member in this structure 3593d0407baSopenharmony_ci * is optional as well. 3603d0407baSopenharmony_ci */ 3613d0407baSopenharmony_ci 3623d0407baSopenharmony_cistruct dw_mci_drv_data { 3633d0407baSopenharmony_ci unsigned long *caps; 3643d0407baSopenharmony_ci unsigned int *hold_reg_flag; 3653d0407baSopenharmony_ci 3663d0407baSopenharmony_ci int (*init)(struct dw_mci *host); 3673d0407baSopenharmony_ci int (*setup_clock)(struct dw_mci *host); 3683d0407baSopenharmony_ci void (*prepare_command)(struct dw_mci *host, u32 *cmdr); 3693d0407baSopenharmony_ci void (*set_ios)(struct dw_mci *host, struct mmc_ios *ios); 3703d0407baSopenharmony_ci int (*parse_dt)(struct dw_mci *host); 3713d0407baSopenharmony_ci int (*execute_tuning)(struct dw_mci_slot *slot, 3723d0407baSopenharmony_ci u32 opcode, 3733d0407baSopenharmony_ci struct dw_mci_tuning_data 3743d0407baSopenharmony_ci *tuning_data); 3753d0407baSopenharmony_ci}; 3763d0407baSopenharmony_ci 3773d0407baSopenharmony_ci/* Variations in Rockchip specific dw-mshc controller */ 3783d0407baSopenharmony_cienum dw_mci_rockchip_type { 3793d0407baSopenharmony_ciDW_MCI_TYPE_RK3188, 3803d0407baSopenharmony_ciDW_MCI_TYPE_RK3288, 3813d0407baSopenharmony_ciDW_MCI_TYPE_RK3036, 3823d0407baSopenharmony_ciDW_MCI_TYPE_RK312X, 3833d0407baSopenharmony_ciDW_MCI_TYPE_RK3368, 3843d0407baSopenharmony_ciDW_MCI_TYPE_RK3228, 3853d0407baSopenharmony_ci}; 3863d0407baSopenharmony_ci 3873d0407baSopenharmony_ci#endif /* _DW_MMC_H_ */ 388