Lines Matching refs:regnode

62 struct regnode;
64 typedef TAILQ_HEAD(regnode_list, regnode) regnode_list_t;
68 static int regnode_method_enable(struct regnode *regnode, bool enable,
70 static int regnode_method_status(struct regnode *regnode, int *status);
71 static int regnode_method_set_voltage(struct regnode *regnode, int min_uvolt,
73 static int regnode_method_get_voltage(struct regnode *regnode, int *uvolt);
87 DEFINE_CLASS_0(regnode, regnode_class, regnode_methods, 0);
93 struct regnode { struct
96 TAILQ_ENTRY(regnode) reglist_link; /* Global list entry */
100 struct regnode *parent; /* Resolved parent */ argument
129 struct regnode *regnode; argument
168 struct regnode *entry; in regulator_shutdown()
193 struct regnode *regnode = arg1; in regnode_uvolt_sysctl() local
196 if (regnode->std_param.min_uvolt == regnode->std_param.max_uvolt) { in regnode_uvolt_sysctl()
197 uvolt = regnode->std_param.min_uvolt; in regnode_uvolt_sysctl()
200 if ((rv = regnode_get_voltage(regnode, &uvolt)) != 0) { in regnode_uvolt_sysctl()
216 regnode_method_enable(struct regnode *regnode, bool enable, int *udelay) in regnode_method_enable() argument
227 regnode_method_status(struct regnode *regnode, int *status) in regnode_method_status() argument
234 regnode_method_set_voltage(struct regnode *regnode, int min_uvolt, int max_uvolt, in regnode_method_set_voltage() argument
238 if ((min_uvolt > regnode->std_param.max_uvolt) || in regnode_method_set_voltage()
239 (max_uvolt < regnode->std_param.min_uvolt)) in regnode_method_set_voltage()
246 regnode_method_get_voltage(struct regnode *regnode, int *uvolt) in regnode_method_get_voltage() argument
249 return (regnode->std_param.min_uvolt + in regnode_method_get_voltage()
250 (regnode->std_param.max_uvolt - regnode->std_param.min_uvolt) / 2); in regnode_method_get_voltage()
259 static struct regnode *
262 struct regnode *entry; in regnode_find_by_name()
273 static struct regnode *
276 struct regnode *entry; in regnode_find_by_id()
291 struct regnode *
295 struct regnode *regnode; in regnode_create() local
307 regnode = malloc(sizeof(struct regnode), M_REGULATOR, in regnode_create()
309 kobj_init((kobj_t)regnode, (kobj_class_t)regnode_class); in regnode_create()
310 sx_init(&regnode->lock, "Regulator node lock"); in regnode_create()
314 regnode->softc = malloc(regnode_class->size, M_REGULATOR, in regnode_create()
321 regnode->name = def->name; in regnode_create()
322 regnode->parent_name = def->parent_name; in regnode_create()
324 regnode->name = strdup(def->name, M_REGULATOR); in regnode_create()
326 regnode->parent_name = strdup(def->parent_name, in regnode_create()
331 TAILQ_INIT(&regnode->consumers_list); in regnode_create()
332 regnode->id = def->id; in regnode_create()
333 regnode->pdev = pdev; in regnode_create()
334 regnode->flags = def->flags; in regnode_create()
335 regnode->parent = NULL; in regnode_create()
336 regnode->std_param = def->std_param; in regnode_create()
338 regnode->ofw_node = def->ofw_node; in regnode_create()
341 sysctl_ctx_init(&regnode->sysctl_ctx); in regnode_create()
342 regnode_oid = SYSCTL_ADD_NODE(&regnode->sysctl_ctx, in regnode_create()
344 OID_AUTO, regnode->name, in regnode_create()
347 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
350 CTLFLAG_RD, &regnode->std_param.min_uvolt, 0, in regnode_create()
352 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
355 CTLFLAG_RD, &regnode->std_param.max_uvolt, 0, in regnode_create()
357 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
360 CTLFLAG_RD, &regnode->std_param.min_uamp, 0, in regnode_create()
362 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
365 CTLFLAG_RD, &regnode->std_param.max_uamp, 0, in regnode_create()
367 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
370 CTLFLAG_RD, &regnode->std_param.ramp_delay, 0, in regnode_create()
372 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
375 CTLFLAG_RD, &regnode->std_param.enable_delay, 0, in regnode_create()
377 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
380 CTLFLAG_RD, &regnode->enable_cnt, 0, in regnode_create()
382 SYSCTL_ADD_U8(&regnode->sysctl_ctx, in regnode_create()
385 CTLFLAG_RD, (uint8_t *) &regnode->std_param.boot_on, 0, in regnode_create()
387 SYSCTL_ADD_U8(&regnode->sysctl_ctx, in regnode_create()
390 CTLFLAG_RD, (uint8_t *)&regnode->std_param.always_on, 0, in regnode_create()
393 SYSCTL_ADD_PROC(&regnode->sysctl_ctx, in regnode_create()
397 regnode, 0, regnode_uvolt_sysctl, in regnode_create()
401 return (regnode); in regnode_create()
405 struct regnode *
406 regnode_register(struct regnode *regnode) in regnode_register() argument
411 if (regnode->ofw_node <= 0) in regnode_register()
412 regnode->ofw_node = ofw_bus_get_node(regnode->pdev); in regnode_register()
413 if (regnode->ofw_node <= 0) in regnode_register()
417 rv = REGNODE_INIT(regnode); in regnode_register()
424 TAILQ_INSERT_TAIL(&regnode_list, regnode, reglist_link); in regnode_register()
427 OF_device_register_xref(OF_xref_from_node(regnode->ofw_node), in regnode_register()
428 regnode->pdev); in regnode_register()
430 return (regnode); in regnode_register()
434 regnode_resolve_parent(struct regnode *regnode) in regnode_resolve_parent() argument
438 if ((regnode->parent != NULL) || in regnode_resolve_parent()
439 (regnode->parent_name == NULL)) in regnode_resolve_parent()
442 regnode->parent = regnode_find_by_name(regnode->parent_name); in regnode_resolve_parent()
443 if (regnode->parent == NULL) in regnode_resolve_parent()
470 regnode_get_name(struct regnode *regnode) in regnode_get_name() argument
473 return (regnode->name); in regnode_get_name()
477 regnode_get_parent_name(struct regnode *regnode) in regnode_get_parent_name() argument
480 return (regnode->parent_name); in regnode_get_parent_name()
484 regnode_get_flags(struct regnode *regnode) in regnode_get_flags() argument
487 return (regnode->flags); in regnode_get_flags()
491 regnode_get_softc(struct regnode *regnode) in regnode_get_softc() argument
494 return (regnode->softc); in regnode_get_softc()
498 regnode_get_device(struct regnode *regnode) in regnode_get_device() argument
501 return (regnode->pdev); in regnode_get_device()
504 struct regnode_std_param *regnode_get_stdparam(struct regnode *regnode) in regnode_get_stdparam() argument
507 return (&regnode->std_param); in regnode_get_stdparam()
534 struct regnode *
535 regnode_get_parent(struct regnode *regnode) in regnode_get_parent() argument
541 rv = regnode_resolve_parent(regnode); in regnode_get_parent()
545 return (regnode->parent); in regnode_get_parent()
552 regnode_enable(struct regnode *regnode) in regnode_enable() argument
560 rv = regnode_resolve_parent(regnode); in regnode_enable()
563 if (regnode->parent != NULL) { in regnode_enable()
564 rv = regnode_enable(regnode->parent); in regnode_enable()
570 REGNODE_XLOCK(regnode); in regnode_enable()
571 if (regnode->enable_cnt == 0) { in regnode_enable()
572 rv = REGNODE_ENABLE(regnode, true, &udelay); in regnode_enable()
574 REGNODE_UNLOCK(regnode); in regnode_enable()
579 regnode->enable_cnt++; in regnode_enable()
580 REGNODE_UNLOCK(regnode); in regnode_enable()
588 regnode_disable(struct regnode *regnode) in regnode_disable() argument
596 REGNODE_XLOCK(regnode); in regnode_disable()
598 if (regnode->enable_cnt == 1 && in regnode_disable()
599 (regnode->flags & REGULATOR_FLAGS_NOT_DISABLE) == 0 && in regnode_disable()
600 !regnode->std_param.always_on) { in regnode_disable()
601 rv = REGNODE_ENABLE(regnode, false, &udelay); in regnode_disable()
603 REGNODE_UNLOCK(regnode); in regnode_disable()
608 regnode->enable_cnt--; in regnode_disable()
609 REGNODE_UNLOCK(regnode); in regnode_disable()
611 rv = regnode_resolve_parent(regnode); in regnode_disable()
614 if (regnode->parent != NULL) in regnode_disable()
615 rv = regnode_disable(regnode->parent); in regnode_disable()
623 regnode_stop(struct regnode *regnode, int depth) in regnode_stop() argument
631 REGNODE_XLOCK(regnode); in regnode_stop()
633 if ((regnode->enable_cnt != 0) && (depth == 0)) { in regnode_stop()
634 REGNODE_UNLOCK(regnode); in regnode_stop()
638 if ((regnode->enable_cnt == 0) && in regnode_stop()
639 ((regnode->flags & REGULATOR_FLAGS_NOT_DISABLE) == 0)) { in regnode_stop()
640 rv = REGNODE_STOP(regnode, &udelay); in regnode_stop()
642 REGNODE_UNLOCK(regnode); in regnode_stop()
647 REGNODE_UNLOCK(regnode); in regnode_stop()
649 rv = regnode_resolve_parent(regnode); in regnode_stop()
652 if (regnode->parent != NULL && regnode->parent->enable_cnt == 0) in regnode_stop()
653 rv = regnode_stop(regnode->parent, depth + 1); in regnode_stop()
661 regnode_status(struct regnode *regnode, int *status) in regnode_status() argument
667 REGNODE_XLOCK(regnode); in regnode_status()
668 rv = REGNODE_STATUS(regnode, status); in regnode_status()
669 REGNODE_UNLOCK(regnode); in regnode_status()
677 regnode_get_voltage(struct regnode *regnode, int *uvolt) in regnode_get_voltage() argument
683 REGNODE_XLOCK(regnode); in regnode_get_voltage()
684 rv = REGNODE_GET_VOLTAGE(regnode, uvolt); in regnode_get_voltage()
685 REGNODE_UNLOCK(regnode); in regnode_get_voltage()
689 rv = regnode_resolve_parent(regnode); in regnode_get_voltage()
692 if (regnode->parent != NULL) in regnode_get_voltage()
693 rv = regnode_get_voltage(regnode->parent, uvolt); in regnode_get_voltage()
703 regnode_set_voltage(struct regnode *regnode, int min_uvolt, int max_uvolt) in regnode_set_voltage() argument
710 REGNODE_XLOCK(regnode); in regnode_set_voltage()
712 rv = REGNODE_SET_VOLTAGE(regnode, min_uvolt, max_uvolt, &udelay); in regnode_set_voltage()
715 REGNODE_UNLOCK(regnode); in regnode_set_voltage()
723 regnode_set_voltage_checked(struct regnode *regnode, struct regulator *reg, in regnode_set_voltage_checked() argument
734 REGNODE_XLOCK(regnode); in regnode_set_voltage_checked()
736 if ((min_uvolt > regnode->std_param.max_uvolt) || in regnode_set_voltage_checked()
737 (max_uvolt < regnode->std_param.min_uvolt)) { in regnode_set_voltage_checked()
738 REGNODE_UNLOCK(regnode); in regnode_set_voltage_checked()
743 all_min_uvolt = regnode->std_param.min_uvolt; in regnode_set_voltage_checked()
744 all_max_uvolt = regnode->std_param.max_uvolt; in regnode_set_voltage_checked()
745 TAILQ_FOREACH(tmp, &regnode->consumers_list, link) { in regnode_set_voltage_checked()
758 REGNODE_UNLOCK(regnode); in regnode_set_voltage_checked()
768 rv = REGNODE_SET_VOLTAGE(regnode, min_uvolt, max_uvolt, &udelay); in regnode_set_voltage_checked()
770 REGNODE_UNLOCK(regnode); in regnode_set_voltage_checked()
776 regnode_get_ofw_node(struct regnode *regnode) in regnode_get_ofw_node() argument
779 return (regnode->ofw_node); in regnode_get_ofw_node()
790 regulator_create(struct regnode *regnode, device_t cdev) in regulator_create() argument
799 reg->regnode = regnode; in regulator_create()
802 REGNODE_XLOCK(regnode); in regulator_create()
803 regnode->ref_cnt++; in regulator_create()
804 TAILQ_INSERT_TAIL(&regnode->consumers_list, reg, link); in regulator_create()
805 reg ->min_uvolt = regnode->std_param.min_uvolt; in regulator_create()
806 reg ->max_uvolt = regnode->std_param.max_uvolt; in regulator_create()
807 REGNODE_UNLOCK(regnode); in regulator_create()
816 struct regnode *regnode; in regulator_enable() local
818 regnode = reg->regnode; in regulator_enable()
819 KASSERT(regnode->ref_cnt > 0, in regulator_enable()
820 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_enable()
822 rv = regnode_enable(regnode); in regulator_enable()
833 struct regnode *regnode; in regulator_disable() local
835 regnode = reg->regnode; in regulator_disable()
836 KASSERT(regnode->ref_cnt > 0, in regulator_disable()
837 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_disable()
840 regnode->name)); in regulator_disable()
842 rv = regnode_disable(regnode); in regulator_disable()
853 struct regnode *regnode; in regulator_stop() local
855 regnode = reg->regnode; in regulator_stop()
856 KASSERT(regnode->ref_cnt > 0, in regulator_stop()
857 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_stop()
859 ("Attempt to stop already enabled regulator: %s\n", regnode->name)); in regulator_stop()
862 rv = regnode_stop(regnode, 0); in regulator_stop()
871 struct regnode *regnode; in regulator_status() local
873 regnode = reg->regnode; in regulator_status()
874 KASSERT(regnode->ref_cnt > 0, in regulator_status()
875 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_status()
878 rv = regnode_status(regnode, status); in regulator_status()
887 struct regnode *regnode; in regulator_get_voltage() local
889 regnode = reg->regnode; in regulator_get_voltage()
890 KASSERT(regnode->ref_cnt > 0, in regulator_get_voltage()
891 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_get_voltage()
894 rv = regnode_get_voltage(regnode, uvolt); in regulator_get_voltage()
902 struct regnode *regnode; in regulator_set_voltage() local
905 regnode = reg->regnode; in regulator_set_voltage()
906 KASSERT(regnode->ref_cnt > 0, in regulator_set_voltage()
907 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_set_voltage()
911 rv = regnode_set_voltage_checked(regnode, reg, min_uvolt, max_uvolt); in regulator_set_voltage()
923 struct regnode *regnode; in regulator_get_name() local
925 regnode = reg->regnode; in regulator_get_name()
926 KASSERT(regnode->ref_cnt > 0, in regulator_get_name()
927 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_get_name()
928 return (regnode->name); in regulator_get_name()
934 struct regnode *regnode; in regulator_get_by_name() local
937 regnode = regnode_find_by_name(name); in regulator_get_by_name()
938 if (regnode == NULL) { in regulator_get_by_name()
942 *reg = regulator_create(regnode, cdev); in regulator_get_by_name()
950 struct regnode *regnode; in regulator_get_by_id() local
954 regnode = regnode_find_by_id(pdev, id); in regulator_get_by_id()
955 if (regnode == NULL) { in regulator_get_by_id()
959 *reg = regulator_create(regnode, cdev); in regulator_get_by_id()
968 struct regnode *regnode; in regulator_release() local
970 regnode = reg->regnode; in regulator_release()
971 KASSERT(regnode->ref_cnt > 0, in regulator_release()
972 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_release()
975 regnode_disable(regnode); in regulator_release()
978 REGNODE_XLOCK(regnode); in regulator_release()
979 TAILQ_REMOVE(&regnode->consumers_list, reg, link); in regulator_release()
980 regnode->ref_cnt--; in regulator_release()
981 REGNODE_UNLOCK(regnode); in regulator_release()