linux/include/linux/mei_cl_bus.h
<<
>>
Prefs
   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 */
 114