blob: 22e565fd4639e44fe0bbe743e3338dbccf91a7fa [file] [log] [blame]
Werner Zeh0f9c9de2015-02-10 13:02:34 +01001/*
2 * This file is part of the coreboot project.
3 *
4 * Copyright (C) 2014 Siemens AG
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 of the License.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
Werner Zeh0f9c9de2015-02-10 13:02:34 +010014 */
15
16#include <device/pci.h>
Ben Gardnerfa6014a2015-12-08 21:20:25 -060017#include <soc/baytrail.h>
18#include <soc/pci_devs.h>
19#include <soc/iosf.h>
Werner Zeh0f9c9de2015-02-10 13:02:34 +010020#include <delay.h>
Ben Gardnerfa6014a2015-12-08 21:20:25 -060021#include <soc/i2c.h>
Werner Zeh0f9c9de2015-02-10 13:02:34 +010022
23/* Wait for the transmit FIFO till there is at least one slot empty.
24 * FIFO stall due to transmit abort will be checked and resolved
25 */
Ben Gardner5aecd0e2016-03-23 10:11:24 -050026static int wait_tx_fifo(char *base_adr)
27{
Werner Zeh0f9c9de2015-02-10 13:02:34 +010028 int i;
Ben Gardner77e351d2016-03-23 09:40:37 -050029 u32 as;
Werner Zeh0f9c9de2015-02-10 13:02:34 +010030
Ben Gardner77e351d2016-03-23 09:40:37 -050031 as = read32(base_adr + I2C_ABORT_SOURCE) & 0x1ffff;
32 if (as) {
Werner Zeh0f9c9de2015-02-10 13:02:34 +010033 /* Reading back I2C_CLR_TX_ABRT resets abort lock on TX FIFO */
Ben Gardner77e351d2016-03-23 09:40:37 -050034 i = read32(base_adr + I2C_CLR_TX_ABRT);
35 return I2C_ERR_ABORT | as;
Werner Zeh0f9c9de2015-02-10 13:02:34 +010036 }
37
38 /* Wait here for a free slot in TX-FIFO */
39 i = I2C_TIMEOUT_US;
Ben Gardner5aecd0e2016-03-23 10:11:24 -050040 while (!(read32(base_adr + I2C_STATUS) & I2C_TFNF)) {
Werner Zeh0f9c9de2015-02-10 13:02:34 +010041 udelay(1);
42 if (!--i)
43 return I2C_ERR_TIMEOUT;
44 }
45
46 return I2C_SUCCESS;
47}
48
49/* Wait for the receive FIFO till there is at least one valid entry to read.
50 * FIFO stall due to transmit abort will be checked and resolved
51 */
Ben Gardner5aecd0e2016-03-23 10:11:24 -050052static int wait_rx_fifo(char *base_adr)
53{
Werner Zeh0f9c9de2015-02-10 13:02:34 +010054 int i;
Ben Gardner77e351d2016-03-23 09:40:37 -050055 u32 as;
56
57 as = read32(base_adr + I2C_ABORT_SOURCE) & 0x1ffff;
58 if (as) {
Werner Zeh0f9c9de2015-02-10 13:02:34 +010059 /* Reading back I2C_CLR_TX_ABRT resets abort lock on TX FIFO */
Ben Gardner77e351d2016-03-23 09:40:37 -050060 i = read32(base_adr + I2C_CLR_TX_ABRT);
61 return I2C_ERR_ABORT | as;
Werner Zeh0f9c9de2015-02-10 13:02:34 +010062 }
63
64 /* Wait here for a received entry in RX-FIFO */
65 i = I2C_TIMEOUT_US;
Ben Gardner5aecd0e2016-03-23 10:11:24 -050066 while (!(read32(base_adr + I2C_STATUS) & I2C_RFNE)) {
Werner Zeh0f9c9de2015-02-10 13:02:34 +010067 udelay(1);
68 if (!--i)
69 return I2C_ERR_TIMEOUT;
70 }
71
72 return I2C_SUCCESS;
73}
74
75/* When there will be a fast switch between send and receive, one have
76 * to wait until the first operation is completely finished
77 * before starting the second operation
78 */
79static int wait_for_idle(char *base_adr)
80{
81 int i;
Ben Gardner5aecd0e2016-03-23 10:11:24 -050082 int status;
Werner Zeh0f9c9de2015-02-10 13:02:34 +010083
84 /* For IDLE, increase timeout by ten times */
85 i = I2C_TIMEOUT_US * 10;
Ben Gardner5aecd0e2016-03-23 10:11:24 -050086 status = read32(base_adr + I2C_STATUS);
Werner Zeh0f9c9de2015-02-10 13:02:34 +010087 while (((status & I2C_MST_ACTIVITY) || (!(status & I2C_TFE)))) {
Ben Gardner5aecd0e2016-03-23 10:11:24 -050088 status = read32(base_adr + I2C_STATUS);
Werner Zeh0f9c9de2015-02-10 13:02:34 +010089 udelay(1);
90 if (!--i)
91 return I2C_ERR_TIMEOUT;
92 }
93
94 return I2C_SUCCESS;
Werner Zeh0f9c9de2015-02-10 13:02:34 +010095}
96
97/** \brief Enables I2C-controller, sets up BAR and timing parameters
98 * @param bus Number of the I2C-controller to use (0...6)
99 * @return I2C_SUCCESS on success, otherwise error code
100 */
101int i2c_init(unsigned bus)
102{
Elyes HAOUAS509edac2018-05-27 17:48:32 +0200103 struct device *dev;
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100104 int base_adr[7] = {I2C0_MEM_BASE, I2C1_MEM_BASE, I2C2_MEM_BASE,
105 I2C3_MEM_BASE, I2C4_MEM_BASE, I2C5_MEM_BASE,
106 I2C6_MEM_BASE};
107 char *base_ptr;
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500108
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100109 /* Ensure the desired device is valid */
Martin Rothc8909962015-12-21 13:14:58 -0700110 if (bus >= ARRAY_SIZE(base_adr)) {
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100111 printk(BIOS_ERR, "I2C: Only I2C controllers 0...6 are available.\n");
112 return I2C_ERR;
113 }
114
115 base_ptr = (char*)base_adr[bus];
116 /* Set the I2C-device the user wants to use */
Kyösti Mälkkic70eed12018-05-22 02:18:00 +0300117 dev = pcidev_on_root(I2C1_DEV, bus + 1);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100118
119 /* Ensure we have the right PCI device */
120 if ((pci_read_config16(dev, 0x0) != I2C_PCI_VENDOR_ID) ||
121 (pci_read_config16(dev, 0x2) != (I2C0_PCI_DEV_ID + bus))) {
122 printk(BIOS_ERR, "I2C: Controller %d not found!\n", bus);
123 return I2C_ERR;
124 }
125
126 /* Set memory base */
127 pci_write_config32(dev, PCI_BASE_ADDRESS_0, (int)base_ptr);
128
129 /* Enable memory space */
130 pci_write_config32(dev, PCI_COMMAND,
131 (pci_read_config32(dev, PCI_COMMAND) | 0x2));
132
133 /* Set up some settings of I2C controller */
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500134 write32(base_ptr + I2C_CTRL,
135 I2C_RESTART_EN | (I2C_STANDARD_MODE << 1) | I2C_MASTER_ENABLE);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100136 /* Adjust frequency for standard mode to 100 kHz */
137 /* The counter value can be computed by N=100MHz/2/I2C_CLK */
138 /* Thus, for 100 kHz I2C_CLK, N is 0x1F4 */
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500139 write32(base_ptr + I2C_SS_SCL_HCNT, 0x1f4);
140 write32(base_ptr + I2C_SS_SCL_LCNT, 0x1f4);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100141 /* For 400 kHz, the counter value is 0x7d */
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500142 write32(base_ptr + I2C_FS_SCL_HCNT, 0x7d);
143 write32(base_ptr + I2C_FS_SCL_LCNT, 0x7d);
Ben Gardner44bb9bd2016-06-01 09:25:28 -0500144 /* no interrupts in BIOS */
145 write32(base_ptr + I2C_INTR_MASK, 0);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100146
147 /* Enable the I2C controller for operation */
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500148 write32(base_ptr + I2C_ENABLE, 0x1);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100149
150 printk(BIOS_INFO, "I2C: Controller %d enabled.\n", bus);
151 return I2C_SUCCESS;
152}
153
154/** \brief Read bytes over I2C-Bus from a slave. This function tries only one
155 * time to transmit data. In case of an error (abort) error code is
156 * returned. Retransmission has to be done from caller!
157 * @param bus Number of the I2C-controller to use (0...6)
158 * @param chip 7 Bit of the slave address on I2C bus
159 * @param addr Address inside slave where to read from
160 * @param *buf Pointer to the buffer where to store read data
161 * @param len Number of bytes to read
162 * @return I2C_SUCCESS when read was successful, otherwise error code
163 */
164int i2c_read(unsigned bus, unsigned chip, unsigned addr,
165 uint8_t *buf, unsigned len)
166{
167 int i = 0;
168 char *base_ptr = NULL;
Elyes HAOUAS509edac2018-05-27 17:48:32 +0200169 struct device *dev;
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100170 unsigned int val;
171 int stat;
172
173 /* Get base address of desired I2C-controller */
Kyösti Mälkkic70eed12018-05-22 02:18:00 +0300174 dev = pcidev_on_root(I2C1_DEV, bus + 1);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100175 base_ptr = (char *)pci_read_config32(dev, PCI_BASE_ADDRESS_0);
176 if (base_ptr == NULL) {
177 printk(BIOS_INFO, "I2C: Invalid Base address\n");
178 return I2C_ERR_INVALID_ADR;
179 }
180
181 /* Ensure I2C controller is not active before setting slave address */
182 stat = wait_for_idle(base_ptr);
183 if (stat != I2C_SUCCESS)
184 return stat;
Ben Gardner77e351d2016-03-23 09:40:37 -0500185
186 /* clear any abort status from a previous transaction */
187 read32(base_ptr + I2C_CLR_TX_ABRT);
188
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100189 /* Now we can program the desired slave address and start transfer */
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500190 write32(base_ptr + I2C_TARGET_ADR, chip & 0xff);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100191 /* Send address inside slave to read from */
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500192 write32(base_ptr + I2C_DATA_CMD, addr & 0xff);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100193
194 /* For the next byte we need a repeated start condition */
195 val = I2C_RW_CMD | I2C_RESTART;
196 /* Now we can read desired amount of data over I2C */
197 for (i = 0; i < len; i++) {
198 /* A read is initiated by writing dummy data to the DATA-register */
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500199 write32(base_ptr + I2C_DATA_CMD, val);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100200 stat = wait_rx_fifo(base_ptr);
201 if (stat)
202 return stat;
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500203 buf[i] = read32(base_ptr + I2C_DATA_CMD) & 0xff;
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100204 val = I2C_RW_CMD;
205 if (i == (len - 2)) {
206 /* For the last byte we need a stop condition to be generated */
207 val |= I2C_STOP;
208 }
209 }
210 return I2C_SUCCESS;
211}
212
213/** \brief Write bytes over I2C-Bus from a slave. This function tries only one
214 * time to transmit data. In case of an error (abort) error code is
215 * returned. Retransmission has to be done from caller!
216 * @param bus Number of the I2C-controller to use (0...6)
217 * @param chip 7 Bit of the slave address on I2C bus
218 * @param addr Address inside slave where to write to
219 * @param *buf Pointer to the buffer where data to write is stored
220 * @param len Number of bytes to write
221 * @return I2C_SUCCESS when read was successful, otherwise error code
222 */
223int i2c_write(unsigned bus, unsigned chip, unsigned addr,
224 const uint8_t *buf, unsigned len)
225{
226 int i;
227 char *base_ptr;
Elyes HAOUAS509edac2018-05-27 17:48:32 +0200228 struct device *dev;
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100229 unsigned int val;
230 int stat;
231
232 /* Get base address of desired I2C-controller */
Kyösti Mälkkic70eed12018-05-22 02:18:00 +0300233 dev = pcidev_on_root(I2C1_DEV, bus + 1);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100234 base_ptr = (char *)pci_read_config32(dev, PCI_BASE_ADDRESS_0);
235 if (base_ptr == NULL) {
236 return I2C_ERR_INVALID_ADR;
237 }
238
239 /* Ensure I2C controller is not active yet */
240 stat = wait_for_idle(base_ptr);
241 if (stat) {
242 return stat;
243 }
Ben Gardner77e351d2016-03-23 09:40:37 -0500244
245 /* clear any abort status from a previous transaction */
246 read32(base_ptr + I2C_CLR_TX_ABRT);
247
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100248 /* Program slave address to use for this transfer */
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500249 write32(base_ptr + I2C_TARGET_ADR, chip & 0xff);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100250
251 /* Send address inside slave to write data to */
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500252 write32(base_ptr + I2C_DATA_CMD, addr & 0xff);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100253
254 for (i = 0; i < len; i++) {
255 val = (unsigned int)(buf[i] & 0xff); /* Take only 8 bits */
256 if (i == (len - 1)) {
257 /* For the last byte we need a stop condition */
258 val |= I2C_STOP;
259 }
260 stat = wait_tx_fifo(base_ptr);
261 if (stat) {
262 return stat;
263 }
Ben Gardner5aecd0e2016-03-23 10:11:24 -0500264 write32(base_ptr + I2C_DATA_CMD, val);
Werner Zeh0f9c9de2015-02-10 13:02:34 +0100265 }
266 return I2C_SUCCESS;
267}