xref: /optee_os/core/include/drivers/ls_i2c.h (revision b4bfc9a9beb7c23fc8f6c1f0ef36d30c7ff5b4c0)
1819d0141SSahil Malhotra /* SPDX-License-Identifier: BSD-2-Clause */
2819d0141SSahil Malhotra /*
3819d0141SSahil Malhotra  * Copyright 2021 NXP
4819d0141SSahil Malhotra  * I2C driver for I2C Controller
5819d0141SSahil Malhotra  */
6819d0141SSahil Malhotra 
7819d0141SSahil Malhotra #ifndef __DRIVERS_LS_I2C_H
8819d0141SSahil Malhotra #define __DRIVERS_LS_I2C_H
9819d0141SSahil Malhotra 
10819d0141SSahil Malhotra #include <io.h>
11819d0141SSahil Malhotra #include <stdint.h>
12819d0141SSahil Malhotra #include <tee_api_types.h>
13819d0141SSahil Malhotra 
14819d0141SSahil Malhotra /*
15819d0141SSahil Malhotra  * Module Disable
16819d0141SSahil Malhotra  * 0b - The module is enabled. You must clear this field before any other IBCR
17819d0141SSahil Malhotra  * fields have any effect.
18819d0141SSahil Malhotra  * 1b - The module is reset and disabled. This is the power-on reset situation.
19819d0141SSahil Malhotra  * When high, the interface is held in reset, but registers can still be
20819d0141SSahil Malhotra  * accessed. Status register fields (IBSR) are not valid when the module
21819d0141SSahil Malhotra  * is disabled.
22819d0141SSahil Malhotra  */
23*b4bfc9a9SJens Wiklander #define I2C_IBCR_MDIS U(0x80)
24819d0141SSahil Malhotra 
25819d0141SSahil Malhotra /* I2c Bus Interrupt Enable */
26*b4bfc9a9SJens Wiklander #define I2C_IBCR_IBIE U(0x40)
27819d0141SSahil Malhotra 
28819d0141SSahil Malhotra /*
29819d0141SSahil Malhotra  * Master / Slave Mode 0b - Slave mode 1b - Master mode
30819d0141SSahil Malhotra  * When you change this field from 0 to 1, the module generates a START signal
31819d0141SSahil Malhotra  * on the bus and selects the master mode. When you change this field from 1 to
32819d0141SSahil Malhotra  * 0, the module generates a STOP signal and changes the operation mode from
33819d0141SSahil Malhotra  * master to slave. You should generate a STOP signal only if IBSR[IBIF]=1.
34819d0141SSahil Malhotra  * The module clears this field without generating a STOP signal when the
35819d0141SSahil Malhotra  * master loses arbitration.
36819d0141SSahil Malhotra  */
37*b4bfc9a9SJens Wiklander #define I2C_IBCR_MSSL U(0x20)
38819d0141SSahil Malhotra 
39819d0141SSahil Malhotra /* 0b - Receive 1b - Transmit */
40*b4bfc9a9SJens Wiklander #define I2C_IBCR_TXRX U(0x10)
41819d0141SSahil Malhotra 
42819d0141SSahil Malhotra /*
43819d0141SSahil Malhotra  * Data acknowledge disable
44819d0141SSahil Malhotra  * Values written to this field are only used when the I2C module is a receiver,
45819d0141SSahil Malhotra  * not a transmitter.
46819d0141SSahil Malhotra  * 0b - The module sends an acknowledge signal to the bus at the 9th clock bit
47819d0141SSahil Malhotra  * after receiving one byte of data.
48819d0141SSahil Malhotra  * 1b - The module does not send an acknowledge-signal response (that is,
49819d0141SSahil Malhotra  * acknowledge bit = 1).
50819d0141SSahil Malhotra  */
51*b4bfc9a9SJens Wiklander #define I2C_IBCR_NOACK U(0x08)
52819d0141SSahil Malhotra 
53819d0141SSahil Malhotra /*
54819d0141SSahil Malhotra  * Repeat START
55819d0141SSahil Malhotra  * If the I2C module is the current bus master, and you program RSTA=1, the I2C
56819d0141SSahil Malhotra  * module generates a repeated START condition. This field always reads as a 0.
57819d0141SSahil Malhotra  * If you attempt a repeated START at the wrong time, if the bus is owned by
58819d0141SSahil Malhotra  * another master the result is loss of arbitration.
59819d0141SSahil Malhotra  */
60*b4bfc9a9SJens Wiklander #define I2C_IBCR_RSTA U(0x04)
61819d0141SSahil Malhotra 
62819d0141SSahil Malhotra /* DMA enable */
63*b4bfc9a9SJens Wiklander #define I2C_IBCR_DMAEN U(0x02)
64819d0141SSahil Malhotra 
65819d0141SSahil Malhotra /* Transfer Complete */
66*b4bfc9a9SJens Wiklander #define I2C_IBSR_TCF U(0x80)
67819d0141SSahil Malhotra 
68819d0141SSahil Malhotra /* I2C bus Busy. 0b - Bus is idle, 1b - Bus is busy */
69*b4bfc9a9SJens Wiklander #define I2C_IBSR_IBB U(0x20)
70819d0141SSahil Malhotra 
71819d0141SSahil Malhotra /* Arbitration Lost. software must clear this field by writing a one to it. */
72*b4bfc9a9SJens Wiklander #define I2C_IBSR_IBAL U(0x10)
73819d0141SSahil Malhotra 
74819d0141SSahil Malhotra /* I2C bus interrupt flag */
75*b4bfc9a9SJens Wiklander #define I2C_IBSR_IBIF U(0x02)
76819d0141SSahil Malhotra 
77819d0141SSahil Malhotra /*
78819d0141SSahil Malhotra  * Received acknowledge
79819d0141SSahil Malhotra  * 0b - Acknowledge received
80819d0141SSahil Malhotra  * 1b - No acknowledge received
81819d0141SSahil Malhotra  */
82*b4bfc9a9SJens Wiklander #define I2C_IBSR_RXAK U(0x01)
83819d0141SSahil Malhotra 
84819d0141SSahil Malhotra /* Bus idle interrupt enable */
85*b4bfc9a9SJens Wiklander #define I2C_IBIC_BIIE U(0x80)
86819d0141SSahil Malhotra 
87819d0141SSahil Malhotra /* Glitch filter enable */
88*b4bfc9a9SJens Wiklander #define I2C_IBDBG_GLFLT_EN U(0x08)
89819d0141SSahil Malhotra 
90*b4bfc9a9SJens Wiklander #define I2C_FLAG_WRITE U(0x00000000)
91*b4bfc9a9SJens Wiklander #define I2C_FLAG_READ  U(0x00000001)
92819d0141SSahil Malhotra 
93819d0141SSahil Malhotra #define I2C_BUS_TEST_BUSY      true
94819d0141SSahil Malhotra #define I2C_BUS_TEST_IDLE      !I2C_BUS_TEST_BUSY
95819d0141SSahil Malhotra #define I2C_BUS_TEST_RX_ACK    true
96819d0141SSahil Malhotra #define I2C_BUS_NO_TEST_RX_ACK !I2C_BUS_TEST_RX_ACK
97819d0141SSahil Malhotra 
98*b4bfc9a9SJens Wiklander #define I2C_NUM_RETRIES	   U(500)
99819d0141SSahil Malhotra 
100819d0141SSahil Malhotra struct i2c_regs {
101819d0141SSahil Malhotra 	uint8_t ibad;  /* I2c Bus Address Register */
102819d0141SSahil Malhotra 	uint8_t ibfd;  /* I2c Bus Frequency Divider Register */
103819d0141SSahil Malhotra 	uint8_t ibcr;  /* I2c Bus Control Register */
104819d0141SSahil Malhotra 	uint8_t ibsr;  /* I2c Bus Status Register */
105819d0141SSahil Malhotra 	uint8_t ibdr;  /* I2C Bus Data I/O Register */
106819d0141SSahil Malhotra 	uint8_t ibic;  /* I2C Bus Interrupt Config Register */
107819d0141SSahil Malhotra 	uint8_t ibdbg; /* I2C Bus Debug Register */
108819d0141SSahil Malhotra };
109819d0141SSahil Malhotra 
110819d0141SSahil Malhotra /*
111819d0141SSahil Malhotra  * sorted list of clock divisor, ibfd register value pairs
112819d0141SSahil Malhotra  */
113819d0141SSahil Malhotra struct i2c_clock_divisor_pair {
114819d0141SSahil Malhotra 	uint16_t divisor;
115819d0141SSahil Malhotra 	uint8_t ibfd; /* I2c Bus Frequency Divider Register value */
116819d0141SSahil Malhotra };
117819d0141SSahil Malhotra 
118819d0141SSahil Malhotra /*
119819d0141SSahil Malhotra  * I2C device operation
120819d0141SSahil Malhotra  * The i2c_operation describes a subset of an I2C transaction in which
121819d0141SSahil Malhotra  * the I2C controller is either sending or receiving bytes from the bus.
122819d0141SSahil Malhotra  * Some transactions will consist of a single operation while others will
123819d0141SSahil Malhotra  * be two or more.
124819d0141SSahil Malhotra  */
125819d0141SSahil Malhotra struct i2c_operation {
126819d0141SSahil Malhotra 	/* Flags to qualify the I2C operation. */
127819d0141SSahil Malhotra 	uint32_t flags;
128819d0141SSahil Malhotra 
129819d0141SSahil Malhotra 	/*
130819d0141SSahil Malhotra 	 * Number of bytes to send to or receive from the I2C device.A ping
131819d0141SSahil Malhotra 	 * is indicated by setting the length_in_bytes to zero.
132819d0141SSahil Malhotra 	 */
133819d0141SSahil Malhotra 	unsigned int length_in_bytes;
134819d0141SSahil Malhotra 
135819d0141SSahil Malhotra 	/*
136819d0141SSahil Malhotra 	 * Pointer to a buffer containing the data to send or to receive from
137819d0141SSahil Malhotra 	 * the I2C device.  The Buffer must be at least length_in_bytes in size.
138819d0141SSahil Malhotra 	 */
139819d0141SSahil Malhotra 	uint8_t *buffer;
140819d0141SSahil Malhotra };
141819d0141SSahil Malhotra 
142819d0141SSahil Malhotra /*
143819d0141SSahil Malhotra  * Structure to initialize I2C controller.
144819d0141SSahil Malhotra  */
145819d0141SSahil Malhotra struct ls_i2c_data {
146819d0141SSahil Malhotra 	/* I2C Controller to initialize */
147819d0141SSahil Malhotra 	uint8_t i2c_controller;
148819d0141SSahil Malhotra 	/*
149819d0141SSahil Malhotra 	 * base will be filled by i2c_init() which will be used in
150819d0141SSahil Malhotra 	 * subsequent calls for reading/writing data.
151819d0141SSahil Malhotra 	 */
152819d0141SSahil Malhotra 	vaddr_t base;
153819d0141SSahil Malhotra 	/* I2C bus clock frequency */
154819d0141SSahil Malhotra 	uint64_t i2c_bus_clock;
155819d0141SSahil Malhotra 	/* I2C speed */
156819d0141SSahil Malhotra 	uint64_t speed;
157819d0141SSahil Malhotra };
158819d0141SSahil Malhotra 
159819d0141SSahil Malhotra /*
160819d0141SSahil Malhotra  * Structure to fill for I2C read/write operation
161819d0141SSahil Malhotra  */
162819d0141SSahil Malhotra struct i2c_reg_request {
163819d0141SSahil Malhotra 	/*
164819d0141SSahil Malhotra 	 * Number of operations to perform.
165819d0141SSahil Malhotra 	 * This will depend on peripheral for which it is used.
166819d0141SSahil Malhotra 	 */
167819d0141SSahil Malhotra 	unsigned int operation_count;
168819d0141SSahil Malhotra 	/* Operation to perform */
169819d0141SSahil Malhotra 	struct i2c_operation *operation;
170819d0141SSahil Malhotra };
171819d0141SSahil Malhotra 
172819d0141SSahil Malhotra /*
173819d0141SSahil Malhotra  * Initialize I2C Controller, based on data passed in
174819d0141SSahil Malhotra  * i2c_data.
175819d0141SSahil Malhotra  */
176819d0141SSahil Malhotra TEE_Result i2c_init(struct ls_i2c_data *i2c_data);
177819d0141SSahil Malhotra 
178819d0141SSahil Malhotra /*
179819d0141SSahil Malhotra  * Software reset of the entire I2C module.
180819d0141SSahil Malhotra  * The module is reset and disabled.
181819d0141SSahil Malhotra  * Status register fields (IBSR) are cleared.
182819d0141SSahil Malhotra  * base       Base Address of I2c controller's registers
183819d0141SSahil Malhotra  */
184819d0141SSahil Malhotra void i2c_reset(vaddr_t base);
185819d0141SSahil Malhotra 
186819d0141SSahil Malhotra /*
187819d0141SSahil Malhotra  * Transfer data to/from I2c slave device
188819d0141SSahil Malhotra  * base			Base Address of I2c controller's registers
189819d0141SSahil Malhotra  * slave_address	Slave Address from which data is to be read
190819d0141SSahil Malhotra  * i2c_operation	Pointer to an i2c_operation structure
191819d0141SSahil Malhotra  * operation_count	Number of operations.
192819d0141SSahil Malhotra  */
193819d0141SSahil Malhotra TEE_Result i2c_bus_xfer(vaddr_t base, uint32_t slave_address,
194819d0141SSahil Malhotra 			struct i2c_operation *i2c_operation,
195819d0141SSahil Malhotra 			unsigned int operation_count);
196819d0141SSahil Malhotra 
197819d0141SSahil Malhotra #endif /* __DRIVERS_LS_I2C_H */
198