blob: d391c127ead7e864fc1524d0af13688c4f40cb17 [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
Mike Rapoport2a5149e2016-01-17 20:04:23 +020020 value |= (GPIO_MUX_30 | GPIO_MUX_31);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053021 POKE32(GPIO_MUX, value);
22
Juston Li78376532015-07-14 21:14:30 -070023 /* Enable Hardware I2C power.
Elizabeth Ferdman35e4d8c2016-09-28 14:33:51 -070024 * TODO: Check if we need to enable GPIO power?
Juston Li78376532015-07-14 21:14:30 -070025 */
26 enableI2C(1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053027
Juston Li78376532015-07-14 21:14:30 -070028 /* Enable the I2C Controller and set the bus speed mode */
Mike Rapoportb71413e2016-02-10 18:34:20 +020029 value = PEEK32(I2C_CTRL) & ~(I2C_CTRL_MODE | I2C_CTRL_EN);
30 if (bus_speed_mode)
31 value |= I2C_CTRL_MODE;
32 value |= I2C_CTRL_EN;
Juston Li78376532015-07-14 21:14:30 -070033 POKE32(I2C_CTRL, value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053034
Juston Li78376532015-07-14 21:14:30 -070035 return 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053036}
37
Mike Rapoported7042e2015-09-12 11:07:34 +030038void sm750_hw_i2c_close(void)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053039{
Juston Li78376532015-07-14 21:14:30 -070040 unsigned int value;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053041
Juston Li78376532015-07-14 21:14:30 -070042 /* Disable I2C controller */
Mike Rapoportb71413e2016-02-10 18:34:20 +020043 value = PEEK32(I2C_CTRL) & ~I2C_CTRL_EN;
Juston Li78376532015-07-14 21:14:30 -070044 POKE32(I2C_CTRL, value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053045
Juston Li78376532015-07-14 21:14:30 -070046 /* Disable I2C Power */
47 enableI2C(0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053048
Juston Li78376532015-07-14 21:14:30 -070049 /* Set GPIO 30 & 31 back as GPIO pins */
50 value = PEEK32(GPIO_MUX);
Mike Rapoport2a5149e2016-01-17 20:04:23 +020051 value &= ~GPIO_MUX_30;
52 value &= ~GPIO_MUX_31;
Juston Li78376532015-07-14 21:14:30 -070053 POKE32(GPIO_MUX, value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053054}
55
Mike Rapoportac118952015-09-12 11:07:37 +030056static long hw_i2c_wait_tx_done(void)
Sudip Mukherjee81dee672015-03-03 16:21:06 +053057{
Juston Li78376532015-07-14 21:14:30 -070058 unsigned int timeout;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053059
Juston Li78376532015-07-14 21:14:30 -070060 /* Wait until the transfer is completed. */
61 timeout = HWI2C_WAIT_TIMEOUT;
Mike Rapoport3e155b82016-02-10 18:34:21 +020062 while (!(PEEK32(I2C_STATUS) & I2C_STATUS_TX) && (timeout != 0))
Sudip Mukherjee81dee672015-03-03 16:21:06 +053063 timeout--;
64
65 if (timeout == 0)
Amitoj Kaur Chawla732053a2016-02-24 22:30:15 +053066 return -1;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053067
Juston Li78376532015-07-14 21:14:30 -070068 return 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053069}
70
Sudip Mukherjee81dee672015-03-03 16:21:06 +053071/*
72 * This function writes data to the i2c slave device registers.
73 *
74 * Parameters:
Mike Rapoportb3696b72015-09-12 11:07:45 +030075 * addr - i2c Slave device address
Sudip Mukherjee81dee672015-03-03 16:21:06 +053076 * length - Total number of bytes to be written to the device
Mike Rapoportb3696b72015-09-12 11:07:45 +030077 * buf - The buffer that contains the data to be written to the
Sudip Mukherjee81dee672015-03-03 16:21:06 +053078 * i2c device.
79 *
80 * Return Value:
81 * Total number of bytes those are actually written.
82 */
Mike Rapoportac118952015-09-12 11:07:37 +030083static unsigned int hw_i2c_write_data(
Mike Rapoportb3696b72015-09-12 11:07:45 +030084 unsigned char addr,
Juston Li78376532015-07-14 21:14:30 -070085 unsigned int length,
Mike Rapoportb3696b72015-09-12 11:07:45 +030086 unsigned char *buf
Sudip Mukherjee81dee672015-03-03 16:21:06 +053087)
88{
Juston Li78376532015-07-14 21:14:30 -070089 unsigned char count, i;
Mike Rapoportb3696b72015-09-12 11:07:45 +030090 unsigned int total_bytes = 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +053091
Juston Li78376532015-07-14 21:14:30 -070092 /* Set the Device Address */
Mike Rapoportb3696b72015-09-12 11:07:45 +030093 POKE32(I2C_SLAVE_ADDRESS, addr & ~0x01);
Sudip Mukherjee81dee672015-03-03 16:21:06 +053094
Juston Li78376532015-07-14 21:14:30 -070095 /* Write data.
96 * Note:
97 * Only 16 byte can be accessed per i2c start instruction.
98 */
Juston Li259fef32015-07-14 21:14:45 -070099 do {
Mike Rapoport9137f812015-09-12 11:07:49 +0300100 /*
101 * Reset I2C by writing 0 to I2C_RESET register to
102 * clear the previous status.
103 */
Juston Li78376532015-07-14 21:14:30 -0700104 POKE32(I2C_RESET, 0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530105
Juston Li78376532015-07-14 21:14:30 -0700106 /* Set the number of bytes to be written */
107 if (length < MAX_HWI2C_FIFO)
108 count = length - 1;
109 else
110 count = MAX_HWI2C_FIFO - 1;
111 POKE32(I2C_BYTE_COUNT, count);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530112
Juston Li78376532015-07-14 21:14:30 -0700113 /* Move the data to the I2C data register */
114 for (i = 0; i <= count; i++)
Mike Rapoportb3696b72015-09-12 11:07:45 +0300115 POKE32(I2C_DATA0 + i, *buf++);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530116
Juston Li78376532015-07-14 21:14:30 -0700117 /* Start the I2C */
Mike Rapoportb71413e2016-02-10 18:34:20 +0200118 POKE32(I2C_CTRL, PEEK32(I2C_CTRL) | I2C_CTRL_CTRL);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530119
Juston Li78376532015-07-14 21:14:30 -0700120 /* Wait until the transfer is completed. */
Mike Rapoportac118952015-09-12 11:07:37 +0300121 if (hw_i2c_wait_tx_done() != 0)
Juston Li78376532015-07-14 21:14:30 -0700122 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530123
Matej Vasekfbb8c962016-01-25 16:02:33 +0100124 /* Subtract length */
Juston Li78376532015-07-14 21:14:30 -0700125 length -= (count + 1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530126
Juston Li78376532015-07-14 21:14:30 -0700127 /* Total byte written */
Mike Rapoportb3696b72015-09-12 11:07:45 +0300128 total_bytes += (count + 1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530129
Juston Li78376532015-07-14 21:14:30 -0700130 } while (length > 0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530131
Mike Rapoportb3696b72015-09-12 11:07:45 +0300132 return total_bytes;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530133}
134
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530135/*
136 * This function reads data from the slave device and stores them
137 * in the given buffer
138 *
139 * Parameters:
Mike Rapoportb3696b72015-09-12 11:07:45 +0300140 * addr - i2c Slave device address
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530141 * length - Total number of bytes to be read
Mike Rapoportb3696b72015-09-12 11:07:45 +0300142 * buf - Pointer to a buffer to be filled with the data read
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530143 * from the slave device. It has to be the same size as the
144 * length to make sure that it can keep all the data read.
145 *
146 * Return Value:
147 * Total number of actual bytes read from the slave device
148 */
Mike Rapoportac118952015-09-12 11:07:37 +0300149static unsigned int hw_i2c_read_data(
Mike Rapoportb3696b72015-09-12 11:07:45 +0300150 unsigned char addr,
Juston Li78376532015-07-14 21:14:30 -0700151 unsigned int length,
Mike Rapoportb3696b72015-09-12 11:07:45 +0300152 unsigned char *buf
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530153)
154{
Juston Li78376532015-07-14 21:14:30 -0700155 unsigned char count, i;
Mike Rapoportb3696b72015-09-12 11:07:45 +0300156 unsigned int total_bytes = 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530157
Juston Li78376532015-07-14 21:14:30 -0700158 /* Set the Device Address */
Mike Rapoportb3696b72015-09-12 11:07:45 +0300159 POKE32(I2C_SLAVE_ADDRESS, addr | 0x01);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530160
Juston Li78376532015-07-14 21:14:30 -0700161 /* Read data and save them to the buffer.
162 * Note:
163 * Only 16 byte can be accessed per i2c start instruction.
164 */
Juston Li259fef32015-07-14 21:14:45 -0700165 do {
Mike Rapoport9137f812015-09-12 11:07:49 +0300166 /*
167 * Reset I2C by writing 0 to I2C_RESET register to
168 * clear all the status.
169 */
Juston Li78376532015-07-14 21:14:30 -0700170 POKE32(I2C_RESET, 0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530171
Juston Li78376532015-07-14 21:14:30 -0700172 /* Set the number of bytes to be read */
173 if (length <= MAX_HWI2C_FIFO)
174 count = length - 1;
175 else
176 count = MAX_HWI2C_FIFO - 1;
177 POKE32(I2C_BYTE_COUNT, count);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530178
Juston Li78376532015-07-14 21:14:30 -0700179 /* Start the I2C */
Mike Rapoportb71413e2016-02-10 18:34:20 +0200180 POKE32(I2C_CTRL, PEEK32(I2C_CTRL) | I2C_CTRL_CTRL);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530181
Juston Li78376532015-07-14 21:14:30 -0700182 /* Wait until transaction done. */
Mike Rapoportac118952015-09-12 11:07:37 +0300183 if (hw_i2c_wait_tx_done() != 0)
Juston Li78376532015-07-14 21:14:30 -0700184 break;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530185
Juston Li78376532015-07-14 21:14:30 -0700186 /* Save the data to the given buffer */
187 for (i = 0; i <= count; i++)
Mike Rapoportb3696b72015-09-12 11:07:45 +0300188 *buf++ = PEEK32(I2C_DATA0 + i);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530189
Matej Vasekfbb8c962016-01-25 16:02:33 +0100190 /* Subtract length by 16 */
Juston Li78376532015-07-14 21:14:30 -0700191 length -= (count + 1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530192
Juston Li78376532015-07-14 21:14:30 -0700193 /* Number of bytes read. */
Mike Rapoportb3696b72015-09-12 11:07:45 +0300194 total_bytes += (count + 1);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530195
Juston Li78376532015-07-14 21:14:30 -0700196 } while (length > 0);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530197
Mike Rapoportb3696b72015-09-12 11:07:45 +0300198 return total_bytes;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530199}
200
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530201/*
202 * This function reads the slave device's register
203 *
204 * Parameters:
205 * deviceAddress - i2c Slave device address which register
206 * to be read from
207 * registerIndex - Slave device's register to be read
208 *
209 * Return Value:
210 * Register value
211 */
Mike Rapoport5ccf7342015-09-12 11:07:35 +0300212unsigned char sm750_hw_i2c_read_reg(
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300213 unsigned char addr,
214 unsigned char reg
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530215)
216{
Juston Li78376532015-07-14 21:14:30 -0700217 unsigned char value = (0xFF);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530218
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300219 if (hw_i2c_write_data(addr, 1, &reg) == 1)
220 hw_i2c_read_data(addr, 1, &value);
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530221
Juston Li78376532015-07-14 21:14:30 -0700222 return value;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530223}
224
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530225/*
226 * This function writes a value to the slave device's register
227 *
228 * Parameters:
229 * deviceAddress - i2c Slave device address which register
230 * to be written
231 * registerIndex - Slave device's register to be written
232 * data - Data to be written to the register
233 *
234 * Result:
235 * 0 - Success
236 * -1 - Fail
237 */
Mike Rapoport6bdbe622015-09-12 11:07:36 +0300238int sm750_hw_i2c_write_reg(
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300239 unsigned char addr,
240 unsigned char reg,
Juston Li78376532015-07-14 21:14:30 -0700241 unsigned char data
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530242)
243{
Juston Li78376532015-07-14 21:14:30 -0700244 unsigned char value[2];
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530245
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300246 value[0] = reg;
Juston Li78376532015-07-14 21:14:30 -0700247 value[1] = data;
Mike Rapoport938ad7e2015-09-12 11:07:44 +0300248 if (hw_i2c_write_data(addr, 2, value) == 2)
Juston Li78376532015-07-14 21:14:30 -0700249 return 0;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530250
Amitoj Kaur Chawla732053a2016-02-24 22:30:15 +0530251 return -1;
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530252}
253
Sudip Mukherjee81dee672015-03-03 16:21:06 +0530254#endif