cregit-Linux how code gets into the kernel

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

PersonTokensPropCommitsCommitProp
Sudip Mukherjee5468.35%112.50%
Mike Rapoport1924.05%450.00%
Matthieu Simon45.06%112.50%
Eric S. Stone11.27%112.50%
Arnd Bergmann11.27%112.50%
Total79100.00%8100.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

PersonTokensPropCommitsCommitProp
Sudip Mukherjee4575.00%116.67%
Mike Rapoport1016.67%350.00%
Matthieu Simon46.67%116.67%
Arnd Bergmann11.67%116.67%
Total60100.00%6100.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

PersonTokensPropCommitsCommitProp
Sudip Mukherjee4588.24%120.00%
Mike Rapoport47.84%240.00%
Lorenzo Stoakes11.96%120.00%
Matthieu Simon11.96%120.00%
Total51100.00%5100.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

PersonTokensPropCommitsCommitProp
Sudip Mukherjee13686.62%111.11%
Mike Rapoport127.64%444.44%
Matthieu Simon63.82%111.11%
Matej Vasek10.64%111.11%
Lorenzo Stoakes10.64%111.11%
Eric S. Stone10.64%111.11%
Total157100.00%9100.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

PersonTokensPropCommitsCommitProp
Sudip Mukherjee13586.54%111.11%
Mike Rapoport127.69%444.44%
Matthieu Simon63.85%111.11%
Matej Vasek10.64%111.11%
Eric S. Stone10.64%111.11%
Lorenzo Stoakes10.64%111.11%
Total156100.00%9100.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, &reg) == 1) hw_i2c_read_data(addr, 1, &value); return value; }

Contributors

PersonTokensPropCommitsCommitProp
Sudip Mukherjee4183.67%125.00%
Mike Rapoport816.33%375.00%
Total49100.00%4100.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

PersonTokensPropCommitsCommitProp
Sudip Mukherjee5289.66%125.00%
Mike Rapoport610.34%375.00%
Total58100.00%4100.00%

#endif

Overall Contributors

PersonTokensPropCommitsCommitProp
Sudip Mukherjee53783.64%15.26%
Mike Rapoport7311.37%1263.16%
Matthieu Simon213.27%15.26%
Lorenzo Stoakes30.47%15.26%
Eric S. Stone30.47%15.26%
Arnd Bergmann20.31%15.26%
Matej Vasek20.31%15.26%
Elise Lennion10.16%15.26%
Total642100.00%19100.00%
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
Created with cregit.