95 lines
2.4 KiB
C
95 lines
2.4 KiB
C
/*
|
|
* Copyright 2014 - Hans de Goede <hdegoede@redhat.com>
|
|
*/
|
|
#ifndef _SUNXI_I2C_H_
|
|
#define _SUNXI_I2C_H_
|
|
|
|
#include <common.h>
|
|
#include <asm/io.h>
|
|
|
|
#ifdef CONFIG_I2C0_ENABLE
|
|
#define CONFIG_I2C_MVTWSI_BASE0 SUNXI_TWI0_BASE
|
|
#endif
|
|
#ifdef CONFIG_I2C1_ENABLE
|
|
#define CONFIG_I2C_MVTWSI_BASE1 SUNXI_TWI1_BASE
|
|
#endif
|
|
#ifdef CONFIG_I2C2_ENABLE
|
|
#define CONFIG_I2C_MVTWSI_BASE2 SUNXI_TWI2_BASE
|
|
#endif
|
|
#ifdef CONFIG_I2C3_ENABLE
|
|
#define CONFIG_I2C_MVTWSI_BASE3 SUNXI_TWI3_BASE
|
|
#endif
|
|
#ifdef CONFIG_I2C4_ENABLE
|
|
#define CONFIG_I2C_MVTWSI_BASE4 SUNXI_TWI4_BASE
|
|
#endif
|
|
#ifdef CONFIG_R_I2C_ENABLE
|
|
#define CONFIG_I2C_MVTWSI_BASE5 SUNXI_R_TWI_BASE
|
|
#endif
|
|
|
|
enum {
|
|
SUNXI_PHY_I2C0 = 0,
|
|
|
|
SUNXI_PHY_I2C1,
|
|
|
|
SUNXI_PHY_I2C2,
|
|
|
|
SUNXI_PHY_I2C3,
|
|
|
|
SUNXI_PHY_I2C4,
|
|
|
|
SUNXI_PHY_I2C5,
|
|
|
|
SUNXI_PHY_R_I2C0,
|
|
|
|
SUNXI_PHY_R_I2C1,
|
|
|
|
/*The new i2c bus must be added before SUNXI_PHY_I2C_BUS_MAX*/
|
|
SUNXI_PHY_I2C_BUS_MAX,
|
|
|
|
};
|
|
|
|
/* This is abp0-clk on sun4i/5i/7i / abp1-clk on sun6i/sun8i which is 24MHz */
|
|
#define CONFIG_SYS_TCLK 24000000
|
|
#define TWI_CONTROL_OFFSET 0x400
|
|
#define SUNXI_I2C_CONTROLLER 3
|
|
|
|
/* TWI Control Register Bit Fields & Masks, default value: 0x0000_0000*/
|
|
#define TWI_CTL_ACK (0x1<<2)
|
|
#define TWI_CTL_INTFLG (0x1<<3)
|
|
#define TWI_CTL_STP (0x1<<4)
|
|
#define TWI_CTL_STA (0x1<<5)
|
|
#define TWI_CTL_BUSEN (0x1<<6)
|
|
#define TWI_CTL_INTEN (0x1<<7)
|
|
#define TWI_LCR_WMASK (TWI_CTL_STA|TWI_CTL_STP|TWI_CTL_INTFLG)
|
|
|
|
|
|
struct sunxi_twi_reg {
|
|
volatile unsigned int addr; /* slave address */
|
|
volatile unsigned int xaddr; /* extend address */
|
|
volatile unsigned int data; /* data */
|
|
volatile unsigned int ctl; /* control */
|
|
volatile unsigned int status; /* status */
|
|
volatile unsigned int clk; /* clock */
|
|
volatile unsigned int srst; /* soft reset */
|
|
volatile unsigned int eft; /* enhanced future */
|
|
volatile unsigned int lcr; /* line control */
|
|
volatile unsigned int dvfs; /* dvfs control */
|
|
};
|
|
|
|
#ifdef I2C_DEBUG
|
|
#define i2c_info(fmt...) printf("[i2c][info]: " fmt)
|
|
#define i2c_err(fmt...) printf("[i2c][err]: " fmt)
|
|
#else
|
|
#define i2c_info(fmt...)
|
|
#define i2c_err(fmt...) printf("[i2c][err]: " fmt)
|
|
#endif
|
|
|
|
|
|
void i2c_init_cpus(int speed, int slaveaddr);
|
|
int i2c_read(u8 chip, uint addr, int alen, u8 *buffer, int len);
|
|
int i2c_write(u8 chip, uint addr, int alen, u8 *buffer, int len);
|
|
|
|
|
|
|
|
#endif
|