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
Kirill Smelkov
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