forked from ~ljy/RK356X_SDK_RELEASE

hc
2024-05-13 9d77db3c730780c8ef5ccd4b66403ff5675cfe4e
kernel/drivers/usb/dwc2/params.c
....@@ -68,14 +68,15 @@
6868 p->ahbcfg = GAHBCFG_HBSTLEN_INCR16 <<
6969 GAHBCFG_HBSTLEN_SHIFT;
7070 p->change_speed_quirk = true;
71
- p->power_down = false;
71
+ p->power_down = DWC2_POWER_DOWN_PARAM_NONE;
7272 }
7373
7474 static void dwc2_set_s3c6400_params(struct dwc2_hsotg *hsotg)
7575 {
7676 struct dwc2_core_params *p = &hsotg->params;
7777
78
- p->power_down = 0;
78
+ p->power_down = DWC2_POWER_DOWN_PARAM_NONE;
79
+ p->phy_utmi_width = 8;
7980 }
8081
8182 static void dwc2_set_rk_params(struct dwc2_hsotg *hsotg)
....@@ -88,9 +89,9 @@
8889 p->host_perio_tx_fifo_size = 256;
8990 p->ahbcfg = GAHBCFG_HBSTLEN_INCR16 <<
9091 GAHBCFG_HBSTLEN_SHIFT;
92
+ p->power_down = DWC2_POWER_DOWN_PARAM_NONE;
9193 p->lpm = false;
9294 p->g_dma_desc = false;
93
- p->power_down = 0;
9495 }
9596
9697 static void dwc2_set_ltq_params(struct dwc2_hsotg *hsotg)
....@@ -121,6 +122,16 @@
121122 p->ahbcfg = GAHBCFG_HBSTLEN_INCR8 <<
122123 GAHBCFG_HBSTLEN_SHIFT;
123124 p->power_down = DWC2_POWER_DOWN_PARAM_NONE;
125
+}
126
+
127
+static void dwc2_set_amlogic_g12a_params(struct dwc2_hsotg *hsotg)
128
+{
129
+ struct dwc2_core_params *p = &hsotg->params;
130
+
131
+ p->lpm = false;
132
+ p->lpm_clock_gating = false;
133
+ p->besl = false;
134
+ p->hird_threshold_en = false;
124135 }
125136
126137 static void dwc2_set_amcc_params(struct dwc2_hsotg *hsotg)
....@@ -154,6 +165,43 @@
154165 p->host_perio_tx_fifo_size = 256;
155166 }
156167
168
+static void dwc2_set_stm32mp15_fsotg_params(struct dwc2_hsotg *hsotg)
169
+{
170
+ struct dwc2_core_params *p = &hsotg->params;
171
+
172
+ p->otg_cap = DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE;
173
+ p->speed = DWC2_SPEED_PARAM_FULL;
174
+ p->host_rx_fifo_size = 128;
175
+ p->host_nperio_tx_fifo_size = 96;
176
+ p->host_perio_tx_fifo_size = 96;
177
+ p->max_packet_count = 256;
178
+ p->phy_type = DWC2_PHY_TYPE_PARAM_FS;
179
+ p->i2c_enable = false;
180
+ p->activate_stm_fs_transceiver = true;
181
+ p->activate_stm_id_vb_detection = true;
182
+ p->ahbcfg = GAHBCFG_HBSTLEN_INCR16 << GAHBCFG_HBSTLEN_SHIFT;
183
+ p->power_down = DWC2_POWER_DOWN_PARAM_NONE;
184
+ p->host_support_fs_ls_low_power = true;
185
+ p->host_ls_low_power_phy_clk = true;
186
+}
187
+
188
+static void dwc2_set_stm32mp15_hsotg_params(struct dwc2_hsotg *hsotg)
189
+{
190
+ struct dwc2_core_params *p = &hsotg->params;
191
+
192
+ p->otg_cap = DWC2_CAP_PARAM_NO_HNP_SRP_CAPABLE;
193
+ p->activate_stm_id_vb_detection = !device_property_read_bool(hsotg->dev, "usb-role-switch");
194
+ p->host_rx_fifo_size = 440;
195
+ p->host_nperio_tx_fifo_size = 256;
196
+ p->host_perio_tx_fifo_size = 256;
197
+ p->ahbcfg = GAHBCFG_HBSTLEN_INCR16 << GAHBCFG_HBSTLEN_SHIFT;
198
+ p->power_down = DWC2_POWER_DOWN_PARAM_NONE;
199
+ p->lpm = false;
200
+ p->lpm_clock_gating = false;
201
+ p->besl = false;
202
+ p->hird_threshold_en = false;
203
+}
204
+
157205 const struct of_device_id dwc2_of_match_table[] = {
158206 { .compatible = "brcm,bcm2835-usb", .data = dwc2_set_bcm_params },
159207 { .compatible = "hisilicon,hi6220-usb", .data = dwc2_set_his_params },
....@@ -169,12 +217,19 @@
169217 .data = dwc2_set_amlogic_params },
170218 { .compatible = "amlogic,meson-gxbb-usb",
171219 .data = dwc2_set_amlogic_params },
220
+ { .compatible = "amlogic,meson-g12a-usb",
221
+ .data = dwc2_set_amlogic_g12a_params },
172222 { .compatible = "amcc,dwc-otg", .data = dwc2_set_amcc_params },
223
+ { .compatible = "apm,apm82181-dwc-otg", .data = dwc2_set_amcc_params },
173224 { .compatible = "st,stm32f4x9-fsotg",
174225 .data = dwc2_set_stm32f4x9_fsotg_params },
175226 { .compatible = "st,stm32f4x9-hsotg" },
176227 { .compatible = "st,stm32f7-hsotg",
177228 .data = dwc2_set_stm32f7_hsotg_params },
229
+ { .compatible = "st,stm32mp15-fsotg",
230
+ .data = dwc2_set_stm32mp15_fsotg_params },
231
+ { .compatible = "st,stm32mp15-hsotg",
232
+ .data = dwc2_set_stm32mp15_hsotg_params },
178233 {},
179234 };
180235 MODULE_DEVICE_TABLE(of, dwc2_of_match_table);
....@@ -243,6 +298,15 @@
243298 val = (hsotg->hw_params.utmi_phy_data_width ==
244299 GHWCFG4_UTMI_PHY_DATA_WIDTH_8) ? 8 : 16;
245300
301
+ if (hsotg->phy) {
302
+ /*
303
+ * If using the generic PHY framework, check if the PHY bus
304
+ * width is 8-bit and set the phyif appropriately.
305
+ */
306
+ if (phy_get_bus_width(hsotg->phy) == 8)
307
+ val = 8;
308
+ }
309
+
246310 hsotg->params.phy_utmi_width = val;
247311 }
248312
....@@ -266,13 +330,30 @@
266330 int val;
267331
268332 if (hsotg->hw_params.hibernation)
269
- val = 2;
333
+ val = DWC2_POWER_DOWN_PARAM_HIBERNATION;
270334 else if (hsotg->hw_params.power_optimized)
271
- val = 1;
335
+ val = DWC2_POWER_DOWN_PARAM_PARTIAL;
272336 else
273
- val = 0;
337
+ val = DWC2_POWER_DOWN_PARAM_NONE;
274338
275339 hsotg->params.power_down = val;
340
+}
341
+
342
+static void dwc2_set_param_lpm(struct dwc2_hsotg *hsotg)
343
+{
344
+ struct dwc2_core_params *p = &hsotg->params;
345
+
346
+ p->lpm = hsotg->hw_params.lpm_mode;
347
+ if (p->lpm) {
348
+ p->lpm_clock_gating = true;
349
+ p->besl = true;
350
+ p->hird_threshold_en = true;
351
+ p->hird_threshold = 4;
352
+ } else {
353
+ p->lpm_clock_gating = false;
354
+ p->besl = false;
355
+ p->hird_threshold_en = false;
356
+ }
276357 }
277358
278359 /**
....@@ -293,6 +374,7 @@
293374 dwc2_set_param_speed(hsotg);
294375 dwc2_set_param_phy_utmi_width(hsotg);
295376 dwc2_set_param_power_down(hsotg);
377
+ dwc2_set_param_lpm(hsotg);
296378 p->phy_ulpi_ddr = false;
297379 p->phy_ulpi_ext_vbus = false;
298380
....@@ -305,15 +387,13 @@
305387 p->reload_ctl = (hw->snpsid >= DWC2_CORE_REV_2_92a);
306388 p->uframe_sched = true;
307389 p->external_id_pin_ctl = false;
308
- p->lpm = true;
309
- p->lpm_clock_gating = true;
310
- p->besl = true;
311
- p->hird_threshold_en = true;
312
- p->hird_threshold = 4;
313390 p->ipg_isoc_en = false;
391
+ p->service_interval = false;
314392 p->max_packet_count = hw->max_packet_count;
315393 p->max_transfer_size = hw->max_transfer_size;
316394 p->ahbcfg = GAHBCFG_HBSTLEN_INCR << GAHBCFG_HBSTLEN_SHIFT;
395
+ p->ref_clk_per = 33333;
396
+ p->sof_cnt_wkup_alert = 100;
317397
318398 if ((hsotg->dr_mode == USB_DR_MODE_HOST) ||
319399 (hsotg->dr_mode == USB_DR_MODE_OTG)) {
....@@ -368,10 +448,7 @@
368448 device_property_read_u32(hsotg->dev, "g-np-tx-fifo-size",
369449 &p->g_np_tx_fifo_size);
370450
371
- num = device_property_read_u32_array(hsotg->dev,
372
- "g-tx-fifo-size",
373
- NULL, 0);
374
-
451
+ num = device_property_count_u32(hsotg->dev, "g-tx-fifo-size");
375452 if (num > 0) {
376453 num = min(num, 15);
377454 memset(p->g_tx_fifo_size, 0,
....@@ -604,6 +681,7 @@
604681 CHECK_BOOL(besl, (hsotg->hw_params.snpsid >= DWC2_CORE_REV_3_00a));
605682 CHECK_BOOL(hird_threshold_en, hsotg->params.lpm);
606683 CHECK_RANGE(hird_threshold, 0, hsotg->params.besl ? 12 : 7, 0);
684
+ CHECK_BOOL(service_interval, hw->service_interval_mode);
607685 CHECK_RANGE(max_packet_count,
608686 15, hw->max_packet_count,
609687 hw->max_packet_count);
....@@ -715,25 +793,6 @@
715793 u32 hwcfg1, hwcfg2, hwcfg3, hwcfg4;
716794 u32 grxfsiz;
717795
718
- /*
719
- * Attempt to ensure this device is really a DWC_otg Controller.
720
- * Read and verify the GSNPSID register contents. The value should be
721
- * 0x45f4xxxx, 0x5531xxxx or 0x5532xxxx
722
- */
723
-
724
- hw->snpsid = dwc2_readl(hsotg, GSNPSID);
725
- if ((hw->snpsid & GSNPSID_ID_MASK) != DWC2_OTG_ID &&
726
- (hw->snpsid & GSNPSID_ID_MASK) != DWC2_FS_IOT_ID &&
727
- (hw->snpsid & GSNPSID_ID_MASK) != DWC2_HS_IOT_ID) {
728
- dev_err(hsotg->dev, "Bad value for GSNPSID: 0x%08x\n",
729
- hw->snpsid);
730
- return -ENODEV;
731
- }
732
-
733
- dev_dbg(hsotg->dev, "Core Release: %1x.%1x%1x%1x (snpsid=%x)\n",
734
- hw->snpsid >> 12 & 0xf, hw->snpsid >> 8 & 0xf,
735
- hw->snpsid >> 4 & 0xf, hw->snpsid & 0xf, hw->snpsid);
736
-
737796 hwcfg1 = dwc2_readl(hsotg, GHWCFG1);
738797 hwcfg2 = dwc2_readl(hsotg, GHWCFG2);
739798 hwcfg3 = dwc2_readl(hsotg, GHWCFG3);
....@@ -792,6 +851,8 @@
792851 GHWCFG4_UTMI_PHY_DATA_WIDTH_SHIFT;
793852 hw->acg_enable = !!(hwcfg4 & GHWCFG4_ACG_SUPPORTED);
794853 hw->ipg_isoc_en = !!(hwcfg4 & GHWCFG4_IPG_ISOC_SUPPORTED);
854
+ hw->service_interval_mode = !!(hwcfg4 &
855
+ GHWCFG4_SERVICE_INTERVAL_SUPPORTED);
795856
796857 /* fifo sizes */
797858 hw->rx_fifo_size = (grxfsiz & GRXFSIZ_DEPTH_MASK) >>