Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
c0cc6fe1
Commit
c0cc6fe1
authored
Apr 10, 2012
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge branches 'regmap-core', 'regmap-mmio' and 'regmap-naming' into regmap-stride
parents
00341028
d939fb9a
851960ba
abec95ad
Changes
11
Expand all
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
394 additions
and
69 deletions
+394
-69
drivers/base/regmap/Kconfig
drivers/base/regmap/Kconfig
+3
-0
drivers/base/regmap/Makefile
drivers/base/regmap/Makefile
+1
-0
drivers/base/regmap/internal.h
drivers/base/regmap/internal.h
+16
-5
drivers/base/regmap/regcache-rbtree.c
drivers/base/regmap/regcache-rbtree.c
+2
-2
drivers/base/regmap/regcache.c
drivers/base/regmap/regcache.c
+10
-10
drivers/base/regmap/regmap-debugfs.c
drivers/base/regmap/regmap-debugfs.c
+11
-3
drivers/base/regmap/regmap-i2c.c
drivers/base/regmap/regmap-i2c.c
+8
-5
drivers/base/regmap/regmap-mmio.c
drivers/base/regmap/regmap-mmio.c
+211
-0
drivers/base/regmap/regmap-spi.c
drivers/base/regmap/regmap-spi.c
+8
-5
drivers/base/regmap/regmap.c
drivers/base/regmap/regmap.c
+103
-36
include/linux/regmap.h
include/linux/regmap.h
+21
-3
No files found.
drivers/base/regmap/Kconfig
View file @
c0cc6fe1
...
...
@@ -14,5 +14,8 @@ config REGMAP_I2C
config REGMAP_SPI
tristate
config REGMAP_MMIO
tristate
config REGMAP_IRQ
bool
drivers/base/regmap/Makefile
View file @
c0cc6fe1
...
...
@@ -3,4 +3,5 @@ obj-$(CONFIG_REGMAP) += regcache-rbtree.o regcache-lzo.o
obj-$(CONFIG_DEBUG_FS)
+=
regmap-debugfs.o
obj-$(CONFIG_REGMAP_I2C)
+=
regmap-i2c.o
obj-$(CONFIG_REGMAP_SPI)
+=
regmap-spi.o
obj-$(CONFIG_REGMAP_MMIO)
+=
regmap-mmio.o
obj-$(CONFIG_REGMAP_IRQ)
+=
regmap-irq.o
drivers/base/regmap/internal.h
View file @
c0cc6fe1
...
...
@@ -26,21 +26,29 @@ struct regmap_format {
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
);
void
(
*
format_reg
)(
void
*
buf
,
unsigned
int
reg
,
unsigned
int
shift
);
void
(
*
format_val
)(
void
*
buf
,
unsigned
int
val
,
unsigned
int
shift
);
unsigned
int
(
*
parse_val
)(
void
*
buf
);
};
typedef
void
(
*
regmap_lock
)(
struct
regmap
*
map
);
typedef
void
(
*
regmap_unlock
)(
struct
regmap
*
map
);
struct
regmap
{
struct
mutex
lock
;
struct
mutex
mutex
;
spinlock_t
spinlock
;
regmap_lock
lock
;
regmap_unlock
unlock
;
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
;
void
*
bus_context
;
#ifdef CONFIG_DEBUG_FS
struct
dentry
*
debugfs
;
const
char
*
debugfs_name
;
#endif
unsigned
int
max_register
;
...
...
@@ -52,6 +60,9 @@ struct regmap {
u8
read_flag_mask
;
u8
write_flag_mask
;
/* number of bits to (left) shift the reg value when formatting*/
int
reg_shift
;
/* regcache specific members */
const
struct
regcache_ops
*
cache_ops
;
enum
regcache_type
cache_type
;
...
...
@@ -101,11 +112,11 @@ int _regmap_write(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_init
(
struct
regmap
*
map
,
const
char
*
name
);
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_init
(
struct
regmap
*
map
,
const
char
*
name
)
{
}
static
inline
void
regmap_debugfs_exit
(
struct
regmap
*
map
)
{
}
#endif
...
...
drivers/base/regmap/regcache-rbtree.c
View file @
c0cc6fe1
...
...
@@ -140,7 +140,7 @@ static int rbtree_show(struct seq_file *s, void *ignored)
int
registers
=
0
;
int
average
;
m
utex_lock
(
&
map
->
lock
);
m
ap
->
lock
(
map
);
for
(
node
=
rb_first
(
&
rbtree_ctx
->
root
);
node
!=
NULL
;
node
=
rb_next
(
node
))
{
...
...
@@ -161,7 +161,7 @@ static int rbtree_show(struct seq_file *s, void *ignored)
seq_printf
(
s
,
"%d nodes, %d registers, average %d registers
\n
"
,
nodes
,
registers
,
average
);
m
utex_unlock
(
&
map
->
lock
);
m
ap
->
unlock
(
map
);
return
0
;
}
...
...
drivers/base/regmap/regcache.c
View file @
c0cc6fe1
...
...
@@ -264,7 +264,7 @@ int regcache_sync(struct regmap *map)
BUG_ON
(
!
map
->
cache_ops
||
!
map
->
cache_ops
->
sync
);
m
utex_lock
(
&
map
->
lock
);
m
ap
->
lock
(
map
);
/* Remember the initial bypass state */
bypass
=
map
->
cache_bypass
;
dev_dbg
(
map
->
dev
,
"Syncing %s cache
\n
"
,
...
...
@@ -296,7 +296,7 @@ int regcache_sync(struct regmap *map)
trace_regcache_sync
(
map
->
dev
,
name
,
"stop"
);
/* Restore the bypass state */
map
->
cache_bypass
=
bypass
;
m
utex_unlock
(
&
map
->
lock
);
m
ap
->
unlock
(
map
);
return
ret
;
}
...
...
@@ -323,7 +323,7 @@ int regcache_sync_region(struct regmap *map, unsigned int min,
BUG_ON
(
!
map
->
cache_ops
||
!
map
->
cache_ops
->
sync
);
m
utex_lock
(
&
map
->
lock
);
m
ap
->
lock
(
map
);
/* Remember the initial bypass state */
bypass
=
map
->
cache_bypass
;
...
...
@@ -342,7 +342,7 @@ int regcache_sync_region(struct regmap *map, unsigned int min,
trace_regcache_sync
(
map
->
dev
,
name
,
"stop region"
);
/* Restore the bypass state */
map
->
cache_bypass
=
bypass
;
m
utex_unlock
(
&
map
->
lock
);
m
ap
->
unlock
(
map
);
return
ret
;
}
...
...
@@ -362,11 +362,11 @@ EXPORT_SYMBOL_GPL(regcache_sync_region);
*/
void
regcache_cache_only
(
struct
regmap
*
map
,
bool
enable
)
{
m
utex_lock
(
&
map
->
lock
);
m
ap
->
lock
(
map
);
WARN_ON
(
map
->
cache_bypass
&&
enable
);
map
->
cache_only
=
enable
;
trace_regmap_cache_only
(
map
->
dev
,
enable
);
m
utex_unlock
(
&
map
->
lock
);
m
ap
->
unlock
(
map
);
}
EXPORT_SYMBOL_GPL
(
regcache_cache_only
);
...
...
@@ -381,9 +381,9 @@ EXPORT_SYMBOL_GPL(regcache_cache_only);
*/
void
regcache_mark_dirty
(
struct
regmap
*
map
)
{
m
utex_lock
(
&
map
->
lock
);
m
ap
->
lock
(
map
);
map
->
cache_dirty
=
true
;
m
utex_unlock
(
&
map
->
lock
);
m
ap
->
unlock
(
map
);
}
EXPORT_SYMBOL_GPL
(
regcache_mark_dirty
);
...
...
@@ -400,11 +400,11 @@ EXPORT_SYMBOL_GPL(regcache_mark_dirty);
*/
void
regcache_cache_bypass
(
struct
regmap
*
map
,
bool
enable
)
{
m
utex_lock
(
&
map
->
lock
);
m
ap
->
lock
(
map
);
WARN_ON
(
map
->
cache_only
&&
enable
);
map
->
cache_bypass
=
enable
;
trace_regmap_cache_bypass
(
map
->
dev
,
enable
);
m
utex_unlock
(
&
map
->
lock
);
m
ap
->
unlock
(
map
);
}
EXPORT_SYMBOL_GPL
(
regcache_cache_bypass
);
...
...
drivers/base/regmap/regmap-debugfs.c
View file @
c0cc6fe1
...
...
@@ -242,10 +242,17 @@ static const struct file_operations regmap_access_fops = {
.
llseek
=
default_llseek
,
};
void
regmap_debugfs_init
(
struct
regmap
*
map
)
void
regmap_debugfs_init
(
struct
regmap
*
map
,
const
char
*
name
)
{
map
->
debugfs
=
debugfs_create_dir
(
dev_name
(
map
->
dev
),
regmap_debugfs_root
);
if
(
name
)
{
map
->
debugfs_name
=
kasprintf
(
GFP_KERNEL
,
"%s-%s"
,
dev_name
(
map
->
dev
),
name
);
name
=
map
->
debugfs_name
;
}
else
{
name
=
dev_name
(
map
->
dev
);
}
map
->
debugfs
=
debugfs_create_dir
(
name
,
regmap_debugfs_root
);
if
(
!
map
->
debugfs
)
{
dev_warn
(
map
->
dev
,
"Failed to create debugfs directory
\n
"
);
return
;
...
...
@@ -274,6 +281,7 @@ void regmap_debugfs_init(struct regmap *map)
void
regmap_debugfs_exit
(
struct
regmap
*
map
)
{
debugfs_remove_recursive
(
map
->
debugfs
);
kfree
(
map
->
debugfs_name
);
}
void
regmap_debugfs_initcall
(
void
)
...
...
drivers/base/regmap/regmap-i2c.c
View file @
c0cc6fe1
...
...
@@ -15,8 +15,9 @@
#include <linux/module.h>
#include <linux/init.h>
static
int
regmap_i2c_write
(
struct
device
*
dev
,
const
void
*
data
,
size_t
count
)
static
int
regmap_i2c_write
(
void
*
context
,
const
void
*
data
,
size_t
count
)
{
struct
device
*
dev
=
context
;
struct
i2c_client
*
i2c
=
to_i2c_client
(
dev
);
int
ret
;
...
...
@@ -29,10 +30,11 @@ static int regmap_i2c_write(struct device *dev, const void *data, size_t count)
return
-
EIO
;
}
static
int
regmap_i2c_gather_write
(
struct
device
*
dev
,
static
int
regmap_i2c_gather_write
(
void
*
context
,
const
void
*
reg
,
size_t
reg_size
,
const
void
*
val
,
size_t
val_size
)
{
struct
device
*
dev
=
context
;
struct
i2c_client
*
i2c
=
to_i2c_client
(
dev
);
struct
i2c_msg
xfer
[
2
];
int
ret
;
...
...
@@ -62,10 +64,11 @@ static int regmap_i2c_gather_write(struct device *dev,
return
-
EIO
;
}
static
int
regmap_i2c_read
(
struct
device
*
dev
,
static
int
regmap_i2c_read
(
void
*
context
,
const
void
*
reg
,
size_t
reg_size
,
void
*
val
,
size_t
val_size
)
{
struct
device
*
dev
=
context
;
struct
i2c_client
*
i2c
=
to_i2c_client
(
dev
);
struct
i2c_msg
xfer
[
2
];
int
ret
;
...
...
@@ -107,7 +110,7 @@ static struct regmap_bus regmap_i2c = {
struct
regmap
*
regmap_init_i2c
(
struct
i2c_client
*
i2c
,
const
struct
regmap_config
*
config
)
{
return
regmap_init
(
&
i2c
->
dev
,
&
regmap_i2c
,
config
);
return
regmap_init
(
&
i2c
->
dev
,
&
regmap_i2c
,
&
i2c
->
dev
,
config
);
}
EXPORT_SYMBOL_GPL
(
regmap_init_i2c
);
...
...
@@ -124,7 +127,7 @@ EXPORT_SYMBOL_GPL(regmap_init_i2c);
struct
regmap
*
devm_regmap_init_i2c
(
struct
i2c_client
*
i2c
,
const
struct
regmap_config
*
config
)
{
return
devm_regmap_init
(
&
i2c
->
dev
,
&
regmap_i2c
,
config
);
return
devm_regmap_init
(
&
i2c
->
dev
,
&
regmap_i2c
,
&
i2c
->
dev
,
config
);
}
EXPORT_SYMBOL_GPL
(
devm_regmap_init_i2c
);
...
...
drivers/base/regmap/regmap-mmio.c
0 → 100644
View file @
c0cc6fe1
/*
* Register map access API - MMIO support
*
* Copyright (c) 2012, NVIDIA CORPORATION. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include <linux/err.h>
#include <linux/init.h>
#include <linux/io.h>
#include <linux/module.h>
#include <linux/regmap.h>
#include <linux/slab.h>
struct
regmap_mmio_context
{
void
__iomem
*
regs
;
unsigned
val_bytes
;
};
static
int
regmap_mmio_gather_write
(
void
*
context
,
const
void
*
reg
,
size_t
reg_size
,
const
void
*
val
,
size_t
val_size
)
{
struct
regmap_mmio_context
*
ctx
=
context
;
u32
offset
;
BUG_ON
(
reg_size
!=
4
);
offset
=
be32_to_cpup
(
reg
);
while
(
val_size
)
{
switch
(
ctx
->
val_bytes
)
{
case
1
:
writeb
(
*
(
u8
*
)
val
,
ctx
->
regs
+
offset
);
break
;
case
2
:
writew
(
be16_to_cpup
(
val
),
ctx
->
regs
+
offset
);
break
;
case
4
:
writel
(
be32_to_cpup
(
val
),
ctx
->
regs
+
offset
);
break
;
#ifdef CONFIG_64BIT
case
8
:
writeq
(
be64_to_cpup
(
val
),
ctx
->
regs
+
offset
);
break
;
#endif
default:
/* Should be caught by regmap_mmio_check_config */
BUG
();
}
val_size
-=
ctx
->
val_bytes
;
val
+=
ctx
->
val_bytes
;
offset
+=
ctx
->
val_bytes
;
}
return
0
;
}
static
int
regmap_mmio_write
(
void
*
context
,
const
void
*
data
,
size_t
count
)
{
BUG_ON
(
count
<
4
);
return
regmap_mmio_gather_write
(
context
,
data
,
4
,
data
+
4
,
count
-
4
);
}
static
int
regmap_mmio_read
(
void
*
context
,
const
void
*
reg
,
size_t
reg_size
,
void
*
val
,
size_t
val_size
)
{
struct
regmap_mmio_context
*
ctx
=
context
;
u32
offset
;
BUG_ON
(
reg_size
!=
4
);
offset
=
be32_to_cpup
(
reg
);
while
(
val_size
)
{
switch
(
ctx
->
val_bytes
)
{
case
1
:
*
(
u8
*
)
val
=
readb
(
ctx
->
regs
+
offset
);
break
;
case
2
:
*
(
u16
*
)
val
=
cpu_to_be16
(
readw
(
ctx
->
regs
+
offset
));
break
;
case
4
:
*
(
u32
*
)
val
=
cpu_to_be32
(
readl
(
ctx
->
regs
+
offset
));
break
;
#ifdef CONFIG_64BIT
case
8
:
*
(
u64
*
)
val
=
cpu_to_be32
(
readq
(
ctx
->
regs
+
offset
));
break
;
#endif
default:
/* Should be caught by regmap_mmio_check_config */
BUG
();
}
val_size
-=
ctx
->
val_bytes
;
val
+=
ctx
->
val_bytes
;
offset
+=
ctx
->
val_bytes
;
}
return
0
;
}
static
void
regmap_mmio_free_context
(
void
*
context
)
{
kfree
(
context
);
}
static
struct
regmap_bus
regmap_mmio
=
{
.
fast_io
=
true
,
.
write
=
regmap_mmio_write
,
.
gather_write
=
regmap_mmio_gather_write
,
.
read
=
regmap_mmio_read
,
.
free_context
=
regmap_mmio_free_context
,
};
struct
regmap_mmio_context
*
regmap_mmio_gen_context
(
void
__iomem
*
regs
,
const
struct
regmap_config
*
config
)
{
struct
regmap_mmio_context
*
ctx
;
if
(
config
->
reg_bits
!=
32
)
return
ERR_PTR
(
-
EINVAL
);
if
(
config
->
pad_bits
)
return
ERR_PTR
(
-
EINVAL
);
switch
(
config
->
val_bits
)
{
case
8
:
case
16
:
case
32
:
#ifdef CONFIG_64BIT
case
64
:
#endif
break
;
default:
return
ERR_PTR
(
-
EINVAL
);
}
ctx
=
kzalloc
(
GFP_KERNEL
,
sizeof
(
*
ctx
));
if
(
!
ctx
)
return
ERR_PTR
(
-
ENOMEM
);
ctx
->
regs
=
regs
;
ctx
->
val_bytes
=
config
->
val_bits
/
8
;
return
ctx
;
}
/**
* regmap_init_mmio(): Initialise register map
*
* @dev: Device that will be interacted with
* @regs: Pointer to memory-mapped IO region
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer to
* a struct regmap.
*/
struct
regmap
*
regmap_init_mmio
(
struct
device
*
dev
,
void
__iomem
*
regs
,
const
struct
regmap_config
*
config
)
{
struct
regmap_mmio_context
*
ctx
;
ctx
=
regmap_mmio_gen_context
(
regs
,
config
);
if
(
IS_ERR
(
ctx
))
return
ERR_CAST
(
ctx
);
return
regmap_init
(
dev
,
&
regmap_mmio
,
ctx
,
config
);
}
EXPORT_SYMBOL_GPL
(
regmap_init_mmio
);
/**
* devm_regmap_init_mmio(): Initialise managed register map
*
* @dev: Device that will be interacted with
* @regs: Pointer to memory-mapped IO region
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer
* to a struct regmap. The regmap will be automatically freed by the
* device management code.
*/
struct
regmap
*
devm_regmap_init_mmio
(
struct
device
*
dev
,
void
__iomem
*
regs
,
const
struct
regmap_config
*
config
)
{
struct
regmap_mmio_context
*
ctx
;
ctx
=
regmap_mmio_gen_context
(
regs
,
config
);
if
(
IS_ERR
(
ctx
))
return
ERR_CAST
(
ctx
);
return
devm_regmap_init
(
dev
,
&
regmap_mmio
,
ctx
,
config
);
}
EXPORT_SYMBOL_GPL
(
devm_regmap_init_mmio
);
MODULE_LICENSE
(
"GPL v2"
);
drivers/base/regmap/regmap-spi.c
View file @
c0cc6fe1
...
...
@@ -15,17 +15,19 @@
#include <linux/init.h>
#include <linux/module.h>
static
int
regmap_spi_write
(
struct
device
*
dev
,
const
void
*
data
,
size_t
count
)
static
int
regmap_spi_write
(
void
*
context
,
const
void
*
data
,
size_t
count
)
{
struct
device
*
dev
=
context
;
struct
spi_device
*
spi
=
to_spi_device
(
dev
);
return
spi_write
(
spi
,
data
,
count
);
}
static
int
regmap_spi_gather_write
(
struct
device
*
dev
,
static
int
regmap_spi_gather_write
(
void
*
context
,
const
void
*
reg
,
size_t
reg_len
,
const
void
*
val
,
size_t
val_len
)
{
struct
device
*
dev
=
context
;
struct
spi_device
*
spi
=
to_spi_device
(
dev
);
struct
spi_message
m
;
struct
spi_transfer
t
[
2
]
=
{
{
.
tx_buf
=
reg
,
.
len
=
reg_len
,
},
...
...
@@ -38,10 +40,11 @@ static int regmap_spi_gather_write(struct device *dev,
return
spi_sync
(
spi
,
&
m
);
}
static
int
regmap_spi_read
(
struct
device
*
dev
,
static
int
regmap_spi_read
(
void
*
context
,
const
void
*
reg
,
size_t
reg_size
,
void
*
val
,
size_t
val_size
)
{
struct
device
*
dev
=
context
;
struct
spi_device
*
spi
=
to_spi_device
(
dev
);
return
spi_write_then_read
(
spi
,
reg
,
reg_size
,
val
,
val_size
);
...
...
@@ -66,7 +69,7 @@ static struct regmap_bus regmap_spi = {
struct
regmap
*
regmap_init_spi
(
struct
spi_device
*
spi
,
const
struct
regmap_config
*
config
)
{
return
regmap_init
(
&
spi
->
dev
,
&
regmap_spi
,
config
);
return
regmap_init
(
&
spi
->
dev
,
&
regmap_spi
,
&
spi
->
dev
,
config
);
}
EXPORT_SYMBOL_GPL
(
regmap_init_spi
);
...
...
@@ -83,7 +86,7 @@ EXPORT_SYMBOL_GPL(regmap_init_spi);
struct
regmap
*
devm_regmap_init_spi
(
struct
spi_device
*
spi
,
const
struct
regmap_config
*
config
)
{
return
devm_regmap_init
(
&
spi
->
dev
,
&
regmap_spi
,
config
);
return
devm_regmap_init
(
&
spi
->
dev
,
&
regmap_spi
,
&
spi
->
dev
,
config
);
}
EXPORT_SYMBOL_GPL
(
devm_regmap_init_spi
);
...
...
drivers/base/regmap/regmap.c
View file @
c0cc6fe1
This diff is collapsed.
Click to expand it.
include/linux/regmap.h
View file @
c0cc6fe1
...
...
@@ -46,6 +46,9 @@ struct reg_default {
/**
* Configuration for the register map of a device.
*
* @name: Optional name of the regmap. Useful when a device has multiple
* register regions.
*
* @reg_bits: Number of bits in a register address, mandatory.
* @pad_bits: Number of bits of padding between register and value.
* @val_bits: Number of bits in a register value, mandatory.
...
...
@@ -77,6 +80,8 @@ struct reg_default {
* @num_reg_defaults_raw: Number of elements in reg_defaults_raw.
*/
struct
regmap_config
{
const
char
*
name
;
int
reg_bits
;
int
pad_bits
;
int
val_bits
;
...
...
@@ -97,18 +102,21 @@ struct regmap_config {
u8
write_flag_mask
;
};
typedef
int
(
*
regmap_hw_write
)(
struct
device
*
dev
,
const
void
*
data
,
typedef
int
(
*
regmap_hw_write
)(
void
*
context
,
const
void
*
data
,
size_t
count
);
typedef
int
(
*
regmap_hw_gather_write
)(
struct
device
*
dev
,
typedef
int
(
*
regmap_hw_gather_write
)(
void
*
context
,
const
void
*
reg
,
size_t
reg_len
,
const
void
*
val
,
size_t
val_len
);
typedef
int
(
*
regmap_hw_read
)(
struct
device
*
dev
,
typedef
int
(
*
regmap_hw_read
)(
void
*
context
,
const
void
*
reg_buf
,
size_t
reg_size
,
void
*
val_buf
,
size_t
val_size
);
typedef
void
(
*
regmap_hw_free_context
)(
void
*
context
);
/**
* Description of a hardware bus for the register map infrastructure.
*
* @fast_io: Register IO is fast. Use a spinlock instead of a mutex
* to perform locking.
* @write: Write operation.
* @gather_write: Write operation with split register/value, return -ENOTSUPP
* if not implemented on a given device.
...
...
@@ -118,27 +126,37 @@ typedef int (*regmap_hw_read)(struct device *dev,
* a read.
*/
struct
regmap_bus
{
bool
fast_io
;
regmap_hw_write
write
;
regmap_hw_gather_write
gather_write
;
regmap_hw_read
read
;
regmap_hw_free_context
free_context
;
u8
read_flag_mask
;
};
struct
regmap
*
regmap_init
(
struct
device
*
dev
,
const
struct
regmap_bus
*
bus
,
void
*
bus_context
,
const
struct
regmap_config
*
config
);
struct
regmap
*
regmap_init_i2c
(
struct
i2c_client
*
i2c
,
const
struct
regmap_config
*
config
);
struct
regmap
*
regmap_init_spi
(
struct
spi_device
*
dev
,
const
struct
regmap_config
*
config
);
struct
regmap
*
regmap_init_mmio
(
struct
device
*
dev
,
void
__iomem
*
regs
,
const
struct
regmap_config
*
config
);
struct
regmap
*
devm_regmap_init
(
struct
device
*
dev
,
const
struct
regmap_bus
*
bus
,
void
*
bus_context
,
const
struct
regmap_config
*
config
);
struct
regmap
*
devm_regmap_init_i2c
(
struct
i2c_client
*
i2c
,
const
struct
regmap_config
*
config
);
struct
regmap
*
devm_regmap_init_spi
(
struct
spi_device
*
dev
,
const
struct
regmap_config
*
config
);
struct
regmap
*
devm_regmap_init_mmio
(
struct
device
*
dev
,
void
__iomem
*
regs
,
const
struct
regmap_config
*
config
);
void
regmap_exit
(
struct
regmap
*
map
);
int
regmap_reinit_cache
(
struct
regmap
*
map
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment