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()
188 err = tegra_fuse_add_lookups(fuse); in tegra_fuse_probe()
190 return dev_err_probe(&pdev->dev, err, "failed to add FUSE lookups\n"); in tegra_fuse_probe()
193 fuse->clk = devm_clk_get_optional(&pdev->dev, "fuse"); in tegra_fuse_probe()
194 if (IS_ERR(fuse->clk)) in tegra_fuse_probe()
195 return dev_err_probe(&pdev->dev, PTR_ERR(fuse->clk), "failed to get FUSE clock\n"); in tegra_fuse_probe()
197 platform_set_drvdata(pdev, fuse); in tegra_fuse_probe()
198 fuse->dev = &pdev->dev; in tegra_fuse_probe()
204 if (fuse->soc->probe) { in tegra_fuse_probe()
205 err = fuse->soc->probe(fuse); in tegra_fuse_probe()
212 nvmem.name = "fuse"; in tegra_fuse_probe()
215 nvmem.cells = fuse->soc->cells; in tegra_fuse_probe()
216 nvmem.ncells = fuse->soc->num_cells; in tegra_fuse_probe()
217 nvmem.keepout = fuse->soc->keepouts; in tegra_fuse_probe()
218 nvmem.nkeepout = fuse->soc->num_keepouts; in tegra_fuse_probe()
223 nvmem.size = fuse->soc->info->size; in tegra_fuse_probe()
226 nvmem.priv = fuse; in tegra_fuse_probe()
228 fuse->nvmem = devm_nvmem_register(&pdev->dev, &nvmem); in tegra_fuse_probe()
229 if (IS_ERR(fuse->nvmem)) { in tegra_fuse_probe()
230 err = PTR_ERR(fuse->nvmem); in tegra_fuse_probe()
236 fuse->rst = devm_reset_control_get_optional(&pdev->dev, "fuse"); in tegra_fuse_probe()
237 if (IS_ERR(fuse->rst)) in tegra_fuse_probe()
238 return dev_err_probe(&pdev->dev, PTR_ERR(fuse->rst), "failed to get FUSE reset\n"); in tegra_fuse_probe()
241 * FUSE clock is enabled at a boot time, hence this resume/suspend in tegra_fuse_probe()
248 err = reset_control_reset(fuse->rst); in tegra_fuse_probe()
252 dev_err(&pdev->dev, "failed to reset FUSE: %d\n", err); in tegra_fuse_probe()
266 err = clk_prepare_enable(fuse->clk); in tegra_fuse_runtime_resume()
268 dev_err(dev, "failed to enable FUSE clock: %d\n", err); in tegra_fuse_runtime_resume()
277 clk_disable_unprepare(fuse->clk); in tegra_fuse_runtime_suspend()
290 if (fuse->soc->clk_suspend_on) in tegra_fuse_suspend()
302 if (fuse->soc->clk_suspend_on) in tegra_fuse_resume()
324 .name = "tegra-fuse",
336 unsigned int offset = fuse->soc->info->spare + spare * 4; in tegra_fuse_read_spare()
338 return fuse->read_early(fuse, offset) & 1; in tegra_fuse_read_spare()
343 return fuse->read_early(fuse, offset); in tegra_fuse_read_early()
348 if (!fuse->dev) in tegra_fuse_readl()
352 * Wait for fuse->clk to be initialized if device-tree boot is used. in tegra_fuse_readl()
354 if (is_of_node(dev_fwnode(fuse->dev)) && !fuse->clk) in tegra_fuse_readl()
357 if (!fuse->read) in tegra_fuse_readl()
360 if (IS_ERR(fuse->clk)) in tegra_fuse_readl()
361 return PTR_ERR(fuse->clk); in tegra_fuse_readl()
363 *value = fuse->read(fuse, offset); in tegra_fuse_readl()
378 * Enable FUSE clock. This needs to be hardcoded because the clock in tegra_enable_fuse_clk()
459 attr->custom_attr_group = fuse->soc->soc_attr_group; in tegra_soc_device_register()
487 * a FUSE node. in tegra_init_fuse()
490 * that didn't contain a FUSE node. in tegra_init_fuse()
502 fuse->soc = &tegra20_fuse_soc; in tegra_init_fuse()
508 fuse->soc = &tegra30_fuse_soc; in tegra_init_fuse()
514 fuse->soc = &tegra114_fuse_soc; in tegra_init_fuse()
520 fuse->soc = &tegra124_fuse_soc; in tegra_init_fuse()
541 pr_err("failed to get FUSE register\n"); in tegra_init_fuse()
545 fuse->soc = match->data; in tegra_init_fuse()
561 fuse->base = ioremap(regs.start, resource_size(®s)); in tegra_init_fuse()
562 if (!fuse->base) { in tegra_init_fuse()
563 pr_err("failed to map FUSE registers\n"); in tegra_init_fuse()
567 fuse->soc->init(fuse); in tegra_init_fuse()
571 err = tegra_fuse_add_lookups(fuse); in tegra_init_fuse()
573 pr_err("failed to add FUSE lookups\n"); in tegra_init_fuse()