2011-07-21 01:35:37 +04:00
/*
* Register map access API internal header
*
* Copyright 2011 Wolfson Microelectronics plc
*
* Author : Mark Brown < broonie @ 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 .
*/
# ifndef _REGMAP_INTERNAL_H
# define _REGMAP_INTERNAL_H
# include <linux/regmap.h>
2011-07-21 01:56:53 +04:00
# include <linux/fs.h>
2011-07-21 01:35:37 +04:00
struct regmap ;
2011-09-19 17:34:00 +04:00
struct regcache_ops ;
2011-07-21 01:35:37 +04:00
struct regmap_format {
size_t buf_size ;
size_t reg_bytes ;
size_t val_bytes ;
void ( * format_write ) ( struct regmap * map ,
unsigned int reg , unsigned int val ) ;
void ( * format_reg ) ( void * buf , unsigned int reg ) ;
void ( * format_val ) ( void * buf , unsigned int val ) ;
unsigned int ( * parse_val ) ( void * buf ) ;
} ;
struct regmap {
struct mutex lock ;
struct device * dev ; /* Device we do I/O on */
void * work_buf ; /* Scratch buffer used to format I/O */
struct regmap_format format ; /* Buffer format */
const struct regmap_bus * bus ;
2011-07-21 01:56:53 +04:00
# ifdef CONFIG_DEBUG_FS
struct dentry * debugfs ;
# endif
2011-07-21 01:35:37 +04:00
unsigned int max_register ;
bool ( * writeable_reg ) ( struct device * dev , unsigned int reg ) ;
bool ( * readable_reg ) ( struct device * dev , unsigned int reg ) ;
bool ( * volatile_reg ) ( struct device * dev , unsigned int reg ) ;
2011-08-08 10:41:46 +04:00
bool ( * precious_reg ) ( struct device * dev , unsigned int reg ) ;
2011-09-05 22:46:32 +04:00
u8 read_flag_mask ;
u8 write_flag_mask ;
2011-09-19 17:34:00 +04:00
/* regcache specific members */
const struct regcache_ops * cache_ops ;
enum regcache_type cache_type ;
/* number of bytes in reg_defaults_raw */
unsigned int cache_size_raw ;
/* number of bytes per word in reg_defaults_raw */
unsigned int cache_word_size ;
/* number of entries in reg_defaults */
unsigned int num_reg_defaults ;
/* number of entries in reg_defaults_raw */
unsigned int num_reg_defaults_raw ;
/* if set, only the cache is modified not the HW */
unsigned int cache_only : 1 ;
/* if set, only the HW is modified not the cache */
unsigned int cache_bypass : 1 ;
/* if set, remember to free reg_defaults_raw */
unsigned int cache_free : 1 ;
struct reg_default * reg_defaults ;
const void * reg_defaults_raw ;
void * cache ;
2011-10-26 12:34:22 +04:00
bool cache_dirty ;
2011-09-19 17:34:00 +04:00
} ;
struct regcache_ops {
const char * name ;
enum regcache_type type ;
int ( * init ) ( struct regmap * map ) ;
int ( * exit ) ( struct regmap * map ) ;
int ( * read ) ( struct regmap * map , unsigned int reg , unsigned int * value ) ;
int ( * write ) ( struct regmap * map , unsigned int reg , unsigned int value ) ;
int ( * sync ) ( struct regmap * map ) ;
2011-07-21 01:35:37 +04:00
} ;
2011-08-10 12:14:41 +04:00
bool regmap_writeable ( struct regmap * map , unsigned int reg ) ;
bool regmap_readable ( struct regmap * map , unsigned int reg ) ;
bool regmap_volatile ( struct regmap * map , unsigned int reg ) ;
bool regmap_precious ( struct regmap * map , unsigned int reg ) ;
2011-09-29 13:39:07 +04:00
int _regmap_write ( struct regmap * map , unsigned int reg ,
unsigned int val ) ;
2011-07-21 01:56:53 +04:00
# ifdef CONFIG_DEBUG_FS
extern void regmap_debugfs_initcall ( void ) ;
extern void regmap_debugfs_init ( struct regmap * map ) ;
extern void regmap_debugfs_exit ( struct regmap * map ) ;
# else
2011-09-06 00:06:13 +04:00
static inline void regmap_debugfs_initcall ( void ) { }
static inline void regmap_debugfs_init ( struct regmap * map ) { }
static inline void regmap_debugfs_exit ( struct regmap * map ) { }
2011-07-21 01:56:53 +04:00
# endif
2011-09-19 17:34:00 +04:00
/* regcache core declarations */
2011-11-16 19:28:16 +04:00
int regcache_init ( struct regmap * map , const struct regmap_config * config ) ;
2011-09-19 17:34:00 +04:00
void regcache_exit ( struct regmap * map ) ;
int regcache_read ( struct regmap * map ,
unsigned int reg , unsigned int * value ) ;
int regcache_write ( struct regmap * map ,
unsigned int reg , unsigned int value ) ;
int regcache_sync ( struct regmap * map ) ;
unsigned int regcache_get_val ( const void * base , unsigned int idx ,
unsigned int word_size ) ;
bool regcache_set_val ( void * base , unsigned int idx ,
unsigned int val , unsigned int word_size ) ;
int regcache_lookup_reg ( struct regmap * map , unsigned int reg ) ;
2011-09-19 17:34:02 +04:00
extern struct regcache_ops regcache_rbtree_ops ;
2011-09-19 17:34:03 +04:00
extern struct regcache_ops regcache_lzo_ops ;
2011-07-21 01:35:37 +04:00
# endif