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
eec8ae7a
Commit
eec8ae7a
authored
Jan 09, 2014
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regmap/topic/core' into regmap-next
parents
d6e0a2dd
bdc39644
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
47 additions
and
35 deletions
+47
-35
drivers/base/regmap/regmap.c
drivers/base/regmap/regmap.c
+42
-30
include/linux/regmap.h
include/linux/regmap.h
+5
-5
No files found.
drivers/base/regmap/regmap.c
View file @
eec8ae7a
...
...
@@ -1514,21 +1514,49 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
{
int
ret
=
0
,
i
;
size_t
val_bytes
=
map
->
format
.
val_bytes
;
void
*
wval
;
if
(
!
map
->
bus
)
return
-
EINVAL
;
if
(
!
map
->
format
.
parse_inplace
)
if
(
map
->
bus
&&
!
map
->
format
.
parse_inplace
)
return
-
EINVAL
;
if
(
reg
%
map
->
reg_stride
)
return
-
EINVAL
;
map
->
lock
(
map
->
lock_arg
);
/*
* Some devices don't support bulk write, for
* them we have a series of single write operations.
*/
if
(
!
map
->
bus
||
map
->
use_single_rw
)
{
for
(
i
=
0
;
i
<
val_count
;
i
++
)
{
unsigned
int
ival
;
switch
(
val_bytes
)
{
case
1
:
ival
=
*
(
u8
*
)(
val
+
(
i
*
val_bytes
));
break
;
case
2
:
ival
=
*
(
u16
*
)(
val
+
(
i
*
val_bytes
));
break
;
case
4
:
ival
=
*
(
u32
*
)(
val
+
(
i
*
val_bytes
));
break
;
#ifdef CONFIG_64BIT
case
8
:
ival
=
*
(
u64
*
)(
val
+
(
i
*
val_bytes
));
break
;
#endif
default:
ret
=
-
EINVAL
;
goto
out
;
}
/* No formatting is require if val_byte is 1 */
if
(
val_bytes
==
1
)
{
wval
=
(
void
*
)
val
;
ret
=
_regmap_write
(
map
,
reg
+
(
i
*
map
->
reg_stride
),
ival
);
if
(
ret
!=
0
)
goto
out
;
}
}
else
{
void
*
wval
;
wval
=
kmemdup
(
val
,
val_count
*
val_bytes
,
GFP_KERNEL
);
if
(
!
wval
)
{
ret
=
-
ENOMEM
;
...
...
@@ -1537,27 +1565,11 @@ int regmap_bulk_write(struct regmap *map, unsigned int reg, const void *val,
}
for
(
i
=
0
;
i
<
val_count
*
val_bytes
;
i
+=
val_bytes
)
map
->
format
.
parse_inplace
(
wval
+
i
);
}
/*
* Some devices does not support bulk write, for
* them we have a series of single write operations.
*/
if
(
map
->
use_single_rw
)
{
for
(
i
=
0
;
i
<
val_count
;
i
++
)
{
ret
=
_regmap_raw_write
(
map
,
reg
+
(
i
*
map
->
reg_stride
),
val
+
(
i
*
val_bytes
),
val_bytes
);
if
(
ret
!=
0
)
goto
out
;
}
}
else
{
ret
=
_regmap_raw_write
(
map
,
reg
,
wval
,
val_bytes
*
val_count
);
}
if
(
val_bytes
!=
1
)
kfree
(
wval
);
}
out:
map
->
unlock
(
map
->
lock_arg
);
return
ret
;
...
...
@@ -1897,14 +1909,10 @@ int regmap_bulk_read(struct regmap *map, unsigned int reg, void *val,
size_t
val_bytes
=
map
->
format
.
val_bytes
;
bool
vol
=
regmap_volatile_range
(
map
,
reg
,
val_count
);
if
(
!
map
->
bus
)
return
-
EINVAL
;
if
(
!
map
->
format
.
parse_inplace
)
return
-
EINVAL
;
if
(
reg
%
map
->
reg_stride
)
return
-
EINVAL
;
if
(
vol
||
map
->
cache_type
==
REGCACHE_NONE
)
{
if
(
map
->
bus
&&
map
->
format
.
parse_inplace
&&
(
vol
||
map
->
cache_type
==
REGCACHE_NONE
)
)
{
/*
* Some devices does not support bulk read, for
* them we have a series of single read operations.
...
...
@@ -2173,6 +2181,10 @@ int regmap_register_patch(struct regmap *map, const struct reg_default *regs,
int
i
,
ret
;
bool
bypass
;
if
(
WARN_ONCE
(
num_regs
<=
0
,
"invalid registers number (%d)
\n
"
,
num_regs
))
return
0
;
map
->
lock
(
map
->
lock_arg
);
bypass
=
map
->
cache_bypass
;
...
...
include/linux/regmap.h
View file @
eec8ae7a
...
...
@@ -122,9 +122,9 @@ typedef void (*regmap_unlock)(void *);
* volatile_table (see below) is not, the check is performed on
* such table (a register is volatile if it belongs to one of
* the ranges specified by volatile_table).
* @precious_reg: Optional callback returning true if the rgister
* @precious_reg: Optional callback returning true if the r
e
gister
* should not be read outside of a call from the driver
* (e
g
, a clear on read interrupt status register). If this
* (e
.g.
, a clear on read interrupt status register). If this
* field is NULL but precious_table (see below) is not, the
* check is performed on such table (a register is precious if
* it belongs to one of the ranges specified by precious_table).
...
...
@@ -136,9 +136,9 @@ typedef void (*regmap_unlock)(void *);
* are not overridden).
* @reg_read: Optional callback that if filled will be used to perform
* all the reads from the registers. Should only be provided for
* devices whos
read operation cannot be represented as a simple read
*
operation on a bus such as SPI, I2C, etc. Most of the devices do
*
not need this.
* devices whos
e read operation cannot be represented as a simple
*
read operation on a bus such as SPI, I2C, etc. Most of the
*
devices do
not need this.
* @reg_write: Same as above for writing.
* @fast_io: Register IO is fast. Use a spinlock instead of a mutex
* to perform locking. This field is ignored if custom lock/unlock
...
...
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