Lines Matching +full:k2g +full:- +full:gpio

1 // SPDX-License-Identifier: GPL-2.0-only
11 #include <linux/mmc/slot-gpio.h>
22 #include "sdhci-pltfm.h"
87 /* sdhci-omap controller flags */
124 return readl(host->base + offset); in sdhci_omap_readl()
130 writel(data, host->base + offset); in sdhci_omap_writel()
137 struct device *dev = omap_host->dev; in sdhci_omap_set_pbias()
139 if (IS_ERR(omap_host->pbias)) in sdhci_omap_set_pbias()
143 ret = regulator_set_voltage(omap_host->pbias, iov, iov); in sdhci_omap_set_pbias()
149 if (omap_host->pbias_enabled) in sdhci_omap_set_pbias()
152 ret = regulator_enable(omap_host->pbias); in sdhci_omap_set_pbias()
158 omap_host->pbias_enabled = true; in sdhci_omap_set_pbias()
160 if (!omap_host->pbias_enabled) in sdhci_omap_set_pbias()
163 ret = regulator_disable(omap_host->pbias); in sdhci_omap_set_pbias()
168 omap_host->pbias_enabled = false; in sdhci_omap_set_pbias()
178 struct sdhci_host *host = omap_host->host; in sdhci_omap_enable_iov()
179 struct mmc_host *mmc = host->mmc; in sdhci_omap_enable_iov()
185 if (!IS_ERR(mmc->supply.vqmmc)) { in sdhci_omap_enable_iov()
186 ret = regulator_set_voltage(mmc->supply.vqmmc, iov, iov); in sdhci_omap_enable_iov()
291 struct device *dev = omap_host->dev; in sdhci_omap_execute_tuning()
292 struct mmc_ios *ios = &mmc->ios; in sdhci_omap_execute_tuning()
305 if (ios->clock <= 52000000) in sdhci_omap_execute_tuning()
309 if (ios->timing == MMC_TIMING_UHS_SDR50 && !(reg & CAPA2_TSDR50)) in sdhci_omap_execute_tuning()
332 if (host->ier & SDHCI_INT_DATA_CRC) { in sdhci_omap_execute_tuning()
333 host->ier &= ~SDHCI_INT_DATA_CRC; in sdhci_omap_execute_tuning()
337 omap_host->is_tuning = true; in sdhci_omap_execute_tuning()
373 ret = -EIO; in sdhci_omap_execute_tuning()
381 if (temperature < -20000) in sdhci_omap_execute_tuning()
382 phase_delay = min(max_window + 4 * (max_len - 1) - 24, in sdhci_omap_execute_tuning()
401 * +2 to -10 range. If found, move away from it in the appropriate in sdhci_omap_execute_tuning()
411 phase_delay += i - 12; in sdhci_omap_execute_tuning()
413 phase_delay += i - 8; in sdhci_omap_execute_tuning()
415 phase_delay += i - 6; in sdhci_omap_execute_tuning()
421 for (i = 2; i >= -10; i--) { in sdhci_omap_execute_tuning()
443 ret = -EIO; in sdhci_omap_execute_tuning()
449 omap_host->is_tuning = false; in sdhci_omap_execute_tuning()
454 omap_host->is_tuning = false; in sdhci_omap_execute_tuning()
462 host->ier |= SDHCI_INT_DATA_CRC; in sdhci_omap_execute_tuning()
463 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_omap_execute_tuning()
464 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_omap_execute_tuning()
475 u32 ier = host->ier; in sdhci_omap_card_busy()
488 disable_irq(host->irq); in sdhci_omap_card_busy()
506 sdhci_writel(host, host->ier, SDHCI_INT_ENABLE); in sdhci_omap_card_busy()
507 sdhci_writel(host, host->ier, SDHCI_SIGNAL_ENABLE); in sdhci_omap_card_busy()
508 enable_irq(host->irq); in sdhci_omap_card_busy()
526 dev = omap_host->dev; in sdhci_omap_start_signal_voltage_switch()
528 if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_330) { in sdhci_omap_start_signal_voltage_switch()
531 return -EOPNOTSUPP; in sdhci_omap_start_signal_voltage_switch()
533 sdhci_omap_conf_bus_power(omap_host, ios->signal_voltage); in sdhci_omap_start_signal_voltage_switch()
540 } else if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_180) { in sdhci_omap_start_signal_voltage_switch()
543 return -EOPNOTSUPP; in sdhci_omap_start_signal_voltage_switch()
545 sdhci_omap_conf_bus_power(omap_host, ios->signal_voltage); in sdhci_omap_start_signal_voltage_switch()
553 return -EOPNOTSUPP; in sdhci_omap_start_signal_voltage_switch()
570 struct device *dev = omap_host->dev; in sdhci_omap_set_timing()
572 if (!(omap_host->flags & SDHCI_OMAP_REQUIRE_IODELAY)) in sdhci_omap_set_timing()
575 if (omap_host->timing == timing) in sdhci_omap_set_timing()
580 pinctrl_state = omap_host->pinctrl_state[timing]; in sdhci_omap_set_timing()
581 ret = pinctrl_select_state(omap_host->pinctrl, pinctrl_state); in sdhci_omap_set_timing()
588 omap_host->timing = timing; in sdhci_omap_set_timing()
594 if (omap_host->bus_mode == MMC_POWER_OFF) in sdhci_omap_set_power_mode()
596 omap_host->power_mode = power_mode; in sdhci_omap_set_power_mode()
604 if (omap_host->bus_mode == mode) in sdhci_omap_set_bus_mode()
614 omap_host->bus_mode = mode; in sdhci_omap_set_bus_mode()
626 sdhci_omap_set_bus_mode(omap_host, ios->bus_mode); in sdhci_omap_set_ios()
627 sdhci_omap_set_timing(omap_host, ios->timing); in sdhci_omap_set_ios()
629 sdhci_omap_set_power_mode(omap_host, ios->power_mode); in sdhci_omap_set_ios()
637 dsor = DIV_ROUND_UP(clk_get_rate(host->clk), clock); in sdhci_omap_calc_divisor()
683 struct mmc_host *mmc = host->mmc; in sdhci_omap_set_power()
685 mmc_regulator_set_ocr(mmc, mmc->supply.vmmc, vdd); in sdhci_omap_set_power()
697 if (!host->use_external_dma) in sdhci_omap_enable_dma()
709 return clk_get_rate(pltfm_host->clk) / SYSCTL_CLKD_MAX; in sdhci_omap_get_min_clock()
735 if (omap_host->power_mode == power_mode) in sdhci_omap_init_74_clocks()
741 disable_irq(host->irq); in sdhci_omap_init_74_clocks()
765 enable_irq(host->irq); in sdhci_omap_init_74_clocks()
797 if (omap_host->is_tuning) in sdhci_omap_reset()
800 if (omap_host->flags & SDHCI_OMAP_SPECIAL_RESET) { in sdhci_omap_reset()
811 dev_err(mmc_dev(host->mmc), in sdhci_omap_reset()
829 if (omap_host->is_tuning && host->cmd && !host->data_early && in sdhci_omap_irq()
839 host->cmd->error = -ETIMEDOUT; in sdhci_omap_irq()
841 host->cmd->error = -EILSEQ; in sdhci_omap_irq()
843 host->cmd = NULL; in sdhci_omap_irq()
860 if (cmd->opcode == MMC_ERASE) in sdhci_omap_set_timeout()
884 struct device *dev = omap_host->dev; in sdhci_omap_set_capabilities()
943 { .compatible = "ti,dra7-sdhci", .data = &dra7_data },
944 { .compatible = "ti,k2g-sdhci", .data = &k2g_data },
945 { .compatible = "ti,am335-sdhci", .data = &am335_data },
946 { .compatible = "ti,am437-sdhci", .data = &am437_data },
955 struct device *dev = omap_host->dev; in sdhci_omap_iodelay_pinctrl_state()
956 char *version = omap_host->version; in sdhci_omap_iodelay_pinctrl_state()
957 struct pinctrl_state *pinctrl_state = ERR_PTR(-ENODEV); in sdhci_omap_iodelay_pinctrl_state()
964 snprintf(str, 20, "%s-%s", mode, version); in sdhci_omap_iodelay_pinctrl_state()
965 pinctrl_state = pinctrl_lookup_state(omap_host->pinctrl, str); in sdhci_omap_iodelay_pinctrl_state()
969 pinctrl_state = pinctrl_lookup_state(omap_host->pinctrl, mode); in sdhci_omap_iodelay_pinctrl_state()
983 struct device *dev = omap_host->dev; in sdhci_omap_config_iodelay_pinctrl_state()
984 struct sdhci_host *host = omap_host->host; in sdhci_omap_config_iodelay_pinctrl_state()
985 struct mmc_host *mmc = host->mmc; in sdhci_omap_config_iodelay_pinctrl_state()
986 u32 *caps = &mmc->caps; in sdhci_omap_config_iodelay_pinctrl_state()
987 u32 *caps2 = &mmc->caps2; in sdhci_omap_config_iodelay_pinctrl_state()
991 if (!(omap_host->flags & SDHCI_OMAP_REQUIRE_IODELAY)) in sdhci_omap_config_iodelay_pinctrl_state()
999 return -ENOMEM; in sdhci_omap_config_iodelay_pinctrl_state()
1001 omap_host->pinctrl = devm_pinctrl_get(omap_host->dev); in sdhci_omap_config_iodelay_pinctrl_state()
1002 if (IS_ERR(omap_host->pinctrl)) { in sdhci_omap_config_iodelay_pinctrl_state()
1004 return PTR_ERR(omap_host->pinctrl); in sdhci_omap_config_iodelay_pinctrl_state()
1007 state = pinctrl_lookup_state(omap_host->pinctrl, "default"); in sdhci_omap_config_iodelay_pinctrl_state()
1066 omap_host->pinctrl_state = pinctrl_state; in sdhci_omap_config_iodelay_pinctrl_state()
1085 struct device *dev = &pdev->dev; in sdhci_omap_probe()
1097 return -EINVAL; in sdhci_omap_probe()
1099 data = (struct sdhci_omap_data *)match->data; in sdhci_omap_probe()
1102 return -EINVAL; in sdhci_omap_probe()
1104 offset = data->offset; in sdhci_omap_probe()
1108 return -ENXIO; in sdhci_omap_probe()
1119 omap_host->host = host; in sdhci_omap_probe()
1120 omap_host->base = host->ioaddr; in sdhci_omap_probe()
1121 omap_host->dev = dev; in sdhci_omap_probe()
1122 omap_host->power_mode = MMC_POWER_UNDEFINED; in sdhci_omap_probe()
1123 omap_host->timing = MMC_TIMING_LEGACY; in sdhci_omap_probe()
1124 omap_host->flags = data->flags; in sdhci_omap_probe()
1125 host->ioaddr += offset; in sdhci_omap_probe()
1126 host->mapbase = regs->start + offset; in sdhci_omap_probe()
1128 mmc = host->mmc; in sdhci_omap_probe()
1136 omap_host->version = "rev11"; in sdhci_omap_probe()
1138 mmc->f_max = 96000000; in sdhci_omap_probe()
1140 mmc->f_max = 48000000; in sdhci_omap_probe()
1142 mmc->f_max = 48000000; in sdhci_omap_probe()
1146 mmc->caps2 |= MMC_CAP2_NO_WRITE_PROTECT; in sdhci_omap_probe()
1148 pltfm_host->clk = devm_clk_get(dev, "fck"); in sdhci_omap_probe()
1149 if (IS_ERR(pltfm_host->clk)) { in sdhci_omap_probe()
1150 ret = PTR_ERR(pltfm_host->clk); in sdhci_omap_probe()
1154 ret = clk_set_rate(pltfm_host->clk, mmc->f_max); in sdhci_omap_probe()
1156 dev_err(dev, "failed to set clock to %d\n", mmc->f_max); in sdhci_omap_probe()
1160 omap_host->pbias = devm_regulator_get_optional(dev, "pbias"); in sdhci_omap_probe()
1161 if (IS_ERR(omap_host->pbias)) { in sdhci_omap_probe()
1162 ret = PTR_ERR(omap_host->pbias); in sdhci_omap_probe()
1163 if (ret != -ENODEV) in sdhci_omap_probe()
1167 omap_host->pbias_enabled = false; in sdhci_omap_probe()
1188 host->mmc_host_ops.start_signal_voltage_switch = in sdhci_omap_probe()
1190 host->mmc_host_ops.set_ios = sdhci_omap_set_ios; in sdhci_omap_probe()
1191 host->mmc_host_ops.card_busy = sdhci_omap_card_busy; in sdhci_omap_probe()
1192 host->mmc_host_ops.execute_tuning = sdhci_omap_execute_tuning; in sdhci_omap_probe()
1193 host->mmc_host_ops.enable_sdio_irq = sdhci_omap_enable_sdio_irq; in sdhci_omap_probe()
1196 if (of_find_property(dev->of_node, "dmas", NULL)) in sdhci_omap_probe()
1200 mmc->caps |= MMC_CAP_NEED_RSP_BUSY; in sdhci_omap_probe()
1232 struct device *dev = &pdev->dev; in sdhci_omap_remove()
1245 omap_host->con = sdhci_omap_readl(omap_host, SDHCI_OMAP_CON); in sdhci_omap_context_save()
1246 omap_host->hctl = sdhci_omap_readl(omap_host, SDHCI_OMAP_HCTL); in sdhci_omap_context_save()
1247 omap_host->capa = sdhci_omap_readl(omap_host, SDHCI_OMAP_CAPA); in sdhci_omap_context_save()
1252 sdhci_omap_writel(omap_host, SDHCI_OMAP_CON, omap_host->con); in sdhci_omap_context_restore()
1253 sdhci_omap_writel(omap_host, SDHCI_OMAP_HCTL, omap_host->hctl); in sdhci_omap_context_restore()
1254 sdhci_omap_writel(omap_host, SDHCI_OMAP_CAPA, omap_host->capa); in sdhci_omap_context_restore()
1298 .name = "sdhci-omap",