Lines Matching +full:mmc +full:- +full:slot

1 // SPDX-License-Identifier: GPL-2.0-or-later
11 #include <linux/mmc/host.h>
20 #include "dw_mmc-pltfm.h"
106 ret = clk_set_rate(host->ciu_clk, ios->clock); in dw_mci_k3_set_ios()
108 dev_warn(host->dev, "failed to set rate %uHz\n", ios->clock); in dw_mci_k3_set_ios()
110 host->bus_hz = clk_get_rate(host->ciu_clk); in dw_mci_k3_set_ios()
121 priv = devm_kzalloc(host->dev, sizeof(*priv), GFP_KERNEL); in dw_mci_hi6220_parse_dt()
123 return -ENOMEM; in dw_mci_hi6220_parse_dt()
125 priv->reg = syscon_regmap_lookup_by_phandle(host->dev->of_node, in dw_mci_hi6220_parse_dt()
126 "hisilicon,peripheral-syscon"); in dw_mci_hi6220_parse_dt()
127 if (IS_ERR(priv->reg)) in dw_mci_hi6220_parse_dt()
128 priv->reg = NULL; in dw_mci_hi6220_parse_dt()
130 priv->ctrl_id = of_alias_get_id(host->dev->of_node, "mshc"); in dw_mci_hi6220_parse_dt()
131 if (priv->ctrl_id < 0) in dw_mci_hi6220_parse_dt()
132 priv->ctrl_id = 0; in dw_mci_hi6220_parse_dt()
134 if (priv->ctrl_id >= TIMING_MODE) in dw_mci_hi6220_parse_dt()
135 return -EINVAL; in dw_mci_hi6220_parse_dt()
137 host->priv = priv; in dw_mci_hi6220_parse_dt()
141 static int dw_mci_hi6220_switch_voltage(struct mmc_host *mmc, struct mmc_ios *ios) in dw_mci_hi6220_switch_voltage() argument
143 struct dw_mci_slot *slot = mmc_priv(mmc); in dw_mci_hi6220_switch_voltage() local
149 host = slot->host; in dw_mci_hi6220_switch_voltage()
150 priv = host->priv; in dw_mci_hi6220_switch_voltage()
152 if (!priv || !priv->reg) in dw_mci_hi6220_switch_voltage()
155 if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_330) { in dw_mci_hi6220_switch_voltage()
156 ret = regmap_update_bits(priv->reg, AO_SCTRL_CTRL3, in dw_mci_hi6220_switch_voltage()
160 } else if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_180) { in dw_mci_hi6220_switch_voltage()
161 ret = regmap_update_bits(priv->reg, AO_SCTRL_CTRL3, in dw_mci_hi6220_switch_voltage()
166 dev_dbg(host->dev, "voltage not supported\n"); in dw_mci_hi6220_switch_voltage()
167 return -EINVAL; in dw_mci_hi6220_switch_voltage()
171 dev_dbg(host->dev, "switch voltage failed\n"); in dw_mci_hi6220_switch_voltage()
175 if (IS_ERR_OR_NULL(mmc->supply.vqmmc)) in dw_mci_hi6220_switch_voltage()
178 ret = regulator_set_voltage(mmc->supply.vqmmc, min_uv, max_uv); in dw_mci_hi6220_switch_voltage()
180 dev_dbg(host->dev, "Regulator set error %d: %d - %d\n", in dw_mci_hi6220_switch_voltage()
193 clock = (ios->clock <= 25000000) ? 25000000 : ios->clock; in dw_mci_hi6220_set_ios()
195 ret = clk_set_rate(host->biu_clk, clock); in dw_mci_hi6220_set_ios()
197 dev_warn(host->dev, "failed to set rate %uHz\n", clock); in dw_mci_hi6220_set_ios()
199 host->bus_hz = clk_get_rate(host->biu_clk); in dw_mci_hi6220_set_ios()
202 static int dw_mci_hi6220_execute_tuning(struct dw_mci_slot *slot, u32 opcode) in dw_mci_hi6220_execute_tuning() argument
227 priv = host->priv; in dw_mci_hs_set_timing()
228 ctrl_id = priv->ctrl_id; in dw_mci_hs_set_timing()
232 if (smpl_phase == -1) in dw_mci_hs_set_timing()
272 dw_mci_hs_set_timing(host, MMC_TIMING_LEGACY, -1); in dw_mci_hi3660_init()
273 host->bus_hz /= (GENCLK_DIV + 1); in dw_mci_hi3660_init()
284 priv = host->priv; in dw_mci_set_sel18()
287 ret = regmap_update_bits(priv->reg, SOC_SCTRL_SCPERCTRL5, in dw_mci_set_sel18()
290 dev_err(host->dev, "sel18 %u error\n", val); in dw_mci_set_sel18()
302 struct k3_priv *priv = host->priv; in dw_mci_hi3660_set_ios()
304 if (!ios->clock || ios->clock == priv->cur_speed) in dw_mci_hi3660_set_ios()
307 wanted = ios->clock * (GENCLK_DIV + 1); in dw_mci_hi3660_set_ios()
308 ret = clk_set_rate(host->ciu_clk, wanted); in dw_mci_hi3660_set_ios()
310 dev_err(host->dev, "failed to set rate %luHz\n", wanted); in dw_mci_hi3660_set_ios()
313 actual = clk_get_rate(host->ciu_clk); in dw_mci_hi3660_set_ios()
315 dw_mci_hs_set_timing(host, ios->timing, -1); in dw_mci_hi3660_set_ios()
316 host->bus_hz = actual / (GENCLK_DIV + 1); in dw_mci_hi3660_set_ios()
317 host->current_speed = 0; in dw_mci_hi3660_set_ios()
318 priv->cur_speed = host->bus_hz; in dw_mci_hi3660_set_ios()
332 return -EIO; in dw_mci_get_best_clksmpl()
337 i = ffs(sample_flag) - 1; in dw_mci_get_best_clksmpl()
346 len = ffs(~v) - 1; in dw_mci_get_best_clksmpl()
353 interval = ffs(v >> len) - 1; in dw_mci_get_best_clksmpl()
367 static int dw_mci_hi3660_execute_tuning(struct dw_mci_slot *slot, u32 opcode) in dw_mci_hi3660_execute_tuning() argument
370 struct dw_mci *host = slot->host; in dw_mci_hi3660_execute_tuning()
371 struct mmc_host *mmc = slot->mmc; in dw_mci_hi3660_execute_tuning() local
380 dw_mci_hs_set_timing(host, mmc->ios.timing, smpl_phase); in dw_mci_hi3660_execute_tuning()
382 if (!mmc_send_tuning(mmc, opcode, NULL)) in dw_mci_hi3660_execute_tuning()
390 dev_err(host->dev, "All phases bad!\n"); in dw_mci_hi3660_execute_tuning()
391 return -EIO; in dw_mci_hi3660_execute_tuning()
394 dw_mci_hs_set_timing(host, mmc->ios.timing, best_clksmpl); in dw_mci_hi3660_execute_tuning()
396 dev_info(host->dev, "tuning ok best_clksmpl %u tuning_sample_flag %x\n", in dw_mci_hi3660_execute_tuning()
401 static int dw_mci_hi3660_switch_voltage(struct mmc_host *mmc, in dw_mci_hi3660_switch_voltage() argument
405 struct dw_mci_slot *slot = mmc_priv(mmc); in dw_mci_hi3660_switch_voltage() local
409 host = slot->host; in dw_mci_hi3660_switch_voltage()
410 priv = host->priv; in dw_mci_hi3660_switch_voltage()
412 if (!priv || !priv->reg) in dw_mci_hi3660_switch_voltage()
415 if (priv->ctrl_id == DWMMC_SDIO_ID) in dw_mci_hi3660_switch_voltage()
418 if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_330) in dw_mci_hi3660_switch_voltage()
420 else if (ios->signal_voltage == MMC_SIGNAL_VOLTAGE_180) in dw_mci_hi3660_switch_voltage()
425 if (!IS_ERR(mmc->supply.vqmmc)) { in dw_mci_hi3660_switch_voltage()
426 ret = mmc_regulator_set_vqmmc(mmc, ios); in dw_mci_hi3660_switch_voltage()
428 dev_err(host->dev, "Regulator set error %d\n", ret); in dw_mci_hi3660_switch_voltage()
445 { .compatible = "hisilicon,hi3660-dw-mshc", .data = &hi3660_data, },
446 { .compatible = "hisilicon,hi4511-dw-mshc", .data = &k3_drv_data, },
447 { .compatible = "hisilicon,hi6220-dw-mshc", .data = &hi6220_data, },
457 match = of_match_node(dw_mci_k3_match, pdev->dev.of_node); in dw_mci_k3_probe()
458 drv_data = match->data; in dw_mci_k3_probe()
484 MODULE_DESCRIPTION("K3 Specific DW-MSHC Driver Extension");