Commit 15bbb300 authored by Wu Hao's avatar Wu Hao Committed by Greg Kroah-Hartman
Browse files

fpga: dfl: add id_table for dfl private feature driver



This patch adds id_table for each dfl private feature driver,
it allows to reuse same private feature driver to match and support
multiple dfl private features.

Signed-off-by: default avatarXu Yilun <yilun.xu@intel.com>
Signed-off-by: default avatarWu Hao <hao.wu@intel.com>
Acked-by: default avatarMoritz Fischer <mdf@kernel.org>
Acked-by: default avatarAlan Tull <atull@kernel.org>
Signed-off-by: default avatarMoritz Fischer <mdf@kernel.org>
Link: https://lore.kernel.org/r/1564914022-3710-6-git-send-email-hao.wu@intel.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent d2ad5ac1
Loading
Loading
Loading
Loading
+12 −2
Original line number Diff line number Diff line
@@ -323,6 +323,11 @@ port_hdr_ioctl(struct platform_device *pdev, struct dfl_feature *feature,
	return ret;
}

static const struct dfl_feature_id port_hdr_id_table[] = {
	{.id = PORT_FEATURE_ID_HEADER,},
	{0,}
};

static const struct dfl_feature_ops port_hdr_ops = {
	.init = port_hdr_init,
	.uinit = port_hdr_uinit,
@@ -384,6 +389,11 @@ static void port_afu_uinit(struct platform_device *pdev,
	device_remove_groups(&pdev->dev, port_afu_groups);
}

static const struct dfl_feature_id port_afu_id_table[] = {
	{.id = PORT_FEATURE_ID_AFU,},
	{0,}
};

static const struct dfl_feature_ops port_afu_ops = {
	.init = port_afu_init,
	.uinit = port_afu_uinit,
@@ -391,11 +401,11 @@ static const struct dfl_feature_ops port_afu_ops = {

static struct dfl_feature_driver port_feature_drvs[] = {
	{
		.id = PORT_FEATURE_ID_HEADER,
		.id_table = port_hdr_id_table,
		.ops = &port_hdr_ops,
	},
	{
		.id = PORT_FEATURE_ID_AFU,
		.id_table = port_afu_id_table,
		.ops = &port_afu_ops,
	},
	{
+8 −3
Original line number Diff line number Diff line
@@ -145,6 +145,11 @@ static long fme_hdr_ioctl(struct platform_device *pdev,
	return -ENODEV;
}

static const struct dfl_feature_id fme_hdr_id_table[] = {
	{.id = FME_FEATURE_ID_HEADER,},
	{0,}
};

static const struct dfl_feature_ops fme_hdr_ops = {
	.init = fme_hdr_init,
	.uinit = fme_hdr_uinit,
@@ -153,12 +158,12 @@ static const struct dfl_feature_ops fme_hdr_ops = {

static struct dfl_feature_driver fme_feature_drvs[] = {
	{
		.id = FME_FEATURE_ID_HEADER,
		.id_table = fme_hdr_id_table,
		.ops = &fme_hdr_ops,
	},
	{
		.id = FME_FEATURE_ID_PR_MGMT,
		.ops = &pr_mgmt_ops,
		.id_table = fme_pr_mgmt_id_table,
		.ops = &fme_pr_mgmt_ops,
	},
	{
		.ops = NULL,
+6 −1
Original line number Diff line number Diff line
@@ -470,7 +470,12 @@ static long fme_pr_ioctl(struct platform_device *pdev,
	return ret;
}

const struct dfl_feature_ops pr_mgmt_ops = {
const struct dfl_feature_id fme_pr_mgmt_id_table[] = {
	{.id = FME_FEATURE_ID_PR_MGMT,},
	{0}
};

const struct dfl_feature_ops fme_pr_mgmt_ops = {
	.init = pr_mgmt_init,
	.uinit = pr_mgmt_uinit,
	.ioctl = fme_pr_ioctl,
+2 −1
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@ struct dfl_fme {
	struct dfl_feature_platform_data *pdata;
};

extern const struct dfl_feature_ops pr_mgmt_ops;
extern const struct dfl_feature_ops fme_pr_mgmt_ops;
extern const struct dfl_feature_id fme_pr_mgmt_id_table[];

#endif /* __DFL_FME_H */
+16 −2
Original line number Diff line number Diff line
@@ -281,6 +281,21 @@ static int dfl_feature_instance_init(struct platform_device *pdev,
	return ret;
}

static bool dfl_feature_drv_match(struct dfl_feature *feature,
				  struct dfl_feature_driver *driver)
{
	const struct dfl_feature_id *ids = driver->id_table;

	if (ids) {
		while (ids->id) {
			if (ids->id == feature->id)
				return true;
			ids++;
		}
	}
	return false;
}

/**
 * dfl_fpga_dev_feature_init - init for sub features of dfl feature device
 * @pdev: feature device.
@@ -301,8 +316,7 @@ int dfl_fpga_dev_feature_init(struct platform_device *pdev,

	while (drv->ops) {
		dfl_fpga_dev_for_each_feature(pdata, feature) {
			/* match feature and drv using id */
			if (feature->id == drv->id) {
			if (dfl_feature_drv_match(feature, drv)) {
				ret = dfl_feature_instance_init(pdev, pdata,
								feature, drv);
				if (ret)
Loading