Lines Matching +full:parent +full:- +full:child

1 // SPDX-License-Identifier: GPL-2.0-or-later
18 struct device child; member
24 static struct pwm_export *child_to_pwm_export(struct device *child) in child_to_pwm_export() argument
26 return container_of(child, struct pwm_export, child); in child_to_pwm_export()
29 static struct pwm_device *child_to_pwm_device(struct device *child) in child_to_pwm_device() argument
31 struct pwm_export *export = child_to_pwm_export(child); in child_to_pwm_device()
33 return export->pwm; in child_to_pwm_device()
36 static ssize_t period_show(struct device *child, in period_show() argument
40 const struct pwm_device *pwm = child_to_pwm_device(child); in period_show()
48 static ssize_t period_store(struct device *child, in period_store() argument
52 struct pwm_export *export = child_to_pwm_export(child); in period_store()
53 struct pwm_device *pwm = export->pwm; in period_store()
62 mutex_lock(&export->lock); in period_store()
66 mutex_unlock(&export->lock); in period_store()
71 static ssize_t duty_cycle_show(struct device *child, in duty_cycle_show() argument
75 const struct pwm_device *pwm = child_to_pwm_device(child); in duty_cycle_show()
83 static ssize_t duty_cycle_store(struct device *child, in duty_cycle_store() argument
87 struct pwm_export *export = child_to_pwm_export(child); in duty_cycle_store()
88 struct pwm_device *pwm = export->pwm; in duty_cycle_store()
97 mutex_lock(&export->lock); in duty_cycle_store()
101 mutex_unlock(&export->lock); in duty_cycle_store()
106 static ssize_t enable_show(struct device *child, in enable_show() argument
110 const struct pwm_device *pwm = child_to_pwm_device(child); in enable_show()
118 static ssize_t enable_store(struct device *child, in enable_store() argument
122 struct pwm_export *export = child_to_pwm_export(child); in enable_store()
123 struct pwm_device *pwm = export->pwm; in enable_store()
131 mutex_lock(&export->lock); in enable_store()
143 ret = -EINVAL; in enable_store()
150 mutex_unlock(&export->lock); in enable_store()
154 static ssize_t polarity_show(struct device *child, in polarity_show() argument
158 const struct pwm_device *pwm = child_to_pwm_device(child); in polarity_show()
177 static ssize_t polarity_store(struct device *child, in polarity_store() argument
181 struct pwm_export *export = child_to_pwm_export(child); in polarity_store()
182 struct pwm_device *pwm = export->pwm; in polarity_store()
192 return -EINVAL; in polarity_store()
194 mutex_lock(&export->lock); in polarity_store()
198 mutex_unlock(&export->lock); in polarity_store()
203 static ssize_t capture_show(struct device *child, in capture_show() argument
207 struct pwm_device *pwm = child_to_pwm_device(child); in capture_show()
234 static void pwm_export_release(struct device *child) in pwm_export_release() argument
236 struct pwm_export *export = child_to_pwm_export(child); in pwm_export_release()
241 static int pwm_export_child(struct device *parent, struct pwm_device *pwm) in pwm_export_child() argument
247 if (test_and_set_bit(PWMF_EXPORTED, &pwm->flags)) in pwm_export_child()
248 return -EBUSY; in pwm_export_child()
252 clear_bit(PWMF_EXPORTED, &pwm->flags); in pwm_export_child()
253 return -ENOMEM; in pwm_export_child()
256 export->pwm = pwm; in pwm_export_child()
257 mutex_init(&export->lock); in pwm_export_child()
259 export->child.release = pwm_export_release; in pwm_export_child()
260 export->child.parent = parent; in pwm_export_child()
261 export->child.devt = MKDEV(0, 0); in pwm_export_child()
262 export->child.groups = pwm_groups; in pwm_export_child()
263 dev_set_name(&export->child, "pwm%u", pwm->hwpwm); in pwm_export_child()
265 ret = device_register(&export->child); in pwm_export_child()
267 clear_bit(PWMF_EXPORTED, &pwm->flags); in pwm_export_child()
268 put_device(&export->child); in pwm_export_child()
272 pwm_prop[0] = kasprintf(GFP_KERNEL, "EXPORT=pwm%u", pwm->hwpwm); in pwm_export_child()
274 kobject_uevent_env(&parent->kobj, KOBJ_CHANGE, pwm_prop); in pwm_export_child()
280 static int pwm_unexport_match(struct device *child, void *data) in pwm_unexport_match() argument
282 return child_to_pwm_device(child) == data; in pwm_unexport_match()
285 static int pwm_unexport_child(struct device *parent, struct pwm_device *pwm) in pwm_unexport_child() argument
287 struct device *child; in pwm_unexport_child() local
290 if (!test_and_clear_bit(PWMF_EXPORTED, &pwm->flags)) in pwm_unexport_child()
291 return -ENODEV; in pwm_unexport_child()
293 child = device_find_child(parent, pwm, pwm_unexport_match); in pwm_unexport_child()
294 if (!child) in pwm_unexport_child()
295 return -ENODEV; in pwm_unexport_child()
297 pwm_prop[0] = kasprintf(GFP_KERNEL, "UNEXPORT=pwm%u", pwm->hwpwm); in pwm_unexport_child()
299 kobject_uevent_env(&parent->kobj, KOBJ_CHANGE, pwm_prop); in pwm_unexport_child()
303 put_device(child); in pwm_unexport_child()
304 device_unregister(child); in pwm_unexport_child()
310 static ssize_t export_store(struct device *parent, in export_store() argument
314 struct pwm_chip *chip = dev_get_drvdata(parent); in export_store()
323 if (hwpwm >= chip->npwm) in export_store()
324 return -ENODEV; in export_store()
330 ret = pwm_export_child(parent, pwm); in export_store()
338 static ssize_t unexport_store(struct device *parent, in unexport_store() argument
342 struct pwm_chip *chip = dev_get_drvdata(parent); in unexport_store()
350 if (hwpwm >= chip->npwm) in unexport_store()
351 return -ENODEV; in unexport_store()
353 ret = pwm_unexport_child(parent, &chip->pwms[hwpwm]); in unexport_store()
359 static ssize_t npwm_show(struct device *parent, struct device_attribute *attr, in npwm_show() argument
362 const struct pwm_chip *chip = dev_get_drvdata(parent); in npwm_show()
364 return sprintf(buf, "%u\n", chip->npwm); in npwm_show()
376 /* takes export->lock on success */
377 static struct pwm_export *pwm_class_get_state(struct device *parent, in pwm_class_get_state() argument
381 struct device *child; in pwm_class_get_state() local
384 if (!test_bit(PWMF_EXPORTED, &pwm->flags)) in pwm_class_get_state()
387 child = device_find_child(parent, pwm, pwm_unexport_match); in pwm_class_get_state()
388 if (!child) in pwm_class_get_state()
391 export = child_to_pwm_export(child); in pwm_class_get_state()
392 put_device(child); /* for device_find_child() */ in pwm_class_get_state()
394 mutex_lock(&export->lock); in pwm_class_get_state()
407 mutex_unlock(&export->lock); in pwm_class_apply_state()
412 static int pwm_class_resume_npwm(struct device *parent, unsigned int npwm) in pwm_class_resume_npwm() argument
414 struct pwm_chip *chip = dev_get_drvdata(parent); in pwm_class_resume_npwm()
419 struct pwm_device *pwm = &chip->pwms[i]; in pwm_class_resume_npwm()
423 export = pwm_class_get_state(parent, pwm, &state); in pwm_class_resume_npwm()
427 state.enabled = export->suspend.enabled; in pwm_class_resume_npwm()
436 static int __maybe_unused pwm_class_suspend(struct device *parent) in pwm_class_suspend() argument
438 struct pwm_chip *chip = dev_get_drvdata(parent); in pwm_class_suspend()
442 for (i = 0; i < chip->npwm; i++) { in pwm_class_suspend()
443 struct pwm_device *pwm = &chip->pwms[i]; in pwm_class_suspend()
447 export = pwm_class_get_state(parent, pwm, &state); in pwm_class_suspend()
451 export->suspend = state; in pwm_class_suspend()
459 pwm_class_resume_npwm(parent, i); in pwm_class_suspend()
467 static int __maybe_unused pwm_class_resume(struct device *parent) in pwm_class_resume() argument
469 struct pwm_chip *chip = dev_get_drvdata(parent); in pwm_class_resume()
471 return pwm_class_resume_npwm(parent, chip->npwm); in pwm_class_resume()
483 static int pwmchip_sysfs_match(struct device *parent, const void *data) in pwmchip_sysfs_match() argument
485 return dev_get_drvdata(parent) == data; in pwmchip_sysfs_match()
490 struct device *parent; in pwmchip_sysfs_export() local
496 parent = device_create(&pwm_class, chip->dev, MKDEV(0, 0), chip, in pwmchip_sysfs_export()
497 "pwmchip%d", chip->base); in pwmchip_sysfs_export()
498 if (IS_ERR(parent)) { in pwmchip_sysfs_export()
499 dev_warn(chip->dev, in pwmchip_sysfs_export()
506 struct device *parent; in pwmchip_sysfs_unexport() local
509 parent = class_find_device(&pwm_class, NULL, chip, in pwmchip_sysfs_unexport()
511 if (!parent) in pwmchip_sysfs_unexport()
514 for (i = 0; i < chip->npwm; i++) { in pwmchip_sysfs_unexport()
515 struct pwm_device *pwm = &chip->pwms[i]; in pwmchip_sysfs_unexport()
517 if (test_bit(PWMF_EXPORTED, &pwm->flags)) in pwmchip_sysfs_unexport()
518 pwm_unexport_child(parent, pwm); in pwmchip_sysfs_unexport()
521 put_device(parent); in pwmchip_sysfs_unexport()
522 device_unregister(parent); in pwmchip_sysfs_unexport()