| /* SPDX-License-Identifier: GPL-2.0 */ | 
 | /* | 
 |  * Header file for DFL driver and device API | 
 |  * | 
 |  * Copyright (C) 2020 Intel Corporation, Inc. | 
 |  */ | 
 |  | 
 | #ifndef __LINUX_DFL_H | 
 | #define __LINUX_DFL_H | 
 |  | 
 | #include <linux/device.h> | 
 | #include <linux/mod_devicetable.h> | 
 |  | 
 | /** | 
 |  * enum dfl_id_type - define the DFL FIU types | 
 |  */ | 
 | enum dfl_id_type { | 
 | 	FME_ID = 0, | 
 | 	PORT_ID = 1, | 
 | 	DFL_ID_MAX, | 
 | }; | 
 |  | 
 | /** | 
 |  * struct dfl_device - represent an dfl device on dfl bus | 
 |  * | 
 |  * @dev: generic device interface. | 
 |  * @id: id of the dfl device. | 
 |  * @type: type of DFL FIU of the device. See enum dfl_id_type. | 
 |  * @feature_id: feature identifier local to its DFL FIU type. | 
 |  * @mmio_res: mmio resource of this dfl device. | 
 |  * @irqs: list of Linux IRQ numbers of this dfl device. | 
 |  * @num_irqs: number of IRQs supported by this dfl device. | 
 |  * @cdev: pointer to DFL FPGA container device this dfl device belongs to. | 
 |  * @id_entry: matched id entry in dfl driver's id table. | 
 |  */ | 
 | struct dfl_device { | 
 | 	struct device dev; | 
 | 	int id; | 
 | 	u16 type; | 
 | 	u16 feature_id; | 
 | 	u8 revision; | 
 | 	struct resource mmio_res; | 
 | 	int *irqs; | 
 | 	unsigned int num_irqs; | 
 | 	struct dfl_fpga_cdev *cdev; | 
 | 	const struct dfl_device_id *id_entry; | 
 | }; | 
 |  | 
 | /** | 
 |  * struct dfl_driver - represent an dfl device driver | 
 |  * | 
 |  * @drv: driver model structure. | 
 |  * @id_table: pointer to table of device IDs the driver is interested in. | 
 |  *	      { } member terminated. | 
 |  * @probe: mandatory callback for device binding. | 
 |  * @remove: callback for device unbinding. | 
 |  */ | 
 | struct dfl_driver { | 
 | 	struct device_driver drv; | 
 | 	const struct dfl_device_id *id_table; | 
 |  | 
 | 	int (*probe)(struct dfl_device *dfl_dev); | 
 | 	void (*remove)(struct dfl_device *dfl_dev); | 
 | }; | 
 |  | 
 | #define to_dfl_dev(d) container_of(d, struct dfl_device, dev) | 
 | #define to_dfl_drv(d) container_of(d, struct dfl_driver, drv) | 
 |  | 
 | /* | 
 |  * use a macro to avoid include chaining to get THIS_MODULE. | 
 |  */ | 
 | #define dfl_driver_register(drv) \ | 
 | 	__dfl_driver_register(drv, THIS_MODULE) | 
 | int __dfl_driver_register(struct dfl_driver *dfl_drv, struct module *owner); | 
 | void dfl_driver_unregister(struct dfl_driver *dfl_drv); | 
 |  | 
 | /* | 
 |  * module_dfl_driver() - Helper macro for drivers that don't do | 
 |  * anything special in module init/exit.  This eliminates a lot of | 
 |  * boilerplate.  Each module may only use this macro once, and | 
 |  * calling it replaces module_init() and module_exit(). | 
 |  */ | 
 | #define module_dfl_driver(__dfl_driver) \ | 
 | 	module_driver(__dfl_driver, dfl_driver_register, \ | 
 | 		      dfl_driver_unregister) | 
 |  | 
 | #endif /* __LINUX_DFL_H */ |