cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

mtk-efuse.c (2198B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (c) 2015 MediaTek Inc.
      4 * Author: Andrew-CT Chen <andrew-ct.chen@mediatek.com>
      5 */
      6
      7#include <linux/device.h>
      8#include <linux/module.h>
      9#include <linux/mod_devicetable.h>
     10#include <linux/io.h>
     11#include <linux/nvmem-provider.h>
     12#include <linux/platform_device.h>
     13
     14struct mtk_efuse_priv {
     15	void __iomem *base;
     16};
     17
     18static int mtk_reg_read(void *context,
     19			unsigned int reg, void *_val, size_t bytes)
     20{
     21	struct mtk_efuse_priv *priv = context;
     22	void __iomem *addr = priv->base + reg;
     23	u8 *val = _val;
     24	int i;
     25
     26	for (i = 0; i < bytes; i++, val++)
     27		*val = readb(addr + i);
     28
     29	return 0;
     30}
     31
     32static int mtk_efuse_probe(struct platform_device *pdev)
     33{
     34	struct device *dev = &pdev->dev;
     35	struct resource *res;
     36	struct nvmem_device *nvmem;
     37	struct nvmem_config econfig = {};
     38	struct mtk_efuse_priv *priv;
     39
     40	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
     41	if (!priv)
     42		return -ENOMEM;
     43
     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);
     48
     49	econfig.stride = 1;
     50	econfig.word_size = 1;
     51	econfig.reg_read = mtk_reg_read;
     52	econfig.size = resource_size(res);
     53	econfig.priv = priv;
     54	econfig.dev = dev;
     55	nvmem = devm_nvmem_register(dev, &econfig);
     56
     57	return PTR_ERR_OR_ZERO(nvmem);
     58}
     59
     60static const struct of_device_id mtk_efuse_of_match[] = {
     61	{ .compatible = "mediatek,mt8173-efuse",},
     62	{ .compatible = "mediatek,efuse",},
     63	{/* sentinel */},
     64};
     65MODULE_DEVICE_TABLE(of, mtk_efuse_of_match);
     66
     67static struct platform_driver mtk_efuse_driver = {
     68	.probe = mtk_efuse_probe,
     69	.driver = {
     70		.name = "mediatek,efuse",
     71		.of_match_table = mtk_efuse_of_match,
     72	},
     73};
     74
     75static int __init mtk_efuse_init(void)
     76{
     77	int ret;
     78
     79	ret = platform_driver_register(&mtk_efuse_driver);
     80	if (ret) {
     81		pr_err("Failed to register efuse driver\n");
     82		return ret;
     83	}
     84
     85	return 0;
     86}
     87
     88static void __exit mtk_efuse_exit(void)
     89{
     90	return platform_driver_unregister(&mtk_efuse_driver);
     91}
     92
     93subsys_initcall(mtk_efuse_init);
     94module_exit(mtk_efuse_exit);
     95
     96MODULE_AUTHOR("Andrew-CT Chen <andrew-ct.chen@mediatek.com>");
     97MODULE_DESCRIPTION("Mediatek EFUSE driver");
     98MODULE_LICENSE("GPL v2");