module.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:6k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /*
  2.   **********************************************************************
  3.   *
  4.   *     Copyright 1999, 2000 Creative Labs, Inc.
  5.   *
  6.   **********************************************************************
  7.   *
  8.   *     Date                 Author               Summary of changes
  9.   *     ----                 ------               ------------------
  10.   *     October 20, 1999     Andrew de Quincey    Rewrote and extended
  11.   *                          Lucien Murray-Pitts  original incomplete 
  12.   *                                               driver.
  13.   *
  14.   *     April 18, 1999       Andrew Veliath       Original Driver
  15.   *                                               implementation
  16.   *
  17.   **********************************************************************
  18.   *
  19.   *     This program is free software; you can redistribute it and/or
  20.   *     modify it under the terms of the GNU General Public License as
  21.   *     published by the Free Software Foundation; either version 2 of
  22.   *     the License, or (at your option) any later version.
  23.   *
  24.   *     This program is distributed in the hope that it will be useful,
  25.   *     but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.   *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.   *     GNU General Public License for more details.
  28.   *
  29.   *     You should have received a copy of the GNU General Public
  30.   *     License along with this program; if not, write to the Free
  31.   *     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,
  32.   *     USA.
  33.   *
  34.   **********************************************************************
  35.   */
  36. /**
  37.  *
  38.  * Driver for the Auravision VxP524 Video processor chip
  39.  * Driver maintenance functions
  40.  *
  41.  */
  42. #define EXPORT_SYMTAB
  43. #include <linux/config.h>
  44. #undef MODVERSION
  45. #undef CONFIG_MODVERSIONS
  46. #include <linux/version.h>
  47. #include <linux/module.h>
  48. #include <linux/kernel.h>
  49. #include <linux/sched.h>
  50. #include <linux/string.h>
  51. #include <linux/ptrace.h>
  52. #include <linux/errno.h>
  53. #include <linux/ioport.h>
  54. #include <linux/malloc.h>
  55. #include <linux/interrupt.h>
  56. #include <linux/pci.h>
  57. #include <linux/delay.h>
  58. #include <linux/init.h>
  59. #include <linux/pci.h>
  60. #include <linux/cdrom.h>
  61. #include <linux/videodev.h>
  62. #include <asm/byteorder.h>
  63. #include <asm/bitops.h>
  64. #include <asm/io.h>
  65. #include <asm/irq.h>
  66. #include <asm/uaccess.h>
  67. #include <asm/spinlock.h>
  68. #include <vxp524.h>
  69. /**
  70.  *
  71.  * Create new vxp524 driver instance
  72.  *
  73.  * @param pci_dev PCI device structure
  74.  * @param ops Lowlevel operations to talk to chip
  75.  * @param data Any extra data for said functions
  76.  *
  77.  */
  78. vxp524_t* vxp524_new (vxp524_ops_t* ops, void *data)
  79. {
  80.   vxp524_t* instance;
  81.   struct pci_dev* pci_dev = NULL;
  82.   // validate ops
  83.   if (ops == NULL)
  84.     return NULL;
  85.   // create new structure
  86.   instance = (vxp524_t*) vmalloc (sizeof(vxp524_t));
  87.   if (!instance)
  88.     return NULL;
  89.   // copy data across
  90.   instance->pci_dev = pci_dev;
  91.   instance->ops = ops;
  92.   instance->data = data;
  93.   // OK, probe for the device
  94.   if (!pci_present() ||
  95.       !(instance->pci_dev = pci_find_device (PCI_VENDOR_ID_AURAVISION,
  96.      PCI_DEVICE_ID_AURAVISION_VXP524,
  97.      pci_dev))) {
  98.     vfree(instance);
  99.     printk(KERN_ERR VXP524_LOGNAME ": PCI not present, or VxP524 not detectedn");
  100.     return(NULL);
  101.   }
  102.   // OK, remap the thing
  103.   instance->mem = instance->pci_dev->base_address[0] & PCI_BASE_ADDRESS_MEM_MASK;
  104.   instance->memlen = VXP524_MEMRANGE; 
  105.   if (!(instance->base = (unsigned long) ioremap(instance->mem, instance->memlen))) {
  106.     vfree(instance);
  107.     printk (KERN_ERR VXP524_LOGNAME ": unable to remap I/On");
  108.     return(NULL);
  109.   }
  110.   // Bus mastering not currently in use
  111.   instance->bmInUse = 0;
  112.   // enable PCI memory mapping & IRQ
  113.   vxp524_enable_mem(instance);
  114.   // init the chip
  115.   vxp524_init(instance);
  116.   // success message!
  117.   printk (KERN_INFO VXP524_LOGNAME ": [%s] mem 0x%lx-0x%lx, irq %dn",
  118.   instance->ops->name,
  119.   instance->mem, 
  120.   instance->mem + instance->memlen - 1,
  121.   instance->pci_dev->irq);
  122.   
  123.   // another module use
  124.   MOD_INC_USE_COUNT;
  125.   // return instance
  126.   return instance;
  127. }
  128. /**
  129.  *
  130.  * Destroy a vxp524 driver instance
  131.  *
  132.  * @param instance The instance to destroy
  133.  *
  134.  */
  135. extern void vxp524_free(vxp524_t* instance)
  136. {
  137.   char* tmpName = instance->ops->name;
  138.   // disable mem
  139.   vxp524_disable_mem(instance);
  140.   // unmap HW address
  141.   iounmap((char *) instance->base);
  142.   // free instance
  143.   vfree(instance);
  144.   // one less module use
  145.   MOD_DEC_USE_COUNT;
  146.   // log it
  147.   printk (KERN_INFO VXP524_LOGNAME ": [%s] instance destroyed.n", 
  148.   tmpName);
  149. }
  150. #ifdef MODULE
  151. int init_module (void)
  152. {
  153. return 0;
  154. }
  155. void cleanup_module (void)
  156. {
  157. }
  158. #endif
  159. EXPORT_SYMBOL(vxp524_new);
  160. EXPORT_SYMBOL(vxp524_free);
  161. EXPORT_SYMBOL(vxp524_disable_mem);
  162. EXPORT_SYMBOL(vxp524_enable_mem);
  163. EXPORT_SYMBOL(vxp524_get_reg);
  164. EXPORT_SYMBOL(vxp524_set_reg);
  165. EXPORT_SYMBOL(vxp524_get_reg16);
  166. EXPORT_SYMBOL(vxp524_set_reg16);
  167. EXPORT_SYMBOL(vxp524_get_reg24);
  168. EXPORT_SYMBOL(vxp524_set_reg24);
  169. EXPORT_SYMBOL(vxp524_get_reg32);
  170. EXPORT_SYMBOL(vxp524_set_reg32);
  171. EXPORT_SYMBOL(vxp524_get_bits);
  172. EXPORT_SYMBOL(vxp524_set_bits);
  173. EXPORT_SYMBOL(vxp524_i2s_init);
  174. EXPORT_SYMBOL(vxp524_i2s_close);
  175. EXPORT_SYMBOL(vxp524_i2s_set_sda);
  176. EXPORT_SYMBOL(vxp524_i2s_clear_sda);
  177. EXPORT_SYMBOL(vxp524_i2s_tri_sda);
  178. EXPORT_SYMBOL(vxp524_i2s_untri_sda);
  179. EXPORT_SYMBOL(vxp524_i2s_get_sda);
  180. EXPORT_SYMBOL(vxp524_i2s_set_scl);
  181. EXPORT_SYMBOL(vxp524_i2s_clear_scl);
  182. EXPORT_SYMBOL(vxp524_i2s_wait_till_sda_set);
  183. EXPORT_SYMBOL(vxp524_i2s_wait_till_scl_set);
  184. EXPORT_SYMBOL(vxp524_i2c_read_reg);
  185. EXPORT_SYMBOL(vxp524_i2c_write_reg);
  186. EXPORT_SYMBOL(vxp524_bm_send_data);
  187. EXPORT_SYMBOL(vxp524_bm_flush);
  188. EXPORT_SYMBOL(vxp524_bm_reset);
  189. EXPORT_SYMBOL(vxp524_bm_completed);
  190. EXPORT_SYMBOL(vxp524_init);
  191. EXPORT_SYMBOL(vxp524_bm_check_status);
  192. EXPORT_SYMBOL(vxp524_bm_not_in_use);