1*8d59ecb2SHans Petter Selasky /*- 2*8d59ecb2SHans Petter Selasky * Copyright (c) 2010 Isilon Systems, Inc. 3*8d59ecb2SHans Petter Selasky * Copyright (c) 2010 iX Systems, Inc. 4*8d59ecb2SHans Petter Selasky * Copyright (c) 2010 Panasas, Inc. 5*8d59ecb2SHans Petter Selasky * Copyright (c) 2013, 2014 Mellanox Technologies, Ltd. 6*8d59ecb2SHans Petter Selasky * All rights reserved. 7*8d59ecb2SHans Petter Selasky * 8*8d59ecb2SHans Petter Selasky * Redistribution and use in source and binary forms, with or without 9*8d59ecb2SHans Petter Selasky * modification, are permitted provided that the following conditions 10*8d59ecb2SHans Petter Selasky * are met: 11*8d59ecb2SHans Petter Selasky * 1. Redistributions of source code must retain the above copyright 12*8d59ecb2SHans Petter Selasky * notice unmodified, this list of conditions, and the following 13*8d59ecb2SHans Petter Selasky * disclaimer. 14*8d59ecb2SHans Petter Selasky * 2. Redistributions in binary form must reproduce the above copyright 15*8d59ecb2SHans Petter Selasky * notice, this list of conditions and the following disclaimer in the 16*8d59ecb2SHans Petter Selasky * documentation and/or other materials provided with the distribution. 17*8d59ecb2SHans Petter Selasky * 18*8d59ecb2SHans Petter Selasky * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 19*8d59ecb2SHans Petter Selasky * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 20*8d59ecb2SHans Petter Selasky * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 21*8d59ecb2SHans Petter Selasky * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 22*8d59ecb2SHans Petter Selasky * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 23*8d59ecb2SHans Petter Selasky * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24*8d59ecb2SHans Petter Selasky * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25*8d59ecb2SHans Petter Selasky * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26*8d59ecb2SHans Petter Selasky * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 27*8d59ecb2SHans Petter Selasky * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28*8d59ecb2SHans Petter Selasky * 29*8d59ecb2SHans Petter Selasky * $FreeBSD$ 30*8d59ecb2SHans Petter Selasky */ 31*8d59ecb2SHans Petter Selasky #ifndef _LINUX_CDEV_H_ 32*8d59ecb2SHans Petter Selasky #define _LINUX_CDEV_H_ 33*8d59ecb2SHans Petter Selasky 34*8d59ecb2SHans Petter Selasky #include <linux/kobject.h> 35*8d59ecb2SHans Petter Selasky #include <linux/kdev_t.h> 36*8d59ecb2SHans Petter Selasky #include <linux/list.h> 37*8d59ecb2SHans Petter Selasky 38*8d59ecb2SHans Petter Selasky struct file_operations; 39*8d59ecb2SHans Petter Selasky struct inode; 40*8d59ecb2SHans Petter Selasky struct module; 41*8d59ecb2SHans Petter Selasky 42*8d59ecb2SHans Petter Selasky extern struct cdevsw linuxcdevsw; 43*8d59ecb2SHans Petter Selasky 44*8d59ecb2SHans Petter Selasky struct linux_cdev { 45*8d59ecb2SHans Petter Selasky struct kobject kobj; 46*8d59ecb2SHans Petter Selasky struct module *owner; 47*8d59ecb2SHans Petter Selasky struct cdev *cdev; 48*8d59ecb2SHans Petter Selasky dev_t dev; 49*8d59ecb2SHans Petter Selasky const struct file_operations *ops; 50*8d59ecb2SHans Petter Selasky }; 51*8d59ecb2SHans Petter Selasky 52*8d59ecb2SHans Petter Selasky static inline void 53*8d59ecb2SHans Petter Selasky cdev_release(struct kobject *kobj) 54*8d59ecb2SHans Petter Selasky { 55*8d59ecb2SHans Petter Selasky struct linux_cdev *cdev; 56*8d59ecb2SHans Petter Selasky 57*8d59ecb2SHans Petter Selasky cdev = container_of(kobj, struct linux_cdev, kobj); 58*8d59ecb2SHans Petter Selasky if (cdev->cdev) 59*8d59ecb2SHans Petter Selasky destroy_dev(cdev->cdev); 60*8d59ecb2SHans Petter Selasky kfree(cdev); 61*8d59ecb2SHans Petter Selasky } 62*8d59ecb2SHans Petter Selasky 63*8d59ecb2SHans Petter Selasky static inline void 64*8d59ecb2SHans Petter Selasky cdev_static_release(struct kobject *kobj) 65*8d59ecb2SHans Petter Selasky { 66*8d59ecb2SHans Petter Selasky struct linux_cdev *cdev; 67*8d59ecb2SHans Petter Selasky 68*8d59ecb2SHans Petter Selasky cdev = container_of(kobj, struct linux_cdev, kobj); 69*8d59ecb2SHans Petter Selasky if (cdev->cdev) 70*8d59ecb2SHans Petter Selasky destroy_dev(cdev->cdev); 71*8d59ecb2SHans Petter Selasky } 72*8d59ecb2SHans Petter Selasky 73*8d59ecb2SHans Petter Selasky static struct kobj_type cdev_ktype = { 74*8d59ecb2SHans Petter Selasky .release = cdev_release, 75*8d59ecb2SHans Petter Selasky }; 76*8d59ecb2SHans Petter Selasky 77*8d59ecb2SHans Petter Selasky static struct kobj_type cdev_static_ktype = { 78*8d59ecb2SHans Petter Selasky .release = cdev_static_release, 79*8d59ecb2SHans Petter Selasky }; 80*8d59ecb2SHans Petter Selasky 81*8d59ecb2SHans Petter Selasky static inline void 82*8d59ecb2SHans Petter Selasky cdev_init(struct linux_cdev *cdev, const struct file_operations *ops) 83*8d59ecb2SHans Petter Selasky { 84*8d59ecb2SHans Petter Selasky 85*8d59ecb2SHans Petter Selasky kobject_init(&cdev->kobj, &cdev_static_ktype); 86*8d59ecb2SHans Petter Selasky cdev->ops = ops; 87*8d59ecb2SHans Petter Selasky } 88*8d59ecb2SHans Petter Selasky 89*8d59ecb2SHans Petter Selasky static inline struct linux_cdev * 90*8d59ecb2SHans Petter Selasky cdev_alloc(void) 91*8d59ecb2SHans Petter Selasky { 92*8d59ecb2SHans Petter Selasky struct linux_cdev *cdev; 93*8d59ecb2SHans Petter Selasky 94*8d59ecb2SHans Petter Selasky cdev = kzalloc(sizeof(struct linux_cdev), M_WAITOK); 95*8d59ecb2SHans Petter Selasky if (cdev) 96*8d59ecb2SHans Petter Selasky kobject_init(&cdev->kobj, &cdev_ktype); 97*8d59ecb2SHans Petter Selasky return (cdev); 98*8d59ecb2SHans Petter Selasky } 99*8d59ecb2SHans Petter Selasky 100*8d59ecb2SHans Petter Selasky static inline void 101*8d59ecb2SHans Petter Selasky cdev_put(struct linux_cdev *p) 102*8d59ecb2SHans Petter Selasky { 103*8d59ecb2SHans Petter Selasky kobject_put(&p->kobj); 104*8d59ecb2SHans Petter Selasky } 105*8d59ecb2SHans Petter Selasky 106*8d59ecb2SHans Petter Selasky static inline int 107*8d59ecb2SHans Petter Selasky cdev_add(struct linux_cdev *cdev, dev_t dev, unsigned count) 108*8d59ecb2SHans Petter Selasky { 109*8d59ecb2SHans Petter Selasky if (count != 1) 110*8d59ecb2SHans Petter Selasky panic("cdev_add: Unsupported count: %d", count); 111*8d59ecb2SHans Petter Selasky cdev->cdev = make_dev(&linuxcdevsw, MINOR(dev), 0, 0, 0700, 112*8d59ecb2SHans Petter Selasky "%s", kobject_name(&cdev->kobj)); 113*8d59ecb2SHans Petter Selasky cdev->dev = dev; 114*8d59ecb2SHans Petter Selasky cdev->cdev->si_drv1 = cdev; 115*8d59ecb2SHans Petter Selasky 116*8d59ecb2SHans Petter Selasky return (0); 117*8d59ecb2SHans Petter Selasky } 118*8d59ecb2SHans Petter Selasky 119*8d59ecb2SHans Petter Selasky static inline void 120*8d59ecb2SHans Petter Selasky cdev_del(struct linux_cdev *cdev) 121*8d59ecb2SHans Petter Selasky { 122*8d59ecb2SHans Petter Selasky if (cdev->cdev) { 123*8d59ecb2SHans Petter Selasky destroy_dev(cdev->cdev); 124*8d59ecb2SHans Petter Selasky cdev->cdev = NULL; 125*8d59ecb2SHans Petter Selasky } 126*8d59ecb2SHans Petter Selasky kobject_put(&cdev->kobj); 127*8d59ecb2SHans Petter Selasky } 128*8d59ecb2SHans Petter Selasky 129*8d59ecb2SHans Petter Selasky #define cdev linux_cdev 130*8d59ecb2SHans Petter Selasky 131*8d59ecb2SHans Petter Selasky #endif /* _LINUX_CDEV_H_ */ 132