Lines Matching +full:vs +full:- +full:supply
1 // SPDX-License-Identifier: GPL-2.0-only
13 #include <linux/nvmem-provider.h>
23 /* Amount of time required to hold charge to blow fuse in micro-seconds */
44 * struct qfprom_soc_data - config that varies from SoC to SoC.
60 * struct qfprom_priv - structure holding qfprom attributes
62 * @qfpraw: iomapped memory space for qfprom-efuse raw address space.
63 * @qfpconf: iomapped memory space for qfprom-efuse configuration address
68 * @secclk: Clock supply.
69 * @vcc: Regulator supply.
84 * struct qfprom_touched_values - saved values to restore after blowing
97 * struct qfprom_soc_compatible_data - Data matched against the SoC
129 * qfprom_disable_fuse_blowing() - Undo enabling of fuse blowing.
144 writel(old->timer_val, priv->qfpconf + QFPROM_BLOW_TIMER_OFFSET); in qfprom_disable_fuse_blowing()
145 writel(old->accel_val, priv->qfpconf + QFPROM_ACCEL_OFFSET); in qfprom_disable_fuse_blowing()
147 dev_pm_genpd_set_performance_state(priv->dev, 0); in qfprom_disable_fuse_blowing()
148 pm_runtime_put(priv->dev); in qfprom_disable_fuse_blowing()
156 ret = regulator_set_voltage(priv->vcc, 0, INT_MAX); in qfprom_disable_fuse_blowing()
158 dev_warn(priv->dev, "Failed to set 0 voltage (ignoring)\n"); in qfprom_disable_fuse_blowing()
160 ret = regulator_disable(priv->vcc); in qfprom_disable_fuse_blowing()
162 dev_warn(priv->dev, "Failed to disable regulator (ignoring)\n"); in qfprom_disable_fuse_blowing()
164 ret = clk_set_rate(priv->secclk, old->clk_rate); in qfprom_disable_fuse_blowing()
166 dev_warn(priv->dev, in qfprom_disable_fuse_blowing()
169 clk_disable_unprepare(priv->secclk); in qfprom_disable_fuse_blowing()
173 * qfprom_enable_fuse_blowing() - Enable fuse blowing.
182 * Return: 0 or -err.
188 int qfprom_blow_uV = priv->soc_data->qfprom_blow_uV; in qfprom_enable_fuse_blowing()
190 ret = clk_prepare_enable(priv->secclk); in qfprom_enable_fuse_blowing()
192 dev_err(priv->dev, "Failed to enable clock\n"); in qfprom_enable_fuse_blowing()
196 old->clk_rate = clk_get_rate(priv->secclk); in qfprom_enable_fuse_blowing()
197 ret = clk_set_rate(priv->secclk, priv->soc_data->qfprom_blow_set_freq); in qfprom_enable_fuse_blowing()
199 dev_err(priv->dev, "Failed to set clock rate for enable\n"); in qfprom_enable_fuse_blowing()
208 ret = regulator_set_voltage(priv->vcc, qfprom_blow_uV, INT_MAX); in qfprom_enable_fuse_blowing()
210 dev_err(priv->dev, "Failed to set %duV\n", qfprom_blow_uV); in qfprom_enable_fuse_blowing()
214 ret = regulator_enable(priv->vcc); in qfprom_enable_fuse_blowing()
216 dev_err(priv->dev, "Failed to enable regulator\n"); in qfprom_enable_fuse_blowing()
220 ret = pm_runtime_resume_and_get(priv->dev); in qfprom_enable_fuse_blowing()
222 dev_err(priv->dev, "Failed to enable power-domain\n"); in qfprom_enable_fuse_blowing()
225 dev_pm_genpd_set_performance_state(priv->dev, INT_MAX); in qfprom_enable_fuse_blowing()
227 old->timer_val = readl(priv->qfpconf + QFPROM_BLOW_TIMER_OFFSET); in qfprom_enable_fuse_blowing()
228 old->accel_val = readl(priv->qfpconf + QFPROM_ACCEL_OFFSET); in qfprom_enable_fuse_blowing()
229 writel(priv->soc_data->qfprom_blow_timer_value, in qfprom_enable_fuse_blowing()
230 priv->qfpconf + QFPROM_BLOW_TIMER_OFFSET); in qfprom_enable_fuse_blowing()
231 writel(priv->soc_data->accel_value, in qfprom_enable_fuse_blowing()
232 priv->qfpconf + QFPROM_ACCEL_OFFSET); in qfprom_enable_fuse_blowing()
237 regulator_disable(priv->vcc); in qfprom_enable_fuse_blowing()
239 clk_set_rate(priv->secclk, old->clk_rate); in qfprom_enable_fuse_blowing()
241 clk_disable_unprepare(priv->secclk); in qfprom_enable_fuse_blowing()
246 * qfprom_reg_write() - Write to fuses.
254 * Return: 0 or -err.
267 dev_dbg(priv->dev, in qfprom_reg_write()
274 * word_size and stride for reading vs. writing, we'll enforce here. in qfprom_reg_write()
277 dev_err(priv->dev, in qfprom_reg_write()
279 return -EINVAL; in qfprom_reg_write()
282 dev_err(priv->dev, in qfprom_reg_write()
284 return -EINVAL; in qfprom_reg_write()
292 priv->qfpconf + QFPROM_BLOW_STATUS_OFFSET, in qfprom_reg_write()
297 dev_err(priv->dev, in qfprom_reg_write()
303 writel(value[i], priv->qfpraw + reg + (i * 4)); in qfprom_reg_write()
306 priv->qfpconf + QFPROM_BLOW_STATUS_OFFSET, in qfprom_reg_write()
312 dev_err(priv->dev, "Timeout waiting for finish.\n"); in qfprom_reg_write()
326 void __iomem *base = priv->qfpcorrected; in qfprom_reg_read()
328 if (read_raw_data && priv->qfpraw) in qfprom_reg_read()
329 base = priv->qfpraw; in qfprom_reg_read()
331 while (words--) in qfprom_reg_read()
365 struct device *dev = &pdev->dev; in qfprom_probe()
374 return -ENOMEM; in qfprom_probe()
378 priv->qfpcorrected = devm_ioremap_resource(dev, res); in qfprom_probe()
379 if (IS_ERR(priv->qfpcorrected)) in qfprom_probe()
380 return PTR_ERR(priv->qfpcorrected); in qfprom_probe()
386 priv->dev = dev; in qfprom_probe()
389 econfig.keepout = soc_data->keepout; in qfprom_probe()
390 econfig.nkeepout = soc_data->nkeepout; in qfprom_probe()
402 priv->qfpraw = devm_ioremap_resource(dev, res); in qfprom_probe()
403 if (IS_ERR(priv->qfpraw)) in qfprom_probe()
404 return PTR_ERR(priv->qfpraw); in qfprom_probe()
406 priv->qfpconf = devm_ioremap_resource(dev, res); in qfprom_probe()
407 if (IS_ERR(priv->qfpconf)) in qfprom_probe()
408 return PTR_ERR(priv->qfpconf); in qfprom_probe()
410 priv->qfpsecurity = devm_ioremap_resource(dev, res); in qfprom_probe()
411 if (IS_ERR(priv->qfpsecurity)) in qfprom_probe()
412 return PTR_ERR(priv->qfpsecurity); in qfprom_probe()
414 version = readl(priv->qfpsecurity + QFPROM_VERSION_OFFSET); in qfprom_probe()
421 priv->soc_data = &qfprom_7_8_data; in qfprom_probe()
423 priv->soc_data = &qfprom_7_15_data; in qfprom_probe()
425 priv->vcc = devm_regulator_get(&pdev->dev, "vcc"); in qfprom_probe()
426 if (IS_ERR(priv->vcc)) in qfprom_probe()
427 return PTR_ERR(priv->vcc); in qfprom_probe()
429 priv->secclk = devm_clk_get(dev, "core"); in qfprom_probe()
430 if (IS_ERR(priv->secclk)) { in qfprom_probe()
431 ret = PTR_ERR(priv->secclk); in qfprom_probe()
432 if (ret != -EPROBE_DEFER) in qfprom_probe()
438 if (priv->soc_data) in qfprom_probe()
454 { .compatible = "qcom,sc7180-qfprom", .data = &sc7180_qfprom},
455 { .compatible = "qcom,sc7280-qfprom", .data = &sc7280_qfprom},