Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.9.
 1/*
 2 * UWB Multi-interface Controller device management.
 3 *
 4 * Copyright (C) 2007 Cambridge Silicon Radio Ltd.
 5 *
 6 * This file is released under the GNU GPL v2.
 7 */
 8#include <linux/kernel.h>
 9#include <linux/slab.h>
10#include <linux/uwb/umc.h>
11
12static void umc_device_release(struct device *dev)
13{
14	struct umc_dev *umc = to_umc_dev(dev);
15
16	kfree(umc);
17}
18
19/**
20 * umc_device_create - allocate a child UMC device
21 * @parent: parent of the new UMC device.
22 * @n:      index of the new device.
23 *
24 * The new UMC device will have a bus ID of the parent with '-n'
25 * appended.
26 */
27struct umc_dev *umc_device_create(struct device *parent, int n)
28{
29	struct umc_dev *umc;
30
31	umc = kzalloc(sizeof(struct umc_dev), GFP_KERNEL);
32	if (umc) {
33		dev_set_name(&umc->dev, "%s-%d", dev_name(parent), n);
34		umc->dev.parent  = parent;
35		umc->dev.bus     = &umc_bus_type;
36		umc->dev.release = umc_device_release;
37
38		umc->dev.dma_mask = parent->dma_mask;
39	}
40	return umc;
41}
42EXPORT_SYMBOL_GPL(umc_device_create);
43
44/**
45 * umc_device_register - register a UMC device
46 * @umc: pointer to the UMC device
47 *
48 * The memory resource for the UMC device is acquired and the device
49 * registered with the system.
50 */
51int umc_device_register(struct umc_dev *umc)
52{
53	int err;
54
55	err = request_resource(umc->resource.parent, &umc->resource);
56	if (err < 0) {
57		dev_err(&umc->dev, "can't allocate resource range %pR: %d\n",
58			&umc->resource, err);
59		goto error_request_resource;
60	}
61
62	err = device_register(&umc->dev);
63	if (err < 0)
64		goto error_device_register;
65	return 0;
66
67error_device_register:
68	release_resource(&umc->resource);
69error_request_resource:
70	return err;
71}
72EXPORT_SYMBOL_GPL(umc_device_register);
73
74/**
75 * umc_device_unregister - unregister a UMC device
76 * @umc: pointer to the UMC device
77 *
78 * First we unregister the device, make sure the driver can do it's
79 * resource release thing and then we try to release any left over
80 * resources. We take a ref to the device, to make sure it doesn't
81 * disappear under our feet.
82 */
83void umc_device_unregister(struct umc_dev *umc)
84{
85	struct device *dev;
86	if (!umc)
87		return;
88	dev = get_device(&umc->dev);
89	device_unregister(&umc->dev);
90	release_resource(&umc->resource);
91	put_device(dev);
92}
93EXPORT_SYMBOL_GPL(umc_device_unregister);