65 lines · c
1// SPDX-License-Identifier: GPL-2.02/*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