summaryrefslogtreecommitdiff
path: root/drivers/base
diff options
context:
space:
mode:
authorMaxime Ripard <mripard@kernel.org>2026-02-23 12:09:45 +0300
committerMaxime Ripard <mripard@kernel.org>2026-02-23 12:09:45 +0300
commitc17ee635fd3a482b2ad2bf5e269755c2eae5f25e (patch)
treee3f147462d8a9fd0cf2312c8cd3c5a94da15c3e4 /drivers/base
parent803ec1faf7c1823e6e3b1f2aaa81be18528c9436 (diff)
parent6de23f81a5e08be8fbf5e8d7e9febc72a5b5f27f (diff)
downloadlinux-c17ee635fd3a482b2ad2bf5e269755c2eae5f25e.tar.xz
Merge drm/drm-fixes into drm-misc-fixes
7.0-rc1 was just released, let's merge it to kick the new release cycle. Signed-off-by: Maxime Ripard <mripard@kernel.org>
Diffstat (limited to 'drivers/base')
-rw-r--r--drivers/base/arch_topology.c11
-rw-r--r--drivers/base/attribute_container.c6
-rw-r--r--drivers/base/auxiliary.c2
-rw-r--r--drivers/base/auxiliary_sysfs.c2
-rw-r--r--drivers/base/base.h24
-rw-r--r--drivers/base/bus.c6
-rw-r--r--drivers/base/cacheinfo.c7
-rw-r--r--drivers/base/class.c6
-rw-r--r--drivers/base/component.c6
-rw-r--r--drivers/base/core.c15
-rw-r--r--drivers/base/cpu.c4
-rw-r--r--drivers/base/dd.c4
-rw-r--r--drivers/base/devcoredump.c2
-rw-r--r--drivers/base/devres.c2
-rw-r--r--drivers/base/devtmpfs.c5
-rw-r--r--drivers/base/faux.c20
-rw-r--r--drivers/base/firmware_loader/main.c8
-rw-r--r--drivers/base/firmware_loader/sysfs.c2
-rw-r--r--drivers/base/firmware_loader/sysfs_upload.c4
-rw-r--r--drivers/base/isa.c2
-rw-r--r--drivers/base/map.c6
-rw-r--r--drivers/base/memory.c4
-rw-r--r--drivers/base/node.c8
-rw-r--r--drivers/base/physical_location.c3
-rw-r--r--drivers/base/pinctrl.c2
-rw-r--r--drivers/base/power/clock_ops.c4
-rw-r--r--drivers/base/power/common.c4
-rw-r--r--drivers/base/power/main.c7
-rw-r--r--drivers/base/power/qos.c10
-rw-r--r--drivers/base/power/wakeirq.c24
-rw-r--r--drivers/base/power/wakeup.c6
-rw-r--r--drivers/base/power/wakeup_stats.c2
-rw-r--r--drivers/base/regmap/Kconfig2
-rw-r--r--drivers/base/regmap/internal.h3
-rw-r--r--drivers/base/regmap/regcache-flat.c21
-rw-r--r--drivers/base/regmap/regcache-maple.c13
-rw-r--r--drivers/base/regmap/regcache-rbtree.c4
-rw-r--r--drivers/base/regmap/regcache.c8
-rw-r--r--drivers/base/regmap/regmap-debugfs.c4
-rw-r--r--drivers/base/regmap/regmap-irq.c2
-rw-r--r--drivers/base/regmap/regmap-kunit.c95
-rw-r--r--drivers/base/regmap/regmap-mmio.c2
-rw-r--r--drivers/base/regmap/regmap-ram.c6
-rw-r--r--drivers/base/regmap/regmap-raw-ram.c6
-rw-r--r--drivers/base/regmap/regmap-spi-avmm.c2
-rw-r--r--drivers/base/regmap/regmap-spi.c2
-rw-r--r--drivers/base/regmap/regmap.c14
-rw-r--r--drivers/base/soc.c4
-rw-r--r--drivers/base/swnode.c6
-rw-r--r--drivers/base/transport_class.c16
50 files changed, 292 insertions, 136 deletions
diff --git a/drivers/base/arch_topology.c b/drivers/base/arch_topology.c
index 84ec92bff642..8c5e47c28d9a 100644
--- a/drivers/base/arch_topology.c
+++ b/drivers/base/arch_topology.c
@@ -34,7 +34,14 @@ EXPORT_PER_CPU_SYMBOL_GPL(capacity_freq_ref);
static bool supports_scale_freq_counters(const struct cpumask *cpus)
{
- return cpumask_subset(cpus, &scale_freq_counters_mask);
+ int i;
+
+ for_each_cpu(i, cpus) {
+ if (cpumask_test_cpu(i, &scale_freq_counters_mask))
+ return true;
+ }
+
+ return false;
}
bool topology_scale_freq_invariant(void)
@@ -885,7 +892,7 @@ __weak int __init parse_acpi_topology(void)
hetero_id = find_acpi_cpu_topology_hetero_id(cpu);
entry = xa_load(&hetero_cpu, hetero_id);
if (!entry) {
- entry = kzalloc(sizeof(*entry), GFP_KERNEL);
+ entry = kzalloc_obj(*entry);
WARN_ON_ONCE(!entry);
if (entry) {
diff --git a/drivers/base/attribute_container.c b/drivers/base/attribute_container.c
index b6f941a6ab69..4ad26b8dd6a5 100644
--- a/drivers/base/attribute_container.c
+++ b/drivers/base/attribute_container.c
@@ -69,7 +69,7 @@ static DEFINE_MUTEX(attribute_container_mutex);
* @cont: The container to register. This must be allocated by the
* callee and should also be zeroed by it.
*/
-int
+void
attribute_container_register(struct attribute_container *cont)
{
INIT_LIST_HEAD(&cont->node);
@@ -79,8 +79,6 @@ attribute_container_register(struct attribute_container *cont)
mutex_lock(&attribute_container_mutex);
list_add_tail(&cont->node, &attribute_container_list);
mutex_unlock(&attribute_container_mutex);
-
- return 0;
}
EXPORT_SYMBOL_GPL(attribute_container_register);
@@ -155,7 +153,7 @@ attribute_container_add_device(struct device *dev,
if (!cont->match(cont, dev))
continue;
- ic = kzalloc(sizeof(*ic), GFP_KERNEL);
+ ic = kzalloc_obj(*ic);
if (!ic) {
dev_err(dev, "failed to allocate class container\n");
continue;
diff --git a/drivers/base/auxiliary.c b/drivers/base/auxiliary.c
index 04bdbff4dbe5..9fd3820d1f8a 100644
--- a/drivers/base/auxiliary.c
+++ b/drivers/base/auxiliary.c
@@ -420,7 +420,7 @@ struct auxiliary_device *auxiliary_device_create(struct device *dev,
struct auxiliary_device *auxdev;
int ret;
- auxdev = kzalloc(sizeof(*auxdev), GFP_KERNEL);
+ auxdev = kzalloc_obj(*auxdev);
if (!auxdev)
return NULL;
diff --git a/drivers/base/auxiliary_sysfs.c b/drivers/base/auxiliary_sysfs.c
index 754f21730afd..dea7f46f7dd0 100644
--- a/drivers/base/auxiliary_sysfs.c
+++ b/drivers/base/auxiliary_sysfs.c
@@ -63,7 +63,7 @@ int auxiliary_device_sysfs_irq_add(struct auxiliary_device *auxdev, int irq)
if (ret)
return ret;
- info = kzalloc(sizeof(*info), GFP_KERNEL);
+ info = kzalloc_obj(*info);
if (!info)
return -ENOMEM;
diff --git a/drivers/base/base.h b/drivers/base/base.h
index 430cbefbc97f..79d031d2d845 100644
--- a/drivers/base/base.h
+++ b/drivers/base/base.h
@@ -179,10 +179,19 @@ void device_release_driver_internal(struct device *dev, const struct device_driv
void driver_detach(const struct device_driver *drv);
void driver_deferred_probe_del(struct device *dev);
void device_set_deferred_probe_reason(const struct device *dev, struct va_format *vaf);
+static inline int driver_match_device_locked(const struct device_driver *drv,
+ struct device *dev)
+{
+ device_lock_assert(dev);
+
+ return drv->bus->match ? drv->bus->match(dev, drv) : 1;
+}
+
static inline int driver_match_device(const struct device_driver *drv,
struct device *dev)
{
- return drv->bus->match ? drv->bus->match(dev, drv) : 1;
+ guard(device)(dev);
+ return driver_match_device_locked(drv, dev);
}
static inline void dev_sync_state(struct device *dev)
@@ -213,6 +222,10 @@ static inline void device_set_driver(struct device *dev, const struct device_dri
WRITE_ONCE(dev->driver, (struct device_driver *)drv);
}
+void devres_for_each_res(struct device *dev, dr_release_t release,
+ dr_match_t match, void *match_data,
+ void (*fn)(struct device *, void *, void *),
+ void *data);
int devres_release_all(struct device *dev);
void device_block_probing(void);
void device_unblock_probing(void);
@@ -289,3 +302,12 @@ static inline int devtmpfs_delete_node(struct device *dev) { return 0; }
void software_node_notify(struct device *dev);
void software_node_notify_remove(struct device *dev);
+
+#ifdef CONFIG_PINCTRL
+int pinctrl_bind_pins(struct device *dev);
+#else
+static inline int pinctrl_bind_pins(struct device *dev)
+{
+ return 0;
+}
+#endif /* CONFIG_PINCTRL */
diff --git a/drivers/base/bus.c b/drivers/base/bus.c
index 9eb7771706f0..bb61d8adbab1 100644
--- a/drivers/base/bus.c
+++ b/drivers/base/bus.c
@@ -696,7 +696,7 @@ int bus_add_driver(struct device_driver *drv)
*/
pr_debug("bus: '%s': add driver %s\n", sp->bus->name, drv->name);
- priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+ priv = kzalloc_obj(*priv);
if (!priv) {
error = -ENOMEM;
goto out_put_bus;
@@ -897,7 +897,7 @@ int bus_register(const struct bus_type *bus)
struct kobject *bus_kobj;
struct lock_class_key *key;
- priv = kzalloc(sizeof(struct subsys_private), GFP_KERNEL);
+ priv = kzalloc_obj(struct subsys_private);
if (!priv)
return -ENOMEM;
@@ -1263,7 +1263,7 @@ static int subsys_register(const struct bus_type *subsys,
goto err_sp;
}
- dev = kzalloc(sizeof(struct device), GFP_KERNEL);
+ dev = kzalloc_obj(struct device);
if (!dev) {
err = -ENOMEM;
goto err_dev;
diff --git a/drivers/base/cacheinfo.c b/drivers/base/cacheinfo.c
index 613410705a47..391ac5e3d2f5 100644
--- a/drivers/base/cacheinfo.c
+++ b/drivers/base/cacheinfo.c
@@ -510,7 +510,8 @@ int __weak populate_cache_leaves(unsigned int cpu)
static inline int allocate_cache_info(int cpu)
{
- per_cpu_cacheinfo(cpu) = kcalloc(cache_leaves(cpu), sizeof(struct cacheinfo), GFP_ATOMIC);
+ per_cpu_cacheinfo(cpu) = kzalloc_objs(struct cacheinfo,
+ cache_leaves(cpu), GFP_ATOMIC);
if (!per_cpu_cacheinfo(cpu)) {
cache_leaves(cpu) = 0;
return -ENOMEM;
@@ -882,8 +883,8 @@ static int cpu_cache_sysfs_init(unsigned int cpu)
return PTR_ERR(per_cpu_cache_dev(cpu));
/* Allocate all required memory */
- per_cpu_index_dev(cpu) = kcalloc(cache_leaves(cpu),
- sizeof(struct device *), GFP_KERNEL);
+ per_cpu_index_dev(cpu) = kzalloc_objs(struct device *,
+ cache_leaves(cpu));
if (unlikely(per_cpu_index_dev(cpu) == NULL))
goto err_out;
diff --git a/drivers/base/class.c b/drivers/base/class.c
index 2526c57d924e..827fc7adacc7 100644
--- a/drivers/base/class.c
+++ b/drivers/base/class.c
@@ -194,7 +194,7 @@ int class_register(const struct class *cls)
return -EINVAL;
}
- cp = kzalloc(sizeof(*cp), GFP_KERNEL);
+ cp = kzalloc_obj(*cp);
if (!cp)
return -ENOMEM;
klist_init(&cp->klist_devices, klist_class_dev_get, klist_class_dev_put);
@@ -268,7 +268,7 @@ struct class *class_create(const char *name)
struct class *cls;
int retval;
- cls = kzalloc(sizeof(*cls), GFP_KERNEL);
+ cls = kzalloc_obj(*cls);
if (!cls) {
retval = -ENOMEM;
goto error;
@@ -573,7 +573,7 @@ struct class_compat *class_compat_register(const char *name)
{
struct class_compat *cls;
- cls = kmalloc(sizeof(struct class_compat), GFP_KERNEL);
+ cls = kmalloc_obj(struct class_compat);
if (!cls)
return NULL;
cls->kobj = kobject_create_and_add(name, &class_kset->kobj);
diff --git a/drivers/base/component.c b/drivers/base/component.c
index 024ad9471b8a..655d68deb590 100644
--- a/drivers/base/component.c
+++ b/drivers/base/component.c
@@ -363,7 +363,7 @@ static int component_match_realloc(struct component_match *match, size_t num)
if (match->alloc == num)
return 0;
- new = kmalloc_array(num, sizeof(*new), GFP_KERNEL);
+ new = kmalloc_objs(*new, num);
if (!new)
return -ENOMEM;
@@ -521,7 +521,7 @@ int component_master_add_with_match(struct device *parent,
if (ret)
return ret;
- adev = kzalloc(sizeof(*adev), GFP_KERNEL);
+ adev = kzalloc_obj(*adev);
if (!adev)
return -ENOMEM;
@@ -732,7 +732,7 @@ static int __component_add(struct device *dev, const struct component_ops *ops,
struct component *component;
int ret;
- component = kzalloc(sizeof(*component), GFP_KERNEL);
+ component = kzalloc_obj(*component);
if (!component)
return -ENOMEM;
diff --git a/drivers/base/core.c b/drivers/base/core.c
index 40de2f51a1b1..791f9e444df8 100644
--- a/drivers/base/core.c
+++ b/drivers/base/core.c
@@ -76,7 +76,7 @@ static int __fwnode_link_add(struct fwnode_handle *con,
return 0;
}
- link = kzalloc(sizeof(*link), GFP_KERNEL);
+ link = kzalloc_obj(*link);
if (!link)
return -ENOMEM;
@@ -844,7 +844,7 @@ struct device_link *device_link_add(struct device *consumer,
goto out;
}
- link = kzalloc(sizeof(*link), GFP_KERNEL);
+ link = kzalloc_obj(*link);
if (!link)
goto out;
@@ -2748,7 +2748,7 @@ static ssize_t uevent_show(struct device *dev, struct device_attribute *attr,
if (!kset->uevent_ops->filter(&dev->kobj))
goto out;
- env = kzalloc(sizeof(struct kobj_uevent_env), GFP_KERNEL);
+ env = kzalloc_obj(struct kobj_uevent_env);
if (!env)
return -ENOMEM;
@@ -3220,7 +3220,7 @@ static struct kobject *class_dir_create_and_add(struct subsys_private *sp,
struct class_dir *dir;
int retval;
- dir = kzalloc(sizeof(*dir), GFP_KERNEL);
+ dir = kzalloc_obj(*dir);
if (!dir)
return ERR_PTR(-ENOMEM);
@@ -3531,7 +3531,7 @@ static void device_remove_sys_dev_entry(struct device *dev)
static int device_private_init(struct device *dev)
{
- dev->p = kzalloc(sizeof(*dev->p), GFP_KERNEL);
+ dev->p = kzalloc_obj(*dev->p);
if (!dev->p)
return -ENOMEM;
dev->p->device = dev;
@@ -4278,7 +4278,7 @@ struct device *__root_device_register(const char *name, struct module *owner)
struct root_device *root;
int err = -ENOMEM;
- root = kzalloc(sizeof(struct root_device), GFP_KERNEL);
+ root = kzalloc_obj(struct root_device);
if (!root)
return ERR_PTR(err);
@@ -4350,7 +4350,7 @@ device_create_groups_vargs(const struct class *class, struct device *parent,
if (IS_ERR_OR_NULL(class))
goto error;
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ dev = kzalloc_obj(*dev);
if (!dev) {
retval = -ENOMEM;
goto error;
@@ -4781,7 +4781,6 @@ out:
put_device(dev);
return error;
}
-EXPORT_SYMBOL_GPL(device_change_owner);
/**
* device_shutdown - call ->shutdown() on each device to shutdown.
diff --git a/drivers/base/cpu.c b/drivers/base/cpu.c
index c6c57b6f61c6..875abdc9942e 100644
--- a/drivers/base/cpu.c
+++ b/drivers/base/cpu.c
@@ -291,7 +291,7 @@ static ssize_t print_cpus_isolated(struct device *dev,
return -ENOMEM;
cpumask_andnot(isolated, cpu_possible_mask,
- housekeeping_cpumask(HK_TYPE_DOMAIN));
+ housekeeping_cpumask(HK_TYPE_DOMAIN_BOOT));
len = sysfs_emit(buf, "%*pbl\n", cpumask_pr_args(isolated));
free_cpumask_var(isolated);
@@ -466,7 +466,7 @@ __cpu_device_create(struct device *parent, void *drvdata,
struct device *dev = NULL;
int retval = -ENOMEM;
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ dev = kzalloc_obj(*dev);
if (!dev)
goto error;
diff --git a/drivers/base/dd.c b/drivers/base/dd.c
index 349f31bedfa1..0354f209529c 100644
--- a/drivers/base/dd.c
+++ b/drivers/base/dd.c
@@ -548,6 +548,8 @@ static DEVICE_ATTR_RW(state_synced);
static void device_unbind_cleanup(struct device *dev)
{
devres_release_all(dev);
+ if (dev->driver->p_cb.post_unbind_rust)
+ dev->driver->p_cb.post_unbind_rust(dev);
arch_teardown_dma_ops(dev);
kfree(dev->dma_range_map);
dev->dma_range_map = NULL;
@@ -926,7 +928,7 @@ static int __device_attach_driver(struct device_driver *drv, void *_data)
bool async_allowed;
int ret;
- ret = driver_match_device(drv, dev);
+ ret = driver_match_device_locked(drv, dev);
if (ret == 0) {
/* no match */
return 0;
diff --git a/drivers/base/devcoredump.c b/drivers/base/devcoredump.c
index 55bdc7f5e59d..7e4a491bf15e 100644
--- a/drivers/base/devcoredump.c
+++ b/drivers/base/devcoredump.c
@@ -381,7 +381,7 @@ void dev_coredumpm_timeout(struct device *dev, struct module *owner,
if (!try_module_get(owner))
goto free;
- devcd = kzalloc(sizeof(*devcd), gfp);
+ devcd = kzalloc_obj(*devcd, gfp);
if (!devcd)
goto put_module;
diff --git a/drivers/base/devres.c b/drivers/base/devres.c
index f54db6d138ab..171750c1f691 100644
--- a/drivers/base/devres.c
+++ b/drivers/base/devres.c
@@ -554,7 +554,7 @@ void *devres_open_group(struct device *dev, void *id, gfp_t gfp)
struct devres_group *grp;
unsigned long flags;
- grp = kmalloc(sizeof(*grp), gfp);
+ grp = kmalloc_obj(*grp, gfp);
if (unlikely(!grp))
return NULL;
diff --git a/drivers/base/devtmpfs.c b/drivers/base/devtmpfs.c
index 194b44075ac7..b1c4ceb65026 100644
--- a/drivers/base/devtmpfs.c
+++ b/drivers/base/devtmpfs.c
@@ -56,8 +56,7 @@ static struct req {
static int __init mount_param(char *str)
{
- mount_dev = simple_strtoul(str, NULL, 0);
- return 1;
+ return kstrtoint(str, 0, &mount_dev) == 0;
}
__setup("devtmpfs.mount=", mount_param);
@@ -85,7 +84,7 @@ static int devtmpfs_get_tree(struct fs_context *fc)
}
/* Ops are filled in during init depending on underlying shmem or ramfs type */
-struct fs_context_operations devtmpfs_context_ops = {};
+static struct fs_context_operations devtmpfs_context_ops = {};
/* Call the underlying initialization and set to our ops */
static int devtmpfs_init_fs_context(struct fs_context *fc)
diff --git a/drivers/base/faux.c b/drivers/base/faux.c
index 21dd02124231..fb3e42f21362 100644
--- a/drivers/base/faux.c
+++ b/drivers/base/faux.c
@@ -29,9 +29,7 @@ struct faux_object {
};
#define to_faux_object(dev) container_of_const(dev, struct faux_object, faux_dev.dev)
-static struct device faux_bus_root = {
- .init_name = "faux",
-};
+static struct device *faux_bus_root;
static int faux_match(struct device *dev, const struct device_driver *drv)
{
@@ -135,7 +133,7 @@ struct faux_device *faux_device_create_with_groups(const char *name,
struct device *dev;
int ret;
- faux_obj = kzalloc(sizeof(*faux_obj), GFP_KERNEL);
+ faux_obj = kzalloc_obj(*faux_obj);
if (!faux_obj)
return NULL;
@@ -152,7 +150,7 @@ struct faux_device *faux_device_create_with_groups(const char *name,
if (parent)
dev->parent = parent;
else
- dev->parent = &faux_bus_root;
+ dev->parent = faux_bus_root;
dev->bus = &faux_bus_type;
dev_set_name(dev, "%s", name);
device_set_pm_not_required(dev);
@@ -236,9 +234,15 @@ int __init faux_bus_init(void)
{
int ret;
- ret = device_register(&faux_bus_root);
+ faux_bus_root = kzalloc_obj(*faux_bus_root);
+ if (!faux_bus_root)
+ return -ENOMEM;
+
+ dev_set_name(faux_bus_root, "faux");
+
+ ret = device_register(faux_bus_root);
if (ret) {
- put_device(&faux_bus_root);
+ put_device(faux_bus_root);
return ret;
}
@@ -256,6 +260,6 @@ error_driver:
bus_unregister(&faux_bus_type);
error_bus:
- device_unregister(&faux_bus_root);
+ device_unregister(faux_bus_root);
return ret;
}
diff --git a/drivers/base/firmware_loader/main.c b/drivers/base/firmware_loader/main.c
index 4ebdca9e4da4..a11b30dda23b 100644
--- a/drivers/base/firmware_loader/main.c
+++ b/drivers/base/firmware_loader/main.c
@@ -127,7 +127,7 @@ static struct fw_priv *__allocate_fw_priv(const char *fw_name,
if (offset != 0 && !(opt_flags & FW_OPT_PARTIAL))
return NULL;
- fw_priv = kzalloc(sizeof(*fw_priv), GFP_ATOMIC);
+ fw_priv = kzalloc_obj(*fw_priv, GFP_ATOMIC);
if (!fw_priv)
return NULL;
@@ -747,7 +747,7 @@ _request_firmware_prepare(struct firmware **firmware_p, const char *name,
struct fw_priv *fw_priv;
int ret;
- *firmware_p = firmware = kzalloc(sizeof(*firmware), GFP_KERNEL);
+ *firmware_p = firmware = kzalloc_obj(*firmware);
if (!firmware) {
dev_err(device, "%s: kmalloc(struct firmware) failed\n",
__func__);
@@ -1165,7 +1165,7 @@ static int _request_firmware_nowait(
{
struct firmware_work *fw_work;
- fw_work = kzalloc(sizeof(struct firmware_work), gfp);
+ fw_work = kzalloc_obj(struct firmware_work, gfp);
if (!fw_work)
return -ENOMEM;
@@ -1338,7 +1338,7 @@ static struct fw_cache_entry *alloc_fw_cache_entry(const char *name)
{
struct fw_cache_entry *fce;
- fce = kzalloc(sizeof(*fce), GFP_ATOMIC);
+ fce = kzalloc_obj(*fce, GFP_ATOMIC);
if (!fce)
goto exit;
diff --git a/drivers/base/firmware_loader/sysfs.c b/drivers/base/firmware_loader/sysfs.c
index 92e91050f96a..29a10d2ad537 100644
--- a/drivers/base/firmware_loader/sysfs.c
+++ b/drivers/base/firmware_loader/sysfs.c
@@ -405,7 +405,7 @@ fw_create_instance(struct firmware *firmware, const char *fw_name,
struct fw_sysfs *fw_sysfs;
struct device *f_dev;
- fw_sysfs = kzalloc(sizeof(*fw_sysfs), GFP_KERNEL);
+ fw_sysfs = kzalloc_obj(*fw_sysfs);
if (!fw_sysfs) {
fw_sysfs = ERR_PTR(-ENOMEM);
goto exit;
diff --git a/drivers/base/firmware_loader/sysfs_upload.c b/drivers/base/firmware_loader/sysfs_upload.c
index c3797b93c5f5..f59a7856934c 100644
--- a/drivers/base/firmware_loader/sysfs_upload.c
+++ b/drivers/base/firmware_loader/sysfs_upload.c
@@ -315,13 +315,13 @@ firmware_upload_register(struct module *module, struct device *parent,
if (!try_module_get(module))
return ERR_PTR(-EFAULT);
- fw_upload = kzalloc(sizeof(*fw_upload), GFP_KERNEL);
+ fw_upload = kzalloc_obj(*fw_upload);
if (!fw_upload) {
ret = -ENOMEM;
goto exit_module_put;
}
- fw_upload_priv = kzalloc(sizeof(*fw_upload_priv), GFP_KERNEL);
+ fw_upload_priv = kzalloc_obj(*fw_upload_priv);
if (!fw_upload_priv) {
ret = -ENOMEM;
goto free_fw_upload;
diff --git a/drivers/base/isa.c b/drivers/base/isa.c
index bfd9215c9070..fd076cc63cb6 100644
--- a/drivers/base/isa.c
+++ b/drivers/base/isa.c
@@ -125,7 +125,7 @@ int isa_register_driver(struct isa_driver *isa_driver, unsigned int ndev)
for (id = 0; id < ndev; id++) {
struct isa_dev *isa_dev;
- isa_dev = kzalloc(sizeof *isa_dev, GFP_KERNEL);
+ isa_dev = kzalloc_obj(*isa_dev);
if (!isa_dev) {
error = -ENOMEM;
break;
diff --git a/drivers/base/map.c b/drivers/base/map.c
index 83aeb09ca161..bde415f93d67 100644
--- a/drivers/base/map.c
+++ b/drivers/base/map.c
@@ -41,7 +41,7 @@ int kobj_map(struct kobj_map *domain, dev_t dev, unsigned long range,
if (n > 255)
n = 255;
- p = kmalloc_array(n, sizeof(struct probe), GFP_KERNEL);
+ p = kmalloc_objs(struct probe, n);
if (p == NULL)
return -ENOMEM;
@@ -134,8 +134,8 @@ retry:
struct kobj_map *kobj_map_init(kobj_probe_t *base_probe, struct mutex *lock)
{
- struct kobj_map *p = kmalloc(sizeof(struct kobj_map), GFP_KERNEL);
- struct probe *base = kzalloc(sizeof(*base), GFP_KERNEL);
+ struct kobj_map *p = kmalloc_obj(struct kobj_map);
+ struct probe *base = kzalloc_obj(*base);
int i;
if ((p == NULL) || (base == NULL)) {
diff --git a/drivers/base/memory.c b/drivers/base/memory.c
index 751f248ca4a8..a3091924918b 100644
--- a/drivers/base/memory.c
+++ b/drivers/base/memory.c
@@ -800,7 +800,7 @@ static int add_memory_block(unsigned long block_id, int nid, unsigned long state
put_device(&mem->dev);
return -EEXIST;
}
- mem = kzalloc(sizeof(*mem), GFP_KERNEL);
+ mem = kzalloc_obj(*mem);
if (!mem)
return -ENOMEM;
@@ -1078,7 +1078,7 @@ static int memory_group_register(struct memory_group group)
if (!node_possible(group.nid))
return -EINVAL;
- new_group = kzalloc(sizeof(group), GFP_KERNEL);
+ new_group = kzalloc_obj(group);
if (!new_group)
return -ENOMEM;
*new_group = group;
diff --git a/drivers/base/node.c b/drivers/base/node.c
index 00cf4532f121..d7647d077b66 100644
--- a/drivers/base/node.c
+++ b/drivers/base/node.c
@@ -158,7 +158,7 @@ static struct node_access_nodes *node_init_node_access(struct node *node,
if (access_node->access == access)
return access_node;
- access_node = kzalloc(sizeof(*access_node), GFP_KERNEL);
+ access_node = kzalloc_obj(*access_node);
if (!access_node)
return NULL;
@@ -340,7 +340,7 @@ static void node_init_cache_dev(struct node *node)
{
struct device *dev;
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ dev = kzalloc_obj(*dev);
if (!dev)
return;
@@ -389,7 +389,7 @@ void node_add_cache(unsigned int nid, struct node_cache_attrs *cache_attrs)
if (!node->cache_dev)
return;
- info = kzalloc(sizeof(*info), GFP_KERNEL);
+ info = kzalloc_obj(*info);
if (!info)
return;
@@ -875,7 +875,7 @@ int register_node(int nid)
int cpu;
struct node *node;
- node = kzalloc(sizeof(struct node), GFP_KERNEL);
+ node = kzalloc_obj(struct node);
if (!node)
return -ENOMEM;
diff --git a/drivers/base/physical_location.c b/drivers/base/physical_location.c
index a5539e294d4d..2e723fff6e8a 100644
--- a/drivers/base/physical_location.c
+++ b/drivers/base/physical_location.c
@@ -21,8 +21,7 @@ bool dev_add_physical_location(struct device *dev)
if (!acpi_get_physical_device_location(ACPI_HANDLE(dev), &pld))
return false;
- dev->physical_location =
- kzalloc(sizeof(*dev->physical_location), GFP_KERNEL);
+ dev->physical_location = kzalloc_obj(*dev->physical_location);
if (!dev->physical_location) {
ACPI_FREE(pld);
return false;
diff --git a/drivers/base/pinctrl.c b/drivers/base/pinctrl.c
index c22864458511..6e250272c843 100644
--- a/drivers/base/pinctrl.c
+++ b/drivers/base/pinctrl.c
@@ -14,6 +14,8 @@
#include <linux/pinctrl/consumer.h>
#include <linux/slab.h>
+#include "base.h"
+
/**
* pinctrl_bind_pins() - called by the device core before probe
* @dev: the device that is just about to probe
diff --git a/drivers/base/power/clock_ops.c b/drivers/base/power/clock_ops.c
index b69bcb37c830..59bb37e8244c 100644
--- a/drivers/base/power/clock_ops.c
+++ b/drivers/base/power/clock_ops.c
@@ -201,7 +201,7 @@ static int __pm_clk_add(struct device *dev, const char *con_id,
if (!psd)
return -EINVAL;
- ce = kzalloc(sizeof(*ce), GFP_KERNEL);
+ ce = kzalloc_obj(*ce);
if (!ce)
return -ENOMEM;
@@ -282,7 +282,7 @@ int of_pm_clk_add_clks(struct device *dev)
if (count <= 0)
return -ENODEV;
- clks = kcalloc(count, sizeof(*clks), GFP_KERNEL);
+ clks = kzalloc_objs(*clks, count);
if (!clks)
return -ENOMEM;
diff --git a/drivers/base/power/common.c b/drivers/base/power/common.c
index 6ecf9ce4a4e6..9bef9248a705 100644
--- a/drivers/base/power/common.c
+++ b/drivers/base/power/common.c
@@ -27,7 +27,7 @@ int dev_pm_get_subsys_data(struct device *dev)
{
struct pm_subsys_data *psd;
- psd = kzalloc(sizeof(*psd), GFP_KERNEL);
+ psd = kzalloc_obj(*psd);
if (!psd)
return -ENOMEM;
@@ -222,7 +222,7 @@ int dev_pm_domain_attach_list(struct device *dev,
if (num_pds <= 0)
return 0;
- pds = kzalloc(sizeof(*pds), GFP_KERNEL);
+ pds = kzalloc_obj(*pds);
if (!pds)
return -ENOMEM;
diff --git a/drivers/base/power/main.c b/drivers/base/power/main.c
index 97a8b4fcf471..189de5250f25 100644
--- a/drivers/base/power/main.c
+++ b/drivers/base/power/main.c
@@ -1647,10 +1647,11 @@ static void device_suspend_late(struct device *dev, pm_message_t state, bool asy
goto Complete;
/*
- * Disable runtime PM for the device without checking if there is a
- * pending resume request for it.
+ * After this point, any runtime PM operations targeting the device
+ * will fail until the corresponding pm_runtime_enable() call in
+ * device_resume_early().
*/
- __pm_runtime_disable(dev, false);
+ pm_runtime_disable(dev);
if (dev->power.syscore)
goto Skip;
diff --git a/drivers/base/power/qos.c b/drivers/base/power/qos.c
index ff393cba7649..9b69827cb0d0 100644
--- a/drivers/base/power/qos.c
+++ b/drivers/base/power/qos.c
@@ -198,11 +198,11 @@ static int dev_pm_qos_constraints_allocate(struct device *dev)
struct pm_qos_constraints *c;
struct blocking_notifier_head *n;
- qos = kzalloc(sizeof(*qos), GFP_KERNEL);
+ qos = kzalloc_obj(*qos);
if (!qos)
return -ENOMEM;
- n = kcalloc(3, sizeof(*n), GFP_KERNEL);
+ n = kzalloc_objs(*n, 3);
if (!n) {
kfree(qos);
return -ENOMEM;
@@ -704,7 +704,7 @@ int dev_pm_qos_expose_latency_limit(struct device *dev, s32 value)
if (!device_is_registered(dev) || value < 0)
return -EINVAL;
- req = kzalloc(sizeof(*req), GFP_KERNEL);
+ req = kzalloc_obj(*req);
if (!req)
return -ENOMEM;
@@ -780,7 +780,7 @@ int dev_pm_qos_expose_flags(struct device *dev, s32 val)
if (!device_is_registered(dev))
return -EINVAL;
- req = kzalloc(sizeof(*req), GFP_KERNEL);
+ req = kzalloc_obj(*req);
if (!req)
return -ENOMEM;
@@ -919,7 +919,7 @@ int dev_pm_qos_update_user_latency_tolerance(struct device *dev, s32 val)
ret = -EINVAL;
goto out;
}
- req = kzalloc(sizeof(*req), GFP_KERNEL);
+ req = kzalloc_obj(*req);
if (!req) {
ret = -ENOMEM;
goto out;
diff --git a/drivers/base/power/wakeirq.c b/drivers/base/power/wakeirq.c
index 8aa28c08b289..ad23f0fa5d1a 100644
--- a/drivers/base/power/wakeirq.c
+++ b/drivers/base/power/wakeirq.c
@@ -55,7 +55,7 @@ int dev_pm_set_wake_irq(struct device *dev, int irq)
if (irq < 0)
return -EINVAL;
- wirq = kzalloc(sizeof(*wirq), GFP_KERNEL);
+ wirq = kzalloc_obj(*wirq);
if (!wirq)
return -ENOMEM;
@@ -83,13 +83,16 @@ EXPORT_SYMBOL_GPL(dev_pm_set_wake_irq);
*/
void dev_pm_clear_wake_irq(struct device *dev)
{
- struct wake_irq *wirq = dev->power.wakeirq;
+ struct wake_irq *wirq;
unsigned long flags;
- if (!wirq)
+ spin_lock_irqsave(&dev->power.lock, flags);
+ wirq = dev->power.wakeirq;
+ if (!wirq) {
+ spin_unlock_irqrestore(&dev->power.lock, flags);
return;
+ }
- spin_lock_irqsave(&dev->power.lock, flags);
device_wakeup_detach_irq(dev);
dev->power.wakeirq = NULL;
spin_unlock_irqrestore(&dev->power.lock, flags);
@@ -176,7 +179,7 @@ static int __dev_pm_set_dedicated_wake_irq(struct device *dev, int irq, unsigned
if (irq < 0)
return -EINVAL;
- wirq = kzalloc(sizeof(*wirq), GFP_KERNEL);
+ wirq = kzalloc_obj(*wirq);
if (!wirq)
return -ENOMEM;
@@ -270,8 +273,10 @@ EXPORT_SYMBOL_GPL(dev_pm_set_dedicated_wake_irq_reverse);
* otherwise try to disable already disabled wakeirq. The wake-up interrupt
* starts disabled with IRQ_NOAUTOEN set.
*
- * Should be only called from rpm_suspend() and rpm_resume() path.
- * Caller must hold &dev->power.lock to change wirq->status
+ * Should be called from rpm_suspend(), rpm_resume(),
+ * pm_runtime_force_suspend() or pm_runtime_force_resume().
+ * Caller must hold &dev->power.lock or disable runtime PM to change
+ * wirq->status.
*/
void dev_pm_enable_wake_irq_check(struct device *dev,
bool can_change_status)
@@ -303,7 +308,8 @@ enable:
* @cond_disable: if set, also check WAKE_IRQ_DEDICATED_REVERSE
*
* Disables wake-up interrupt conditionally based on status.
- * Should be only called from rpm_suspend() and rpm_resume() path.
+ * Should be called from rpm_suspend(), rpm_resume(),
+ * pm_runtime_force_suspend() or pm_runtime_force_resume().
*/
void dev_pm_disable_wake_irq_check(struct device *dev, bool cond_disable)
{
@@ -329,7 +335,7 @@ void dev_pm_disable_wake_irq_check(struct device *dev, bool cond_disable)
* enable wake IRQ after running ->runtime_suspend() which depends on
* WAKE_IRQ_DEDICATED_REVERSE.
*
- * Should be only called from rpm_suspend() path.
+ * Should be called from rpm_suspend() or pm_runtime_force_suspend().
*/
void dev_pm_enable_wake_irq_complete(struct device *dev)
{
diff --git a/drivers/base/power/wakeup.c b/drivers/base/power/wakeup.c
index 1e1a0e7eeac5..b8e48a023bf0 100644
--- a/drivers/base/power/wakeup.c
+++ b/drivers/base/power/wakeup.c
@@ -83,7 +83,7 @@ static struct wakeup_source *wakeup_source_create(const char *name)
const char *ws_name;
int id;
- ws = kzalloc(sizeof(*ws), GFP_KERNEL);
+ ws = kzalloc_obj(*ws);
if (!ws)
goto err_ws;
@@ -275,9 +275,7 @@ EXPORT_SYMBOL_GPL(wakeup_sources_read_unlock);
*/
struct wakeup_source *wakeup_sources_walk_start(void)
{
- struct list_head *ws_head = &wakeup_sources;
-
- return list_entry_rcu(ws_head->next, struct wakeup_source, entry);
+ return list_first_or_null_rcu(&wakeup_sources, struct wakeup_source, entry);
}
EXPORT_SYMBOL_GPL(wakeup_sources_walk_start);
diff --git a/drivers/base/power/wakeup_stats.c b/drivers/base/power/wakeup_stats.c
index 3ffd427248e8..308f8bde9aa3 100644
--- a/drivers/base/power/wakeup_stats.c
+++ b/drivers/base/power/wakeup_stats.c
@@ -141,7 +141,7 @@ static struct device *wakeup_source_device_create(struct device *parent,
struct device *dev = NULL;
int retval;
- dev = kzalloc(sizeof(*dev), GFP_KERNEL);
+ dev = kzalloc_obj(*dev);
if (!dev) {
retval = -ENOMEM;
goto error;
diff --git a/drivers/base/regmap/Kconfig b/drivers/base/regmap/Kconfig
index ffb2ef488298..06d7eb2aac14 100644
--- a/drivers/base/regmap/Kconfig
+++ b/drivers/base/regmap/Kconfig
@@ -5,7 +5,7 @@
config REGMAP
bool
- default y if (REGMAP_I2C || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SOUNDWIRE_MBQ || REGMAP_SCCB || REGMAP_I3C || REGMAP_SPI_AVMM || REGMAP_MDIO || REGMAP_FSI)
+ default y if (REGMAP_I2C || REGMAP_SLIMBUS || REGMAP_SPI || REGMAP_SPMI || REGMAP_W1 || REGMAP_AC97 || REGMAP_MMIO || REGMAP_IRQ || REGMAP_SOUNDWIRE || REGMAP_SOUNDWIRE_MBQ || REGMAP_SCCB || REGMAP_I3C || REGMAP_SPI_AVMM || REGMAP_MDIO || REGMAP_FSI)
help
Enable support for the Register Map (regmap) access API.
diff --git a/drivers/base/regmap/internal.h b/drivers/base/regmap/internal.h
index 1477329410ec..5bf993165438 100644
--- a/drivers/base/regmap/internal.h
+++ b/drivers/base/regmap/internal.h
@@ -117,6 +117,9 @@ struct regmap {
void *val_buf, size_t val_size);
int (*write)(void *context, const void *data, size_t count);
+ int (*reg_default_cb)(struct device *dev, unsigned int reg,
+ unsigned int *val);
+
unsigned long read_flag_mask;
unsigned long write_flag_mask;
diff --git a/drivers/base/regmap/regcache-flat.c b/drivers/base/regmap/regcache-flat.c
index 53cc59c84e2f..025e6749bb24 100644
--- a/drivers/base/regmap/regcache-flat.c
+++ b/drivers/base/regmap/regcache-flat.c
@@ -36,7 +36,7 @@ static int regcache_flat_init(struct regmap *map)
return -EINVAL;
cache_size = regcache_flat_get_index(map, map->max_register) + 1;
- cache = kzalloc(struct_size(cache, data, cache_size), map->alloc_flags);
+ cache = kzalloc_flex(*cache, data, cache_size, map->alloc_flags);
if (!cache)
return -ENOMEM;
@@ -79,6 +79,25 @@ static int regcache_flat_populate(struct regmap *map)
__set_bit(index, cache->valid);
}
+ if (map->reg_default_cb) {
+ dev_dbg(map->dev,
+ "Populating regcache_flat using reg_default_cb callback\n");
+
+ for (i = 0; i <= map->max_register; i += map->reg_stride) {
+ unsigned int index = regcache_flat_get_index(map, i);
+ unsigned int value;
+
+ if (test_bit(index, cache->valid))
+ continue;
+
+ if (map->reg_default_cb(map->dev, i, &value))
+ continue;
+
+ cache->data[index] = value;
+ __set_bit(index, cache->valid);
+ }
+ }
+
return 0;
}
diff --git a/drivers/base/regmap/regcache-maple.c b/drivers/base/regmap/regcache-maple.c
index ca1c72b68f31..49ba7282e4b8 100644
--- a/drivers/base/regmap/regcache-maple.c
+++ b/drivers/base/regmap/regcache-maple.c
@@ -95,12 +95,13 @@ static int regcache_maple_write(struct regmap *map, unsigned int reg,
mas_unlock(&mas);
- if (ret == 0) {
- kfree(lower);
- kfree(upper);
+ if (ret) {
+ kfree(entry);
+ return ret;
}
-
- return ret;
+ kfree(lower);
+ kfree(upper);
+ return 0;
}
static int regcache_maple_drop(struct regmap *map, unsigned int min,
@@ -293,7 +294,7 @@ static int regcache_maple_init(struct regmap *map)
{
struct maple_tree *mt;
- mt = kmalloc(sizeof(*mt), map->alloc_flags);
+ mt = kmalloc_obj(*mt, map->alloc_flags);
if (!mt)
return -ENOMEM;
map->cache = mt;
diff --git a/drivers/base/regmap/regcache-rbtree.c b/drivers/base/regmap/regcache-rbtree.c
index 3344b82c3799..a69e8b4c359b 100644
--- a/drivers/base/regmap/regcache-rbtree.c
+++ b/drivers/base/regmap/regcache-rbtree.c
@@ -185,7 +185,7 @@ static int regcache_rbtree_init(struct regmap *map)
{
struct regcache_rbtree_ctx *rbtree_ctx;
- map->cache = kmalloc(sizeof *rbtree_ctx, map->alloc_flags);
+ map->cache = kmalloc_obj(*rbtree_ctx, map->alloc_flags);
if (!map->cache)
return -ENOMEM;
@@ -320,7 +320,7 @@ regcache_rbtree_node_alloc(struct regmap *map, unsigned int reg)
const struct regmap_range *range;
int i;
- rbnode = kzalloc(sizeof(*rbnode), map->alloc_flags);
+ rbnode = kzalloc_obj(*rbnode, map->alloc_flags);
if (!rbnode)
return NULL;
diff --git a/drivers/base/regmap/regcache.c b/drivers/base/regmap/regcache.c
index 319c342bf5a0..a35f2b20298b 100644
--- a/drivers/base/regmap/regcache.c
+++ b/drivers/base/regmap/regcache.c
@@ -66,14 +66,13 @@ static int regcache_hw_init(struct regmap *map)
}
map->num_reg_defaults = count;
- map->reg_defaults = kmalloc_array(count, sizeof(struct reg_default),
- GFP_KERNEL);
+ map->reg_defaults = kmalloc_objs(struct reg_default, count);
if (!map->reg_defaults)
return -ENOMEM;
if (!map->reg_defaults_raw) {
bool cache_bypass = map->cache_bypass;
- dev_warn(map->dev, "No cache defaults, reading back from HW\n");
+ dev_dbg(map->dev, "No cache defaults, reading back from HW\n");
/* Bypass the cache access till data read from HW */
map->cache_bypass = true;
@@ -223,7 +222,8 @@ int regcache_init(struct regmap *map, const struct regmap_config *config)
goto err_free;
}
- if (map->num_reg_defaults && map->cache_ops->populate) {
+ if (map->cache_ops->populate &&
+ (map->num_reg_defaults || map->reg_default_cb)) {
dev_dbg(map->dev, "Populating %s cache\n", map->cache_ops->name);
map->lock(map->lock_arg);
ret = map->cache_ops->populate(map);
diff --git a/drivers/base/regmap/regmap-debugfs.c b/drivers/base/regmap/regmap-debugfs.c
index c9b4c04b1cf6..5a46ce5fee72 100644
--- a/drivers/base/regmap/regmap-debugfs.c
+++ b/drivers/base/regmap/regmap-debugfs.c
@@ -130,7 +130,7 @@ static unsigned int regmap_debugfs_get_dump_start(struct regmap *map,
/* No cache entry? Start a new one */
if (!c) {
- c = kzalloc(sizeof(*c), GFP_KERNEL);
+ c = kzalloc_obj(*c);
if (!c) {
regmap_debugfs_free_dump_cache(map);
mutex_unlock(&map->cache_lock);
@@ -555,7 +555,7 @@ void regmap_debugfs_init(struct regmap *map)
/* If we don't have the debugfs root yet, postpone init */
if (!regmap_debugfs_root) {
struct regmap_debugfs_node *node;
- node = kzalloc(sizeof(*node), GFP_KERNEL);
+ node = kzalloc_obj(*node);
if (!node)
return;
node->map = map;
diff --git a/drivers/base/regmap/regmap-irq.c b/drivers/base/regmap/regmap-irq.c
index 6112d942499b..07234d415b51 100644
--- a/drivers/base/regmap/regmap-irq.c
+++ b/drivers/base/regmap/regmap-irq.c
@@ -706,7 +706,7 @@ int regmap_add_irq_chip_fwnode(struct fwnode_handle *fwnode,
}
}
- d = kzalloc(sizeof(*d), GFP_KERNEL);
+ d = kzalloc_obj(*d);
if (!d)
return -ENOMEM;
diff --git a/drivers/base/regmap/regmap-kunit.c b/drivers/base/regmap/regmap-kunit.c
index f6fc5ed016da..2999d9c185d5 100644
--- a/drivers/base/regmap/regmap-kunit.c
+++ b/drivers/base/regmap/regmap-kunit.c
@@ -15,6 +15,8 @@ KUNIT_DEFINE_ACTION_WRAPPER(regmap_exit_action, regmap_exit, struct regmap *);
struct regmap_test_priv {
struct device *dev;
+ bool *reg_default_called;
+ unsigned int reg_default_max;
};
struct regmap_test_param {
@@ -118,6 +120,14 @@ static const struct regmap_test_param real_cache_types_only_list[] = {
KUNIT_ARRAY_PARAM(real_cache_types_only, real_cache_types_only_list, param_to_desc);
+static const struct regmap_test_param flat_cache_types_list[] = {
+ { .cache = REGCACHE_FLAT, .from_reg = 0 },
+ { .cache = REGCACHE_FLAT, .from_reg = 0, .fast_io = true },
+ { .cache = REGCACHE_FLAT, .from_reg = 0x2001 },
+};
+
+KUNIT_ARRAY_PARAM(flat_cache_types, flat_cache_types_list, param_to_desc);
+
static const struct regmap_test_param real_cache_types_list[] = {
{ .cache = REGCACHE_FLAT, .from_reg = 0 },
{ .cache = REGCACHE_FLAT, .from_reg = 0, .fast_io = true },
@@ -201,7 +211,7 @@ static struct regmap *gen_regmap(struct kunit *test,
get_random_bytes(buf, size);
- *data = kzalloc(sizeof(**data), GFP_KERNEL);
+ *data = kzalloc_obj(**data);
if (!(*data))
goto out_free;
(*data)->vals = buf;
@@ -248,6 +258,37 @@ static bool reg_5_false(struct device *dev, unsigned int reg)
return reg != (param->from_reg + 5);
}
+static unsigned int reg_default_expected(unsigned int reg)
+{
+ return 0x5a5a0000 | (reg & 0xffff);
+}
+
+static int reg_default_test_cb(struct device *dev, unsigned int reg,
+ unsigned int *def)
+{
+ struct kunit *test = dev_get_drvdata(dev);
+ struct regmap_test_priv *priv = test->priv;
+
+ if (priv && priv->reg_default_called && reg <= priv->reg_default_max)
+ priv->reg_default_called[reg] = true;
+
+ *def = reg_default_expected(reg);
+ return 0;
+}
+
+static void expect_reg_default_value(struct kunit *test, struct regmap *map,
+ struct regmap_ram_data *data,
+ struct regmap_test_priv *priv,
+ unsigned int reg)
+{
+ unsigned int val;
+
+ KUNIT_EXPECT_TRUE(test, priv->reg_default_called[reg]);
+ KUNIT_EXPECT_EQ(test, 0, regmap_read(map, reg, &val));
+ KUNIT_EXPECT_EQ(test, reg_default_expected(reg), val);
+ KUNIT_EXPECT_FALSE(test, data->read[reg]);
+}
+
static void basic_read_write(struct kunit *test)
{
struct regmap *map;
@@ -628,6 +669,54 @@ static void reg_defaults(struct kunit *test)
KUNIT_EXPECT_EQ(test, config.cache_type == REGCACHE_NONE, data->read[i]);
}
+static void reg_default_callback_populates_flat_cache(struct kunit *test)
+{
+ const struct regmap_test_param *param = test->param_value;
+ struct regmap_test_priv *priv = test->priv;
+ struct regmap *map;
+ struct regmap_config config;
+ struct regmap_ram_data *data;
+ unsigned int reg, val;
+ unsigned int defaults_end;
+
+ config = test_regmap_config;
+ config.num_reg_defaults = 3;
+ config.max_register = param->from_reg + BLOCK_TEST_SIZE - 1;
+ config.reg_default_cb = reg_default_test_cb;
+
+ priv->reg_default_max = config.max_register;
+ priv->reg_default_called = kunit_kcalloc(test, config.max_register + 1,
+ sizeof(*priv->reg_default_called),
+ GFP_KERNEL);
+ KUNIT_ASSERT_NOT_NULL(test, priv->reg_default_called);
+
+ map = gen_regmap(test, &config, &data);
+ KUNIT_ASSERT_FALSE(test, IS_ERR(map));
+ if (IS_ERR(map))
+ return;
+
+ for (reg = 0; reg <= config.max_register; reg++)
+ data->read[reg] = false;
+
+ defaults_end = param->from_reg + config.num_reg_defaults - 1;
+
+ for (reg = param->from_reg; reg <= defaults_end; reg++) {
+ KUNIT_EXPECT_FALSE(test, priv->reg_default_called[reg]);
+ KUNIT_EXPECT_EQ(test, 0, regmap_read(map, reg, &val));
+ KUNIT_EXPECT_EQ(test, data->vals[reg], val);
+ KUNIT_EXPECT_FALSE(test, data->read[reg]);
+ }
+
+ if (param->from_reg > 0)
+ expect_reg_default_value(test, map, data, priv, 0);
+
+ if (defaults_end + 1 <= config.max_register)
+ expect_reg_default_value(test, map, data, priv, defaults_end + 1);
+
+ if (config.max_register > defaults_end + 1)
+ expect_reg_default_value(test, map, data, priv, config.max_register);
+}
+
static void reg_defaults_read_dev(struct kunit *test)
{
struct regmap *map;
@@ -1670,7 +1759,7 @@ static struct regmap *gen_raw_regmap(struct kunit *test,
get_random_bytes(buf, size);
- *data = kzalloc(sizeof(**data), GFP_KERNEL);
+ *data = kzalloc_obj(**data);
if (!(*data))
goto out_free;
(*data)->vals = (void *)buf;
@@ -2058,6 +2147,8 @@ static struct kunit_case regmap_test_cases[] = {
KUNIT_CASE_PARAM(write_readonly, regcache_types_gen_params),
KUNIT_CASE_PARAM(read_writeonly, regcache_types_gen_params),
KUNIT_CASE_PARAM(reg_defaults, regcache_types_gen_params),
+ KUNIT_CASE_PARAM(reg_default_callback_populates_flat_cache,
+ flat_cache_types_gen_params),
KUNIT_CASE_PARAM(reg_defaults_read_dev, regcache_types_gen_params),
KUNIT_CASE_PARAM(register_patch, regcache_types_gen_params),
KUNIT_CASE_PARAM(stride, regcache_types_gen_params),
diff --git a/drivers/base/regmap/regmap-mmio.c b/drivers/base/regmap/regmap-mmio.c
index 29e5f3175301..1de2278fa572 100644
--- a/drivers/base/regmap/regmap-mmio.c
+++ b/drivers/base/regmap/regmap-mmio.c
@@ -430,7 +430,7 @@ static struct regmap_mmio_context *regmap_mmio_gen_context(struct device *dev,
if (config->use_relaxed_mmio && config->io_port)
return ERR_PTR(-EINVAL);
- ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
+ ctx = kzalloc_obj(*ctx);
if (!ctx)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/base/regmap/regmap-ram.c b/drivers/base/regmap/regmap-ram.c
index 4e5b4518ce4d..0272d53fead1 100644
--- a/drivers/base/regmap/regmap-ram.c
+++ b/drivers/base/regmap/regmap-ram.c
@@ -66,13 +66,11 @@ struct regmap *__regmap_init_ram(struct device *dev,
return ERR_PTR(-EINVAL);
}
- data->read = kcalloc(config->max_register + 1, sizeof(bool),
- GFP_KERNEL);
+ data->read = kzalloc_objs(bool, config->max_register + 1);
if (!data->read)
return ERR_PTR(-ENOMEM);
- data->written = kcalloc(config->max_register + 1, sizeof(bool),
- GFP_KERNEL);
+ data->written = kzalloc_objs(bool, config->max_register + 1);
if (!data->written)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/base/regmap/regmap-raw-ram.c b/drivers/base/regmap/regmap-raw-ram.c
index 76c98814fb8a..60d6e95cdd1b 100644
--- a/drivers/base/regmap/regmap-raw-ram.c
+++ b/drivers/base/regmap/regmap-raw-ram.c
@@ -123,13 +123,11 @@ struct regmap *__regmap_init_raw_ram(struct device *dev,
return ERR_PTR(-EINVAL);
}
- data->read = kcalloc(config->max_register + 1, sizeof(bool),
- GFP_KERNEL);
+ data->read = kzalloc_objs(bool, config->max_register + 1);
if (!data->read)
return ERR_PTR(-ENOMEM);
- data->written = kcalloc(config->max_register + 1, sizeof(bool),
- GFP_KERNEL);
+ data->written = kzalloc_objs(bool, config->max_register + 1);
if (!data->written)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/base/regmap/regmap-spi-avmm.c b/drivers/base/regmap/regmap-spi-avmm.c
index d86a06cadcdb..692108cbc152 100644
--- a/drivers/base/regmap/regmap-spi-avmm.c
+++ b/drivers/base/regmap/regmap-spi-avmm.c
@@ -630,7 +630,7 @@ spi_avmm_bridge_ctx_gen(struct spi_device *spi)
return ERR_PTR(-EINVAL);
}
- br = kzalloc(sizeof(*br), GFP_KERNEL);
+ br = kzalloc_obj(*br);
if (!br)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/base/regmap/regmap-spi.c b/drivers/base/regmap/regmap-spi.c
index 14b1d88997cb..b9fec387997e 100644
--- a/drivers/base/regmap/regmap-spi.c
+++ b/drivers/base/regmap/regmap-spi.c
@@ -81,7 +81,7 @@ static struct regmap_async *regmap_spi_async_alloc(void)
{
struct regmap_async_spi *async_spi;
- async_spi = kzalloc(sizeof(*async_spi), GFP_KERNEL);
+ async_spi = kzalloc_obj(*async_spi);
if (!async_spi)
return NULL;
diff --git a/drivers/base/regmap/regmap.c b/drivers/base/regmap/regmap.c
index ce9be3989a21..607c1246d994 100644
--- a/drivers/base/regmap/regmap.c
+++ b/drivers/base/regmap/regmap.c
@@ -408,9 +408,11 @@ static void regmap_lock_hwlock_irq(void *__map)
static void regmap_lock_hwlock_irqsave(void *__map)
{
struct regmap *map = __map;
+ unsigned long flags = 0;
hwspin_lock_timeout_irqsave(map->hwlock, UINT_MAX,
- &map->spinlock_flags);
+ &flags);
+ map->spinlock_flags = flags;
}
static void regmap_unlock_hwlock(void *__map)
@@ -687,7 +689,7 @@ struct regmap *__regmap_init(struct device *dev,
if (!config)
goto err;
- map = kzalloc(sizeof(*map), GFP_KERNEL);
+ map = kzalloc_obj(*map);
if (map == NULL) {
ret = -ENOMEM;
goto err;
@@ -811,6 +813,7 @@ struct regmap *__regmap_init(struct device *dev,
map->precious_reg = config->precious_reg;
map->writeable_noinc_reg = config->writeable_noinc_reg;
map->readable_noinc_reg = config->readable_noinc_reg;
+ map->reg_default_cb = config->reg_default_cb;
map->cache_type = config->cache_type;
spin_lock_init(&map->async_lock);
@@ -1114,7 +1117,7 @@ skip_format_initialization:
}
}
- new = kzalloc(sizeof(*new), GFP_KERNEL);
+ new = kzalloc_obj(*new);
if (new == NULL) {
ret = -ENOMEM;
goto err_range;
@@ -1271,7 +1274,7 @@ int regmap_field_bulk_alloc(struct regmap *regmap,
struct regmap_field *rf;
int i;
- rf = kcalloc(num_fields, sizeof(*rf), GFP_KERNEL);
+ rf = kzalloc_objs(*rf, num_fields);
if (!rf)
return -ENOMEM;
@@ -1381,7 +1384,7 @@ EXPORT_SYMBOL_GPL(devm_regmap_field_free);
struct regmap_field *regmap_field_alloc(struct regmap *regmap,
struct reg_field reg_field)
{
- struct regmap_field *rm_field = kzalloc(sizeof(*rm_field), GFP_KERNEL);
+ struct regmap_field *rm_field = kzalloc_obj(*rm_field);
if (!rm_field)
return ERR_PTR(-ENOMEM);
@@ -1433,6 +1436,7 @@ int regmap_reinit_cache(struct regmap *map, const struct regmap_config *config)
map->precious_reg = config->precious_reg;
map->writeable_noinc_reg = config->writeable_noinc_reg;
map->readable_noinc_reg = config->readable_noinc_reg;
+ map->reg_default_cb = config->reg_default_cb;
map->cache_type = config->cache_type;
ret = regmap_set_name(map, config);
diff --git a/drivers/base/soc.c b/drivers/base/soc.c
index 282c38aece0d..c8d3db9daa2f 100644
--- a/drivers/base/soc.c
+++ b/drivers/base/soc.c
@@ -140,13 +140,13 @@ struct soc_device *soc_device_register(struct soc_device_attribute *soc_dev_attr
return NULL;
}
- soc_dev = kzalloc(sizeof(*soc_dev), GFP_KERNEL);
+ soc_dev = kzalloc_obj(*soc_dev);
if (!soc_dev) {
ret = -ENOMEM;
goto out1;
}
- soc_attr_groups = kcalloc(3, sizeof(*soc_attr_groups), GFP_KERNEL);
+ soc_attr_groups = kzalloc_objs(*soc_attr_groups, 3);
if (!soc_attr_groups) {
ret = -ENOMEM;
goto out2;
diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c
index 16a8301c25d6..51320837f3a9 100644
--- a/drivers/base/swnode.c
+++ b/drivers/base/swnode.c
@@ -332,7 +332,7 @@ property_entries_dup(const struct property_entry *properties)
while (properties[n].name)
n++;
- p = kcalloc(n + 1, sizeof(*p), GFP_KERNEL);
+ p = kzalloc_objs(*p, n + 1);
if (!p)
return ERR_PTR(-ENOMEM);
@@ -758,7 +758,7 @@ static struct software_node *software_node_alloc(const struct property_entry *pr
if (IS_ERR(props))
return ERR_CAST(props);
- node = kzalloc(sizeof(*node), GFP_KERNEL);
+ node = kzalloc_obj(*node);
if (!node) {
property_entries_free(props);
return ERR_PTR(-ENOMEM);
@@ -805,7 +805,7 @@ swnode_register(const struct software_node *node, struct swnode *parent,
struct swnode *swnode;
int ret;
- swnode = kzalloc(sizeof(*swnode), GFP_KERNEL);
+ swnode = kzalloc_obj(*swnode);
if (!swnode)
return ERR_PTR(-ENOMEM);
diff --git a/drivers/base/transport_class.c b/drivers/base/transport_class.c
index 09ee2a1e35bb..416e9f819df5 100644
--- a/drivers/base/transport_class.c
+++ b/drivers/base/transport_class.c
@@ -88,17 +88,13 @@ static int anon_transport_dummy_function(struct transport_container *tc,
* events. Use prezero and then use DECLARE_ANON_TRANSPORT_CLASS() to
* initialise the anon transport class storage.
*/
-int anon_transport_class_register(struct anon_transport_class *atc)
+void anon_transport_class_register(struct anon_transport_class *atc)
{
- int error;
atc->container.class = &atc->tclass.class;
attribute_container_set_no_classdevs(&atc->container);
- error = attribute_container_register(&atc->container);
- if (error)
- return error;
+ attribute_container_register(&atc->container);
atc->tclass.setup = anon_transport_dummy_function;
atc->tclass.remove = anon_transport_dummy_function;
- return 0;
}
EXPORT_SYMBOL_GPL(anon_transport_class_register);
@@ -169,6 +165,12 @@ static int transport_add_class_device(struct attribute_container *cont,
goto err_del;
}
+ if (tcont->encryption) {
+ error = sysfs_create_group(&classdev->kobj, tcont->encryption);
+ if (error)
+ goto err_del;
+ }
+
return 0;
err_del:
@@ -244,6 +246,8 @@ static int transport_remove_classdev(struct attribute_container *cont,
if (tclass->remove != anon_transport_dummy_function) {
if (tcont->statistics)
sysfs_remove_group(&classdev->kobj, tcont->statistics);
+ if (tcont->encryption)
+ sysfs_remove_group(&classdev->kobj, tcont->encryption);
attribute_container_class_device_del(classdev);
}