diff --git a/drivers/allwinner/sunxi_i2c.c b/drivers/allwinner/sunxi_i2c.c deleted file mode 100644 index cc91ca5..0000000 --- a/drivers/allwinner/sunxi_i2c.c +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (C) 2018 Icenowy Zheng - * - * SPDX-License-Identifier: BSD-3-Clause - * https://spdx.org/licenses - */ - -/* This driver provides I2C support for Allwinner sunXi SoCs */ - -#include - -#define CONFIG_SYS_TCLK 24000000 -#define CONFIG_SYS_I2C_SPEED 100000 -#define CONFIG_SYS_I2C_SLAVE 0 - -#define I2C_INTERRUPT_CLEAR_INVERTED - -struct mentor_i2c_regs { - uint32_t slave_address; - uint32_t xtnd_slave_addr; - uint32_t data; - uint32_t control; - uint32_t status; - uint32_t baudrate; - uint32_t soft_reset; -}; - -#include "../mentor/i2c/mi2cv.c" diff --git a/drivers/marvell/i2c/a8k_i2c.c b/drivers/marvell/i2c/a8k_i2c.c deleted file mode 100644 index 1c0f922..0000000 --- a/drivers/marvell/i2c/a8k_i2c.c +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (C) 2018 Marvell International Ltd. - * - * SPDX-License-Identifier: BSD-3-Clause - * https://spdx.org/licenses - */ - -/* This driver provides I2C support for Marvell A8K and compatible SoCs */ - -#include - -#define CONFIG_SYS_TCLK 250000000 -#define CONFIG_SYS_I2C_SPEED 100000 -#define CONFIG_SYS_I2C_SLAVE 0x0 - -#define I2C_CAN_UNSTUCK - -struct mentor_i2c_regs { - uint32_t slave_address; - uint32_t data; - uint32_t control; - union { - uint32_t status; /* when reading */ - uint32_t baudrate; /* when writing */ - }; - uint32_t xtnd_slave_addr; - uint32_t reserved[2]; - uint32_t soft_reset; - uint8_t reserved2[0xa0 - 0x20]; - uint32_t unstuck; -}; - -#include "../../mentor/i2c/mi2cv.c" diff --git a/drivers/mentor/i2c/mi2cv.c b/drivers/mentor/i2c/mi2cv.c index 1b73e6f..8ebd966 100644 --- a/drivers/mentor/i2c/mi2cv.c +++ b/drivers/mentor/i2c/mi2cv.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #if LOG_LEVEL >= LOG_LEVEL_VERBOSE diff --git a/plat/allwinner/common/include/mentor_i2c_plat.h b/plat/allwinner/common/include/mentor_i2c_plat.h new file mode 100644 index 0000000..f547f9a --- /dev/null +++ b/plat/allwinner/common/include/mentor_i2c_plat.h @@ -0,0 +1,28 @@ +/* + * Copyright (C) 2018 Icenowy Zheng + * + * SPDX-License-Identifier: BSD-3-Clause + * https://spdx.org/licenses + */ +/* This driver provides I2C support for Allwinner sunXi SoCs */ + +#ifndef SUNXI_I2C_H +#define SUNXI_I2C_H + +#define CONFIG_SYS_TCLK 24000000 +#define CONFIG_SYS_I2C_SPEED 100000 +#define CONFIG_SYS_I2C_SLAVE 0 + +#define I2C_INTERRUPT_CLEAR_INVERTED + +struct mentor_i2c_regs { + uint32_t slave_address; + uint32_t xtnd_slave_addr; + uint32_t data; + uint32_t control; + uint32_t status; + uint32_t baudrate; + uint32_t soft_reset; +}; + +#endif diff --git a/plat/allwinner/sun50i_h6/platform.mk b/plat/allwinner/sun50i_h6/platform.mk index c3901d0..9098702 100644 --- a/plat/allwinner/sun50i_h6/platform.mk +++ b/plat/allwinner/sun50i_h6/platform.mk @@ -15,8 +15,8 @@ -I${AW_PLAT}/${PLAT}/include PLAT_BL_COMMON_SOURCES := drivers/console/${ARCH}/console.S \ + drivers/mentor/i2c/mi2cv.c \ drivers/ti/uart/${ARCH}/16550_console.S \ - ${AW_DRIVERS}/sunxi_i2c.c \ ${XLAT_TABLES_LIB_SRCS} \ ${AW_PLAT}/common/plat_helpers.S \ ${AW_PLAT}/common/sunxi_common.c diff --git a/plat/allwinner/sun50i_h6/sunxi_power.c b/plat/allwinner/sun50i_h6/sunxi_power.c index f109cce..12438b3 100644 --- a/plat/allwinner/sun50i_h6/sunxi_power.c +++ b/plat/allwinner/sun50i_h6/sunxi_power.c @@ -28,13 +28,8 @@ { uint32_t reg; - /* get currently configured function for pins PL0 and PL1 */ - reg = mmio_read_32(SUNXI_R_PIO_BASE + 0x00); - if ((reg & 0xff) == 0x33) { - NOTICE("PMIC: already configured for TWI\n"); - } - /* switch pins PL0 and PL1 to I2C */ + reg = mmio_read_32(SUNXI_R_PIO_BASE + 0x00); mmio_write_32(SUNXI_R_PIO_BASE + 0x00, (reg & ~0xff) | 0x33); /* level 2 drive strength */ @@ -47,13 +42,11 @@ /* assert & de-assert reset of R_I2C */ reg = mmio_read_32(SUNXI_R_PRCM_BASE + 0x19c); - mmio_write_32(SUNXI_R_PRCM_BASE + 0x19c, 0); - reg = mmio_read_32(SUNXI_R_PRCM_BASE + 0x19c); - mmio_write_32(SUNXI_R_PRCM_BASE + 0x19c, reg | 0x00010000); + mmio_write_32(SUNXI_R_PRCM_BASE + 0x19c, reg & ~BIT(16)); + mmio_write_32(SUNXI_R_PRCM_BASE + 0x19c, reg | BIT(16)); /* un-gate R_I2C clock */ - reg = mmio_read_32(SUNXI_R_PRCM_BASE + 0x19c); - mmio_write_32(SUNXI_R_PRCM_BASE + 0x19c, reg | 0x00000001); + mmio_write_32(SUNXI_R_PRCM_BASE + 0x19c, reg | BIT(16) | BIT(0)); /* call mi2cv driver */ i2c_init((void *)SUNXI_R_I2C_BASE); @@ -127,10 +120,9 @@ switch (pmic) { case AXP805: - val = 0x26; /* Default value for REG 32H */ + sunxi_init_r_i2c(); axp_i2c_read(AXP805_ADDR, 0x32, &val); - val |= 0x80; - axp_i2c_write(AXP805_ADDR, 0x32, val); + axp_i2c_write(AXP805_ADDR, 0x32, val | 0x80); break; default: break; diff --git a/plat/marvell/a8k/common/a8k_common.mk b/plat/marvell/a8k/common/a8k_common.mk index 5956737..be2ff1e 100644 --- a/plat/marvell/a8k/common/a8k_common.mk +++ b/plat/marvell/a8k/common/a8k_common.mk @@ -57,9 +57,9 @@ MARVELL_MOCHI_DRV += $(MARVELL_DRV_BASE)/mochi/cp110_setup.c -BLE_SOURCES := $(PLAT_COMMON_BASE)/plat_ble_setup.c \ +BLE_SOURCES := drivers/mentor/i2c/mi2cv.c \ + $(PLAT_COMMON_BASE)/plat_ble_setup.c \ $(MARVELL_MOCHI_DRV) \ - $(MARVELL_DRV_BASE)/i2c/a8k_i2c.c \ $(PLAT_COMMON_BASE)/plat_pm.c \ $(MARVELL_DRV_BASE)/thermal.c \ $(PLAT_COMMON_BASE)/plat_thermal.c \ diff --git a/plat/marvell/a8k/common/include/mentor_i2c_plat.h b/plat/marvell/a8k/common/include/mentor_i2c_plat.h new file mode 100644 index 0000000..8829a92 --- /dev/null +++ b/plat/marvell/a8k/common/include/mentor_i2c_plat.h @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2018 Marvell International Ltd. + * + * SPDX-License-Identifier: BSD-3-Clause + * https://spdx.org/licenses + */ +/* This driver provides I2C support for Marvell A8K and compatible SoCs */ + +#ifndef A8K_I2C_H +#define A8K_I2C_H + +#define CONFIG_SYS_TCLK 250000000 +#define CONFIG_SYS_I2C_SPEED 100000 +#define CONFIG_SYS_I2C_SLAVE 0x0 + +#define I2C_CAN_UNSTUCK + +struct mentor_i2c_regs { + uint32_t slave_address; + uint32_t data; + uint32_t control; + union { + uint32_t status; /* when reading */ + uint32_t baudrate; /* when writing */ + }; + uint32_t xtnd_slave_addr; + uint32_t reserved[2]; + uint32_t soft_reset; + uint8_t reserved2[0xa0 - 0x20]; + uint32_t unstuck; +}; + +#endif