Lines Matching +full:regulator +full:- +full:soft +full:- +full:start
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
57 #include <dev/regulator/regulator.h>
113 {"allwinner,sun4i-a10-mmc", (uintptr_t)&a10_mmc_conf},
114 {"allwinner,sun5i-a13-mmc", (uintptr_t)&a13_mmc_conf},
115 {"allwinner,sun7i-a20-mmc", (uintptr_t)&a13_mmc_conf},
116 {"allwinner,sun50i-a64-mmc", (uintptr_t)&a64_mmc_conf},
117 {"allwinner,sun50i-a64-emmc", (uintptr_t)&a64_emmc_conf},
160 { -1, 0, 0 }
184 #define AW_MMC_LOCK(_sc) mtx_lock(&(_sc)->aw_mtx)
185 #define AW_MMC_UNLOCK(_sc) mtx_unlock(&(_sc)->aw_mtx)
187 bus_read_4((_sc)->aw_res[AW_MMC_MEMRES], _reg)
189 bus_write_4((_sc)->aw_res[AW_MMC_MEMRES], _reg, _value)
210 cts->host_ocr = sc->aw_host.host_ocr; in aw_mmc_get_tran_settings()
211 cts->host_f_min = sc->aw_host.f_min; in aw_mmc_get_tran_settings()
212 cts->host_f_max = sc->aw_host.f_max; in aw_mmc_get_tran_settings()
213 cts->host_caps = sc->aw_host.caps; in aw_mmc_get_tran_settings()
214 cts->host_max_data = (sc->aw_mmc_conf->dma_xferlen * in aw_mmc_get_tran_settings()
216 memcpy(&cts->ios, &sc->aw_host.ios, sizeof(struct mmc_ios)); in aw_mmc_get_tran_settings()
229 ios = &sc->aw_host.ios; in aw_mmc_set_tran_settings()
230 new_ios = &cts->ios; in aw_mmc_set_tran_settings()
233 if (cts->ios_valid & MMC_CLK) { in aw_mmc_set_tran_settings()
234 ios->clock = new_ios->clock; in aw_mmc_set_tran_settings()
236 device_printf(sc->aw_dev, "Clock => %d\n", ios->clock); in aw_mmc_set_tran_settings()
238 if (cts->ios_valid & MMC_VDD) { in aw_mmc_set_tran_settings()
239 ios->vdd = new_ios->vdd; in aw_mmc_set_tran_settings()
241 device_printf(sc->aw_dev, "VDD => %d\n", ios->vdd); in aw_mmc_set_tran_settings()
243 if (cts->ios_valid & MMC_CS) { in aw_mmc_set_tran_settings()
244 ios->chip_select = new_ios->chip_select; in aw_mmc_set_tran_settings()
246 device_printf(sc->aw_dev, "CS => %d\n", ios->chip_select); in aw_mmc_set_tran_settings()
248 if (cts->ios_valid & MMC_BW) { in aw_mmc_set_tran_settings()
249 ios->bus_width = new_ios->bus_width; in aw_mmc_set_tran_settings()
251 device_printf(sc->aw_dev, "Bus width => %d\n", ios->bus_width); in aw_mmc_set_tran_settings()
253 if (cts->ios_valid & MMC_PM) { in aw_mmc_set_tran_settings()
254 ios->power_mode = new_ios->power_mode; in aw_mmc_set_tran_settings()
256 device_printf(sc->aw_dev, "Power mode => %d\n", ios->power_mode); in aw_mmc_set_tran_settings()
258 if (cts->ios_valid & MMC_BT) { in aw_mmc_set_tran_settings()
259 ios->timing = new_ios->timing; in aw_mmc_set_tran_settings()
261 device_printf(sc->aw_dev, "Timing => %d\n", ios->timing); in aw_mmc_set_tran_settings()
263 if (cts->ios_valid & MMC_BM) { in aw_mmc_set_tran_settings()
264 ios->bus_mode = new_ios->bus_mode; in aw_mmc_set_tran_settings()
266 device_printf(sc->aw_dev, "Bus mode => %d\n", ios->bus_mode); in aw_mmc_set_tran_settings()
269 return (aw_mmc_update_ios(sc->aw_dev, NULL)); in aw_mmc_set_tran_settings()
279 mmcio = &ccb->mmcio; in aw_mmc_cam_request()
284 device_printf(sc->aw_dev, "CMD%u arg %#x flags %#x dlen %u dflags %#x\n", in aw_mmc_cam_request()
285 mmcio->cmd.opcode, mmcio->cmd.arg, mmcio->cmd.flags, in aw_mmc_cam_request()
286 mmcio->cmd.data != NULL ? (unsigned int) mmcio->cmd.data->len : 0, in aw_mmc_cam_request()
287 mmcio->cmd.data != NULL ? mmcio->cmd.data->flags: 0); in aw_mmc_cam_request()
289 if (mmcio->cmd.data != NULL) { in aw_mmc_cam_request()
290 if (mmcio->cmd.data->len == 0 || mmcio->cmd.data->flags == 0) in aw_mmc_cam_request()
291 panic("data->len = %d, data->flags = %d -- something is b0rked", in aw_mmc_cam_request()
292 (int)mmcio->cmd.data->len, mmcio->cmd.data->flags); in aw_mmc_cam_request()
294 if (sc->ccb != NULL) { in aw_mmc_cam_request()
295 device_printf(sc->aw_dev, "Controller still has an active command\n"); in aw_mmc_cam_request()
298 sc->ccb = ccb; in aw_mmc_cam_request()
301 aw_mmc_request(sc->aw_dev, NULL, NULL); in aw_mmc_cam_request()
323 mmc_cam_sim_discover(&sc->mmc_sim); in aw_mmc_helper_cd_handler()
327 if (sc->child == NULL) { in aw_mmc_helper_cd_handler()
329 device_printf(sc->aw_dev, "Card inserted\n"); in aw_mmc_helper_cd_handler()
331 sc->child = device_add_child(sc->aw_dev, "mmc", DEVICE_UNIT_ANY); in aw_mmc_helper_cd_handler()
332 if (sc->child) { in aw_mmc_helper_cd_handler()
333 device_set_ivars(sc->child, sc); in aw_mmc_helper_cd_handler()
334 (void)device_probe_and_attach(sc->child); in aw_mmc_helper_cd_handler()
339 if (sc->child != NULL) { in aw_mmc_helper_cd_handler()
341 device_printf(sc->aw_dev, "Card removed\n"); in aw_mmc_helper_cd_handler()
343 device_delete_child(sc->aw_dev, sc->child); in aw_mmc_helper_cd_handler()
344 sc->child = NULL; in aw_mmc_helper_cd_handler()
357 if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0) in aw_mmc_probe()
374 sc->aw_dev = dev; in aw_mmc_attach()
376 sc->aw_mmc_conf = (struct aw_mmc_conf *)ofw_bus_search_compatible(dev, compat_data)->ocd_data; in aw_mmc_attach()
379 sc->aw_req = NULL; in aw_mmc_attach()
381 if (bus_alloc_resources(dev, aw_mmc_res_spec, sc->aw_res) != 0) { in aw_mmc_attach()
385 if (bus_setup_intr(dev, sc->aw_res[AW_MMC_IRQRES], in aw_mmc_attach()
387 &sc->aw_intrhand)) { in aw_mmc_attach()
388 bus_release_resources(dev, aw_mmc_res_spec, sc->aw_res); in aw_mmc_attach()
392 mtx_init(&sc->aw_mtx, device_get_nameunit(sc->aw_dev), "aw_mmc", in aw_mmc_attach()
394 callout_init_mtx(&sc->aw_timeoutc, &sc->aw_mtx, 0); in aw_mmc_attach()
396 /* De-assert reset */ in aw_mmc_attach()
397 if (hwreset_get_by_ofw_name(dev, 0, "ahb", &sc->aw_rst_ahb) == 0) { in aw_mmc_attach()
398 error = hwreset_deassert(sc->aw_rst_ahb); in aw_mmc_attach()
400 device_printf(dev, "cannot de-assert reset\n"); in aw_mmc_attach()
406 error = clk_get_by_ofw_name(dev, 0, "ahb", &sc->aw_clk_ahb); in aw_mmc_attach()
411 error = clk_enable(sc->aw_clk_ahb); in aw_mmc_attach()
416 error = clk_get_by_ofw_name(dev, 0, "mmc", &sc->aw_clk_mmc); in aw_mmc_attach()
421 error = clk_set_freq(sc->aw_clk_mmc, CARD_ID_FREQUENCY, in aw_mmc_attach()
427 error = clk_enable(sc->aw_clk_mmc); in aw_mmc_attach()
433 sc->aw_timeout = 10; in aw_mmc_attach()
437 &sc->aw_timeout, 0, "Request timeout in seconds"); in aw_mmc_attach()
439 /* Soft Reset controller. */ in aw_mmc_attach()
446 device_printf(sc->aw_dev, "Couldn't setup DMA!\n"); in aw_mmc_attach()
451 sc->aw_host.f_min = 400000; in aw_mmc_attach()
452 sc->aw_host.f_max = 52000000; in aw_mmc_attach()
453 sc->aw_host.host_ocr = MMC_OCR_320_330 | MMC_OCR_330_340; in aw_mmc_attach()
454 sc->aw_host.caps |= MMC_CAP_HSPEED | MMC_CAP_SIGNALING_330; in aw_mmc_attach()
455 mmc_fdt_parse(dev, 0, &sc->mmc_helper, &sc->aw_host); in aw_mmc_attach()
456 mmc_fdt_gpio_setup(dev, 0, &sc->mmc_helper, aw_mmc_helper_cd_handler); in aw_mmc_attach()
459 sc->ccb = NULL; in aw_mmc_attach()
461 if (mmc_cam_sim_alloc(dev, "aw_mmc", &sc->mmc_sim) != 0) { in aw_mmc_attach()
470 callout_drain(&sc->aw_timeoutc); in aw_mmc_attach()
471 mtx_destroy(&sc->aw_mtx); in aw_mmc_attach()
472 bus_teardown_intr(dev, sc->aw_res[AW_MMC_IRQRES], sc->aw_intrhand); in aw_mmc_attach()
473 bus_release_resources(dev, aw_mmc_res_spec, sc->aw_res); in aw_mmc_attach()
485 clk_disable(sc->aw_clk_mmc); in aw_mmc_detach()
486 clk_disable(sc->aw_clk_ahb); in aw_mmc_detach()
487 hwreset_assert(sc->aw_rst_ahb); in aw_mmc_detach()
489 mmc_fdt_gpio_teardown(&sc->mmc_helper); in aw_mmc_detach()
491 callout_drain(&sc->aw_timeoutc); in aw_mmc_detach()
493 device_delete_children(sc->aw_dev); in aw_mmc_detach()
497 mtx_destroy(&sc->aw_mtx); in aw_mmc_detach()
499 bus_teardown_intr(dev, sc->aw_res[AW_MMC_IRQRES], sc->aw_intrhand); in aw_mmc_detach()
500 bus_release_resources(dev, aw_mmc_res_spec, sc->aw_res); in aw_mmc_detach()
503 mmc_cam_sim_free(&sc->mmc_sim); in aw_mmc_detach()
516 sc->aw_dma_map_err = err; in aw_dma_desc_cb()
519 sc->aw_dma_desc_phys = segs[0].ds_addr; in aw_dma_desc_cb()
529 bus_get_dma_tag(sc->aw_dev), /* parent */ in aw_mmc_setup_dma()
538 &sc->aw_dma_tag); in aw_mmc_setup_dma()
542 error = bus_dmamem_alloc(sc->aw_dma_tag, &sc->aw_dma_desc, in aw_mmc_setup_dma()
544 &sc->aw_dma_map); in aw_mmc_setup_dma()
548 error = bus_dmamap_load(sc->aw_dma_tag, in aw_mmc_setup_dma()
549 sc->aw_dma_map, in aw_mmc_setup_dma()
550 sc->aw_dma_desc, AW_MMC_DMA_DESC_SIZE, in aw_mmc_setup_dma()
554 if (sc->aw_dma_map_err) in aw_mmc_setup_dma()
555 return (sc->aw_dma_map_err); in aw_mmc_setup_dma()
559 bus_get_dma_tag(sc->aw_dev), /* parent */ in aw_mmc_setup_dma()
564 sc->aw_mmc_conf->dma_xferlen * in aw_mmc_setup_dma()
566 sc->aw_mmc_conf->dma_xferlen, /* maxsegsize */ in aw_mmc_setup_dma()
569 &sc->aw_dma_buf_tag); in aw_mmc_setup_dma()
572 error = bus_dmamap_create(sc->aw_dma_buf_tag, 0, in aw_mmc_setup_dma()
573 &sc->aw_dma_buf_map); in aw_mmc_setup_dma()
584 bus_dmamap_unload(sc->aw_dma_tag, sc->aw_dma_map); in aw_mmc_teardown_dma()
585 bus_dmamem_free(sc->aw_dma_tag, sc->aw_dma_desc, sc->aw_dma_map); in aw_mmc_teardown_dma()
586 if (bus_dma_tag_destroy(sc->aw_dma_tag) != 0) in aw_mmc_teardown_dma()
587 device_printf(sc->aw_dev, "Cannot destroy the dma tag\n"); in aw_mmc_teardown_dma()
589 bus_dmamap_unload(sc->aw_dma_buf_tag, sc->aw_dma_buf_map); in aw_mmc_teardown_dma()
590 bus_dmamap_destroy(sc->aw_dma_buf_tag, sc->aw_dma_buf_map); in aw_mmc_teardown_dma()
591 if (bus_dma_tag_destroy(sc->aw_dma_buf_tag) != 0) in aw_mmc_teardown_dma()
592 device_printf(sc->aw_dev, "Cannot destroy the dma buf tag\n"); in aw_mmc_teardown_dma()
603 sc->aw_dma_map_err = err; in aw_dma_cb()
608 dma_desc = sc->aw_dma_desc; in aw_dma_cb()
610 if (segs[i].ds_len == sc->aw_mmc_conf->dma_xferlen) in aw_dma_cb()
618 dma_desc[i].next = sc->aw_dma_desc_phys + in aw_dma_cb()
623 dma_desc[nsegs - 1].config |= AW_MMC_DMA_CONFIG_LD | in aw_dma_cb()
625 dma_desc[nsegs - 1].config &= ~AW_MMC_DMA_CONFIG_DIC; in aw_dma_cb()
626 dma_desc[nsegs - 1].next = 0; in aw_dma_cb()
638 cmd = &sc->ccb->mmcio.cmd; in aw_mmc_prepare_dma()
640 cmd = sc->aw_req->cmd; in aw_mmc_prepare_dma()
642 if (cmd->data->len > (sc->aw_mmc_conf->dma_xferlen * AW_MMC_DMA_SEGS)) in aw_mmc_prepare_dma()
644 error = bus_dmamap_load(sc->aw_dma_buf_tag, sc->aw_dma_buf_map, in aw_mmc_prepare_dma()
645 cmd->data->data, cmd->data->len, aw_dma_cb, sc, 0); in aw_mmc_prepare_dma()
648 if (sc->aw_dma_map_err) in aw_mmc_prepare_dma()
649 return (sc->aw_dma_map_err); in aw_mmc_prepare_dma()
651 if (cmd->data->flags & MMC_DATA_WRITE) in aw_mmc_prepare_dma()
655 bus_dmamap_sync(sc->aw_dma_buf_tag, sc->aw_dma_buf_map, sync_op); in aw_mmc_prepare_dma()
656 bus_dmamap_sync(sc->aw_dma_tag, sc->aw_dma_map, BUS_DMASYNC_PREWRITE); in aw_mmc_prepare_dma()
674 if (cmd->data->flags & MMC_DATA_WRITE) in aw_mmc_prepare_dma()
681 AW_MMC_WRITE_4(sc, AW_MMC_DLBA, sc->aw_dma_desc_phys); in aw_mmc_prepare_dma()
699 while (--timeout > 0) { in aw_mmc_reset()
762 ccb = sc->ccb; in aw_mmc_req_done()
763 cmd = &ccb->mmcio.cmd; in aw_mmc_req_done()
765 cmd = sc->aw_req->cmd; in aw_mmc_req_done()
768 device_printf(sc->aw_dev, "%s: cmd %d err %d\n", __func__, cmd->opcode, cmd->error); in aw_mmc_req_done()
770 if (cmd->error != MMC_ERR_NONE) { in aw_mmc_req_done()
777 while (--retry > 0) { in aw_mmc_req_done()
784 device_printf(sc->aw_dev, in aw_mmc_req_done()
790 callout_stop(&sc->aw_timeoutc); in aw_mmc_req_done()
791 sc->aw_intr = 0; in aw_mmc_req_done()
792 sc->aw_resid = 0; in aw_mmc_req_done()
793 sc->aw_dma_map_err = 0; in aw_mmc_req_done()
794 sc->aw_intr_wait = 0; in aw_mmc_req_done()
796 sc->ccb = NULL; in aw_mmc_req_done()
797 ccb->ccb_h.status = in aw_mmc_req_done()
798 (ccb->mmcio.cmd.error == 0 ? CAM_REQ_CMP : CAM_REQ_CMP_ERR); in aw_mmc_req_done()
801 req = sc->aw_req; in aw_mmc_req_done()
802 sc->aw_req = NULL; in aw_mmc_req_done()
803 req->done(req); in aw_mmc_req_done()
815 while (--timeout > 0) { in aw_mmc_req_ok()
822 cmd = &sc->ccb->mmcio.cmd; in aw_mmc_req_ok()
824 cmd = sc->aw_req->cmd; in aw_mmc_req_ok()
827 cmd->error = MMC_ERR_FAILED; in aw_mmc_req_ok()
831 if (cmd->flags & MMC_RSP_PRESENT) { in aw_mmc_req_ok()
832 if (cmd->flags & MMC_RSP_136) { in aw_mmc_req_ok()
833 cmd->resp[0] = AW_MMC_READ_4(sc, AW_MMC_RESP3); in aw_mmc_req_ok()
834 cmd->resp[1] = AW_MMC_READ_4(sc, AW_MMC_RESP2); in aw_mmc_req_ok()
835 cmd->resp[2] = AW_MMC_READ_4(sc, AW_MMC_RESP1); in aw_mmc_req_ok()
836 cmd->resp[3] = AW_MMC_READ_4(sc, AW_MMC_RESP0); in aw_mmc_req_ok()
838 cmd->resp[0] = AW_MMC_READ_4(sc, AW_MMC_RESP0); in aw_mmc_req_ok()
841 if (cmd->data != NULL && (sc->aw_resid << 2) < cmd->data->len) in aw_mmc_req_ok()
842 cmd->error = MMC_ERR_FAILED; in aw_mmc_req_ok()
850 sc->ccb->mmcio.cmd.error = error_code; in set_mmc_error()
852 sc->aw_req->cmd->error = error_code; in set_mmc_error()
863 if (sc->ccb != NULL) {
865 if (sc->aw_req != NULL) {
867 device_printf(sc->aw_dev, "controller timeout\n");
871 device_printf(sc->aw_dev,
872 "Spurious timeout - no active request\n");
915 device_printf(sc->aw_dev, "idst: %#x, imask: %#x, rint: %#x\n",
919 if (sc->ccb == NULL) {
921 if (sc->aw_req == NULL) {
923 device_printf(sc->aw_dev,
924 "Spurious interrupt - no active request, rint: 0x%08X\n",
931 device_printf(sc->aw_dev, "error rint: 0x%08X\n", rint);
943 device_printf(sc->aw_dev, "error idst: 0x%08x\n", idst);
949 sc->aw_intr |= rint;
951 data = sc->ccb->mmcio.cmd.data;
953 data = sc->aw_req->cmd->data;
956 if (data->flags & MMC_DATA_WRITE)
960 bus_dmamap_sync(sc->aw_dma_buf_tag, sc->aw_dma_buf_map,
962 bus_dmamap_sync(sc->aw_dma_tag, sc->aw_dma_map,
964 bus_dmamap_unload(sc->aw_dma_buf_tag, sc->aw_dma_buf_map);
965 sc->aw_resid = data->len >> 2;
967 if ((sc->aw_intr & sc->aw_intr_wait) == sc->aw_intr_wait)
991 * For MMCCAM, sc->ccb has been NULL-checked and populated
994 cmd = &sc->ccb->mmcio.cmd;
996 if (sc->aw_req) {
1000 sc->aw_req = req;
1001 cmd = req->cmd;
1004 device_printf(sc->aw_dev, "CMD%u arg %#x flags %#x dlen %u dflags %#x\n",
1005 cmd->opcode, cmd->arg, cmd->flags,
1006 cmd->data != NULL ? (unsigned int)cmd->data->len : 0,
1007 cmd->data != NULL ? cmd->data->flags: 0);
1012 sc->aw_intr_wait = 0;
1013 sc->aw_intr = 0;
1014 sc->aw_resid = 0;
1015 cmd->error = MMC_ERR_NONE;
1017 if (cmd->opcode == MMC_GO_IDLE_STATE)
1020 if (cmd->flags & MMC_RSP_PRESENT)
1022 if (cmd->flags & MMC_RSP_136)
1024 if (cmd->flags & MMC_RSP_CRC)
1027 if (cmd->data) {
1030 if (cmd->data->flags & MMC_DATA_MULTI) {
1033 sc->aw_intr_wait |= AW_MMC_INT_AUTO_STOP_DONE;
1035 sc->aw_intr_wait |= AW_MMC_INT_DATA_OVER;
1038 if (cmd->data->flags & MMC_DATA_WRITE)
1041 if (cmd->data->flags & MMC_DATA_BLOCK_SIZE) {
1042 AW_MMC_WRITE_4(sc, AW_MMC_BKSR, cmd->data->block_size);
1043 AW_MMC_WRITE_4(sc, AW_MMC_BYCR, cmd->data->len);
1047 blksz = min(cmd->data->len, MMC_SECTOR_SIZE);
1049 AW_MMC_WRITE_4(sc, AW_MMC_BYCR, cmd->data->len);
1064 AW_MMC_WRITE_4(sc, AW_MMC_CAGR, cmd->arg);
1067 * If we don't have data start the request
1068 * if we do prepare the dma request and start the request
1070 if (cmd->data == NULL) {
1071 AW_MMC_WRITE_4(sc, AW_MMC_CMDR, cmdreg | cmd->opcode);
1075 device_printf(sc->aw_dev, "prepare_dma failed: %d\n", err);
1077 AW_MMC_WRITE_4(sc, AW_MMC_CMDR, cmdreg | cmd->opcode);
1081 callout_reset(&sc->aw_timeoutc, sc->aw_timeout * hz,
1100 *(int *)result = sc->aw_host.ios.bus_mode;
1103 *(int *)result = sc->aw_host.ios.bus_width;
1106 *(int *)result = sc->aw_host.ios.chip_select;
1109 *(int *)result = sc->aw_host.ios.clock;
1112 *(int *)result = sc->aw_host.f_min;
1115 *(int *)result = sc->aw_host.f_max;
1118 *(int *)result = sc->aw_host.host_ocr;
1121 *(int *)result = sc->aw_host.mode;
1124 *(int *)result = sc->aw_host.ocr;
1127 *(int *)result = sc->aw_host.ios.power_mode;
1130 *(int *)result = sc->aw_host.ios.vdd;
1133 *(int *)result = sc->aw_host.ios.vccq;
1136 *(int *)result = sc->aw_host.caps;
1139 *(int *)result = sc->aw_host.ios.timing;
1142 *(int *)result = (sc->aw_mmc_conf->dma_xferlen *
1164 sc->aw_host.ios.bus_mode = value;
1167 sc->aw_host.ios.bus_width = value;
1170 sc->aw_host.ios.chip_select = value;
1173 sc->aw_host.ios.clock = value;
1176 sc->aw_host.mode = value;
1179 sc->aw_host.ocr = value;
1182 sc->aw_host.ios.power_mode = value;
1185 sc->aw_host.ios.vdd = value;
1188 sc->aw_host.ios.vccq = value;
1191 sc->aw_host.ios.timing = value;
1193 /* These are read-only */
1217 if (sc->aw_mmc_conf->mask_data0)
1227 while (reg & AW_MMC_CMDR_LOAD && --retry > 0) {
1234 device_printf(sc->aw_dev, "timeout updating clock\n");
1238 if (sc->aw_mmc_conf->mask_data0) {
1256 if (sc->mmc_helper.vqmmc_supply == NULL)
1259 switch (sc->aw_host.ios.vccq) {
1270 err = regulator_set_voltage(sc->mmc_helper.vqmmc_supply, uvolt, uvolt);
1272 device_printf(sc->aw_dev,
1273 "Cannot set vqmmc to %d<->%d\n",
1296 ios = &sc->aw_host.ios;
1299 switch (ios->bus_width) {
1311 switch (ios->power_mode) {
1316 device_printf(sc->aw_dev, "Powering down sd/mmc\n");
1318 if (sc->mmc_helper.vmmc_supply) {
1319 rv = regulator_status(sc->mmc_helper.vmmc_supply, ®_status);
1321 regulator_disable(sc->mmc_helper.vmmc_supply);
1323 if (sc->mmc_helper.vqmmc_supply) {
1324 rv = regulator_status(sc->mmc_helper.vqmmc_supply, ®_status);
1326 regulator_disable(sc->mmc_helper.vqmmc_supply);
1329 if (sc->mmc_helper.mmc_pwrseq)
1330 MMC_PWRSEQ_SET_POWER(sc->mmc_helper.mmc_pwrseq, false);
1336 device_printf(sc->aw_dev, "Powering up sd/mmc\n");
1338 if (sc->mmc_helper.vmmc_supply) {
1339 rv = regulator_status(sc->mmc_helper.vmmc_supply, ®_status);
1341 regulator_enable(sc->mmc_helper.vmmc_supply);
1343 if (sc->mmc_helper.vqmmc_supply) {
1344 rv = regulator_status(sc->mmc_helper.vqmmc_supply, ®_status);
1346 regulator_enable(sc->mmc_helper.vqmmc_supply);
1349 if (sc->mmc_helper.mmc_pwrseq)
1350 MMC_PWRSEQ_SET_POWER(sc->mmc_helper.mmc_pwrseq, true);
1357 if (ios->timing == bus_timing_uhs_ddr50 ||
1358 ios->timing == bus_timing_mmc_ddr52)
1364 if (ios->clock && ios->clock != sc->aw_clock) {
1365 sc->aw_clock = clock = ios->clock;
1372 if (ios->timing == bus_timing_mmc_ddr52 &&
1373 (sc->aw_mmc_conf->new_timing ||
1374 ios->bus_width == bus_width_8)) {
1382 reg |= div - 1;
1386 if (sc->aw_mmc_conf->new_timing) {
1393 error = clk_disable(sc->aw_clk_mmc);
1395 device_printf(sc->aw_dev,
1397 error = clk_set_freq(sc->aw_clk_mmc, clock,
1400 device_printf(sc->aw_dev,
1405 error = clk_enable(sc->aw_clk_mmc);
1407 device_printf(sc->aw_dev,
1408 "failed to re-enable mmc clock: %d\n", error);
1410 if (sc->aw_mmc_conf->can_calibrate)
1430 return (mmc_fdt_gpio_get_readonly(&sc->mmc_helper));
1441 while (sc->aw_bus_busy) {
1442 error = msleep(sc, &sc->aw_mtx, PCATCH, "mmchw", 0);
1448 sc->aw_bus_busy++;
1461 sc->aw_bus_busy--;