2019-04-25 21:06:18 +03:00
// SPDX-License-Identifier: GPL-2.0
//
// Register cache access API - flat caching support
//
// Copyright 2012 Wolfson Microelectronics plc
//
// Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
2012-12-19 18:51:55 +04:00
# include <linux/device.h>
# include <linux/seq_file.h>
2014-10-09 13:02:52 +04:00
# include <linux/slab.h>
2012-12-19 18:51:55 +04:00
# include "internal.h"
2016-01-04 13:00:35 +03:00
static inline unsigned int regcache_flat_get_index ( const struct regmap * map ,
unsigned int reg )
{
return regcache_get_index_by_order ( map , reg ) ;
}
2012-12-19 18:51:55 +04:00
static int regcache_flat_init ( struct regmap * map )
{
int i ;
unsigned int * cache ;
2016-03-29 09:53:32 +03:00
if ( ! map | | map - > reg_stride_order < 0 | | ! map - > max_register )
2016-01-04 13:00:35 +03:00
return - EINVAL ;
map - > cache = kcalloc ( regcache_flat_get_index ( map , map - > max_register )
+ 1 , sizeof ( unsigned int ) , GFP_KERNEL ) ;
2012-12-19 18:51:55 +04:00
if ( ! map - > cache )
return - ENOMEM ;
cache = map - > cache ;
2018-01-08 02:22:33 +03:00
for ( i = 0 ; i < map - > num_reg_defaults ; i + + ) {
unsigned int reg = map - > reg_defaults [ i ] . reg ;
unsigned int index = regcache_flat_get_index ( map , reg ) ;
cache [ index ] = map - > reg_defaults [ i ] . def ;
}
2012-12-19 18:51:55 +04:00
return 0 ;
}
static int regcache_flat_exit ( struct regmap * map )
{
kfree ( map - > cache ) ;
map - > cache = NULL ;
return 0 ;
}
static int regcache_flat_read ( struct regmap * map ,
unsigned int reg , unsigned int * value )
{
unsigned int * cache = map - > cache ;
2018-01-08 02:22:33 +03:00
unsigned int index = regcache_flat_get_index ( map , reg ) ;
2012-12-19 18:51:55 +04:00
2018-01-08 02:22:33 +03:00
* value = cache [ index ] ;
2012-12-19 18:51:55 +04:00
return 0 ;
}
static int regcache_flat_write ( struct regmap * map , unsigned int reg ,
unsigned int value )
{
unsigned int * cache = map - > cache ;
2018-01-08 02:22:33 +03:00
unsigned int index = regcache_flat_get_index ( map , reg ) ;
2012-12-19 18:51:55 +04:00
2018-01-08 02:22:33 +03:00
cache [ index ] = value ;
2012-12-19 18:51:55 +04:00
return 0 ;
}
struct regcache_ops regcache_flat_ops = {
. type = REGCACHE_FLAT ,
. name = " flat " ,
. init = regcache_flat_init ,
. exit = regcache_flat_exit ,
. read = regcache_flat_read ,
. write = regcache_flat_write ,
} ;