aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/fpga/xilinx-pr-decoupler.c
diff options
context:
space:
mode:
authorAlan Tull <atull@kernel.org>2018-05-16 19:49:56 -0400
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-05-25 12:23:55 -0400
commit371cd1b1fdabb33603340559049e46dfeae45b1e (patch)
tree0d1f187b9e48378b7f0b2b83b31f322f7435da17 /drivers/fpga/xilinx-pr-decoupler.c
parent7085e2a94f7df5f419e3cfb2fe809ce6564e9629 (diff)
fpga: bridge: change api, don't use drvdata
Change fpga_bridge_register to not set drvdata. This is to support the case where a PCIe device can have more than one bridge. Add API functions to create/free the fpga bridge struct. Change fpga_bridge_register/unregister to take FPGA bridge struct as the only parameter. struct fpga_bridge *fpga_bridge_create(struct device *dev, const char *name, const struct fpga_bridge_ops *br_ops, void *priv); void fpga_bridge_free(struct fpga_bridge *br); int fpga_bridge_register(struct fpga_bridge *br); void fpga_bridge_unregister(struct fpga_bridge *br); Update the drivers that call fpga_bridge_register with the new API. Signed-off-by: Alan Tull <atull@kernel.org> Reported-by: Jiuyue Ma <majiuyue@huawei.com> Signed-off-by: Moritz Fischer <mdf@kernel.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/fpga/xilinx-pr-decoupler.c')
-rw-r--r--drivers/fpga/xilinx-pr-decoupler.c22
1 files changed, 17 insertions, 5 deletions
diff --git a/drivers/fpga/xilinx-pr-decoupler.c b/drivers/fpga/xilinx-pr-decoupler.c
index 0d7743089414..07ba1539e82c 100644
--- a/drivers/fpga/xilinx-pr-decoupler.c
+++ b/drivers/fpga/xilinx-pr-decoupler.c
@@ -94,6 +94,7 @@ MODULE_DEVICE_TABLE(of, xlnx_pr_decoupler_of_match);
94static int xlnx_pr_decoupler_probe(struct platform_device *pdev) 94static int xlnx_pr_decoupler_probe(struct platform_device *pdev)
95{ 95{
96 struct xlnx_pr_decoupler_data *priv; 96 struct xlnx_pr_decoupler_data *priv;
97 struct fpga_bridge *br;
97 int err; 98 int err;
98 struct resource *res; 99 struct resource *res;
99 100
@@ -120,16 +121,27 @@ static int xlnx_pr_decoupler_probe(struct platform_device *pdev)
120 121
121 clk_disable(priv->clk); 122 clk_disable(priv->clk);
122 123
123 err = fpga_bridge_register(&pdev->dev, "Xilinx PR Decoupler", 124 br = fpga_bridge_create(&pdev->dev, "Xilinx PR Decoupler",
124 &xlnx_pr_decoupler_br_ops, priv); 125 &xlnx_pr_decoupler_br_ops, priv);
126 if (!br) {
127 err = -ENOMEM;
128 goto err_clk;
129 }
130
131 platform_set_drvdata(pdev, br);
125 132
133 err = fpga_bridge_register(br);
126 if (err) { 134 if (err) {
127 dev_err(&pdev->dev, "unable to register Xilinx PR Decoupler"); 135 dev_err(&pdev->dev, "unable to register Xilinx PR Decoupler");
128 clk_unprepare(priv->clk); 136 goto err_clk;
129 return err;
130 } 137 }
131 138
132 return 0; 139 return 0;
140
141err_clk:
142 clk_unprepare(priv->clk);
143
144 return err;
133} 145}
134 146
135static int xlnx_pr_decoupler_remove(struct platform_device *pdev) 147static int xlnx_pr_decoupler_remove(struct platform_device *pdev)
@@ -137,7 +149,7 @@ static int xlnx_pr_decoupler_remove(struct platform_device *pdev)
137 struct fpga_bridge *bridge = platform_get_drvdata(pdev); 149 struct fpga_bridge *bridge = platform_get_drvdata(pdev);
138 struct xlnx_pr_decoupler_data *p = bridge->priv; 150 struct xlnx_pr_decoupler_data *p = bridge->priv;
139 151
140 fpga_bridge_unregister(&pdev->dev); 152 fpga_bridge_unregister(bridge);
141 153
142 clk_unprepare(p->clk); 154 clk_unprepare(p->clk);
143 155