193de91245b66f20dd387c2745744950a11a5c436Mark Brown/* 293de91245b66f20dd387c2745744950a11a5c436Mark Brown * Register map access API internal header 393de91245b66f20dd387c2745744950a11a5c436Mark Brown * 493de91245b66f20dd387c2745744950a11a5c436Mark Brown * Copyright 2011 Wolfson Microelectronics plc 593de91245b66f20dd387c2745744950a11a5c436Mark Brown * 693de91245b66f20dd387c2745744950a11a5c436Mark Brown * Author: Mark Brown <broonie@opensource.wolfsonmicro.com> 793de91245b66f20dd387c2745744950a11a5c436Mark Brown * 893de91245b66f20dd387c2745744950a11a5c436Mark Brown * This program is free software; you can redistribute it and/or modify 993de91245b66f20dd387c2745744950a11a5c436Mark Brown * it under the terms of the GNU General Public License version 2 as 1093de91245b66f20dd387c2745744950a11a5c436Mark Brown * published by the Free Software Foundation. 1193de91245b66f20dd387c2745744950a11a5c436Mark Brown */ 1293de91245b66f20dd387c2745744950a11a5c436Mark Brown 1393de91245b66f20dd387c2745744950a11a5c436Mark Brown#ifndef _REGMAP_INTERNAL_H 1493de91245b66f20dd387c2745744950a11a5c436Mark Brown#define _REGMAP_INTERNAL_H 1593de91245b66f20dd387c2745744950a11a5c436Mark Brown 1693de91245b66f20dd387c2745744950a11a5c436Mark Brown#include <linux/regmap.h> 1731244e396fa9e4854cfd6dfe305983e77802c156Mark Brown#include <linux/fs.h> 1893de91245b66f20dd387c2745744950a11a5c436Mark Brown 1993de91245b66f20dd387c2745744950a11a5c436Mark Brownstruct regmap; 209fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamosstruct regcache_ops; 2193de91245b66f20dd387c2745744950a11a5c436Mark Brown 2293de91245b66f20dd387c2745744950a11a5c436Mark Brownstruct regmap_format { 2393de91245b66f20dd387c2745744950a11a5c436Mark Brown size_t buf_size; 2493de91245b66f20dd387c2745744950a11a5c436Mark Brown size_t reg_bytes; 2593de91245b66f20dd387c2745744950a11a5c436Mark Brown size_t val_bytes; 2693de91245b66f20dd387c2745744950a11a5c436Mark Brown void (*format_write)(struct regmap *map, 2793de91245b66f20dd387c2745744950a11a5c436Mark Brown unsigned int reg, unsigned int val); 2893de91245b66f20dd387c2745744950a11a5c436Mark Brown void (*format_reg)(void *buf, unsigned int reg); 2993de91245b66f20dd387c2745744950a11a5c436Mark Brown void (*format_val)(void *buf, unsigned int val); 3093de91245b66f20dd387c2745744950a11a5c436Mark Brown unsigned int (*parse_val)(void *buf); 3193de91245b66f20dd387c2745744950a11a5c436Mark Brown}; 3293de91245b66f20dd387c2745744950a11a5c436Mark Brown 3393de91245b66f20dd387c2745744950a11a5c436Mark Brownstruct regmap { 3493de91245b66f20dd387c2745744950a11a5c436Mark Brown struct mutex lock; 3593de91245b66f20dd387c2745744950a11a5c436Mark Brown 3693de91245b66f20dd387c2745744950a11a5c436Mark Brown struct device *dev; /* Device we do I/O on */ 3793de91245b66f20dd387c2745744950a11a5c436Mark Brown void *work_buf; /* Scratch buffer used to format I/O */ 3893de91245b66f20dd387c2745744950a11a5c436Mark Brown struct regmap_format format; /* Buffer format */ 3993de91245b66f20dd387c2745744950a11a5c436Mark Brown const struct regmap_bus *bus; 4093de91245b66f20dd387c2745744950a11a5c436Mark Brown 4131244e396fa9e4854cfd6dfe305983e77802c156Mark Brown#ifdef CONFIG_DEBUG_FS 4231244e396fa9e4854cfd6dfe305983e77802c156Mark Brown struct dentry *debugfs; 4331244e396fa9e4854cfd6dfe305983e77802c156Mark Brown#endif 4431244e396fa9e4854cfd6dfe305983e77802c156Mark Brown 4593de91245b66f20dd387c2745744950a11a5c436Mark Brown unsigned int max_register; 4693de91245b66f20dd387c2745744950a11a5c436Mark Brown bool (*writeable_reg)(struct device *dev, unsigned int reg); 4793de91245b66f20dd387c2745744950a11a5c436Mark Brown bool (*readable_reg)(struct device *dev, unsigned int reg); 4893de91245b66f20dd387c2745744950a11a5c436Mark Brown bool (*volatile_reg)(struct device *dev, unsigned int reg); 492efe1642b73e74604498175de032b8a604868fb7Mark Brown bool (*precious_reg)(struct device *dev, unsigned int reg); 506f306441e97f8f9d27c43a536360fe221f675a71Lars-Peter Clausen 516f306441e97f8f9d27c43a536360fe221f675a71Lars-Peter Clausen u8 read_flag_mask; 526f306441e97f8f9d27c43a536360fe221f675a71Lars-Peter Clausen u8 write_flag_mask; 539fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos 549fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos /* regcache specific members */ 559fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos const struct regcache_ops *cache_ops; 569fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos enum regcache_type cache_type; 579fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos 589fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos /* number of bytes in reg_defaults_raw */ 599fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int cache_size_raw; 609fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos /* number of bytes per word in reg_defaults_raw */ 619fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int cache_word_size; 629fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos /* number of entries in reg_defaults */ 639fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int num_reg_defaults; 649fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos /* number of entries in reg_defaults_raw */ 659fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int num_reg_defaults_raw; 669fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos 679fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos /* if set, only the cache is modified not the HW */ 689fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int cache_only:1; 699fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos /* if set, only the HW is modified not the cache */ 709fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int cache_bypass:1; 719fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos /* if set, remember to free reg_defaults_raw */ 729fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int cache_free:1; 739fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos 749fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos struct reg_default *reg_defaults; 759fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos const void *reg_defaults_raw; 769fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos void *cache; 778ae0d7e8a918e9603748abe9b31984fc5d96abb3Mark Brown bool cache_dirty; 789fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos}; 799fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos 809fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamosstruct regcache_ops { 819fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos const char *name; 829fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos enum regcache_type type; 839fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos int (*init)(struct regmap *map); 849fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos int (*exit)(struct regmap *map); 859fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos int (*read)(struct regmap *map, unsigned int reg, unsigned int *value); 869fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos int (*write)(struct regmap *map, unsigned int reg, unsigned int value); 879fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos int (*sync)(struct regmap *map); 8893de91245b66f20dd387c2745744950a11a5c436Mark Brown}; 8993de91245b66f20dd387c2745744950a11a5c436Mark Brown 908de2f081ef8ee716663f916df9f2a7d015fa0dadMark Brownbool regmap_writeable(struct regmap *map, unsigned int reg); 918de2f081ef8ee716663f916df9f2a7d015fa0dadMark Brownbool regmap_readable(struct regmap *map, unsigned int reg); 928de2f081ef8ee716663f916df9f2a7d015fa0dadMark Brownbool regmap_volatile(struct regmap *map, unsigned int reg); 938de2f081ef8ee716663f916df9f2a7d015fa0dadMark Brownbool regmap_precious(struct regmap *map, unsigned int reg); 948de2f081ef8ee716663f916df9f2a7d015fa0dadMark Brown 954d2dc09538561eb8823c3c0072e6f5b868a5abe1Dimitris Papastamosint _regmap_write(struct regmap *map, unsigned int reg, 964d2dc09538561eb8823c3c0072e6f5b868a5abe1Dimitris Papastamos unsigned int val); 974d2dc09538561eb8823c3c0072e6f5b868a5abe1Dimitris Papastamos 9831244e396fa9e4854cfd6dfe305983e77802c156Mark Brown#ifdef CONFIG_DEBUG_FS 9931244e396fa9e4854cfd6dfe305983e77802c156Mark Brownextern void regmap_debugfs_initcall(void); 10031244e396fa9e4854cfd6dfe305983e77802c156Mark Brownextern void regmap_debugfs_init(struct regmap *map); 10131244e396fa9e4854cfd6dfe305983e77802c156Mark Brownextern void regmap_debugfs_exit(struct regmap *map); 10231244e396fa9e4854cfd6dfe305983e77802c156Mark Brown#else 103bbcf61ca8dcf093bd030a4dafb662b714676652dLars-Peter Clausenstatic inline void regmap_debugfs_initcall(void) { } 104bbcf61ca8dcf093bd030a4dafb662b714676652dLars-Peter Clausenstatic inline void regmap_debugfs_init(struct regmap *map) { } 105bbcf61ca8dcf093bd030a4dafb662b714676652dLars-Peter Clausenstatic inline void regmap_debugfs_exit(struct regmap *map) { } 10631244e396fa9e4854cfd6dfe305983e77802c156Mark Brown#endif 10731244e396fa9e4854cfd6dfe305983e77802c156Mark Brown 1089fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos/* regcache core declarations */ 109e5e3b8abeda1cf45f5a079458dbc267952694c7aLars-Peter Clausenint regcache_init(struct regmap *map, const struct regmap_config *config); 1109fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamosvoid regcache_exit(struct regmap *map); 1119fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamosint regcache_read(struct regmap *map, 1129fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int reg, unsigned int *value); 1139fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamosint regcache_write(struct regmap *map, 1149fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int reg, unsigned int value); 1159fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamosint regcache_sync(struct regmap *map); 1169fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos 1179fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamosunsigned int regcache_get_val(const void *base, unsigned int idx, 1189fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int word_size); 1199fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamosbool regcache_set_val(void *base, unsigned int idx, 1209fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos unsigned int val, unsigned int word_size); 1219fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamosint regcache_lookup_reg(struct regmap *map, unsigned int reg); 1229fabe24e9b1af84509b842731d2beaf85e66681eDimitris Papastamos 12328644c809f44498b8cd91d00b4cdb09e63b99843Dimitris Papastamosextern struct regcache_ops regcache_rbtree_ops; 1242cbbb579bcbe3e11baf1c59920dcd5a780b80447Dimitris Papastamosextern struct regcache_ops regcache_lzo_ops; 1252cbbb579bcbe3e11baf1c59920dcd5a780b80447Dimitris Papastamos 12693de91245b66f20dd387c2745744950a11a5c436Mark Brown#endif 127