Lines Matching refs:cldev
235 ssize_t mei_cldev_send_vtag(struct mei_cl_device *cldev, const u8 *buf, in mei_cldev_send_vtag() argument
238 struct mei_cl *cl = cldev->cl; in mei_cldev_send_vtag()
257 ssize_t mei_cldev_recv_vtag(struct mei_cl_device *cldev, u8 *buf, size_t length, in mei_cldev_recv_vtag() argument
260 struct mei_cl *cl = cldev->cl; in mei_cldev_recv_vtag()
279 ssize_t mei_cldev_recv_nonblock_vtag(struct mei_cl_device *cldev, u8 *buf, in mei_cldev_recv_nonblock_vtag() argument
282 struct mei_cl *cl = cldev->cl; in mei_cldev_recv_nonblock_vtag()
299 ssize_t mei_cldev_send(struct mei_cl_device *cldev, const u8 *buf, size_t length) in mei_cldev_send() argument
301 return mei_cldev_send_vtag(cldev, buf, length, 0); in mei_cldev_send()
314 ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length) in mei_cldev_recv() argument
316 return mei_cldev_recv_vtag(cldev, buf, length, NULL); in mei_cldev_recv()
330 ssize_t mei_cldev_recv_nonblock(struct mei_cl_device *cldev, u8 *buf, in mei_cldev_recv_nonblock() argument
333 return mei_cldev_recv_nonblock_vtag(cldev, buf, length, NULL); in mei_cldev_recv_nonblock()
344 struct mei_cl_device *cldev; in mei_cl_bus_rx_work() local
347 cldev = container_of(work, struct mei_cl_device, rx_work); in mei_cl_bus_rx_work()
349 bus = cldev->bus; in mei_cl_bus_rx_work()
351 if (cldev->rx_cb) in mei_cl_bus_rx_work()
352 cldev->rx_cb(cldev); in mei_cl_bus_rx_work()
355 if (mei_cl_is_connected(cldev->cl)) in mei_cl_bus_rx_work()
356 mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL); in mei_cl_bus_rx_work()
367 struct mei_cl_device *cldev; in mei_cl_bus_notif_work() local
369 cldev = container_of(work, struct mei_cl_device, notif_work); in mei_cl_bus_notif_work()
371 if (cldev->notif_cb) in mei_cl_bus_notif_work()
372 cldev->notif_cb(cldev); in mei_cl_bus_notif_work()
385 struct mei_cl_device *cldev = cl->cldev; in mei_cl_bus_notify_event() local
387 if (!cldev || !cldev->notif_cb) in mei_cl_bus_notify_event()
393 schedule_work(&cldev->notif_work); in mei_cl_bus_notify_event()
410 struct mei_cl_device *cldev = cl->cldev; in mei_cl_bus_rx_event() local
412 if (!cldev || !cldev->rx_cb) in mei_cl_bus_rx_event()
415 schedule_work(&cldev->rx_work); in mei_cl_bus_rx_event()
430 int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t rx_cb) in mei_cldev_register_rx_cb() argument
432 struct mei_device *bus = cldev->bus; in mei_cldev_register_rx_cb()
437 if (cldev->rx_cb) in mei_cldev_register_rx_cb()
440 cldev->rx_cb = rx_cb; in mei_cldev_register_rx_cb()
441 INIT_WORK(&cldev->rx_work, mei_cl_bus_rx_work); in mei_cldev_register_rx_cb()
444 if (mei_cl_is_connected(cldev->cl)) in mei_cldev_register_rx_cb()
445 ret = mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL); in mei_cldev_register_rx_cb()
450 cancel_work_sync(&cldev->rx_work); in mei_cldev_register_rx_cb()
451 cldev->rx_cb = NULL; in mei_cldev_register_rx_cb()
469 int mei_cldev_register_notif_cb(struct mei_cl_device *cldev, in mei_cldev_register_notif_cb() argument
472 struct mei_device *bus = cldev->bus; in mei_cldev_register_notif_cb()
478 if (cldev->notif_cb) in mei_cldev_register_notif_cb()
481 cldev->notif_cb = notif_cb; in mei_cldev_register_notif_cb()
482 INIT_WORK(&cldev->notif_work, mei_cl_bus_notif_work); in mei_cldev_register_notif_cb()
485 ret = mei_cl_notify_request(cldev->cl, NULL, 1); in mei_cldev_register_notif_cb()
488 cancel_work_sync(&cldev->notif_work); in mei_cldev_register_notif_cb()
489 cldev->notif_cb = NULL; in mei_cldev_register_notif_cb()
504 void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev) in mei_cldev_get_drvdata() argument
506 return dev_get_drvdata(&cldev->dev); in mei_cldev_get_drvdata()
516 void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data) in mei_cldev_set_drvdata() argument
518 dev_set_drvdata(&cldev->dev, data); in mei_cldev_set_drvdata()
529 const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev) in mei_cldev_uuid() argument
531 return mei_me_cl_uuid(cldev->me_cl); in mei_cldev_uuid()
542 u8 mei_cldev_ver(const struct mei_cl_device *cldev) in mei_cldev_ver() argument
544 return mei_me_cl_ver(cldev->me_cl); in mei_cldev_ver()
555 bool mei_cldev_enabled(const struct mei_cl_device *cldev) in mei_cldev_enabled() argument
557 return mei_cl_is_connected(cldev->cl); in mei_cldev_enabled()
569 static bool mei_cl_bus_module_get(struct mei_cl_device *cldev) in mei_cl_bus_module_get() argument
571 return try_module_get(cldev->bus->dev->driver->owner); in mei_cl_bus_module_get()
579 static void mei_cl_bus_module_put(struct mei_cl_device *cldev) in mei_cl_bus_module_put() argument
581 module_put(cldev->bus->dev->driver->owner); in mei_cl_bus_module_put()
607 static int mei_cl_bus_vtag_alloc(struct mei_cl_device *cldev) in mei_cl_bus_vtag_alloc() argument
609 struct mei_cl *cl = cldev->cl; in mei_cl_bus_vtag_alloc()
633 static void mei_cl_bus_vtag_free(struct mei_cl_device *cldev) in mei_cl_bus_vtag_free() argument
635 struct mei_cl *cl = cldev->cl; in mei_cl_bus_vtag_free()
654 int mei_cldev_enable(struct mei_cl_device *cldev) in mei_cldev_enable() argument
656 struct mei_device *bus = cldev->bus; in mei_cldev_enable()
660 cl = cldev->cl; in mei_cldev_enable()
668 cl->cldev = cldev; in mei_cldev_enable()
676 if (!mei_me_cl_is_active(cldev->me_cl)) { in mei_cldev_enable()
677 dev_err(&cldev->dev, "me client is not active\n"); in mei_cldev_enable()
682 ret = mei_cl_bus_vtag_alloc(cldev); in mei_cldev_enable()
686 ret = mei_cl_connect(cl, cldev->me_cl, NULL); in mei_cldev_enable()
688 dev_err(&cldev->dev, "cannot connect\n"); in mei_cldev_enable()
689 mei_cl_bus_vtag_free(cldev); in mei_cldev_enable()
705 static void mei_cldev_unregister_callbacks(struct mei_cl_device *cldev) in mei_cldev_unregister_callbacks() argument
707 if (cldev->rx_cb) { in mei_cldev_unregister_callbacks()
708 cancel_work_sync(&cldev->rx_work); in mei_cldev_unregister_callbacks()
709 cldev->rx_cb = NULL; in mei_cldev_unregister_callbacks()
712 if (cldev->notif_cb) { in mei_cldev_unregister_callbacks()
713 cancel_work_sync(&cldev->notif_work); in mei_cldev_unregister_callbacks()
714 cldev->notif_cb = NULL; in mei_cldev_unregister_callbacks()
726 int mei_cldev_disable(struct mei_cl_device *cldev) in mei_cldev_disable() argument
732 if (!cldev) in mei_cldev_disable()
735 cl = cldev->cl; in mei_cldev_disable()
737 bus = cldev->bus; in mei_cldev_disable()
739 mei_cldev_unregister_callbacks(cldev); in mei_cldev_disable()
743 mei_cl_bus_vtag_free(cldev); in mei_cldev_disable()
774 struct mei_cl_device_id *mei_cl_device_find(const struct mei_cl_device *cldev, in mei_cl_device_find() argument
782 uuid = mei_me_cl_uuid(cldev->me_cl); in mei_cl_device_find()
783 version = mei_me_cl_ver(cldev->me_cl); in mei_cl_device_find()
790 if (cldev->name[0]) in mei_cl_device_find()
791 if (strncmp(cldev->name, id->name, in mei_cl_device_find()
818 const struct mei_cl_device *cldev = to_mei_cl_device(dev); in mei_cl_device_match() local
822 if (!cldev) in mei_cl_device_match()
825 if (!cldev->do_match) in mei_cl_device_match()
831 found_id = mei_cl_device_find(cldev, cldrv); in mei_cl_device_match()
847 struct mei_cl_device *cldev; in mei_cl_device_probe() local
852 cldev = to_mei_cl_device(dev); in mei_cl_device_probe()
855 if (!cldev) in mei_cl_device_probe()
861 id = mei_cl_device_find(cldev, cldrv); in mei_cl_device_probe()
865 if (!mei_cl_bus_module_get(cldev)) { in mei_cl_device_probe()
866 dev_err(&cldev->dev, "get hw module failed"); in mei_cl_device_probe()
870 ret = cldrv->probe(cldev, id); in mei_cl_device_probe()
872 mei_cl_bus_module_put(cldev); in mei_cl_device_probe()
889 struct mei_cl_device *cldev = to_mei_cl_device(dev); in mei_cl_device_remove() local
893 cldrv->remove(cldev); in mei_cl_device_remove()
895 mei_cldev_unregister_callbacks(cldev); in mei_cl_device_remove()
897 mei_cl_bus_module_put(cldev); in mei_cl_device_remove()
904 struct mei_cl_device *cldev = to_mei_cl_device(dev); in name_show() local
906 return scnprintf(buf, PAGE_SIZE, "%s", cldev->name); in name_show()
913 struct mei_cl_device *cldev = to_mei_cl_device(dev); in uuid_show() local
914 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); in uuid_show()
923 struct mei_cl_device *cldev = to_mei_cl_device(dev); in version_show() local
924 u8 version = mei_me_cl_ver(cldev->me_cl); in version_show()
933 struct mei_cl_device *cldev = to_mei_cl_device(dev); in modalias_show() local
934 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); in modalias_show()
935 u8 version = mei_me_cl_ver(cldev->me_cl); in modalias_show()
938 cldev->name, uuid, version); in modalias_show()
945 struct mei_cl_device *cldev = to_mei_cl_device(dev); in max_conn_show() local
946 u8 maxconn = mei_me_cl_max_conn(cldev->me_cl); in max_conn_show()
955 struct mei_cl_device *cldev = to_mei_cl_device(dev); in fixed_show() local
956 u8 fixed = mei_me_cl_fixed(cldev->me_cl); in fixed_show()
965 struct mei_cl_device *cldev = to_mei_cl_device(dev); in vtag_show() local
966 bool vt = mei_me_cl_vt(cldev->me_cl); in vtag_show()
975 struct mei_cl_device *cldev = to_mei_cl_device(dev); in max_len_show() local
976 u32 maxlen = mei_me_cl_max_len(cldev->me_cl); in max_len_show()
1005 struct mei_cl_device *cldev = to_mei_cl_device(dev); in mei_cl_device_uevent() local
1006 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl); in mei_cl_device_uevent()
1007 u8 version = mei_me_cl_ver(cldev->me_cl); in mei_cl_device_uevent()
1015 if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name)) in mei_cl_device_uevent()
1019 cldev->name, uuid, version)) in mei_cl_device_uevent()
1050 struct mei_cl_device *cldev = to_mei_cl_device(dev); in mei_cl_bus_dev_release() local
1052 if (!cldev) in mei_cl_bus_dev_release()
1055 mei_me_cl_put(cldev->me_cl); in mei_cl_bus_dev_release()
1056 mei_dev_bus_put(cldev->bus); in mei_cl_bus_dev_release()
1057 mei_cl_unlink(cldev->cl); in mei_cl_bus_dev_release()
1058 kfree(cldev->cl); in mei_cl_bus_dev_release()
1059 kfree(cldev); in mei_cl_bus_dev_release()
1073 static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev) in mei_cl_bus_set_name() argument
1075 dev_set_name(&cldev->dev, "%s-%pUl", in mei_cl_bus_set_name()
1076 dev_name(cldev->bus->dev), in mei_cl_bus_set_name()
1077 mei_me_cl_uuid(cldev->me_cl)); in mei_cl_bus_set_name()
1091 struct mei_cl_device *cldev; in mei_cl_bus_dev_alloc() local
1094 cldev = kzalloc(sizeof(*cldev), GFP_KERNEL); in mei_cl_bus_dev_alloc()
1095 if (!cldev) in mei_cl_bus_dev_alloc()
1100 kfree(cldev); in mei_cl_bus_dev_alloc()
1104 device_initialize(&cldev->dev); in mei_cl_bus_dev_alloc()
1105 cldev->dev.parent = bus->dev; in mei_cl_bus_dev_alloc()
1106 cldev->dev.bus = &mei_cl_bus_type; in mei_cl_bus_dev_alloc()
1107 cldev->dev.type = &mei_cl_device_type; in mei_cl_bus_dev_alloc()
1108 cldev->bus = mei_dev_bus_get(bus); in mei_cl_bus_dev_alloc()
1109 cldev->me_cl = mei_me_cl_get(me_cl); in mei_cl_bus_dev_alloc()
1110 cldev->cl = cl; in mei_cl_bus_dev_alloc()
1111 mei_cl_bus_set_name(cldev); in mei_cl_bus_dev_alloc()
1112 cldev->is_added = 0; in mei_cl_bus_dev_alloc()
1113 INIT_LIST_HEAD(&cldev->bus_list); in mei_cl_bus_dev_alloc()
1115 return cldev; in mei_cl_bus_dev_alloc()
1128 struct mei_cl_device *cldev) in mei_cl_bus_dev_setup() argument
1130 cldev->do_match = 1; in mei_cl_bus_dev_setup()
1131 mei_cl_bus_dev_fixup(cldev); in mei_cl_bus_dev_setup()
1134 if (cldev->do_match) in mei_cl_bus_dev_setup()
1135 mei_cl_bus_set_name(cldev); in mei_cl_bus_dev_setup()
1137 return cldev->do_match == 1; in mei_cl_bus_dev_setup()
1147 static int mei_cl_bus_dev_add(struct mei_cl_device *cldev) in mei_cl_bus_dev_add() argument
1151 dev_dbg(cldev->bus->dev, "adding %pUL:%02X\n", in mei_cl_bus_dev_add()
1152 mei_me_cl_uuid(cldev->me_cl), in mei_cl_bus_dev_add()
1153 mei_me_cl_ver(cldev->me_cl)); in mei_cl_bus_dev_add()
1154 ret = device_add(&cldev->dev); in mei_cl_bus_dev_add()
1156 cldev->is_added = 1; in mei_cl_bus_dev_add()
1166 static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev) in mei_cl_bus_dev_stop() argument
1168 if (cldev->is_added) in mei_cl_bus_dev_stop()
1169 device_release_driver(&cldev->dev); in mei_cl_bus_dev_stop()
1179 static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev) in mei_cl_bus_dev_destroy() argument
1182 WARN_ON(!mutex_is_locked(&cldev->bus->cl_bus_lock)); in mei_cl_bus_dev_destroy()
1184 if (!cldev->is_added) in mei_cl_bus_dev_destroy()
1187 device_del(&cldev->dev); in mei_cl_bus_dev_destroy()
1189 list_del_init(&cldev->bus_list); in mei_cl_bus_dev_destroy()
1191 cldev->is_added = 0; in mei_cl_bus_dev_destroy()
1192 put_device(&cldev->dev); in mei_cl_bus_dev_destroy()
1200 static void mei_cl_bus_remove_device(struct mei_cl_device *cldev) in mei_cl_bus_remove_device() argument
1202 mei_cl_bus_dev_stop(cldev); in mei_cl_bus_remove_device()
1203 mei_cl_bus_dev_destroy(cldev); in mei_cl_bus_remove_device()
1213 struct mei_cl_device *cldev, *next; in mei_cl_bus_remove_devices() local
1216 list_for_each_entry_safe(cldev, next, &bus->device_list, bus_list) in mei_cl_bus_remove_devices()
1217 mei_cl_bus_remove_device(cldev); in mei_cl_bus_remove_devices()
1234 struct mei_cl_device *cldev; in mei_cl_bus_dev_init() local
1243 cldev = mei_cl_bus_dev_alloc(bus, me_cl); in mei_cl_bus_dev_init()
1244 if (!cldev) in mei_cl_bus_dev_init()
1248 list_add_tail(&cldev->bus_list, &bus->device_list); in mei_cl_bus_dev_init()
1260 struct mei_cl_device *cldev, *n; in mei_cl_bus_rescan() local
1270 list_for_each_entry_safe(cldev, n, &bus->device_list, bus_list) { in mei_cl_bus_rescan()
1272 if (!mei_me_cl_is_active(cldev->me_cl)) { in mei_cl_bus_rescan()
1273 mei_cl_bus_remove_device(cldev); in mei_cl_bus_rescan()
1277 if (cldev->is_added) in mei_cl_bus_rescan()
1280 if (mei_cl_bus_dev_setup(bus, cldev)) in mei_cl_bus_rescan()
1281 mei_cl_bus_dev_add(cldev); in mei_cl_bus_rescan()
1283 list_del_init(&cldev->bus_list); in mei_cl_bus_rescan()
1284 put_device(&cldev->dev); in mei_cl_bus_rescan()