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