Release 4.11 drivers/staging/sm750fb/ddk750_hwi2c.c
#define USE_HW_I2C
#ifdef USE_HW_I2C
#include "ddk750_chip.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?
*/
sm750_enable_i2c(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 | 54 | 68.35% | 1 | 12.50% |
Mike Rapoport | 19 | 24.05% | 4 | 50.00% |
Matthieu Simon | 4 | 5.06% | 1 | 12.50% |
Eric S. Stone | 1 | 1.27% | 1 | 12.50% |
Arnd Bergmann | 1 | 1.27% | 1 | 12.50% |
Total | 79 | 100.00% | 8 | 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 */
sm750_enable_i2c(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 | 45 | 75.00% | 1 | 16.67% |
Mike Rapoport | 10 | 16.67% | 3 | 50.00% |
Matthieu Simon | 4 | 6.67% | 1 | 16.67% |
Arnd Bergmann | 1 | 1.67% | 1 | 16.67% |
Total | 60 | 100.00% | 6 | 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 | 45 | 88.24% | 1 | 20.00% |
Mike Rapoport | 4 | 7.84% | 2 | 40.00% |
Lorenzo Stoakes | 1 | 1.96% | 1 | 20.00% |
Matthieu Simon | 1 | 1.96% | 1 | 20.00% |
Total | 51 | 100.00% | 5 | 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 | 136 | 86.62% | 1 | 11.11% |
Mike Rapoport | 12 | 7.64% | 4 | 44.44% |
Matthieu Simon | 6 | 3.82% | 1 | 11.11% |
Matej Vasek | 1 | 0.64% | 1 | 11.11% |
Lorenzo Stoakes | 1 | 0.64% | 1 | 11.11% |
Eric S. Stone | 1 | 0.64% | 1 | 11.11% |
Total | 157 | 100.00% | 9 | 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 | 135 | 86.54% | 1 | 11.11% |
Mike Rapoport | 12 | 7.69% | 4 | 44.44% |
Matthieu Simon | 6 | 3.85% | 1 | 11.11% |
Matej Vasek | 1 | 0.64% | 1 | 11.11% |
Eric S. Stone | 1 | 0.64% | 1 | 11.11% |
Lorenzo Stoakes | 1 | 0.64% | 1 | 11.11% |
Total | 156 | 100.00% | 9 | 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 | 41 | 83.67% | 1 | 25.00% |
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 | 52 | 89.66% | 1 | 25.00% |
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 | 537 | 83.64% | 1 | 5.26% |
Mike Rapoport | 73 | 11.37% | 12 | 63.16% |
Matthieu Simon | 21 | 3.27% | 1 | 5.26% |
Lorenzo Stoakes | 3 | 0.47% | 1 | 5.26% |
Eric S. Stone | 3 | 0.47% | 1 | 5.26% |
Arnd Bergmann | 2 | 0.31% | 1 | 5.26% |
Matej Vasek | 2 | 0.31% | 1 | 5.26% |
Elise Lennion | 1 | 0.16% | 1 | 5.26% |
Total | 642 | 100.00% | 19 | 100.00% |
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.