On Tue, Sep 15, 2020 at 11:27:53AM +0800, Xu Yilun wrote: > The patch moves dfl-bus related APIs to include/linux/fpga/dfl.h > > Now the DFL device drivers could be made as independent modules and put > in different folders according to their functionality. In order for > scattered DFL device drivers to include dfl bus APIs, move the dfl bus > APIs to a new header file in the public folder. > > Signed-off-by: Xu Yilun <yilun.xu@xxxxxxxxx> > Reviewed-by: Tom Rix <trix@xxxxxxxxxx> > Acked-by: Wu Hao <hao.wu@xxxxxxxxx> > --- > v2: updated the MAINTAINERS under FPGA DFL DRIVERS > improve the comments > rename the dfl-bus.h to dfl.h > --- > MAINTAINERS | 1 + > drivers/fpga/dfl-n3000-nios.c | 3 +- > drivers/fpga/dfl.c | 1 + > drivers/fpga/dfl.h | 72 ------------------------------------ > include/linux/fpga/dfl.h | 86 +++++++++++++++++++++++++++++++++++++++++++ > 5 files changed, 89 insertions(+), 74 deletions(-) > create mode 100644 include/linux/fpga/dfl.h > > diff --git a/MAINTAINERS b/MAINTAINERS > index 31c5165..fa46592 100644 > --- a/MAINTAINERS > +++ b/MAINTAINERS > @@ -6883,6 +6883,7 @@ S: Maintained > F: Documentation/ABI/testing/sysfs-bus-dfl > F: Documentation/fpga/dfl.rst > F: drivers/fpga/dfl* > +F: include/linux/fpga/dfl.h > F: include/uapi/linux/fpga-dfl.h > > FPGA MANAGER FRAMEWORK > diff --git a/drivers/fpga/dfl-n3000-nios.c b/drivers/fpga/dfl-n3000-nios.c > index 70b44c3..5088f8f 100644 > --- a/drivers/fpga/dfl-n3000-nios.c > +++ b/drivers/fpga/dfl-n3000-nios.c > @@ -11,6 +11,7 @@ > */ > #include <linux/bitfield.h> > #include <linux/errno.h> > +#include <linux/fpga/dfl.h> > #include <linux/io.h> > #include <linux/io-64-nonatomic-lo-hi.h> > #include <linux/kernel.h> > @@ -22,8 +23,6 @@ > #include <linux/spi/spi.h> > #include <linux/types.h> > > -#include "dfl.h" > - > static char *fec_mode = "rs"; > module_param(fec_mode, charp, 0444); > MODULE_PARM_DESC(fec_mode, "FEC mode of the ethernet retimer on Intel PAC N3000"); > diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c > index b450870..8bf6e99 100644 > --- a/drivers/fpga/dfl.c > +++ b/drivers/fpga/dfl.c > @@ -11,6 +11,7 @@ > * Xiao Guangrong <guangrong.xiao@xxxxxxxxxxxxxxx> > */ > #include <linux/fpga-dfl.h> > +#include <linux/fpga/dfl.h> > #include <linux/module.h> > #include <linux/uaccess.h> > > diff --git a/drivers/fpga/dfl.h b/drivers/fpga/dfl.h > index d5e050a..2b82c96 100644 > --- a/drivers/fpga/dfl.h > +++ b/drivers/fpga/dfl.h > @@ -517,76 +517,4 @@ long dfl_feature_ioctl_set_irq(struct platform_device *pdev, > struct dfl_feature *feature, > unsigned long arg); > > -/** > - * enum dfl_id_type - define the DFL FIU types > - */ > -enum dfl_id_type { > - FME_ID, > - PORT_ID, > - DFL_ID_MAX, > -}; > - > -/** > - * struct dfl_device - represent an dfl device on dfl bus > - * > - * @dev: generic device interface. > - * @id: id of the dfl device. > - * @type: contains 4 bits DFL FIU type of the device. See enum dfl_id_type. > - * @feature_id: contains 12 bits 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; > - u8 type; > - u16 feature_id; > - 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 /* __FPGA_DFL_H */ > diff --git a/include/linux/fpga/dfl.h b/include/linux/fpga/dfl.h > new file mode 100644 > index 0000000..0d7806f > --- /dev/null > +++ b/include/linux/fpga/dfl.h > @@ -0,0 +1,86 @@ > +/* SPDX-License-Identifier: GPL-2.0 */ > +/* > + * Header file for DFL driver and device API > + * > + * Copyright (C) 2020 Intel Corporation, Inc. > + */ > + > +#ifndef __LINUX_FPGA_DFL_H > +#define __LINUX_FPGA_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, > + PORT_ID, > + DFL_ID_MAX, > +}; > + > +/** > + * struct dfl_device - represent an dfl device on dfl bus > + * > + * @dev: generic device interface. > + * @id: id of the dfl device. > + * @type: contains 4 bits DFL FIU type of the device. See enum dfl_id_type. > + * @feature_id: contains 12 bits 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; > + u8 type; > + u16 feature_id; > + 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_FPGA_DFL_H */ > -- > 2.7.4 > Applied to for-next, Thanks