Lines Matching full:fuse
24 #include <soc/tegra/fuse.h>
26 #include "fuse.h"
63 static struct tegra_fuse *fuse = &(struct tegra_fuse) { variable
103 struct tegra_fuse *fuse = priv; in tegra_fuse_read() local
107 buffer[i] = fuse->read(fuse, offset + i * 4); in tegra_fuse_read()
114 fuse->base = (void __iomem *)base; in tegra_fuse_restore()
115 fuse->clk = NULL; in tegra_fuse_restore()
128 static int tegra_fuse_add_lookups(struct tegra_fuse *fuse) in tegra_fuse_add_lookups() argument
130 fuse->lookups = kmemdup_array(fuse->soc->lookups, fuse->soc->num_lookups, in tegra_fuse_add_lookups()
131 sizeof(*fuse->lookups), GFP_KERNEL); in tegra_fuse_add_lookups()
132 if (!fuse->lookups) in tegra_fuse_add_lookups()
135 nvmem_add_cell_lookups(fuse->lookups, fuse->soc->num_lookups); in tegra_fuse_add_lookups()
142 void __iomem *base = fuse->base; in tegra_fuse_probe()
152 fuse->base = devm_platform_get_and_ioremap_resource(pdev, 0, &res); in tegra_fuse_probe()
153 if (IS_ERR(fuse->base)) in tegra_fuse_probe()
154 return PTR_ERR(fuse->base); in tegra_fuse_probe()
155 fuse->phys = res->start; in tegra_fuse_probe()
158 if (is_acpi_node(dev_fwnode(&pdev->dev)) && !fuse->soc) { in tegra_fuse_probe()
167 fuse->soc = &tegra194_fuse_soc; in tegra_fuse_probe()
172 fuse->soc = &tegra234_fuse_soc; in tegra_fuse_probe()
177 fuse->soc = &tegra241_fuse_soc; in tegra_fuse_probe()
184 fuse->soc->init(fuse); in tegra_fuse_probe()
186 err = tegra_fuse_add_lookups(fuse); in tegra_fuse_probe()
188 return dev_err_probe(&pdev->dev, err, "failed to add FUSE lookups\n"); in tegra_fuse_probe()
191 fuse->clk = devm_clk_get_optional(&pdev->dev, "fuse"); in tegra_fuse_probe()
192 if (IS_ERR(fuse->clk)) in tegra_fuse_probe()
193 return dev_err_probe(&pdev->dev, PTR_ERR(fuse->clk), "failed to get FUSE clock\n"); in tegra_fuse_probe()
195 platform_set_drvdata(pdev, fuse); in tegra_fuse_probe()
196 fuse->dev = &pdev->dev; in tegra_fuse_probe()
202 if (fuse->soc->probe) { in tegra_fuse_probe()
203 err = fuse->soc->probe(fuse); in tegra_fuse_probe()
210 nvmem.name = "fuse"; in tegra_fuse_probe()
213 nvmem.cells = fuse->soc->cells; in tegra_fuse_probe()
214 nvmem.ncells = fuse->soc->num_cells; in tegra_fuse_probe()
215 nvmem.keepout = fuse->soc->keepouts; in tegra_fuse_probe()
216 nvmem.nkeepout = fuse->soc->num_keepouts; in tegra_fuse_probe()
221 nvmem.size = fuse->soc->info->size; in tegra_fuse_probe()
224 nvmem.priv = fuse; in tegra_fuse_probe()
226 fuse->nvmem = devm_nvmem_register(&pdev->dev, &nvmem); in tegra_fuse_probe()
227 if (IS_ERR(fuse->nvmem)) { in tegra_fuse_probe()
228 err = PTR_ERR(fuse->nvmem); in tegra_fuse_probe()
234 fuse->rst = devm_reset_control_get_optional(&pdev->dev, "fuse"); in tegra_fuse_probe()
235 if (IS_ERR(fuse->rst)) in tegra_fuse_probe()
236 return dev_err_probe(&pdev->dev, PTR_ERR(fuse->rst), "failed to get FUSE reset\n"); in tegra_fuse_probe()
239 * FUSE clock is enabled at a boot time, hence this resume/suspend in tegra_fuse_probe()
246 err = reset_control_reset(fuse->rst); in tegra_fuse_probe()
250 dev_err(&pdev->dev, "failed to reset FUSE: %d\n", err); in tegra_fuse_probe()
264 err = clk_prepare_enable(fuse->clk); in tegra_fuse_runtime_resume()
266 dev_err(dev, "failed to enable FUSE clock: %d\n", err); in tegra_fuse_runtime_resume()
275 clk_disable_unprepare(fuse->clk); in tegra_fuse_runtime_suspend()
288 if (fuse->soc->clk_suspend_on) in tegra_fuse_suspend()
300 if (fuse->soc->clk_suspend_on) in tegra_fuse_resume()
322 .name = "tegra-fuse",
334 unsigned int offset = fuse->soc->info->spare + spare * 4; in tegra_fuse_read_spare()
336 return fuse->read_early(fuse, offset) & 1; in tegra_fuse_read_spare()
341 return fuse->read_early(fuse, offset); in tegra_fuse_read_early()
346 if (!fuse->dev) in tegra_fuse_readl()
350 * Wait for fuse->clk to be initialized if device-tree boot is used. in tegra_fuse_readl()
352 if (is_of_node(dev_fwnode(fuse->dev)) && !fuse->clk) in tegra_fuse_readl()
355 if (!fuse->read) in tegra_fuse_readl()
358 if (IS_ERR(fuse->clk)) in tegra_fuse_readl()
359 return PTR_ERR(fuse->clk); in tegra_fuse_readl()
361 *value = fuse->read(fuse, offset); in tegra_fuse_readl()
376 * Enable FUSE clock. This needs to be hardcoded because the clock in tegra_enable_fuse_clk()
457 attr->custom_attr_group = fuse->soc->soc_attr_group; in tegra_soc_device_register()
485 * a FUSE node. in tegra_init_fuse()
488 * that didn't contain a FUSE node. in tegra_init_fuse()
500 fuse->soc = &tegra20_fuse_soc; in tegra_init_fuse()
506 fuse->soc = &tegra30_fuse_soc; in tegra_init_fuse()
512 fuse->soc = &tegra114_fuse_soc; in tegra_init_fuse()
518 fuse->soc = &tegra124_fuse_soc; in tegra_init_fuse()
539 pr_err("failed to get FUSE register\n"); in tegra_init_fuse()
543 fuse->soc = match->data; in tegra_init_fuse()
559 fuse->base = ioremap(regs.start, resource_size(®s)); in tegra_init_fuse()
560 if (!fuse->base) { in tegra_init_fuse()
561 pr_err("failed to map FUSE registers\n"); in tegra_init_fuse()
565 fuse->soc->init(fuse); in tegra_init_fuse()
569 err = tegra_fuse_add_lookups(fuse); in tegra_init_fuse()
571 pr_err("failed to add FUSE lookups\n"); in tegra_init_fuse()