Lines Matching refs:edev

85 static int check_mutually_exclusive(struct extcon_dev *edev, u32 new_state)  in check_mutually_exclusive()  argument
89 if (!edev->mutually_exclusive) in check_mutually_exclusive()
92 for (i = 0; edev->mutually_exclusive[i]; i++) { in check_mutually_exclusive()
94 u32 correspondants = new_state & edev->mutually_exclusive[i]; in check_mutually_exclusive()
109 struct extcon_dev *edev = dev_get_drvdata(dev); in state_show() local
111 if (edev->print_state) { in state_show()
112 int ret = edev->print_state(edev, buf); in state_show()
119 if (edev->max_supported == 0) in state_show()
120 return sprintf(buf, "%u\n", edev->state); in state_show()
123 if (!edev->supported_cable[i]) in state_show()
126 edev->supported_cable[i], in state_show()
127 !!(edev->state & (1 << i))); in state_show()
138 struct extcon_dev *edev = dev_get_drvdata(dev); in state_store() local
144 ret = extcon_set_state(edev, state); in state_store()
156 struct extcon_dev *edev = dev_get_drvdata(dev); in name_show() local
159 if (edev->print_name) { in name_show()
160 int ret = edev->print_name(edev, buf); in name_show()
166 return sprintf(buf, "%s\n", dev_name(&edev->dev)); in name_show()
177 cable->edev->supported_cable[cable->cable_index]); in cable_name_show()
187 extcon_get_cable_state_(cable->edev, in cable_state_show()
206 int extcon_update_state(struct extcon_dev *edev, u32 mask, u32 state) in extcon_update_state() argument
216 spin_lock_irqsave(&edev->lock, flags); in extcon_update_state()
218 if (edev->state != ((edev->state & ~mask) | (state & mask))) { in extcon_update_state()
219 u32 old_state = edev->state; in extcon_update_state()
221 if (check_mutually_exclusive(edev, (edev->state & ~mask) | in extcon_update_state()
223 spin_unlock_irqrestore(&edev->lock, flags); in extcon_update_state()
227 edev->state &= ~mask; in extcon_update_state()
228 edev->state |= state & mask; in extcon_update_state()
230 raw_notifier_call_chain(&edev->nh, old_state, edev); in extcon_update_state()
234 length = name_show(&edev->dev, NULL, prop_buf); in extcon_update_state()
242 length = state_show(&edev->dev, NULL, prop_buf); in extcon_update_state()
252 spin_unlock_irqrestore(&edev->lock, flags); in extcon_update_state()
254 kobject_uevent_env(&edev->dev.kobj, KOBJ_CHANGE, envp); in extcon_update_state()
258 spin_unlock_irqrestore(&edev->lock, flags); in extcon_update_state()
260 dev_err(&edev->dev, "out of memory in extcon_set_state\n"); in extcon_update_state()
261 kobject_uevent(&edev->dev.kobj, KOBJ_CHANGE); in extcon_update_state()
265 spin_unlock_irqrestore(&edev->lock, flags); in extcon_update_state()
280 int extcon_set_state(struct extcon_dev *edev, u32 state) in extcon_set_state() argument
282 return extcon_update_state(edev, 0xffffffff, state); in extcon_set_state()
296 int extcon_find_cable_index(struct extcon_dev *edev, const char *cable_name) in extcon_find_cable_index() argument
300 if (edev->supported_cable) { in extcon_find_cable_index()
301 for (i = 0; edev->supported_cable[i]; i++) { in extcon_find_cable_index()
302 if (!strncmp(edev->supported_cable[i], in extcon_find_cable_index()
317 int extcon_get_cable_state_(struct extcon_dev *edev, int index) in extcon_get_cable_state_() argument
319 if (index < 0 || (edev->max_supported && edev->max_supported <= index)) in extcon_get_cable_state_()
322 return !!(edev->state & (1 << index)); in extcon_get_cable_state_()
333 int extcon_get_cable_state(struct extcon_dev *edev, const char *cable_name) in extcon_get_cable_state() argument
335 return extcon_get_cable_state_(edev, extcon_find_cable_index in extcon_get_cable_state()
336 (edev, cable_name)); in extcon_get_cable_state()
348 int extcon_set_cable_state_(struct extcon_dev *edev, in extcon_set_cable_state_() argument
353 if (index < 0 || (edev->max_supported && edev->max_supported <= index)) in extcon_set_cable_state_()
357 return extcon_update_state(edev, 1 << index, state); in extcon_set_cable_state_()
370 int extcon_set_cable_state(struct extcon_dev *edev, in extcon_set_cable_state() argument
373 return extcon_set_cable_state_(edev, extcon_find_cable_index in extcon_set_cable_state()
374 (edev, cable_name), cable_state); in extcon_set_cable_state()
403 struct extcon_dev *edev = ptr; in _call_per_cable() local
406 (edev->state & (1 << obj->cable_index))) { in _call_per_cable()
455 obj->edev = extcon_get_extcon_dev(extcon_name); in extcon_register_interest()
456 if (!obj->edev) in extcon_register_interest()
459 obj->cable_index = extcon_find_cable_index(obj->edev, in extcon_register_interest()
468 spin_lock_irqsave(&obj->edev->lock, flags); in extcon_register_interest()
469 ret = raw_notifier_chain_register(&obj->edev->nh, in extcon_register_interest()
471 spin_unlock_irqrestore(&obj->edev->lock, flags); in extcon_register_interest()
511 spin_lock_irqsave(&obj->edev->lock, flags); in extcon_unregister_interest()
512 ret = raw_notifier_chain_unregister(&obj->edev->nh, &obj->internal_nb); in extcon_unregister_interest()
513 spin_unlock_irqrestore(&obj->edev->lock, flags); in extcon_unregister_interest()
529 int extcon_register_notifier(struct extcon_dev *edev, in extcon_register_notifier() argument
535 spin_lock_irqsave(&edev->lock, flags); in extcon_register_notifier()
536 ret = raw_notifier_chain_register(&edev->nh, nb); in extcon_register_notifier()
537 spin_unlock_irqrestore(&edev->lock, flags); in extcon_register_notifier()
548 int extcon_unregister_notifier(struct extcon_dev *edev, in extcon_unregister_notifier() argument
554 spin_lock_irqsave(&edev->lock, flags); in extcon_unregister_notifier()
555 ret = raw_notifier_chain_unregister(&edev->nh, nb); in extcon_unregister_notifier()
556 spin_unlock_irqrestore(&edev->lock, flags); in extcon_unregister_notifier()
610 struct extcon_dev *edev; in extcon_dev_allocate() local
612 edev = kzalloc(sizeof(*edev), GFP_KERNEL); in extcon_dev_allocate()
613 if (!edev) in extcon_dev_allocate()
616 edev->max_supported = 0; in extcon_dev_allocate()
617 edev->supported_cable = supported_cable; in extcon_dev_allocate()
619 return edev; in extcon_dev_allocate()
626 void extcon_dev_free(struct extcon_dev *edev) in extcon_dev_free() argument
628 kfree(edev); in extcon_dev_free()
664 struct extcon_dev **ptr, *edev; in devm_extcon_dev_allocate() local
670 edev = extcon_dev_allocate(supported_cable); in devm_extcon_dev_allocate()
671 if (IS_ERR(edev)) { in devm_extcon_dev_allocate()
673 return edev; in devm_extcon_dev_allocate()
676 edev->dev.parent = dev; in devm_extcon_dev_allocate()
678 *ptr = edev; in devm_extcon_dev_allocate()
681 return edev; in devm_extcon_dev_allocate()
685 void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev) in devm_extcon_dev_free() argument
688 devm_extcon_dev_match, edev)); in devm_extcon_dev_free()
701 int extcon_dev_register(struct extcon_dev *edev) in extcon_dev_register() argument
711 if (edev->supported_cable) { in extcon_dev_register()
713 for (index = 0; edev->supported_cable[index]; index++) in extcon_dev_register()
715 edev->max_supported = index; in extcon_dev_register()
717 edev->max_supported = 0; in extcon_dev_register()
721 dev_err(&edev->dev, "extcon: maximum number of supported cables exceeded.\n"); in extcon_dev_register()
725 edev->dev.class = extcon_class; in extcon_dev_register()
726 edev->dev.release = extcon_dev_release; in extcon_dev_register()
728 edev->name = edev->name ? edev->name : dev_name(edev->dev.parent); in extcon_dev_register()
729 if (IS_ERR_OR_NULL(edev->name)) { in extcon_dev_register()
730 dev_err(&edev->dev, in extcon_dev_register()
734 dev_set_name(&edev->dev, "%s", edev->name); in extcon_dev_register()
736 if (edev->max_supported) { in extcon_dev_register()
741 edev->cables = kzalloc(sizeof(struct extcon_cable) * in extcon_dev_register()
742 edev->max_supported, GFP_KERNEL); in extcon_dev_register()
743 if (!edev->cables) { in extcon_dev_register()
747 for (index = 0; index < edev->max_supported; index++) { in extcon_dev_register()
748 cable = &edev->cables[index]; in extcon_dev_register()
755 cable = &edev->cables[index]; in extcon_dev_register()
764 cable->edev = edev; in extcon_dev_register()
784 if (edev->max_supported && edev->mutually_exclusive) { in extcon_dev_register()
789 for (index = 0; edev->mutually_exclusive[index]; index++) in extcon_dev_register()
792 edev->attrs_muex = kzalloc(sizeof(struct attribute *) * in extcon_dev_register()
794 if (!edev->attrs_muex) { in extcon_dev_register()
799 edev->d_attrs_muex = kzalloc(sizeof(struct device_attribute) * in extcon_dev_register()
801 if (!edev->d_attrs_muex) { in extcon_dev_register()
803 kfree(edev->attrs_muex); in extcon_dev_register()
807 for (index = 0; edev->mutually_exclusive[index]; index++) { in extcon_dev_register()
808 sprintf(buf, "0x%x", edev->mutually_exclusive[index]); in extcon_dev_register()
813 kfree(edev->d_attrs_muex[index].attr. in extcon_dev_register()
816 kfree(edev->d_attrs_muex); in extcon_dev_register()
817 kfree(edev->attrs_muex); in extcon_dev_register()
822 sysfs_attr_init(&edev->d_attrs_muex[index].attr); in extcon_dev_register()
823 edev->d_attrs_muex[index].attr.name = name; in extcon_dev_register()
824 edev->d_attrs_muex[index].attr.mode = 0000; in extcon_dev_register()
825 edev->attrs_muex[index] = &edev->d_attrs_muex[index] in extcon_dev_register()
828 edev->attr_g_muex.name = muex_name; in extcon_dev_register()
829 edev->attr_g_muex.attrs = edev->attrs_muex; in extcon_dev_register()
833 if (edev->max_supported) { in extcon_dev_register()
834 edev->extcon_dev_type.groups = in extcon_dev_register()
836 (edev->max_supported + 2), GFP_KERNEL); in extcon_dev_register()
837 if (!edev->extcon_dev_type.groups) { in extcon_dev_register()
842 edev->extcon_dev_type.name = dev_name(&edev->dev); in extcon_dev_register()
843 edev->extcon_dev_type.release = dummy_sysfs_dev_release; in extcon_dev_register()
845 for (index = 0; index < edev->max_supported; index++) in extcon_dev_register()
846 edev->extcon_dev_type.groups[index] = in extcon_dev_register()
847 &edev->cables[index].attr_g; in extcon_dev_register()
848 if (edev->mutually_exclusive) in extcon_dev_register()
849 edev->extcon_dev_type.groups[index] = in extcon_dev_register()
850 &edev->attr_g_muex; in extcon_dev_register()
852 edev->dev.type = &edev->extcon_dev_type; in extcon_dev_register()
855 ret = device_register(&edev->dev); in extcon_dev_register()
857 put_device(&edev->dev); in extcon_dev_register()
862 ret = class_compat_create_link(switch_class, &edev->dev, NULL); in extcon_dev_register()
865 spin_lock_init(&edev->lock); in extcon_dev_register()
867 RAW_INIT_NOTIFIER_HEAD(&edev->nh); in extcon_dev_register()
869 dev_set_drvdata(&edev->dev, edev); in extcon_dev_register()
870 edev->state = 0; in extcon_dev_register()
873 list_add(&edev->entry, &extcon_dev_list); in extcon_dev_register()
879 if (edev->max_supported) in extcon_dev_register()
880 kfree(edev->extcon_dev_type.groups); in extcon_dev_register()
882 if (edev->max_supported && edev->mutually_exclusive) { in extcon_dev_register()
883 for (index = 0; edev->mutually_exclusive[index]; index++) in extcon_dev_register()
884 kfree(edev->d_attrs_muex[index].attr.name); in extcon_dev_register()
885 kfree(edev->d_attrs_muex); in extcon_dev_register()
886 kfree(edev->attrs_muex); in extcon_dev_register()
889 for (index = 0; index < edev->max_supported; index++) in extcon_dev_register()
890 kfree(edev->cables[index].attr_g.name); in extcon_dev_register()
892 if (edev->max_supported) in extcon_dev_register()
893 kfree(edev->cables); in extcon_dev_register()
906 void extcon_dev_unregister(struct extcon_dev *edev) in extcon_dev_unregister() argument
911 list_del(&edev->entry); in extcon_dev_unregister()
914 if (IS_ERR_OR_NULL(get_device(&edev->dev))) { in extcon_dev_unregister()
915 dev_err(&edev->dev, "Failed to unregister extcon_dev (%s)\n", in extcon_dev_unregister()
916 dev_name(&edev->dev)); in extcon_dev_unregister()
920 device_unregister(&edev->dev); in extcon_dev_unregister()
922 if (edev->mutually_exclusive && edev->max_supported) { in extcon_dev_unregister()
923 for (index = 0; edev->mutually_exclusive[index]; in extcon_dev_unregister()
925 kfree(edev->d_attrs_muex[index].attr.name); in extcon_dev_unregister()
926 kfree(edev->d_attrs_muex); in extcon_dev_unregister()
927 kfree(edev->attrs_muex); in extcon_dev_unregister()
930 for (index = 0; index < edev->max_supported; index++) in extcon_dev_unregister()
931 kfree(edev->cables[index].attr_g.name); in extcon_dev_unregister()
933 if (edev->max_supported) { in extcon_dev_unregister()
934 kfree(edev->extcon_dev_type.groups); in extcon_dev_unregister()
935 kfree(edev->cables); in extcon_dev_unregister()
940 class_compat_remove_link(switch_class, &edev->dev, NULL); in extcon_dev_unregister()
942 put_device(&edev->dev); in extcon_dev_unregister()
966 int devm_extcon_dev_register(struct device *dev, struct extcon_dev *edev) in devm_extcon_dev_register() argument
975 ret = extcon_dev_register(edev); in devm_extcon_dev_register()
981 *ptr = edev; in devm_extcon_dev_register()
996 void devm_extcon_dev_unregister(struct device *dev, struct extcon_dev *edev) in devm_extcon_dev_unregister() argument
999 devm_extcon_dev_match, edev)); in devm_extcon_dev_unregister()
1014 struct extcon_dev *edev; in extcon_get_edev_by_phandle() local
1029 list_for_each_entry(edev, &extcon_dev_list, entry) { in extcon_get_edev_by_phandle()
1030 if (edev->dev.parent && edev->dev.parent->of_node == node) { in extcon_get_edev_by_phandle()
1032 return edev; in extcon_get_edev_by_phandle()