Root/drivers/base/regmap/internal.h

1/*
2 * Register map access API internal header
3 *
4 * Copyright 2011 Wolfson Microelectronics plc
5 *
6 * Author: Mark Brown <broonie@opensource.wolfsonmicro.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#ifndef _REGMAP_INTERNAL_H
14#define _REGMAP_INTERNAL_H
15
16#include <linux/regmap.h>
17#include <linux/fs.h>
18#include <linux/list.h>
19#include <linux/wait.h>
20
21struct regmap;
22struct regcache_ops;
23
24struct regmap_debugfs_off_cache {
25    struct list_head list;
26    off_t min;
27    off_t max;
28    unsigned int base_reg;
29    unsigned int max_reg;
30};
31
32struct regmap_format {
33    size_t buf_size;
34    size_t reg_bytes;
35    size_t pad_bytes;
36    size_t val_bytes;
37    void (*format_write)(struct regmap *map,
38                 unsigned int reg, unsigned int val);
39    void (*format_reg)(void *buf, unsigned int reg, unsigned int shift);
40    void (*format_val)(void *buf, unsigned int val, unsigned int shift);
41    unsigned int (*parse_val)(void *buf);
42};
43
44struct regmap_async {
45    struct list_head list;
46    struct work_struct cleanup;
47    struct regmap *map;
48    void *work_buf;
49};
50
51struct regmap {
52    struct mutex mutex;
53    spinlock_t spinlock;
54    regmap_lock lock;
55    regmap_unlock unlock;
56    void *lock_arg; /* This is passed to lock/unlock functions */
57
58    struct device *dev; /* Device we do I/O on */
59    void *work_buf; /* Scratch buffer used to format I/O */
60    struct regmap_format format; /* Buffer format */
61    const struct regmap_bus *bus;
62    void *bus_context;
63    const char *name;
64
65    spinlock_t async_lock;
66    wait_queue_head_t async_waitq;
67    struct list_head async_list;
68    int async_ret;
69
70#ifdef CONFIG_DEBUG_FS
71    struct dentry *debugfs;
72    const char *debugfs_name;
73
74    unsigned int debugfs_reg_len;
75    unsigned int debugfs_val_len;
76    unsigned int debugfs_tot_len;
77
78    struct list_head debugfs_off_cache;
79#endif
80
81    unsigned int max_register;
82    bool (*writeable_reg)(struct device *dev, unsigned int reg);
83    bool (*readable_reg)(struct device *dev, unsigned int reg);
84    bool (*volatile_reg)(struct device *dev, unsigned int reg);
85    bool (*precious_reg)(struct device *dev, unsigned int reg);
86    const struct regmap_access_table *wr_table;
87    const struct regmap_access_table *rd_table;
88    const struct regmap_access_table *volatile_table;
89    const struct regmap_access_table *precious_table;
90
91    int (*reg_read)(void *context, unsigned int reg, unsigned int *val);
92    int (*reg_write)(void *context, unsigned int reg, unsigned int val);
93
94    bool defer_caching;
95
96    u8 read_flag_mask;
97    u8 write_flag_mask;
98
99    /* number of bits to (left) shift the reg value when formatting*/
100    int reg_shift;
101    int reg_stride;
102
103    /* regcache specific members */
104    const struct regcache_ops *cache_ops;
105    enum regcache_type cache_type;
106
107    /* number of bytes in reg_defaults_raw */
108    unsigned int cache_size_raw;
109    /* number of bytes per word in reg_defaults_raw */
110    unsigned int cache_word_size;
111    /* number of entries in reg_defaults */
112    unsigned int num_reg_defaults;
113    /* number of entries in reg_defaults_raw */
114    unsigned int num_reg_defaults_raw;
115
116    /* if set, only the cache is modified not the HW */
117    u32 cache_only;
118    /* if set, only the HW is modified not the cache */
119    u32 cache_bypass;
120    /* if set, remember to free reg_defaults_raw */
121    bool cache_free;
122
123    struct reg_default *reg_defaults;
124    const void *reg_defaults_raw;
125    void *cache;
126    u32 cache_dirty;
127
128    struct reg_default *patch;
129    int patch_regs;
130
131    /* if set, converts bulk rw to single rw */
132    bool use_single_rw;
133
134    struct rb_root range_tree;
135    void *selector_work_buf; /* Scratch buffer used for selector */
136};
137
138struct regcache_ops {
139    const char *name;
140    enum regcache_type type;
141    int (*init)(struct regmap *map);
142    int (*exit)(struct regmap *map);
143    int (*read)(struct regmap *map, unsigned int reg, unsigned int *value);
144    int (*write)(struct regmap *map, unsigned int reg, unsigned int value);
145    int (*sync)(struct regmap *map, unsigned int min, unsigned int max);
146};
147
148bool regmap_writeable(struct regmap *map, unsigned int reg);
149bool regmap_readable(struct regmap *map, unsigned int reg);
150bool regmap_volatile(struct regmap *map, unsigned int reg);
151bool regmap_precious(struct regmap *map, unsigned int reg);
152
153int _regmap_write(struct regmap *map, unsigned int reg,
154          unsigned int val);
155
156struct regmap_range_node {
157    struct rb_node node;
158    const char *name;
159    struct regmap *map;
160
161    unsigned int range_min;
162    unsigned int range_max;
163
164    unsigned int selector_reg;
165    unsigned int selector_mask;
166    int selector_shift;
167
168    unsigned int window_start;
169    unsigned int window_len;
170};
171
172#ifdef CONFIG_DEBUG_FS
173extern void regmap_debugfs_initcall(void);
174extern void regmap_debugfs_init(struct regmap *map, const char *name);
175extern void regmap_debugfs_exit(struct regmap *map);
176#else
177static inline void regmap_debugfs_initcall(void) { }
178static inline void regmap_debugfs_init(struct regmap *map, const char *name) { }
179static inline void regmap_debugfs_exit(struct regmap *map) { }
180#endif
181
182/* regcache core declarations */
183int regcache_init(struct regmap *map, const struct regmap_config *config);
184void regcache_exit(struct regmap *map);
185int regcache_read(struct regmap *map,
186               unsigned int reg, unsigned int *value);
187int regcache_write(struct regmap *map,
188            unsigned int reg, unsigned int value);
189int regcache_sync(struct regmap *map);
190
191unsigned int regcache_get_val(const void *base, unsigned int idx,
192                  unsigned int word_size);
193bool regcache_set_val(void *base, unsigned int idx,
194              unsigned int val, unsigned int word_size);
195int regcache_lookup_reg(struct regmap *map, unsigned int reg);
196
197void regmap_async_complete_cb(struct regmap_async *async, int ret);
198
199extern struct regcache_ops regcache_rbtree_ops;
200extern struct regcache_ops regcache_lzo_ops;
201extern struct regcache_ops regcache_flat_ops;
202
203#endif
204

Archive Download this file



interactive