drivers.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:3k
源码类别:

嵌入式Linux

开发平台:

Unix_Linux

  1. /*
  2. drivers.c
  3. Copyright (c) 1999 The Puffin Group 
  4. This is a collection of routines intended to register all the devices
  5. in a system, and register device drivers.
  6. */
  7. #include <linux/slab.h>
  8. #include <linux/types.h>
  9. #include <linux/kernel.h>
  10. #include <asm/hardware.h>
  11. #include <asm/io.h>
  12. #include <asm/pdc.h>
  13. extern struct hp_hardware *parisc_get_reference(
  14. unsigned short hw_type, unsigned long hversion, 
  15. unsigned long sversion );
  16. /* I'm assuming there'll never be 64 devices.  We should probably make 
  17.    this more flexible.  */
  18. #define MAX_DEVICES 64
  19. unsigned int num_devices = 0;
  20. struct hp_device devices[MAX_DEVICES];
  21. static unsigned long pdc_result[32] __attribute__ ((aligned (16))) = {0,0,0,0};
  22. static  u8 iodc_data[32] __attribute__ ((aligned (64)));
  23. /*
  24.  * XXX should we be using a locked array ?
  25.  */
  26.  
  27. int register_driver(struct pa_iodc_driver *driver)
  28. {
  29. unsigned int i;
  30. struct hp_device * device;
  31. for (;driver->check;driver++)  {
  32. for (i=0;i<num_devices;i++) {
  33. device = &devices[i];
  34. if (device->managed) continue;
  35. if ((driver->check & DRIVER_CHECK_HWTYPE) &&
  36.     (driver->hw_type != device->hw_type))
  37. continue;
  38. if ((driver->check & DRIVER_CHECK_HVERSION) &&
  39.     (driver->hversion != device->hversion))
  40. continue;
  41. if ((driver->check & DRIVER_CHECK_HVERSION_REV) &&
  42.     (driver->hversion_rev != device->hversion_rev))
  43. continue;
  44. if ((driver->check & DRIVER_CHECK_SVERSION) &&
  45.     (driver->sversion != device->sversion))
  46. continue;
  47. if ((driver->check & DRIVER_CHECK_SVERSION_REV) &&
  48.     (driver->sversion_rev != device->sversion_rev))
  49. continue;
  50. if ((driver->check & DRIVER_CHECK_OPT) &&
  51.     (driver->opt != device->opt))
  52. continue;
  53. if ( (*driver->callback)(device,driver) ==0) {
  54. device->managed=1;
  55. } else {
  56. printk("Warning : device (%d, 0x%x, 0x%x, 0x%x, 0x%x) NOT claimed by %s %sn",
  57. device->hw_type,
  58. device->hversion, device->hversion_rev,
  59. device->sversion, device->sversion_rev,
  60. driver->name, driver->version);
  61. }
  62. }
  63. }
  64. return 0;
  65. }
  66. struct hp_device * register_module(void *hpa)
  67. {
  68. struct hp_device * d;
  69. int status;
  70. d = &devices[num_devices];
  71. status = pdc_iodc_read(&pdc_result,hpa,0,&iodc_data,32 );
  72. if (status !=PDC_RET_OK) {
  73. /* There is no device here, so we'll skip it */
  74. return 0;
  75. }
  76. d->hw_type = iodc_data[3]&0x1f;
  77. d->hversion = (iodc_data[0]<<4)|((iodc_data[1]&0xf0)>>4);
  78. d->sversion = 
  79. ((iodc_data[4]&0x0f)<<16)|(iodc_data[5]<<8)|(iodc_data[6]);
  80. d->hversion_rev = iodc_data[1]&0x0f;
  81. d->sversion_rev = iodc_data[4]>>4;
  82. d->opt = iodc_data[7];
  83. d->hpa = hpa;
  84. d->managed=0;
  85. d->reference = parisc_get_reference(d->hw_type, d->hversion, 
  86. d->sversion);
  87. num_devices++;
  88. return d;
  89. }
  90. void print_devices(char * buf) {
  91. int i;
  92. struct hp_device *d;
  93. printk("Found devices:n");
  94. for (i=0;i<num_devices;i++) {
  95. d = &devices[i];
  96. printk(KERN_INFO 
  97. "%d. %s (%d) at 0x%p, versions 0x%x, 0x%x, 0x%x, 0x%x, 0x%xn", 
  98. i+1,
  99. (d->reference) ? d->reference->name : "Unknown device",
  100. d->hw_type,d->hpa, d->hversion, d->hversion_rev,
  101. d->sversion, d->sversion_rev, d->opt);
  102. }
  103. printk("That's a total of %d devices.n",num_devices);
  104. }