* [PATCH v2] regmap: debugfs: Fix handling of name string for debugfs init delays
@ 2020-09-17 12:08 Charles Keepax
2020-09-17 18:58 ` Mark Brown
2020-09-18 8:36 ` Dan Carpenter
0 siblings, 2 replies; 5+ messages in thread
From: Charles Keepax @ 2020-09-17 12:08 UTC (permalink / raw)
To: broonie; +Cc: linux-kernel, patches
In regmap_debugfs_init the initialisation of the debugfs is delayed
if the root node isn't ready yet. Most callers of regmap_debugfs_init
pass the name from the regmap_config, which is considered temporary
ie. may be unallocated after the regmap_init call returns. This leads
to a potential use after free, where config->name has been freed by
the time it is used in regmap_debugfs_initcall.
This situation can be seen on Zynq, where the architecture init_irq
callback registers a syscon device, using a local variable for the
regmap_config. As init_irq is very early in the platform bring up the
regmap debugfs root isn't ready yet. Although this doesn't crash it
does result in the debugfs entry not having the correct name.
Regmap already sets map->name from config->name on the regmap_init
path and the fact that a separate field is used to pass the name
to regmap_debugfs_init appears to be an artifact of the debugfs
name being added before the map name. As such this patch updates
regmap_debugfs_init to use map->name, which is already duplicated from
the config avoiding the issue.
This does however leave two lose ends, both regmap_attach_dev and
regmap_reinit_cache can be called after a regmap is registered and
would have had the effect of applying a new name to the debugfs
entries. In both of these cases it was chosen to update the map
name. In the case of regmap_attach_dev there are 3 users that
currently use this function to update the name, thus doing so avoids
changes for those users and it seems reasonable that attaching
a device would want to set the name of the map. In the case of
regmap_reinit_cache the primary use-case appears to be devices that
need some register access to identify the device (for example devices
in the same family) and then update the cache to match the exact
hardware. Whilst no users do currently update the name here, given the
use-case it seemed reasonable the name might want to be updated once
the device is better identified.
Signed-off-by: Charles Keepax <ckeepax@opensource.cirrus.com>
---
drivers/base/regmap/internal.h | 4 ++--
drivers/base/regmap/regmap-debugfs.c | 7 +++---
drivers/base/regmap/regmap.c | 44 +++++++++++++++++++++++++++---------
3 files changed, 38 insertions(+), 17 deletions(-)
diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h
index 8a59359e145f6..e7ab94cc327a9 100644
--- a/drivers/base/regmap/internal.h
+++ b/drivers/base/regmap/internal.h
@@ -220,7 +220,7 @@ struct regmap_field {
#ifdef CONFIG_DEBUG_FS
extern void regmap_debugfs_initcall(void);
-extern void regmap_debugfs_init(struct regmap *map, const char *name);
+extern void regmap_debugfs_init(struct regmap *map);
extern void regmap_debugfs_exit(struct regmap *map);
static inline void regmap_debugfs_disable(struct regmap *map)
@@ -230,7 +230,7 @@ static inline void regmap_debugfs_disable(struct regmap *map)
#else
static inline void regmap_debugfs_initcall(void) { }
-static inline void regmap_debugfs_init(struct regmap *map, const char *name) { }
+static inline void regmap_debugfs_init(struct regmap *map) { }
static inline void regmap_debugfs_exit(struct regmap *map) { }
static inline void regmap_debugfs_disable(struct regmap *map) { }
#endif
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c
index f58baff2be0af..b6d63ef16b442 100644
--- a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -17,7 +17,6 @@
struct regmap_debugfs_node {
struct regmap *map;
- const char *name;
struct list_head link;
};
@@ -544,11 +543,12 @@ static const struct file_operations regmap_cache_bypass_fops = {
.write = regmap_cache_bypass_write_file,
};
-void regmap_debugfs_init(struct regmap *map, const char *name)
+void regmap_debugfs_init(struct regmap *map)
{
struct rb_node *next;
struct regmap_range_node *range_node;
const char *devname = "dummy";
+ const char *name = map->name;
/*
* Userspace can initiate reads from the hardware over debugfs.
@@ -569,7 +569,6 @@ void regmap_debugfs_init(struct regmap *map, const char *name)
if (!node)
return;
node->map = map;
- node->name = name;
mutex_lock(®map_debugfs_early_lock);
list_add(&node->link, ®map_debugfs_early_list);
mutex_unlock(®map_debugfs_early_lock);
@@ -679,7 +678,7 @@ void regmap_debugfs_initcall(void)
mutex_lock(®map_debugfs_early_lock);
list_for_each_entry_safe(node, tmp, ®map_debugfs_early_list, link) {
- regmap_debugfs_init(node->map, node->name);
+ regmap_debugfs_init(node->map);
list_del(&node->link);
kfree(node);
}
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index 2807e544658e0..4876e5f543c70 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -581,14 +581,34 @@ static void regmap_range_exit(struct regmap *map)
kfree(map->selector_work_buf);
}
+static int regmap_set_name(struct regmap *map, const struct regmap_config *config)
+{
+ if (config->name) {
+ const char *name = kstrdup_const(config->name, GFP_KERNEL);
+
+ if (!name)
+ return -ENOMEM;
+
+ kfree_const(map->name);
+ map->name = name;
+ }
+
+ return 0;
+}
+
int regmap_attach_dev(struct device *dev, struct regmap *map,
const struct regmap_config *config)
{
struct regmap **m;
+ int ret;
map->dev = dev;
- regmap_debugfs_init(map, config->name);
+ ret = regmap_set_name(map, config);
+ if (ret)
+ return ret;
+
+ regmap_debugfs_init(map);
/* Add a devres resource for dev_get_regmap() */
m = devres_alloc(dev_get_regmap_release, sizeof(*m), GFP_KERNEL);
@@ -674,9 +694,9 @@ struct regmap *__regmap_init(struct device *dev,
const char *lock_name)
{
struct regmap *map;
- int ret = -EINVAL;
enum regmap_endian reg_endian, val_endian;
int i, j;
+ int ret;
if (!config)
goto err;
@@ -687,13 +707,9 @@ struct regmap *__regmap_init(struct device *dev,
goto err;
}
- if (config->name) {
- map->name = kstrdup_const(config->name, GFP_KERNEL);
- if (!map->name) {
- ret = -ENOMEM;
- goto err_map;
- }
- }
+ ret = regmap_set_name(map, config);
+ if (ret)
+ goto err_map;
if (config->disable_locking) {
map->lock = map->unlock = regmap_lock_unlock_none;
@@ -1140,7 +1156,7 @@ struct regmap *__regmap_init(struct device *dev,
if (ret != 0)
goto err_regcache;
} else {
- regmap_debugfs_init(map, config->name);
+ regmap_debugfs_init(map);
}
return map;
@@ -1300,6 +1316,8 @@ EXPORT_SYMBOL_GPL(regmap_field_free);
*/
int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config)
{
+ int ret;
+
regcache_exit(map);
regmap_debugfs_exit(map);
@@ -1312,7 +1330,11 @@ int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config)
map->readable_noinc_reg = config->readable_noinc_reg;
map->cache_type = config->cache_type;
- regmap_debugfs_init(map, config->name);
+ ret = regmap_set_name(map, config);
+ if (ret)
+ return ret;
+
+ regmap_debugfs_init(map);
map->cache_bypass = false;
map->cache_only = false;
--
2.11.0
^ permalink raw reply related [flat|nested] 5+ messages in thread
* Re: [PATCH v2] regmap: debugfs: Fix handling of name string for debugfs init delays
2020-09-17 12:08 [PATCH v2] regmap: debugfs: Fix handling of name string for debugfs init delays Charles Keepax
@ 2020-09-17 18:58 ` Mark Brown
2020-09-18 8:36 ` Dan Carpenter
1 sibling, 0 replies; 5+ messages in thread
From: Mark Brown @ 2020-09-17 18:58 UTC (permalink / raw)
To: Charles Keepax; +Cc: patches, linux-kernel
On Thu, 17 Sep 2020 13:08:28 +0100, Charles Keepax wrote:
> In regmap_debugfs_init the initialisation of the debugfs is delayed
> if the root node isn't ready yet. Most callers of regmap_debugfs_init
> pass the name from the regmap_config, which is considered temporary
> ie. may be unallocated after the regmap_init call returns. This leads
> to a potential use after free, where config->name has been freed by
> the time it is used in regmap_debugfs_initcall.
>
> [...]
Applied to
https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git for-next
Thanks!
[1/1] regmap: debugfs: Fix handling of name string for debugfs init delays
commit: 94cc89eb8fa5039fcb6e3e3d50f929ddcccee095
All being well this means that it will be integrated into the linux-next
tree (usually sometime in the next 24 hours) and sent to Linus during
the next merge window (or sooner if it is a bug fix), however if
problems are discovered then the patch may be dropped or reverted.
You may get further e-mails resulting from automated or manual testing
and review of the tree, please engage with people reporting problems and
send followup patches addressing any issues that are reported if needed.
If any updates are required or you are submitting further changes they
should be sent as incremental updates against current git, existing
patches will not be replaced.
Please add any relevant lists and maintainers to the CCs when replying
to this mail.
Thanks,
Mark
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] regmap: debugfs: Fix handling of name string for debugfs init delays
2020-09-17 12:08 [PATCH v2] regmap: debugfs: Fix handling of name string for debugfs init delays Charles Keepax
@ 2020-09-18 8:36 ` Dan Carpenter
2020-09-18 8:36 ` Dan Carpenter
1 sibling, 0 replies; 5+ messages in thread
From: Dan Carpenter @ 2020-09-18 8:36 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 20332 bytes --]
Hi Charles,
url: https://github.com/0day-ci/linux/commits/Charles-Keepax/regmap-debugfs-Fix-handling-of-name-string-for-debugfs-init-delays/20200917-204117
base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git for-next
config: x86_64-randconfig-m001-20200917 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
drivers/base/regmap/regmap.c:1177 __regmap_init() error: uninitialized symbol 'ret'.
drivers/base/regmap/regmap.c:1177 __regmap_init() warn: passing zero to 'ERR_PTR'
Old smatch warnings:
drivers/base/regmap/regmap.c:1901 _regmap_raw_write() error: uninitialized symbol 'ret'.
drivers/base/regmap/regmap.c:2685 regmap_raw_read() error: uninitialized symbol 'ret'.
# https://github.com/0day-ci/linux/commit/d1cea9a7b51682f9b773cf376db0fe14656869a7
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Charles-Keepax/regmap-debugfs-Fix-handling-of-name-string-for-debugfs-init-delays/20200917-204117
git checkout d1cea9a7b51682f9b773cf376db0fe14656869a7
vim +/ret +1177 drivers/base/regmap/regmap.c
afcc00b91f1865f Xiubo Li 2015-12-03 948
b83a313bf252018 Mark Brown 2011-05-11 949 default:
8698b9364710e7b Baolin Wang 2017-11-01 950 goto err_hwlock;
"ret" not set before the gotos and is uninitialized before the very
first gotos in the function.
b83a313bf252018 Mark Brown 2011-05-11 951 }
b83a313bf252018 Mark Brown 2011-05-11 952
8a819ff8abac9ad Mark Brown 2013-03-04 953 if (val_endian == REGMAP_ENDIAN_NATIVE)
8a819ff8abac9ad Mark Brown 2013-03-04 954 map->format.parse_inplace = regmap_parse_inplace_noop;
8a819ff8abac9ad Mark Brown 2013-03-04 955
b83a313bf252018 Mark Brown 2011-05-11 956 switch (config->val_bits) {
b83a313bf252018 Mark Brown 2011-05-11 957 case 8:
b83a313bf252018 Mark Brown 2011-05-11 958 map->format.format_val = regmap_format_8;
b83a313bf252018 Mark Brown 2011-05-11 959 map->format.parse_val = regmap_parse_8;
8a819ff8abac9ad Mark Brown 2013-03-04 960 map->format.parse_inplace = regmap_parse_inplace_noop;
b83a313bf252018 Mark Brown 2011-05-11 961 break;
b83a313bf252018 Mark Brown 2011-05-11 962 case 16:
141eba2e006dd81 Stephen Warren 2012-05-24 963 switch (val_endian) {
141eba2e006dd81 Stephen Warren 2012-05-24 964 case REGMAP_ENDIAN_BIG:
141eba2e006dd81 Stephen Warren 2012-05-24 965 map->format.format_val = regmap_format_16_be;
141eba2e006dd81 Stephen Warren 2012-05-24 966 map->format.parse_val = regmap_parse_16_be;
8a819ff8abac9ad Mark Brown 2013-03-04 967 map->format.parse_inplace = regmap_parse_16_be_inplace;
141eba2e006dd81 Stephen Warren 2012-05-24 968 break;
4aa8c0694c731e0 Xiubo Li 2014-04-02 969 case REGMAP_ENDIAN_LITTLE:
4aa8c0694c731e0 Xiubo Li 2014-04-02 970 map->format.format_val = regmap_format_16_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 971 map->format.parse_val = regmap_parse_16_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 972 map->format.parse_inplace = regmap_parse_16_le_inplace;
4aa8c0694c731e0 Xiubo Li 2014-04-02 973 break;
141eba2e006dd81 Stephen Warren 2012-05-24 974 case REGMAP_ENDIAN_NATIVE:
141eba2e006dd81 Stephen Warren 2012-05-24 975 map->format.format_val = regmap_format_16_native;
141eba2e006dd81 Stephen Warren 2012-05-24 976 map->format.parse_val = regmap_parse_16_native;
141eba2e006dd81 Stephen Warren 2012-05-24 977 break;
141eba2e006dd81 Stephen Warren 2012-05-24 978 default:
8698b9364710e7b Baolin Wang 2017-11-01 979 goto err_hwlock;
141eba2e006dd81 Stephen Warren 2012-05-24 980 }
b83a313bf252018 Mark Brown 2011-05-11 981 break;
ea279fc5619e254 Marc Reilly 2012-03-16 982 case 24:
141eba2e006dd81 Stephen Warren 2012-05-24 983 if (val_endian != REGMAP_ENDIAN_BIG)
8698b9364710e7b Baolin Wang 2017-11-01 984 goto err_hwlock;
ea279fc5619e254 Marc Reilly 2012-03-16 985 map->format.format_val = regmap_format_24;
ea279fc5619e254 Marc Reilly 2012-03-16 986 map->format.parse_val = regmap_parse_24;
ea279fc5619e254 Marc Reilly 2012-03-16 987 break;
7d5e525b9ceda0e Mark Brown 2012-02-17 988 case 32:
141eba2e006dd81 Stephen Warren 2012-05-24 989 switch (val_endian) {
141eba2e006dd81 Stephen Warren 2012-05-24 990 case REGMAP_ENDIAN_BIG:
141eba2e006dd81 Stephen Warren 2012-05-24 991 map->format.format_val = regmap_format_32_be;
141eba2e006dd81 Stephen Warren 2012-05-24 992 map->format.parse_val = regmap_parse_32_be;
8a819ff8abac9ad Mark Brown 2013-03-04 993 map->format.parse_inplace = regmap_parse_32_be_inplace;
141eba2e006dd81 Stephen Warren 2012-05-24 994 break;
4aa8c0694c731e0 Xiubo Li 2014-04-02 995 case REGMAP_ENDIAN_LITTLE:
4aa8c0694c731e0 Xiubo Li 2014-04-02 996 map->format.format_val = regmap_format_32_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 997 map->format.parse_val = regmap_parse_32_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 998 map->format.parse_inplace = regmap_parse_32_le_inplace;
4aa8c0694c731e0 Xiubo Li 2014-04-02 999 break;
141eba2e006dd81 Stephen Warren 2012-05-24 1000 case REGMAP_ENDIAN_NATIVE:
141eba2e006dd81 Stephen Warren 2012-05-24 1001 map->format.format_val = regmap_format_32_native;
141eba2e006dd81 Stephen Warren 2012-05-24 1002 map->format.parse_val = regmap_parse_32_native;
141eba2e006dd81 Stephen Warren 2012-05-24 1003 break;
141eba2e006dd81 Stephen Warren 2012-05-24 1004 default:
8698b9364710e7b Baolin Wang 2017-11-01 1005 goto err_hwlock;
141eba2e006dd81 Stephen Warren 2012-05-24 1006 }
7d5e525b9ceda0e Mark Brown 2012-02-17 1007 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1008 #ifdef CONFIG_64BIT
782035ea94dc402 Dan Carpenter 2015-12-12 1009 case 64:
afcc00b91f1865f Xiubo Li 2015-12-03 1010 switch (val_endian) {
afcc00b91f1865f Xiubo Li 2015-12-03 1011 case REGMAP_ENDIAN_BIG:
afcc00b91f1865f Xiubo Li 2015-12-03 1012 map->format.format_val = regmap_format_64_be;
afcc00b91f1865f Xiubo Li 2015-12-03 1013 map->format.parse_val = regmap_parse_64_be;
afcc00b91f1865f Xiubo Li 2015-12-03 1014 map->format.parse_inplace = regmap_parse_64_be_inplace;
afcc00b91f1865f Xiubo Li 2015-12-03 1015 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1016 case REGMAP_ENDIAN_LITTLE:
afcc00b91f1865f Xiubo Li 2015-12-03 1017 map->format.format_val = regmap_format_64_le;
afcc00b91f1865f Xiubo Li 2015-12-03 1018 map->format.parse_val = regmap_parse_64_le;
afcc00b91f1865f Xiubo Li 2015-12-03 1019 map->format.parse_inplace = regmap_parse_64_le_inplace;
afcc00b91f1865f Xiubo Li 2015-12-03 1020 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1021 case REGMAP_ENDIAN_NATIVE:
afcc00b91f1865f Xiubo Li 2015-12-03 1022 map->format.format_val = regmap_format_64_native;
afcc00b91f1865f Xiubo Li 2015-12-03 1023 map->format.parse_val = regmap_parse_64_native;
afcc00b91f1865f Xiubo Li 2015-12-03 1024 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1025 default:
8698b9364710e7b Baolin Wang 2017-11-01 1026 goto err_hwlock;
afcc00b91f1865f Xiubo Li 2015-12-03 1027 }
afcc00b91f1865f Xiubo Li 2015-12-03 1028 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1029 #endif
b83a313bf252018 Mark Brown 2011-05-11 1030 }
b83a313bf252018 Mark Brown 2011-05-11 1031
141eba2e006dd81 Stephen Warren 2012-05-24 1032 if (map->format.format_write) {
141eba2e006dd81 Stephen Warren 2012-05-24 1033 if ((reg_endian != REGMAP_ENDIAN_BIG) ||
141eba2e006dd81 Stephen Warren 2012-05-24 1034 (val_endian != REGMAP_ENDIAN_BIG))
8698b9364710e7b Baolin Wang 2017-11-01 1035 goto err_hwlock;
67921a1a6660d32 Markus Pargmann 2015-08-21 1036 map->use_single_write = true;
141eba2e006dd81 Stephen Warren 2012-05-24 1037 }
7a6476143270d94 Mark Brown 2012-04-30 1038
b83a313bf252018 Mark Brown 2011-05-11 1039 if (!map->format.format_write &&
b83a313bf252018 Mark Brown 2011-05-11 1040 !(map->format.format_reg && map->format.format_val))
8698b9364710e7b Baolin Wang 2017-11-01 1041 goto err_hwlock;
b83a313bf252018 Mark Brown 2011-05-11 1042
82159ba8e6ef8c3 Mark Brown 2012-01-18 1043 map->work_buf = kzalloc(map->format.buf_size, GFP_KERNEL);
b83a313bf252018 Mark Brown 2011-05-11 1044 if (map->work_buf == NULL) {
b83a313bf252018 Mark Brown 2011-05-11 1045 ret = -ENOMEM;
8698b9364710e7b Baolin Wang 2017-11-01 1046 goto err_hwlock;
b83a313bf252018 Mark Brown 2011-05-11 1047 }
b83a313bf252018 Mark Brown 2011-05-11 1048
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1049 if (map->format.format_write) {
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1050 map->defer_caching = false;
07c320dc31d757b Andrey Smirnov 2013-01-12 1051 map->reg_write = _regmap_bus_formatted_write;
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1052 } else if (map->format.format_val) {
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1053 map->defer_caching = true;
07c320dc31d757b Andrey Smirnov 2013-01-12 1054 map->reg_write = _regmap_bus_raw_write;
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1055 }
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1056
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1057 skip_format_initialization:
07c320dc31d757b Andrey Smirnov 2013-01-12 1058
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1059 map->range_tree = RB_ROOT;
e3549cd01347ef2 Mark Brown 2012-10-02 1060 for (i = 0; i < config->num_ranges; i++) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1061 const struct regmap_range_cfg *range_cfg = &config->ranges[i];
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1062 struct regmap_range_node *new;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1063
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1064 /* Sanity check */
061adc064adbbdd Mark Brown 2012-10-03 1065 if (range_cfg->range_max < range_cfg->range_min) {
061adc064adbbdd Mark Brown 2012-10-03 1066 dev_err(map->dev, "Invalid range %d: %d < %d\n", i,
061adc064adbbdd Mark Brown 2012-10-03 1067 range_cfg->range_max, range_cfg->range_min);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1068 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1069 }
061adc064adbbdd Mark Brown 2012-10-03 1070
061adc064adbbdd Mark Brown 2012-10-03 1071 if (range_cfg->range_max > map->max_register) {
061adc064adbbdd Mark Brown 2012-10-03 1072 dev_err(map->dev, "Invalid range %d: %d > %d\n", i,
061adc064adbbdd Mark Brown 2012-10-03 1073 range_cfg->range_max, map->max_register);
061adc064adbbdd Mark Brown 2012-10-03 1074 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1075 }
061adc064adbbdd Mark Brown 2012-10-03 1076
061adc064adbbdd Mark Brown 2012-10-03 1077 if (range_cfg->selector_reg > map->max_register) {
061adc064adbbdd Mark Brown 2012-10-03 1078 dev_err(map->dev,
061adc064adbbdd Mark Brown 2012-10-03 1079 "Invalid range %d: selector out of map\n", i);
061adc064adbbdd Mark Brown 2012-10-03 1080 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1081 }
061adc064adbbdd Mark Brown 2012-10-03 1082
061adc064adbbdd Mark Brown 2012-10-03 1083 if (range_cfg->window_len == 0) {
061adc064adbbdd Mark Brown 2012-10-03 1084 dev_err(map->dev, "Invalid range %d: window_len 0\n",
061adc064adbbdd Mark Brown 2012-10-03 1085 i);
061adc064adbbdd Mark Brown 2012-10-03 1086 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1087 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1088
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1089 /* Make sure, that this register range has no selector
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1090 or data window within its boundary */
e3549cd01347ef2 Mark Brown 2012-10-02 1091 for (j = 0; j < config->num_ranges; j++) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1092 unsigned sel_reg = config->ranges[j].selector_reg;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1093 unsigned win_min = config->ranges[j].window_start;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1094 unsigned win_max = win_min +
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1095 config->ranges[j].window_len - 1;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1096
f161d22081e9b81 Philipp Zabel 2013-07-23 1097 /* Allow data window inside its own virtual range */
f161d22081e9b81 Philipp Zabel 2013-07-23 1098 if (j == i)
f161d22081e9b81 Philipp Zabel 2013-07-23 1099 continue;
f161d22081e9b81 Philipp Zabel 2013-07-23 1100
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1101 if (range_cfg->range_min <= sel_reg &&
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1102 sel_reg <= range_cfg->range_max) {
061adc064adbbdd Mark Brown 2012-10-03 1103 dev_err(map->dev,
061adc064adbbdd Mark Brown 2012-10-03 1104 "Range %d: selector for %d in window\n",
061adc064adbbdd Mark Brown 2012-10-03 1105 i, j);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1106 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1107 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1108
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1109 if (!(win_max < range_cfg->range_min ||
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1110 win_min > range_cfg->range_max)) {
061adc064adbbdd Mark Brown 2012-10-03 1111 dev_err(map->dev,
061adc064adbbdd Mark Brown 2012-10-03 1112 "Range %d: window for %d in window\n",
061adc064adbbdd Mark Brown 2012-10-03 1113 i, j);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1114 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1115 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1116 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1117
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1118 new = kzalloc(sizeof(*new), GFP_KERNEL);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1119 if (new == NULL) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1120 ret = -ENOMEM;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1121 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1122 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1123
4b020b3f9ba2af8 Mark Brown 2012-10-03 1124 new->map = map;
d058bb49618482f Mark Brown 2012-10-03 1125 new->name = range_cfg->name;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1126 new->range_min = range_cfg->range_min;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1127 new->range_max = range_cfg->range_max;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1128 new->selector_reg = range_cfg->selector_reg;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1129 new->selector_mask = range_cfg->selector_mask;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1130 new->selector_shift = range_cfg->selector_shift;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1131 new->window_start = range_cfg->window_start;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1132 new->window_len = range_cfg->window_len;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1133
53e87f88b14c011 Nenghua Cao 2014-02-21 1134 if (!_regmap_range_add(map, new)) {
061adc064adbbdd Mark Brown 2012-10-03 1135 dev_err(map->dev, "Failed to add range %d\n", i);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1136 kfree(new);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1137 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1138 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1139
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1140 if (map->selector_work_buf == NULL) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1141 map->selector_work_buf =
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1142 kzalloc(map->format.buf_size, GFP_KERNEL);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1143 if (map->selector_work_buf == NULL) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1144 ret = -ENOMEM;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1145 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1146 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1147 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1148 }
052d2cd123e7e36 Mark Brown 2011-11-21 1149
e5e3b8abeda1cf4 Lars-Peter Clausen 2011-11-16 1150 ret = regcache_init(map, config);
0ff3e62ff119f2b Mark Brown 2012-10-04 1151 if (ret != 0)
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1152 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1153
a7a037c837cb0f9 Daeseok Youn 2014-04-01 1154 if (dev) {
6cfec04bcc05a82 Michal Simek 2014-02-10 1155 ret = regmap_attach_dev(dev, map, config);
6cfec04bcc05a82 Michal Simek 2014-02-10 1156 if (ret != 0)
6cfec04bcc05a82 Michal Simek 2014-02-10 1157 goto err_regcache;
9b947a13e7f6017 David Lechner 2018-02-19 1158 } else {
d1cea9a7b51682f Charles Keepax 2020-09-17 1159 regmap_debugfs_init(map);
a7a037c837cb0f9 Daeseok Youn 2014-04-01 1160 }
72b39f6f2b5a6b0 Mark Brown 2012-05-08 1161
b83a313bf252018 Mark Brown 2011-05-11 1162 return map;
b83a313bf252018 Mark Brown 2011-05-11 1163
6cfec04bcc05a82 Michal Simek 2014-02-10 1164 err_regcache:
72b39f6f2b5a6b0 Mark Brown 2012-05-08 1165 regcache_exit(map);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1166 err_range:
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1167 regmap_range_exit(map);
58072cbfc522c25 Lars-Peter Clausen 2011-11-10 1168 kfree(map->work_buf);
8698b9364710e7b Baolin Wang 2017-11-01 1169 err_hwlock:
a1a68fcaf165a6e Baolin Wang 2017-11-20 1170 if (map->hwlock)
8698b9364710e7b Baolin Wang 2017-11-01 1171 hwspin_lock_free(map->hwlock);
8253bb3f82554ce Bartosz Golaszewski 2017-12-13 1172 err_name:
8253bb3f82554ce Bartosz Golaszewski 2017-12-13 1173 kfree_const(map->name);
b83a313bf252018 Mark Brown 2011-05-11 1174 err_map:
b83a313bf252018 Mark Brown 2011-05-11 1175 kfree(map);
b83a313bf252018 Mark Brown 2011-05-11 1176 err:
b83a313bf252018 Mark Brown 2011-05-11 @1177 return ERR_PTR(ret);
^^^^^^^^^^^^^^^^^^^
Leads to an Oops in the caller.
b83a313bf252018 Mark Brown 2011-05-11 1178 }
3cfe7a74d42b7e3 Nicolas Boichat 2015-07-08 1179 EXPORT_SYMBOL_GPL(__regmap_init);
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30036 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] regmap: debugfs: Fix handling of name string for debugfs init delays
@ 2020-09-18 8:36 ` Dan Carpenter
0 siblings, 0 replies; 5+ messages in thread
From: Dan Carpenter @ 2020-09-18 8:36 UTC (permalink / raw)
To: kbuild-all
[-- Attachment #1: Type: text/plain, Size: 20332 bytes --]
Hi Charles,
url: https://github.com/0day-ci/linux/commits/Charles-Keepax/regmap-debugfs-Fix-handling-of-name-string-for-debugfs-init-delays/20200917-204117
base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git for-next
config: x86_64-randconfig-m001-20200917 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
drivers/base/regmap/regmap.c:1177 __regmap_init() error: uninitialized symbol 'ret'.
drivers/base/regmap/regmap.c:1177 __regmap_init() warn: passing zero to 'ERR_PTR'
Old smatch warnings:
drivers/base/regmap/regmap.c:1901 _regmap_raw_write() error: uninitialized symbol 'ret'.
drivers/base/regmap/regmap.c:2685 regmap_raw_read() error: uninitialized symbol 'ret'.
# https://github.com/0day-ci/linux/commit/d1cea9a7b51682f9b773cf376db0fe14656869a7
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Charles-Keepax/regmap-debugfs-Fix-handling-of-name-string-for-debugfs-init-delays/20200917-204117
git checkout d1cea9a7b51682f9b773cf376db0fe14656869a7
vim +/ret +1177 drivers/base/regmap/regmap.c
afcc00b91f1865f Xiubo Li 2015-12-03 948
b83a313bf252018 Mark Brown 2011-05-11 949 default:
8698b9364710e7b Baolin Wang 2017-11-01 950 goto err_hwlock;
"ret" not set before the gotos and is uninitialized before the very
first gotos in the function.
b83a313bf252018 Mark Brown 2011-05-11 951 }
b83a313bf252018 Mark Brown 2011-05-11 952
8a819ff8abac9ad Mark Brown 2013-03-04 953 if (val_endian == REGMAP_ENDIAN_NATIVE)
8a819ff8abac9ad Mark Brown 2013-03-04 954 map->format.parse_inplace = regmap_parse_inplace_noop;
8a819ff8abac9ad Mark Brown 2013-03-04 955
b83a313bf252018 Mark Brown 2011-05-11 956 switch (config->val_bits) {
b83a313bf252018 Mark Brown 2011-05-11 957 case 8:
b83a313bf252018 Mark Brown 2011-05-11 958 map->format.format_val = regmap_format_8;
b83a313bf252018 Mark Brown 2011-05-11 959 map->format.parse_val = regmap_parse_8;
8a819ff8abac9ad Mark Brown 2013-03-04 960 map->format.parse_inplace = regmap_parse_inplace_noop;
b83a313bf252018 Mark Brown 2011-05-11 961 break;
b83a313bf252018 Mark Brown 2011-05-11 962 case 16:
141eba2e006dd81 Stephen Warren 2012-05-24 963 switch (val_endian) {
141eba2e006dd81 Stephen Warren 2012-05-24 964 case REGMAP_ENDIAN_BIG:
141eba2e006dd81 Stephen Warren 2012-05-24 965 map->format.format_val = regmap_format_16_be;
141eba2e006dd81 Stephen Warren 2012-05-24 966 map->format.parse_val = regmap_parse_16_be;
8a819ff8abac9ad Mark Brown 2013-03-04 967 map->format.parse_inplace = regmap_parse_16_be_inplace;
141eba2e006dd81 Stephen Warren 2012-05-24 968 break;
4aa8c0694c731e0 Xiubo Li 2014-04-02 969 case REGMAP_ENDIAN_LITTLE:
4aa8c0694c731e0 Xiubo Li 2014-04-02 970 map->format.format_val = regmap_format_16_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 971 map->format.parse_val = regmap_parse_16_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 972 map->format.parse_inplace = regmap_parse_16_le_inplace;
4aa8c0694c731e0 Xiubo Li 2014-04-02 973 break;
141eba2e006dd81 Stephen Warren 2012-05-24 974 case REGMAP_ENDIAN_NATIVE:
141eba2e006dd81 Stephen Warren 2012-05-24 975 map->format.format_val = regmap_format_16_native;
141eba2e006dd81 Stephen Warren 2012-05-24 976 map->format.parse_val = regmap_parse_16_native;
141eba2e006dd81 Stephen Warren 2012-05-24 977 break;
141eba2e006dd81 Stephen Warren 2012-05-24 978 default:
8698b9364710e7b Baolin Wang 2017-11-01 979 goto err_hwlock;
141eba2e006dd81 Stephen Warren 2012-05-24 980 }
b83a313bf252018 Mark Brown 2011-05-11 981 break;
ea279fc5619e254 Marc Reilly 2012-03-16 982 case 24:
141eba2e006dd81 Stephen Warren 2012-05-24 983 if (val_endian != REGMAP_ENDIAN_BIG)
8698b9364710e7b Baolin Wang 2017-11-01 984 goto err_hwlock;
ea279fc5619e254 Marc Reilly 2012-03-16 985 map->format.format_val = regmap_format_24;
ea279fc5619e254 Marc Reilly 2012-03-16 986 map->format.parse_val = regmap_parse_24;
ea279fc5619e254 Marc Reilly 2012-03-16 987 break;
7d5e525b9ceda0e Mark Brown 2012-02-17 988 case 32:
141eba2e006dd81 Stephen Warren 2012-05-24 989 switch (val_endian) {
141eba2e006dd81 Stephen Warren 2012-05-24 990 case REGMAP_ENDIAN_BIG:
141eba2e006dd81 Stephen Warren 2012-05-24 991 map->format.format_val = regmap_format_32_be;
141eba2e006dd81 Stephen Warren 2012-05-24 992 map->format.parse_val = regmap_parse_32_be;
8a819ff8abac9ad Mark Brown 2013-03-04 993 map->format.parse_inplace = regmap_parse_32_be_inplace;
141eba2e006dd81 Stephen Warren 2012-05-24 994 break;
4aa8c0694c731e0 Xiubo Li 2014-04-02 995 case REGMAP_ENDIAN_LITTLE:
4aa8c0694c731e0 Xiubo Li 2014-04-02 996 map->format.format_val = regmap_format_32_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 997 map->format.parse_val = regmap_parse_32_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 998 map->format.parse_inplace = regmap_parse_32_le_inplace;
4aa8c0694c731e0 Xiubo Li 2014-04-02 999 break;
141eba2e006dd81 Stephen Warren 2012-05-24 1000 case REGMAP_ENDIAN_NATIVE:
141eba2e006dd81 Stephen Warren 2012-05-24 1001 map->format.format_val = regmap_format_32_native;
141eba2e006dd81 Stephen Warren 2012-05-24 1002 map->format.parse_val = regmap_parse_32_native;
141eba2e006dd81 Stephen Warren 2012-05-24 1003 break;
141eba2e006dd81 Stephen Warren 2012-05-24 1004 default:
8698b9364710e7b Baolin Wang 2017-11-01 1005 goto err_hwlock;
141eba2e006dd81 Stephen Warren 2012-05-24 1006 }
7d5e525b9ceda0e Mark Brown 2012-02-17 1007 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1008 #ifdef CONFIG_64BIT
782035ea94dc402 Dan Carpenter 2015-12-12 1009 case 64:
afcc00b91f1865f Xiubo Li 2015-12-03 1010 switch (val_endian) {
afcc00b91f1865f Xiubo Li 2015-12-03 1011 case REGMAP_ENDIAN_BIG:
afcc00b91f1865f Xiubo Li 2015-12-03 1012 map->format.format_val = regmap_format_64_be;
afcc00b91f1865f Xiubo Li 2015-12-03 1013 map->format.parse_val = regmap_parse_64_be;
afcc00b91f1865f Xiubo Li 2015-12-03 1014 map->format.parse_inplace = regmap_parse_64_be_inplace;
afcc00b91f1865f Xiubo Li 2015-12-03 1015 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1016 case REGMAP_ENDIAN_LITTLE:
afcc00b91f1865f Xiubo Li 2015-12-03 1017 map->format.format_val = regmap_format_64_le;
afcc00b91f1865f Xiubo Li 2015-12-03 1018 map->format.parse_val = regmap_parse_64_le;
afcc00b91f1865f Xiubo Li 2015-12-03 1019 map->format.parse_inplace = regmap_parse_64_le_inplace;
afcc00b91f1865f Xiubo Li 2015-12-03 1020 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1021 case REGMAP_ENDIAN_NATIVE:
afcc00b91f1865f Xiubo Li 2015-12-03 1022 map->format.format_val = regmap_format_64_native;
afcc00b91f1865f Xiubo Li 2015-12-03 1023 map->format.parse_val = regmap_parse_64_native;
afcc00b91f1865f Xiubo Li 2015-12-03 1024 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1025 default:
8698b9364710e7b Baolin Wang 2017-11-01 1026 goto err_hwlock;
afcc00b91f1865f Xiubo Li 2015-12-03 1027 }
afcc00b91f1865f Xiubo Li 2015-12-03 1028 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1029 #endif
b83a313bf252018 Mark Brown 2011-05-11 1030 }
b83a313bf252018 Mark Brown 2011-05-11 1031
141eba2e006dd81 Stephen Warren 2012-05-24 1032 if (map->format.format_write) {
141eba2e006dd81 Stephen Warren 2012-05-24 1033 if ((reg_endian != REGMAP_ENDIAN_BIG) ||
141eba2e006dd81 Stephen Warren 2012-05-24 1034 (val_endian != REGMAP_ENDIAN_BIG))
8698b9364710e7b Baolin Wang 2017-11-01 1035 goto err_hwlock;
67921a1a6660d32 Markus Pargmann 2015-08-21 1036 map->use_single_write = true;
141eba2e006dd81 Stephen Warren 2012-05-24 1037 }
7a6476143270d94 Mark Brown 2012-04-30 1038
b83a313bf252018 Mark Brown 2011-05-11 1039 if (!map->format.format_write &&
b83a313bf252018 Mark Brown 2011-05-11 1040 !(map->format.format_reg && map->format.format_val))
8698b9364710e7b Baolin Wang 2017-11-01 1041 goto err_hwlock;
b83a313bf252018 Mark Brown 2011-05-11 1042
82159ba8e6ef8c3 Mark Brown 2012-01-18 1043 map->work_buf = kzalloc(map->format.buf_size, GFP_KERNEL);
b83a313bf252018 Mark Brown 2011-05-11 1044 if (map->work_buf == NULL) {
b83a313bf252018 Mark Brown 2011-05-11 1045 ret = -ENOMEM;
8698b9364710e7b Baolin Wang 2017-11-01 1046 goto err_hwlock;
b83a313bf252018 Mark Brown 2011-05-11 1047 }
b83a313bf252018 Mark Brown 2011-05-11 1048
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1049 if (map->format.format_write) {
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1050 map->defer_caching = false;
07c320dc31d757b Andrey Smirnov 2013-01-12 1051 map->reg_write = _regmap_bus_formatted_write;
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1052 } else if (map->format.format_val) {
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1053 map->defer_caching = true;
07c320dc31d757b Andrey Smirnov 2013-01-12 1054 map->reg_write = _regmap_bus_raw_write;
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1055 }
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1056
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1057 skip_format_initialization:
07c320dc31d757b Andrey Smirnov 2013-01-12 1058
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1059 map->range_tree = RB_ROOT;
e3549cd01347ef2 Mark Brown 2012-10-02 1060 for (i = 0; i < config->num_ranges; i++) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1061 const struct regmap_range_cfg *range_cfg = &config->ranges[i];
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1062 struct regmap_range_node *new;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1063
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1064 /* Sanity check */
061adc064adbbdd Mark Brown 2012-10-03 1065 if (range_cfg->range_max < range_cfg->range_min) {
061adc064adbbdd Mark Brown 2012-10-03 1066 dev_err(map->dev, "Invalid range %d: %d < %d\n", i,
061adc064adbbdd Mark Brown 2012-10-03 1067 range_cfg->range_max, range_cfg->range_min);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1068 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1069 }
061adc064adbbdd Mark Brown 2012-10-03 1070
061adc064adbbdd Mark Brown 2012-10-03 1071 if (range_cfg->range_max > map->max_register) {
061adc064adbbdd Mark Brown 2012-10-03 1072 dev_err(map->dev, "Invalid range %d: %d > %d\n", i,
061adc064adbbdd Mark Brown 2012-10-03 1073 range_cfg->range_max, map->max_register);
061adc064adbbdd Mark Brown 2012-10-03 1074 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1075 }
061adc064adbbdd Mark Brown 2012-10-03 1076
061adc064adbbdd Mark Brown 2012-10-03 1077 if (range_cfg->selector_reg > map->max_register) {
061adc064adbbdd Mark Brown 2012-10-03 1078 dev_err(map->dev,
061adc064adbbdd Mark Brown 2012-10-03 1079 "Invalid range %d: selector out of map\n", i);
061adc064adbbdd Mark Brown 2012-10-03 1080 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1081 }
061adc064adbbdd Mark Brown 2012-10-03 1082
061adc064adbbdd Mark Brown 2012-10-03 1083 if (range_cfg->window_len == 0) {
061adc064adbbdd Mark Brown 2012-10-03 1084 dev_err(map->dev, "Invalid range %d: window_len 0\n",
061adc064adbbdd Mark Brown 2012-10-03 1085 i);
061adc064adbbdd Mark Brown 2012-10-03 1086 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1087 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1088
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1089 /* Make sure, that this register range has no selector
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1090 or data window within its boundary */
e3549cd01347ef2 Mark Brown 2012-10-02 1091 for (j = 0; j < config->num_ranges; j++) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1092 unsigned sel_reg = config->ranges[j].selector_reg;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1093 unsigned win_min = config->ranges[j].window_start;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1094 unsigned win_max = win_min +
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1095 config->ranges[j].window_len - 1;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1096
f161d22081e9b81 Philipp Zabel 2013-07-23 1097 /* Allow data window inside its own virtual range */
f161d22081e9b81 Philipp Zabel 2013-07-23 1098 if (j == i)
f161d22081e9b81 Philipp Zabel 2013-07-23 1099 continue;
f161d22081e9b81 Philipp Zabel 2013-07-23 1100
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1101 if (range_cfg->range_min <= sel_reg &&
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1102 sel_reg <= range_cfg->range_max) {
061adc064adbbdd Mark Brown 2012-10-03 1103 dev_err(map->dev,
061adc064adbbdd Mark Brown 2012-10-03 1104 "Range %d: selector for %d in window\n",
061adc064adbbdd Mark Brown 2012-10-03 1105 i, j);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1106 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1107 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1108
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1109 if (!(win_max < range_cfg->range_min ||
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1110 win_min > range_cfg->range_max)) {
061adc064adbbdd Mark Brown 2012-10-03 1111 dev_err(map->dev,
061adc064adbbdd Mark Brown 2012-10-03 1112 "Range %d: window for %d in window\n",
061adc064adbbdd Mark Brown 2012-10-03 1113 i, j);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1114 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1115 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1116 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1117
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1118 new = kzalloc(sizeof(*new), GFP_KERNEL);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1119 if (new == NULL) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1120 ret = -ENOMEM;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1121 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1122 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1123
4b020b3f9ba2af8 Mark Brown 2012-10-03 1124 new->map = map;
d058bb49618482f Mark Brown 2012-10-03 1125 new->name = range_cfg->name;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1126 new->range_min = range_cfg->range_min;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1127 new->range_max = range_cfg->range_max;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1128 new->selector_reg = range_cfg->selector_reg;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1129 new->selector_mask = range_cfg->selector_mask;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1130 new->selector_shift = range_cfg->selector_shift;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1131 new->window_start = range_cfg->window_start;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1132 new->window_len = range_cfg->window_len;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1133
53e87f88b14c011 Nenghua Cao 2014-02-21 1134 if (!_regmap_range_add(map, new)) {
061adc064adbbdd Mark Brown 2012-10-03 1135 dev_err(map->dev, "Failed to add range %d\n", i);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1136 kfree(new);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1137 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1138 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1139
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1140 if (map->selector_work_buf == NULL) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1141 map->selector_work_buf =
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1142 kzalloc(map->format.buf_size, GFP_KERNEL);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1143 if (map->selector_work_buf == NULL) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1144 ret = -ENOMEM;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1145 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1146 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1147 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1148 }
052d2cd123e7e36 Mark Brown 2011-11-21 1149
e5e3b8abeda1cf4 Lars-Peter Clausen 2011-11-16 1150 ret = regcache_init(map, config);
0ff3e62ff119f2b Mark Brown 2012-10-04 1151 if (ret != 0)
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1152 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1153
a7a037c837cb0f9 Daeseok Youn 2014-04-01 1154 if (dev) {
6cfec04bcc05a82 Michal Simek 2014-02-10 1155 ret = regmap_attach_dev(dev, map, config);
6cfec04bcc05a82 Michal Simek 2014-02-10 1156 if (ret != 0)
6cfec04bcc05a82 Michal Simek 2014-02-10 1157 goto err_regcache;
9b947a13e7f6017 David Lechner 2018-02-19 1158 } else {
d1cea9a7b51682f Charles Keepax 2020-09-17 1159 regmap_debugfs_init(map);
a7a037c837cb0f9 Daeseok Youn 2014-04-01 1160 }
72b39f6f2b5a6b0 Mark Brown 2012-05-08 1161
b83a313bf252018 Mark Brown 2011-05-11 1162 return map;
b83a313bf252018 Mark Brown 2011-05-11 1163
6cfec04bcc05a82 Michal Simek 2014-02-10 1164 err_regcache:
72b39f6f2b5a6b0 Mark Brown 2012-05-08 1165 regcache_exit(map);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1166 err_range:
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1167 regmap_range_exit(map);
58072cbfc522c25 Lars-Peter Clausen 2011-11-10 1168 kfree(map->work_buf);
8698b9364710e7b Baolin Wang 2017-11-01 1169 err_hwlock:
a1a68fcaf165a6e Baolin Wang 2017-11-20 1170 if (map->hwlock)
8698b9364710e7b Baolin Wang 2017-11-01 1171 hwspin_lock_free(map->hwlock);
8253bb3f82554ce Bartosz Golaszewski 2017-12-13 1172 err_name:
8253bb3f82554ce Bartosz Golaszewski 2017-12-13 1173 kfree_const(map->name);
b83a313bf252018 Mark Brown 2011-05-11 1174 err_map:
b83a313bf252018 Mark Brown 2011-05-11 1175 kfree(map);
b83a313bf252018 Mark Brown 2011-05-11 1176 err:
b83a313bf252018 Mark Brown 2011-05-11 @1177 return ERR_PTR(ret);
^^^^^^^^^^^^^^^^^^^
Leads to an Oops in the caller.
b83a313bf252018 Mark Brown 2011-05-11 1178 }
3cfe7a74d42b7e3 Nicolas Boichat 2015-07-08 1179 EXPORT_SYMBOL_GPL(__regmap_init);
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30036 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: [PATCH v2] regmap: debugfs: Fix handling of name string for debugfs init delays
@ 2020-09-17 19:04 kernel test robot
0 siblings, 0 replies; 5+ messages in thread
From: kernel test robot @ 2020-09-17 19:04 UTC (permalink / raw)
To: kbuild
[-- Attachment #1: Type: text/plain, Size: 20827 bytes --]
CC: kbuild-all(a)lists.01.org
In-Reply-To: <20200917120828.12987-1-ckeepax@opensource.cirrus.com>
References: <20200917120828.12987-1-ckeepax@opensource.cirrus.com>
TO: Charles Keepax <ckeepax@opensource.cirrus.com>
Hi Charles,
I love your patch! Perhaps something to improve:
[auto build test WARNING on regmap/for-next]
[also build test WARNING on linux/master linus/master v5.9-rc5 next-20200917]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]
url: https://github.com/0day-ci/linux/commits/Charles-Keepax/regmap-debugfs-Fix-handling-of-name-string-for-debugfs-init-delays/20200917-204117
base: https://git.kernel.org/pub/scm/linux/kernel/git/broonie/regmap.git for-next
:::::: branch date: 6 hours ago
:::::: commit date: 6 hours ago
config: x86_64-randconfig-m001-20200917 (attached as .config)
compiler: gcc-9 (Debian 9.3.0-15) 9.3.0
If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@intel.com>
Reported-by: Dan Carpenter <dan.carpenter@oracle.com>
New smatch warnings:
drivers/base/regmap/regmap.c:1177 __regmap_init() error: uninitialized symbol 'ret'.
drivers/base/regmap/regmap.c:1177 __regmap_init() warn: passing zero to 'ERR_PTR'
Old smatch warnings:
drivers/base/regmap/regmap.c:1901 _regmap_raw_write() error: uninitialized symbol 'ret'.
drivers/base/regmap/regmap.c:2685 regmap_raw_read() error: uninitialized symbol 'ret'.
# https://github.com/0day-ci/linux/commit/d1cea9a7b51682f9b773cf376db0fe14656869a7
git remote add linux-review https://github.com/0day-ci/linux
git fetch --no-tags linux-review Charles-Keepax/regmap-debugfs-Fix-handling-of-name-string-for-debugfs-init-delays/20200917-204117
git checkout d1cea9a7b51682f9b773cf376db0fe14656869a7
vim +/ret +1177 drivers/base/regmap/regmap.c
afcc00b91f1865f Xiubo Li 2015-12-03 948
b83a313bf252018 Mark Brown 2011-05-11 949 default:
8698b9364710e7b Baolin Wang 2017-11-01 950 goto err_hwlock;
b83a313bf252018 Mark Brown 2011-05-11 951 }
b83a313bf252018 Mark Brown 2011-05-11 952
8a819ff8abac9ad Mark Brown 2013-03-04 953 if (val_endian == REGMAP_ENDIAN_NATIVE)
8a819ff8abac9ad Mark Brown 2013-03-04 954 map->format.parse_inplace = regmap_parse_inplace_noop;
8a819ff8abac9ad Mark Brown 2013-03-04 955
b83a313bf252018 Mark Brown 2011-05-11 956 switch (config->val_bits) {
b83a313bf252018 Mark Brown 2011-05-11 957 case 8:
b83a313bf252018 Mark Brown 2011-05-11 958 map->format.format_val = regmap_format_8;
b83a313bf252018 Mark Brown 2011-05-11 959 map->format.parse_val = regmap_parse_8;
8a819ff8abac9ad Mark Brown 2013-03-04 960 map->format.parse_inplace = regmap_parse_inplace_noop;
b83a313bf252018 Mark Brown 2011-05-11 961 break;
b83a313bf252018 Mark Brown 2011-05-11 962 case 16:
141eba2e006dd81 Stephen Warren 2012-05-24 963 switch (val_endian) {
141eba2e006dd81 Stephen Warren 2012-05-24 964 case REGMAP_ENDIAN_BIG:
141eba2e006dd81 Stephen Warren 2012-05-24 965 map->format.format_val = regmap_format_16_be;
141eba2e006dd81 Stephen Warren 2012-05-24 966 map->format.parse_val = regmap_parse_16_be;
8a819ff8abac9ad Mark Brown 2013-03-04 967 map->format.parse_inplace = regmap_parse_16_be_inplace;
141eba2e006dd81 Stephen Warren 2012-05-24 968 break;
4aa8c0694c731e0 Xiubo Li 2014-04-02 969 case REGMAP_ENDIAN_LITTLE:
4aa8c0694c731e0 Xiubo Li 2014-04-02 970 map->format.format_val = regmap_format_16_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 971 map->format.parse_val = regmap_parse_16_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 972 map->format.parse_inplace = regmap_parse_16_le_inplace;
4aa8c0694c731e0 Xiubo Li 2014-04-02 973 break;
141eba2e006dd81 Stephen Warren 2012-05-24 974 case REGMAP_ENDIAN_NATIVE:
141eba2e006dd81 Stephen Warren 2012-05-24 975 map->format.format_val = regmap_format_16_native;
141eba2e006dd81 Stephen Warren 2012-05-24 976 map->format.parse_val = regmap_parse_16_native;
141eba2e006dd81 Stephen Warren 2012-05-24 977 break;
141eba2e006dd81 Stephen Warren 2012-05-24 978 default:
8698b9364710e7b Baolin Wang 2017-11-01 979 goto err_hwlock;
141eba2e006dd81 Stephen Warren 2012-05-24 980 }
b83a313bf252018 Mark Brown 2011-05-11 981 break;
ea279fc5619e254 Marc Reilly 2012-03-16 982 case 24:
141eba2e006dd81 Stephen Warren 2012-05-24 983 if (val_endian != REGMAP_ENDIAN_BIG)
8698b9364710e7b Baolin Wang 2017-11-01 984 goto err_hwlock;
ea279fc5619e254 Marc Reilly 2012-03-16 985 map->format.format_val = regmap_format_24;
ea279fc5619e254 Marc Reilly 2012-03-16 986 map->format.parse_val = regmap_parse_24;
ea279fc5619e254 Marc Reilly 2012-03-16 987 break;
7d5e525b9ceda0e Mark Brown 2012-02-17 988 case 32:
141eba2e006dd81 Stephen Warren 2012-05-24 989 switch (val_endian) {
141eba2e006dd81 Stephen Warren 2012-05-24 990 case REGMAP_ENDIAN_BIG:
141eba2e006dd81 Stephen Warren 2012-05-24 991 map->format.format_val = regmap_format_32_be;
141eba2e006dd81 Stephen Warren 2012-05-24 992 map->format.parse_val = regmap_parse_32_be;
8a819ff8abac9ad Mark Brown 2013-03-04 993 map->format.parse_inplace = regmap_parse_32_be_inplace;
141eba2e006dd81 Stephen Warren 2012-05-24 994 break;
4aa8c0694c731e0 Xiubo Li 2014-04-02 995 case REGMAP_ENDIAN_LITTLE:
4aa8c0694c731e0 Xiubo Li 2014-04-02 996 map->format.format_val = regmap_format_32_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 997 map->format.parse_val = regmap_parse_32_le;
4aa8c0694c731e0 Xiubo Li 2014-04-02 998 map->format.parse_inplace = regmap_parse_32_le_inplace;
4aa8c0694c731e0 Xiubo Li 2014-04-02 999 break;
141eba2e006dd81 Stephen Warren 2012-05-24 1000 case REGMAP_ENDIAN_NATIVE:
141eba2e006dd81 Stephen Warren 2012-05-24 1001 map->format.format_val = regmap_format_32_native;
141eba2e006dd81 Stephen Warren 2012-05-24 1002 map->format.parse_val = regmap_parse_32_native;
141eba2e006dd81 Stephen Warren 2012-05-24 1003 break;
141eba2e006dd81 Stephen Warren 2012-05-24 1004 default:
8698b9364710e7b Baolin Wang 2017-11-01 1005 goto err_hwlock;
141eba2e006dd81 Stephen Warren 2012-05-24 1006 }
7d5e525b9ceda0e Mark Brown 2012-02-17 1007 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1008 #ifdef CONFIG_64BIT
782035ea94dc402 Dan Carpenter 2015-12-12 1009 case 64:
afcc00b91f1865f Xiubo Li 2015-12-03 1010 switch (val_endian) {
afcc00b91f1865f Xiubo Li 2015-12-03 1011 case REGMAP_ENDIAN_BIG:
afcc00b91f1865f Xiubo Li 2015-12-03 1012 map->format.format_val = regmap_format_64_be;
afcc00b91f1865f Xiubo Li 2015-12-03 1013 map->format.parse_val = regmap_parse_64_be;
afcc00b91f1865f Xiubo Li 2015-12-03 1014 map->format.parse_inplace = regmap_parse_64_be_inplace;
afcc00b91f1865f Xiubo Li 2015-12-03 1015 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1016 case REGMAP_ENDIAN_LITTLE:
afcc00b91f1865f Xiubo Li 2015-12-03 1017 map->format.format_val = regmap_format_64_le;
afcc00b91f1865f Xiubo Li 2015-12-03 1018 map->format.parse_val = regmap_parse_64_le;
afcc00b91f1865f Xiubo Li 2015-12-03 1019 map->format.parse_inplace = regmap_parse_64_le_inplace;
afcc00b91f1865f Xiubo Li 2015-12-03 1020 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1021 case REGMAP_ENDIAN_NATIVE:
afcc00b91f1865f Xiubo Li 2015-12-03 1022 map->format.format_val = regmap_format_64_native;
afcc00b91f1865f Xiubo Li 2015-12-03 1023 map->format.parse_val = regmap_parse_64_native;
afcc00b91f1865f Xiubo Li 2015-12-03 1024 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1025 default:
8698b9364710e7b Baolin Wang 2017-11-01 1026 goto err_hwlock;
afcc00b91f1865f Xiubo Li 2015-12-03 1027 }
afcc00b91f1865f Xiubo Li 2015-12-03 1028 break;
afcc00b91f1865f Xiubo Li 2015-12-03 1029 #endif
b83a313bf252018 Mark Brown 2011-05-11 1030 }
b83a313bf252018 Mark Brown 2011-05-11 1031
141eba2e006dd81 Stephen Warren 2012-05-24 1032 if (map->format.format_write) {
141eba2e006dd81 Stephen Warren 2012-05-24 1033 if ((reg_endian != REGMAP_ENDIAN_BIG) ||
141eba2e006dd81 Stephen Warren 2012-05-24 1034 (val_endian != REGMAP_ENDIAN_BIG))
8698b9364710e7b Baolin Wang 2017-11-01 1035 goto err_hwlock;
67921a1a6660d32 Markus Pargmann 2015-08-21 1036 map->use_single_write = true;
141eba2e006dd81 Stephen Warren 2012-05-24 1037 }
7a6476143270d94 Mark Brown 2012-04-30 1038
b83a313bf252018 Mark Brown 2011-05-11 1039 if (!map->format.format_write &&
b83a313bf252018 Mark Brown 2011-05-11 1040 !(map->format.format_reg && map->format.format_val))
8698b9364710e7b Baolin Wang 2017-11-01 1041 goto err_hwlock;
b83a313bf252018 Mark Brown 2011-05-11 1042
82159ba8e6ef8c3 Mark Brown 2012-01-18 1043 map->work_buf = kzalloc(map->format.buf_size, GFP_KERNEL);
b83a313bf252018 Mark Brown 2011-05-11 1044 if (map->work_buf == NULL) {
b83a313bf252018 Mark Brown 2011-05-11 1045 ret = -ENOMEM;
8698b9364710e7b Baolin Wang 2017-11-01 1046 goto err_hwlock;
b83a313bf252018 Mark Brown 2011-05-11 1047 }
b83a313bf252018 Mark Brown 2011-05-11 1048
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1049 if (map->format.format_write) {
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1050 map->defer_caching = false;
07c320dc31d757b Andrey Smirnov 2013-01-12 1051 map->reg_write = _regmap_bus_formatted_write;
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1052 } else if (map->format.format_val) {
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1053 map->defer_caching = true;
07c320dc31d757b Andrey Smirnov 2013-01-12 1054 map->reg_write = _regmap_bus_raw_write;
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1055 }
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1056
d2a5884a64161b5 Andrey Smirnov 2013-01-27 1057 skip_format_initialization:
07c320dc31d757b Andrey Smirnov 2013-01-12 1058
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1059 map->range_tree = RB_ROOT;
e3549cd01347ef2 Mark Brown 2012-10-02 1060 for (i = 0; i < config->num_ranges; i++) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1061 const struct regmap_range_cfg *range_cfg = &config->ranges[i];
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1062 struct regmap_range_node *new;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1063
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1064 /* Sanity check */
061adc064adbbdd Mark Brown 2012-10-03 1065 if (range_cfg->range_max < range_cfg->range_min) {
061adc064adbbdd Mark Brown 2012-10-03 1066 dev_err(map->dev, "Invalid range %d: %d < %d\n", i,
061adc064adbbdd Mark Brown 2012-10-03 1067 range_cfg->range_max, range_cfg->range_min);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1068 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1069 }
061adc064adbbdd Mark Brown 2012-10-03 1070
061adc064adbbdd Mark Brown 2012-10-03 1071 if (range_cfg->range_max > map->max_register) {
061adc064adbbdd Mark Brown 2012-10-03 1072 dev_err(map->dev, "Invalid range %d: %d > %d\n", i,
061adc064adbbdd Mark Brown 2012-10-03 1073 range_cfg->range_max, map->max_register);
061adc064adbbdd Mark Brown 2012-10-03 1074 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1075 }
061adc064adbbdd Mark Brown 2012-10-03 1076
061adc064adbbdd Mark Brown 2012-10-03 1077 if (range_cfg->selector_reg > map->max_register) {
061adc064adbbdd Mark Brown 2012-10-03 1078 dev_err(map->dev,
061adc064adbbdd Mark Brown 2012-10-03 1079 "Invalid range %d: selector out of map\n", i);
061adc064adbbdd Mark Brown 2012-10-03 1080 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1081 }
061adc064adbbdd Mark Brown 2012-10-03 1082
061adc064adbbdd Mark Brown 2012-10-03 1083 if (range_cfg->window_len == 0) {
061adc064adbbdd Mark Brown 2012-10-03 1084 dev_err(map->dev, "Invalid range %d: window_len 0\n",
061adc064adbbdd Mark Brown 2012-10-03 1085 i);
061adc064adbbdd Mark Brown 2012-10-03 1086 goto err_range;
061adc064adbbdd Mark Brown 2012-10-03 1087 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1088
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1089 /* Make sure, that this register range has no selector
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1090 or data window within its boundary */
e3549cd01347ef2 Mark Brown 2012-10-02 1091 for (j = 0; j < config->num_ranges; j++) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1092 unsigned sel_reg = config->ranges[j].selector_reg;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1093 unsigned win_min = config->ranges[j].window_start;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1094 unsigned win_max = win_min +
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1095 config->ranges[j].window_len - 1;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1096
f161d22081e9b81 Philipp Zabel 2013-07-23 1097 /* Allow data window inside its own virtual range */
f161d22081e9b81 Philipp Zabel 2013-07-23 1098 if (j == i)
f161d22081e9b81 Philipp Zabel 2013-07-23 1099 continue;
f161d22081e9b81 Philipp Zabel 2013-07-23 1100
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1101 if (range_cfg->range_min <= sel_reg &&
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1102 sel_reg <= range_cfg->range_max) {
061adc064adbbdd Mark Brown 2012-10-03 1103 dev_err(map->dev,
061adc064adbbdd Mark Brown 2012-10-03 1104 "Range %d: selector for %d in window\n",
061adc064adbbdd Mark Brown 2012-10-03 1105 i, j);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1106 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1107 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1108
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1109 if (!(win_max < range_cfg->range_min ||
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1110 win_min > range_cfg->range_max)) {
061adc064adbbdd Mark Brown 2012-10-03 1111 dev_err(map->dev,
061adc064adbbdd Mark Brown 2012-10-03 1112 "Range %d: window for %d in window\n",
061adc064adbbdd Mark Brown 2012-10-03 1113 i, j);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1114 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1115 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1116 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1117
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1118 new = kzalloc(sizeof(*new), GFP_KERNEL);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1119 if (new == NULL) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1120 ret = -ENOMEM;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1121 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1122 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1123
4b020b3f9ba2af8 Mark Brown 2012-10-03 1124 new->map = map;
d058bb49618482f Mark Brown 2012-10-03 1125 new->name = range_cfg->name;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1126 new->range_min = range_cfg->range_min;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1127 new->range_max = range_cfg->range_max;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1128 new->selector_reg = range_cfg->selector_reg;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1129 new->selector_mask = range_cfg->selector_mask;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1130 new->selector_shift = range_cfg->selector_shift;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1131 new->window_start = range_cfg->window_start;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1132 new->window_len = range_cfg->window_len;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1133
53e87f88b14c011 Nenghua Cao 2014-02-21 1134 if (!_regmap_range_add(map, new)) {
061adc064adbbdd Mark Brown 2012-10-03 1135 dev_err(map->dev, "Failed to add range %d\n", i);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1136 kfree(new);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1137 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1138 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1139
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1140 if (map->selector_work_buf == NULL) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1141 map->selector_work_buf =
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1142 kzalloc(map->format.buf_size, GFP_KERNEL);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1143 if (map->selector_work_buf == NULL) {
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1144 ret = -ENOMEM;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1145 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1146 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1147 }
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1148 }
052d2cd123e7e36 Mark Brown 2011-11-21 1149
e5e3b8abeda1cf4 Lars-Peter Clausen 2011-11-16 1150 ret = regcache_init(map, config);
0ff3e62ff119f2b Mark Brown 2012-10-04 1151 if (ret != 0)
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1152 goto err_range;
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1153
a7a037c837cb0f9 Daeseok Youn 2014-04-01 1154 if (dev) {
6cfec04bcc05a82 Michal Simek 2014-02-10 1155 ret = regmap_attach_dev(dev, map, config);
6cfec04bcc05a82 Michal Simek 2014-02-10 1156 if (ret != 0)
6cfec04bcc05a82 Michal Simek 2014-02-10 1157 goto err_regcache;
9b947a13e7f6017 David Lechner 2018-02-19 1158 } else {
d1cea9a7b51682f Charles Keepax 2020-09-17 1159 regmap_debugfs_init(map);
a7a037c837cb0f9 Daeseok Youn 2014-04-01 1160 }
72b39f6f2b5a6b0 Mark Brown 2012-05-08 1161
b83a313bf252018 Mark Brown 2011-05-11 1162 return map;
b83a313bf252018 Mark Brown 2011-05-11 1163
6cfec04bcc05a82 Michal Simek 2014-02-10 1164 err_regcache:
72b39f6f2b5a6b0 Mark Brown 2012-05-08 1165 regcache_exit(map);
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1166 err_range:
6863ca6227598d1 Krystian Garbaciak 2012-06-15 1167 regmap_range_exit(map);
58072cbfc522c25 Lars-Peter Clausen 2011-11-10 1168 kfree(map->work_buf);
8698b9364710e7b Baolin Wang 2017-11-01 1169 err_hwlock:
a1a68fcaf165a6e Baolin Wang 2017-11-20 1170 if (map->hwlock)
8698b9364710e7b Baolin Wang 2017-11-01 1171 hwspin_lock_free(map->hwlock);
8253bb3f82554ce Bartosz Golaszewski 2017-12-13 1172 err_name:
8253bb3f82554ce Bartosz Golaszewski 2017-12-13 1173 kfree_const(map->name);
b83a313bf252018 Mark Brown 2011-05-11 1174 err_map:
b83a313bf252018 Mark Brown 2011-05-11 1175 kfree(map);
b83a313bf252018 Mark Brown 2011-05-11 1176 err:
b83a313bf252018 Mark Brown 2011-05-11 @1177 return ERR_PTR(ret);
b83a313bf252018 Mark Brown 2011-05-11 1178 }
3cfe7a74d42b7e3 Nicolas Boichat 2015-07-08 1179 EXPORT_SYMBOL_GPL(__regmap_init);
b83a313bf252018 Mark Brown 2011-05-11 1180
---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all(a)lists.01.org
[-- Attachment #2: config.gz --]
[-- Type: application/gzip, Size: 30036 bytes --]
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2020-09-18 8:36 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-09-17 12:08 [PATCH v2] regmap: debugfs: Fix handling of name string for debugfs init delays Charles Keepax
2020-09-17 18:58 ` Mark Brown
2020-09-18 8:36 ` Dan Carpenter
2020-09-18 8:36 ` Dan Carpenter
2020-09-17 19:04 kernel test robot
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.