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