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-fpga2sdram.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-fpga2sdram.c')
-rw-r--r-- | drivers/fpga/altera-fpga2sdram.c | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/drivers/fpga/altera-fpga2sdram.c b/drivers/fpga/altera-fpga2sdram.c index d4eeb74388da..5a29ab6e3b28 100644 --- a/drivers/fpga/altera-fpga2sdram.c +++ b/drivers/fpga/altera-fpga2sdram.c | |||
@@ -106,6 +106,7 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev) | |||
106 | { | 106 | { |
107 | struct device *dev = &pdev->dev; | 107 | struct device *dev = &pdev->dev; |
108 | struct alt_fpga2sdram_data *priv; | 108 | struct alt_fpga2sdram_data *priv; |
109 | struct fpga_bridge *br; | ||
109 | u32 enable; | 110 | u32 enable; |
110 | struct regmap *sysmgr; | 111 | struct regmap *sysmgr; |
111 | int ret = 0; | 112 | int ret = 0; |
@@ -131,10 +132,18 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev) | |||
131 | /* Get f2s bridge configuration saved in handoff register */ | 132 | /* Get f2s bridge configuration saved in handoff register */ |
132 | regmap_read(sysmgr, SYSMGR_ISWGRP_HANDOFF3, &priv->mask); | 133 | regmap_read(sysmgr, SYSMGR_ISWGRP_HANDOFF3, &priv->mask); |
133 | 134 | ||
134 | ret = fpga_bridge_register(dev, F2S_BRIDGE_NAME, | 135 | br = fpga_bridge_create(dev, F2S_BRIDGE_NAME, |
135 | &altera_fpga2sdram_br_ops, priv); | 136 | &altera_fpga2sdram_br_ops, priv); |
136 | if (ret) | 137 | if (!br) |
138 | return -ENOMEM; | ||
139 | |||
140 | platform_set_drvdata(pdev, br); | ||
141 | |||
142 | ret = fpga_bridge_register(br); | ||
143 | if (ret) { | ||
144 | fpga_bridge_free(br); | ||
137 | return ret; | 145 | return ret; |
146 | } | ||
138 | 147 | ||
139 | dev_info(dev, "driver initialized with handoff %08x\n", priv->mask); | 148 | dev_info(dev, "driver initialized with handoff %08x\n", priv->mask); |
140 | 149 | ||
@@ -146,7 +155,7 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev) | |||
146 | (enable ? "enabling" : "disabling")); | 155 | (enable ? "enabling" : "disabling")); |
147 | ret = _alt_fpga2sdram_enable_set(priv, enable); | 156 | ret = _alt_fpga2sdram_enable_set(priv, enable); |
148 | if (ret) { | 157 | if (ret) { |
149 | fpga_bridge_unregister(&pdev->dev); | 158 | fpga_bridge_unregister(br); |
150 | return ret; | 159 | return ret; |
151 | } | 160 | } |
152 | } | 161 | } |
@@ -157,7 +166,9 @@ static int alt_fpga_bridge_probe(struct platform_device *pdev) | |||
157 | 166 | ||
158 | static int alt_fpga_bridge_remove(struct platform_device *pdev) | 167 | static int alt_fpga_bridge_remove(struct platform_device *pdev) |
159 | { | 168 | { |
160 | fpga_bridge_unregister(&pdev->dev); | 169 | struct fpga_bridge *br = platform_get_drvdata(pdev); |
170 | |||
171 | fpga_bridge_unregister(br); | ||
161 | 172 | ||
162 | return 0; | 173 | return 0; |
163 | } | 174 | } |