hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
u-boot/drivers/mmc/sdhci.c
....@@ -178,6 +178,7 @@
178178 } else {
179179 puts("timeout.\n");
180180 /* remove timeout return error and try to send command */
181
+ break;
181182 }
182183 }
183184 time++;
....@@ -313,6 +314,29 @@
313314 return -ECOMM;
314315 }
315316
317
+void sdhci_enable_clk(struct sdhci_host *host, u16 clk)
318
+{
319
+ unsigned int timeout;
320
+
321
+ clk |= SDHCI_CLOCK_INT_EN;
322
+ sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
323
+
324
+ /* Wait max 20 ms */
325
+ timeout = 20;
326
+ while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
327
+ & SDHCI_CLOCK_INT_STABLE)) {
328
+ if (timeout == 0) {
329
+ printf("%s: Internal clock never stabilised.\n",
330
+ __func__);
331
+ return;
332
+ }
333
+ timeout--;
334
+ udelay(1000);
335
+ }
336
+ clk |= SDHCI_CLOCK_CARD_EN;
337
+ sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
338
+}
339
+
316340 int sdhci_set_clock(struct sdhci_host *host, unsigned int clock)
317341 {
318342 unsigned int div, clk = 0, timeout;
....@@ -379,23 +403,8 @@
379403 clk |= (div & SDHCI_DIV_MASK) << SDHCI_DIVIDER_SHIFT;
380404 clk |= ((div & SDHCI_DIV_HI_MASK) >> SDHCI_DIV_MASK_LEN)
381405 << SDHCI_DIVIDER_HI_SHIFT;
382
- clk |= SDHCI_CLOCK_INT_EN;
383
- sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
384406
385
- /* Wait max 20 ms */
386
- timeout = 20;
387
- while (!((clk = sdhci_readw(host, SDHCI_CLOCK_CONTROL))
388
- & SDHCI_CLOCK_INT_STABLE)) {
389
- if (timeout == 0) {
390
- printf("%s: Internal clock never stabilised.\n",
391
- __func__);
392
- return -EBUSY;
393
- }
394
- timeout--;
395
- udelay(1000);
396
- }
397
- clk |= SDHCI_CLOCK_CARD_EN;
398
- sdhci_writew(host, clk, SDHCI_CLOCK_CONTROL);
407
+ sdhci_enable_clk(host, clk);
399408
400409 host->clock = clock;
401410 return 0;
....@@ -681,11 +690,23 @@
681690 return sdhci_init(mmc);
682691 }
683692
693
+static int sdhci_set_enhanced_strobe(struct udevice *dev)
694
+{
695
+ struct mmc *mmc = mmc_get_mmc_dev(dev);
696
+ struct sdhci_host *host = mmc->priv;
697
+
698
+ if (host->ops && host->ops->set_enhanced_strobe)
699
+ return host->ops->set_enhanced_strobe(host);
700
+
701
+ return -ENOTSUPP;
702
+}
703
+
684704 const struct dm_mmc_ops sdhci_ops = {
685705 .card_busy = sdhci_card_busy,
686706 .send_cmd = sdhci_send_command,
687707 .set_ios = sdhci_set_ios,
688708 .execute_tuning = sdhci_execute_tuning,
709
+ .set_enhanced_strobe = sdhci_set_enhanced_strobe,
689710 };
690711 #else
691712 static const struct mmc_ops sdhci_ops = {