diff options
author | Alan Tull <atull@kernel.org> | 2018-05-16 19:49:57 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2018-05-25 12:23:56 -0400 |
commit | 9f368977b4589e2fe0b9d3a4cbaf11ff6a58ecf5 (patch) | |
tree | 7b2e8d00ea068aa78dc308bb9d7c8cd4d55017bf /drivers/fpga/fpga-region.c | |
parent | 371cd1b1fdabb33603340559049e46dfeae45b1e (diff) |
fpga: region: change api, add fpga_region_create/free
Add fpga_region_create/free API functions.
Change fpga_region_register to take FPGA region struct as the only
parameter. Change fpga_region_unregister to return void.
struct fpga_region *fpga_region_create(struct device *dev,
struct fpga_manager *mgr,
int (*get_bridges)(struct fpga_region *));
void fpga_region_free(struct fpga_region *region);
int fpga_region_register(struct fpga_region *region);
void fpga_region_unregister(struct fpga_region *region);
Remove groups storage from struct fpga_region, it's not
needed. Callers can just "region->dev.groups = groups;"
after calling fpga_region_create.
Update the drivers that call fpga_region_register with the new API.
Signed-off-by: Alan Tull <atull@kernel.org>
Signed-off-by: Moritz Fischer <mdf@kernel.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/fpga/fpga-region.c')
-rw-r--r-- | drivers/fpga/fpga-region.c | 68 |
1 files changed, 55 insertions, 13 deletions
diff --git a/drivers/fpga/fpga-region.c b/drivers/fpga/fpga-region.c index f634a8ed5e2c..b3ba3e40c44b 100644 --- a/drivers/fpga/fpga-region.c +++ b/drivers/fpga/fpga-region.c | |||
@@ -167,18 +167,36 @@ err_put_region: | |||
167 | } | 167 | } |
168 | EXPORT_SYMBOL_GPL(fpga_region_program_fpga); | 168 | EXPORT_SYMBOL_GPL(fpga_region_program_fpga); |
169 | 169 | ||
170 | int fpga_region_register(struct device *dev, struct fpga_region *region) | 170 | /** |
171 | * fpga_region_create - alloc and init a struct fpga_region | ||
172 | * @dev: device parent | ||
173 | * @mgr: manager that programs this region | ||
174 | * @get_bridges: optional function to get bridges to a list | ||
175 | * | ||
176 | * Return: struct fpga_region or NULL | ||
177 | */ | ||
178 | struct fpga_region | ||
179 | *fpga_region_create(struct device *dev, | ||
180 | struct fpga_manager *mgr, | ||
181 | int (*get_bridges)(struct fpga_region *)) | ||
171 | { | 182 | { |
183 | struct fpga_region *region; | ||
172 | int id, ret = 0; | 184 | int id, ret = 0; |
173 | 185 | ||
186 | region = kzalloc(sizeof(*region), GFP_KERNEL); | ||
187 | if (!region) | ||
188 | return NULL; | ||
189 | |||
174 | id = ida_simple_get(&fpga_region_ida, 0, 0, GFP_KERNEL); | 190 | id = ida_simple_get(&fpga_region_ida, 0, 0, GFP_KERNEL); |
175 | if (id < 0) | 191 | if (id < 0) |
176 | return id; | 192 | goto err_free; |
177 | 193 | ||
194 | region->mgr = mgr; | ||
195 | region->get_bridges = get_bridges; | ||
178 | mutex_init(®ion->mutex); | 196 | mutex_init(®ion->mutex); |
179 | INIT_LIST_HEAD(®ion->bridge_list); | 197 | INIT_LIST_HEAD(®ion->bridge_list); |
198 | |||
180 | device_initialize(®ion->dev); | 199 | device_initialize(®ion->dev); |
181 | region->dev.groups = region->groups; | ||
182 | region->dev.class = fpga_region_class; | 200 | region->dev.class = fpga_region_class; |
183 | region->dev.parent = dev; | 201 | region->dev.parent = dev; |
184 | region->dev.of_node = dev->of_node; | 202 | region->dev.of_node = dev->of_node; |
@@ -188,23 +206,47 @@ int fpga_region_register(struct device *dev, struct fpga_region *region) | |||
188 | if (ret) | 206 | if (ret) |
189 | goto err_remove; | 207 | goto err_remove; |
190 | 208 | ||
191 | ret = device_add(®ion->dev); | 209 | return region; |
192 | if (ret) | ||
193 | goto err_remove; | ||
194 | |||
195 | return 0; | ||
196 | 210 | ||
197 | err_remove: | 211 | err_remove: |
198 | ida_simple_remove(&fpga_region_ida, id); | 212 | ida_simple_remove(&fpga_region_ida, id); |
199 | return ret; | 213 | err_free: |
214 | kfree(region); | ||
215 | |||
216 | return NULL; | ||
217 | } | ||
218 | EXPORT_SYMBOL_GPL(fpga_region_create); | ||
219 | |||
220 | /** | ||
221 | * fpga_region_free - free a struct fpga_region | ||
222 | * @region: FPGA region created by fpga_region_create | ||
223 | */ | ||
224 | void fpga_region_free(struct fpga_region *region) | ||
225 | { | ||
226 | ida_simple_remove(&fpga_region_ida, region->dev.id); | ||
227 | kfree(region); | ||
228 | } | ||
229 | EXPORT_SYMBOL_GPL(fpga_region_free); | ||
230 | |||
231 | /* | ||
232 | * fpga_region_register - register a FPGA region | ||
233 | * @region: FPGA region created by fpga_region_create | ||
234 | * Return: 0 or -errno | ||
235 | */ | ||
236 | int fpga_region_register(struct fpga_region *region) | ||
237 | { | ||
238 | return device_add(®ion->dev); | ||
239 | |||
200 | } | 240 | } |
201 | EXPORT_SYMBOL_GPL(fpga_region_register); | 241 | EXPORT_SYMBOL_GPL(fpga_region_register); |
202 | 242 | ||
203 | int fpga_region_unregister(struct fpga_region *region) | 243 | /* |
244 | * fpga_region_unregister - unregister a FPGA region | ||
245 | * @region: FPGA region | ||
246 | */ | ||
247 | void fpga_region_unregister(struct fpga_region *region) | ||
204 | { | 248 | { |
205 | device_unregister(®ion->dev); | 249 | device_unregister(®ion->dev); |
206 | |||
207 | return 0; | ||
208 | } | 250 | } |
209 | EXPORT_SYMBOL_GPL(fpga_region_unregister); | 251 | EXPORT_SYMBOL_GPL(fpga_region_unregister); |
210 | 252 | ||
@@ -212,7 +254,7 @@ static void fpga_region_dev_release(struct device *dev) | |||
212 | { | 254 | { |
213 | struct fpga_region *region = to_fpga_region(dev); | 255 | struct fpga_region *region = to_fpga_region(dev); |
214 | 256 | ||
215 | ida_simple_remove(&fpga_region_ida, region->dev.id); | 257 | fpga_region_free(region); |
216 | } | 258 | } |
217 | 259 | ||
218 | /** | 260 | /** |