hc
2024-02-20 102a0743326a03cd1a1202ceda21e175b7d3575c
kernel/drivers/misc/cardreader/rts5249.c
....@@ -1,19 +1,7 @@
1
+// SPDX-License-Identifier: GPL-2.0-or-later
12 /* Driver for Realtek PCI-Express card reader
23 *
34 * Copyright(c) 2009-2013 Realtek Semiconductor Corp. All rights reserved.
4
- *
5
- * This program is free software; you can redistribute it and/or modify it
6
- * under the terms of the GNU General Public License as published by the
7
- * Free Software Foundation; either version 2, or (at your option) any
8
- * later version.
9
- *
10
- * This program is distributed in the hope that it will be useful, but
11
- * WITHOUT ANY WARRANTY; without even the implied warranty of
12
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
- * General Public License for more details.
14
- *
15
- * You should have received a copy of the GNU General Public License along
16
- * with this program; if not, see <http://www.gnu.org/licenses/>.
175 *
186 * Author:
197 * Wei WANG <wei_wang@realsil.com.cn>
....@@ -67,9 +55,10 @@
6755
6856 static void rtsx_base_fetch_vendor_settings(struct rtsx_pcr *pcr)
6957 {
58
+ struct pci_dev *pdev = pcr->pci;
7059 u32 reg;
7160
72
- rtsx_pci_read_config_dword(pcr, PCR_SETTING_REG1, &reg);
61
+ pci_read_config_dword(pdev, PCR_SETTING_REG1, &reg);
7362 pcr_dbg(pcr, "Cfg 0x%x: 0x%x\n", PCR_SETTING_REG1, reg);
7463
7564 if (!rtsx_vendor_setting_valid(reg)) {
....@@ -82,55 +71,52 @@
8271 pcr->card_drive_sel &= 0x3F;
8372 pcr->card_drive_sel |= rtsx_reg_to_card_drive_sel(reg);
8473
85
- rtsx_pci_read_config_dword(pcr, PCR_SETTING_REG2, &reg);
74
+ pci_read_config_dword(pdev, PCR_SETTING_REG2, &reg);
8675 pcr_dbg(pcr, "Cfg 0x%x: 0x%x\n", PCR_SETTING_REG2, reg);
76
+ if (rtsx_check_mmc_support(reg))
77
+ pcr->extra_caps |= EXTRA_CAPS_NO_MMC;
8778 pcr->sd30_drive_sel_3v3 = rtsx_reg_to_sd30_drive_sel_3v3(reg);
8879 if (rtsx_reg_check_reverse_socket(reg))
8980 pcr->flags |= PCR_REVERSE_SOCKET;
9081 }
9182
92
-static void rtsx_base_force_power_down(struct rtsx_pcr *pcr, u8 pm_state)
93
-{
94
- /* Set relink_time to 0 */
95
- rtsx_pci_write_register(pcr, AUTOLOAD_CFG_BASE + 1, 0xFF, 0);
96
- rtsx_pci_write_register(pcr, AUTOLOAD_CFG_BASE + 2, 0xFF, 0);
97
- rtsx_pci_write_register(pcr, AUTOLOAD_CFG_BASE + 3, 0x01, 0);
98
-
99
- if (pm_state == HOST_ENTER_S3)
100
- rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3,
101
- D3_DELINK_MODE_EN, D3_DELINK_MODE_EN);
102
-
103
- rtsx_pci_write_register(pcr, FPDCTL, 0x03, 0x03);
104
-}
105
-
10683 static void rts5249_init_from_cfg(struct rtsx_pcr *pcr)
10784 {
85
+ struct pci_dev *pdev = pcr->pci;
86
+ int l1ss;
10887 struct rtsx_cr_option *option = &(pcr->option);
10988 u32 lval;
11089
111
- if (CHK_PCI_PID(pcr, PID_524A))
112
- rtsx_pci_read_config_dword(pcr,
113
- PCR_ASPM_SETTING_REG1, &lval);
114
- else
115
- rtsx_pci_read_config_dword(pcr,
116
- PCR_ASPM_SETTING_REG2, &lval);
90
+ l1ss = pci_find_ext_capability(pdev, PCI_EXT_CAP_ID_L1SS);
91
+ if (!l1ss)
92
+ return;
11793
118
- if (lval & ASPM_L1_1_EN_MASK)
94
+ pci_read_config_dword(pdev, l1ss + PCI_L1SS_CTL1, &lval);
95
+
96
+ if (CHK_PCI_PID(pcr, PID_524A) || CHK_PCI_PID(pcr, PID_525A)) {
97
+ if (0 == (lval & 0x0F))
98
+ rtsx_pci_enable_oobs_polling(pcr);
99
+ else
100
+ rtsx_pci_disable_oobs_polling(pcr);
101
+ }
102
+
103
+
104
+ if (lval & PCI_L1SS_CTL1_ASPM_L1_1)
119105 rtsx_set_dev_flag(pcr, ASPM_L1_1_EN);
120106
121
- if (lval & ASPM_L1_2_EN_MASK)
107
+ if (lval & PCI_L1SS_CTL1_ASPM_L1_2)
122108 rtsx_set_dev_flag(pcr, ASPM_L1_2_EN);
123109
124
- if (lval & PM_L1_1_EN_MASK)
110
+ if (lval & PCI_L1SS_CTL1_PCIPM_L1_1)
125111 rtsx_set_dev_flag(pcr, PM_L1_1_EN);
126112
127
- if (lval & PM_L1_2_EN_MASK)
113
+ if (lval & PCI_L1SS_CTL1_PCIPM_L1_2)
128114 rtsx_set_dev_flag(pcr, PM_L1_2_EN);
129115
130116 if (option->ltr_en) {
131117 u16 val;
132118
133
- pcie_capability_read_word(pcr->pci, PCI_EXP_DEVCTL2, &val);
119
+ pcie_capability_read_word(pdev, PCI_EXP_DEVCTL2, &val);
134120 if (val & PCI_EXP_DEVCTL2_LTR_EN) {
135121 option->ltr_enabled = true;
136122 option->ltr_active = true;
....@@ -154,6 +140,112 @@
154140 return 0;
155141 }
156142
143
+static void rts52xa_save_content_from_efuse(struct rtsx_pcr *pcr)
144
+{
145
+ u8 cnt, sv;
146
+ u16 j = 0;
147
+ u8 tmp;
148
+ u8 val;
149
+ int i;
150
+
151
+ rtsx_pci_write_register(pcr, RTS524A_PME_FORCE_CTL,
152
+ REG_EFUSE_BYPASS | REG_EFUSE_POR, REG_EFUSE_POR);
153
+ udelay(1);
154
+
155
+ pcr_dbg(pcr, "Enable efuse por!");
156
+ pcr_dbg(pcr, "save efuse to autoload");
157
+
158
+ rtsx_pci_write_register(pcr, RTS525A_EFUSE_ADD, REG_EFUSE_ADD_MASK, 0x00);
159
+ rtsx_pci_write_register(pcr, RTS525A_EFUSE_CTL,
160
+ REG_EFUSE_ENABLE | REG_EFUSE_MODE, REG_EFUSE_ENABLE);
161
+ /* Wait transfer end */
162
+ for (j = 0; j < 1024; j++) {
163
+ rtsx_pci_read_register(pcr, RTS525A_EFUSE_CTL, &tmp);
164
+ if ((tmp & 0x80) == 0)
165
+ break;
166
+ }
167
+ rtsx_pci_read_register(pcr, RTS525A_EFUSE_DATA, &val);
168
+ cnt = val & 0x0F;
169
+ sv = val & 0x10;
170
+
171
+ if (sv) {
172
+ for (i = 0; i < 4; i++) {
173
+ rtsx_pci_write_register(pcr, RTS525A_EFUSE_ADD,
174
+ REG_EFUSE_ADD_MASK, 0x04 + i);
175
+ rtsx_pci_write_register(pcr, RTS525A_EFUSE_CTL,
176
+ REG_EFUSE_ENABLE | REG_EFUSE_MODE, REG_EFUSE_ENABLE);
177
+ /* Wait transfer end */
178
+ for (j = 0; j < 1024; j++) {
179
+ rtsx_pci_read_register(pcr, RTS525A_EFUSE_CTL, &tmp);
180
+ if ((tmp & 0x80) == 0)
181
+ break;
182
+ }
183
+ rtsx_pci_read_register(pcr, RTS525A_EFUSE_DATA, &val);
184
+ rtsx_pci_write_register(pcr, 0xFF04 + i, 0xFF, val);
185
+ }
186
+ } else {
187
+ rtsx_pci_write_register(pcr, 0xFF04, 0xFF, (u8)PCI_VID(pcr));
188
+ rtsx_pci_write_register(pcr, 0xFF05, 0xFF, (u8)(PCI_VID(pcr) >> 8));
189
+ rtsx_pci_write_register(pcr, 0xFF06, 0xFF, (u8)PCI_PID(pcr));
190
+ rtsx_pci_write_register(pcr, 0xFF07, 0xFF, (u8)(PCI_PID(pcr) >> 8));
191
+ }
192
+
193
+ for (i = 0; i < cnt * 4; i++) {
194
+ if (sv)
195
+ rtsx_pci_write_register(pcr, RTS525A_EFUSE_ADD,
196
+ REG_EFUSE_ADD_MASK, 0x08 + i);
197
+ else
198
+ rtsx_pci_write_register(pcr, RTS525A_EFUSE_ADD,
199
+ REG_EFUSE_ADD_MASK, 0x04 + i);
200
+ rtsx_pci_write_register(pcr, RTS525A_EFUSE_CTL,
201
+ REG_EFUSE_ENABLE | REG_EFUSE_MODE, REG_EFUSE_ENABLE);
202
+ /* Wait transfer end */
203
+ for (j = 0; j < 1024; j++) {
204
+ rtsx_pci_read_register(pcr, RTS525A_EFUSE_CTL, &tmp);
205
+ if ((tmp & 0x80) == 0)
206
+ break;
207
+ }
208
+ rtsx_pci_read_register(pcr, RTS525A_EFUSE_DATA, &val);
209
+ rtsx_pci_write_register(pcr, 0xFF08 + i, 0xFF, val);
210
+ }
211
+ rtsx_pci_write_register(pcr, 0xFF00, 0xFF, (cnt & 0x7F) | 0x80);
212
+ rtsx_pci_write_register(pcr, RTS524A_PME_FORCE_CTL,
213
+ REG_EFUSE_BYPASS | REG_EFUSE_POR, REG_EFUSE_BYPASS);
214
+ pcr_dbg(pcr, "Disable efuse por!");
215
+}
216
+
217
+static void rts52xa_save_content_to_autoload_space(struct rtsx_pcr *pcr)
218
+{
219
+ u8 val;
220
+
221
+ rtsx_pci_read_register(pcr, RESET_LOAD_REG, &val);
222
+ if (val & 0x02) {
223
+ rtsx_pci_read_register(pcr, RTS525A_BIOS_CFG, &val);
224
+ if (val & RTS525A_LOAD_BIOS_FLAG) {
225
+ rtsx_pci_write_register(pcr, RTS525A_BIOS_CFG,
226
+ RTS525A_LOAD_BIOS_FLAG, RTS525A_CLEAR_BIOS_FLAG);
227
+
228
+ rtsx_pci_write_register(pcr, RTS524A_PME_FORCE_CTL,
229
+ REG_EFUSE_POWER_MASK, REG_EFUSE_POWERON);
230
+
231
+ pcr_dbg(pcr, "Power ON efuse!");
232
+ mdelay(1);
233
+ rts52xa_save_content_from_efuse(pcr);
234
+ } else {
235
+ rtsx_pci_read_register(pcr, RTS524A_PME_FORCE_CTL, &val);
236
+ if (!(val & 0x08))
237
+ rts52xa_save_content_from_efuse(pcr);
238
+ }
239
+ } else {
240
+ pcr_dbg(pcr, "Load from autoload");
241
+ rtsx_pci_write_register(pcr, 0xFF00, 0xFF, 0x80);
242
+ rtsx_pci_write_register(pcr, 0xFF04, 0xFF, (u8)PCI_VID(pcr));
243
+ rtsx_pci_write_register(pcr, 0xFF05, 0xFF, (u8)(PCI_VID(pcr) >> 8));
244
+ rtsx_pci_write_register(pcr, 0xFF06, 0xFF, (u8)PCI_PID(pcr));
245
+ rtsx_pci_write_register(pcr, 0xFF07, 0xFF, (u8)(PCI_PID(pcr) >> 8));
246
+ }
247
+}
248
+
157249 static int rts5249_extra_init_hw(struct rtsx_pcr *pcr)
158250 {
159251 struct rtsx_cr_option *option = &(pcr->option);
....@@ -162,6 +254,9 @@
162254 rts5249_init_from_hw(pcr);
163255
164256 rtsx_pci_init_cmd(pcr);
257
+
258
+ if (CHK_PCI_PID(pcr, PID_524A) || CHK_PCI_PID(pcr, PID_525A))
259
+ rts52xa_save_content_to_autoload_space(pcr);
165260
166261 /* Rest L1SUB Config */
167262 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, L1SUB_CONFIG3, 0xFF, 0x00);
....@@ -181,18 +276,36 @@
181276 else
182277 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PETXCFG, 0xB0, 0x80);
183278
279
+ rtsx_pci_send_cmd(pcr, CMD_TIMEOUT_DEF);
280
+
281
+ if (CHK_PCI_PID(pcr, PID_524A) || CHK_PCI_PID(pcr, PID_525A)) {
282
+ rtsx_pci_write_register(pcr, REG_VREF, PWD_SUSPND_EN, PWD_SUSPND_EN);
283
+ rtsx_pci_write_register(pcr, RTS524A_PM_CTRL3, 0x01, 0x00);
284
+ rtsx_pci_write_register(pcr, RTS524A_PME_FORCE_CTL, 0x30, 0x20);
285
+ } else {
286
+ rtsx_pci_write_register(pcr, PME_FORCE_CTL, 0xFF, 0x30);
287
+ rtsx_pci_write_register(pcr, PM_CTRL3, 0x01, 0x00);
288
+ }
289
+
184290 /*
185291 * If u_force_clkreq_0 is enabled, CLKREQ# PIN will be forced
186292 * to drive low, and we forcibly request clock.
187293 */
188294 if (option->force_clkreq_0)
189
- rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PETXCFG,
295
+ rtsx_pci_write_register(pcr, PETXCFG,
190296 FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_LOW);
191297 else
192
- rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PETXCFG,
298
+ rtsx_pci_write_register(pcr, PETXCFG,
193299 FORCE_CLKREQ_DELINK_MASK, FORCE_CLKREQ_HIGH);
194300
195
- return rtsx_pci_send_cmd(pcr, CMD_TIMEOUT_DEF);
301
+ rtsx_pci_write_register(pcr, pcr->reg_pm_ctrl3, 0x10, 0x00);
302
+ if (CHK_PCI_PID(pcr, PID_524A) || CHK_PCI_PID(pcr, PID_525A)) {
303
+ rtsx_pci_write_register(pcr, RTS524A_PME_FORCE_CTL,
304
+ REG_EFUSE_POWER_MASK, REG_EFUSE_POWEROFF);
305
+ pcr_dbg(pcr, "Power OFF efuse!");
306
+ }
307
+
308
+ return 0;
196309 }
197310
198311 static int rts5249_optimize_phy(struct rtsx_pcr *pcr)
....@@ -284,6 +397,10 @@
284397 static int rtsx_base_card_power_on(struct rtsx_pcr *pcr, int card)
285398 {
286399 int err;
400
+ struct rtsx_cr_option *option = &pcr->option;
401
+
402
+ if (option->ocp_en)
403
+ rtsx_pci_enable_ocp(pcr);
287404
288405 rtsx_pci_init_cmd(pcr);
289406 rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_PWR_CTL,
....@@ -306,12 +423,15 @@
306423
307424 static int rtsx_base_card_power_off(struct rtsx_pcr *pcr, int card)
308425 {
309
- rtsx_pci_init_cmd(pcr);
310
- rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, CARD_PWR_CTL,
311
- SD_POWER_MASK, SD_POWER_OFF);
312
- rtsx_pci_add_cmd(pcr, WRITE_REG_CMD, PWR_GATE_CTRL,
313
- LDO3318_PWR_MASK, 0x00);
314
- return rtsx_pci_send_cmd(pcr, 100);
426
+ struct rtsx_cr_option *option = &pcr->option;
427
+
428
+ if (option->ocp_en)
429
+ rtsx_pci_disable_ocp(pcr);
430
+
431
+ rtsx_pci_write_register(pcr, CARD_PWR_CTL, SD_POWER_MASK, SD_POWER_OFF);
432
+
433
+ rtsx_pci_write_register(pcr, PWR_GATE_CTRL, LDO3318_PWR_MASK, 0x00);
434
+ return 0;
315435 }
316436
317437 static int rtsx_base_switch_output_voltage(struct rtsx_pcr *pcr, u8 voltage)
....@@ -352,31 +472,6 @@
352472 return rtsx_pci_send_cmd(pcr, 100);
353473 }
354474
355
-static void rts5249_set_aspm(struct rtsx_pcr *pcr, bool enable)
356
-{
357
- struct rtsx_cr_option *option = &pcr->option;
358
- u8 val = 0;
359
-
360
- if (pcr->aspm_enabled == enable)
361
- return;
362
-
363
- if (option->dev_aspm_mode == DEV_ASPM_DYNAMIC) {
364
- if (enable)
365
- val = pcr->aspm_en;
366
- rtsx_pci_update_cfg_byte(pcr,
367
- pcr->pcie_cap + PCI_EXP_LNKCTL,
368
- ASPM_MASK_NEG, val);
369
- } else if (option->dev_aspm_mode == DEV_ASPM_BACKDOOR) {
370
- u8 mask = FORCE_ASPM_VAL_MASK | FORCE_ASPM_CTL0;
371
-
372
- if (!enable)
373
- val = FORCE_ASPM_CTL0;
374
- rtsx_pci_write_register(pcr, ASPM_FORCE_CTL, mask, val);
375
- }
376
-
377
- pcr->aspm_enabled = enable;
378
-}
379
-
380475 static const struct pcr_ops rts5249_pcr_ops = {
381476 .fetch_vendor_settings = rtsx_base_fetch_vendor_settings,
382477 .extra_init_hw = rts5249_extra_init_hw,
....@@ -388,8 +483,6 @@
388483 .card_power_on = rtsx_base_card_power_on,
389484 .card_power_off = rtsx_base_card_power_off,
390485 .switch_output_voltage = rtsx_base_switch_output_voltage,
391
- .force_power_down = rtsx_base_force_power_down,
392
- .set_aspm = rts5249_set_aspm,
393486 };
394487
395488 /* SD Pull Control Enable:
....@@ -476,7 +569,6 @@
476569 option->ltr_active_latency = LTR_ACTIVE_LATENCY_DEF;
477570 option->ltr_idle_latency = LTR_IDLE_LATENCY_DEF;
478571 option->ltr_l1off_latency = LTR_L1OFF_LATENCY_DEF;
479
- option->dev_aspm_mode = DEV_ASPM_DYNAMIC;
480572 option->l1_snooze_delay = L1_SNOOZE_DELAY_DEF;
481573 option->ltr_l1off_sspwrgate = LTR_L1OFF_SSPWRGATE_5249_DEF;
482574 option->ltr_l1off_snooze_sspwrgate =
....@@ -615,9 +707,7 @@
615707 .card_power_on = rtsx_base_card_power_on,
616708 .card_power_off = rtsx_base_card_power_off,
617709 .switch_output_voltage = rtsx_base_switch_output_voltage,
618
- .force_power_down = rtsx_base_force_power_down,
619710 .set_l1off_cfg_sub_d0 = rts5250_set_l1off_cfg_sub_d0,
620
- .set_aspm = rts5249_set_aspm,
621711 };
622712
623713 void rts524a_init_params(struct rtsx_pcr *pcr)
....@@ -630,6 +720,13 @@
630720
631721 pcr->reg_pm_ctrl3 = RTS524A_PM_CTRL3;
632722 pcr->ops = &rts524a_pcr_ops;
723
+
724
+ pcr->option.ocp_en = 1;
725
+ if (pcr->option.ocp_en)
726
+ pcr->hw_param.interrupt_en |= SD_OC_INT_EN;
727
+ pcr->hw_param.ocp_glitch = SD_OCP_GLITCH_10M;
728
+ pcr->option.sd_800mA_ocp_thd = RTS524A_OCP_THD_800;
729
+
633730 }
634731
635732 static int rts525a_card_power_on(struct rtsx_pcr *pcr, int card)
....@@ -692,6 +789,8 @@
692789 {
693790 rts5249_extra_init_hw(pcr);
694791
792
+ rtsx_pci_write_register(pcr, RTS5250_CLK_CFG3, RTS525A_CFG_MEM_PD, RTS525A_CFG_MEM_PD);
793
+
695794 rtsx_pci_write_register(pcr, PCLK_CTL, PCLK_MODE_SEL, PCLK_MODE_SEL);
696795 if (is_version(pcr, 0x525A, IC_VER_A)) {
697796 rtsx_pci_write_register(pcr, L1SUB_CONFIG2,
....@@ -724,9 +823,7 @@
724823 .card_power_on = rts525a_card_power_on,
725824 .card_power_off = rtsx_base_card_power_off,
726825 .switch_output_voltage = rts525a_switch_output_voltage,
727
- .force_power_down = rtsx_base_force_power_down,
728826 .set_l1off_cfg_sub_d0 = rts5250_set_l1off_cfg_sub_d0,
729
- .set_aspm = rts5249_set_aspm,
730827 };
731828
732829 void rts525a_init_params(struct rtsx_pcr *pcr)
....@@ -739,4 +836,10 @@
739836
740837 pcr->reg_pm_ctrl3 = RTS524A_PM_CTRL3;
741838 pcr->ops = &rts525a_pcr_ops;
839
+
840
+ pcr->option.ocp_en = 1;
841
+ if (pcr->option.ocp_en)
842
+ pcr->hw_param.interrupt_en |= SD_OC_INT_EN;
843
+ pcr->hw_param.ocp_glitch = SD_OCP_GLITCH_10M;
844
+ pcr->option.sd_800mA_ocp_thd = RTS525A_OCP_THD_800;
742845 }