2 * i.MX6 OCOTP fusebox driver
4 * Copyright (c) 2015 Pengutronix, Philipp Zabel <p.zabel@pengutronix.de>
6 * Based on the barebox ocotp driver,
7 * Copyright (c) 2010 Baruch Siach <baruch@tkos.co.il>,
8 * Orex Computed Radiography
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License version 2
12 * as published by the Free Software Foundation.
14 * http://www.opensource.org/licenses/gpl-license.html
15 * http://www.gnu.org/copyleft/gpl.html
18 #include <linux/device.h>
20 #include <linux/module.h>
21 #include <linux/nvmem-provider.h>
23 #include <linux/of_device.h>
24 #include <linux/platform_device.h>
25 #include <linux/slab.h>
33 static int imx_ocotp_read(void *context
, unsigned int offset
,
34 void *val
, size_t bytes
)
36 struct ocotp_priv
*priv
= context
;
45 if (count
> (priv
->nregs
- index
))
46 count
= priv
->nregs
- index
;
48 for (i
= index
; i
< (index
+ count
); i
++)
49 *buf
++ = readl(priv
->base
+ 0x400 + i
* 0x10);
54 static struct nvmem_config imx_ocotp_nvmem_config
= {
60 .reg_read
= imx_ocotp_read
,
63 static const struct of_device_id imx_ocotp_dt_ids
[] = {
64 { .compatible
= "fsl,imx6q-ocotp", (void *)128 },
65 { .compatible
= "fsl,imx6sl-ocotp", (void *)32 },
66 { .compatible
= "fsl,imx6sx-ocotp", (void *)128 },
69 MODULE_DEVICE_TABLE(of
, imx_ocotp_dt_ids
);
71 static int imx_ocotp_probe(struct platform_device
*pdev
)
73 const struct of_device_id
*of_id
;
74 struct device
*dev
= &pdev
->dev
;
76 struct ocotp_priv
*priv
;
77 struct nvmem_device
*nvmem
;
79 priv
= devm_kzalloc(dev
, sizeof(*priv
), GFP_KERNEL
);
83 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
84 priv
->base
= devm_ioremap_resource(dev
, res
);
85 if (IS_ERR(priv
->base
))
86 return PTR_ERR(priv
->base
);
88 of_id
= of_match_device(imx_ocotp_dt_ids
, dev
);
89 priv
->nregs
= (unsigned int)of_id
->data
;
90 imx_ocotp_nvmem_config
.size
= 4 * priv
->nregs
;
91 imx_ocotp_nvmem_config
.dev
= dev
;
92 imx_ocotp_nvmem_config
.priv
= priv
;
93 nvmem
= nvmem_register(&imx_ocotp_nvmem_config
);
95 return PTR_ERR(nvmem
);
97 platform_set_drvdata(pdev
, nvmem
);
102 static int imx_ocotp_remove(struct platform_device
*pdev
)
104 struct nvmem_device
*nvmem
= platform_get_drvdata(pdev
);
106 return nvmem_unregister(nvmem
);
109 static struct platform_driver imx_ocotp_driver
= {
110 .probe
= imx_ocotp_probe
,
111 .remove
= imx_ocotp_remove
,
114 .of_match_table
= imx_ocotp_dt_ids
,
117 module_platform_driver(imx_ocotp_driver
);
119 MODULE_AUTHOR("Philipp Zabel <p.zabel@pengutronix.de>");
120 MODULE_DESCRIPTION("i.MX6 OCOTP fuse box driver");
121 MODULE_LICENSE("GPL v2");