On Wed, Feb 14, 2018 at 3:03 PM, Moritz Fischer <mdf@xxxxxxxxxx> wrote: Hi Moritz, > HI Hao, > > On Tue, Feb 13, 2018 at 05:24:36PM +0800, Wu Hao wrote: >> From: Xiao Guangrong <guangrong.xiao@xxxxxxxxxxxxxxx> >> >> This patch abstracts the common operations of the sub features, and defines >> the feature_ops data structure, including init, uinit and ioctl function >> pointers. And this patch adds some common helper functions for FME and AFU >> drivers, e.g feature_dev_use_begin/end which are used to ensure exclusive >> usage of the feature device file. >> >> Signed-off-by: Tim Whisonant <tim.whisonant@xxxxxxxxx> >> Signed-off-by: Enno Luebbers <enno.luebbers@xxxxxxxxx> >> Signed-off-by: Shiva Rao <shiva.rao@xxxxxxxxx> >> Signed-off-by: Christopher Rauer <christopher.rauer@xxxxxxxxx> >> Signed-off-by: Kang Luwei <luwei.kang@xxxxxxxxx> >> Signed-off-by: Zhang Yi <yi.z.zhang@xxxxxxxxx> >> Signed-off-by: Xiao Guangrong <guangrong.xiao@xxxxxxxxxxxxxxx> >> Signed-off-by: Wu Hao <hao.wu@xxxxxxxxx> >> --- >> v2: rebased >> v3: use const for feature_ops. >> replace pci related function. >> v4: rebase and add more comments in code. >> --- >> drivers/fpga/dfl.c | 59 +++++++++++++++++++++++++++++++++++++ >> drivers/fpga/dfl.h | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++- >> 2 files changed, 143 insertions(+), 1 deletion(-) >> >> diff --git a/drivers/fpga/dfl.c b/drivers/fpga/dfl.c >> index 38dc819..c0aad87 100644 >> --- a/drivers/fpga/dfl.c >> +++ b/drivers/fpga/dfl.c >> @@ -74,6 +74,65 @@ static enum fpga_id_type feature_dev_id_type(struct platform_device *pdev) >> return FPGA_ID_MAX; >> } >> >> +void fpga_dev_feature_uinit(struct platform_device *pdev) >> +{ >> + struct feature *feature; >> + struct feature_platform_data *pdata = dev_get_platdata(&pdev->dev); > See comment below w.r.t ordering declarations. Not a must for sure. >> + >> + fpga_dev_for_each_feature(pdata, feature) >> + if (feature->ops) { >> + feature->ops->uinit(pdev, feature); >> + feature->ops = NULL; >> + } >> +} >> +EXPORT_SYMBOL_GPL(fpga_dev_feature_uinit); >> + >> +static int >> +feature_instance_init(struct platform_device *pdev, >> + struct feature_platform_data *pdata, >> + struct feature *feature, struct feature_driver *drv) >> +{ >> + int ret; >> + >> + WARN_ON(!feature->ioaddr); > > Not sure I understand correctly, is the !feature->ioaddr a use-case that > happens? If not just return early. >> + >> + ret = drv->ops->init(pdev, feature); >> + if (ret) >> + return ret; >> + >> + feature->ops = drv->ops; >> + >> + return ret; >> +} >> + >> +int fpga_dev_feature_init(struct platform_device *pdev, >> + struct feature_driver *feature_drvs) >> +{ >> + struct feature *feature; >> + struct feature_driver *drv = feature_drvs; >> + struct feature_platform_data *pdata = dev_get_platdata(&pdev->dev); >> + int ret; > We don't have clear guidelines here, but some subsystems want reverse > X-Mas tree declarations. Sounds good! I agree. Alan -- To unsubscribe from this list: send the line "unsubscribe linux-api" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html