of_regulator.c 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*
  2. * OF helpers for regulator framework
  3. *
  4. * Copyright (C) 2011 Texas Instruments, Inc.
  5. * Rajendra Nayak <rnayak@ti.com>
  6. *
  7. * This program is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. */
  12. #include <linux/module.h>
  13. #include <linux/slab.h>
  14. #include <linux/of.h>
  15. #include <linux/regulator/machine.h>
  16. static void of_get_regulation_constraints(struct device_node *np,
  17. struct regulator_init_data **init_data)
  18. {
  19. const __be32 *min_uV, *max_uV, *uV_offset;
  20. const __be32 *min_uA, *max_uA;
  21. struct regulation_constraints *constraints = &(*init_data)->constraints;
  22. constraints->name = of_get_property(np, "regulator-name", NULL);
  23. min_uV = of_get_property(np, "regulator-min-microvolt", NULL);
  24. if (min_uV)
  25. constraints->min_uV = be32_to_cpu(*min_uV);
  26. max_uV = of_get_property(np, "regulator-max-microvolt", NULL);
  27. if (max_uV)
  28. constraints->max_uV = be32_to_cpu(*max_uV);
  29. /* Voltage change possible? */
  30. if (constraints->min_uV != constraints->max_uV)
  31. constraints->valid_ops_mask |= REGULATOR_CHANGE_VOLTAGE;
  32. uV_offset = of_get_property(np, "regulator-microvolt-offset", NULL);
  33. if (uV_offset)
  34. constraints->uV_offset = be32_to_cpu(*uV_offset);
  35. min_uA = of_get_property(np, "regulator-min-microamp", NULL);
  36. if (min_uA)
  37. constraints->min_uA = be32_to_cpu(*min_uA);
  38. max_uA = of_get_property(np, "regulator-max-microamp", NULL);
  39. if (max_uA)
  40. constraints->max_uA = be32_to_cpu(*max_uA);
  41. /* Current change possible? */
  42. if (constraints->min_uA != constraints->max_uA)
  43. constraints->valid_ops_mask |= REGULATOR_CHANGE_CURRENT;
  44. if (of_find_property(np, "regulator-boot-on", NULL))
  45. constraints->boot_on = true;
  46. if (of_find_property(np, "regulator-always-on", NULL))
  47. constraints->always_on = true;
  48. else /* status change should be possible if not always on. */
  49. constraints->valid_ops_mask |= REGULATOR_CHANGE_STATUS;
  50. }
  51. /**
  52. * of_get_regulator_init_data - extract regulator_init_data structure info
  53. * @dev: device requesting for regulator_init_data
  54. *
  55. * Populates regulator_init_data structure by extracting data from device
  56. * tree node, returns a pointer to the populated struture or NULL if memory
  57. * alloc fails.
  58. */
  59. struct regulator_init_data *of_get_regulator_init_data(struct device *dev)
  60. {
  61. struct regulator_init_data *init_data;
  62. if (!dev->of_node)
  63. return NULL;
  64. init_data = devm_kzalloc(dev, sizeof(*init_data), GFP_KERNEL);
  65. if (!init_data)
  66. return NULL; /* Out of memory? */
  67. of_get_regulation_constraints(dev->of_node, &init_data);
  68. return init_data;
  69. }
  70. EXPORT_SYMBOL_GPL(of_get_regulator_init_data);