1 // SPDX-License-Identifier: GPL-2.0-only
5 * Copyright (c) 2017 Pengutronix, Michael Grzeschik <m.grzeschik@pengutronix.de>
7 * Based on the barebox iim driver,
8 * Copyright (c) 2010 Baruch Siach <baruch@tkos.co.il>,
9 * Orex Computed Radiography
12 #include <linux/device.h>
14 #include <linux/module.h>
15 #include <linux/nvmem-provider.h>
17 #include <linux/platform_device.h>
18 #include <linux/slab.h>
19 #include <linux/clk.h>
21 #define IIM_BANK_BASE(n) (0x800 + 0x400 * (n))
23 struct imx_iim_drvdata
{
32 static int imx_iim_read(void *context
, unsigned int offset
,
33 void *buf
, size_t bytes
)
35 struct iim_priv
*iim
= context
;
39 ret
= clk_prepare_enable(iim
->clk
);
43 for (i
= offset
; i
< offset
+ bytes
; i
++) {
47 *buf8
++ = readl(iim
->base
+ IIM_BANK_BASE(bank
) + reg
* 4);
50 clk_disable_unprepare(iim
->clk
);
55 static struct imx_iim_drvdata imx27_drvdata
= {
59 static struct imx_iim_drvdata imx25_imx31_imx35_drvdata
= {
63 static struct imx_iim_drvdata imx51_drvdata
= {
67 static struct imx_iim_drvdata imx53_drvdata
= {
71 static const struct of_device_id imx_iim_dt_ids
[] = {
73 .compatible
= "fsl,imx25-iim",
74 .data
= &imx25_imx31_imx35_drvdata
,
76 .compatible
= "fsl,imx27-iim",
77 .data
= &imx27_drvdata
,
79 .compatible
= "fsl,imx31-iim",
80 .data
= &imx25_imx31_imx35_drvdata
,
82 .compatible
= "fsl,imx35-iim",
83 .data
= &imx25_imx31_imx35_drvdata
,
85 .compatible
= "fsl,imx51-iim",
86 .data
= &imx51_drvdata
,
88 .compatible
= "fsl,imx53-iim",
89 .data
= &imx53_drvdata
,
94 MODULE_DEVICE_TABLE(of
, imx_iim_dt_ids
);
96 static int imx_iim_probe(struct platform_device
*pdev
)
98 struct device
*dev
= &pdev
->dev
;
100 struct nvmem_device
*nvmem
;
101 struct nvmem_config cfg
= {};
102 const struct imx_iim_drvdata
*drvdata
= NULL
;
104 iim
= devm_kzalloc(dev
, sizeof(*iim
), GFP_KERNEL
);
108 iim
->base
= devm_platform_ioremap_resource(pdev
, 0);
109 if (IS_ERR(iim
->base
))
110 return PTR_ERR(iim
->base
);
112 drvdata
= of_device_get_match_data(&pdev
->dev
);
114 iim
->clk
= devm_clk_get(dev
, NULL
);
115 if (IS_ERR(iim
->clk
))
116 return PTR_ERR(iim
->clk
);
118 cfg
.name
= "imx-iim";
119 cfg
.read_only
= true;
122 cfg
.reg_read
= imx_iim_read
;
124 cfg
.size
= drvdata
->nregs
;
127 nvmem
= devm_nvmem_register(dev
, &cfg
);
129 return PTR_ERR_OR_ZERO(nvmem
);
132 static struct platform_driver imx_iim_driver
= {
133 .probe
= imx_iim_probe
,
136 .of_match_table
= imx_iim_dt_ids
,
139 module_platform_driver(imx_iim_driver
);
141 MODULE_AUTHOR("Michael Grzeschik <m.grzeschik@pengutronix.de>");
142 MODULE_DESCRIPTION("i.MX IIM driver");
143 MODULE_LICENSE("GPL v2");