Page MenuHomeFreeBSD

D14781.id41072.diff
No OneTemporary

D14781.id41072.diff

Index: head/sys/dev/extres/regulator/regulator.c
===================================================================
--- head/sys/dev/extres/regulator/regulator.c
+++ head/sys/dev/extres/regulator/regulator.c
@@ -71,6 +71,7 @@
static int regnode_method_set_voltage(struct regnode *regnode, int min_uvolt,
int max_uvolt, int *udelay);
static int regnode_method_get_voltage(struct regnode *regnode, int *uvolt);
+static void regulator_shutdown(void *dummy);
/*
* Regulator controller methods.
@@ -150,6 +151,36 @@
#define REGNODE_SLOCK(_sc) sx_slock(&((_sc)->lock))
#define REGNODE_XLOCK(_sc) sx_xlock(&((_sc)->lock))
#define REGNODE_UNLOCK(_sc) sx_unlock(&((_sc)->lock))
+
+SYSINIT(regulator_shutdown, SI_SUB_LAST, SI_ORDER_ANY, regulator_shutdown,
+ NULL);
+
+/*
+ * Disable unused regulator
+ * We run this function at SI_SUB_LAST which mean that every driver that needs
+ * regulator should have already enable them.
+ * All the remaining regulators should be those left enabled by the bootloader
+ * or enable by default by the PMIC.
+ */
+static void
+regulator_shutdown(void *dummy)
+{
+ struct regnode *entry;
+ int disable = 1;
+
+ REG_TOPO_SLOCK();
+ TUNABLE_INT_FETCH("hw.regulator.disable_unused", &disable);
+ TAILQ_FOREACH(entry, &regnode_list, reglist_link) {
+ if (entry->enable_cnt == 0 &&
+ entry->std_param.always_on == 0 && disable) {
+ if (bootverbose)
+ printf("regulator: shuting down %s\n",
+ entry->name);
+ regnode_stop(entry, 0);
+ }
+ }
+ REG_TOPO_UNLOCK();
+}
/*
* sysctl handler

File Metadata

Mime Type
text/plain
Expires
Thu, Oct 1, 1:18 AM (5 h, 27 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
39980443
Default Alt Text
D14781.id41072.diff (1 KB)

Event Timeline