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
4616c509
Commit
4616c509
authored
Nov 30, 2020
by
Mark Brown
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'regmap/for-5.11' into regmap-next
parents
e6e9354b
a8ecace1
Changes
8
Hide whitespace changes
Inline
Side-by-side
Showing
8 changed files
with
270 additions
and
13 deletions
+270
-13
drivers/base/regmap/Kconfig
drivers/base/regmap/Kconfig
+5
-1
drivers/base/regmap/Makefile
drivers/base/regmap/Makefile
+1
-0
drivers/base/regmap/regmap-mmio.c
drivers/base/regmap/regmap-mmio.c
+82
-8
drivers/base/regmap/regmap-sdw-mbq.c
drivers/base/regmap/regmap-sdw-mbq.c
+101
-0
drivers/base/regmap/regmap-sdw.c
drivers/base/regmap/regmap-sdw.c
+2
-0
drivers/base/regmap/regmap.c
drivers/base/regmap/regmap.c
+7
-4
include/linux/regmap.h
include/linux/regmap.h
+40
-0
include/linux/soundwire/sdw_registers.h
include/linux/soundwire/sdw_registers.h
+32
-0
No files found.
drivers/base/regmap/Kconfig
View file @
4616c509
...
...
@@ -4,7 +4,7 @@
# subsystems should select the appropriate symbols.
config REGMAP
default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SCCB || REGMAP_I3C || REGMAP_SPI_AVMM)
default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_S
OUNDWIRE_MBQ || REGMAP_S
CCB || REGMAP_I3C || REGMAP_SPI_AVMM)
select IRQ_DOMAIN if REGMAP_IRQ
bool
...
...
@@ -46,6 +46,10 @@ config REGMAP_SOUNDWIRE
tristate
depends on SOUNDWIRE
config REGMAP_SOUNDWIRE_MBQ
tristate
depends on SOUNDWIRE
config REGMAP_SCCB
tristate
depends on I2C
...
...
drivers/base/regmap/Makefile
View file @
4616c509
...
...
@@ -15,6 +15,7 @@ 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
obj-$(CONFIG_REGMAP_SOUNDWIRE_MBQ)
+=
regmap-sdw-mbq.o
obj-$(CONFIG_REGMAP_SCCB)
+=
regmap-sccb.o
obj-$(CONFIG_REGMAP_I3C)
+=
regmap-i3c.o
obj-$(CONFIG_REGMAP_SPI_AVMM)
+=
regmap-spi-avmm.o
drivers/base/regmap/regmap-mmio.c
View file @
4616c509
...
...
@@ -16,6 +16,7 @@
struct
regmap_mmio_context
{
void
__iomem
*
regs
;
unsigned
val_bytes
;
bool
relaxed_mmio
;
bool
attached_clk
;
struct
clk
*
clk
;
...
...
@@ -75,6 +76,13 @@ static void regmap_mmio_write8(struct regmap_mmio_context *ctx,
writeb
(
val
,
ctx
->
regs
+
reg
);
}
static
void
regmap_mmio_write8_relaxed
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
,
unsigned
int
val
)
{
writeb_relaxed
(
val
,
ctx
->
regs
+
reg
);
}
static
void
regmap_mmio_write16le
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
,
unsigned
int
val
)
...
...
@@ -82,6 +90,13 @@ static void regmap_mmio_write16le(struct regmap_mmio_context *ctx,
writew
(
val
,
ctx
->
regs
+
reg
);
}
static
void
regmap_mmio_write16le_relaxed
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
,
unsigned
int
val
)
{
writew_relaxed
(
val
,
ctx
->
regs
+
reg
);
}
static
void
regmap_mmio_write16be
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
,
unsigned
int
val
)
...
...
@@ -96,6 +111,13 @@ static void regmap_mmio_write32le(struct regmap_mmio_context *ctx,
writel
(
val
,
ctx
->
regs
+
reg
);
}
static
void
regmap_mmio_write32le_relaxed
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
,
unsigned
int
val
)
{
writel_relaxed
(
val
,
ctx
->
regs
+
reg
);
}
static
void
regmap_mmio_write32be
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
,
unsigned
int
val
)
...
...
@@ -110,6 +132,13 @@ static void regmap_mmio_write64le(struct regmap_mmio_context *ctx,
{
writeq
(
val
,
ctx
->
regs
+
reg
);
}
static
void
regmap_mmio_write64le_relaxed
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
,
unsigned
int
val
)
{
writeq_relaxed
(
val
,
ctx
->
regs
+
reg
);
}
#endif
static
int
regmap_mmio_write
(
void
*
context
,
unsigned
int
reg
,
unsigned
int
val
)
...
...
@@ -137,12 +166,24 @@ static unsigned int regmap_mmio_read8(struct regmap_mmio_context *ctx,
return
readb
(
ctx
->
regs
+
reg
);
}
static
unsigned
int
regmap_mmio_read8_relaxed
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
)
{
return
readb_relaxed
(
ctx
->
regs
+
reg
);
}
static
unsigned
int
regmap_mmio_read16le
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
)
{
return
readw
(
ctx
->
regs
+
reg
);
}
static
unsigned
int
regmap_mmio_read16le_relaxed
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
)
{
return
readw_relaxed
(
ctx
->
regs
+
reg
);
}
static
unsigned
int
regmap_mmio_read16be
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
)
{
...
...
@@ -155,6 +196,12 @@ static unsigned int regmap_mmio_read32le(struct regmap_mmio_context *ctx,
return
readl
(
ctx
->
regs
+
reg
);
}
static
unsigned
int
regmap_mmio_read32le_relaxed
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
)
{
return
readl_relaxed
(
ctx
->
regs
+
reg
);
}
static
unsigned
int
regmap_mmio_read32be
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
)
{
...
...
@@ -167,6 +214,12 @@ static unsigned int regmap_mmio_read64le(struct regmap_mmio_context *ctx,
{
return
readq
(
ctx
->
regs
+
reg
);
}
static
unsigned
int
regmap_mmio_read64le_relaxed
(
struct
regmap_mmio_context
*
ctx
,
unsigned
int
reg
)
{
return
readq_relaxed
(
ctx
->
regs
+
reg
);
}
#endif
static
int
regmap_mmio_read
(
void
*
context
,
unsigned
int
reg
,
unsigned
int
*
val
)
...
...
@@ -237,6 +290,7 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,
ctx
->
regs
=
regs
;
ctx
->
val_bytes
=
config
->
val_bits
/
8
;
ctx
->
relaxed_mmio
=
config
->
use_relaxed_mmio
;
ctx
->
clk
=
ERR_PTR
(
-
ENODEV
);
switch
(
regmap_get_val_endian
(
dev
,
&
regmap_mmio
,
config
))
{
...
...
@@ -247,21 +301,41 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,
#endif
switch
(
config
->
val_bits
)
{
case
8
:
ctx
->
reg_read
=
regmap_mmio_read8
;
ctx
->
reg_write
=
regmap_mmio_write8
;
if
(
ctx
->
relaxed_mmio
)
{
ctx
->
reg_read
=
regmap_mmio_read8_relaxed
;
ctx
->
reg_write
=
regmap_mmio_write8_relaxed
;
}
else
{
ctx
->
reg_read
=
regmap_mmio_read8
;
ctx
->
reg_write
=
regmap_mmio_write8
;
}
break
;
case
16
:
ctx
->
reg_read
=
regmap_mmio_read16le
;
ctx
->
reg_write
=
regmap_mmio_write16le
;
if
(
ctx
->
relaxed_mmio
)
{
ctx
->
reg_read
=
regmap_mmio_read16le_relaxed
;
ctx
->
reg_write
=
regmap_mmio_write16le_relaxed
;
}
else
{
ctx
->
reg_read
=
regmap_mmio_read16le
;
ctx
->
reg_write
=
regmap_mmio_write16le
;
}
break
;
case
32
:
ctx
->
reg_read
=
regmap_mmio_read32le
;
ctx
->
reg_write
=
regmap_mmio_write32le
;
if
(
ctx
->
relaxed_mmio
)
{
ctx
->
reg_read
=
regmap_mmio_read32le_relaxed
;
ctx
->
reg_write
=
regmap_mmio_write32le_relaxed
;
}
else
{
ctx
->
reg_read
=
regmap_mmio_read32le
;
ctx
->
reg_write
=
regmap_mmio_write32le
;
}
break
;
#ifdef CONFIG_64BIT
case
64
:
ctx
->
reg_read
=
regmap_mmio_read64le
;
ctx
->
reg_write
=
regmap_mmio_write64le
;
if
(
ctx
->
relaxed_mmio
)
{
ctx
->
reg_read
=
regmap_mmio_read64le_relaxed
;
ctx
->
reg_write
=
regmap_mmio_write64le_relaxed
;
}
else
{
ctx
->
reg_read
=
regmap_mmio_read64le
;
ctx
->
reg_write
=
regmap_mmio_write64le
;
}
break
;
#endif
default:
...
...
drivers/base/regmap/regmap-sdw-mbq.c
0 → 100644
View file @
4616c509
// SPDX-License-Identifier: GPL-2.0
// Copyright(c) 2020 Intel Corporation.
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/module.h>
#include <linux/regmap.h>
#include <linux/soundwire/sdw.h>
#include <linux/soundwire/sdw_registers.h>
#include "internal.h"
static
int
regmap_sdw_mbq_write
(
void
*
context
,
unsigned
int
reg
,
unsigned
int
val
)
{
struct
device
*
dev
=
context
;
struct
sdw_slave
*
slave
=
dev_to_sdw_dev
(
dev
);
int
ret
;
ret
=
sdw_write
(
slave
,
SDW_SDCA_MBQ_CTL
(
reg
),
(
val
>>
8
)
&
0xff
);
if
(
ret
<
0
)
return
ret
;
return
sdw_write
(
slave
,
reg
,
val
&
0xff
);
}
static
int
regmap_sdw_mbq_read
(
void
*
context
,
unsigned
int
reg
,
unsigned
int
*
val
)
{
struct
device
*
dev
=
context
;
struct
sdw_slave
*
slave
=
dev_to_sdw_dev
(
dev
);
int
read0
;
int
read1
;
read0
=
sdw_read
(
slave
,
reg
);
if
(
read0
<
0
)
return
read0
;
read1
=
sdw_read
(
slave
,
SDW_SDCA_MBQ_CTL
(
reg
));
if
(
read1
<
0
)
return
read1
;
*
val
=
(
read1
<<
8
)
|
read0
;
return
0
;
}
static
struct
regmap_bus
regmap_sdw_mbq
=
{
.
reg_read
=
regmap_sdw_mbq_read
,
.
reg_write
=
regmap_sdw_mbq_write
,
.
reg_format_endian_default
=
REGMAP_ENDIAN_LITTLE
,
.
val_format_endian_default
=
REGMAP_ENDIAN_LITTLE
,
};
static
int
regmap_sdw_mbq_config_check
(
const
struct
regmap_config
*
config
)
{
/* MBQ-based controls are only 16-bits for now */
if
(
config
->
val_bits
!=
16
)
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_mbq
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
)
{
int
ret
;
ret
=
regmap_sdw_mbq_config_check
(
config
);
if
(
ret
)
return
ERR_PTR
(
ret
);
return
__regmap_init
(
&
sdw
->
dev
,
&
regmap_sdw_mbq
,
&
sdw
->
dev
,
config
,
lock_key
,
lock_name
);
}
EXPORT_SYMBOL_GPL
(
__regmap_init_sdw_mbq
);
struct
regmap
*
__devm_regmap_init_sdw_mbq
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
)
{
int
ret
;
ret
=
regmap_sdw_mbq_config_check
(
config
);
if
(
ret
)
return
ERR_PTR
(
ret
);
return
__devm_regmap_init
(
&
sdw
->
dev
,
&
regmap_sdw_mbq
,
&
sdw
->
dev
,
config
,
lock_key
,
lock_name
);
}
EXPORT_SYMBOL_GPL
(
__devm_regmap_init_sdw_mbq
);
MODULE_DESCRIPTION
(
"Regmap SoundWire MBQ Module"
);
MODULE_LICENSE
(
"GPL v2"
);
drivers/base/regmap/regmap-sdw.c
View file @
4616c509
...
...
@@ -2,7 +2,9 @@
// Copyright(c) 2015-17 Intel Corporation.
#include <linux/device.h>
#include <linux/errno.h>
#include <linux/module.h>
#include <linux/regmap.h>
#include <linux/soundwire/sdw.h>
#include "internal.h"
...
...
drivers/base/regmap/regmap.c
View file @
4616c509
...
...
@@ -1924,12 +1924,15 @@ int _regmap_write(struct regmap *map, unsigned int reg,
}
}
if
(
regmap_should_log
(
map
))
dev_info
(
map
->
dev
,
"%x <= %x
\n
"
,
reg
,
val
);
ret
=
map
->
reg_write
(
context
,
reg
,
val
);
if
(
ret
==
0
)
{
if
(
regmap_should_log
(
map
))
dev_info
(
map
->
dev
,
"%x <= %x
\n
"
,
reg
,
val
);
trace_regmap_reg_write
(
map
,
reg
,
val
);
trace_regmap_reg_write
(
map
,
reg
,
val
);
}
return
map
->
reg_write
(
context
,
reg
,
val
)
;
return
ret
;
}
/**
...
...
include/linux/regmap.h
View file @
4616c509
...
...
@@ -315,6 +315,10 @@ typedef void (*regmap_unlock)(void *);
* masks are used.
* @zero_flag_mask: If set, read_flag_mask and write_flag_mask are used even
* if they are both empty.
* @use_relaxed_mmio: If set, MMIO R/W operations will not use memory barriers.
* This can avoid load on devices which don't require strict
* orderings, but drivers should carefully add any explicit
* memory barriers when they may require them.
* @use_single_read: If set, converts the bulk read operation into a series of
* single read operations. This is useful for a device that
* does not support bulk read.
...
...
@@ -388,6 +392,7 @@ struct regmap_config {
bool
use_single_read
;
bool
use_single_write
;
bool
use_relaxed_mmio
;
bool
can_multi_write
;
enum
regmap_endian
reg_format_endian
;
...
...
@@ -570,6 +575,10 @@ 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
*
__regmap_init_sdw_mbq
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
struct
regmap
*
__regmap_init_spi_avmm
(
struct
spi_device
*
spi
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
...
...
@@ -619,6 +628,10 @@ 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
);
struct
regmap
*
__devm_regmap_init_sdw_mbq
(
struct
sdw_slave
*
sdw
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
const
char
*
lock_name
);
struct
regmap
*
__devm_regmap_init_slimbus
(
struct
slim_device
*
slimbus
,
const
struct
regmap_config
*
config
,
struct
lock_class_key
*
lock_key
,
...
...
@@ -817,6 +830,19 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
__regmap_lockdep_wrapper(__regmap_init_sdw, #config, \
sdw, config)
/**
* regmap_init_sdw_mbq() - 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_mbq(sdw, config) \
__regmap_lockdep_wrapper(__regmap_init_sdw_mbq, #config, \
sdw, config)
/**
* regmap_init_spi_avmm() - Initialize register map for Intel SPI Slave
* to AVMM Bus Bridge
...
...
@@ -989,6 +1015,20 @@ bool regmap_ac97_default_volatile(struct device *dev, unsigned int reg);
__regmap_lockdep_wrapper(__devm_regmap_init_sdw, #config, \
sdw, config)
/**
* devm_regmap_init_sdw_mbq() - 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_mbq(sdw, config) \
__regmap_lockdep_wrapper(__devm_regmap_init_sdw_mbq, #config, \
sdw, config)
/**
* devm_regmap_init_slimbus() - Initialise managed register map
*
...
...
include/linux/soundwire/sdw_registers.h
View file @
4616c509
...
...
@@ -298,4 +298,36 @@
#define SDW_CASC_PORT_MASK_INTSTAT3 1
#define SDW_CASC_PORT_REG_OFFSET_INTSTAT3 2
/*
* v1.2 device - SDCA address mapping
*
* Spec definition
* Bits Contents
* 31 0 (required by addressing range)
* 30:26 0b10000 (Control Prefix)
* 25 0 (Reserved)
* 24:22 Function Number [2:0]
* 21 Entity[6]
* 20:19 Control Selector[5:4]
* 18 0 (Reserved)
* 17:15 Control Number[5:3]
* 14 Next
* 13 MBQ
* 12:7 Entity[5:0]
* 6:3 Control Selector[3:0]
* 2:0 Control Number[2:0]
*/
#define SDW_SDCA_CTL(fun, ent, ctl, ch) (BIT(30) | \
(((fun) & 0x7) << 22) | \
(((ent) & 0x40) << 15) | \
(((ent) & 0x3f) << 7) | \
(((ctl) & 0x30) << 15) | \
(((ctl) & 0x0f) << 3) | \
(((ch) & 0x38) << 12) | \
((ch) & 0x07))
#define SDW_SDCA_MBQ_CTL(reg) ((reg) | BIT(13))
#define SDW_SDCA_NEXT_CTL(reg) ((reg) | BIT(14))
#endif
/* __SDW_REGISTERS_H */
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