1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Copyright 2023 Google LLC.
4 */
5
6#include <linux/device.h>
7#include <linux/spmi.h>
8
9static void devm_spmi_controller_release(struct device *parent, void *res)
10{
11	spmi_controller_put(*(struct spmi_controller **)res);
12}
13
14struct spmi_controller *devm_spmi_controller_alloc(struct device *parent, size_t size)
15{
16	struct spmi_controller **ptr, *ctrl;
17
18	ptr = devres_alloc(devm_spmi_controller_release, sizeof(*ptr), GFP_KERNEL);
19	if (!ptr)
20		return ERR_PTR(-ENOMEM);
21
22	ctrl = spmi_controller_alloc(parent, size);
23	if (IS_ERR(ctrl)) {
24		devres_free(ptr);
25		return ctrl;
26	}
27
28	*ptr = ctrl;
29	devres_add(parent, ptr);
30
31	return ctrl;
32}
33EXPORT_SYMBOL_GPL(devm_spmi_controller_alloc);
34
35static void devm_spmi_controller_remove(struct device *parent, void *res)
36{
37	spmi_controller_remove(*(struct spmi_controller **)res);
38}
39
40int devm_spmi_controller_add(struct device *parent, struct spmi_controller *ctrl)
41{
42	struct spmi_controller **ptr;
43	int ret;
44
45	ptr = devres_alloc(devm_spmi_controller_remove, sizeof(*ptr), GFP_KERNEL);
46	if (!ptr)
47		return -ENOMEM;
48
49	ret = spmi_controller_add(ctrl);
50	if (ret) {
51		devres_free(ptr);
52		return ret;
53	}
54
55	*ptr = ctrl;
56	devres_add(parent, ptr);
57
58	return 0;
59
60}
61EXPORT_SYMBOL_GPL(devm_spmi_controller_add);
62
63MODULE_LICENSE("GPL");
64MODULE_DESCRIPTION("SPMI devres helpers");
65