/*
 *  arch/mips/pmc-sierra/yosemite/atmel_read_eeprom.c
 *
 *  Copyright (C) 2003 PMC-Sierra Inc.
 *  Author: Manish Lachwani (lachwani@pmc-sierra.com)
 *
 *  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  SOFTWARE  IS PROVIDED   ``AS  IS'' AND   ANY  EXPRESS OR IMPLIED
 *  WARRANTIES,   INCLUDING, BUT NOT  LIMITED  TO, THE IMPLIED WARRANTIES OF
 *  MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
 *  NO  EVENT  SHALL   THE AUTHOR  BE    LIABLE FOR ANY   DIRECT, INDIRECT,
 *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 *  NOT LIMITED   TO, PROCUREMENT OF  SUBSTITUTE GOODS  OR SERVICES; LOSS OF
 *  USE, DATA,  OR PROFITS; OR  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 *  ANY THEORY OF LIABILITY, WHETHER IN  CONTRACT, STRICT LIABILITY, OR TORT
 *  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 *  THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 *  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.
 */

/*
 * Description:
 *
 * This code reads the ATMEL 24CXX EEPROM. The PMC-Sierra Yosemite board uses the ATMEL
 * 24C32/24C64 which uses two byte addressing as compared to 24C16. Note that this program
 * uses the serial port like /dev/ttyS0, to communicate with the EEPROM. Hence, you are 
 * expected to have a connectivity from the EEPROM to the serial port. This program does
 * __not__ communicate using the I2C protocol
 */

#include "atmel_read_eeprom.h"

static void delay(int delay)
{
	while (delay--);
}

static void send_bit(unsigned char bit)
{
	scl_lo;
	delay(TXX);
	if (bit)
		sda_hi;
	else
		sda_lo;

	delay(TXX);
	scl_hi;
	delay(TXX);
}

static void send_ack(void)
{
	send_bit(0);
}

static void send_byte(unsigned char byte)
{
	int	i = 0;
	
	for (i = 7; i >= 0; i--) 
		send_bit((byte >> i) & 0x01);
}
	
static void send_start(void)
{
	sda_hi; 
	delay(TXX);
	scl_hi;
	delay(TXX);
	sda_lo;
	delay(TXX);
}

static void send_stop(void)
{
	sda_lo;
	delay(TXX);
	scl_hi;
	delay(TXX);
	sda_hi;
	delay(TXX);
}

static void do_idle(void)
{
	sda_hi;
	scl_hi;
	vcc_off;
}

static int recv_bit(void)
{
	int	status;

	scl_lo;
	delay(TXX);
	sda_hi;
	delay(TXX);
	scl_hi;
	delay(TXX);

	return 1;
}

static unsigned char recv_byte(void) {
        int i;
        unsigned char byte=0;

        for (i=7;i>=0;i--)                             
                byte |= (recv_bit() << i);
 
        return byte;
}

static int recv_ack(void)
{
	unsigned int	ack;

	ack = (unsigned int)recv_bit();
	scl_lo;

	if (ack) {
		do_idle();
		printk(KERN_ERR "Error reading the Atmel 24C32/24C64 EEPROM \n");
		return -1;
	}

	return ack;
}

/*
 * This function does the actual read of the EEPROM. It needs the buffer into which the
 * read data is copied, the size of the EEPROM being read and the buffer size
 */
int read_eeprom(char *buffer, int eeprom_size, int size)
{
	int	i = 0, err;

	send_start();
	send_byte(W_HEADER);
	recv_ack();

	/* EEPROM with size of more then 2K need two byte addressing */
	if (eeprom_size > 2048) {
		send_byte(0x00);
		recv_ack();
	}

	send_start();
	send_byte(R_HEADER);
	err = recv_ack();
	if (err == -1)
		return err;

	for (i = 0; i < size; i++) {
		*buffer++ = recv_byte();
		send_ack();
	}

	/* Note : We should do some check if the buffer contains correct information */

	send_stop();
}
