1 // SPDX-License-Identifier: GPL-2.0-only
3 * UniPhier eFuse driver
5 * Copyright (C) 2017 Socionext Inc.
8 #include <linux/device.h>
10 #include <linux/module.h>
11 #include <linux/mod_devicetable.h>
12 #include <linux/nvmem-provider.h>
13 #include <linux/platform_device.h>
15 struct uniphier_efuse_priv
{
19 static int uniphier_reg_read(void *context
,
20 unsigned int reg
, void *_val
, size_t bytes
)
22 struct uniphier_efuse_priv
*priv
= context
;
26 for (offs
= 0; offs
< bytes
; offs
+= sizeof(u8
))
27 *val
++ = readb(priv
->base
+ reg
+ offs
);
32 static int uniphier_efuse_probe(struct platform_device
*pdev
)
34 struct device
*dev
= &pdev
->dev
;
36 struct nvmem_device
*nvmem
;
37 struct nvmem_config econfig
= {};
38 struct uniphier_efuse_priv
*priv
;
40 priv
= devm_kzalloc(dev
, sizeof(*priv
), GFP_KERNEL
);
44 res
= platform_get_resource(pdev
, IORESOURCE_MEM
, 0);
45 priv
->base
= devm_ioremap_resource(dev
, res
);
46 if (IS_ERR(priv
->base
))
47 return PTR_ERR(priv
->base
);
50 econfig
.word_size
= 1;
51 econfig
.read_only
= true;
52 econfig
.reg_read
= uniphier_reg_read
;
53 econfig
.size
= resource_size(res
);
56 nvmem
= devm_nvmem_register(dev
, &econfig
);
58 return PTR_ERR_OR_ZERO(nvmem
);
61 static const struct of_device_id uniphier_efuse_of_match
[] = {
62 { .compatible
= "socionext,uniphier-efuse",},
65 MODULE_DEVICE_TABLE(of
, uniphier_efuse_of_match
);
67 static struct platform_driver uniphier_efuse_driver
= {
68 .probe
= uniphier_efuse_probe
,
70 .name
= "uniphier-efuse",
71 .of_match_table
= uniphier_efuse_of_match
,
74 module_platform_driver(uniphier_efuse_driver
);
76 MODULE_AUTHOR("Keiji Hayashibara <hayashibara.keiji@socionext.com>");
77 MODULE_DESCRIPTION("UniPhier eFuse driver");
78 MODULE_LICENSE("GPL v2");