Lines Matching refs:cldev
211 * @cldev: me client device
217 ssize_t mei_cldev_send(struct mei_cl_device *cldev, u8 *buf, size_t length)
219 struct mei_cl *cl = cldev->cl;
228 * @cldev: me client device
235 ssize_t mei_cldev_recv_nonblock(struct mei_cl_device *cldev, u8 *buf,
238 struct mei_cl *cl = cldev->cl;
247 * @cldev: me client device
253 ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length)
255 struct mei_cl *cl = cldev->cl;
268 struct mei_cl_device *cldev;
271 cldev = container_of(work, struct mei_cl_device, rx_work);
273 bus = cldev->bus;
275 if (cldev->rx_cb)
276 cldev->rx_cb(cldev);
279 mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL);
290 struct mei_cl_device *cldev;
292 cldev = container_of(work, struct mei_cl_device, notif_work);
294 if (cldev->notif_cb)
295 cldev->notif_cb(cldev);
308 struct mei_cl_device *cldev = cl->cldev;
310 if (!cldev || !cldev->notif_cb)
316 schedule_work(&cldev->notif_work);
333 struct mei_cl_device *cldev = cl->cldev;
335 if (!cldev || !cldev->rx_cb)
338 schedule_work(&cldev->rx_work);
346 * @cldev: me client devices
353 int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t rx_cb)
355 struct mei_device *bus = cldev->bus;
360 if (cldev->rx_cb)
363 cldev->rx_cb = rx_cb;
364 INIT_WORK(&cldev->rx_work, mei_cl_bus_rx_work);
367 ret = mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL);
379 * @cldev: me client devices
386 int mei_cldev_register_notif_cb(struct mei_cl_device *cldev,
389 struct mei_device *bus = cldev->bus;
395 if (cldev->notif_cb)
398 cldev->notif_cb = notif_cb;
399 INIT_WORK(&cldev->notif_work, mei_cl_bus_notif_work);
402 ret = mei_cl_notify_request(cldev->cl, NULL, 1);
414 * @cldev: mei client device
418 void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev)
420 return dev_get_drvdata(&cldev->dev);
427 * @cldev: mei client device
430 void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data)
432 dev_set_drvdata(&cldev->dev, data);
439 * @cldev: mei client device
443 const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev)
445 return mei_me_cl_uuid(cldev->me_cl);
452 * @cldev: mei client device
456 u8 mei_cldev_ver(const struct mei_cl_device *cldev)
458 return mei_me_cl_ver(cldev->me_cl);
465 * @cldev: mei client device
469 bool mei_cldev_enabled(struct mei_cl_device *cldev)
471 return mei_cl_is_connected(cldev->cl);
479 * @cldev: mei client device
483 static bool mei_cl_bus_module_get(struct mei_cl_device *cldev)
485 return try_module_get(cldev->bus->dev->driver->owner);
491 * @cldev: mei client device
493 static void mei_cl_bus_module_put(struct mei_cl_device *cldev)
495 module_put(cldev->bus->dev->driver->owner);
515 * @cldev: me client device
521 static int mei_cl_bus_vtag_alloc(struct mei_cl_device *cldev)
523 struct mei_cl *cl = cldev->cl;
545 * @cldev: me client device
547 static void mei_cl_bus_vtag_free(struct mei_cl_device *cldev)
549 struct mei_cl *cl = cldev->cl;
564 * @cldev: me client device
568 int mei_cldev_enable(struct mei_cl_device *cldev)
570 struct mei_device *bus = cldev->bus;
574 cl = cldev->cl;
582 cl->cldev = cldev;
590 if (!mei_me_cl_is_active(cldev->me_cl)) {
591 dev_err(&cldev->dev, "me client is not active\n");
596 ret = mei_cl_bus_vtag_alloc(cldev);
600 ret = mei_cl_connect(cl, cldev->me_cl, NULL);
602 dev_err(&cldev->dev, "cannot connect\n");
603 mei_cl_bus_vtag_free(cldev);
617 * @cldev: client device
619 static void mei_cldev_unregister_callbacks(struct mei_cl_device *cldev)
621 if (cldev->rx_cb) {
622 cancel_work_sync(&cldev->rx_work);
623 cldev->rx_cb = NULL;
626 if (cldev->notif_cb) {
627 cancel_work_sync(&cldev->notif_work);
628 cldev->notif_cb = NULL;
636 * @cldev: me client device
640 int mei_cldev_disable(struct mei_cl_device *cldev)
646 if (!cldev)
649 cl = cldev->cl;
651 bus = cldev->bus;
653 mei_cldev_unregister_callbacks(cldev);
657 mei_cl_bus_vtag_free(cldev);
682 * @cldev: me client device
688 struct mei_cl_device_id *mei_cl_device_find(struct mei_cl_device *cldev,
696 uuid = mei_me_cl_uuid(cldev->me_cl);
697 version = mei_me_cl_ver(cldev->me_cl);
704 if (cldev->name[0])
705 if (strncmp(cldev->name, id->name,
732 struct mei_cl_device *cldev = to_mei_cl_device(dev);
736 if (!cldev)
739 if (!cldev->do_match)
745 found_id = mei_cl_device_find(cldev, cldrv);
761 struct mei_cl_device *cldev;
766 cldev = to_mei_cl_device(dev);
769 if (!cldev)
775 id = mei_cl_device_find(cldev, cldrv);
779 if (!mei_cl_bus_module_get(cldev)) {
780 dev_err(&cldev->dev, "get hw module failed");
784 ret = cldrv->probe(cldev, id);
786 mei_cl_bus_module_put(cldev);
803 struct mei_cl_device *cldev = to_mei_cl_device(dev);
807 if (!cldev || !dev->driver)
812 ret = cldrv->remove(cldev);
814 mei_cldev_unregister_callbacks(cldev);
816 mei_cl_bus_module_put(cldev);
825 struct mei_cl_device *cldev = to_mei_cl_device(dev);
827 return scnprintf(buf, PAGE_SIZE, "%s", cldev->name);
834 struct mei_cl_device *cldev = to_mei_cl_device(dev);
835 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
844 struct mei_cl_device *cldev = to_mei_cl_device(dev);
845 u8 version = mei_me_cl_ver(cldev->me_cl);
854 struct mei_cl_device *cldev = to_mei_cl_device(dev);
855 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
856 u8 version = mei_me_cl_ver(cldev->me_cl);
859 cldev->name, uuid, version);
866 struct mei_cl_device *cldev = to_mei_cl_device(dev);
867 u8 maxconn = mei_me_cl_max_conn(cldev->me_cl);
876 struct mei_cl_device *cldev = to_mei_cl_device(dev);
877 u8 fixed = mei_me_cl_fixed(cldev->me_cl);
886 struct mei_cl_device *cldev = to_mei_cl_device(dev);
887 bool vt = mei_me_cl_vt(cldev->me_cl);
896 struct mei_cl_device *cldev = to_mei_cl_device(dev);
897 u32 maxlen = mei_me_cl_max_len(cldev->me_cl);
926 struct mei_cl_device *cldev = to_mei_cl_device(dev);
927 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
928 u8 version = mei_me_cl_ver(cldev->me_cl);
936 if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name))
940 cldev->name, uuid, version))
971 struct mei_cl_device *cldev = to_mei_cl_device(dev);
973 if (!cldev)
976 mei_me_cl_put(cldev->me_cl);
977 mei_dev_bus_put(cldev->bus);
978 mei_cl_unlink(cldev->cl);
979 kfree(cldev->cl);
980 kfree(cldev);
992 * @cldev: me client device
994 static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev)
996 dev_set_name(&cldev->dev, "%s-%pUl",
997 dev_name(cldev->bus->dev),
998 mei_me_cl_uuid(cldev->me_cl));
1012 struct mei_cl_device *cldev;
1015 cldev = kzalloc(sizeof(*cldev), GFP_KERNEL);
1016 if (!cldev)
1021 kfree(cldev);
1025 device_initialize(&cldev->dev);
1026 cldev->dev.parent = bus->dev;
1027 cldev->dev.bus = &mei_cl_bus_type;
1028 cldev->dev.type = &mei_cl_device_type;
1029 cldev->bus = mei_dev_bus_get(bus);
1030 cldev->me_cl = mei_me_cl_get(me_cl);
1031 cldev->cl = cl;
1032 mei_cl_bus_set_name(cldev);
1033 cldev->is_added = 0;
1034 INIT_LIST_HEAD(&cldev->bus_list);
1036 return cldev;
1044 * @cldev: me client device
1049 struct mei_cl_device *cldev)
1051 cldev->do_match = 1;
1052 mei_cl_bus_dev_fixup(cldev);
1055 if (cldev->do_match)
1056 mei_cl_bus_set_name(cldev);
1058 return cldev->do_match == 1;
1064 * @cldev: me client device
1068 static int mei_cl_bus_dev_add(struct mei_cl_device *cldev)
1072 dev_dbg(cldev->bus->dev, "adding %pUL:%02X\n",
1073 mei_me_cl_uuid(cldev->me_cl),
1074 mei_me_cl_ver(cldev->me_cl));
1075 ret = device_add(&cldev->dev);
1077 cldev->is_added = 1;
1085 * @cldev: me client device
1087 static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev)
1089 if (cldev->is_added)
1090 device_release_driver(&cldev->dev);
1096 * @cldev: me client device
1100 static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev)
1103 WARN_ON(!mutex_is_locked(&cldev->bus->cl_bus_lock));
1105 if (!cldev->is_added)
1108 device_del(&cldev->dev);
1110 list_del_init(&cldev->bus_list);
1112 cldev->is_added = 0;
1113 put_device(&cldev->dev);
1119 * @cldev: me client device
1121 static void mei_cl_bus_remove_device(struct mei_cl_device *cldev)
1123 mei_cl_bus_dev_stop(cldev);
1124 mei_cl_bus_dev_destroy(cldev);
1134 struct mei_cl_device *cldev, *next;
1137 list_for_each_entry_safe(cldev, next, &bus->device_list, bus_list)
1138 mei_cl_bus_remove_device(cldev);
1155 struct mei_cl_device *cldev;
1164 cldev = mei_cl_bus_dev_alloc(bus, me_cl);
1165 if (!cldev)
1169 list_add_tail(&cldev->bus_list, &bus->device_list);
1181 struct mei_cl_device *cldev, *n;
1191 list_for_each_entry_safe(cldev, n, &bus->device_list, bus_list) {
1193 if (!mei_me_cl_is_active(cldev->me_cl)) {
1194 mei_cl_bus_remove_device(cldev);
1198 if (cldev->is_added)
1201 if (mei_cl_bus_dev_setup(bus, cldev))
1202 mei_cl_bus_dev_add(cldev);
1204 list_del_init(&cldev->bus_list);
1205 put_device(&cldev->dev);