root/drivers/dca/dca-sysfs.c

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

DEFINITIONS

This source file includes following definitions.
  1. dca_sysfs_add_req
  2. dca_sysfs_remove_req
  3. dca_sysfs_add_provider
  4. dca_sysfs_remove_provider
  5. dca_sysfs_init
  6. dca_sysfs_exit

   1 // SPDX-License-Identifier: GPL-2.0-or-later
   2 /*
   3  * Copyright(c) 2007 - 2009 Intel Corporation. All rights reserved.
   4  */
   5 
   6 #include <linux/kernel.h>
   7 #include <linux/spinlock.h>
   8 #include <linux/device.h>
   9 #include <linux/idr.h>
  10 #include <linux/kdev_t.h>
  11 #include <linux/err.h>
  12 #include <linux/dca.h>
  13 #include <linux/gfp.h>
  14 #include <linux/export.h>
  15 
  16 static struct class *dca_class;
  17 static struct idr dca_idr;
  18 static spinlock_t dca_idr_lock;
  19 
  20 int dca_sysfs_add_req(struct dca_provider *dca, struct device *dev, int slot)
  21 {
  22         struct device *cd;
  23         static int req_count;
  24 
  25         cd = device_create(dca_class, dca->cd, MKDEV(0, slot + 1), NULL,
  26                            "requester%d", req_count++);
  27         if (IS_ERR(cd))
  28                 return PTR_ERR(cd);
  29         return 0;
  30 }
  31 
  32 void dca_sysfs_remove_req(struct dca_provider *dca, int slot)
  33 {
  34         device_destroy(dca_class, MKDEV(0, slot + 1));
  35 }
  36 
  37 int dca_sysfs_add_provider(struct dca_provider *dca, struct device *dev)
  38 {
  39         struct device *cd;
  40         int ret;
  41 
  42         idr_preload(GFP_KERNEL);
  43         spin_lock(&dca_idr_lock);
  44 
  45         ret = idr_alloc(&dca_idr, dca, 0, 0, GFP_NOWAIT);
  46         if (ret >= 0)
  47                 dca->id = ret;
  48 
  49         spin_unlock(&dca_idr_lock);
  50         idr_preload_end();
  51         if (ret < 0)
  52                 return ret;
  53 
  54         cd = device_create(dca_class, dev, MKDEV(0, 0), NULL, "dca%d", dca->id);
  55         if (IS_ERR(cd)) {
  56                 spin_lock(&dca_idr_lock);
  57                 idr_remove(&dca_idr, dca->id);
  58                 spin_unlock(&dca_idr_lock);
  59                 return PTR_ERR(cd);
  60         }
  61         dca->cd = cd;
  62         return 0;
  63 }
  64 
  65 void dca_sysfs_remove_provider(struct dca_provider *dca)
  66 {
  67         device_unregister(dca->cd);
  68         dca->cd = NULL;
  69         spin_lock(&dca_idr_lock);
  70         idr_remove(&dca_idr, dca->id);
  71         spin_unlock(&dca_idr_lock);
  72 }
  73 
  74 int __init dca_sysfs_init(void)
  75 {
  76         idr_init(&dca_idr);
  77         spin_lock_init(&dca_idr_lock);
  78 
  79         dca_class = class_create(THIS_MODULE, "dca");
  80         if (IS_ERR(dca_class)) {
  81                 idr_destroy(&dca_idr);
  82                 return PTR_ERR(dca_class);
  83         }
  84         return 0;
  85 }
  86 
  87 void __exit dca_sysfs_exit(void)
  88 {
  89         class_destroy(dca_class);
  90         idr_destroy(&dca_idr);
  91 }
  92 

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