Suneel Garapati | 40e6133 | 2019-10-19 18:03:01 -0700 | [diff] [blame] | 1 | /* SPDX-License-Identifier: GPL-2.0 |
| 2 | * |
| 3 | * Copyright (C) 2019 Marvell International Ltd. |
| 4 | * |
| 5 | * https://spdx.org/licenses |
| 6 | */ |
| 7 | #ifndef __OCTEONTX_HSMMC_H__ |
| 8 | #define __OCTEONTX_HSMMC_H__ |
| 9 | #include <asm/gpio.h> |
| 10 | |
| 11 | /** Name of our driver */ |
| 12 | #define OCTEONTX_MMC_DRIVER_NAME "octeontx-hsmmc" |
| 13 | |
| 14 | /** Maximum supported MMC slots */ |
| 15 | #define OCTEONTX_MAX_MMC_SLOT 3 |
| 16 | |
| 17 | #define POWER_ON_TIME 40 /** See SD 4.1 spec figure 6-5 */ |
| 18 | |
| 19 | /** |
| 20 | * Timeout used when waiting for commands to complete. We need to keep this |
| 21 | * above the hardware watchdog timeout which is usually limited to 1000ms |
| 22 | */ |
| 23 | #define WATCHDOG_COUNT (1100) /* in msecs */ |
| 24 | |
| 25 | /** |
| 26 | * Long timeout for commands which might take a while to complete. |
| 27 | */ |
| 28 | #define MMC_TIMEOUT_LONG 1000 |
| 29 | |
| 30 | /** |
| 31 | * Short timeout used for most commands in msecs |
| 32 | */ |
| 33 | #define MMC_TIMEOUT_SHORT 20 |
| 34 | |
| 35 | #define NSEC_PER_SEC 1000000000L |
| 36 | |
| 37 | #define MAX_NO_OF_TAPS 64 |
| 38 | |
| 39 | #define EXT_CSD_POWER_CLASS 187 /* R/W */ |
| 40 | |
| 41 | /* default HS400 tuning block number */ |
| 42 | #define DEFAULT_HS400_TUNING_BLOCK 1 |
| 43 | |
| 44 | struct octeontx_mmc_host; |
| 45 | |
| 46 | /** MMC/SD slot data structure */ |
| 47 | struct octeontx_mmc_slot { |
| 48 | struct mmc mmc; |
| 49 | struct mmc_config cfg; |
| 50 | struct octeontx_mmc_host *host; |
| 51 | struct udevice *dev; |
| 52 | void *base_addr; /** Same as host base_addr */ |
| 53 | u64 clock; |
| 54 | int bus_id; /** slot number */ |
| 55 | uint bus_width; |
| 56 | uint max_width; |
| 57 | int hs200_tap_adj; |
| 58 | int hs400_tap_adj; |
| 59 | int hs400_tuning_block; |
| 60 | struct gpio_desc cd_gpio; |
| 61 | struct gpio_desc wp_gpio; |
| 62 | struct gpio_desc power_gpio; |
| 63 | enum bus_mode mode; |
| 64 | union mio_emm_switch cached_switch; |
| 65 | union mio_emm_switch want_switch; |
| 66 | union mio_emm_rca cached_rca; |
| 67 | union mio_emm_timing taps; /* otx2: MIO_EMM_TIMING */ |
| 68 | union mio_emm_timing hs200_taps; |
| 69 | union mio_emm_timing hs400_taps; |
| 70 | /* These are used to see if our tuning is still valid or not */ |
| 71 | enum bus_mode last_mode; |
| 72 | u32 last_clock; |
| 73 | u32 block_len; |
| 74 | u32 block_count; |
| 75 | int cmd_clk_skew; |
| 76 | int dat_clk_skew; |
| 77 | uint cmd_cnt; /* otx: sample cmd in delay */ |
| 78 | uint dat_cnt; /* otx: sample data in delay */ |
| 79 | uint drive; /* Current drive */ |
| 80 | uint slew; /* clock skew */ |
| 81 | uint cmd_out_hs200_delay; |
| 82 | uint data_out_hs200_delay; |
| 83 | uint cmd_out_hs400_delay; |
| 84 | uint data_out_hs400_delay; |
| 85 | uint clk_period; |
| 86 | bool valid:1; |
| 87 | bool is_acmd:1; |
| 88 | bool tuned:1; |
| 89 | bool hs200_tuned:1; |
| 90 | bool hs400_tuned:1; |
| 91 | bool is_1_8v:1; |
| 92 | bool is_3_3v:1; |
| 93 | bool is_ddr:1; |
| 94 | bool is_asim:1; |
| 95 | bool is_emul:1; |
| 96 | bool cd_inverted:1; |
| 97 | bool wp_inverted:1; |
| 98 | bool disable_ddr:1; |
| 99 | bool non_removable:1; |
| 100 | }; |
| 101 | |
| 102 | struct octeontx_mmc_cr_mods { |
| 103 | u8 ctype_xor; |
| 104 | u8 rtype_xor; |
| 105 | }; |
| 106 | |
| 107 | struct octeontx_mmc_cr { |
| 108 | u8 c; |
| 109 | u8 r; |
| 110 | }; |
| 111 | |
| 112 | struct octeontx_sd_mods { |
| 113 | struct octeontx_mmc_cr mmc; |
| 114 | struct octeontx_mmc_cr sd; |
| 115 | struct octeontx_mmc_cr sdacmd; |
| 116 | }; |
| 117 | |
| 118 | /** Host controller data structure */ |
| 119 | struct octeontx_mmc_host { |
| 120 | struct udevice *dev; |
| 121 | void *base_addr; |
| 122 | struct octeontx_mmc_slot slots[OCTEONTX_MAX_MMC_SLOT + 1]; |
| 123 | pci_dev_t pdev; |
| 124 | u64 sys_freq; |
| 125 | union mio_emm_cfg emm_cfg; |
| 126 | u64 timing_taps; |
| 127 | struct mmc *last_mmc; /** Last mmc used */ |
| 128 | ofnode node; |
| 129 | int cur_slotid; |
| 130 | int last_slotid; |
| 131 | int max_width; |
| 132 | uint per_tap_delay; |
| 133 | uint num_slots; |
| 134 | uint dma_wait_delay; /* Delay before polling DMA in usecs */ |
| 135 | bool initialized:1; |
| 136 | bool timing_calibrated:1; |
| 137 | bool is_asim:1; |
| 138 | bool is_emul:1; |
| 139 | bool calibrate_glitch:1; |
| 140 | bool cond_clock_glitch:1; |
| 141 | bool tap_requires_noclk:1; |
| 142 | bool hs400_skew_needed:1; |
| 143 | }; |
| 144 | |
| 145 | /* |
| 146 | * NOTE: This was copied from the Linux kernel. |
| 147 | * |
| 148 | * MMC status in R1, for native mode (SPI bits are different) |
| 149 | * Type |
| 150 | * e:error bit |
| 151 | * s:status bit |
| 152 | * r:detected and set for the actual command response |
| 153 | * x:detected and set during command execution. the host must poll |
| 154 | * the card by sending status command in order to read these bits. |
| 155 | * Clear condition |
| 156 | * a:according to the card state |
| 157 | * b:always related to the previous command. Reception of |
| 158 | * a valid command will clear it (with a delay of one command) |
| 159 | * c:clear by read |
| 160 | */ |
| 161 | #define R1_OUT_OF_RANGE BIT(31) /* er, c */ |
| 162 | #define R1_ADDRESS_ERROR BIT(30) /* erx, c */ |
| 163 | #define R1_BLOCK_LEN_ERROR BIT(29) /* er, c */ |
| 164 | #define R1_ERASE_SEQ_ERROR BIT(28) /* er, c */ |
| 165 | #define R1_ERASE_PARAM BIT(27) /* ex, c */ |
| 166 | #define R1_WP_VIOLATION BIT(26) /* erx, c */ |
| 167 | #define R1_CARD_IS_LOCKED BIT(25) /* sx, a */ |
| 168 | #define R1_LOCK_UNLOCK_FAILED BIT(24) /* erx, c */ |
| 169 | #define R1_COM_CRC_ERROR BIT(23) /* er, b */ |
| 170 | /*#define R1_ILLEGAL_COMMAND BIT(22)*/ /* er, b */ |
| 171 | #define R1_CARD_ECC_FAILED BIT(21) /* ex, c */ |
| 172 | #define R1_CC_ERROR BIT(20) /* erx, c */ |
| 173 | #define R1_ERROR BIT(19) /* erx, c */ |
| 174 | #define R1_UNDERRUN BIT(18) /* ex, c */ |
| 175 | #define R1_OVERRUN BIT(17) /* ex, c */ |
| 176 | #define R1_CID_CSD_OVERWRITE BIT(16) /* erx, c, CID/CSD overwrite */ |
| 177 | #define R1_WP_ERASE_SKIP BIT(15) /* sx, c */ |
| 178 | #define R1_CARD_ECC_DISABLED BIT(14) /* sx, a */ |
| 179 | #define R1_ERASE_RESET BIT(13) /* sr, c */ |
| 180 | #define R1_STATUS(x) ((x) & 0xFFFFE000) |
| 181 | #define R1_CURRENT_STATE(x) (((x) & 0x00001E00) >> 9) /* sx, b (4 bits) */ |
| 182 | #define R1_READY_FOR_DATA BIT(8) /* sx, a */ |
| 183 | #define R1_SWITCH_ERROR BIT(7) /* sx, c */ |
| 184 | |
| 185 | #define R1_BLOCK_READ_MASK R1_OUT_OF_RANGE | \ |
| 186 | R1_ADDRESS_ERROR | \ |
| 187 | R1_BLOCK_LEN_ERROR | \ |
| 188 | R1_CARD_IS_LOCKED | \ |
| 189 | R1_COM_CRC_ERROR | \ |
| 190 | R1_ILLEGAL_COMMAND | \ |
| 191 | R1_CARD_ECC_FAILED | \ |
| 192 | R1_CC_ERROR | \ |
| 193 | R1_ERROR |
| 194 | #define R1_BLOCK_WRITE_MASK R1_OUT_OF_RANGE | \ |
| 195 | R1_ADDRESS_ERROR | \ |
| 196 | R1_BLOCK_LEN_ERROR | \ |
| 197 | R1_WP_VIOLATION | \ |
| 198 | R1_CARD_IS_LOCKED | \ |
| 199 | R1_COM_CRC_ERROR | \ |
| 200 | R1_ILLEGAL_COMMAND | \ |
| 201 | R1_CARD_ECC_FAILED | \ |
| 202 | R1_CC_ERROR | \ |
| 203 | R1_ERROR | \ |
| 204 | R1_UNDERRUN | \ |
| 205 | R1_OVERRUN |
| 206 | |
| 207 | #endif /* __OCTEONTX_HSMMC_H__ */ |