spmi-devres.c 1.3 KB

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