4 * Copyright (c) 2017 Pengutronix, Michael Grzeschik <m.grzeschik@pengutronix.de>
6 * Based on the barebox iim 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>
26 #include <linux/clk.h>
28 #define IIM_BANK_BASE(n) (0x800 + 0x400 * (n))
30 struct imx_iim_drvdata
{
39 static int imx_iim_read(void *context
, unsigned int offset
,
40 void *buf
, size_t bytes
)
42 struct iim_priv
*iim
= context
;
46 ret
= clk_prepare_enable(iim
->clk
);
50 for (i
= offset
; i
< offset
+ bytes
; i
++) {
54 *buf8
++ = readl(iim
->base
+ IIM_BANK_BASE(bank
) + reg
* 4);
57 clk_disable_unprepare(iim
->clk
);
62 static struct imx_iim_drvdata imx27_drvdata
= {
66 static struct imx_iim_drvdata imx25_imx31_imx35_drvdata
= {
70 static struct imx_iim_drvdata imx51_drvdata
= {
74 static struct imx_iim_drvdata imx53_drvdata
= {
78 static const struct of_device_id imx_iim_dt_ids
[] = {
80 .compatible
= "fsl,imx25-iim",
81 .data
= &imx25_imx31_imx35_drvdata
,
83 .compatible
= "fsl,imx27-iim",
84 .data
= &imx27_drvdata
,
86 .compatible
= "fsl,imx31-iim",
87 .data
= &imx25_imx31_imx35_drvdata
,
89 .compatible
= "fsl,imx35-iim",
90 .data
= &imx25_imx31_imx35_drvdata
,
92 .compatible
= "fsl,imx51-iim",
93 .data
= &imx51_drvdata
,
95 .compatible
= "fsl,imx53-iim",
96 .data
= &imx53_drvdata
,
101 MODULE_DEVICE_TABLE(of
, imx_iim_dt_ids
);
103 static int imx_iim_probe(struct platform_device
*pdev
)
105 const struct of_device_id
*of_id
;
106 struct device
*dev
= &pdev
->dev
;
107 struct resource
*res
;
108 struct iim_priv
*iim
;
109 struct nvmem_device
*nvmem
;
110 struct nvmem_config cfg
= {};
111 const struct imx_iim_drvdata
*drvdata
= NULL
;
113 iim
= devm_kzalloc(dev
, sizeof(*iim
), GFP_KERNEL
);
117 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
118 iim
->base
= devm_ioremap_resource(dev
, res
);
119 if (IS_ERR(iim
->base
))
120 return PTR_ERR(iim
->base
);
122 of_id
= of_match_device(imx_iim_dt_ids
, dev
);
126 drvdata
= of_id
->data
;
128 iim
->clk
= devm_clk_get(dev
, NULL
);
129 if (IS_ERR(iim
->clk
))
130 return PTR_ERR(iim
->clk
);
132 cfg
.name
= "imx-iim",
133 cfg
.read_only
= true,
136 cfg
.reg_read
= imx_iim_read
,
138 cfg
.size
= drvdata
->nregs
;
141 nvmem
= devm_nvmem_register(dev
, &cfg
);
143 return PTR_ERR_OR_ZERO(nvmem
);
146 static struct platform_driver imx_iim_driver
= {
147 .probe
= imx_iim_probe
,
150 .of_match_table
= imx_iim_dt_ids
,
153 module_platform_driver(imx_iim_driver
);
155 MODULE_AUTHOR("Michael Grzeschik <m.grzeschik@pengutronix.de>");
156 MODULE_DESCRIPTION("i.MX IIM driver");
157 MODULE_LICENSE("GPL v2");