/** @file
Copyright (c) 2017, Linaro, Ltd. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef __SYNQUACER_I2C_DXE_H__
#define __SYNQUACER_I2C_DXE_H__
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
extern EFI_COMPONENT_NAME2_PROTOCOL gSynQuacerI2cDriverComponentName2;
#define SYNQUACER_I2C_SIGNATURE SIGNATURE_32 ('S', 'I', '2', 'C')
#define SYNQUACER_I2C_FROM_THIS(a) CR ((a), SYNQUACER_I2C_MASTER, \
I2cMaster, SYNQUACER_I2C_SIGNATURE)
#pragma pack(1)
typedef struct {
VENDOR_DEVICE_PATH Vendor;
UINT64 MmioBase;
EFI_DEVICE_PATH_PROTOCOL End;
} SYNQUACER_I2C_DEVICE_PATH;
#pragma pack()
typedef struct {
UINT32 Signature;
EFI_I2C_MASTER_PROTOCOL I2cMaster;
EFI_PHYSICAL_ADDRESS MmioBase;
SYNQUACER_I2C_DEVICE_PATH DevicePath;
NON_DISCOVERABLE_DEVICE *Dev;
EFI_EVENT VirtualAddressChangeEvent;
BOOLEAN Runtime;
} SYNQUACER_I2C_MASTER;
EFI_STATUS
SynQuacerI2cInit (
IN EFI_HANDLE DriverBindingHandle,
IN EFI_HANDLE ControllerHandle
);
EFI_STATUS
SynQuacerI2cRelease (
IN EFI_HANDLE DriverBindingHandle,
IN EFI_HANDLE ControllerHandle
);
#define REFCLK_RATE FixedPcdGet32 (PcdI2cReferenceClock)
#define DIV_ROUND_UP(n, d) (((n) + (d) - 1) / (d))
#define F_I2C_SPEED_SM 100000
#define F_I2C_SPEED_FM 400000
// I2C register adress definitions
#define F_I2C_REG_BSR (0x00 << 2) // Bus Status Regster
#define F_I2C_REG_BCR (0x01 << 2) // Bus Control Register
#define F_I2C_REG_CCR (0x02 << 2) // Clock Control Register
#define F_I2C_REG_ADR (0x03 << 2) // Address Register
#define F_I2C_REG_DAR (0x04 << 2) // Data Register
#define F_I2C_REG_CSR (0x05 << 2) // Expansion CS Register
#define F_I2C_REG_FSR (0x06 << 2) // Bus Clock Frequency Register
#define F_I2C_REG_BC2R (0x07 << 2) // Bus Control 2 Register
// I2C register bit definitions
#define F_I2C_BSR_FBT BIT0 // First Byte Transfer
#define F_I2C_BSR_GCA BIT1 // General Call Address
#define F_I2C_BSR_AAS BIT2 // Address as Slave
#define F_I2C_BSR_TRX BIT3 // Transfer/Receive
#define F_I2C_BSR_LRB BIT4 // Last Received Bit
#define F_I2C_BSR_AL BIT5 // Arbitration Lost
#define F_I2C_BSR_RSC BIT6 // Repeated Start Condition
#define F_I2C_BSR_BB BIT7 // Bus Busy
#define F_I2C_BCR_INT BIT0 // Interrupt
#define F_I2C_BCR_INTE BIT1 // Interrupt Enable
#define F_I2C_BCR_GCAA BIT2 // General Call Access Acknowledge
#define F_I2C_BCR_ACK BIT3 // Acknowledge
#define F_I2C_BCR_MSS BIT4 // Master Slave Select
#define F_I2C_BCR_SCC BIT5 // Start Condition Continue
#define F_I2C_BCR_BEIE BIT6 // Bus Error Interrupt Enable
#define F_I2C_BCR_BER BIT7 // Bus Error
#define F_I2C_CCR_CS_MASK 0x1f // CCR Clock Period Select
#define F_I2C_CCR_EN BIT5 // Enable
#define F_I2C_CCR_FM BIT6 // Speed Mode Select
#define F_I2C_CSR_CS_MASK 0x3f // CSR Clock Period Select
#define F_I2C_BC2R_SCLL BIT0 // SCL Low Drive
#define F_I2C_BC2R_SDAL BIT1 // SDA Low Drive
#define F_I2C_BC2R_SCLS BIT4 // SCL Status
#define F_I2C_BC2R_SDAS BIT5 // SDA Status
// PCLK frequency
#define F_I2C_BUS_CLK_FR(rate) ((rate) / 20000000 + 1)
#define F_I2C_MIN_CLK_RATE (14 * 1000000) // min frequency 14 MHz
#define F_I2C_MAX_CLK_RATE (200 * 1000000) // max frequency 200 MHz
#define F_I2C_CLK_RATE_18M (18 * 1000000) // threshold freq 18 MHz
// STANDARD MODE frequency
#define F_I2C_CLK_MASTER_STANDARD(rate) \
DIV_ROUND_UP (DIV_ROUND_UP ((rate), 100000) - 2, 2)
// FAST MODE frequency
#define F_I2C_CLK_MASTER_FAST(rate) \
DIV_ROUND_UP ((DIV_ROUND_UP ((rate), 400000) - 2) * 2, 3)
// (clkrate <= 18000000)
// calculate the value of CS bits in CCR register in standard mode
#define F_I2C_CCR_CS_STANDARD_MAX_18M(rate) \
((F_I2C_CLK_MASTER_STANDARD (rate) - 65) & F_I2C_CCR_CS_MASK)
// calculate the value of CS bits in CSR register in standard mode
#define F_I2C_CSR_CS_STANDARD_MAX_18M(rate) 0x00
// calculate the value of CS bits in CCR register in fast mode
#define F_I2C_CCR_CS_FAST_MAX_18M(rate) \
((F_I2C_CLK_MASTER_FAST (rate) - 1) & F_I2C_CCR_CS_MASK)
// calculate the value of CS bits in CSR register in fast mode
#define F_I2C_CSR_CS_FAST_MAX_18M(rate) 0x00
// (clkrate > 18000000)
// calculate the value of CS bits in CCR register in standard mode */
#define F_I2C_CCR_CS_STANDARD_MIN_18M(rate) \
((F_I2C_CLK_MASTER_STANDARD (rate) - 1) & F_I2C_CCR_CS_MASK)
// calculate the value of CS bits in CSR register in standard mode
#define F_I2C_CSR_CS_STANDARD_MIN_18M(rate) \
(((F_I2C_CLK_MASTER_STANDARD (rate) - 1) >> 5) & F_I2C_CSR_CS_MASK)
// calculate the value of CS bits in CCR register in fast mode
#define F_I2C_CCR_CS_FAST_MIN_18M(rate) \
((F_I2C_CLK_MASTER_FAST (rate) - 1) & F_I2C_CCR_CS_MASK)
/* calculate the value of CS bits in CSR register in fast mode */
#define F_I2C_CSR_CS_FAST_MIN_18M(rate) \
(((F_I2C_CLK_MASTER_FAST (rate) - 1) >> 5) & F_I2C_CSR_CS_MASK)
#endif