mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-01 10:43:43 +00:00
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:
parent
e821d50ab5
commit
b6e53731e0
@ -2,7 +2,7 @@
|
|||||||
#
|
#
|
||||||
# Makefile for kernel SPMI framework.
|
# 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_HISI3670) += hisi-spmi-controller.o
|
||||||
obj-$(CONFIG_SPMI_MSM_PMIC_ARB) += spmi-pmic-arb.o
|
obj-$(CONFIG_SPMI_MSM_PMIC_ARB) += spmi-pmic-arb.o
|
||||||
|
64
drivers/spmi/spmi-devres.c
Normal file
64
drivers/spmi/spmi-devres.c
Normal 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");
|
@ -120,6 +120,9 @@ static inline void spmi_controller_put(struct spmi_controller *ctrl)
|
|||||||
int spmi_controller_add(struct spmi_controller *ctrl);
|
int spmi_controller_add(struct spmi_controller *ctrl);
|
||||||
void spmi_controller_remove(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
|
* struct spmi_driver - SPMI slave device driver
|
||||||
* @driver: SPMI device drivers should initialize name and owner field of
|
* @driver: SPMI device drivers should initialize name and owner field of
|
||||||
|
Loading…
Reference in New Issue
Block a user