spmi: Introduce device-managed functions

Utilize the managed resource (devres) framework and add the following
devm_* helpers for the SPMI driver:

- devm_spmi_controller_alloc()
- devm_spmi_controller_add()

[sboyd@kernel.org: Rename to spmi-devres for module niceness, slap on
GPL module license]

Signed-off-by: Fei Shao <fshao@chromium.org>
Link: https://lore.kernel.org/r/20230824104101.4083400-2-fshao@chromium.org
Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Link: https://lore.kernel.org/r/20231206231733.4031901-4-sboyd@kernel.org
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Fei Shao 2023-12-06 15:17:26 -08:00 committed by Greg Kroah-Hartman
parent e821d50ab5
commit b6e53731e0
3 changed files with 68 additions and 1 deletions

View File

@ -2,7 +2,7 @@
#
# Makefile for kernel SPMI framework.
#
obj-$(CONFIG_SPMI) += spmi.o
obj-$(CONFIG_SPMI) += spmi.o spmi-devres.o
obj-$(CONFIG_SPMI_HISI3670) += hisi-spmi-controller.o
obj-$(CONFIG_SPMI_MSM_PMIC_ARB) += spmi-pmic-arb.o

View File

@ -0,0 +1,64 @@
// SPDX-License-Identifier: GPL-2.0
/*
* Copyright 2023 Google LLC.
*/
#include <linux/device.h>
#include <linux/spmi.h>
static void devm_spmi_controller_release(struct device *parent, void *res)
{
spmi_controller_put(*(struct spmi_controller **)res);
}
struct spmi_controller *devm_spmi_controller_alloc(struct device *parent, size_t size)
{
struct spmi_controller **ptr, *ctrl;
ptr = devres_alloc(devm_spmi_controller_release, sizeof(*ptr), GFP_KERNEL);
if (!ptr)
return ERR_PTR(-ENOMEM);
ctrl = spmi_controller_alloc(parent, size);
if (!ctrl) {
devres_free(ptr);
return ERR_PTR(-ENOMEM);
}
*ptr = ctrl;
devres_add(parent, ptr);
return ctrl;
}
EXPORT_SYMBOL_GPL(devm_spmi_controller_alloc);
static void devm_spmi_controller_remove(struct device *parent, void *res)
{
spmi_controller_remove(*(struct spmi_controller **)res);
}
int devm_spmi_controller_add(struct device *parent, struct spmi_controller *ctrl)
{
struct spmi_controller **ptr;
int ret;
ptr = devres_alloc(devm_spmi_controller_remove, sizeof(*ptr), GFP_KERNEL);
if (!ptr)
return -ENOMEM;
ret = spmi_controller_add(ctrl);
if (ret) {
devres_free(ptr);
return ret;
}
*ptr = ctrl;
devres_add(parent, ptr);
return 0;
}
EXPORT_SYMBOL_GPL(devm_spmi_controller_add);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("SPMI devres helpers");

View File

@ -120,6 +120,9 @@ static inline void spmi_controller_put(struct spmi_controller *ctrl)
int spmi_controller_add(struct spmi_controller *ctrl);
void spmi_controller_remove(struct spmi_controller *ctrl);
struct spmi_controller *devm_spmi_controller_alloc(struct device *parent, size_t size);
int devm_spmi_controller_add(struct device *parent, struct spmi_controller *ctrl);
/**
* struct spmi_driver - SPMI slave device driver
* @driver: SPMI device drivers should initialize name and owner field of