diff options
author | Alan Tull <atull@kernel.org> | 2018-05-16 19:49:56 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-05-25 12:23:55 -0400 |
commit | 371cd1b1fdabb33603340559049e46dfeae45b1e (patch) | |
tree | 0d1f187b9e48378b7f0b2b83b31f322f7435da17 /drivers/fpga/altera-hps2fpga.c | |
parent | 7085e2a94f7df5f419e3cfb2fe809ce6564e9629 (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/altera-hps2fpga.c')
-rw-r--r-- | drivers/fpga/altera-hps2fpga.c | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/drivers/fpga/altera-hps2fpga.c b/drivers/fpga/altera-hps2fpga.c index 406d2f10741f..e4d39f0a7572 100644 --- a/drivers/fpga/altera-hps2fpga.c +++ b/drivers/fpga/altera-hps2fpga.c | |||
@@ -139,6 +139,7 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev) | |||
139 | struct device *dev = &pdev->dev; | 139 | struct device *dev = &pdev->dev; |
140 | struct altera_hps2fpga_data *priv; | 140 | struct altera_hps2fpga_data *priv; |
141 | const struct of_device_id *of_id; | 141 | const struct of_device_id *of_id; |
142 | struct fpga_bridge *br; | ||
142 | u32 enable; | 143 | u32 enable; |
143 | int ret; | 144 | int ret; |
144 | 145 | ||
@@ -190,11 +191,24 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev) | |||
190 | } | 191 | } |
191 | } | 192 | } |
192 | 193 | ||
193 | ret = fpga_bridge_register(dev, priv->name, &altera_hps2fpga_br_ops, | 194 | br = fpga_bridge_create(dev, priv->name, &altera_hps2fpga_br_ops, priv); |
194 | priv); | 195 | if (!br) { |
195 | err: | 196 | ret = -ENOMEM; |
197 | goto err; | ||
198 | } | ||
199 | |||
200 | platform_set_drvdata(pdev, br); | ||
201 | |||
202 | ret = fpga_bridge_register(br); | ||
196 | if (ret) | 203 | if (ret) |
197 | clk_disable_unprepare(priv->clk); | 204 | goto err_free; |
205 | |||
206 | return 0; | ||
207 | |||
208 | err_free: | ||
209 | fpga_bridge_free(br); | ||
210 | err: | ||
211 | clk_disable_unprepare(priv->clk); | ||
198 | 212 | ||
199 | return ret; | 213 | return ret; |
200 | } | 214 | } |
@@ -204,7 +218,7 @@ static int alt_fpga_bridge_remove(struct platform_device *pdev) | |||
204 | struct fpga_bridge *bridge = platform_get_drvdata(pdev); | 218 | struct fpga_bridge *bridge = platform_get_drvdata(pdev); |
205 | struct altera_hps2fpga_data *priv = bridge->priv; | 219 | struct altera_hps2fpga_data *priv = bridge->priv; |
206 | 220 | ||
207 | fpga_bridge_unregister(&pdev->dev); | 221 | fpga_bridge_unregister(bridge); |
208 | 222 | ||
209 | clk_disable_unprepare(priv->clk); | 223 | clk_disable_unprepare(priv->clk); |
210 | 224 | ||