Lines Matching +full:clk +full:- +full:delay +full:- +full:cycles
2 * Freescale MXS On-Chip OTP driver
19 #include <linux/clk.h>
20 #include <linux/delay.h>
25 #include <linux/nvmem-provider.h>
41 struct clk *clk; member
51 while (timeout--) { in mxs_ocotp_wait()
52 status = readl(otp->base); in mxs_ocotp_wait()
61 return -EBUSY; in mxs_ocotp_wait()
63 return -EIO; in mxs_ocotp_wait()
75 ret = clk_enable(otp->clk); in mxs_ocotp_read()
79 writel(BM_OCOTP_CTRL_ERROR, otp->base + STMP_OFFSET_REG_CLR); in mxs_ocotp_read()
86 writel(BM_OCOTP_CTRL_RD_BANK_OPEN, otp->base + STMP_OFFSET_REG_SET); in mxs_ocotp_read()
88 /* approximately wait 33 hclk cycles */ in mxs_ocotp_read()
97 /* fill up non-data register */ in mxs_ocotp_read()
100 *buf++ = readl(otp->base + offset); in mxs_ocotp_read()
103 bytes -= 4; in mxs_ocotp_read()
109 writel(BM_OCOTP_CTRL_RD_BANK_OPEN, otp->base + STMP_OFFSET_REG_CLR); in mxs_ocotp_read()
112 clk_disable(otp->clk); in mxs_ocotp_read()
118 .name = "mxs-ocotp",
137 { .compatible = "fsl,imx23-ocotp", .data = &imx23_data },
138 { .compatible = "fsl,imx28-ocotp", .data = &imx28_data },
145 struct device *dev = &pdev->dev; in mxs_ocotp_probe()
152 match = of_match_device(dev->driver->of_match_table, dev); in mxs_ocotp_probe()
153 if (!match || !match->data) in mxs_ocotp_probe()
154 return -EINVAL; in mxs_ocotp_probe()
158 return -ENOMEM; in mxs_ocotp_probe()
161 otp->base = devm_ioremap_resource(dev, res); in mxs_ocotp_probe()
162 if (IS_ERR(otp->base)) in mxs_ocotp_probe()
163 return PTR_ERR(otp->base); in mxs_ocotp_probe()
165 otp->clk = devm_clk_get(&pdev->dev, NULL); in mxs_ocotp_probe()
166 if (IS_ERR(otp->clk)) in mxs_ocotp_probe()
167 return PTR_ERR(otp->clk); in mxs_ocotp_probe()
169 ret = clk_prepare(otp->clk); in mxs_ocotp_probe()
171 dev_err(dev, "failed to prepare clk: %d\n", ret); in mxs_ocotp_probe()
175 data = match->data; in mxs_ocotp_probe()
177 ocotp_config.size = data->size; in mxs_ocotp_probe()
180 otp->nvmem = nvmem_register(&ocotp_config); in mxs_ocotp_probe()
181 if (IS_ERR(otp->nvmem)) { in mxs_ocotp_probe()
182 ret = PTR_ERR(otp->nvmem); in mxs_ocotp_probe()
191 clk_unprepare(otp->clk); in mxs_ocotp_probe()
200 clk_unprepare(otp->clk); in mxs_ocotp_remove()
202 return nvmem_unregister(otp->nvmem); in mxs_ocotp_remove()
209 .name = "mxs-ocotp",