Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.5.6.
  1/* SPDX-License-Identifier: GPL-2.0 */
  2/*
  3 * Copyright (c) 2013-2016, Intel Corporation. All rights reserved.
  4 */
  5#ifndef _LINUX_MEI_CL_BUS_H
  6#define _LINUX_MEI_CL_BUS_H
  7
  8#include <linux/device.h>
  9#include <linux/uuid.h>
 10#include <linux/mod_devicetable.h>
 11
 12struct mei_cl_device;
 13struct mei_device;
 14
 15typedef void (*mei_cldev_cb_t)(struct mei_cl_device *cldev);
 16
 17/**
 18 * struct mei_cl_device - MEI device handle
 19 * An mei_cl_device pointer is returned from mei_add_device()
 20 * and links MEI bus clients to their actual ME host client pointer.
 21 * Drivers for MEI devices will get an mei_cl_device pointer
 22 * when being probed and shall use it for doing ME bus I/O.
 23 *
 24 * @bus_list: device on the bus list
 25 * @bus: parent mei device
 26 * @dev: linux driver model device pointer
 27 * @me_cl: me client
 28 * @cl: mei client
 29 * @name: device name
 30 * @rx_work: async work to execute Rx event callback
 31 * @rx_cb: Drivers register this callback to get asynchronous ME
 32 *	Rx buffer pending notifications.
 33 * @notif_work: async work to execute FW notif event callback
 34 * @notif_cb: Drivers register this callback to get asynchronous ME
 35 *	FW notification pending notifications.
 36 *
 37 * @do_match: wheather device can be matched with a driver
 38 * @is_added: device is already scanned
 39 * @priv_data: client private data
 40 */
 41struct mei_cl_device {
 42	struct list_head bus_list;
 43	struct mei_device *bus;
 44	struct device dev;
 45
 46	struct mei_me_client *me_cl;
 47	struct mei_cl *cl;
 48	char name[MEI_CL_NAME_SIZE];
 49
 50	struct work_struct rx_work;
 51	mei_cldev_cb_t rx_cb;
 52	struct work_struct notif_work;
 53	mei_cldev_cb_t notif_cb;
 54
 55	unsigned int do_match:1;
 56	unsigned int is_added:1;
 57
 58	void *priv_data;
 59};
 60
 61#define to_mei_cl_device(d) container_of(d, struct mei_cl_device, dev)
 62
 63struct mei_cl_driver {
 64	struct device_driver driver;
 65	const char *name;
 66
 67	const struct mei_cl_device_id *id_table;
 68
 69	int (*probe)(struct mei_cl_device *cldev,
 70		     const struct mei_cl_device_id *id);
 71	int (*remove)(struct mei_cl_device *cldev);
 72};
 73
 74int __mei_cldev_driver_register(struct mei_cl_driver *cldrv,
 75				struct module *owner);
 76#define mei_cldev_driver_register(cldrv)             \
 77	__mei_cldev_driver_register(cldrv, THIS_MODULE)
 78
 79void mei_cldev_driver_unregister(struct mei_cl_driver *cldrv);
 80
 81/**
 82 * module_mei_cl_driver - Helper macro for registering mei cl driver
 83 *
 84 * @__mei_cldrv: mei_cl_driver structure
 85 *
 86 *  Helper macro for mei cl drivers which do not do anything special in module
 87 *  init/exit, for eliminating a boilerplate code.
 88 */
 89#define module_mei_cl_driver(__mei_cldrv) \
 90	module_driver(__mei_cldrv, \
 91		      mei_cldev_driver_register,\
 92		      mei_cldev_driver_unregister)
 93
 94ssize_t mei_cldev_send(struct mei_cl_device *cldev, u8 *buf, size_t length);
 95ssize_t mei_cldev_recv(struct mei_cl_device *cldev, u8 *buf, size_t length);
 96ssize_t mei_cldev_recv_nonblock(struct mei_cl_device *cldev, u8 *buf,
 97				size_t length);
 98
 99int mei_cldev_register_rx_cb(struct mei_cl_device *cldev, mei_cldev_cb_t rx_cb);
100int mei_cldev_register_notif_cb(struct mei_cl_device *cldev,
101				mei_cldev_cb_t notif_cb);
102
103const uuid_le *mei_cldev_uuid(const struct mei_cl_device *cldev);
104u8 mei_cldev_ver(const struct mei_cl_device *cldev);
105
106void *mei_cldev_get_drvdata(const struct mei_cl_device *cldev);
107void mei_cldev_set_drvdata(struct mei_cl_device *cldev, void *data);
108
109int mei_cldev_enable(struct mei_cl_device *cldev);
110int mei_cldev_disable(struct mei_cl_device *cldev);
111bool mei_cldev_enabled(struct mei_cl_device *cldev);
112
113#endif /* _LINUX_MEI_CL_BUS_H */