Lines Matching refs:regnode

63 struct regnode;
65 typedef TAILQ_HEAD(regnode_list, regnode) regnode_list_t;
69 static int regnode_method_init(struct regnode *regnode);
70 static int regnode_method_enable(struct regnode *regnode, bool enable,
72 static int regnode_method_status(struct regnode *regnode, int *status);
73 static int regnode_method_set_voltage(struct regnode *regnode, int min_uvolt,
75 static int regnode_method_get_voltage(struct regnode *regnode, int *uvolt);
92 DEFINE_CLASS_0(regnode, regnode_class, regnode_methods, 0);
98 struct regnode { struct
101 TAILQ_ENTRY(regnode) reglist_link; /* Global list entry */
105 struct regnode *parent; /* Resolved parent */ argument
134 struct regnode *regnode; argument
168 struct regnode *entry; in regulator_constraint()
191 struct regnode *entry; in regulator_shutdown()
236 struct regnode *regnode = arg1; in regnode_uvolt_sysctl() local
239 if (regnode->std_param.min_uvolt == regnode->std_param.max_uvolt) { in regnode_uvolt_sysctl()
240 uvolt = regnode->std_param.min_uvolt; in regnode_uvolt_sysctl()
243 if ((rv = regnode_get_voltage(regnode, &uvolt)) != 0) { in regnode_uvolt_sysctl()
259 regnode_method_init(struct regnode *regnode) in regnode_method_init() argument
266 regnode_method_enable(struct regnode *regnode, bool enable, int *udelay) in regnode_method_enable() argument
277 regnode_method_status(struct regnode *regnode, int *status) in regnode_method_status() argument
284 regnode_method_set_voltage(struct regnode *regnode, int min_uvolt, int max_uvolt, in regnode_method_set_voltage() argument
288 if ((min_uvolt > regnode->std_param.max_uvolt) || in regnode_method_set_voltage()
289 (max_uvolt < regnode->std_param.min_uvolt)) in regnode_method_set_voltage()
296 regnode_method_get_voltage(struct regnode *regnode, int *uvolt) in regnode_method_get_voltage() argument
299 *uvolt = regnode->std_param.min_uvolt + in regnode_method_get_voltage()
300 (regnode->std_param.max_uvolt - regnode->std_param.min_uvolt) / 2; in regnode_method_get_voltage()
305 regnode_method_check_voltage(struct regnode *regnode, int uvolt) in regnode_method_check_voltage() argument
308 if ((uvolt > regnode->std_param.max_uvolt) || in regnode_method_check_voltage()
309 (uvolt < regnode->std_param.min_uvolt)) in regnode_method_check_voltage()
320 static struct regnode *
323 struct regnode *entry; in regnode_find_by_name()
334 static struct regnode *
337 struct regnode *entry; in regnode_find_by_id()
352 struct regnode *
356 struct regnode *regnode; in regnode_create() local
368 regnode = malloc(sizeof(struct regnode), M_REGULATOR, in regnode_create()
370 kobj_init((kobj_t)regnode, (kobj_class_t)regnode_class); in regnode_create()
371 sx_init(&regnode->lock, "Regulator node lock"); in regnode_create()
375 regnode->softc = malloc(regnode_class->size, M_REGULATOR, in regnode_create()
382 regnode->name = def->name; in regnode_create()
383 regnode->parent_name = def->parent_name; in regnode_create()
385 regnode->name = strdup(def->name, M_REGULATOR); in regnode_create()
387 regnode->parent_name = strdup(def->parent_name, in regnode_create()
392 TAILQ_INIT(&regnode->consumers_list); in regnode_create()
393 regnode->id = def->id; in regnode_create()
394 regnode->pdev = pdev; in regnode_create()
395 regnode->flags = def->flags; in regnode_create()
396 regnode->parent = NULL; in regnode_create()
397 regnode->std_param = def->std_param; in regnode_create()
399 regnode->ofw_node = def->ofw_node; in regnode_create()
402 sysctl_ctx_init(&regnode->sysctl_ctx); in regnode_create()
403 regnode_oid = SYSCTL_ADD_NODE(&regnode->sysctl_ctx, in regnode_create()
405 OID_AUTO, regnode->name, in regnode_create()
408 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
411 CTLFLAG_RD, &regnode->std_param.min_uvolt, 0, in regnode_create()
413 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
416 CTLFLAG_RD, &regnode->std_param.max_uvolt, 0, in regnode_create()
418 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
421 CTLFLAG_RD, &regnode->std_param.min_uamp, 0, in regnode_create()
423 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
426 CTLFLAG_RD, &regnode->std_param.max_uamp, 0, in regnode_create()
428 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
431 CTLFLAG_RD, &regnode->std_param.ramp_delay, 0, in regnode_create()
433 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
436 CTLFLAG_RD, &regnode->std_param.enable_delay, 0, in regnode_create()
438 SYSCTL_ADD_INT(&regnode->sysctl_ctx, in regnode_create()
441 CTLFLAG_RD, &regnode->enable_cnt, 0, in regnode_create()
443 SYSCTL_ADD_U8(&regnode->sysctl_ctx, in regnode_create()
446 CTLFLAG_RD, (uint8_t *) &regnode->std_param.boot_on, 0, in regnode_create()
448 SYSCTL_ADD_U8(&regnode->sysctl_ctx, in regnode_create()
451 CTLFLAG_RD, (uint8_t *)&regnode->std_param.always_on, 0, in regnode_create()
454 SYSCTL_ADD_PROC(&regnode->sysctl_ctx, in regnode_create()
458 regnode, 0, regnode_uvolt_sysctl, in regnode_create()
462 return (regnode); in regnode_create()
466 struct regnode *
467 regnode_register(struct regnode *regnode) in regnode_register() argument
472 if (regnode->ofw_node <= 0) in regnode_register()
473 regnode->ofw_node = ofw_bus_get_node(regnode->pdev); in regnode_register()
474 if (regnode->ofw_node <= 0) in regnode_register()
478 rv = REGNODE_INIT(regnode); in regnode_register()
485 TAILQ_INSERT_TAIL(&regnode_list, regnode, reglist_link); in regnode_register()
488 OF_device_register_xref(OF_xref_from_node(regnode->ofw_node), in regnode_register()
489 regnode->pdev); in regnode_register()
491 return (regnode); in regnode_register()
495 regnode_resolve_parent(struct regnode *regnode) in regnode_resolve_parent() argument
499 if ((regnode->parent != NULL) || in regnode_resolve_parent()
500 (regnode->parent_name == NULL)) in regnode_resolve_parent()
503 regnode->parent = regnode_find_by_name(regnode->parent_name); in regnode_resolve_parent()
504 if (regnode->parent == NULL) in regnode_resolve_parent()
531 regnode_get_name(struct regnode *regnode) in regnode_get_name() argument
534 return (regnode->name); in regnode_get_name()
538 regnode_get_parent_name(struct regnode *regnode) in regnode_get_parent_name() argument
541 return (regnode->parent_name); in regnode_get_parent_name()
545 regnode_get_flags(struct regnode *regnode) in regnode_get_flags() argument
548 return (regnode->flags); in regnode_get_flags()
552 regnode_get_softc(struct regnode *regnode) in regnode_get_softc() argument
555 return (regnode->softc); in regnode_get_softc()
559 regnode_get_device(struct regnode *regnode) in regnode_get_device() argument
562 return (regnode->pdev); in regnode_get_device()
565 struct regnode_std_param *regnode_get_stdparam(struct regnode *regnode) in regnode_get_stdparam() argument
568 return (&regnode->std_param); in regnode_get_stdparam()
595 struct regnode *
596 regnode_get_parent(struct regnode *regnode) in regnode_get_parent() argument
602 rv = regnode_resolve_parent(regnode); in regnode_get_parent()
606 return (regnode->parent); in regnode_get_parent()
613 regnode_enable(struct regnode *regnode) in regnode_enable() argument
621 rv = regnode_resolve_parent(regnode); in regnode_enable()
624 if (regnode->parent != NULL) { in regnode_enable()
625 rv = regnode_enable(regnode->parent); in regnode_enable()
631 REGNODE_XLOCK(regnode); in regnode_enable()
632 if (regnode->enable_cnt == 0) { in regnode_enable()
633 rv = REGNODE_ENABLE(regnode, true, &udelay); in regnode_enable()
635 REGNODE_UNLOCK(regnode); in regnode_enable()
640 regnode->enable_cnt++; in regnode_enable()
641 REGNODE_UNLOCK(regnode); in regnode_enable()
649 regnode_disable(struct regnode *regnode) in regnode_disable() argument
657 REGNODE_XLOCK(regnode); in regnode_disable()
659 if (regnode->enable_cnt == 1 && in regnode_disable()
660 (regnode->flags & REGULATOR_FLAGS_NOT_DISABLE) == 0 && in regnode_disable()
661 !regnode->std_param.always_on) { in regnode_disable()
662 rv = REGNODE_ENABLE(regnode, false, &udelay); in regnode_disable()
664 REGNODE_UNLOCK(regnode); in regnode_disable()
669 regnode->enable_cnt--; in regnode_disable()
670 REGNODE_UNLOCK(regnode); in regnode_disable()
672 rv = regnode_resolve_parent(regnode); in regnode_disable()
675 if (regnode->parent != NULL) in regnode_disable()
676 rv = regnode_disable(regnode->parent); in regnode_disable()
684 regnode_stop(struct regnode *regnode, int depth) in regnode_stop() argument
692 REGNODE_XLOCK(regnode); in regnode_stop()
694 if ((regnode->enable_cnt != 0) && (depth == 0)) { in regnode_stop()
695 REGNODE_UNLOCK(regnode); in regnode_stop()
699 if ((regnode->enable_cnt == 0) && in regnode_stop()
700 ((regnode->flags & REGULATOR_FLAGS_NOT_DISABLE) == 0)) { in regnode_stop()
701 rv = REGNODE_STOP(regnode, &udelay); in regnode_stop()
703 REGNODE_UNLOCK(regnode); in regnode_stop()
708 REGNODE_UNLOCK(regnode); in regnode_stop()
710 rv = regnode_resolve_parent(regnode); in regnode_stop()
713 if (regnode->parent != NULL && regnode->parent->enable_cnt == 0) in regnode_stop()
714 rv = regnode_stop(regnode->parent, depth + 1); in regnode_stop()
722 regnode_status(struct regnode *regnode, int *status) in regnode_status() argument
728 REGNODE_XLOCK(regnode); in regnode_status()
729 rv = REGNODE_STATUS(regnode, status); in regnode_status()
730 REGNODE_UNLOCK(regnode); in regnode_status()
738 regnode_get_voltage(struct regnode *regnode, int *uvolt) in regnode_get_voltage() argument
744 REGNODE_XLOCK(regnode); in regnode_get_voltage()
745 rv = REGNODE_GET_VOLTAGE(regnode, uvolt); in regnode_get_voltage()
746 REGNODE_UNLOCK(regnode); in regnode_get_voltage()
750 rv = regnode_resolve_parent(regnode); in regnode_get_voltage()
753 if (regnode->parent != NULL) in regnode_get_voltage()
754 rv = regnode_get_voltage(regnode->parent, uvolt); in regnode_get_voltage()
764 regnode_set_voltage(struct regnode *regnode, int min_uvolt, int max_uvolt) in regnode_set_voltage() argument
771 REGNODE_XLOCK(regnode); in regnode_set_voltage()
773 rv = REGNODE_SET_VOLTAGE(regnode, min_uvolt, max_uvolt, &udelay); in regnode_set_voltage()
776 REGNODE_UNLOCK(regnode); in regnode_set_voltage()
784 regnode_set_voltage_checked(struct regnode *regnode, struct regulator *reg, in regnode_set_voltage_checked() argument
795 REGNODE_XLOCK(regnode); in regnode_set_voltage_checked()
797 if ((min_uvolt > regnode->std_param.max_uvolt) || in regnode_set_voltage_checked()
798 (max_uvolt < regnode->std_param.min_uvolt)) { in regnode_set_voltage_checked()
799 REGNODE_UNLOCK(regnode); in regnode_set_voltage_checked()
804 all_min_uvolt = regnode->std_param.min_uvolt; in regnode_set_voltage_checked()
805 all_max_uvolt = regnode->std_param.max_uvolt; in regnode_set_voltage_checked()
806 TAILQ_FOREACH(tmp, &regnode->consumers_list, link) { in regnode_set_voltage_checked()
819 REGNODE_UNLOCK(regnode); in regnode_set_voltage_checked()
829 rv = REGNODE_SET_VOLTAGE(regnode, min_uvolt, max_uvolt, &udelay); in regnode_set_voltage_checked()
831 REGNODE_UNLOCK(regnode); in regnode_set_voltage_checked()
836 regnode_set_constraint(struct regnode *regnode) in regnode_set_constraint() argument
840 if (regnode->std_param.boot_on != true && in regnode_set_constraint()
841 regnode->std_param.always_on != true) in regnode_set_constraint()
844 rv = regnode_status(regnode, &status); in regnode_set_constraint()
848 regnode_get_name(regnode)); in regnode_set_constraint()
855 rv = regnode_get_voltage(regnode, &uvolt); in regnode_set_constraint()
859 regnode_get_name(regnode)); in regnode_set_constraint()
863 if (uvolt < regnode->std_param.min_uvolt || in regnode_set_constraint()
864 uvolt > regnode->std_param.max_uvolt) { in regnode_set_constraint()
868 regnode_get_name(regnode), in regnode_set_constraint()
869 uvolt, regnode->std_param.min_uvolt, in regnode_set_constraint()
870 regnode->std_param.max_uvolt); in regnode_set_constraint()
874 rv = regnode_enable(regnode); in regnode_set_constraint()
878 regnode_get_name(regnode)); in regnode_set_constraint()
887 regnode_get_ofw_node(struct regnode *regnode) in regnode_get_ofw_node() argument
890 return (regnode->ofw_node); in regnode_get_ofw_node()
901 regulator_create(struct regnode *regnode, device_t cdev) in regulator_create() argument
910 reg->regnode = regnode; in regulator_create()
913 REGNODE_XLOCK(regnode); in regulator_create()
914 regnode->ref_cnt++; in regulator_create()
915 TAILQ_INSERT_TAIL(&regnode->consumers_list, reg, link); in regulator_create()
916 reg ->min_uvolt = regnode->std_param.min_uvolt; in regulator_create()
917 reg ->max_uvolt = regnode->std_param.max_uvolt; in regulator_create()
918 REGNODE_UNLOCK(regnode); in regulator_create()
927 struct regnode *regnode; in regulator_enable() local
929 regnode = reg->regnode; in regulator_enable()
930 KASSERT(regnode->ref_cnt > 0, in regulator_enable()
931 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_enable()
933 rv = regnode_enable(regnode); in regulator_enable()
944 struct regnode *regnode; in regulator_disable() local
946 regnode = reg->regnode; in regulator_disable()
947 KASSERT(regnode->ref_cnt > 0, in regulator_disable()
948 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_disable()
951 regnode->name)); in regulator_disable()
953 rv = regnode_disable(regnode); in regulator_disable()
964 struct regnode *regnode; in regulator_stop() local
966 regnode = reg->regnode; in regulator_stop()
967 KASSERT(regnode->ref_cnt > 0, in regulator_stop()
968 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_stop()
970 ("Attempt to stop already enabled regulator: %s\n", regnode->name)); in regulator_stop()
973 rv = regnode_stop(regnode, 0); in regulator_stop()
982 struct regnode *regnode; in regulator_status() local
984 regnode = reg->regnode; in regulator_status()
985 KASSERT(regnode->ref_cnt > 0, in regulator_status()
986 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_status()
993 rv = regnode_status(regnode, status); in regulator_status()
1002 struct regnode *regnode; in regulator_get_voltage() local
1004 regnode = reg->regnode; in regulator_get_voltage()
1005 KASSERT(regnode->ref_cnt > 0, in regulator_get_voltage()
1006 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_get_voltage()
1009 rv = regnode_get_voltage(regnode, uvolt); in regulator_get_voltage()
1017 struct regnode *regnode; in regulator_set_voltage() local
1020 regnode = reg->regnode; in regulator_set_voltage()
1021 KASSERT(regnode->ref_cnt > 0, in regulator_set_voltage()
1022 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_set_voltage()
1026 rv = regnode_set_voltage_checked(regnode, reg, min_uvolt, max_uvolt); in regulator_set_voltage()
1039 struct regnode *regnode; in regulator_check_voltage() local
1041 regnode = reg->regnode; in regulator_check_voltage()
1042 KASSERT(regnode->ref_cnt > 0, in regulator_check_voltage()
1043 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_check_voltage()
1046 rv = REGNODE_CHECK_VOLTAGE(regnode, uvolt); in regulator_check_voltage()
1054 struct regnode *regnode; in regulator_get_name() local
1056 regnode = reg->regnode; in regulator_get_name()
1057 KASSERT(regnode->ref_cnt > 0, in regulator_get_name()
1058 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_get_name()
1059 return (regnode->name); in regulator_get_name()
1065 struct regnode *regnode; in regulator_get_by_name() local
1068 regnode = regnode_find_by_name(name); in regulator_get_by_name()
1069 if (regnode == NULL) { in regulator_get_by_name()
1073 *reg = regulator_create(regnode, cdev); in regulator_get_by_name()
1081 struct regnode *regnode; in regulator_get_by_id() local
1085 regnode = regnode_find_by_id(pdev, id); in regulator_get_by_id()
1086 if (regnode == NULL) { in regulator_get_by_id()
1090 *reg = regulator_create(regnode, cdev); in regulator_get_by_id()
1099 struct regnode *regnode; in regulator_release() local
1101 regnode = reg->regnode; in regulator_release()
1102 KASSERT(regnode->ref_cnt > 0, in regulator_release()
1103 ("Attempt to access unreferenced regulator: %s\n", regnode->name)); in regulator_release()
1106 regnode_disable(regnode); in regulator_release()
1109 REGNODE_XLOCK(regnode); in regulator_release()
1110 TAILQ_REMOVE(&regnode->consumers_list, reg, link); in regulator_release()
1111 regnode->ref_cnt--; in regulator_release()
1112 REGNODE_UNLOCK(regnode); in regulator_release()