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
a75de772
Commit
a75de772
authored
Jan 12, 2018
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branches 'regmap/topic/soundwire' and 'regmap/topic/zero' into regmap-next
parents
757b6528
7c22ce6e
9bf485c9
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
138 additions
and
2 deletions
+138
-2
drivers/base/regmap/Kconfig
drivers/base/regmap/Kconfig
+4
-0
drivers/base/regmap/Makefile
drivers/base/regmap/Makefile
+1
-0
drivers/base/regmap/regmap-sdw.c
drivers/base/regmap/regmap-sdw.c
+88
-0
drivers/base/regmap/regmap.c
drivers/base/regmap/regmap.c
+3
-1
include/linux/regmap.h
include/linux/regmap.h
+42
-1
No files found.
drivers/base/regmap/Kconfig
View file @
a75de772
...
...
@@ -37,3 +37,7 @@ config REGMAP_MMIO
config REGMAP_IRQ
bool
config REGMAP_SOUNDWIRE
tristate
depends on SOUNDWIRE_BUS
drivers/base/regmap/Makefile
View file @
a75de772
...
...
@@ -13,3 +13,4 @@ obj-$(CONFIG_REGMAP_SPMI) += regmap-spmi.o
obj-$(CONFIG_REGMAP_MMIO)
+=
regmap-mmio.o
obj-$(CONFIG_REGMAP_IRQ)
+=
regmap-irq.o
obj-$(CONFIG_REGMAP_W1)
+=
regmap-w1.o
obj-$(CONFIG_REGMAP_SOUNDWIRE)
+=
regmap-sdw.o
drivers/base/regmap/regmap-sdw.c
0 → 100644
View file @
a75de772
// SPDX-License-Identifier: GPL-2.0
// Copyright(c) 2015-17 Intel Corporation.
#include <linux/device.h>
#include <linux/mod_devicetable.h>
#include <linux/module.h>
#include <linux/soundwire/sdw.h>
#include "internal.h"
static
int
regmap_sdw_write
(
void
*
context
,
unsigned
int
reg
,
unsigned
int
val
)
{
struct
device
*
dev
=
context
;
struct
sdw_slave
*
slave
=
dev_to_sdw_dev
(
dev
);
return
sdw_write
(
slave
,
reg
,
val
);
}
static
int
regmap_sdw_read
(
void
*
context
,
unsigned
int
reg
,
unsigned
int
*
val
)
{
struct
device
*
dev
=
context
;
struct
sdw_slave
*
slave
=
dev_to_sdw_dev
(
dev
);
int
read
;
read
=
sdw_read
(
slave
,
reg
);
if
(
read
<
0
)
return
read
;
*
val
=
read
;
return
0
;
}
static
struct
regmap_bus
regmap_sdw
=
{
.
reg_read
=
regmap_sdw_read
,
.
reg_write
=
regmap_sdw_write
,
.
reg_format_endian_default
=
REGMAP_ENDIAN_LITTLE
,
.
val_format_endian_default
=
REGMAP_ENDIAN_LITTLE
,
};
static
int
regmap_sdw_config_check
(
const
struct
regmap_config
*
config
)
{
/* All register are 8-bits wide as per MIPI Soundwire 1.0 Spec */
if
(
config
->
val_bits
!=
8
)
return
-
ENOTSUPP
;
/* Registers are 32 bits wide */
if
(
config
->
reg_bits
!=
32
)
return
-
ENOTSUPP
;
if
(
config
->
pad_bits
!=
0
)
return
-
ENOTSUPP
;
return
0
;
}
struct
regmap
*
__regmap_init_sdw
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
)
{
int
ret
;
ret
=
regmap_sdw_config_check
(
config
);
if
(
ret
)
return
ERR_PTR
(
ret
);
return
__regmap_init
(
&
sdw
->
dev
,
&
regmap_sdw
,
&
sdw
->
dev
,
config
,
lock_key
,
lock_name
);
}
EXPORT_SYMBOL_GPL
(
__regmap_init_sdw
);
struct
regmap
*
__devm_regmap_init_sdw
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
)
{
int
ret
;
ret
=
regmap_sdw_config_check
(
config
);
if
(
ret
)
return
ERR_PTR
(
ret
);
return
__devm_regmap_init
(
&
sdw
->
dev
,
&
regmap_sdw
,
&
sdw
->
dev
,
config
,
lock_key
,
lock_name
);
}
EXPORT_SYMBOL_GPL
(
__devm_regmap_init_sdw
);
MODULE_DESCRIPTION
(
"Regmap SoundWire Module"
);
MODULE_LICENSE
(
"GPL v2"
);
drivers/base/regmap/regmap.c
View file @
a75de772
...
...
@@ -777,7 +777,9 @@ struct regmap *__regmap_init(struct device *dev,
INIT_LIST_HEAD
(
&
map
->
async_free
);
init_waitqueue_head
(
&
map
->
async_waitq
);
if
(
config
->
read_flag_mask
||
config
->
write_flag_mask
)
{
if
(
config
->
read_flag_mask
||
config
->
write_flag_mask
||
config
->
zero_flag_mask
)
{
map
->
read_flag_mask
=
config
->
read_flag_mask
;
map
->
write_flag_mask
=
config
->
write_flag_mask
;
}
else
if
(
bus
)
{
...
...
include/linux/regmap.h
View file @
a75de772
...
...
@@ -30,6 +30,7 @@ struct regmap;
struct
regmap_range_cfg
;
struct
regmap_field
;
struct
snd_ac97
;
struct
sdw_slave
;
/* An enum of all the supported cache types */
enum
regcache_type
{
...
...
@@ -299,7 +300,10 @@ typedef void (*regmap_unlock)(void *);
* a read.
* @write_flag_mask: Mask to be set in the top bytes of the register when doing
* a write. If both read_flag_mask and write_flag_mask are
* empty the regmap_bus default masks are used.
* empty and zero_flag_mask is not set the regmap_bus default
* masks are used.
* @zero_flag_mask: If set, read_flag_mask and write_flag_mask are used even
* if they are both empty.
* @use_single_rw: If set, converts the bulk read and write operations into
* a series of single read and write operations. This is useful
* for device that does not support bulk read and write.
...
...
@@ -361,6 +365,7 @@ struct regmap_config {
unsigned
long
read_flag_mask
;
unsigned
long
write_flag_mask
;
bool
zero_flag_mask
;
bool
use_single_rw
;
bool
can_multi_write
;
...
...
@@ -531,6 +536,10 @@ struct regmap *__regmap_init_ac97(struct snd_ac97 *ac97,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
struct
regmap
*
__regmap_init_sdw
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
struct
regmap
*
__devm_regmap_init
(
struct
device
*
dev
,
const
struct
regmap_bus
*
bus
,
...
...
@@ -568,6 +577,10 @@ struct regmap *__devm_regmap_init_ac97(struct snd_ac97 *ac97,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
struct
regmap
*
__devm_regmap_init_sdw
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
/*
* Wrapper for regmap_init macros to include a unique lockdep key and name
...
...
@@ -716,6 +729,20 @@ int regmap_attach_dev(struct device *dev, struct regmap *map,
ac97, config)
bool
regmap_ac97_default_volatile
(
struct
device
*
dev
,
unsigned
int
reg
);
/**
* regmap_init_sdw() - Initialise register map
*
* @sdw: Device that will be interacted with
* @config: Configuration for register map
*
* The return value will be an ERR_PTR() on error or a valid pointer to
* a struct regmap.
*/
#define regmap_init_sdw(sdw, config) \
__regmap_lockdep_wrapper(__regmap_init_sdw, #config, \
sdw, config)
/**
* devm_regmap_init() - Initialise managed register map
*
...
...
@@ -846,6 +873,20 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
__regmap_lockdep_wrapper(__devm_regmap_init_ac97, #config, \
ac97, config)
/**
* devm_regmap_init_sdw() - Initialise managed register map
*
* @sdw: Device that will be interacted with
* @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.
*/
#define devm_regmap_init_sdw(sdw, config) \
__regmap_lockdep_wrapper(__devm_regmap_init_sdw, #config, \
sdw, config)
void
regmap_exit
(
struct
regmap
*
map
);
int
regmap_reinit_cache
(
struct
regmap
*
map
,
const
struct
regmap_config
*
config
);
...
...
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