SOURCES: linux-2.4.31-i2c-2.9.2-drivers-i2c.diff (NEW) e0b79f7ae35...

qboosh qboosh at pld-linux.org
Sat Dec 3 19:01:21 CET 2005


Author: qboosh                       Date: Sat Dec  3 18:01:21 2005 GMT
Module: SOURCES                       Tag: HEAD
---- Log message:
e0b79f7ae35f206630315480f943bcfa  linux-2.4.31-i2c-2.9.2-drivers-i2c.diff

---- Files affected:
SOURCES:
   linux-2.4.31-i2c-2.9.2-drivers-i2c.diff (NONE -> 1.1)  (NEW)

---- Diffs:

================================================================
Index: SOURCES/linux-2.4.31-i2c-2.9.2-drivers-i2c.diff
diff -u /dev/null SOURCES/linux-2.4.31-i2c-2.9.2-drivers-i2c.diff:1.1
--- /dev/null	Sat Dec  3 19:01:21 2005
+++ SOURCES/linux-2.4.31-i2c-2.9.2-drivers-i2c.diff	Sat Dec  3 19:01:16 2005
@@ -0,0 +1,7695 @@
+--- linux-old/Documentation/Configure.help	Tue Sep  6 21:04:49 2005
++++ linux/Documentation/Configure.help	Tue Sep  6 21:05:35 2005
+@@ -19370,6 +19370,16 @@
+   <file:Documentation/modules.txt>.
+   The module will be called i2c-velleman.o.
+ 
++Basic I2C on Parallel Port adapter
++CONFIG_I2C_PPORT
++  This supports directly connecting I2C devices to the parallel port.
++  See <file:Documentation/i2c/i2c-pport> for more information.
++
++  This driver is also available as a module.  If you want to compile
++  it as a module, say M here and read
++  <file:Documentation/modules.txt>.
++  The module will be called i2c-pport.o.
++
+ I2C PCF 8584 interfaces
+ CONFIG_I2C_ALGOPCF
+   This allows you to use a range of I2C adapters called PCF adapters.
+@@ -19391,6 +19401,15 @@
+   <file:Documentation/modules.txt>.
+   The module will be called i2c-elektor.o.
+ 
++PCF on the EPP Parallel Port
++CONFIG_I2C_PCFEPP
++  This supports the PCF8584 connected to the parallel port.
++
++  This driver is also available as a module.  If you want to compile
++  it as a module, say M here and read
++  <file:Documentation/modules.txt>.
++  The module will be called i2c-pcf-epp.o.
++
+ ITE I2C Algorithm
+ CONFIG_ITE_I2C_ALGO
+   This supports the use the ITE8172 I2C interface found on some MIPS
+@@ -19428,6 +19447,51 @@
+   Supports the SGI interfaces like the ones found on SGI Indy VINO
+   or SGI O2 MACE.
+ 
++Motorola 8xx I2C algorithm
++CONFIG_I2C_ALGO8XX
++  This is the algorithm that allows you to use Motorola 8xx I2C adapters.
++
++  This driver is also available as a module.  If you want to compile
++  it as a module, say M here and read
++  <file:Documentation/modules.txt>.
++  The module will be called i2c-algo-8xx.o.
++
++Motorola 8xx I2C interface
++CONFIG_I2C_RPXLITE
++  This supports the Motorola 8xx I2C device.
++
++  This driver is also available as a module.  If you want to compile
++  it as a module, say M here and read
++  <file:Documentation/modules.txt>.
++  The module will be called i2c-rpx.o.
++
++IBM 405 I2C algorithm
++CONFIG_I2C_IBM_OCP_ALGO
++  This is the algorithm that allows you to use IBM 405 I2C adapters.
++
++  This driver is also available as a module.  If you want to compile
++  it as a module, say M here and read
++  <file:Documentation/modules.txt>.
++  The module will be called i2c-algo-ibm_ocp.o.
++
++IBM 405 I2C interface
++CONFIG_I2C_IBM_OCP_ADAP
++  This supports the IBM 405 I2C device.
++
++  This driver is also available as a module.  If you want to compile
++  it as a module, say M here and read
++  <file:Documentation/modules.txt>.
++  The module will be called i2c-adap-ibm_ocp.o.
++
++StrongARM SA-1110 interface
++CONFIG_I2C_FRODO
++  This supports the StrongARM SA-1110 Development Board.
++
++  This driver is also available as a module.  If you want to compile
++  it as a module, say M here and read
++  <file:Documentation/modules.txt>.
++  The module will be called i2c-frodo.o.
++
+ I2C device interface
+ CONFIG_I2C_CHARDEV
+   Say Y here to use i2c-* device files, usually found in the /dev
+--- linux-old/drivers/i2c/Config.in	Wed Apr 14 13:05:29 2004
++++ linux/drivers/i2c/Config.in	Tue Sep  6 21:05:35 2005
+@@ -12,6 +12,10 @@
+       dep_tristate '  Philips style parallel port adapter' CONFIG_I2C_PHILIPSPAR $CONFIG_I2C_ALGOBIT $CONFIG_PARPORT
+       dep_tristate '  ELV adapter' CONFIG_I2C_ELV $CONFIG_I2C_ALGOBIT
+       dep_tristate '  Velleman K8000 adapter' CONFIG_I2C_VELLEMAN $CONFIG_I2C_ALGOBIT
++      dep_tristate '  Basic I2C on Parallel Port' CONFIG_I2C_PPORT $CONFIG_I2C_ALGOBIT
++      if [ "$CONFIG_ARCH_SA1100" = "y" ]; then
++         dep_tristate 'SA1100 I2C Adapter' CONFIG_I2C_FRODO $CONFIG_I2C_ALGOBIT
++      fi
+       dep_tristate '  NatSemi SCx200 I2C using GPIO pins' CONFIG_SCx200_I2C $CONFIG_SCx200_GPIO $CONFIG_I2C_ALGOBIT
+       if [ "$CONFIG_SCx200_I2C" != "n" ]; then
+          int  '    GPIO pin used for SCL' CONFIG_SCx200_I2C_SCL 12
+@@ -24,6 +28,7 @@
+    dep_tristate 'I2C PCF 8584 interfaces' CONFIG_I2C_ALGOPCF $CONFIG_I2C
+    if [ "$CONFIG_I2C_ALGOPCF" != "n" ]; then
+       dep_tristate '  Elektor ISA card' CONFIG_I2C_ELEKTOR $CONFIG_I2C_ALGOPCF
++      dep_tristate '  PCF on EPP port' CONFIG_I2C_PCFEPP $CONFIG_I2C_ALGOPCF
+    fi
+ 
+    if [ "$CONFIG_MIPS_ITE8172" = "y" ]; then
+@@ -58,6 +63,13 @@
+       dep_tristate 'I2C SGI interfaces' CONFIG_I2C_ALGO_SGI $CONFIG_I2C
+    fi
+  
++   if [ "$CONFIG_IBM_OCP" = "y" ]; then
++      dep_tristate 'IBM on-chip I2C Algorithm' CONFIG_I2C_IBM_OCP_ALGO $CONFIG_I2C
++      if [ "$CONFIG_I2C_IBM_OCP_ALGO" != "n" ]; then
++         dep_tristate '  IBM on-chip I2C Adapter' CONFIG_I2C_IBM_OCP_ADAP $CONFIG_I2C_IBM_OCP_ALGO
++      fi
++   fi
++
+ # This is needed for automatic patch generation: sensors code starts here
+ # This is needed for automatic patch generation: sensors code ends here
+ 
+--- linux-old/drivers/i2c/Makefile	Wed Feb 18 13:36:31 2004
++++ linux/drivers/i2c/Makefile	Tue Sep  6 21:05:35 2005
+@@ -6,6 +6,7 @@
+ 
+ export-objs	:= i2c-core.o i2c-algo-bit.o i2c-algo-pcf.o \
+ 		   i2c-algo-ite.o i2c-algo-sibyte.o i2c-algo-sgi.o \
++		   i2c-algo-8xx.o i2c-algo-ibm_ocp.o \
+ 		   i2c-proc.o
+ 
+ obj-$(CONFIG_I2C)		+= i2c-core.o
+@@ -18,6 +19,13 @@
+ obj-$(CONFIG_I2C_ELEKTOR)	+= i2c-elektor.o
+ obj-$(CONFIG_ITE_I2C_ALGO)	+= i2c-algo-ite.o
+ obj-$(CONFIG_ITE_I2C_ADAP)	+= i2c-adap-ite.o
++obj-$(CONFIG_I2C_PPORT)		+= i2c-pport.o
++obj-$(CONFIG_I2C_FRODO)		+= i2c-frodo.o
++obj-$(CONFIG_I2C_PCFEPP)	+= i2c-pcf-epp.o
++obj-$(CONFIG_I2C_ALGO8XX)	+= i2c-algo-8xx.o
++obj-$(CONFIG_I2C_RPXLITE)	+= i2c-rpx.o
++obj-$(CONFIG_I2C_IBM_OCP_ALGO)	+= i2c-algo-ibm_ocp.o
++obj-$(CONFIG_I2C_IBM_OCP_ADAP)	+= i2c-adap-ibm_ocp.o
+ obj-$(CONFIG_I2C_PROC)		+= i2c-proc.o
+ obj-$(CONFIG_SCx200_I2C)	+= scx200_i2c.o
+ obj-$(CONFIG_SCx200_ACB)	+= scx200_acb.o
+--- linux-old/Documentation/i2c/dev-interface	Wed Feb 18 13:36:30 2004
++++ linux/Documentation/i2c/dev-interface	Tue Sep  6 21:05:35 2005
+@@ -14,9 +14,12 @@
+ =========
+ 
+ So let's say you want to access an i2c adapter from a C program. The
+-first thing to do is `#include <linux/i2c.h>" and "#include <linux/i2c-dev.h>. 
+-Yes, I know, you should never include kernel header files, but until glibc 
+-knows about i2c, there is not much choice.
++first thing to do is "#include <linux/i2c-dev.h>". Please note that
++there are two files named "i2c-dev.h" out there, one is distributed
++with the Linux kernel and is meant to be included from kernel
++driver code, the other one is distributed with lm_sensors and is
++meant to be included from user-space programs. You obviously want
++the second one here.
+ 
+ Now, you have to decide which adapter you want to access. You should
+ inspect /proc/bus/i2c to decide this. Adapter numbers are assigned
+@@ -78,7 +81,7 @@
+ ==========================
+ 
+ The following IOCTLs are defined and fully supported 
+-(see also i2c-dev.h and i2c.h):
++(see also i2c-dev.h):
+ 
+ ioctl(file,I2C_SLAVE,long addr)
+   Change slave address. The address is passed in the 7 lower bits of the
+@@ -89,13 +92,18 @@
+   Selects ten bit addresses if select not equals 0, selects normal 7 bit
+   addresses if select equals 0. Default 0.
+ 
++ioctl(file,I2C_PEC,long select)
++  Selects SMBus PEC (packet error checking) generation and verification
++  if select not equals 0, disables if select equals 0. Default 0.
++  Used only for SMBus transactions.
++
+ ioctl(file,I2C_FUNCS,unsigned long *funcs)
+   Gets the adapter functionality and puts it in *funcs.
+ 
+-ioctl(file,I2C_RDWR,struct i2c_ioctl_rdwr_data *msgset)
++ioctl(file,I2C_RDWR,struct i2c_rdwr_ioctl_data *msgset)
+ 
+   Do combined read/write transaction without stop in between.
+-  The argument is a pointer to a struct i2c_ioctl_rdwr_data {
++  The argument is a pointer to a struct i2c_rdwr_ioctl_data {
+ 
+       struct i2c_msg *msgs;  /* ptr to array of simple messages */
+       int nmsgs;             /* number of messages to exchange */
+--- linux-old/Documentation/i2c/functionality	Fri Dec 29 22:35:47 2000
++++ linux/Documentation/i2c/functionality	Tue Sep  6 21:05:35 2005
+@@ -115,7 +115,7 @@
+ If you try to access an adapter from a userspace program, you will have
+ to use the /dev interface. You will still have to check whether the
+ functionality you need is supported, of course. This is done using
+-the I2C_FUNCS ioctl. An example, adapted from the lm_sensors i2c_detect
++the I2C_FUNCS ioctl. An example, adapted from the lm_sensors i2cdetect
+ program, is below:
+ 
+   int file;
+--- linux-old/Documentation/i2c/i2c-pport	Thu Jan  1 00:00:00 1970
++++ linux/Documentation/i2c/i2c-pport	Tue Sep  6 21:05:35 2005
+@@ -0,0 +1,67 @@
++Parallel Port Adapters
++----------------------
++If you are installing parallel port adapters it means you are probably messing 
++around with wires and IC's and the like. If you have purchased a card that 
++provides an external i2c/smbus this will require combined algorithm and 
++adapter code in a single module.
++If you are doing it yourself by using the parallel port there 
++are basically 2 options.
++
++1) Using the parallel port and using the i2c-pport adapter module and the 
++i2c-algo-bit algorithm module together to enable you to wire up your parallel 
++port to act as an i2c/smbus. This provides a bus that will enable most 
++sensors to work but doesn't support the entire i2c/smbus capability.
++
++2) Using the parallel port to interface to a Philips PCF8584 parallel to i2c 
++adapter chip. You will need to build a bit of a circuit to do this. This 
++configuration needs the i2c-pcf-epp adapter module and the i2c-algo-pcf 
++algorithm module. This support almost all of the i2c/smbus capabilities.
++
++
++i2c-pport Documentation
++-----------------------
++This is a primitive parallel port driver for the i2c bus, which exploits 
++features of modern bidirectional parallel ports. 
++
++Bidirectional ports have particular bits connected in following way:
++   
++                        |
++            /-----|     R
++         --o|     |-----|
++      read  \-----|     /------- Out pin
++                      |/
++                   - -|\
++                write   V
++                        |
++                       ---  
++
++
++It means when output is set to 1 we can read the port. Therefore 
++we can use 2 pins of parallel port as SDA and SCL for i2c bus. It 
++is not necessary to add any external - additional parts, we can 
++read and write the same port simultaneously.
++	I only use register base+2 so it is possible to use all 
++8 data bits of parallel port for other applications (I have 
++connected EEPROM and LCD display). I do not use bit Enable Bi-directional
++ Port. The only disadvantage is we can only support 5V chips.
++
++Layout:
++
++Cannon 25 pin
++
++SDA - connect to pin 14 (Auto Linefeed)
++SCL - connect to pin 16 (Initialize Printer)
++GND - connect to pin 18-25
+++5V - use external supply (I use 5V from 3.5" floppy connector)
++      
++no pullups  requied
++
++Module parameters:
++
++base = 0xXXX
++XXX - 278 or 378
++
++That's all.
++
++Daniel Smolik
++marvin at sitour.cz
+--- linux-old/Documentation/i2c/i2c-protocol	Wed Feb 18 13:36:30 2004
++++ linux/Documentation/i2c/i2c-protocol	Tue Sep  6 21:05:35 2005
+@@ -65,3 +65,12 @@
+     need to emit an Rd instead of a Wr, or vice versa, you set this
+     flag. For example:
+       S Addr Rd [A] Data [A] Data [A] ... [A] Data [A] P
++
++  Flags I2C_M_IGNORE_NAK
++    Normally message is interrupted immediately if there is [NA] from the
++    client. Setting this flag treats any [NA] as [A], and all of
++    message is sent.
++    These messages may still fail to SCL lo->hi timeout.
++
++  Flags I2C_M_NO_RD_ACK
++    In a read message, master A/NA bit is skipped.
+--- linux-old/Documentation/i2c/summary	Wed Feb 18 13:36:30 2004
++++ linux/Documentation/i2c/summary	Tue Sep  6 21:05:35 2005
+@@ -59,16 +59,16 @@
+ i2c-algo-8xx:    An algorithm for CPM's I2C device in Motorola 8xx processors (NOT BUILT BY DEFAULT)
+ i2c-algo-bit:    A bit-banging algorithm
+ i2c-algo-pcf:    A PCF 8584 style algorithm
+-i2c-algo-ppc405: An algorithm for the I2C device in IBM 405xx processors (NOT BUILT BY DEFAULT)
++i2c-algo-ibm_ocp: An algorithm for the I2C device in IBM 4xx processors (NOT BUILT BY DEFAULT)
+ 
+ Adapter drivers
+ ---------------
+ 
+ i2c-elektor:     Elektor ISA card (uses i2c-algo-pcf)
+ i2c-elv:         ELV parallel port adapter (uses i2c-algo-bit)
+-i2c-pcf-epp:     PCF8584 on a EPP parallel port (uses i2c-algo-pcf) (BROKEN - missing i2c-pcf-epp.h)
++i2c-pcf-epp:     PCF8584 on a EPP parallel port (uses i2c-algo-pcf) (NOT mkpatched)
+ i2c-philips-par: Philips style parallel port adapter (uses i2c-algo-bit)
+-i2c-ppc405:      IBM 405xx processor I2C device (uses i2c-algo-ppc405) (NOT BUILT BY DEFAULT)
++i2c-adap-ibm_ocp: IBM 4xx processor I2C device (uses i2c-algo-ibm_ocp) (NOT BUILT BY DEFAULT)
+ i2c-pport:       Primitive parallel port adapter (uses i2c-algo-bit)
+ i2c-rpx:         RPX board Motorola 8xx I2C device (uses i2c-algo-8xx) (NOT BUILT BY DEFAULT)
+ i2c-velleman:    Velleman K8000 parallel port adapter (uses i2c-algo-bit)
+--- linux-old/Documentation/i2c/writing-clients	Tue Sep  6 21:04:49 2005
++++ linux/Documentation/i2c/writing-clients	Tue Sep  6 21:05:36 2005
+@@ -28,11 +28,11 @@
+ 	.name		= "Foo version 2.3 driver",
+ 	.id		= I2C_DRIVERID_FOO, /* from i2c-id.h, optional */
+ 	.flags		= I2C_DF_NOTIFY,
+-	.attach_adapter	= &foo_attach_adapter,
+-	.detach_client	= &foo_detach_client,
+-	.command	= &foo_command, /* may be NULL */
+-	.inc_use	= &foo_inc_use, /* May be NULL */
+-	.dec_use	= &foo_dec_use, /* May be NULL */
++	.attach_adapter	= foo_attach_adapter,
++	.detach_client	= foo_detach_client,
++	.command	= foo_command, /* may be NULL */
++	.inc_use	= foo_inc_use, /* May be NULL */
++	.dec_use	= foo_dec_use, /* May be NULL */
+ }
+  
+ The name can be chosen freely, and may be upto 40 characters long. Please
+@@ -58,32 +58,37 @@
+ If your driver can also be compiled as a module, there are moments at 
+ which the module can not be removed from memory. For example, when you
+ are doing a lengthy transaction, or when you create a /proc directory,
+-and some process has entered that directory (this last case is the
+-main reason why these call-backs were introduced).
++and some process has entered that directory.
++
++i2c-core and i2c-proc will take care of properly counting the users
++of the client driver for the common cases. If however your driver has
++functions used by other parts of the kernel, you will have to implement
++the inc_use and dec_use callback functions and use them.
+ 
+ To increase or decrease the module usage count, you can use the
+ MOD_{INC,DEC}_USE_COUNT macros. They must be called from the module
+ which needs to get its usage count changed; that is why each driver
+-module has to implement its own callback.
++module has to implement its own callback functions.
+ 
+-  void foo_inc_use (struct i2c_client *client)
+-  {
+-  #ifdef MODULE
+-    MOD_INC_USE_COUNT;
+-  #endif
+-  }
++static void foo_inc_use (struct i2c_client *client)
++{
++#ifdef MODULE
++	MOD_INC_USE_COUNT;
++#endif
++}
+ 
+-  void foo_dec_use (struct i2c_client *client)
+-  {
+-  #ifdef MODULE
+-    MOD_DEC_USE_COUNT;
+-  #endif
+-  }
++static void foo_dec_use (struct i2c_client *client)
++{
++#ifdef MODULE
++	MOD_DEC_USE_COUNT;
++#endif
++}
+ 
+-Do not call these call-back functions directly; instead, use one of the
++Do not call these callback functions directly; instead, use the
+ following functions defined in i2c.h:
+-  void i2c_inc_use_client(struct i2c_client *);
+-  void i2c_dec_use_client(struct i2c_client *);
++
++void i2c_inc_use_client(struct i2c_client *);
++void i2c_dec_use_client(struct i2c_client *);
+ 
+ You should *not* increase the module count just because a device is
+ detected and a client created. This would make it impossible to remove
+@@ -302,7 +307,7 @@
+      These are automatically translated to insmod variables of the form
+      force_foo.
+ 
+-So we have a generic insmod variabled `force', and chip-specific variables
++So we have a generic insmod variable `force', and chip-specific variables
+ `force_CHIPNAME'.
+ 
+ Fortunately, as a module writer, you just have to define the `normal' 
+--- linux-old/drivers/i2c/i2c-adap-ibm_ocp.c	Thu Jan  1 00:00:00 1970
++++ linux/drivers/i2c/i2c-adap-ibm_ocp.c	Tue Sep  6 21:05:36 2005
+@@ -0,0 +1,368 @@
++/*
++   -------------------------------------------------------------------------
++   i2c-adap-ibm_ocp.c i2c-hw access for the IIC peripheral on the IBM PPC 405
++   -------------------------------------------------------------------------
++  
++   Ian DaSilva, MontaVista Software, Inc.
++   idasilva at mvista.com or source at mvista.com
++
++   Copyright 2000 MontaVista Software Inc.
++
++   Changes made to support the IIC peripheral on the IBM PPC 405 
++
++
++   ----------------------------------------------------------------------------
++   This file was highly leveraged from i2c-elektor.c, which was created
++   by Simon G. Vogl and Hans Berglund:
++
++ 
++     Copyright (C) 1995-97 Simon G. Vogl
++                   1998-99 Hans Berglund
++
++   With some changes from Kyösti Mälkki <kmalkki at cc.hut.fi> and even
++   Frodo Looijaard <frodol at dds.nl>
++
++
++    This program is free software; you can redistribute it and/or modify
++    it under the terms of the GNU General Public License as published by
++    the Free Software Foundation; either version 2 of the License, or
++    (at your option) any later version.
++
++    This program is distributed in the hope that it will be useful,
++    but WITHOUT ANY WARRANTY; without even the implied warranty of
++    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
++    GNU General Public License for more details.
++
++    You should have received a copy of the GNU General Public License
++    along with this program; if not, write to the Free Software
++    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
++   ----------------------------------------------------------------------------
++
++   History: 01/20/12 - Armin
++   	akuster at mvista.com
++   	ported up to 2.4.16+	
++
++   Version 02/03/25 - Armin
++       converted to ocp format
++       removed commented out or #if 0 code
++
++   TODO: convert to ocp_register
++         add PM hooks
++
++*/
++
++
++#include <linux/kernel.h>
++#include <linux/ioport.h>
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/slab.h>
++#include <linux/init.h>
++#include <linux/i2c.h>
++#include <linux/i2c-algo-ibm_ocp.h>
++#include <asm/irq.h>
++#include <asm/io.h>
++#include <asm/ocp.h>
++
++/*
++ * This next section is configurable, and it is used to set the number
++ * of i2c controllers in the system.  The default number of instances is 1,
++ * however, this should be changed to reflect your system's configuration.
++ */ 
++
++/*
++ * The STB03xxx, with a PPC405 core, has two i2c controllers.
++ */
++//(sizeof(IIC_ADDR)/sizeof(struct iic_regs))
++extern iic_t *IIC_ADDR[];
++static struct iic_ibm iic_ibmocp_adaps[IIC_NUMS][5];
++
++static struct i2c_algo_iic_data *iic_ibmocp_data[IIC_NUMS];
++static struct i2c_adapter *iic_ibmocp_ops[IIC_NUMS];
++
++static int i2c_debug=0;
++static wait_queue_head_t iic_wait[IIC_NUMS];
++static int iic_pending;
++static spinlock_t irq_driver_lock = SPIN_LOCK_UNLOCKED;
++
++
++/* ----- global defines -----------------------------------------------	*/
++#define DEB(x)	if (i2c_debug>=1) x
++#define DEB2(x) if (i2c_debug>=2) x
++#define DEB3(x) if (i2c_debug>=3) x
++#define DEBE(x)	x	/* error messages 				*/
++
++/* ----- local functions ----------------------------------------------	*/
++
++//
++// Description: Write a byte to IIC hardware
++//
++static void iic_ibmocp_setbyte(void *data, int ctl, int val)
++{
++   // writeb resolves to a write to the specified memory location
++   // plus a call to eieio.  eieio ensures that all instructions
++   // preceding it are completed before any further stores are
++   // completed.
++   // Delays at this level (to protect writes) are not needed here.
++   writeb(val, ctl);
++}
++
++
++//
++// Description: Read a byte from IIC hardware
++//
++static int iic_ibmocp_getbyte(void *data, int ctl)
++{
++   int val;
++
++   val = readb(ctl);
++   return (val);
++}
++
++
++//
++// Description: Return our slave address.  This is the address
++// put on the I2C bus when another master on the bus wants to address us
++// as a slave
++//
++static int iic_ibmocp_getown(void *data)
++{
++   return(((struct iic_ibm *)(data))->iic_own);
++}
++
++
++//
++// Description: Return the clock rate
++//
++static int iic_ibmocp_getclock(void *data)
++{
++   return(((struct iic_ibm *)(data))->iic_clock);
++}
++
++
++
++//
++// Description:  Put this process to sleep.  We will wake up when the
++// IIC controller interrupts.
++//
++static void iic_ibmocp_waitforpin(void *data) {
++
++   int timeout = 2;
++   struct iic_ibm *priv_data = data;
++
++   //
++   // If interrupts are enabled (which they are), then put the process to
++   // sleep.  This process will be awakened by two events -- either the
++   // the IIC peripheral interrupts or the timeout expires. 
++   //
++   if (priv_data->iic_irq > 0) {
++      spin_lock_irq(&irq_driver_lock);
++      if (iic_pending == 0) {
++  	 interruptible_sleep_on_timeout(&(iic_wait[priv_data->index]), timeout*HZ );
++      } else
++ 	 iic_pending = 0;
++      spin_unlock_irq(&irq_driver_lock);
++   } else {
++      //
++      // If interrupts are not enabled then delay for a reasonable amount
++      // of time and return.  We expect that by time we return to the calling
++      // function that the IIC has finished our requested transaction and
++      // the status bit reflects this.
++      //
++      // udelay is probably not the best choice for this since it is
++      // the equivalent of a busy wait
++      //
++      udelay(100);
++   }
++   //printk("iic_ibmocp_waitforpin: exitting\n");
++}
++
++
++//
++// Description: The registered interrupt handler
++//
++static void iic_ibmocp_handler(int this_irq, void *dev_id, struct pt_regs *regs) 
++{
++   int ret;
++   struct iic_regs *iic;
++   struct iic_ibm *priv_data = dev_id;
++   iic = (struct iic_regs *) priv_data->iic_base;
++   iic_pending = 1;
++   DEB2(printk("iic_ibmocp_handler: in interrupt handler\n"));
++   // Read status register
<<Diff was trimmed, longer than 597 lines>>



More information about the pld-cvs-commit mailing list