Lines Matching refs:cldev

262  * @cldev: me client device
272 ssize_t mei_cldev_send_vtag(struct mei_cl_device *cldev, const u8 *buf,
275 struct mei_cl *cl = cldev->cl;
284 * @cldev: me client device
294 ssize_t mei_cldev_recv_vtag(struct mei_cl_device *cldev, u8 *buf, size_t length,
297 struct mei_cl *cl = cldev->cl;
306 * @cldev: me client device
316 ssize_t mei_cldev_recv_nonblock_vtag(struct mei_cl_device *cldev, u8 *buf,
319 struct mei_cl *cl = cldev->cl;
328 * @cldev: me client device
336 ssize_t mei_cldev_send(struct mei_cl_device *cldev, const u8 *buf, size_t length)
338 return mei_cldev_send_vtag(cldev, buf, length, 0);
345 * @cldev: me client device
351 ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length)
353 return mei_cldev_recv_vtag(cldev, buf, length, NULL);
360 * @cldev: me client device
367 ssize_t mei_cldev_recv_nonblock(struct mei_cl_device *cldev, u8 *buf,
370 return mei_cldev_recv_nonblock_vtag(cldev, buf, length, NULL);
381 struct mei_cl_device *cldev;
384 cldev = container_of(work, struct mei_cl_device, rx_work);
386 bus = cldev->bus;
388 if (cldev->rx_cb)
389 cldev->rx_cb(cldev);
392 if (mei_cl_is_connected(cldev->cl))
393 mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL);
404 struct mei_cl_device *cldev;
406 cldev = container_of(work, struct mei_cl_device, notif_work);
408 if (cldev->notif_cb)
409 cldev->notif_cb(cldev);
422 struct mei_cl_device *cldev = cl->cldev;
424 if (!cldev || !cldev->notif_cb)
430 schedule_work(&cldev->notif_work);
447 struct mei_cl_device *cldev = cl->cldev;
449 if (!cldev || !cldev->rx_cb)
452 schedule_work(&cldev->rx_work);
460 * @cldev: me client devices
467 int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t rx_cb)
469 struct mei_device *bus = cldev->bus;
474 if (cldev->rx_cb)
477 cldev->rx_cb = rx_cb;
478 INIT_WORK(&cldev->rx_work, mei_cl_bus_rx_work);
481 if (mei_cl_is_connected(cldev->cl))
482 ret = mei_cl_read_start(cldev->cl, mei_cl_mtu(cldev->cl), NULL);
487 cancel_work_sync(&cldev->rx_work);
488 cldev->rx_cb = NULL;
499 * @cldev: me client devices
506 int mei_cldev_register_notif_cb(struct mei_cl_device *cldev,
509 struct mei_device *bus = cldev->bus;
515 if (cldev->notif_cb)
518 cldev->notif_cb = notif_cb;
519 INIT_WORK(&cldev->notif_work, mei_cl_bus_notif_work);
522 ret = mei_cl_notify_request(cldev->cl, NULL, 1);
525 cancel_work_sync(&cldev->notif_work);
526 cldev->notif_cb = NULL;
537 * @cldev: mei client device
541 void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev)
543 return dev_get_drvdata(&cldev->dev);
550 * @cldev: mei client device
553 void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data)
555 dev_set_drvdata(&cldev->dev, data);
562 * @cldev: mei client device
566 const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev)
568 return mei_me_cl_uuid(cldev->me_cl);
575 * @cldev: mei client device
579 u8 mei_cldev_ver(const struct mei_cl_device *cldev)
581 return mei_me_cl_ver(cldev->me_cl);
588 * @cldev: mei client device
592 bool mei_cldev_enabled(const struct mei_cl_device *cldev)
594 return mei_cl_is_connected(cldev->cl);
602 * @cldev: mei client device
606 static bool mei_cl_bus_module_get(struct mei_cl_device *cldev)
608 return try_module_get(cldev->bus->dev->driver->owner);
614 * @cldev: mei client device
616 static void mei_cl_bus_module_put(struct mei_cl_device *cldev)
618 module_put(cldev->bus->dev->driver->owner);
638 * @cldev: me client device
644 static int mei_cl_bus_vtag_alloc(struct mei_cl_device *cldev)
646 struct mei_cl *cl = cldev->cl;
668 * @cldev: me client device
670 static void mei_cl_bus_vtag_free(struct mei_cl_device *cldev)
672 struct mei_cl *cl = cldev->cl;
683 void *mei_cldev_dma_map(struct mei_cl_device *cldev, u8 buffer_id, size_t size)
689 if (!cldev || !buffer_id || !size)
693 dev_err(&cldev->dev, "Map size should be aligned to %lu\n",
698 cl = cldev->cl;
699 bus = cldev->bus;
707 cl->cldev = cldev;
721 int mei_cldev_dma_unmap(struct mei_cl_device *cldev)
727 if (!cldev)
730 cl = cldev->cl;
731 bus = cldev->bus;
747 * @cldev: me client device
751 int mei_cldev_enable(struct mei_cl_device *cldev)
753 struct mei_device *bus = cldev->bus;
757 cl = cldev->cl;
765 cl->cldev = cldev;
773 if (!mei_me_cl_is_active(cldev->me_cl)) {
774 dev_err(&cldev->dev, "me client is not active\n");
779 ret = mei_cl_bus_vtag_alloc(cldev);
783 ret = mei_cl_connect(cl, cldev->me_cl, NULL);
785 dev_err(&cldev->dev, "cannot connect\n");
786 mei_cl_bus_vtag_free(cldev);
803 * @cldev: client device
805 static void mei_cldev_unregister_callbacks(struct mei_cl_device *cldev)
807 if (cldev->rx_cb) {
808 cancel_work_sync(&cldev->rx_work);
809 cldev->rx_cb = NULL;
812 if (cldev->notif_cb) {
813 cancel_work_sync(&cldev->notif_work);
814 cldev->notif_cb = NULL;
822 * @cldev: me client device
826 int mei_cldev_disable(struct mei_cl_device *cldev)
832 if (!cldev)
835 cl = cldev->cl;
837 bus = cldev->bus;
839 mei_cldev_unregister_callbacks(cldev);
843 mei_cl_bus_vtag_free(cldev);
871 * @cldev: me client device
882 ssize_t mei_cldev_send_gsc_command(struct mei_cl_device *cldev,
900 if (!cldev || !sg_in || !sg_out)
903 cl = cldev->cl;
904 bus = cldev->bus;
995 * @cldev: me client device
1001 struct mei_cl_device_id *mei_cl_device_find(const struct mei_cl_device *cldev,
1009 uuid = mei_me_cl_uuid(cldev->me_cl);
1010 version = mei_me_cl_ver(cldev->me_cl);
1017 if (cldev->name[0])
1018 if (strncmp(cldev->name, id->name,
1045 const struct mei_cl_device *cldev = to_mei_cl_device(dev);
1049 if (!cldev->do_match)
1055 found_id = mei_cl_device_find(cldev, cldrv);
1071 struct mei_cl_device *cldev;
1076 cldev = to_mei_cl_device(dev);
1082 id = mei_cl_device_find(cldev, cldrv);
1086 if (!mei_cl_bus_module_get(cldev)) {
1087 dev_err(&cldev->dev, "get hw module failed");
1091 ret = cldrv->probe(cldev, id);
1093 mei_cl_bus_module_put(cldev);
1110 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1114 cldrv->remove(cldev);
1116 mei_cldev_unregister_callbacks(cldev);
1118 mei_cl_bus_module_put(cldev);
1125 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1127 return scnprintf(buf, PAGE_SIZE, "%s", cldev->name);
1134 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1135 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
1144 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1145 u8 version = mei_me_cl_ver(cldev->me_cl);
1154 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1155 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
1156 u8 version = mei_me_cl_ver(cldev->me_cl);
1159 cldev->name, uuid, version);
1166 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1167 u8 maxconn = mei_me_cl_max_conn(cldev->me_cl);
1176 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1177 u8 fixed = mei_me_cl_fixed(cldev->me_cl);
1186 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1187 bool vt = mei_me_cl_vt(cldev->me_cl);
1196 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1197 u32 maxlen = mei_me_cl_max_len(cldev->me_cl);
1226 const struct mei_cl_device *cldev = to_mei_cl_device(dev);
1227 const uuid_le *uuid = mei_me_cl_uuid(cldev->me_cl);
1228 u8 version = mei_me_cl_ver(cldev->me_cl);
1236 if (add_uevent_var(env, "MEI_CL_NAME=%s", cldev->name))
1240 cldev->name, uuid, version))
1271 struct mei_cl_device *cldev = to_mei_cl_device(dev);
1273 mei_cl_flush_queues(cldev->cl, NULL);
1274 mei_me_cl_put(cldev->me_cl);
1275 mei_dev_bus_put(cldev->bus);
1276 kfree(cldev->cl);
1277 kfree(cldev);
1289 * @cldev: me client device
1291 static inline void mei_cl_bus_set_name(struct mei_cl_device *cldev)
1293 dev_set_name(&cldev->dev, "%s-%pUl",
1294 dev_name(cldev->bus->dev),
1295 mei_me_cl_uuid(cldev->me_cl));
1309 struct mei_cl_device *cldev;
1312 cldev = kzalloc(sizeof(*cldev), GFP_KERNEL);
1313 if (!cldev)
1318 kfree(cldev);
1322 device_initialize(&cldev->dev);
1323 cldev->dev.parent = bus->dev;
1324 cldev->dev.bus = &mei_cl_bus_type;
1325 cldev->dev.type = &mei_cl_device_type;
1326 cldev->bus = mei_dev_bus_get(bus);
1327 cldev->me_cl = mei_me_cl_get(me_cl);
1328 cldev->cl = cl;
1329 mei_cl_bus_set_name(cldev);
1330 cldev->is_added = 0;
1331 INIT_LIST_HEAD(&cldev->bus_list);
1332 device_enable_async_suspend(&cldev->dev);
1334 return cldev;
1342 * @cldev: me client device
1347 struct mei_cl_device *cldev)
1349 cldev->do_match = 1;
1350 mei_cl_bus_dev_fixup(cldev);
1353 if (cldev->do_match)
1354 mei_cl_bus_set_name(cldev);
1356 return cldev->do_match == 1;
1362 * @cldev: me client device
1366 static int mei_cl_bus_dev_add(struct mei_cl_device *cldev)
1370 dev_dbg(cldev->bus->dev, "adding %pUL:%02X\n",
1371 mei_me_cl_uuid(cldev->me_cl),
1372 mei_me_cl_ver(cldev->me_cl));
1373 ret = device_add(&cldev->dev);
1375 cldev->is_added = 1;
1383 * @cldev: me client device
1385 static void mei_cl_bus_dev_stop(struct mei_cl_device *cldev)
1387 cldev->do_match = 0;
1388 if (cldev->is_added)
1389 device_release_driver(&cldev->dev);
1395 * @cldev: me client device
1399 static void mei_cl_bus_dev_destroy(struct mei_cl_device *cldev)
1402 WARN_ON(!mutex_is_locked(&cldev->bus->cl_bus_lock));
1404 if (!cldev->is_added)
1407 device_del(&cldev->dev);
1409 list_del_init(&cldev->bus_list);
1411 cldev->is_added = 0;
1412 put_device(&cldev->dev);
1418 * @cldev: me client device
1420 static void mei_cl_bus_remove_device(struct mei_cl_device *cldev)
1422 mei_cl_bus_dev_stop(cldev);
1423 mei_cl_bus_dev_destroy(cldev);
1433 struct mei_cl_device *cldev, *next;
1436 list_for_each_entry_safe(cldev, next, &bus->device_list, bus_list)
1437 mei_cl_bus_remove_device(cldev);
1454 struct mei_cl_device *cldev;
1463 cldev = mei_cl_bus_dev_alloc(bus, me_cl);
1464 if (!cldev)
1468 list_add_tail(&cldev->bus_list, &bus->device_list);
1480 struct mei_cl_device *cldev, *n;
1490 list_for_each_entry_safe(cldev, n, &bus->device_list, bus_list) {
1492 if (!mei_me_cl_is_active(cldev->me_cl)) {
1493 mei_cl_bus_remove_device(cldev);
1497 if (cldev->is_added)
1500 if (mei_cl_bus_dev_setup(bus, cldev))
1501 mei_cl_bus_dev_add(cldev);
1503 list_del_init(&cldev->bus_list);
1504 put_device(&cldev->dev);