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/xilinx-pr-decoupler.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/xilinx-pr-decoupler.c')
-rw-r--r-- | drivers/fpga/xilinx-pr-decoupler.c | 22 |
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); | |||
94 | static int xlnx_pr_decoupler_probe(struct platform_device *pdev) | 94 | static 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 | |||
141 | err_clk: | ||
142 | clk_unprepare(priv->clk); | ||
143 | |||
144 | return err; | ||
133 | } | 145 | } |
134 | 146 | ||
135 | static int xlnx_pr_decoupler_remove(struct platform_device *pdev) | 147 | static 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 | ||