Lines Matching refs:cldev

227 ssize_t mei_cldev_send(struct mei_cl_device *cldev, u8 *buf, size_t length)  in mei_cldev_send()  argument
229 struct mei_cl *cl = cldev->cl; in mei_cldev_send()
245 ssize_t mei_cldev_recv_nonblock(struct mei_cl_device *cldev, u8 *buf, in mei_cldev_recv_nonblock() argument
248 struct mei_cl *cl = cldev->cl; in mei_cldev_recv_nonblock()
263 ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length) in mei_cldev_recv() argument
265 struct mei_cl *cl = cldev->cl; in mei_cldev_recv()
278 struct mei_cl_device *cldev; in mei_cl_bus_rx_work() local
281 cldev = container_of(work, struct mei_cl_device, rx_work); in mei_cl_bus_rx_work()
283 bus = cldev->bus; in mei_cl_bus_rx_work()
285 if (cldev->rx_cb) in mei_cl_bus_rx_work()
286 cldev->rx_cb(cldev); in mei_cl_bus_rx_work()
289 mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL); in mei_cl_bus_rx_work()
300 struct mei_cl_device *cldev; in mei_cl_bus_notif_work() local
302 cldev = container_of(work, struct mei_cl_device, notif_work); in mei_cl_bus_notif_work()
304 if (cldev->notif_cb) in mei_cl_bus_notif_work()
305 cldev->notif_cb(cldev); in mei_cl_bus_notif_work()
318 struct mei_cl_device *cldev = cl->cldev; in mei_cl_bus_notify_event() local
320 if (!cldev || !cldev->notif_cb) in mei_cl_bus_notify_event()
326 schedule_work(&cldev->notif_work); in mei_cl_bus_notify_event()
343 struct mei_cl_device *cldev = cl->cldev; in mei_cl_bus_rx_event() local
345 if (!cldev || !cldev->rx_cb) in mei_cl_bus_rx_event()
348 schedule_work(&cldev->rx_work); in mei_cl_bus_rx_event()
363 int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t rx_cb) in mei_cldev_register_rx_cb() argument
365 struct mei_device *bus = cldev->bus; in mei_cldev_register_rx_cb()
370 if (cldev->rx_cb) in mei_cldev_register_rx_cb()
373 cldev->rx_cb = rx_cb; in mei_cldev_register_rx_cb()
374 INIT_WORK(&cldev->rx_work, mei_cl_bus_rx_work); in mei_cldev_register_rx_cb()
377 ret = mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL); in mei_cldev_register_rx_cb()
396 int mei_cldev_register_notif_cb(struct mei_cl_device *cldev, in mei_cldev_register_notif_cb() argument
399 struct mei_device *bus = cldev->bus; in mei_cldev_register_notif_cb()
405 if (cldev->notif_cb) in mei_cldev_register_notif_cb()
408 cldev->notif_cb = notif_cb; in mei_cldev_register_notif_cb()
409 INIT_WORK(&cldev->notif_work, mei_cl_bus_notif_work); in mei_cldev_register_notif_cb()
412 ret = mei_cl_notify_request(cldev->cl, NULL, 1); in mei_cldev_register_notif_cb()
428 void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev) in mei_cldev_get_drvdata() argument
430 return dev_get_drvdata(&cldev->dev); in mei_cldev_get_drvdata()
440 void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data) in mei_cldev_set_drvdata() argument
442 dev_set_drvdata(&cldev->dev, data); in mei_cldev_set_drvdata()
453 const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev) in mei_cldev_uuid() argument
455 return mei_me_cl_uuid(cldev->me_cl); in mei_cldev_uuid()
466 u8 mei_cldev_ver(const struct mei_cl_device *cldev) in mei_cldev_ver() argument
468 return mei_me_cl_ver(cldev->me_cl); in mei_cldev_ver()
479 bool mei_cldev_enabled(struct mei_cl_device *cldev) in mei_cldev_enabled() argument
481 return mei_cl_is_connected(cldev->cl); in mei_cldev_enabled()
493 static bool mei_cl_bus_module_get(struct mei_cl_device *cldev) in mei_cl_bus_module_get() argument
495 return try_module_get(cldev->bus->dev->driver->owner); in mei_cl_bus_module_get()
503 static void mei_cl_bus_module_put(struct mei_cl_device *cldev) in mei_cl_bus_module_put() argument
505 module_put(cldev->bus->dev->driver->owner); in mei_cl_bus_module_put()
516 int mei_cldev_enable(struct mei_cl_device *cldev) in mei_cldev_enable() argument
518 struct mei_device *bus = cldev->bus; in mei_cldev_enable()
522 cl = cldev->cl; in mei_cldev_enable()
530 cl->cldev = cldev; in mei_cldev_enable()
538 if (!mei_me_cl_is_active(cldev->me_cl)) { in mei_cldev_enable()
539 dev_err(&cldev->dev, "me client is not active\n"); in mei_cldev_enable()
544 if (!mei_cl_bus_module_get(cldev)) { in mei_cldev_enable()
545 dev_err(&cldev->dev, "get hw module failed"); in mei_cldev_enable()
550 ret = mei_cl_connect(cl, cldev->me_cl, NULL); in mei_cldev_enable()
552 dev_err(&cldev->dev, "cannot connect\n"); in mei_cldev_enable()
553 mei_cl_bus_module_put(cldev); in mei_cldev_enable()
569 static void mei_cldev_unregister_callbacks(struct mei_cl_device *cldev) in mei_cldev_unregister_callbacks() argument
571 if (cldev->rx_cb) { in mei_cldev_unregister_callbacks()
572 cancel_work_sync(&cldev->rx_work); in mei_cldev_unregister_callbacks()
573 cldev->rx_cb = NULL; in mei_cldev_unregister_callbacks()
576 if (cldev->notif_cb) { in mei_cldev_unregister_callbacks()
577 cancel_work_sync(&cldev->notif_work); in mei_cldev_unregister_callbacks()
578 cldev->notif_cb = NULL; in mei_cldev_unregister_callbacks()
590 int mei_cldev_disable(struct mei_cl_device *cldev) in mei_cldev_disable() argument
596 if (!cldev) in mei_cldev_disable()
599 cl = cldev->cl; in mei_cldev_disable()
601 bus = cldev->bus; in mei_cldev_disable()
603 mei_cldev_unregister_callbacks(cldev); in mei_cldev_disable()
617 mei_cl_bus_module_put(cldev); in mei_cldev_disable()
637 struct mei_cl_device_id *mei_cl_device_find(struct mei_cl_device *cldev, in mei_cl_device_find() argument
645 uuid = mei_me_cl_uuid(cldev->me_cl); in mei_cl_device_find()
646 version = mei_me_cl_ver(cldev->me_cl); in mei_cl_device_find()
653 if (cldev->name[0]) in mei_cl_device_find()
654 if (strncmp(cldev->name, id->name, in mei_cl_device_find()
681 struct mei_cl_device *cldev = to_mei_cl_device(dev); in mei_cl_device_match() local
685 if (!cldev) in mei_cl_device_match()
688 if (!cldev->do_match) in mei_cl_device_match()
694 found_id = mei_cl_device_find(cldev, cldrv); in mei_cl_device_match()
710 struct mei_cl_device *cldev; in mei_cl_device_probe() local
715 cldev = to_mei_cl_device(dev); in mei_cl_device_probe()
718 if (!cldev) in mei_cl_device_probe()
724 id = mei_cl_device_find(cldev, cldrv); in mei_cl_device_probe()
728 ret = cldrv->probe(cldev, id); in mei_cl_device_probe()
745 struct mei_cl_device *cldev = to_mei_cl_device(dev); in mei_cl_device_remove() local
749 if (!cldev || !dev->driver) in mei_cl_device_remove()
754 ret = cldrv->remove(cldev); in mei_cl_device_remove()
756 mei_cldev_unregister_callbacks(cldev); in mei_cl_device_remove()
767 struct mei_cl_device *cldev = to_mei_cl_device(dev); in name_show() local
769 return scnprintf(buf, PAGE_SIZE, "%s", cldev->name); in name_show()
776 struct mei_cl_device *cldev = to_mei_cl_device(dev); in uuid_show() local
777 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); in uuid_show()
786 struct mei_cl_device *cldev = to_mei_cl_device(dev); in version_show() local
787 u8 version = mei_me_cl_ver(cldev->me_cl); in version_show()
796 struct mei_cl_device *cldev = to_mei_cl_device(dev); in modalias_show() local
797 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); in modalias_show()
798 u8 version = mei_me_cl_ver(cldev->me_cl); in modalias_show()
801 cldev->name, uuid, version); in modalias_show()
824 struct mei_cl_device *cldev = to_mei_cl_device(dev); in mei_cl_device_uevent() local
825 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); in mei_cl_device_uevent()
826 u8 version = mei_me_cl_ver(cldev->me_cl); in mei_cl_device_uevent()
834 if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name)) in mei_cl_device_uevent()
838 cldev->name, uuid, version)) in mei_cl_device_uevent()
869 struct mei_cl_device *cldev = to_mei_cl_device(dev); in mei_cl_bus_dev_release() local
871 if (!cldev) in mei_cl_bus_dev_release()
874 mei_me_cl_put(cldev->me_cl); in mei_cl_bus_dev_release()
875 mei_dev_bus_put(cldev->bus); in mei_cl_bus_dev_release()
876 mei_cl_unlink(cldev->cl); in mei_cl_bus_dev_release()
877 kfree(cldev->cl); in mei_cl_bus_dev_release()
878 kfree(cldev); in mei_cl_bus_dev_release()
890 static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev) in mei_cl_bus_set_name() argument
892 dev_set_name(&cldev->dev, "mei:%s:%pUl:%02X", in mei_cl_bus_set_name()
893 cldev->name, in mei_cl_bus_set_name()
894 mei_me_cl_uuid(cldev->me_cl), in mei_cl_bus_set_name()
895 mei_me_cl_ver(cldev->me_cl)); in mei_cl_bus_set_name()
909 struct mei_cl_device *cldev; in mei_cl_bus_dev_alloc() local
912 cldev = kzalloc(sizeof(struct mei_cl_device), GFP_KERNEL); in mei_cl_bus_dev_alloc()
913 if (!cldev) in mei_cl_bus_dev_alloc()
918 kfree(cldev); in mei_cl_bus_dev_alloc()
922 device_initialize(&cldev->dev); in mei_cl_bus_dev_alloc()
923 cldev->dev.parent = bus->dev; in mei_cl_bus_dev_alloc()
924 cldev->dev.bus = &mei_cl_bus_type; in mei_cl_bus_dev_alloc()
925 cldev->dev.type = &mei_cl_device_type; in mei_cl_bus_dev_alloc()
926 cldev->bus = mei_dev_bus_get(bus); in mei_cl_bus_dev_alloc()
927 cldev->me_cl = mei_me_cl_get(me_cl); in mei_cl_bus_dev_alloc()
928 cldev->cl = cl; in mei_cl_bus_dev_alloc()
929 mei_cl_bus_set_name(cldev); in mei_cl_bus_dev_alloc()
930 cldev->is_added = 0; in mei_cl_bus_dev_alloc()
931 INIT_LIST_HEAD(&cldev->bus_list); in mei_cl_bus_dev_alloc()
933 return cldev; in mei_cl_bus_dev_alloc()
946 struct mei_cl_device *cldev) in mei_cl_bus_dev_setup() argument
948 cldev->do_match = 1; in mei_cl_bus_dev_setup()
949 mei_cl_bus_dev_fixup(cldev); in mei_cl_bus_dev_setup()
952 if (cldev->do_match) in mei_cl_bus_dev_setup()
953 mei_cl_bus_set_name(cldev); in mei_cl_bus_dev_setup()
955 return cldev->do_match == 1; in mei_cl_bus_dev_setup()
965 static int mei_cl_bus_dev_add(struct mei_cl_device *cldev) in mei_cl_bus_dev_add() argument
969 dev_dbg(cldev->bus->dev, "adding %pUL:%02X\n", in mei_cl_bus_dev_add()
970 mei_me_cl_uuid(cldev->me_cl), in mei_cl_bus_dev_add()
971 mei_me_cl_ver(cldev->me_cl)); in mei_cl_bus_dev_add()
972 ret = device_add(&cldev->dev); in mei_cl_bus_dev_add()
974 cldev->is_added = 1; in mei_cl_bus_dev_add()
984 static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev) in mei_cl_bus_dev_stop() argument
986 if (cldev->is_added) in mei_cl_bus_dev_stop()
987 device_release_driver(&cldev->dev); in mei_cl_bus_dev_stop()
997 static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev) in mei_cl_bus_dev_destroy() argument
1000 WARN_ON(!mutex_is_locked(&cldev->bus->cl_bus_lock)); in mei_cl_bus_dev_destroy()
1002 if (!cldev->is_added) in mei_cl_bus_dev_destroy()
1005 device_del(&cldev->dev); in mei_cl_bus_dev_destroy()
1007 list_del_init(&cldev->bus_list); in mei_cl_bus_dev_destroy()
1009 cldev->is_added = 0; in mei_cl_bus_dev_destroy()
1010 put_device(&cldev->dev); in mei_cl_bus_dev_destroy()
1018 static void mei_cl_bus_remove_device(struct mei_cl_device *cldev) in mei_cl_bus_remove_device() argument
1020 mei_cl_bus_dev_stop(cldev); in mei_cl_bus_remove_device()
1021 mei_cl_bus_dev_destroy(cldev); in mei_cl_bus_remove_device()
1031 struct mei_cl_device *cldev, *next; in mei_cl_bus_remove_devices() local
1034 list_for_each_entry_safe(cldev, next, &bus->device_list, bus_list) in mei_cl_bus_remove_devices()
1035 mei_cl_bus_remove_device(cldev); in mei_cl_bus_remove_devices()
1052 struct mei_cl_device *cldev; in mei_cl_bus_dev_init() local
1061 cldev = mei_cl_bus_dev_alloc(bus, me_cl); in mei_cl_bus_dev_init()
1062 if (!cldev) in mei_cl_bus_dev_init()
1066 list_add_tail(&cldev->bus_list, &bus->device_list); in mei_cl_bus_dev_init()
1078 struct mei_cl_device *cldev, *n; in mei_cl_bus_rescan() local
1088 list_for_each_entry_safe(cldev, n, &bus->device_list, bus_list) { in mei_cl_bus_rescan()
1090 if (!mei_me_cl_is_active(cldev->me_cl)) { in mei_cl_bus_rescan()
1091 mei_cl_bus_remove_device(cldev); in mei_cl_bus_rescan()
1095 if (cldev->is_added) in mei_cl_bus_rescan()
1098 if (mei_cl_bus_dev_setup(bus, cldev)) in mei_cl_bus_rescan()
1099 mei_cl_bus_dev_add(cldev); in mei_cl_bus_rescan()
1101 list_del_init(&cldev->bus_list); in mei_cl_bus_rescan()
1102 put_device(&cldev->dev); in mei_cl_bus_rescan()