-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add a register map that is a simple array of memory, for use in KUnit testing of the framework. This is not exposed in regmap.h since I can't think of a non-test use case, it is purely for use internally. To facilitate testing we track if registers have been read or written to. Signed-off-by: Mark Brown <broonie@kernel.org> Link: https://lore.kernel.org/r/20230324-regmap-kunit-v2-1-b208801dc2c8@kernel.org
- Loading branch information
Mark Brown
committed
Mar 30, 2023
1 parent
1e2bae6
commit f635242
Showing
4 changed files
with
108 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,85 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
// | ||
// Register map access API - Memory region | ||
// | ||
// This is intended for testing only | ||
// | ||
// Copyright (c) 2023, Arm Ltd | ||
|
||
#include <linux/clk.h> | ||
#include <linux/err.h> | ||
#include <linux/io.h> | ||
#include <linux/module.h> | ||
#include <linux/regmap.h> | ||
#include <linux/slab.h> | ||
#include <linux/swab.h> | ||
|
||
#include "internal.h" | ||
|
||
static int regmap_ram_write(void *context, unsigned int reg, unsigned int val) | ||
{ | ||
struct regmap_ram_data *data = context; | ||
|
||
data->vals[reg] = val; | ||
data->written[reg] = true; | ||
|
||
return 0; | ||
} | ||
|
||
static int regmap_ram_read(void *context, unsigned int reg, unsigned int *val) | ||
{ | ||
struct regmap_ram_data *data = context; | ||
|
||
*val = data->vals[reg]; | ||
data->read[reg] = true; | ||
|
||
return 0; | ||
} | ||
|
||
static void regmap_ram_free_context(void *context) | ||
{ | ||
struct regmap_ram_data *data = context; | ||
|
||
kfree(data->vals); | ||
kfree(data->read); | ||
kfree(data->written); | ||
kfree(data); | ||
} | ||
|
||
static const struct regmap_bus regmap_ram = { | ||
.fast_io = true, | ||
.reg_write = regmap_ram_write, | ||
.reg_read = regmap_ram_read, | ||
.free_context = regmap_ram_free_context, | ||
}; | ||
|
||
struct regmap *__regmap_init_ram(const struct regmap_config *config, | ||
struct regmap_ram_data *data, | ||
struct lock_class_key *lock_key, | ||
const char *lock_name) | ||
{ | ||
struct regmap *map; | ||
|
||
if (!config->max_register) { | ||
pr_crit("No max_register specified for RAM regmap\n"); | ||
return ERR_PTR(-EINVAL); | ||
} | ||
|
||
data->read = kcalloc(sizeof(bool), config->max_register + 1, | ||
GFP_KERNEL); | ||
if (!data->read) | ||
return ERR_PTR(-ENOMEM); | ||
|
||
data->written = kcalloc(sizeof(bool), config->max_register + 1, | ||
GFP_KERNEL); | ||
if (!data->written) | ||
return ERR_PTR(-ENOMEM); | ||
|
||
map = __regmap_init(NULL, ®map_ram, data, config, | ||
lock_key, lock_name); | ||
|
||
return map; | ||
} | ||
EXPORT_SYMBOL_GPL(__regmap_init_ram); | ||
|
||
MODULE_LICENSE("GPL v2"); |