2011-09-19 17:34:01 +04:00
/*
* Register cache access API - indexed caching support
*
* Copyright 2011 Wolfson Microelectronics plc
*
* Author : Dimitris Papastamos < dp @ opensource . wolfsonmicro . com >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation .
*/
# include <linux/slab.h>
# include "internal.h"
static int regcache_indexed_read ( struct regmap * map , unsigned int reg ,
unsigned int * value )
{
int ret ;
ret = regcache_lookup_reg ( map , reg ) ;
2011-10-09 16:23:31 +04:00
if ( ret > = 0 )
2011-09-19 17:34:01 +04:00
* value = map - > reg_defaults [ ret ] . def ;
2011-10-09 16:23:31 +04:00
return ret ;
2011-09-19 17:34:01 +04:00
}
static int regcache_indexed_write ( struct regmap * map , unsigned int reg ,
unsigned int value )
{
int ret ;
ret = regcache_lookup_reg ( map , reg ) ;
if ( ret < 0 )
return regcache_insert_reg ( map , reg , value ) ;
map - > reg_defaults [ ret ] . def = value ;
return 0 ;
}
static int regcache_indexed_sync ( struct regmap * map )
{
2011-09-27 14:25:04 +04:00
unsigned int i ;
2011-09-19 17:34:01 +04:00
int ret ;
for ( i = 0 ; i < map - > num_reg_defaults ; i + + ) {
2011-09-29 17:36:25 +04:00
ret = _regmap_write ( map , map - > reg_defaults [ i ] . reg ,
map - > reg_defaults [ i ] . def ) ;
2011-09-19 17:34:01 +04:00
if ( ret < 0 )
return ret ;
dev_dbg ( map - > dev , " Synced register %#x, value %#x \n " ,
map - > reg_defaults [ i ] . reg ,
map - > reg_defaults [ i ] . def ) ;
}
return 0 ;
}
struct regcache_ops regcache_indexed_ops = {
. type = REGCACHE_INDEXED ,
. name = " indexed " ,
. read = regcache_indexed_read ,
. write = regcache_indexed_write ,
. sync = regcache_indexed_sync
} ;