blob: 7be2111284f4bd0bccaeebb158625d7c3426076b [file] [log] [blame]
Sudip Mukherjee81dee672015-03-03 16:21:06 +05301#define USE_HW_I2C
2#ifdef USE_HW_I2C
3#include "ddk750_help.h"
4#include "ddk750_reg.h"
5#include "ddk750_hwi2c.h"
6#include "ddk750_power.h"
7
8#define MAX_HWI2C_FIFO 16
9#define HWI2C_WAIT_TIMEOUT 0xF0000
10
Mike Rapoport19f70ea2015-09-12 11:07:33 +030011int sm750_hw_i2c_init(
Mike Rapoporta503da62015-09-12 11:07:43 +030012unsigned char bus_speed_mode
Sudip Mukherjee81dee672015-03-03 16:21:06 +053013)
14{
Juston Li78376532015-07-14 21:14:30 -070015 unsigned int value;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053016
Juston Li78376532015-07-14 21:14:30 -070017 /* Enable GPIO 30 & 31 as IIC clock & data */
Sudip Mukherjee81dee672015-03-03 16:21:06 +053018 value = PEEK32(GPIO_MUX);
19
Juston Li78376532015-07-14 21:14:30 -070020 value = FIELD_SET(value, GPIO_MUX, 30, I2C) |
21 FIELD_SET(0, GPIO_MUX, 31, I2C);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053022 POKE32(GPIO_MUX, value);
23
Juston Li78376532015-07-14 21:14:30 -070024 /* Enable Hardware I2C power.
25 TODO: Check if we need to enable GPIO power?
26 */
27 enableI2C(1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053028
Juston Li78376532015-07-14 21:14:30 -070029 /* Enable the I2C Controller and set the bus speed mode */
30 value = PEEK32(I2C_CTRL);
Mike Rapoporta503da62015-09-12 11:07:43 +030031 if (bus_speed_mode == 0)
Juston Li78376532015-07-14 21:14:30 -070032 value = FIELD_SET(value, I2C_CTRL, MODE, STANDARD);
33 else
34 value = FIELD_SET(value, I2C_CTRL, MODE, FAST);
35 value = FIELD_SET(value, I2C_CTRL, EN, ENABLE);
36 POKE32(I2C_CTRL, value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053037
Juston Li78376532015-07-14 21:14:30 -070038 return 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053039}
40
Mike Rapoported7042e2015-09-12 11:07:34 +030041void sm750_hw_i2c_close(void)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053042{
Juston Li78376532015-07-14 21:14:30 -070043 unsigned int value;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053044
Juston Li78376532015-07-14 21:14:30 -070045 /* Disable I2C controller */
46 value = PEEK32(I2C_CTRL);
47 value = FIELD_SET(value, I2C_CTRL, EN, DISABLE);
48 POKE32(I2C_CTRL, value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053049
Juston Li78376532015-07-14 21:14:30 -070050 /* Disable I2C Power */
51 enableI2C(0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053052
Juston Li78376532015-07-14 21:14:30 -070053 /* Set GPIO 30 & 31 back as GPIO pins */
54 value = PEEK32(GPIO_MUX);
55 value = FIELD_SET(value, GPIO_MUX, 30, GPIO);
56 value = FIELD_SET(value, GPIO_MUX, 31, GPIO);
57 POKE32(GPIO_MUX, value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053058}
59
Mike Rapoportac118952015-09-12 11:07:37 +030060static long hw_i2c_wait_tx_done(void)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053061{
Juston Li78376532015-07-14 21:14:30 -070062 unsigned int timeout;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053063
Juston Li78376532015-07-14 21:14:30 -070064 /* Wait until the transfer is completed. */
65 timeout = HWI2C_WAIT_TIMEOUT;
Mike Rapoport9137f812015-09-12 11:07:49 +030066 while ((FIELD_GET(PEEK32(I2C_STATUS),
67 I2C_STATUS, TX) != I2C_STATUS_TX_COMPLETED) &&
Juston Li78376532015-07-14 21:14:30 -070068 (timeout != 0))
Sudip Mukherjee81dee672015-03-03 16:21:06 +053069 timeout--;
70
71 if (timeout == 0)
Juston Li78376532015-07-14 21:14:30 -070072 return (-1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053073
Juston Li78376532015-07-14 21:14:30 -070074 return 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053075}
76
Sudip Mukherjee81dee672015-03-03 16:21:06 +053077/*
78 * This function writes data to the i2c slave device registers.
79 *
80 * Parameters:
Mike Rapoportb3696b72015-09-12 11:07:45 +030081 * addr - i2c Slave device address
Sudip Mukherjee81dee672015-03-03 16:21:06 +053082 * length - Total number of bytes to be written to the device
Mike Rapoportb3696b72015-09-12 11:07:45 +030083 * buf - The buffer that contains the data to be written to the
Sudip Mukherjee81dee672015-03-03 16:21:06 +053084 * i2c device.
85 *
86 * Return Value:
87 * Total number of bytes those are actually written.
88 */
Mike Rapoportac118952015-09-12 11:07:37 +030089static unsigned int hw_i2c_write_data(
Mike Rapoportb3696b72015-09-12 11:07:45 +030090 unsigned char addr,
Juston Li78376532015-07-14 21:14:30 -070091 unsigned int length,
Mike Rapoportb3696b72015-09-12 11:07:45 +030092 unsigned char *buf
Sudip Mukherjee81dee672015-03-03 16:21:06 +053093)
94{
Juston Li78376532015-07-14 21:14:30 -070095 unsigned char count, i;
Mike Rapoportb3696b72015-09-12 11:07:45 +030096 unsigned int total_bytes = 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053097
Juston Li78376532015-07-14 21:14:30 -070098 /* Set the Device Address */
Mike Rapoportb3696b72015-09-12 11:07:45 +030099 POKE32(I2C_SLAVE_ADDRESS, addr & ~0x01);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530100
Juston Li78376532015-07-14 21:14:30 -0700101 /* Write data.
102 * Note:
103 * Only 16 byte can be accessed per i2c start instruction.
104 */
Juston Li259fef32015-07-14 21:14:45 -0700105 do {
Mike Rapoport9137f812015-09-12 11:07:49 +0300106 /*
107 * Reset I2C by writing 0 to I2C_RESET register to
108 * clear the previous status.
109 */
Juston Li78376532015-07-14 21:14:30 -0700110 POKE32(I2C_RESET, 0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530111
Juston Li78376532015-07-14 21:14:30 -0700112 /* Set the number of bytes to be written */
113 if (length < MAX_HWI2C_FIFO)
114 count = length - 1;
115 else
116 count = MAX_HWI2C_FIFO - 1;
117 POKE32(I2C_BYTE_COUNT, count);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530118
Juston Li78376532015-07-14 21:14:30 -0700119 /* Move the data to the I2C data register */
120 for (i = 0; i <= count; i++)
Mike Rapoportb3696b72015-09-12 11:07:45 +0300121 POKE32(I2C_DATA0 + i, *buf++);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530122
Juston Li78376532015-07-14 21:14:30 -0700123 /* Start the I2C */
Mike Rapoport9137f812015-09-12 11:07:49 +0300124 POKE32(I2C_CTRL,
125 FIELD_SET(PEEK32(I2C_CTRL), I2C_CTRL, CTRL, START));
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530126
Juston Li78376532015-07-14 21:14:30 -0700127 /* Wait until the transfer is completed. */
Mike Rapoportac118952015-09-12 11:07:37 +0300128 if (hw_i2c_wait_tx_done() != 0)
Juston Li78376532015-07-14 21:14:30 -0700129 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530130
Juston Li78376532015-07-14 21:14:30 -0700131 /* Substract length */
132 length -= (count + 1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530133
Juston Li78376532015-07-14 21:14:30 -0700134 /* Total byte written */
Mike Rapoportb3696b72015-09-12 11:07:45 +0300135 total_bytes += (count + 1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530136
Juston Li78376532015-07-14 21:14:30 -0700137 } while (length > 0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530138
Mike Rapoportb3696b72015-09-12 11:07:45 +0300139 return total_bytes;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530140}
141
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530142/*
143 * This function reads data from the slave device and stores them
144 * in the given buffer
145 *
146 * Parameters:
Mike Rapoportb3696b72015-09-12 11:07:45 +0300147 * addr - i2c Slave device address
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530148 * length - Total number of bytes to be read
Mike Rapoportb3696b72015-09-12 11:07:45 +0300149 * buf - Pointer to a buffer to be filled with the data read
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530150 * from the slave device. It has to be the same size as the
151 * length to make sure that it can keep all the data read.
152 *
153 * Return Value:
154 * Total number of actual bytes read from the slave device
155 */
Mike Rapoportac118952015-09-12 11:07:37 +0300156static unsigned int hw_i2c_read_data(
Mike Rapoportb3696b72015-09-12 11:07:45 +0300157 unsigned char addr,
Juston Li78376532015-07-14 21:14:30 -0700158 unsigned int length,
Mike Rapoportb3696b72015-09-12 11:07:45 +0300159 unsigned char *buf
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530160)
161{
Juston Li78376532015-07-14 21:14:30 -0700162 unsigned char count, i;
Mike Rapoportb3696b72015-09-12 11:07:45 +0300163 unsigned int total_bytes = 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530164
Juston Li78376532015-07-14 21:14:30 -0700165 /* Set the Device Address */
Mike Rapoportb3696b72015-09-12 11:07:45 +0300166 POKE32(I2C_SLAVE_ADDRESS, addr | 0x01);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530167
Juston Li78376532015-07-14 21:14:30 -0700168 /* Read data and save them to the buffer.
169 * Note:
170 * Only 16 byte can be accessed per i2c start instruction.
171 */
Juston Li259fef32015-07-14 21:14:45 -0700172 do {
Mike Rapoport9137f812015-09-12 11:07:49 +0300173 /*
174 * Reset I2C by writing 0 to I2C_RESET register to
175 * clear all the status.
176 */
Juston Li78376532015-07-14 21:14:30 -0700177 POKE32(I2C_RESET, 0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530178
Juston Li78376532015-07-14 21:14:30 -0700179 /* Set the number of bytes to be read */
180 if (length <= MAX_HWI2C_FIFO)
181 count = length - 1;
182 else
183 count = MAX_HWI2C_FIFO - 1;
184 POKE32(I2C_BYTE_COUNT, count);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530185
Juston Li78376532015-07-14 21:14:30 -0700186 /* Start the I2C */
Mike Rapoport9137f812015-09-12 11:07:49 +0300187 POKE32(I2C_CTRL,
188 FIELD_SET(PEEK32(I2C_CTRL), I2C_CTRL, CTRL, START));
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530189
Juston Li78376532015-07-14 21:14:30 -0700190 /* Wait until transaction done. */
Mike Rapoportac118952015-09-12 11:07:37 +0300191 if (hw_i2c_wait_tx_done() != 0)
Juston Li78376532015-07-14 21:14:30 -0700192 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530193
Juston Li78376532015-07-14 21:14:30 -0700194 /* Save the data to the given buffer */
195 for (i = 0; i <= count; i++)
Mike Rapoportb3696b72015-09-12 11:07:45 +0300196 *buf++ = PEEK32(I2C_DATA0 + i);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530197
Juston Li78376532015-07-14 21:14:30 -0700198 /* Substract length by 16 */
199 length -= (count + 1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530200
Juston Li78376532015-07-14 21:14:30 -0700201 /* Number of bytes read. */
Mike Rapoportb3696b72015-09-12 11:07:45 +0300202 total_bytes += (count + 1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530203
Juston Li78376532015-07-14 21:14:30 -0700204 } while (length > 0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530205
Mike Rapoportb3696b72015-09-12 11:07:45 +0300206 return total_bytes;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530207}
208
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530209/*
210 * This function reads the slave device's register
211 *
212 * Parameters:
213 * deviceAddress - i2c Slave device address which register
214 * to be read from
215 * registerIndex - Slave device's register to be read
216 *
217 * Return Value:
218 * Register value
219 */
Mike Rapoport5ccf7342015-09-12 11:07:35 +0300220unsigned char sm750_hw_i2c_read_reg(
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300221 unsigned char addr,
222 unsigned char reg
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530223)
224{
Juston Li78376532015-07-14 21:14:30 -0700225 unsigned char value = (0xFF);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530226
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300227 if (hw_i2c_write_data(addr, 1, &reg) == 1)
228 hw_i2c_read_data(addr, 1, &value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530229
Juston Li78376532015-07-14 21:14:30 -0700230 return value;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530231}
232
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530233/*
234 * This function writes a value to the slave device's register
235 *
236 * Parameters:
237 * deviceAddress - i2c Slave device address which register
238 * to be written
239 * registerIndex - Slave device's register to be written
240 * data - Data to be written to the register
241 *
242 * Result:
243 * 0 - Success
244 * -1 - Fail
245 */
Mike Rapoport6bdbe622015-09-12 11:07:36 +0300246int sm750_hw_i2c_write_reg(
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300247 unsigned char addr,
248 unsigned char reg,
Juston Li78376532015-07-14 21:14:30 -0700249 unsigned char data
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530250)
251{
Juston Li78376532015-07-14 21:14:30 -0700252 unsigned char value[2];
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530253
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300254 value[0] = reg;
Juston Li78376532015-07-14 21:14:30 -0700255 value[1] = data;
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300256 if (hw_i2c_write_data(addr, 2, value) == 2)
Juston Li78376532015-07-14 21:14:30 -0700257 return 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530258
Juston Li78376532015-07-14 21:14:30 -0700259 return (-1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530260}
261
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530262#endif