Lines Matching +full:config +full:- +full:complete +full:- +full:timeout +full:- +full:us
1 // SPDX-License-Identifier: GPL-2.0-only
14 * Copyright (C) 2010-2013 Freescale Semiconductor, Inc
21 #include <linux/nvmem-provider.h>
85 struct nvmem_config *config; member
107 void __iomem *base = priv->base; in imx_ocotp_wait_for_busy()
109 bm_ctrl_busy = priv->params->ctrl.bm_busy; in imx_ocotp_wait_for_busy()
110 bm_ctrl_error = priv->params->ctrl.bm_error; in imx_ocotp_wait_for_busy()
114 for (count = 10000; count >= 0; count--) { in imx_ocotp_wait_for_busy()
124 * - A write is performed to a shadow register during a shadow in imx_ocotp_wait_for_busy()
128 * - A write is performed to a shadow register which has been in imx_ocotp_wait_for_busy()
130 * - A read is performed to from a shadow register which has in imx_ocotp_wait_for_busy()
132 * - A program is performed to a fuse word which has been locked in imx_ocotp_wait_for_busy()
133 * - A read is performed to from a fuse word which has been read in imx_ocotp_wait_for_busy()
137 return -EPERM; in imx_ocotp_wait_for_busy()
138 return -ETIMEDOUT; in imx_ocotp_wait_for_busy()
147 void __iomem *base = priv->base; in imx_ocotp_clr_err_if_set()
149 bm_ctrl_error = priv->params->ctrl.bm_error; in imx_ocotp_clr_err_if_set()
171 if (count > (priv->params->nregs - index)) in imx_ocotp_read()
172 count = priv->params->nregs - index; in imx_ocotp_read()
176 return -ENOMEM; in imx_ocotp_read()
182 ret = clk_prepare_enable(priv->clk); in imx_ocotp_read()
185 dev_err(priv->dev, "failed to prepare/enable ocotp clk\n"); in imx_ocotp_read()
192 dev_err(priv->dev, "timeout during read setup\n"); in imx_ocotp_read()
197 *(u32 *)buf = readl(priv->base + IMX_OCOTP_OFFSET_B0W0 + in imx_ocotp_read()
216 clk_disable_unprepare(priv->clk); in imx_ocotp_read()
231 if (id && !strcmp(id, "mac-address")) { in imx_ocotp_cell_pp()
234 swap(buf[i], buf[bytes - i - 1]); in imx_ocotp_cell_pp()
255 * timings given in u-boot we can say: in imx_ocotp_set_imx6_timing()
257 * - Minimum STROBE_PROG time is 10 microseconds. Intuitively 10 in imx_ocotp_set_imx6_timing()
261 * - Minimum STROBE_READ i.e. the time to wait post OTP fuse burn before in imx_ocotp_set_imx6_timing()
264 * - Minimum RELAX timing is 17 nanoseconds. This final RELAX minimum in imx_ocotp_set_imx6_timing()
271 * value will mess up a re-load of the shadow registers post OTP in imx_ocotp_set_imx6_timing()
274 clk_rate = clk_get_rate(priv->clk); in imx_ocotp_set_imx6_timing()
276 relax = DIV_ROUND_UP(clk_rate * TIMING_RELAX_NS, 1000000000) - 1; in imx_ocotp_set_imx6_timing()
279 strobe_read += 2 * (relax + 1) - 1; in imx_ocotp_set_imx6_timing()
282 strobe_prog += 2 * (relax + 1) - 1; in imx_ocotp_set_imx6_timing()
284 timing = readl(priv->base + IMX_OCOTP_ADDR_TIMING) & 0x0FC00000; in imx_ocotp_set_imx6_timing()
289 writel(timing, priv->base + IMX_OCOTP_ADDR_TIMING); in imx_ocotp_set_imx6_timing()
301 clk_rate = clk_get_rate(priv->clk); in imx_ocotp_set_imx7_timing()
310 writel(timing, priv->base + IMX_OCOTP_ADDR_TIMING); in imx_ocotp_set_imx7_timing()
324 /* allow only writing one complete OTP word at a time */ in imx_ocotp_write()
325 if ((bytes != priv->config->word_size) || in imx_ocotp_write()
326 (offset % priv->config->word_size)) in imx_ocotp_write()
327 return -EINVAL; in imx_ocotp_write()
331 ret = clk_prepare_enable(priv->clk); in imx_ocotp_write()
334 dev_err(priv->dev, "failed to prepare/enable ocotp clk\n"); in imx_ocotp_write()
339 priv->params->set_timing(priv); in imx_ocotp_write()
349 dev_err(priv->dev, "timeout during timing setup\n"); in imx_ocotp_write()
360 if (priv->params->bank_address_words != 0) { in imx_ocotp_write()
366 offset = offset / priv->config->word_size; in imx_ocotp_write()
367 waddr = offset / priv->params->bank_address_words; in imx_ocotp_write()
368 word = offset & (priv->params->bank_address_words - 1); in imx_ocotp_write()
371 * Non-banked i.MX6 mode. in imx_ocotp_write()
378 ctrl = readl(priv->base + IMX_OCOTP_ADDR_CTRL); in imx_ocotp_write()
379 ctrl &= ~priv->params->ctrl.bm_addr; in imx_ocotp_write()
380 ctrl |= waddr & priv->params->ctrl.bm_addr; in imx_ocotp_write()
383 writel(ctrl, priv->base + IMX_OCOTP_ADDR_CTRL); in imx_ocotp_write()
391 * a 32-bit word in the OTP per the address in HW_OCOTP_CTRL[ADDR]. Bit in imx_ocotp_write()
407 if (priv->params->bank_address_words != 0) { in imx_ocotp_write()
411 writel(0, priv->base + IMX_OCOTP_ADDR_DATA1); in imx_ocotp_write()
412 writel(0, priv->base + IMX_OCOTP_ADDR_DATA2); in imx_ocotp_write()
413 writel(0, priv->base + IMX_OCOTP_ADDR_DATA3); in imx_ocotp_write()
414 writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA0); in imx_ocotp_write()
417 writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA1); in imx_ocotp_write()
418 writel(0, priv->base + IMX_OCOTP_ADDR_DATA2); in imx_ocotp_write()
419 writel(0, priv->base + IMX_OCOTP_ADDR_DATA3); in imx_ocotp_write()
420 writel(0, priv->base + IMX_OCOTP_ADDR_DATA0); in imx_ocotp_write()
423 writel(0, priv->base + IMX_OCOTP_ADDR_DATA1); in imx_ocotp_write()
424 writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA2); in imx_ocotp_write()
425 writel(0, priv->base + IMX_OCOTP_ADDR_DATA3); in imx_ocotp_write()
426 writel(0, priv->base + IMX_OCOTP_ADDR_DATA0); in imx_ocotp_write()
429 writel(0, priv->base + IMX_OCOTP_ADDR_DATA1); in imx_ocotp_write()
430 writel(0, priv->base + IMX_OCOTP_ADDR_DATA2); in imx_ocotp_write()
431 writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA3); in imx_ocotp_write()
432 writel(0, priv->base + IMX_OCOTP_ADDR_DATA0); in imx_ocotp_write()
436 /* Non-banked i.MX6 mode */ in imx_ocotp_write()
437 writel(*buf, priv->base + IMX_OCOTP_ADDR_DATA0); in imx_ocotp_write()
441 * Once complete, the controller will clear BUSY. A write request to a in imx_ocotp_write()
449 if (ret == -EPERM) { in imx_ocotp_write()
450 dev_err(priv->dev, "failed write to locked region"); in imx_ocotp_write()
453 dev_err(priv->dev, "timeout during data write\n"); in imx_ocotp_write()
461 * separated by 2 us after the clearing of HW_OCOTP_CTRL_BUSY following in imx_ocotp_write()
467 writel(priv->params->ctrl.bm_rel_shadows, in imx_ocotp_write()
468 priv->base + IMX_OCOTP_ADDR_CTRL_SET); in imx_ocotp_write()
470 priv->params->ctrl.bm_rel_shadows); in imx_ocotp_write()
472 dev_err(priv->dev, "timeout during shadow register reload\n"); in imx_ocotp_write()
475 clk_disable_unprepare(priv->clk); in imx_ocotp_write()
481 .name = "imx-ocotp",
573 { .compatible = "fsl,imx6q-ocotp", .data = &imx6q_params },
574 { .compatible = "fsl,imx6sl-ocotp", .data = &imx6sl_params },
575 { .compatible = "fsl,imx6sx-ocotp", .data = &imx6sx_params },
576 { .compatible = "fsl,imx6ul-ocotp", .data = &imx6ul_params },
577 { .compatible = "fsl,imx6ull-ocotp", .data = &imx6ull_params },
578 { .compatible = "fsl,imx7d-ocotp", .data = &imx7d_params },
579 { .compatible = "fsl,imx6sll-ocotp", .data = &imx6sll_params },
580 { .compatible = "fsl,imx7ulp-ocotp", .data = &imx7ulp_params },
581 { .compatible = "fsl,imx8mq-ocotp", .data = &imx8mq_params },
582 { .compatible = "fsl,imx8mm-ocotp", .data = &imx8mm_params },
583 { .compatible = "fsl,imx8mn-ocotp", .data = &imx8mn_params },
584 { .compatible = "fsl,imx8mp-ocotp", .data = &imx8mp_params },
592 cell->read_post_process = imx_ocotp_cell_pp; in imx_ocotp_fixup_dt_cell_info()
597 struct device *dev = &pdev->dev; in imx_ocotp_probe()
603 return -ENOMEM; in imx_ocotp_probe()
605 priv->dev = dev; in imx_ocotp_probe()
607 priv->base = devm_platform_ioremap_resource(pdev, 0); in imx_ocotp_probe()
608 if (IS_ERR(priv->base)) in imx_ocotp_probe()
609 return PTR_ERR(priv->base); in imx_ocotp_probe()
611 priv->clk = devm_clk_get(dev, NULL); in imx_ocotp_probe()
612 if (IS_ERR(priv->clk)) in imx_ocotp_probe()
613 return PTR_ERR(priv->clk); in imx_ocotp_probe()
615 priv->params = of_device_get_match_data(&pdev->dev); in imx_ocotp_probe()
617 imx_ocotp_nvmem_config.size = 4 * priv->params->nregs; in imx_ocotp_probe()
622 priv->config = &imx_ocotp_nvmem_config; in imx_ocotp_probe()
624 clk_prepare_enable(priv->clk); in imx_ocotp_probe()
626 clk_disable_unprepare(priv->clk); in imx_ocotp_probe()