1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Driver for MMC and SSD cards for Cavium OCTEON and ThunderX SOCs. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * This file is subject to the terms and conditions of the GNU General Public 5*4882a593Smuzhiyun * License. See the file "COPYING" in the main directory of this archive 6*4882a593Smuzhiyun * for more details. 7*4882a593Smuzhiyun * 8*4882a593Smuzhiyun * Copyright (C) 2012-2017 Cavium Inc. 9*4882a593Smuzhiyun */ 10*4882a593Smuzhiyun 11*4882a593Smuzhiyun #ifndef _CAVIUM_MMC_H_ 12*4882a593Smuzhiyun #define _CAVIUM_MMC_H_ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <linux/bitops.h> 15*4882a593Smuzhiyun #include <linux/clk.h> 16*4882a593Smuzhiyun #include <linux/gpio/consumer.h> 17*4882a593Smuzhiyun #include <linux/io.h> 18*4882a593Smuzhiyun #include <linux/mmc/host.h> 19*4882a593Smuzhiyun #include <linux/of.h> 20*4882a593Smuzhiyun #include <linux/scatterlist.h> 21*4882a593Smuzhiyun #include <linux/semaphore.h> 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun #define CAVIUM_MAX_MMC 4 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun /* DMA register addresses */ 26*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CFG(x) (0x00 + x->reg_off_dma) 27*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_ADR(x) (0x10 + x->reg_off_dma) 28*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD(x) (0x18 + x->reg_off_dma) 29*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG(x) (0x20 + x->reg_off_dma) 30*4882a593Smuzhiyun #define MIO_EMM_DMA_ADR(x) (0x28 + x->reg_off_dma) 31*4882a593Smuzhiyun #define MIO_EMM_DMA_INT(x) (0x30 + x->reg_off_dma) 32*4882a593Smuzhiyun #define MIO_EMM_DMA_INT_W1S(x) (0x38 + x->reg_off_dma) 33*4882a593Smuzhiyun #define MIO_EMM_DMA_INT_ENA_W1S(x) (0x40 + x->reg_off_dma) 34*4882a593Smuzhiyun #define MIO_EMM_DMA_INT_ENA_W1C(x) (0x48 + x->reg_off_dma) 35*4882a593Smuzhiyun 36*4882a593Smuzhiyun /* register addresses */ 37*4882a593Smuzhiyun #define MIO_EMM_CFG(x) (0x00 + x->reg_off) 38*4882a593Smuzhiyun #define MIO_EMM_SWITCH(x) (0x48 + x->reg_off) 39*4882a593Smuzhiyun #define MIO_EMM_DMA(x) (0x50 + x->reg_off) 40*4882a593Smuzhiyun #define MIO_EMM_CMD(x) (0x58 + x->reg_off) 41*4882a593Smuzhiyun #define MIO_EMM_RSP_STS(x) (0x60 + x->reg_off) 42*4882a593Smuzhiyun #define MIO_EMM_RSP_LO(x) (0x68 + x->reg_off) 43*4882a593Smuzhiyun #define MIO_EMM_RSP_HI(x) (0x70 + x->reg_off) 44*4882a593Smuzhiyun #define MIO_EMM_INT(x) (0x78 + x->reg_off) 45*4882a593Smuzhiyun #define MIO_EMM_INT_EN(x) (0x80 + x->reg_off) 46*4882a593Smuzhiyun #define MIO_EMM_WDOG(x) (0x88 + x->reg_off) 47*4882a593Smuzhiyun #define MIO_EMM_SAMPLE(x) (0x90 + x->reg_off) 48*4882a593Smuzhiyun #define MIO_EMM_STS_MASK(x) (0x98 + x->reg_off) 49*4882a593Smuzhiyun #define MIO_EMM_RCA(x) (0xa0 + x->reg_off) 50*4882a593Smuzhiyun #define MIO_EMM_INT_EN_SET(x) (0xb0 + x->reg_off) 51*4882a593Smuzhiyun #define MIO_EMM_INT_EN_CLR(x) (0xb8 + x->reg_off) 52*4882a593Smuzhiyun #define MIO_EMM_BUF_IDX(x) (0xe0 + x->reg_off) 53*4882a593Smuzhiyun #define MIO_EMM_BUF_DAT(x) (0xe8 + x->reg_off) 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun struct cvm_mmc_host { 56*4882a593Smuzhiyun struct device *dev; 57*4882a593Smuzhiyun void __iomem *base; 58*4882a593Smuzhiyun void __iomem *dma_base; 59*4882a593Smuzhiyun int reg_off; 60*4882a593Smuzhiyun int reg_off_dma; 61*4882a593Smuzhiyun u64 emm_cfg; 62*4882a593Smuzhiyun u64 n_minus_one; /* OCTEON II workaround location */ 63*4882a593Smuzhiyun int last_slot; 64*4882a593Smuzhiyun struct clk *clk; 65*4882a593Smuzhiyun int sys_freq; 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun struct mmc_request *current_req; 68*4882a593Smuzhiyun struct sg_mapping_iter smi; 69*4882a593Smuzhiyun bool dma_active; 70*4882a593Smuzhiyun bool use_sg; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun bool has_ciu3; 73*4882a593Smuzhiyun bool big_dma_addr; 74*4882a593Smuzhiyun bool need_irq_handler_lock; 75*4882a593Smuzhiyun spinlock_t irq_handler_lock; 76*4882a593Smuzhiyun struct semaphore mmc_serializer; 77*4882a593Smuzhiyun 78*4882a593Smuzhiyun struct gpio_desc *global_pwr_gpiod; 79*4882a593Smuzhiyun atomic_t shared_power_users; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun struct cvm_mmc_slot *slot[CAVIUM_MAX_MMC]; 82*4882a593Smuzhiyun struct platform_device *slot_pdev[CAVIUM_MAX_MMC]; 83*4882a593Smuzhiyun 84*4882a593Smuzhiyun void (*set_shared_power)(struct cvm_mmc_host *, int); 85*4882a593Smuzhiyun void (*acquire_bus)(struct cvm_mmc_host *); 86*4882a593Smuzhiyun void (*release_bus)(struct cvm_mmc_host *); 87*4882a593Smuzhiyun void (*int_enable)(struct cvm_mmc_host *, u64); 88*4882a593Smuzhiyun /* required on some MIPS models */ 89*4882a593Smuzhiyun void (*dmar_fixup)(struct cvm_mmc_host *, struct mmc_command *, 90*4882a593Smuzhiyun struct mmc_data *, u64); 91*4882a593Smuzhiyun void (*dmar_fixup_done)(struct cvm_mmc_host *); 92*4882a593Smuzhiyun }; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct cvm_mmc_slot { 95*4882a593Smuzhiyun struct mmc_host *mmc; /* slot-level mmc_core object */ 96*4882a593Smuzhiyun struct cvm_mmc_host *host; /* common hw for all slots */ 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun u64 clock; 99*4882a593Smuzhiyun 100*4882a593Smuzhiyun u64 cached_switch; 101*4882a593Smuzhiyun u64 cached_rca; 102*4882a593Smuzhiyun 103*4882a593Smuzhiyun unsigned int cmd_cnt; /* sample delay */ 104*4882a593Smuzhiyun unsigned int dat_cnt; /* sample delay */ 105*4882a593Smuzhiyun 106*4882a593Smuzhiyun int bus_id; 107*4882a593Smuzhiyun }; 108*4882a593Smuzhiyun 109*4882a593Smuzhiyun struct cvm_mmc_cr_type { 110*4882a593Smuzhiyun u8 ctype; 111*4882a593Smuzhiyun u8 rtype; 112*4882a593Smuzhiyun }; 113*4882a593Smuzhiyun 114*4882a593Smuzhiyun struct cvm_mmc_cr_mods { 115*4882a593Smuzhiyun u8 ctype_xor; 116*4882a593Smuzhiyun u8 rtype_xor; 117*4882a593Smuzhiyun }; 118*4882a593Smuzhiyun 119*4882a593Smuzhiyun /* Bitfield definitions */ 120*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CFG_CLR BIT_ULL(16) 121*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CFG_INT_LVL GENMASK_ULL(12, 8) 122*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CFG_COUNT GENMASK_ULL(4, 0) 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_RW BIT_ULL(62) 125*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_INTDIS BIT_ULL(60) 126*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_SWAP32 BIT_ULL(59) 127*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_SWAP16 BIT_ULL(58) 128*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_SWAP8 BIT_ULL(57) 129*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_ENDIAN BIT_ULL(56) 130*4882a593Smuzhiyun #define MIO_EMM_DMA_FIFO_CMD_SIZE GENMASK_ULL(55, 36) 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #define MIO_EMM_CMD_SKIP_BUSY BIT_ULL(62) 133*4882a593Smuzhiyun #define MIO_EMM_CMD_BUS_ID GENMASK_ULL(61, 60) 134*4882a593Smuzhiyun #define MIO_EMM_CMD_VAL BIT_ULL(59) 135*4882a593Smuzhiyun #define MIO_EMM_CMD_DBUF BIT_ULL(55) 136*4882a593Smuzhiyun #define MIO_EMM_CMD_OFFSET GENMASK_ULL(54, 49) 137*4882a593Smuzhiyun #define MIO_EMM_CMD_CTYPE_XOR GENMASK_ULL(42, 41) 138*4882a593Smuzhiyun #define MIO_EMM_CMD_RTYPE_XOR GENMASK_ULL(40, 38) 139*4882a593Smuzhiyun #define MIO_EMM_CMD_IDX GENMASK_ULL(37, 32) 140*4882a593Smuzhiyun #define MIO_EMM_CMD_ARG GENMASK_ULL(31, 0) 141*4882a593Smuzhiyun 142*4882a593Smuzhiyun #define MIO_EMM_DMA_SKIP_BUSY BIT_ULL(62) 143*4882a593Smuzhiyun #define MIO_EMM_DMA_BUS_ID GENMASK_ULL(61, 60) 144*4882a593Smuzhiyun #define MIO_EMM_DMA_VAL BIT_ULL(59) 145*4882a593Smuzhiyun #define MIO_EMM_DMA_SECTOR BIT_ULL(58) 146*4882a593Smuzhiyun #define MIO_EMM_DMA_DAT_NULL BIT_ULL(57) 147*4882a593Smuzhiyun #define MIO_EMM_DMA_THRES GENMASK_ULL(56, 51) 148*4882a593Smuzhiyun #define MIO_EMM_DMA_REL_WR BIT_ULL(50) 149*4882a593Smuzhiyun #define MIO_EMM_DMA_RW BIT_ULL(49) 150*4882a593Smuzhiyun #define MIO_EMM_DMA_MULTI BIT_ULL(48) 151*4882a593Smuzhiyun #define MIO_EMM_DMA_BLOCK_CNT GENMASK_ULL(47, 32) 152*4882a593Smuzhiyun #define MIO_EMM_DMA_CARD_ADDR GENMASK_ULL(31, 0) 153*4882a593Smuzhiyun 154*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_EN BIT_ULL(63) 155*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_RW BIT_ULL(62) 156*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_CLR BIT_ULL(61) 157*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_SWAP32 BIT_ULL(59) 158*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_SWAP16 BIT_ULL(58) 159*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_SWAP8 BIT_ULL(57) 160*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_ENDIAN BIT_ULL(56) 161*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_SIZE GENMASK_ULL(55, 36) 162*4882a593Smuzhiyun #define MIO_EMM_DMA_CFG_ADR GENMASK_ULL(35, 0) 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun #define MIO_EMM_INT_SWITCH_ERR BIT_ULL(6) 165*4882a593Smuzhiyun #define MIO_EMM_INT_SWITCH_DONE BIT_ULL(5) 166*4882a593Smuzhiyun #define MIO_EMM_INT_DMA_ERR BIT_ULL(4) 167*4882a593Smuzhiyun #define MIO_EMM_INT_CMD_ERR BIT_ULL(3) 168*4882a593Smuzhiyun #define MIO_EMM_INT_DMA_DONE BIT_ULL(2) 169*4882a593Smuzhiyun #define MIO_EMM_INT_CMD_DONE BIT_ULL(1) 170*4882a593Smuzhiyun #define MIO_EMM_INT_BUF_DONE BIT_ULL(0) 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_BUS_ID GENMASK_ULL(61, 60) 173*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_CMD_VAL BIT_ULL(59) 174*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_SWITCH_VAL BIT_ULL(58) 175*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_DMA_VAL BIT_ULL(57) 176*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_DMA_PEND BIT_ULL(56) 177*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_DBUF_ERR BIT_ULL(28) 178*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_DBUF BIT_ULL(23) 179*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_BLK_TIMEOUT BIT_ULL(22) 180*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_BLK_CRC_ERR BIT_ULL(21) 181*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_BUSYBIT BIT_ULL(20) 182*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_STP_TIMEOUT BIT_ULL(19) 183*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_STP_CRC_ERR BIT_ULL(18) 184*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_STP_BAD_STS BIT_ULL(17) 185*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_STP_VAL BIT_ULL(16) 186*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_TIMEOUT BIT_ULL(15) 187*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_CRC_ERR BIT_ULL(14) 188*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_BAD_STS BIT_ULL(13) 189*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_VAL BIT_ULL(12) 190*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_RSP_TYPE GENMASK_ULL(11, 9) 191*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_CMD_TYPE GENMASK_ULL(8, 7) 192*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_CMD_IDX GENMASK_ULL(6, 1) 193*4882a593Smuzhiyun #define MIO_EMM_RSP_STS_CMD_DONE BIT_ULL(0) 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun #define MIO_EMM_SAMPLE_CMD_CNT GENMASK_ULL(25, 16) 196*4882a593Smuzhiyun #define MIO_EMM_SAMPLE_DAT_CNT GENMASK_ULL(9, 0) 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun #define MIO_EMM_SWITCH_BUS_ID GENMASK_ULL(61, 60) 199*4882a593Smuzhiyun #define MIO_EMM_SWITCH_EXE BIT_ULL(59) 200*4882a593Smuzhiyun #define MIO_EMM_SWITCH_ERR0 BIT_ULL(58) 201*4882a593Smuzhiyun #define MIO_EMM_SWITCH_ERR1 BIT_ULL(57) 202*4882a593Smuzhiyun #define MIO_EMM_SWITCH_ERR2 BIT_ULL(56) 203*4882a593Smuzhiyun #define MIO_EMM_SWITCH_HS_TIMING BIT_ULL(48) 204*4882a593Smuzhiyun #define MIO_EMM_SWITCH_BUS_WIDTH GENMASK_ULL(42, 40) 205*4882a593Smuzhiyun #define MIO_EMM_SWITCH_POWER_CLASS GENMASK_ULL(35, 32) 206*4882a593Smuzhiyun #define MIO_EMM_SWITCH_CLK_HI GENMASK_ULL(31, 16) 207*4882a593Smuzhiyun #define MIO_EMM_SWITCH_CLK_LO GENMASK_ULL(15, 0) 208*4882a593Smuzhiyun 209*4882a593Smuzhiyun /* Protoypes */ 210*4882a593Smuzhiyun irqreturn_t cvm_mmc_interrupt(int irq, void *dev_id); 211*4882a593Smuzhiyun int cvm_mmc_of_slot_probe(struct device *dev, struct cvm_mmc_host *host); 212*4882a593Smuzhiyun int cvm_mmc_of_slot_remove(struct cvm_mmc_slot *slot); 213*4882a593Smuzhiyun extern const char *cvm_mmc_irq_names[]; 214*4882a593Smuzhiyun 215*4882a593Smuzhiyun #endif 216