Lines Matching refs:edev
97 static int check_mutually_exclusive(struct extcon_dev *edev, u32 new_state) in check_mutually_exclusive() argument
101 if (!edev->mutually_exclusive) in check_mutually_exclusive()
104 for (i = 0; edev->mutually_exclusive[i]; i++) { in check_mutually_exclusive()
106 u32 correspondants = new_state & edev->mutually_exclusive[i]; in check_mutually_exclusive()
117 static int find_cable_index_by_id(struct extcon_dev *edev, const unsigned int id) in find_cable_index_by_id() argument
122 for (i = 0; i < edev->max_supported; i++) { in find_cable_index_by_id()
123 if (edev->supported_cable[i] == id) in find_cable_index_by_id()
130 static int find_cable_id_by_name(struct extcon_dev *edev, const char *name) in find_cable_id_by_name() argument
147 static int find_cable_index_by_name(struct extcon_dev *edev, const char *name) in find_cable_index_by_name() argument
151 if (edev->max_supported == 0) in find_cable_index_by_name()
155 id = find_cable_id_by_name(edev, name); in find_cable_index_by_name()
159 return find_cable_index_by_id(edev, id); in find_cable_index_by_name()
176 struct extcon_dev *edev = dev_get_drvdata(dev); in state_show() local
178 if (edev->max_supported == 0) in state_show()
179 return sprintf(buf, "%u\n", edev->state); in state_show()
181 for (i = 0; i < edev->max_supported; i++) { in state_show()
183 extcon_name[edev->supported_cable[i]], in state_show()
184 !!(edev->state & (1 << i))); in state_show()
195 struct extcon_dev *edev = dev_get_drvdata(dev); in state_store() local
201 ret = extcon_set_state(edev, state); in state_store()
213 struct extcon_dev *edev = dev_get_drvdata(dev); in name_show() local
215 return sprintf(buf, "%s\n", edev->name); in name_show()
227 extcon_name[cable->edev->supported_cable[i]]); in cable_name_show()
239 extcon_get_cable_state_(cable->edev, in cable_state_show()
240 cable->edev->supported_cable[i])); in cable_state_show()
258 int extcon_update_state(struct extcon_dev *edev, u32 mask, u32 state) in extcon_update_state() argument
270 if (!edev) in extcon_update_state()
273 spin_lock_irqsave(&edev->lock, flags); in extcon_update_state()
275 if (edev->state != ((edev->state & ~mask) | (state & mask))) { in extcon_update_state()
278 if (check_mutually_exclusive(edev, (edev->state & ~mask) | in extcon_update_state()
280 spin_unlock_irqrestore(&edev->lock, flags); in extcon_update_state()
284 old_state = edev->state; in extcon_update_state()
285 edev->state &= ~mask; in extcon_update_state()
286 edev->state |= state & mask; in extcon_update_state()
288 for (index = 0; index < edev->max_supported; index++) { in extcon_update_state()
289 if (is_extcon_changed(old_state, edev->state, index, in extcon_update_state()
291 raw_notifier_call_chain(&edev->nh[index], in extcon_update_state()
292 attached, edev); in extcon_update_state()
298 length = name_show(&edev->dev, NULL, prop_buf); in extcon_update_state()
306 length = state_show(&edev->dev, NULL, prop_buf); in extcon_update_state()
316 spin_unlock_irqrestore(&edev->lock, flags); in extcon_update_state()
318 kobject_uevent_env(&edev->dev.kobj, KOBJ_CHANGE, envp); in extcon_update_state()
322 spin_unlock_irqrestore(&edev->lock, flags); in extcon_update_state()
324 dev_err(&edev->dev, "out of memory in extcon_set_state\n"); in extcon_update_state()
325 kobject_uevent(&edev->dev.kobj, KOBJ_CHANGE); in extcon_update_state()
329 spin_unlock_irqrestore(&edev->lock, flags); in extcon_update_state()
344 int extcon_set_state(struct extcon_dev *edev, u32 state) in extcon_set_state() argument
346 if (!edev) in extcon_set_state()
349 return extcon_update_state(edev, 0xffffffff, state); in extcon_set_state()
358 int extcon_get_cable_state_(struct extcon_dev *edev, const unsigned int id) in extcon_get_cable_state_() argument
362 if (!edev) in extcon_get_cable_state_()
365 index = find_cable_index_by_id(edev, id); in extcon_get_cable_state_()
369 if (edev->max_supported && edev->max_supported <= index) in extcon_get_cable_state_()
372 return !!(edev->state & (1 << index)); in extcon_get_cable_state_()
383 int extcon_get_cable_state(struct extcon_dev *edev, const char *cable_name) in extcon_get_cable_state() argument
387 id = find_cable_id_by_name(edev, cable_name); in extcon_get_cable_state()
391 return extcon_get_cable_state_(edev, id); in extcon_get_cable_state()
403 int extcon_set_cable_state_(struct extcon_dev *edev, unsigned int id, in extcon_set_cable_state_() argument
409 if (!edev) in extcon_set_cable_state_()
412 index = find_cable_index_by_id(edev, id); in extcon_set_cable_state_()
416 if (edev->max_supported && edev->max_supported <= index) in extcon_set_cable_state_()
420 return extcon_update_state(edev, 1 << index, state); in extcon_set_cable_state_()
433 int extcon_set_cable_state(struct extcon_dev *edev, in extcon_set_cable_state() argument
438 id = find_cable_id_by_name(edev, cable_name); in extcon_set_cable_state()
442 return extcon_set_cable_state_(edev, id, cable_state); in extcon_set_cable_state()
503 obj->edev = extcon_get_extcon_dev(extcon_name); in extcon_register_interest()
504 if (!obj->edev) in extcon_register_interest()
507 obj->cable_index = find_cable_index_by_name(obj->edev, in extcon_register_interest()
514 spin_lock_irqsave(&obj->edev->lock, flags); in extcon_register_interest()
516 &obj->edev->nh[obj->cable_index], in extcon_register_interest()
518 spin_unlock_irqrestore(&obj->edev->lock, flags); in extcon_register_interest()
559 spin_lock_irqsave(&obj->edev->lock, flags); in extcon_unregister_interest()
561 &obj->edev->nh[obj->cable_index], obj->user_nb); in extcon_unregister_interest()
562 spin_unlock_irqrestore(&obj->edev->lock, flags); in extcon_unregister_interest()
579 int extcon_register_notifier(struct extcon_dev *edev, unsigned int id, in extcon_register_notifier() argument
585 if (!edev || !nb) in extcon_register_notifier()
588 idx = find_cable_index_by_id(edev, id); in extcon_register_notifier()
590 spin_lock_irqsave(&edev->lock, flags); in extcon_register_notifier()
591 ret = raw_notifier_chain_register(&edev->nh[idx], nb); in extcon_register_notifier()
592 spin_unlock_irqrestore(&edev->lock, flags); in extcon_register_notifier()
604 int extcon_unregister_notifier(struct extcon_dev *edev, unsigned int id, in extcon_unregister_notifier() argument
610 if (!edev || !nb) in extcon_unregister_notifier()
613 idx = find_cable_index_by_id(edev, id); in extcon_unregister_notifier()
615 spin_lock_irqsave(&edev->lock, flags); in extcon_unregister_notifier()
616 ret = raw_notifier_chain_unregister(&edev->nh[idx], nb); in extcon_unregister_notifier()
617 spin_unlock_irqrestore(&edev->lock, flags); in extcon_unregister_notifier()
671 struct extcon_dev *edev; in extcon_dev_allocate() local
676 edev = kzalloc(sizeof(*edev), GFP_KERNEL); in extcon_dev_allocate()
677 if (!edev) in extcon_dev_allocate()
680 edev->max_supported = 0; in extcon_dev_allocate()
681 edev->supported_cable = supported_cable; in extcon_dev_allocate()
683 return edev; in extcon_dev_allocate()
690 void extcon_dev_free(struct extcon_dev *edev) in extcon_dev_free() argument
692 kfree(edev); in extcon_dev_free()
728 struct extcon_dev **ptr, *edev; in devm_extcon_dev_allocate() local
734 edev = extcon_dev_allocate(supported_cable); in devm_extcon_dev_allocate()
735 if (IS_ERR(edev)) { in devm_extcon_dev_allocate()
737 return edev; in devm_extcon_dev_allocate()
740 edev->dev.parent = dev; in devm_extcon_dev_allocate()
742 *ptr = edev; in devm_extcon_dev_allocate()
745 return edev; in devm_extcon_dev_allocate()
749 void devm_extcon_dev_free(struct device *dev, struct extcon_dev *edev) in devm_extcon_dev_free() argument
752 devm_extcon_dev_match, edev)); in devm_extcon_dev_free()
765 int extcon_dev_register(struct extcon_dev *edev) in extcon_dev_register() argument
776 if (!edev || !edev->supported_cable) in extcon_dev_register()
779 for (; edev->supported_cable[index] != EXTCON_NONE; index++); in extcon_dev_register()
781 edev->max_supported = index; in extcon_dev_register()
783 dev_err(&edev->dev, in extcon_dev_register()
788 edev->dev.class = extcon_class; in extcon_dev_register()
789 edev->dev.release = extcon_dev_release; in extcon_dev_register()
791 edev->name = dev_name(edev->dev.parent); in extcon_dev_register()
792 if (IS_ERR_OR_NULL(edev->name)) { in extcon_dev_register()
793 dev_err(&edev->dev, in extcon_dev_register()
797 dev_set_name(&edev->dev, "extcon%lu", in extcon_dev_register()
800 if (edev->max_supported) { in extcon_dev_register()
805 edev->cables = kzalloc(sizeof(struct extcon_cable) * in extcon_dev_register()
806 edev->max_supported, GFP_KERNEL); in extcon_dev_register()
807 if (!edev->cables) { in extcon_dev_register()
811 for (index = 0; index < edev->max_supported; index++) { in extcon_dev_register()
812 cable = &edev->cables[index]; in extcon_dev_register()
819 cable = &edev->cables[index]; in extcon_dev_register()
828 cable->edev = edev; in extcon_dev_register()
848 if (edev->max_supported && edev->mutually_exclusive) { in extcon_dev_register()
853 for (index = 0; edev->mutually_exclusive[index]; index++) in extcon_dev_register()
856 edev->attrs_muex = kzalloc(sizeof(struct attribute *) * in extcon_dev_register()
858 if (!edev->attrs_muex) { in extcon_dev_register()
863 edev->d_attrs_muex = kzalloc(sizeof(struct device_attribute) * in extcon_dev_register()
865 if (!edev->d_attrs_muex) { in extcon_dev_register()
867 kfree(edev->attrs_muex); in extcon_dev_register()
871 for (index = 0; edev->mutually_exclusive[index]; index++) { in extcon_dev_register()
872 sprintf(buf, "0x%x", edev->mutually_exclusive[index]); in extcon_dev_register()
877 kfree(edev->d_attrs_muex[index].attr. in extcon_dev_register()
880 kfree(edev->d_attrs_muex); in extcon_dev_register()
881 kfree(edev->attrs_muex); in extcon_dev_register()
886 sysfs_attr_init(&edev->d_attrs_muex[index].attr); in extcon_dev_register()
887 edev->d_attrs_muex[index].attr.name = name; in extcon_dev_register()
888 edev->d_attrs_muex[index].attr.mode = 0000; in extcon_dev_register()
889 edev->attrs_muex[index] = &edev->d_attrs_muex[index] in extcon_dev_register()
892 edev->attr_g_muex.name = muex_name; in extcon_dev_register()
893 edev->attr_g_muex.attrs = edev->attrs_muex; in extcon_dev_register()
897 if (edev->max_supported) { in extcon_dev_register()
898 edev->extcon_dev_type.groups = in extcon_dev_register()
900 (edev->max_supported + 2), GFP_KERNEL); in extcon_dev_register()
901 if (!edev->extcon_dev_type.groups) { in extcon_dev_register()
906 edev->extcon_dev_type.name = dev_name(&edev->dev); in extcon_dev_register()
907 edev->extcon_dev_type.release = dummy_sysfs_dev_release; in extcon_dev_register()
909 for (index = 0; index < edev->max_supported; index++) in extcon_dev_register()
910 edev->extcon_dev_type.groups[index] = in extcon_dev_register()
911 &edev->cables[index].attr_g; in extcon_dev_register()
912 if (edev->mutually_exclusive) in extcon_dev_register()
913 edev->extcon_dev_type.groups[index] = in extcon_dev_register()
914 &edev->attr_g_muex; in extcon_dev_register()
916 edev->dev.type = &edev->extcon_dev_type; in extcon_dev_register()
919 ret = device_register(&edev->dev); in extcon_dev_register()
921 put_device(&edev->dev); in extcon_dev_register()
926 ret = class_compat_create_link(switch_class, &edev->dev, NULL); in extcon_dev_register()
929 spin_lock_init(&edev->lock); in extcon_dev_register()
931 edev->nh = devm_kzalloc(&edev->dev, in extcon_dev_register()
932 sizeof(*edev->nh) * edev->max_supported, GFP_KERNEL); in extcon_dev_register()
933 if (!edev->nh) { in extcon_dev_register()
938 for (index = 0; index < edev->max_supported; index++) in extcon_dev_register()
939 RAW_INIT_NOTIFIER_HEAD(&edev->nh[index]); in extcon_dev_register()
941 dev_set_drvdata(&edev->dev, edev); in extcon_dev_register()
942 edev->state = 0; in extcon_dev_register()
945 list_add(&edev->entry, &extcon_dev_list); in extcon_dev_register()
951 if (edev->max_supported) in extcon_dev_register()
952 kfree(edev->extcon_dev_type.groups); in extcon_dev_register()
954 if (edev->max_supported && edev->mutually_exclusive) { in extcon_dev_register()
955 for (index = 0; edev->mutually_exclusive[index]; index++) in extcon_dev_register()
956 kfree(edev->d_attrs_muex[index].attr.name); in extcon_dev_register()
957 kfree(edev->d_attrs_muex); in extcon_dev_register()
958 kfree(edev->attrs_muex); in extcon_dev_register()
961 for (index = 0; index < edev->max_supported; index++) in extcon_dev_register()
962 kfree(edev->cables[index].attr_g.name); in extcon_dev_register()
964 if (edev->max_supported) in extcon_dev_register()
965 kfree(edev->cables); in extcon_dev_register()
978 void extcon_dev_unregister(struct extcon_dev *edev) in extcon_dev_unregister() argument
982 if (!edev) in extcon_dev_unregister()
986 list_del(&edev->entry); in extcon_dev_unregister()
989 if (IS_ERR_OR_NULL(get_device(&edev->dev))) { in extcon_dev_unregister()
990 dev_err(&edev->dev, "Failed to unregister extcon_dev (%s)\n", in extcon_dev_unregister()
991 dev_name(&edev->dev)); in extcon_dev_unregister()
995 device_unregister(&edev->dev); in extcon_dev_unregister()
997 if (edev->mutually_exclusive && edev->max_supported) { in extcon_dev_unregister()
998 for (index = 0; edev->mutually_exclusive[index]; in extcon_dev_unregister()
1000 kfree(edev->d_attrs_muex[index].attr.name); in extcon_dev_unregister()
1001 kfree(edev->d_attrs_muex); in extcon_dev_unregister()
1002 kfree(edev->attrs_muex); in extcon_dev_unregister()
1005 for (index = 0; index < edev->max_supported; index++) in extcon_dev_unregister()
1006 kfree(edev->cables[index].attr_g.name); in extcon_dev_unregister()
1008 if (edev->max_supported) { in extcon_dev_unregister()
1009 kfree(edev->extcon_dev_type.groups); in extcon_dev_unregister()
1010 kfree(edev->cables); in extcon_dev_unregister()
1015 class_compat_remove_link(switch_class, &edev->dev, NULL); in extcon_dev_unregister()
1017 put_device(&edev->dev); in extcon_dev_unregister()
1041 int devm_extcon_dev_register(struct device *dev, struct extcon_dev *edev) in devm_extcon_dev_register() argument
1050 ret = extcon_dev_register(edev); in devm_extcon_dev_register()
1056 *ptr = edev; in devm_extcon_dev_register()
1071 void devm_extcon_dev_unregister(struct device *dev, struct extcon_dev *edev) in devm_extcon_dev_unregister() argument
1074 devm_extcon_dev_match, edev)); in devm_extcon_dev_unregister()
1089 struct extcon_dev *edev; in extcon_get_edev_by_phandle() local
1107 list_for_each_entry(edev, &extcon_dev_list, entry) { in extcon_get_edev_by_phandle()
1108 if (edev->dev.parent && edev->dev.parent->of_node == node) { in extcon_get_edev_by_phandle()
1110 return edev; in extcon_get_edev_by_phandle()
1129 const char *extcon_get_edev_name(struct extcon_dev *edev) in extcon_get_edev_name() argument
1131 return !edev ? NULL : edev->name; in extcon_get_edev_name()