Release 4.7 drivers/staging/sm750fb/ddk750_hwi2c.c
  
  
#define USE_HW_I2C
#ifdef USE_HW_I2C
#include "ddk750_help.h"
#include "ddk750_reg.h"
#include "ddk750_hwi2c.h"
#include "ddk750_power.h"
#define MAX_HWI2C_FIFO                  16
#define HWI2C_WAIT_TIMEOUT              0xF0000
int sm750_hw_i2c_init(
unsigned char bus_speed_mode
)
{
	unsigned int value;
	/* Enable GPIO 30 & 31 as IIC clock & data */
	value = PEEK32(GPIO_MUX);
	value |= (GPIO_MUX_30 | GPIO_MUX_31);
	POKE32(GPIO_MUX, value);
	/* Enable Hardware I2C power.
         TODO: Check if we need to enable GPIO power?
         */
	enableI2C(1);
	/* Enable the I2C Controller and set the bus speed mode */
	value = PEEK32(I2C_CTRL) & ~(I2C_CTRL_MODE | I2C_CTRL_EN);
	if (bus_speed_mode)
		value |= I2C_CTRL_MODE;
	value |= I2C_CTRL_EN;
	POKE32(I2C_CTRL, value);
	return 0;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| sudip mukherjee | sudip mukherjee | 59 | 74.68% | 1 | 16.67% | 
| mike rapoport | mike rapoport | 19 | 24.05% | 4 | 66.67% | 
| juston li | juston li | 1 | 1.27% | 1 | 16.67% | 
 | Total | 79 | 100.00% | 6 | 100.00% | 
void sm750_hw_i2c_close(void)
{
	unsigned int value;
	/* Disable I2C controller */
	value = PEEK32(I2C_CTRL) & ~I2C_CTRL_EN;
	POKE32(I2C_CTRL, value);
	/* Disable I2C Power */
	enableI2C(0);
	/* Set GPIO 30 & 31 back as GPIO pins */
	value = PEEK32(GPIO_MUX);
	value &= ~GPIO_MUX_30;
	value &= ~GPIO_MUX_31;
	POKE32(GPIO_MUX, value);
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| sudip mukherjee | sudip mukherjee | 50 | 83.33% | 1 | 25.00% | 
| mike rapoport | mike rapoport | 10 | 16.67% | 3 | 75.00% | 
 | Total | 60 | 100.00% | 4 | 100.00% | 
static long hw_i2c_wait_tx_done(void)
{
	unsigned int timeout;
	/* Wait until the transfer is completed. */
	timeout = HWI2C_WAIT_TIMEOUT;
	while (!(PEEK32(I2C_STATUS) & I2C_STATUS_TX) && (timeout != 0))
		timeout--;
	if (timeout == 0)
		return -1;
	return 0;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| sudip mukherjee | sudip mukherjee | 46 | 90.20% | 1 | 25.00% | 
| mike rapoport | mike rapoport | 4 | 7.84% | 2 | 50.00% | 
| lorenzo stoakes | lorenzo stoakes | 1 | 1.96% | 1 | 25.00% | 
 | Total | 51 | 100.00% | 4 | 100.00% | 
/*
 *  This function writes data to the i2c slave device registers.
 *
 *  Parameters:
 *      addr            - i2c Slave device address
 *      length          - Total number of bytes to be written to the device
 *      buf             - The buffer that contains the data to be written to the
 *                     i2c device.
 *
 *  Return Value:
 *      Total number of bytes those are actually written.
 */
static unsigned int hw_i2c_write_data(
	unsigned char addr,
	unsigned int length,
	unsigned char *buf
)
{
	unsigned char count, i;
	unsigned int total_bytes = 0;
	/* Set the Device Address */
	POKE32(I2C_SLAVE_ADDRESS, addr & ~0x01);
	/* Write data.
         * Note:
         *      Only 16 byte can be accessed per i2c start instruction.
         */
	do {
		/*
                 * Reset I2C by writing 0 to I2C_RESET register to
                 * clear the previous status.
                 */
		POKE32(I2C_RESET, 0);
		/* Set the number of bytes to be written */
		if (length < MAX_HWI2C_FIFO)
			count = length - 1;
		else
			count = MAX_HWI2C_FIFO - 1;
		POKE32(I2C_BYTE_COUNT, count);
		/* Move the data to the I2C data register */
		for (i = 0; i <= count; i++)
			POKE32(I2C_DATA0 + i, *buf++);
		/* Start the I2C */
		POKE32(I2C_CTRL, PEEK32(I2C_CTRL) | I2C_CTRL_CTRL);
		/* Wait until the transfer is completed. */
		if (hw_i2c_wait_tx_done() != 0)
			break;
		/* Subtract length */
		length -= (count + 1);
		/* Total byte written */
		total_bytes += (count + 1);
	} while (length > 0);
	return total_bytes;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| sudip mukherjee | sudip mukherjee | 142 | 90.45% | 1 | 12.50% | 
| mike rapoport | mike rapoport | 12 | 7.64% | 4 | 50.00% | 
| matej vasek | matej vasek | 1 | 0.64% | 1 | 12.50% | 
| juston li | juston li | 1 | 0.64% | 1 | 12.50% | 
| lorenzo stoakes | lorenzo stoakes | 1 | 0.64% | 1 | 12.50% | 
 | Total | 157 | 100.00% | 8 | 100.00% | 
/*
 *  This function reads data from the slave device and stores them
 *  in the given buffer
 *
 *  Parameters:
 *      addr            - i2c Slave device address
 *      length          - Total number of bytes to be read
 *      buf             - Pointer to a buffer to be filled with the data read
 *                     from the slave device. It has to be the same size as the
 *                     length to make sure that it can keep all the data read.
 *
 *  Return Value:
 *      Total number of actual bytes read from the slave device
 */
static unsigned int hw_i2c_read_data(
	unsigned char addr,
	unsigned int length,
	unsigned char *buf
)
{
	unsigned char count, i;
	unsigned int total_bytes = 0;
	/* Set the Device Address */
	POKE32(I2C_SLAVE_ADDRESS, addr | 0x01);
	/* Read data and save them to the buffer.
         * Note:
         *      Only 16 byte can be accessed per i2c start instruction.
         */
	do {
		/*
                 * Reset I2C by writing 0 to I2C_RESET register to
                 * clear all the status.
                 */
		POKE32(I2C_RESET, 0);
		/* Set the number of bytes to be read */
		if (length <= MAX_HWI2C_FIFO)
			count = length - 1;
		else
			count = MAX_HWI2C_FIFO - 1;
		POKE32(I2C_BYTE_COUNT, count);
		/* Start the I2C */
		POKE32(I2C_CTRL, PEEK32(I2C_CTRL) | I2C_CTRL_CTRL);
		/* Wait until transaction done. */
		if (hw_i2c_wait_tx_done() != 0)
			break;
		/* Save the data to the given buffer */
		for (i = 0; i <= count; i++)
			*buf++ = PEEK32(I2C_DATA0 + i);
		/* Subtract length by 16 */
		length -= (count + 1);
		/* Number of bytes read. */
		total_bytes += (count + 1);
	} while (length > 0);
	return total_bytes;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| sudip mukherjee | sudip mukherjee | 141 | 90.38% | 1 | 12.50% | 
| mike rapoport | mike rapoport | 12 | 7.69% | 4 | 50.00% | 
| juston li | juston li | 1 | 0.64% | 1 | 12.50% | 
| matej vasek | matej vasek | 1 | 0.64% | 1 | 12.50% | 
| lorenzo stoakes | lorenzo stoakes | 1 | 0.64% | 1 | 12.50% | 
 | Total | 156 | 100.00% | 8 | 100.00% | 
/*
 *  This function reads the slave device's register
 *
 *  Parameters:
 *      deviceAddress   - i2c Slave device address which register
 *                        to be read from
 *      registerIndex   - Slave device's register to be read
 *
 *  Return Value:
 *      Register value
 */
unsigned char sm750_hw_i2c_read_reg(
	unsigned char addr,
	unsigned char reg
)
{
	unsigned char value = (0xFF);
	if (hw_i2c_write_data(addr, 1, ®) == 1)
		hw_i2c_read_data(addr, 1, &value);
	return value;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| sudip mukherjee | sudip mukherjee | 41 | 83.67% | 1 | 25.00% | 
| mike rapoport | mike rapoport | 8 | 16.33% | 3 | 75.00% | 
 | Total | 49 | 100.00% | 4 | 100.00% | 
/*
 *  This function writes a value to the slave device's register
 *
 *  Parameters:
 *      deviceAddress   - i2c Slave device address which register
 *                        to be written
 *      registerIndex   - Slave device's register to be written
 *      data            - Data to be written to the register
 *
 *  Result:
 *          0   - Success
 *         -1   - Fail
 */
int sm750_hw_i2c_write_reg(
	unsigned char addr,
	unsigned char reg,
	unsigned char data
)
{
	unsigned char value[2];
	value[0] = reg;
	value[1] = data;
	if (hw_i2c_write_data(addr, 2, value) == 2)
		return 0;
	return -1;
}
Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| sudip mukherjee | sudip mukherjee | 52 | 89.66% | 1 | 25.00% | 
| mike rapoport | mike rapoport | 6 | 10.34% | 3 | 75.00% | 
 | Total | 58 | 100.00% | 4 | 100.00% | 
#endif
Overall Contributors
 | Person | Tokens | Prop | Commits | CommitProp | 
| sudip mukherjee | sudip mukherjee | 561 | 87.38% | 1 | 6.25% | 
| mike rapoport | mike rapoport | 73 | 11.37% | 12 | 75.00% | 
| juston li | juston li | 3 | 0.47% | 1 | 6.25% | 
| lorenzo stoakes | lorenzo stoakes | 3 | 0.47% | 1 | 6.25% | 
| matej vasek | matej vasek | 2 | 0.31% | 1 | 6.25% | 
 | Total | 642 | 100.00% | 16 | 100.00% | 
  
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.