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