11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------------------- */ 21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* i2c-iop3xx.h algorithm driver definitions private to i2c-iop3xx.c */ 31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------------------- */ 41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* Copyright (C) 2003 Peter Milne, D-TACQ Solutions Ltd 51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * <Peter dot Milne at D hyphen TACQ dot com> 61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds This program is free software; you can redistribute it and/or modify 81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds it under the terms of the GNU General Public License as published by 91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds the Free Software Foundation, version 2. 101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds This program is distributed in the hope that it will be useful, 121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds but WITHOUT ANY WARRANTY; without even the implied warranty of 131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds GNU General Public License for more details. 151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds You should have received a copy of the GNU General Public License 171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds along with this program; if not, write to the Free Software 181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ 191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* ------------------------------------------------------------------------- */ 201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef I2C_IOP3XX_H 231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define I2C_IOP3XX_H 1 241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * iop321 hardware bit definitions 271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_FAST_MODE 0x8000 /* 1=400kBps, 0=100kBps */ 291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_UNIT_RESET 0x4000 /* 1=RESET */ 301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_SAD_IE 0x2000 /* 1=Slave Detect Interrupt Enable */ 311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_ALD_IE 0x1000 /* 1=Arb Loss Detect Interrupt Enable */ 321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_SSD_IE 0x0800 /* 1=Slave STOP Detect Interrupt Enable */ 331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_BERR_IE 0x0400 /* 1=Bus Error Interrupt Enable */ 341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_RXFULL_IE 0x0200 /* 1=Receive Full Interrupt Enable */ 351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_TXEMPTY_IE 0x0100 /* 1=Transmit Empty Interrupt Enable */ 361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_GCD 0x0080 /* 1=General Call Disable */ 371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * IOP3XX_ICR_GCD: 1 disables response as slave. "This bit must be set 391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * when sending a master mode general call message from the I2C unit" 401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_UE 0x0040 /* 1=Unit Enable */ 421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/* 431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * "NOTE: To avoid I2C bus integrity problems, 441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the user needs to ensure that the GPIO Output Data Register - 451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * GPOD bits associated with an I2C port are cleared prior to setting 461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * the enable bit for that I2C serial port. 471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * The user prepares to enable I2C port 0 and 481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * I2C port 1 by clearing GPOD bits 7:6 and GPOD bits 5:4, respectively. 491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */ 501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_SCLEN 0x0020 /* 1=SCL enable for master mode */ 511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_MABORT 0x0010 /* 1=Send a STOP with no data 521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * NB TBYTE must be clear */ 531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_TBYTE 0x0008 /* 1=Send/Receive a byte. i2c clears */ 541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_NACK 0x0004 /* 1=reply with NACK */ 551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_MSTOP 0x0002 /* 1=send a STOP after next data byte */ 561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ICR_MSTART 0x0001 /* 1=initiate a START */ 571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_BERRD 0x0400 /* 1=BUS ERROR Detected */ 601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_SAD 0x0200 /* 1=Slave ADdress Detected */ 611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_GCAD 0x0100 /* 1=General Call Address Detected */ 621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_RXFULL 0x0080 /* 1=Receive Full */ 631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_TXEMPTY 0x0040 /* 1=Transmit Empty */ 641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_ALD 0x0020 /* 1=Arbitration Loss Detected */ 651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_SSD 0x0010 /* 1=Slave STOP Detected */ 661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_BBUSY 0x0008 /* 1=Bus BUSY */ 671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_UNITBUSY 0x0004 /* 1=Unit Busy */ 681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_NACK 0x0002 /* 1=Unit Rx or Tx a NACK */ 691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_RXREAD 0x0001 /* 1=READ 0=WRITE (R/W bit of slave addr */ 701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISR_CLEARBITS 0x07f0 721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_ISAR_SAMASK 0x007f 741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_IDBR_MASK 0x00ff 761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_IBMR_SCL 0x0002 781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_IBMR_SDA 0x0001 791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_GPOD_I2C0 0x00c0 /* clear these bits to enable ch0 */ 811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_GPOD_I2C1 0x0030 /* clear these bits to enable ch1 */ 821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 8339288e1ac10b3b9a68a629be67d81a0b53512c4ePeter Milne#define MYSAR 0 /* default slave address */ 841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define I2C_ERR 321 861da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define I2C_ERR_BERR (I2C_ERR+0) 871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define I2C_ERR_ALD (I2C_ERR+1) 881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 891da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 901da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CR_OFFSET 0 911da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SR_OFFSET 0x4 921da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define SAR_OFFSET 0x8 931da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define DBR_OFFSET 0xc 941da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define CCR_OFFSET 0x10 951da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define BMR_OFFSET 0x14 961da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 971da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define IOP3XX_I2C_IO_SIZE 0x18 981da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 991da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstruct i2c_algo_iop3xx_data { 100747fcc91cb5bade1f681b3a8d0e6d4f697d865fdAaro Koskinen void __iomem *ioaddr; 1011da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds wait_queue_head_t waitq; 1021da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds spinlock_t lock; 1031da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds u32 SR_enabled, SR_received; 1041da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds int id; 1051da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}; 1061da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds 1071da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* I2C_IOP3XX_H */ 108