0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _UFS_EXYNOS_H_
0010 #define _UFS_EXYNOS_H_
0011
0012
0013
0014
0015 #define UNIPRO_DBG_FORCE_DME_CTRL_STATE 0x150
0016
0017
0018
0019
0020 #define PA_DBG_CLK_PERIOD 0x9514
0021 #define PA_DBG_TXPHY_CFGUPDT 0x9518
0022 #define PA_DBG_RXPHY_CFGUPDT 0x9519
0023 #define PA_DBG_MODE 0x9529
0024 #define PA_DBG_SKIP_RESET_PHY 0x9539
0025 #define PA_DBG_AUTOMODE_THLD 0x9536
0026 #define PA_DBG_OV_TM 0x9540
0027 #define PA_DBG_SKIP_LINE_RESET 0x9541
0028 #define PA_DBG_LINE_RESET_REQ 0x9543
0029 #define PA_DBG_OPTION_SUITE 0x9564
0030 #define PA_DBG_OPTION_SUITE_DYN 0x9565
0031
0032
0033
0034
0035 #define T_DBG_SKIP_INIT_HIBERN8_EXIT 0xc001
0036
0037
0038
0039
0040 #define TX_LINERESET_N_VAL 0x0277
0041 #define TX_LINERESET_N(v) (((v) >> 10) & 0xFF)
0042 #define TX_LINERESET_P_VAL 0x027D
0043 #define TX_LINERESET_P(v) (((v) >> 12) & 0xFF)
0044 #define TX_OV_SLEEP_CNT_TIMER 0x028E
0045 #define TX_OV_H8_ENTER_EN (1 << 7)
0046 #define TX_OV_SLEEP_CNT(v) (((v) >> 5) & 0x7F)
0047 #define TX_HIGH_Z_CNT_11_08 0x028C
0048 #define TX_HIGH_Z_CNT_H(v) (((v) >> 8) & 0xF)
0049 #define TX_HIGH_Z_CNT_07_00 0x028D
0050 #define TX_HIGH_Z_CNT_L(v) ((v) & 0xFF)
0051 #define TX_BASE_NVAL_07_00 0x0293
0052 #define TX_BASE_NVAL_L(v) ((v) & 0xFF)
0053 #define TX_BASE_NVAL_15_08 0x0294
0054 #define TX_BASE_NVAL_H(v) (((v) >> 8) & 0xFF)
0055 #define TX_GRAN_NVAL_07_00 0x0295
0056 #define TX_GRAN_NVAL_L(v) ((v) & 0xFF)
0057 #define TX_GRAN_NVAL_10_08 0x0296
0058 #define TX_GRAN_NVAL_H(v) (((v) >> 8) & 0x3)
0059
0060 #define VND_TX_CLK_PRD 0xAA
0061 #define VND_TX_CLK_PRD_EN 0xA9
0062 #define VND_TX_LINERESET_PVALUE0 0xAD
0063 #define VND_TX_LINERESET_PVALUE1 0xAC
0064 #define VND_TX_LINERESET_PVALUE2 0xAB
0065
0066 #define TX_LINE_RESET_TIME 3200
0067
0068 #define VND_RX_CLK_PRD 0x12
0069 #define VND_RX_CLK_PRD_EN 0x11
0070 #define VND_RX_LINERESET_VALUE0 0x1D
0071 #define VND_RX_LINERESET_VALUE1 0x1C
0072 #define VND_RX_LINERESET_VALUE2 0x1B
0073
0074 #define RX_LINE_RESET_TIME 1000
0075
0076 #define RX_FILLER_ENABLE 0x0316
0077 #define RX_FILLER_EN (1 << 1)
0078 #define RX_LINERESET_VAL 0x0317
0079 #define RX_LINERESET(v) (((v) >> 12) & 0xFF)
0080 #define RX_LCC_IGNORE 0x0318
0081 #define RX_SYNC_MASK_LENGTH 0x0321
0082 #define RX_HIBERN8_WAIT_VAL_BIT_20_16 0x0331
0083 #define RX_HIBERN8_WAIT_VAL_BIT_15_08 0x0332
0084 #define RX_HIBERN8_WAIT_VAL_BIT_07_00 0x0333
0085 #define RX_OV_SLEEP_CNT_TIMER 0x0340
0086 #define RX_OV_SLEEP_CNT(v) (((v) >> 6) & 0x1F)
0087 #define RX_OV_STALL_CNT_TIMER 0x0341
0088 #define RX_OV_STALL_CNT(v) (((v) >> 4) & 0xFF)
0089 #define RX_BASE_NVAL_07_00 0x0355
0090 #define RX_BASE_NVAL_L(v) ((v) & 0xFF)
0091 #define RX_BASE_NVAL_15_08 0x0354
0092 #define RX_BASE_NVAL_H(v) (((v) >> 8) & 0xFF)
0093 #define RX_GRAN_NVAL_07_00 0x0353
0094 #define RX_GRAN_NVAL_L(v) ((v) & 0xFF)
0095 #define RX_GRAN_NVAL_10_08 0x0352
0096 #define RX_GRAN_NVAL_H(v) (((v) >> 8) & 0x3)
0097
0098 #define CMN_PWM_CLK_CTRL 0x0402
0099 #define PWM_CLK_CTRL_MASK 0x3
0100
0101 #define IATOVAL_NSEC 20000
0102 #define UNIPRO_PCLK_PERIOD(ufs) (NSEC_PER_SEC / ufs->pclk_rate)
0103
0104 struct exynos_ufs;
0105
0106
0107 #define SLOW 1
0108 #define FAST 2
0109
0110 #define RX_ADV_FINE_GRAN_SUP_EN 0x1
0111 #define RX_ADV_FINE_GRAN_STEP_VAL 0x3
0112 #define RX_ADV_MIN_ACTV_TIME_CAP 0x9
0113
0114 #define PA_GRANULARITY_VAL 0x6
0115 #define PA_TACTIVATE_VAL 0x3
0116 #define PA_HIBERN8TIME_VAL 0x20
0117
0118 #define PCLK_AVAIL_MIN 70000000
0119 #define PCLK_AVAIL_MAX 167000000
0120
0121 struct exynos_ufs_uic_attr {
0122
0123 unsigned int tx_trailingclks;
0124 unsigned int tx_dif_p_nsec;
0125 unsigned int tx_dif_n_nsec;
0126 unsigned int tx_high_z_cnt_nsec;
0127 unsigned int tx_base_unit_nsec;
0128 unsigned int tx_gran_unit_nsec;
0129 unsigned int tx_sleep_cnt;
0130 unsigned int tx_min_activatetime;
0131
0132 unsigned int rx_filler_enable;
0133 unsigned int rx_dif_p_nsec;
0134 unsigned int rx_hibern8_wait_nsec;
0135 unsigned int rx_base_unit_nsec;
0136 unsigned int rx_gran_unit_nsec;
0137 unsigned int rx_sleep_cnt;
0138 unsigned int rx_stall_cnt;
0139 unsigned int rx_hs_g1_sync_len_cap;
0140 unsigned int rx_hs_g2_sync_len_cap;
0141 unsigned int rx_hs_g3_sync_len_cap;
0142 unsigned int rx_hs_g1_prep_sync_len_cap;
0143 unsigned int rx_hs_g2_prep_sync_len_cap;
0144 unsigned int rx_hs_g3_prep_sync_len_cap;
0145
0146 unsigned int cmn_pwm_clk_ctrl;
0147
0148 unsigned int pa_dbg_option_suite;
0149
0150 unsigned int rx_adv_fine_gran_sup_en;
0151 unsigned int rx_adv_fine_gran_step;
0152 unsigned int rx_min_actv_time_cap;
0153 unsigned int rx_hibern8_time_cap;
0154 unsigned int rx_adv_min_actv_time_cap;
0155 unsigned int rx_adv_hibern8_time_cap;
0156 unsigned int pa_granularity;
0157 unsigned int pa_tactivate;
0158 unsigned int pa_hibern8time;
0159 };
0160
0161 struct exynos_ufs_drv_data {
0162 const struct ufs_hba_variant_ops *vops;
0163 struct exynos_ufs_uic_attr *uic_attr;
0164 unsigned int quirks;
0165 unsigned int opts;
0166
0167 int (*drv_init)(struct device *dev, struct exynos_ufs *ufs);
0168 int (*pre_link)(struct exynos_ufs *ufs);
0169 int (*post_link)(struct exynos_ufs *ufs);
0170 int (*pre_pwr_change)(struct exynos_ufs *ufs,
0171 struct ufs_pa_layer_attr *pwr);
0172 int (*post_pwr_change)(struct exynos_ufs *ufs,
0173 struct ufs_pa_layer_attr *pwr);
0174 int (*pre_hce_enable)(struct exynos_ufs *ufs);
0175 int (*post_hce_enable)(struct exynos_ufs *ufs);
0176 };
0177
0178 struct ufs_phy_time_cfg {
0179 u32 tx_linereset_p;
0180 u32 tx_linereset_n;
0181 u32 tx_high_z_cnt;
0182 u32 tx_base_n_val;
0183 u32 tx_gran_n_val;
0184 u32 tx_sleep_cnt;
0185 u32 rx_linereset;
0186 u32 rx_hibern8_wait;
0187 u32 rx_base_n_val;
0188 u32 rx_gran_n_val;
0189 u32 rx_sleep_cnt;
0190 u32 rx_stall_cnt;
0191 };
0192
0193 struct exynos_ufs {
0194 struct ufs_hba *hba;
0195 struct phy *phy;
0196 void __iomem *reg_hci;
0197 void __iomem *reg_unipro;
0198 void __iomem *reg_ufsp;
0199 struct clk *clk_hci_core;
0200 struct clk *clk_unipro_main;
0201 struct clk *clk_apb;
0202 u32 pclk_rate;
0203 u32 pclk_div;
0204 u32 pclk_avail_min;
0205 u32 pclk_avail_max;
0206 unsigned long mclk_rate;
0207 int avail_ln_rx;
0208 int avail_ln_tx;
0209 int rx_sel_idx;
0210 struct ufs_pa_layer_attr dev_req_params;
0211 struct ufs_phy_time_cfg t_cfg;
0212 ktime_t entry_hibern8_t;
0213 const struct exynos_ufs_drv_data *drv_data;
0214 struct regmap *sysreg;
0215 u32 shareability_reg_offset;
0216
0217 u32 opts;
0218 #define EXYNOS_UFS_OPT_HAS_APB_CLK_CTRL BIT(0)
0219 #define EXYNOS_UFS_OPT_SKIP_CONNECTION_ESTAB BIT(1)
0220 #define EXYNOS_UFS_OPT_BROKEN_AUTO_CLK_CTRL BIT(2)
0221 #define EXYNOS_UFS_OPT_BROKEN_RX_SEL_IDX BIT(3)
0222 #define EXYNOS_UFS_OPT_USE_SW_HIBERN8_TIMER BIT(4)
0223 #define EXYNOS_UFS_OPT_SKIP_CONFIG_PHY_ATTR BIT(5)
0224 };
0225
0226 #define for_each_ufs_rx_lane(ufs, i) \
0227 for (i = (ufs)->rx_sel_idx; \
0228 i < (ufs)->rx_sel_idx + (ufs)->avail_ln_rx; i++)
0229 #define for_each_ufs_tx_lane(ufs, i) \
0230 for (i = 0; i < (ufs)->avail_ln_tx; i++)
0231
0232 #define EXYNOS_UFS_MMIO_FUNC(name) \
0233 static inline void name##_writel(struct exynos_ufs *ufs, u32 val, u32 reg)\
0234 { \
0235 writel(val, ufs->reg_##name + reg); \
0236 } \
0237 \
0238 static inline u32 name##_readl(struct exynos_ufs *ufs, u32 reg) \
0239 { \
0240 return readl(ufs->reg_##name + reg); \
0241 }
0242
0243 EXYNOS_UFS_MMIO_FUNC(hci);
0244 EXYNOS_UFS_MMIO_FUNC(unipro);
0245 EXYNOS_UFS_MMIO_FUNC(ufsp);
0246 #undef EXYNOS_UFS_MMIO_FUNC
0247
0248 long exynos_ufs_calc_time_cntr(struct exynos_ufs *, long);
0249
0250 static inline void exynos_ufs_enable_ov_tm(struct ufs_hba *hba)
0251 {
0252 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_DBG_OV_TM), true);
0253 }
0254
0255 static inline void exynos_ufs_disable_ov_tm(struct ufs_hba *hba)
0256 {
0257 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_DBG_OV_TM), false);
0258 }
0259
0260 static inline void exynos_ufs_enable_dbg_mode(struct ufs_hba *hba)
0261 {
0262 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_DBG_MODE), true);
0263 }
0264
0265 static inline void exynos_ufs_disable_dbg_mode(struct ufs_hba *hba)
0266 {
0267 ufshcd_dme_set(hba, UIC_ARG_MIB(PA_DBG_MODE), false);
0268 }
0269
0270 #endif