Lines Matching refs:pwm
35 static struct pwm_device *pwm_to_device(unsigned int pwm) in pwm_to_device() argument
37 return radix_tree_lookup(&pwm_tree, pwm); in pwm_to_device()
58 struct pwm_device *pwm = &chip->pwms[i]; in free_pwms() local
60 radix_tree_delete(&pwm_tree, pwm->pwm); in free_pwms()
92 static int pwm_device_request(struct pwm_device *pwm, const char *label) in pwm_device_request() argument
96 if (test_bit(PWMF_REQUESTED, &pwm->flags)) in pwm_device_request()
99 if (!try_module_get(pwm->chip->ops->owner)) in pwm_device_request()
102 if (pwm->chip->ops->request) { in pwm_device_request()
103 err = pwm->chip->ops->request(pwm->chip, pwm); in pwm_device_request()
105 module_put(pwm->chip->ops->owner); in pwm_device_request()
110 if (pwm->chip->ops->get_state) { in pwm_device_request()
111 pwm->chip->ops->get_state(pwm->chip, pwm, &pwm->state); in pwm_device_request()
112 trace_pwm_get(pwm, &pwm->state); in pwm_device_request()
115 pwm->last = pwm->state; in pwm_device_request()
118 set_bit(PWMF_REQUESTED, &pwm->flags); in pwm_device_request()
119 pwm->label = label; in pwm_device_request()
127 struct pwm_device *pwm; in of_pwm_xlate_with_flags() local
139 pwm = pwm_request_from_chip(pc, args->args[0], NULL); in of_pwm_xlate_with_flags()
140 if (IS_ERR(pwm)) in of_pwm_xlate_with_flags()
141 return pwm; in of_pwm_xlate_with_flags()
143 pwm->args.period = args->args[1]; in of_pwm_xlate_with_flags()
144 pwm->args.polarity = PWM_POLARITY_NORMAL; in of_pwm_xlate_with_flags()
148 pwm->args.polarity = PWM_POLARITY_INVERSED; in of_pwm_xlate_with_flags()
151 return pwm; in of_pwm_xlate_with_flags()
187 int pwm_set_chip_data(struct pwm_device *pwm, void *data) in pwm_set_chip_data() argument
189 if (!pwm) in pwm_set_chip_data()
192 pwm->chip_data = data; in pwm_set_chip_data()
204 void *pwm_get_chip_data(struct pwm_device *pwm) in pwm_get_chip_data() argument
206 return pwm ? pwm->chip_data : NULL; in pwm_get_chip_data()
244 struct pwm_device *pwm; in pwmchip_add() local
262 chip->pwms = kcalloc(chip->npwm, sizeof(*pwm), GFP_KERNEL); in pwmchip_add()
269 pwm = &chip->pwms[i]; in pwmchip_add()
271 pwm->chip = chip; in pwmchip_add()
272 pwm->pwm = chip->base + i; in pwmchip_add()
273 pwm->hwpwm = i; in pwmchip_add()
275 radix_tree_insert(&pwm_tree, pwm->pwm, pwm); in pwmchip_add()
353 struct pwm_device *pwm_request(int pwm, const char *label) in pwm_request() argument
358 if (pwm < 0 || pwm >= MAX_PWMS) in pwm_request()
363 dev = pwm_to_device(pwm); in pwm_request()
394 struct pwm_device *pwm; in pwm_request_from_chip() local
401 pwm = &chip->pwms[index]; in pwm_request_from_chip()
403 err = pwm_device_request(pwm, label); in pwm_request_from_chip()
405 pwm = ERR_PTR(err); in pwm_request_from_chip()
408 return pwm; in pwm_request_from_chip()
418 void pwm_free(struct pwm_device *pwm) in pwm_free() argument
420 pwm_put(pwm); in pwm_free()
424 static void pwm_apply_state_debug(struct pwm_device *pwm, in pwm_apply_state_debug() argument
427 struct pwm_state *last = &pwm->last; in pwm_apply_state_debug()
428 struct pwm_chip *chip = pwm->chip; in pwm_apply_state_debug()
444 chip->ops->get_state(chip, pwm, &s1); in pwm_apply_state_debug()
445 trace_pwm_get(pwm, &s1); in pwm_apply_state_debug()
500 err = chip->ops->apply(chip, pwm, &s1); in pwm_apply_state_debug()
507 trace_pwm_apply(pwm, &s1); in pwm_apply_state_debug()
509 chip->ops->get_state(chip, pwm, last); in pwm_apply_state_debug()
510 trace_pwm_get(pwm, last); in pwm_apply_state_debug()
530 int pwm_apply_state(struct pwm_device *pwm, const struct pwm_state *state) in pwm_apply_state() argument
544 if (!pwm || !state || !state->period || in pwm_apply_state()
548 chip = pwm->chip; in pwm_apply_state()
550 if (state->period == pwm->state.period && in pwm_apply_state()
551 state->duty_cycle == pwm->state.duty_cycle && in pwm_apply_state()
552 state->polarity == pwm->state.polarity && in pwm_apply_state()
553 state->enabled == pwm->state.enabled && in pwm_apply_state()
554 state->usage_power == pwm->state.usage_power) in pwm_apply_state()
558 err = chip->ops->apply(chip, pwm, state); in pwm_apply_state()
562 trace_pwm_apply(pwm, state); in pwm_apply_state()
564 pwm->state = *state; in pwm_apply_state()
570 pwm_apply_state_debug(pwm, state); in pwm_apply_state()
575 if (state->polarity != pwm->state.polarity) { in pwm_apply_state()
584 if (pwm->state.enabled) { in pwm_apply_state()
585 chip->ops->disable(chip, pwm); in pwm_apply_state()
586 pwm->state.enabled = false; in pwm_apply_state()
589 err = chip->ops->set_polarity(chip, pwm, in pwm_apply_state()
594 pwm->state.polarity = state->polarity; in pwm_apply_state()
597 if (state->period != pwm->state.period || in pwm_apply_state()
598 state->duty_cycle != pwm->state.duty_cycle) { in pwm_apply_state()
599 err = chip->ops->config(pwm->chip, pwm, in pwm_apply_state()
605 pwm->state.duty_cycle = state->duty_cycle; in pwm_apply_state()
606 pwm->state.period = state->period; in pwm_apply_state()
609 if (state->enabled != pwm->state.enabled) { in pwm_apply_state()
611 err = chip->ops->enable(chip, pwm); in pwm_apply_state()
615 chip->ops->disable(chip, pwm); in pwm_apply_state()
618 pwm->state.enabled = state->enabled; in pwm_apply_state()
634 int pwm_capture(struct pwm_device *pwm, struct pwm_capture *result, in pwm_capture() argument
639 if (!pwm || !pwm->chip->ops) in pwm_capture()
642 if (!pwm->chip->ops->capture) in pwm_capture()
646 err = pwm->chip->ops->capture(pwm->chip, pwm, result, timeout); in pwm_capture()
661 int pwm_adjust_config(struct pwm_device *pwm) in pwm_adjust_config() argument
666 pwm_get_args(pwm, &pargs); in pwm_adjust_config()
667 pwm_get_state(pwm, &state); in pwm_adjust_config()
682 return pwm_apply_state(pwm, &state); in pwm_adjust_config()
705 return pwm_apply_state(pwm, &state); in pwm_adjust_config()
727 struct pwm_device *pwm) in pwm_device_link_add() argument
737 dev_warn(pwm->chip->dev, in pwm_device_link_add()
742 dl = device_link_add(dev, pwm->chip->dev, DL_FLAG_AUTOREMOVE_CONSUMER); in pwm_device_link_add()
745 dev_name(pwm->chip->dev)); in pwm_device_link_add()
775 struct pwm_device *pwm = NULL; in of_pwm_get() local
800 pwm = ERR_CAST(pc); in of_pwm_get()
804 pwm = pc->of_xlate(pc, &args); in of_pwm_get()
805 if (IS_ERR(pwm)) in of_pwm_get()
808 dl = pwm_device_link_add(dev, pwm); in of_pwm_get()
811 pwm_free(pwm); in of_pwm_get()
812 pwm = ERR_CAST(dl); in of_pwm_get()
828 pwm->label = con_id; in of_pwm_get()
833 return pwm; in of_pwm_get()
856 struct pwm_device *pwm; in acpi_pwm_get() local
874 pwm = pwm_request_from_chip(chip, args.args[0], NULL); in acpi_pwm_get()
875 if (IS_ERR(pwm)) in acpi_pwm_get()
876 return pwm; in acpi_pwm_get()
878 pwm->args.period = args.args[1]; in acpi_pwm_get()
879 pwm->args.polarity = PWM_POLARITY_NORMAL; in acpi_pwm_get()
882 pwm->args.polarity = PWM_POLARITY_INVERSED; in acpi_pwm_get()
884 return pwm; in acpi_pwm_get()
940 struct pwm_device *pwm; in pwm_get() local
954 pwm = acpi_pwm_get(fwnode); in pwm_get()
955 if (!IS_ERR(pwm) || PTR_ERR(pwm) != -ENOENT) in pwm_get()
956 return pwm; in pwm_get()
1030 pwm = pwm_request_from_chip(chip, chosen->index, con_id ?: dev_id); in pwm_get()
1031 if (IS_ERR(pwm)) in pwm_get()
1032 return pwm; in pwm_get()
1034 dl = pwm_device_link_add(dev, pwm); in pwm_get()
1036 pwm_free(pwm); in pwm_get()
1040 pwm->args.period = chosen->period; in pwm_get()
1041 pwm->args.polarity = chosen->polarity; in pwm_get()
1043 return pwm; in pwm_get()
1051 void pwm_put(struct pwm_device *pwm) in pwm_put() argument
1053 if (!pwm) in pwm_put()
1058 if (!test_and_clear_bit(PWMF_REQUESTED, &pwm->flags)) { in pwm_put()
1063 if (pwm->chip->ops->free) in pwm_put()
1064 pwm->chip->ops->free(pwm->chip, pwm); in pwm_put()
1066 pwm_set_chip_data(pwm, NULL); in pwm_put()
1067 pwm->label = NULL; in pwm_put()
1069 module_put(pwm->chip->ops->owner); in pwm_put()
1075 static void devm_pwm_release(void *pwm) in devm_pwm_release() argument
1077 pwm_put(pwm); in devm_pwm_release()
1093 struct pwm_device *pwm; in devm_pwm_get() local
1096 pwm = pwm_get(dev, con_id); in devm_pwm_get()
1097 if (IS_ERR(pwm)) in devm_pwm_get()
1098 return pwm; in devm_pwm_get()
1100 ret = devm_add_action_or_reset(dev, devm_pwm_release, pwm); in devm_pwm_get()
1104 return pwm; in devm_pwm_get()
1123 struct pwm_device *pwm; in devm_of_pwm_get() local
1126 pwm = of_pwm_get(dev, np, con_id); in devm_of_pwm_get()
1127 if (IS_ERR(pwm)) in devm_of_pwm_get()
1128 return pwm; in devm_of_pwm_get()
1130 ret = devm_add_action_or_reset(dev, devm_pwm_release, pwm); in devm_of_pwm_get()
1134 return pwm; in devm_of_pwm_get()
1154 struct pwm_device *pwm = ERR_PTR(-ENODEV); in devm_fwnode_pwm_get() local
1158 pwm = of_pwm_get(dev, to_of_node(fwnode), con_id); in devm_fwnode_pwm_get()
1160 pwm = acpi_pwm_get(fwnode); in devm_fwnode_pwm_get()
1161 if (IS_ERR(pwm)) in devm_fwnode_pwm_get()
1162 return pwm; in devm_fwnode_pwm_get()
1164 ret = devm_add_action_or_reset(dev, devm_pwm_release, pwm); in devm_fwnode_pwm_get()
1168 return pwm; in devm_fwnode_pwm_get()
1178 struct pwm_device *pwm = &chip->pwms[i]; in pwm_dbg_show() local
1181 pwm_get_state(pwm, &state); in pwm_dbg_show()
1183 seq_printf(s, " pwm-%-3d (%-20.20s):", i, pwm->label); in pwm_dbg_show()
1185 if (test_bit(PWMF_REQUESTED, &pwm->flags)) in pwm_dbg_show()