mirror of
https://github.com/edk2-porting/linux-next.git
synced 2025-01-12 23:54:19 +08:00
2cbbb579bc
This patch adds support for LZO compression when storing the register cache. For a typical device whose register map would normally occupy 25kB or 50kB by using the LZO compression technique, one can get down to ~5-7kB. There might be a performance penalty associated with each individual read/write due to decompressing/compressing the underlying cache, however that should not be noticeable. These memory benefits depend on whether the target architecture can get rid of the memory occupied by the original register defaults cache which is marked as __devinitconst. Nevertheless there will be some memory gain even if the target architecture can't get rid of the original register map, this should be around ~30-32kB instead of 50kB. Signed-off-by: Dimitris Papastamos <dp@opensource.wolfsonmicro.com> Signed-off-by: Mark Brown <broonie@opensource.wolfsonmicro.com>
126 lines
3.8 KiB
C
126 lines
3.8 KiB
C
/*
|
|
* 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>
|
|
#include <linux/fs.h>
|
|
|
|
struct regmap;
|
|
struct regcache_ops;
|
|
|
|
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;
|
|
|
|
#ifdef CONFIG_DEBUG_FS
|
|
struct dentry *debugfs;
|
|
#endif
|
|
|
|
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);
|
|
bool (*precious_reg)(struct device *dev, unsigned int reg);
|
|
|
|
u8 read_flag_mask;
|
|
u8 write_flag_mask;
|
|
|
|
/* 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;
|
|
};
|
|
|
|
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);
|
|
};
|
|
|
|
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);
|
|
|
|
#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
|
|
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) { }
|
|
#endif
|
|
|
|
/* regcache core declarations */
|
|
int regcache_init(struct regmap *map);
|
|
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);
|
|
int regcache_insert_reg(struct regmap *map, unsigned int reg,
|
|
unsigned int val);
|
|
|
|
extern struct regcache_ops regcache_indexed_ops;
|
|
extern struct regcache_ops regcache_rbtree_ops;
|
|
extern struct regcache_ops regcache_lzo_ops;
|
|
|
|
#endif
|