2019-05-27 09:55:21 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2017-10-24 12:54:26 +03:00
/*
* UniPhier eFuse driver
*
* Copyright ( C ) 2017 Socionext Inc .
*/
# include <linux/device.h>
# include <linux/io.h>
# include <linux/module.h>
2018-06-20 08:47:28 +03:00
# include <linux/mod_devicetable.h>
2017-10-24 12:54:26 +03:00
# include <linux/nvmem-provider.h>
# include <linux/platform_device.h>
struct uniphier_efuse_priv {
void __iomem * base ;
} ;
static int uniphier_reg_read ( void * context ,
unsigned int reg , void * _val , size_t bytes )
{
struct uniphier_efuse_priv * priv = context ;
2017-12-15 17:06:07 +03:00
u8 * val = _val ;
2017-10-24 12:54:26 +03:00
int offs ;
2017-12-15 17:06:07 +03:00
for ( offs = 0 ; offs < bytes ; offs + = sizeof ( u8 ) )
* val + + = readb ( priv - > base + reg + offs ) ;
2017-10-24 12:54:26 +03:00
return 0 ;
}
static int uniphier_efuse_probe ( struct platform_device * pdev )
{
struct device * dev = & pdev - > dev ;
struct resource * res ;
struct nvmem_device * nvmem ;
struct nvmem_config econfig = { } ;
struct uniphier_efuse_priv * priv ;
priv = devm_kzalloc ( dev , sizeof ( * priv ) , GFP_KERNEL ) ;
if ( ! priv )
return - ENOMEM ;
res = platform_get_resource ( pdev , IORESOURCE_MEM , 0 ) ;
priv - > base = devm_ioremap_resource ( dev , res ) ;
if ( IS_ERR ( priv - > base ) )
return PTR_ERR ( priv - > base ) ;
2017-12-15 17:06:07 +03:00
econfig . stride = 1 ;
econfig . word_size = 1 ;
2017-10-24 12:54:26 +03:00
econfig . read_only = true ;
econfig . reg_read = uniphier_reg_read ;
econfig . size = resource_size ( res ) ;
econfig . priv = priv ;
econfig . dev = dev ;
2018-03-09 17:47:00 +03:00
nvmem = devm_nvmem_register ( dev , & econfig ) ;
2017-10-24 12:54:26 +03:00
2018-03-09 17:47:00 +03:00
return PTR_ERR_OR_ZERO ( nvmem ) ;
2017-10-24 12:54:26 +03:00
}
static const struct of_device_id uniphier_efuse_of_match [ ] = {
{ . compatible = " socionext,uniphier-efuse " , } ,
{ /* sentinel */ } ,
} ;
MODULE_DEVICE_TABLE ( of , uniphier_efuse_of_match ) ;
static struct platform_driver uniphier_efuse_driver = {
. probe = uniphier_efuse_probe ,
. driver = {
. name = " uniphier-efuse " ,
. of_match_table = uniphier_efuse_of_match ,
} ,
} ;
module_platform_driver ( uniphier_efuse_driver ) ;
MODULE_AUTHOR ( " Keiji Hayashibara <hayashibara.keiji@socionext.com> " ) ;
MODULE_DESCRIPTION ( " UniPhier eFuse driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;