Lines Matching +full:efuse +full:- +full:settings
1 // SPDX-License-Identifier: GPL-2.0-only
13 #include <linux/nvmem-provider.h>
20 /* Amount of time required to hold charge to blow fuse in micro-seconds */
41 * struct qfprom_soc_data - config that varies from SoC to SoC.
44 * @qfprom_blow_timer_value: The timer value of qfprom when doing efuse blow.
55 * struct qfprom_priv - structure holding qfprom attributes
57 * @qfpraw: iomapped memory space for qfprom-efuse raw address space.
58 * @qfpconf: iomapped memory space for qfprom-efuse configuration address
79 * struct qfprom_touched_values - saved values to restore after blowing
92 * qfprom_disable_fuse_blowing() - Undo enabling of fuse blowing.
97 * and voltage settings.
107 writel(old->timer_val, priv->qfpconf + QFPROM_BLOW_TIMER_OFFSET); in qfprom_disable_fuse_blowing()
108 writel(old->accel_val, priv->qfpconf + QFPROM_ACCEL_OFFSET); in qfprom_disable_fuse_blowing()
116 ret = regulator_set_voltage(priv->vcc, 0, INT_MAX); in qfprom_disable_fuse_blowing()
118 dev_warn(priv->dev, "Failed to set 0 voltage (ignoring)\n"); in qfprom_disable_fuse_blowing()
120 ret = regulator_disable(priv->vcc); in qfprom_disable_fuse_blowing()
122 dev_warn(priv->dev, "Failed to disable regulator (ignoring)\n"); in qfprom_disable_fuse_blowing()
124 ret = clk_set_rate(priv->secclk, old->clk_rate); in qfprom_disable_fuse_blowing()
126 dev_warn(priv->dev, in qfprom_disable_fuse_blowing()
129 clk_disable_unprepare(priv->secclk); in qfprom_disable_fuse_blowing()
133 * qfprom_enable_fuse_blowing() - Enable fuse blowing.
138 * and voltage settings.
142 * Return: 0 or -err.
149 ret = clk_prepare_enable(priv->secclk); in qfprom_enable_fuse_blowing()
151 dev_err(priv->dev, "Failed to enable clock\n"); in qfprom_enable_fuse_blowing()
155 old->clk_rate = clk_get_rate(priv->secclk); in qfprom_enable_fuse_blowing()
156 ret = clk_set_rate(priv->secclk, priv->soc_data->qfprom_blow_set_freq); in qfprom_enable_fuse_blowing()
158 dev_err(priv->dev, "Failed to set clock rate for enable\n"); in qfprom_enable_fuse_blowing()
164 * a rail shared do don't specify a max--regulator constraints in qfprom_enable_fuse_blowing()
167 ret = regulator_set_voltage(priv->vcc, 1800000, INT_MAX); in qfprom_enable_fuse_blowing()
169 dev_err(priv->dev, "Failed to set 1.8 voltage\n"); in qfprom_enable_fuse_blowing()
173 ret = regulator_enable(priv->vcc); in qfprom_enable_fuse_blowing()
175 dev_err(priv->dev, "Failed to enable regulator\n"); in qfprom_enable_fuse_blowing()
179 old->timer_val = readl(priv->qfpconf + QFPROM_BLOW_TIMER_OFFSET); in qfprom_enable_fuse_blowing()
180 old->accel_val = readl(priv->qfpconf + QFPROM_ACCEL_OFFSET); in qfprom_enable_fuse_blowing()
181 writel(priv->soc_data->qfprom_blow_timer_value, in qfprom_enable_fuse_blowing()
182 priv->qfpconf + QFPROM_BLOW_TIMER_OFFSET); in qfprom_enable_fuse_blowing()
183 writel(priv->soc_data->accel_value, in qfprom_enable_fuse_blowing()
184 priv->qfpconf + QFPROM_ACCEL_OFFSET); in qfprom_enable_fuse_blowing()
189 clk_set_rate(priv->secclk, old->clk_rate); in qfprom_enable_fuse_blowing()
191 clk_disable_unprepare(priv->secclk); in qfprom_enable_fuse_blowing()
196 * qfprom_efuse_reg_write() - Write to fuses.
204 * Return: 0 or -err.
217 dev_dbg(priv->dev, in qfprom_reg_write()
227 dev_err(priv->dev, in qfprom_reg_write()
229 return -EINVAL; in qfprom_reg_write()
232 dev_err(priv->dev, in qfprom_reg_write()
234 return -EINVAL; in qfprom_reg_write()
242 priv->qfpconf + QFPROM_BLOW_STATUS_OFFSET, in qfprom_reg_write()
247 dev_err(priv->dev, in qfprom_reg_write()
253 writel(value[i], priv->qfpraw + reg + (i * 4)); in qfprom_reg_write()
256 priv->qfpconf + QFPROM_BLOW_STATUS_OFFSET, in qfprom_reg_write()
262 dev_err(priv->dev, "Timeout waiting for finish.\n"); in qfprom_reg_write()
276 void __iomem *base = priv->qfpcorrected; in qfprom_reg_read()
278 if (read_raw_data && priv->qfpraw) in qfprom_reg_read()
279 base = priv->qfpraw; in qfprom_reg_read()
281 while (words--) in qfprom_reg_read()
302 struct device *dev = &pdev->dev; in qfprom_probe()
310 return -ENOMEM; in qfprom_probe()
314 priv->qfpcorrected = devm_ioremap_resource(dev, res); in qfprom_probe()
315 if (IS_ERR(priv->qfpcorrected)) in qfprom_probe()
316 return PTR_ERR(priv->qfpcorrected); in qfprom_probe()
322 priv->dev = dev; in qfprom_probe()
333 priv->qfpraw = devm_ioremap_resource(dev, res); in qfprom_probe()
334 if (IS_ERR(priv->qfpraw)) in qfprom_probe()
335 return PTR_ERR(priv->qfpraw); in qfprom_probe()
337 priv->qfpconf = devm_ioremap_resource(dev, res); in qfprom_probe()
338 if (IS_ERR(priv->qfpconf)) in qfprom_probe()
339 return PTR_ERR(priv->qfpconf); in qfprom_probe()
341 priv->qfpsecurity = devm_ioremap_resource(dev, res); in qfprom_probe()
342 if (IS_ERR(priv->qfpsecurity)) in qfprom_probe()
343 return PTR_ERR(priv->qfpsecurity); in qfprom_probe()
345 version = readl(priv->qfpsecurity + QFPROM_VERSION_OFFSET); in qfprom_probe()
352 priv->soc_data = &qfprom_7_8_data; in qfprom_probe()
354 priv->vcc = devm_regulator_get(&pdev->dev, "vcc"); in qfprom_probe()
355 if (IS_ERR(priv->vcc)) in qfprom_probe()
356 return PTR_ERR(priv->vcc); in qfprom_probe()
358 priv->secclk = devm_clk_get(dev, "core"); in qfprom_probe()
359 if (IS_ERR(priv->secclk)) { in qfprom_probe()
360 ret = PTR_ERR(priv->secclk); in qfprom_probe()
361 if (ret != -EPROBE_DEFER) in qfprom_probe()
367 if (priv->soc_data) in qfprom_probe()