coreboot
coreboot is an Open Source project aimed at replacing the proprietary BIOS found in most computers.
i2c.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 
3 #include <assert.h>
4 #include <console/console.h>
5 #include <device/i2c_simple.h>
6 #include <string.h>
7 #include <soc/blsp.h>
8 #include <soc/qup.h>
9 #include <soc/gpio.h>
10 
13  400000,
14  19200000,
16  0
17 };
18 
21  400000,
22  19200000,
24  0
25 };
26 
29  400000,
30  19200000,
32  0
33 };
34 
37  400000,
38  19200000,
40  0
41 };
42 
43 static int i2c_read(uint32_t gsbi_id, uint8_t slave,
44  uint8_t *data, int data_len)
45 {
46  qup_data_t obj;
47  qup_return_t qup_ret = 0;
48 
49  memset(&obj, 0, sizeof(obj));
51  obj.p.iic.addr = slave;
52  obj.p.iic.data_len = data_len;
53  obj.p.iic.data = data;
54  qup_ret = qup_recv_data(gsbi_id, &obj);
55 
56  if (qup_ret != QUP_SUCCESS)
57  return 1;
58  else
59  return 0;
60 }
61 
62 static int i2c_write(uint32_t gsbi_id, uint8_t slave,
63  uint8_t *data, int data_len, uint8_t stop_seq)
64 {
65  qup_data_t obj;
66  qup_return_t qup_ret = 0;
67 
68  memset(&obj, 0, sizeof(obj));
70  obj.p.iic.addr = slave;
71  obj.p.iic.data_len = data_len;
72  obj.p.iic.data = data;
73  qup_ret = qup_send_data(gsbi_id, &obj, stop_seq);
74 
75  if (qup_ret != QUP_SUCCESS)
76  return 1;
77  else
78  return 0;
79 }
80 
81 static int i2c_init(blsp_qup_id_t id)
82 {
83  qup_config_t *qup_config;
84 
85  switch (id) {
86  case BLSP_QUP_ID_0:
87  qup_config = &blsp1_qup0_config;
88  break;
89  case BLSP_QUP_ID_1:
90  qup_config = &blsp1_qup1_config;
91  break;
92  case BLSP_QUP_ID_2:
93  qup_config = &blsp1_qup2_config;
94  break;
95  case BLSP_QUP_ID_3:
96  qup_config = &blsp1_qup3_config;
97  break;
98  default:
99  printk(BIOS_ERR, "QUP configuration not defined for BLSP%d.\n",
100  id);
101  return 1;
102  }
103 
104  if (qup_config->initialized)
105  return 0;
106 
107  if (blsp_i2c_init(id)) {
108  printk(BIOS_ERR, "failed to initialize blsp\n");
109  return 1;
110  }
111 
112  if (qup_init(id, qup_config)) {
113  printk(BIOS_ERR, "failed to initialize qup\n");
114  return 1;
115  }
116 
117  if (qup_reset_i2c_master_status(id)) {
118  printk(BIOS_ERR, "failed to reset i2c master status\n");
119  return 1;
120  }
121 
122  qup_config->initialized = 1;
123  return 0;
124 }
125 
126 int platform_i2c_transfer(unsigned int bus, struct i2c_msg *segments,
127  int seg_count)
128 {
129  struct i2c_msg *seg = segments;
130  int ret = 0;
131 
132  if (i2c_init(bus))
133  return 1;
134 
135  while (!ret && seg_count--) {
136  if (seg->flags & I2C_M_RD)
137  ret = i2c_read(bus, seg->slave, seg->buf, seg->len);
138  else
139  ret = i2c_write(bus, seg->slave, seg->buf, seg->len,
140  (seg_count ? 0 : 1));
141  seg++;
142  }
143 
144  if (ret) {
146  return 1;
147  }
148 
149  return 0;
150 }
void * memset(void *dstpp, int c, size_t len)
Definition: memset.c:12
#define printk(level,...)
Definition: stdlib.h:16
#define I2C_M_RD
Definition: i2c.h:34
blsp_qup_id_t
Definition: blsp.h:6
@ BLSP_QUP_ID_1
Definition: blsp.h:8
@ BLSP_QUP_ID_3
Definition: blsp.h:10
@ BLSP_QUP_ID_0
Definition: blsp.h:7
@ BLSP_QUP_ID_2
Definition: blsp.h:9
qup_return_t qup_set_state(blsp_qup_id_t id, uint32_t state)
Definition: qup.c:450
qup_return_t qup_recv_data(blsp_qup_id_t id, qup_data_t *p_tx_obj)
Definition: qup.c:533
@ QUP_MINICORE_I2C_MASTER
Definition: qup.h:121
qup_return_t qup_send_data(blsp_qup_id_t id, qup_data_t *p_tx_obj, uint8_t stop_seq)
Definition: qup.c:494
#define QUP_STATE_RESET
Definition: qup.h:64
qup_return_t
Definition: qup.h:102
@ QUP_SUCCESS
Definition: qup.h:103
qup_return_t qup_reset_i2c_master_status(blsp_qup_id_t id)
Definition: qup.c:79
@ QUP_MODE_BLOCK
Definition: qup.h:127
qup_return_t qup_init(blsp_qup_id_t id, const qup_config_t *config_ptr)
Definition: qup.c:380
#define BIOS_ERR
BIOS_ERR - System in incomplete state.
Definition: loglevel.h:72
int platform_i2c_transfer(unsigned int bus, struct i2c_msg *segment, int seg_count)
Definition: i2c.c:176
void i2c_init(unsigned int bus)
Definition: i2c.c:198
blsp_return_t blsp_i2c_init(blsp_qup_id_t id)
Definition: blsp.c:7
static int i2c_read(uint32_t gsbi_id, uint8_t slave, uint8_t *data, int data_len)
Definition: i2c.c:43
static qup_config_t blsp1_qup1_config
Definition: i2c.c:19
static qup_config_t blsp1_qup2_config
Definition: i2c.c:27
static qup_config_t blsp1_qup0_config
Definition: i2c.c:11
static int i2c_write(uint32_t gsbi_id, uint8_t slave, uint8_t *data, int data_len, uint8_t stop_seq)
Definition: i2c.c:62
static qup_config_t blsp1_qup3_config
Definition: i2c.c:35
static struct spi_slave slave
Definition: spiconsole.c:7
unsigned int uint32_t
Definition: stdint.h:14
unsigned char uint8_t
Definition: stdint.h:8
Definition: device.h:76
struct i2c_msg - an I2C transaction segment beginning with START @addr: Slave address,...
Definition: i2c.h:32
uint16_t len
Definition: i2c.h:39
uint16_t slave
Definition: i2c.h:38
uint16_t flags
Definition: i2c.h:33
uint8_t * buf
Definition: i2c.h:40
unsigned int initialized
Definition: qup.h:136
struct qup_data_t::@1401::@1402 iic
qup_protocol_t protocol
Definition: qup.h:140
union qup_data_t::@1401 p