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