device.c

Go to the documentation of this file.
00001 /*****************************************************************************************
00002  Copyright (c) 2002-2005 The UbixOS Project
00003  All rights reserved.
00004 
00005  Redistribution and use in source and binary forms, with or without modification, are
00006  permitted provided that the following conditions are met:
00007 
00008  Redistributions of source code must retain the above copyright notice, this list of
00009  conditions, the following disclaimer and the list of authors.  Redistributions in binary
00010  form must reproduce the above copyright notice, this list of conditions, the following
00011  disclaimer and the list of authors in the documentation and/or other materials provided
00012  with the distribution. Neither the name of the UbixOS Project nor the names of its
00013  contributors may be used to endorse or promote products derived from this software
00014  without specific prior written permission.
00015 
00016  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
00017  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
00018  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
00019  THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
00020  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
00021  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
00022  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
00023  TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00024  SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00025 
00026  $Id: device_8c-source.html 88 2016-01-12 00:11:29Z reddawg $
00027 
00028 *****************************************************************************************/
00029 
00030 #include <sys/device.h>
00031 #include <ubixos/spinlock.h>
00032 #include <lib/kmalloc.h>
00033 #include <lib/kprintf.h>
00034 #include <assert.h>
00035 
00036 /* Linked list of drivers loaded in the system accessable by the subsystem only */
00037 static struct device_node *devices = 0x0;
00038 static spinLock_t deviceSpinLock = SPIN_LOCK_INITIALIZER;
00039 
00040 /*****************************************************************************************
00041 
00042  Function: int deviceAdd(int minor,char type,struct device_interface *devInfo);
00043 
00044  Description: This will add a device to the system
00045 
00046  Notes: 
00047 
00048  05/19/2004 - Improving Upon the spec
00049 
00050 *****************************************************************************************/
00051 int device_add(int minor,char type,struct device_interface *devInfo) {
00052   struct device_node *tmpDev = 0x0;
00053   
00054   
00055   tmpDev = (struct device_node *)kmalloc(sizeof(struct device_node));
00056   if(tmpDev == NULL)
00057         kprintf("Error Adding Device: memory failure\n");
00058 
00059   tmpDev->prev    = 0x0;
00060   tmpDev->minor   = minor;
00061   tmpDev->type    = type;
00062   tmpDev->devInfo = devInfo;
00063 
00064   spinLock(&deviceSpinLock);
00065   tmpDev->next    = devices;
00066   devices         = tmpDev;
00067   spinUnlock(&deviceSpinLock);
00068 
00069   if (tmpDev->devInfo->initialized == 0x0)
00070     return(tmpDev->devInfo->init(tmpDev));
00071   else
00072     return(0x0);
00073   }
00074 
00075 /*****************************************************************************************
00076 
00077  Function: struct device_node *deviceFind(int major,int minor);
00078 
00079  Description: This will find a device based on major minor
00080 
00081  Notes: 
00082 
00083  05/19/2004 - Improving Upon the spec
00084 
00085 *****************************************************************************************/
00086 struct device_node *device_find(int major,int minor) {
00087   struct device_node *tmpDev = 0x0;
00088  
00089   spinLock(&deviceSpinLock);
00090 
00091   for (tmpDev = devices;tmpDev;tmpDev=tmpDev->next) {
00092     if ((tmpDev->devInfo->major == major) && (tmpDev->minor == minor)) {
00093       spinUnlock(&deviceSpinLock);
00094       return(tmpDev);
00095       }
00096     }
00097 
00098   spinUnlock(&deviceSpinLock);
00099   return(0x0);
00100   }  
00101 
00102 
00103 /********************************************************************************************
00104 
00105 Function: int deviceRemove(struct *device_node);
00106 
00107 Description: This will remove a device based on it's pointer
00108 
00109 *********************************************************************************************/
00110 int device_remove(struct device_node *deviceToDelete)
00111 {
00112 struct device_node *current, *previous;
00113 
00114 
00115 current = devices;
00116 previous=NULL;
00117 spinLock(&deviceSpinLock);
00118                while(current != NULL)
00119                {
00120                   if(current==deviceToDelete) break;
00121                   else
00122                   {
00123                      previous = current;
00124                      current = current->next;
00125                   }
00126                }
00127                if(current == NULL) 
00128                 {
00129                   spinUnlock(&deviceSpinLock);
00130                   return 1;
00131                 }
00132                else
00133                {
00134                   if(current == devices) 
00135                         devices = devices->next;
00136                   else 
00137                         previous->next = current->next;
00138                   kfree(current);
00139                   spinUnlock(&deviceSpinLock);
00140                   return 1;
00141                }
00142 
00143   spinUnlock(&deviceSpinLock);
00144 return 0x0;
00145 }
00146 
00147 
00148 /***
00149  END
00150  ***/

Generated on Fri Dec 15 11:18:55 2006 for UbixOS V2 by  doxygen 1.4.7