ily.
aboutsummaryrefslogblamecommitdiffstats
path: root/drivers/misc/ioc4.c
blob: df03dd3bd0e2b331db3459f3a632ffd2f85f6155 (plain) (tree)
1
2
3
4
5
6
7
8




                                                                             
                                                                       

   
















                                                                              




                         
                       
                        
                       
                        
                       
                   







                                         
                                                                      




                                                                             
 


                          
 
                                
 
                               
                                  






                                                  
                                
                                                 


                                                
                         
 




                                                                    
                                                                   


                                                        

                                  





                                                    
 

                                     
                                
                               


                                            
                         
 




                                                                     
                                                                   


                                                        

                                  





                       























                                                                                
                     

                                                  


                                           

                                         











                                                          














                                                                          
                                                      

                                                                   
                                                        





                                                                     



                                                                      

                                                                        
                                              
           



                                                                         



                                                 



                                                                     


                                                                           


                                                      
                                 

                                                                        









                                                                     







                                                                       
                             












                                                                           
                                 

                                  
                                        
         









                                                                           
                                 

                                  
                                         
         




                                                             
           

                                           
                                  

 

                                                               
                                         
                    




                                                                    

                
                                                  

                                              
                                                                            
                                                 
                         


                             




                                                                            
                                                 













                                                                        
                                                          


                              
                                                                             



                                                                
                                                          








                                                                    
                                                          





                                                         






                                                                           




                                                                             


                                  













                                                                   

                                
                                                     

                                             




                                                                      
                                                                   


                                                        
                                  
 






                                                                               





                                                                           

         


                 
                                                                         





                                 

 
                                                    
                     







                                                  
                                




                                                                       
                                                                   


                                                        
                                  






                                                                             
                                                          
         
                                                                         




                                         
                                
                                 
                                  



                                               



                                                               
 
                                        


                                  
                                           

  






                                        
                 
               
 

                                                 
 
                   
                  

               
                                                                     
                                                 
                                            
 
 




                                                                            
                      


                                         
/*
 * This file is subject to the terms and conditions of the GNU General Public
 * License.  See the file "COPYING" in the main directory of this archive
 * for more details.
 *
 * Copyright (C) 2005-2006 Silicon Graphics, Inc.  All Rights Reserved.
 */

/* This file contains the master driver module for use by SGI IOC4 subdrivers.
 *
 * It allocates any resources shared between multiple subdevices, and
 * provides accessor functions (where needed) and the like for those
 * resources.  It also provides a mechanism for the subdevice modules
 * to support loading and unloading.
 *
 * Non-shared resources (e.g. external interrupt A_INT_OUT register page
 * alias, serial port and UART registers) are handled by the subdevice
 * modules themselves.
 *
 * This is all necessary because IOC4 is not implemented as a multi-function
 * PCI device, but an amalgamation of disparate registers for several
 * types of device (ATA, serial, external interrupts).  The normal
 * resource management in the kernel doesn't have quite the right interfaces
 * to handle this situation (e.g. multiple modules can't claim the same
 * PCI ID), thus this IOC4 master module.
 */

#include <linux/errno.h>
#include <linux/module.h>
#include <linux/pci.h>
#include <linux/ioc4.h>
#include <linux/ktime.h>
#include <linux/slab.h>
#include <linux/mutex.h>
#include <linux/time.h>
#include <asm/io.h>

/***************
 * Definitions *
 ***************/

/* Tweakable values */

/* PCI bus speed detection/calibration */
#define IOC4_CALIBRATE_COUNT 63		/* Calibration cycle period */
#define IOC4_CALIBRATE_CYCLES 256	/* Average over this many cycles */
#define IOC4_CALIBRATE_DISCARD 2	/* Discard first few cycles */
#define IOC4_CALIBRATE_LOW_MHZ 25	/* Lower bound on bus speed sanity */
#define IOC4_CALIBRATE_HIGH_MHZ 75	/* Upper bound on bus speed sanity */
#define IOC4_CALIBRATE_DEFAULT_MHZ 66	/* Assumed if sanity check fails */

/************************
 * Submodule management *
 ************************/

static DEFINE_MUTEX(ioc4_mutex);

static LIST_HEAD(ioc4_devices);
static LIST_HEAD(ioc4_submodules);