root/drivers/staging/uwb/umc-dev.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. umc_device_release
  2. umc_device_create
  3. umc_device_register
  4. umc_device_unregister

   1 // SPDX-License-Identifier: GPL-2.0-only
   2 /*
   3  * UWB Multi-interface Controller device management.
   4  *
   5  * Copyright (C) 2007 Cambridge Silicon Radio Ltd.
   6  */
   7 #include <linux/kernel.h>
   8 #include <linux/export.h>
   9 #include <linux/slab.h>
  10 #include "include/umc.h"
  11 
  12 static 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  */
  27 struct 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 }
  42 EXPORT_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  */
  51 int 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 
  67 error_device_register:
  68         put_device(&umc->dev);
  69         release_resource(&umc->resource);
  70 error_request_resource:
  71         return err;
  72 }
  73 EXPORT_SYMBOL_GPL(umc_device_register);
  74 
  75 /**
  76  * umc_device_unregister - unregister a UMC device
  77  * @umc: pointer to the UMC device
  78  *
  79  * First we unregister the device, make sure the driver can do it's
  80  * resource release thing and then we try to release any left over
  81  * resources. We take a ref to the device, to make sure it doesn't
  82  * disappear under our feet.
  83  */
  84 void umc_device_unregister(struct umc_dev *umc)
  85 {
  86         struct device *dev;
  87         if (!umc)
  88                 return;
  89         dev = get_device(&umc->dev);
  90         device_unregister(&umc->dev);
  91         release_resource(&umc->resource);
  92         put_device(dev);
  93 }
  94 EXPORT_SYMBOL_GPL(umc_device_unregister);

/* [<][>][^][v][top][bottom][index][help] */