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

DVD

开发平台:

Unix_Linux

  1. /*
  2.  * Video Capture Driver ( Video for Linux 1/2 )
  3.  * for the Matrox Marvel G200 and Rainbow Runner-G series
  4.  *
  5.  * This module is an interface to the MAVEN tv-out chip.
  6.  *
  7.  * Copyright (C) 1999  Ryan Drake <stiletto@mediaone.net>
  8.  *
  9.  * This program is free software; you can redistribute it and/or
  10.  * modify it under the terms of the GNU General Public License
  11.  * as published by the Free Software Foundation; either version 2
  12.  * of the License, or (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  17.  * GNU General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU General Public License
  20.  * along with this program; if not, write to the Free Software
  21.  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
  22.  */
  23. #ifndef __KERNEL__
  24. #define __KERNEL__
  25. #endif
  26. #ifndef MODULE
  27. #define MODULE
  28. #endif
  29. #include <linux/module.h>
  30. #include <linux/delay.h>
  31. #include <linux/errno.h>
  32. #include <linux/kernel.h>
  33. #include <linux/malloc.h>
  34. #include <linux/i2c.h>
  35. /* #include "maven.h"  - no such file yet */
  36. #define dprintk     if (debug) printk
  37. static int debug = 0; /* insmod parameter */
  38. #if LINUX_VERSION_CODE >= 0x020100
  39. MODULE_PARM(debug,"i");
  40. #endif
  41. #define MAVEN_DEVNAME  "maven"
  42. /* i2c identification */
  43. #define I2C_MAVEN 0x36
  44. /* maven control registers */
  45. /* TODO */
  46. /****************************************************************************
  47. * mga_dev : represents one maven chip.
  48. ****************************************************************************/
  49. struct maven {
  50. struct i2c_bus* bus;
  51.         unsigned char addr;
  52. };
  53. /****************************************************************************
  54. * raw register access : these routines directly interact with the maven's
  55. *                       registers via the i2c
  56. ****************************************************************************/
  57. static u8 maven_read( struct maven* mv, u8 reg )
  58. {
  59. char val = 0;
  60. LOCK_FLAGS;
  61. LOCK_I2C_BUS( mv->bus );
  62.         i2c_write( mv->bus, mv->addr, reg, 0, 0 );
  63.         val = i2c_read( mv->bus, mv->addr );
  64.         UNLOCK_I2C_BUS( mv->bus );
  65.         return val;
  66. }
  67. static void maven_write( struct maven* mv, u8 reg, u8 val )
  68. {
  69. LOCK_FLAGS;
  70. LOCK_I2C_BUS( mv->bus );
  71.         i2c_write( mv->bus, mv->addr, reg, val, 1 );
  72.         UNLOCK_I2C_BUS( mv->bus );
  73. }
  74. /* generic bit-twiddling */
  75. static void maven_and_or( struct maven* mv, u8 reg, u8 and_v, u8 or_v )
  76. {
  77.         u8 val = maven_read( mv, reg );
  78.         val = (val & and_v) | or_v;
  79.         maven_write( mv, reg, val );
  80. }
  81. static int maven_probe( struct maven* mv )
  82. {
  83.         int ack;
  84. LOCK_FLAGS;
  85. LOCK_I2C_BUS( mv->bus );
  86. ack = i2c_sendbyte( mv->bus, mv->addr, 2000 );
  87. UNLOCK_I2C_BUS( mv->bus );
  88.         return ack;
  89. }
  90. /****************************************************************************
  91. * maven private api
  92. ****************************************************************************/
  93. static void maven_reset( struct maven* mv )
  94. {
  95. }
  96. /****************************************************************************
  97. * maven i2c driver interface
  98. ****************************************************************************/
  99. static int maven_attach( struct i2c_device* device )
  100. {
  101. struct maven* mv;
  102. device->data = mv = kmalloc( sizeof( *mv ), GFP_KERNEL );
  103. if( mv == NULL )
  104. return -ENOMEM;
  105. memset( mv, 0, sizeof( *mv ) );
  106.         strcpy( device->name, MAVEN_DEVNAME );
  107. mv->bus = device->bus;
  108. mv->addr = device->addr;
  109.         /* probe the device to determine who it is */
  110.         if( !maven_probe( mv ) )
  111.         {
  112.                 /* nobody home */
  113.                 kfree( mv );
  114.                 return -1;
  115.         }
  116.         /* reset the device */
  117.         maven_reset( mv );
  118. printk(KERN_INFO "maven: attach: tv-outn" );
  119.         MOD_INC_USE_COUNT;
  120. return 0;
  121. }
  122. static int maven_detach(struct i2c_device* device)
  123. {
  124. struct maven* mv = (struct maven*)device->data;
  125. maven_reset( mv );
  126. kfree( mv );
  127. dprintk( "maven: detachn" );
  128. MOD_DEC_USE_COUNT;
  129. return 0;
  130. }
  131. static int maven_command( struct i2c_device* device, unsigned int cmd, void* arg )
  132. {
  133. struct maven* mv = (struct maven*)device->data;
  134. /* int* iarg = (int*)arg;
  135. */
  136.         if( !mv )
  137.                 return -ENODEV;
  138. dprintk( "maven: command %xn", cmd );
  139. switch (cmd)
  140.         {
  141.         /* TODO */
  142. default:
  143. return -EINVAL;
  144. }
  145. return 0;
  146. }
  147. struct i2c_driver i2c_driver_maven = {
  148.         MAVEN_DEVNAME,
  149. I2C_DRIVERID_MAVEN,
  150. I2C_MAVEN,
  151.         I2C_MAVEN,
  152. maven_attach,
  153. maven_detach,
  154. maven_command
  155. };
  156. /****************************************************************************
  157. * linux kernel module api
  158. ****************************************************************************/
  159. #ifdef MODULE
  160. int init_module(void)
  161. #else
  162. int maven_init(void)
  163. #endif
  164. {
  165. i2c_register_driver( &i2c_driver_maven );
  166. return 0;
  167. }
  168. #ifdef MODULE
  169. void cleanup_module(void)
  170. {
  171. i2c_unregister_driver( &i2c_driver_maven );
  172. }
  173. #endif