| 1 |
|
| 2 | |
| 3 | * Mediated device definition
|
| 4 | *
|
| 5 | * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
|
| 6 | * Author: Neo Jia <[email protected]>
|
| 7 | * Kirti Wankhede <[email protected]>
|
| 8 |
|
| 9 |
|
| 10 | #ifndef MDEV_H
|
| 11 | #define MDEV_H
|
| 12 |
|
| 13 | #include <linux/device.h>
|
| 14 | #include <linux/uuid.h>
|
| 15 |
|
| 16 | struct mdev_type;
|
| 17 |
|
| 18 | struct mdev_device {
|
| 19 | struct device dev;
|
| 20 | guid_t uuid;
|
| 21 | struct list_head next;
|
| 22 | struct mdev_type *type;
|
| 23 | bool active;
|
| 24 | };
|
| 25 |
|
| 26 | struct mdev_type {
|
| 27 |
|
| 28 | const char *sysfs_name;
|
| 29 | const char *pretty_name;
|
| 30 |
|
| 31 |
|
| 32 | struct mdev_parent *parent;
|
| 33 |
|
| 34 |
|
| 35 | struct kobject kobj;
|
| 36 | struct kobject *devices_kobj;
|
| 37 | };
|
| 38 |
|
| 39 |
|
| 40 | struct mdev_parent {
|
| 41 | struct device *dev;
|
| 42 | struct mdev_driver *mdev_driver;
|
| 43 | struct kset *mdev_types_kset;
|
| 44 |
|
| 45 | struct rw_semaphore unreg_sem;
|
| 46 | struct mdev_type **types;
|
| 47 | unsigned int nr_types;
|
| 48 | atomic_t available_instances;
|
| 49 | };
|
| 50 |
|
| 51 | static inline struct mdev_device *to_mdev_device(struct device *dev)
|
| 52 | {
|
| 53 | return container_of(dev, struct mdev_device, dev);
|
| 54 | }
|
| 55 |
|
| 56 | |
| 57 | * struct mdev_driver - Mediated device driver
|
| 58 | * @device_api: string to return for the device_api sysfs
|
| 59 | * @max_instances: maximum number of instances supported (optional)
|
| 60 | * @probe: called when new device created
|
| 61 | * @remove: called when device removed
|
| 62 | * @get_available: Return the max number of instances that can be created
|
| 63 | * @show_description: Print a description of the mtype
|
| 64 | * @driver: device driver structure
|
| 65 | *
|
| 66 | struct mdev_driver {
|
| 67 | const char *device_api;
|
| 68 | unsigned int max_instances;
|
| 69 | int (*probe)(struct mdev_device *dev);
|
| 70 | void (*remove)(struct mdev_device *dev);
|
| 71 | unsigned int (*get_available)(struct mdev_type *mtype);
|
| 72 | ssize_t (*show_description)(struct mdev_type *mtype, char *buf);
|
| 73 | struct device_driver driver;
|
| 74 | };
|
| 75 |
|
| 76 | int mdev_register_parent(struct mdev_parent *parent, struct device *dev,
|
| 77 | struct mdev_driver *mdev_driver, struct mdev_type **types,
|
| 78 | unsigned int nr_types);
|
| 79 | void mdev_unregister_parent(struct mdev_parent *parent);
|
| 80 |
|
| 81 | int mdev_register_driver(struct mdev_driver *drv);
|
| 82 | void mdev_unregister_driver(struct mdev_driver *drv);
|
| 83 |
|
| 84 | static inline struct device *mdev_dev(struct mdev_device *mdev)
|
| 85 | {
|
| 86 | return &mdev->dev;
|
| 87 | }
|
| 88 |
|
| 89 | #endif
|