soc/marvell/armada38x: Add i2c driver for armada38x
Port i2c driver from uboot to coreboot BUG=chrome-os-partner:47462 TEST=emerge-cyclone coreboot BRANCH=tot Change-Id: I8ce2a965acaed68ad0f0518648490ec471c6810b Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: 4c2e9592662787ebed1d0aa8cafaa00fd12c2e9c Original-Change-Id: If791228edf29405fa4b2f959a21510bd7da9865b Original-Signed-off-by: Ruilin Hao <rlhao@marvell.com> Original-Reviewed-on: https://chromium-review.googlesource.com/313342 Original-Commit-Ready: Kan Yan <kyan@google.com> Original-Tested-by: Kan Yan <kyan@google.com> Original-Reviewed-by: Furquan Shaikh <furquan@chromium.org> Reviewed-on: https://review.coreboot.org/13113 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
This commit is contained in:
parent
c1b9e7934c
commit
de4defbaaf
|
@ -5,6 +5,7 @@ bootblock-y += bootblock_asm.S
|
|||
bootblock-y += spi.c
|
||||
bootblock-y += gpio.c
|
||||
bootblock-y += monotonic_timer.c
|
||||
bootblock-y += clock.c
|
||||
ifeq ($(CONFIG_BOOTBLOCK_CONSOLE),y)
|
||||
bootblock-$(CONFIG_DRIVERS_UART) += uart.c
|
||||
endif
|
||||
|
@ -13,12 +14,15 @@ verstage-$(CONFIG_DRIVERS_UART) += uart.c
|
|||
verstage-y += monotonic_timer.c
|
||||
verstage-y += spi.c
|
||||
verstage-y += gpio.c
|
||||
verstage-y += i2c.c
|
||||
verstage-y += clock.c
|
||||
|
||||
romstage-y += spi.c
|
||||
romstage-y += gpio.c
|
||||
romstage-y += cbmem.c
|
||||
romstage-y += monotonic_timer.c
|
||||
romstage-$(CONFIG_DRIVERS_UART) += uart.c
|
||||
romstage-y += clock.c
|
||||
|
||||
ramstage-y += spi.c
|
||||
ramstage-y += gpio.c
|
||||
|
@ -26,8 +30,9 @@ ramstage-y += cbmem.c
|
|||
ramstage-y += monotonic_timer.c
|
||||
ramstage-y += soc.c
|
||||
ramstage-$(CONFIG_DRIVERS_UART) += uart.c
|
||||
ramstage-y += clock.c
|
||||
|
||||
CPPFLAGS_common += -Isrc/soc/marvell/armada38x/include/
|
||||
CPPFLAGS_common += -Isrc/soc/marvell/armada38x/include/ -Isrc/commonlib/include/commonlib/
|
||||
|
||||
BIN_HDR = 3rdparty/blobs/cpu/marvell/armada38x/bin_hdr.bin
|
||||
DOIMAGE = 3rdparty/blobs/cpu/marvell/armada38x/doimage
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <soc/common.h>
|
||||
#include <soc/clock.h>
|
||||
|
||||
uint32_t mv_tclk_get(void)
|
||||
{
|
||||
uint32_t tclk_reg_value;
|
||||
uint32_t tclk;
|
||||
|
||||
tclk_reg_value = (mrvl_reg_read(MPP_SAMPLE_AT_RESET));
|
||||
tclk_reg_value = ((tclk_reg_value & (1 << 15)) >> 15);
|
||||
switch (tclk_reg_value) {
|
||||
case 0:
|
||||
tclk = MV_BOARD_TCLK_250MHZ;
|
||||
case 1:
|
||||
tclk = MV_BOARD_TCLK_200MHZ;
|
||||
default:
|
||||
tclk = MV_BOARD_TCLK_250MHZ;
|
||||
}
|
||||
return tclk;
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,21 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright 2015 Google Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __SOC_MARVELL_ARMADA38X_CLOCK_H_
|
||||
#define __SOC_MARVELL_ARMADA38X_CLOCK_H_
|
||||
|
||||
uint32_t mv_tclk_get(void);
|
||||
|
||||
#endif // __SOC_MARVELL_ARMADA38X_CLOCK_H_
|
|
@ -0,0 +1,120 @@
|
|||
/*
|
||||
* This file is part of the coreboot project.
|
||||
*
|
||||
* Copyright 2015 Marvell Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; version 2 of the License.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#ifndef __SOC_MARVELL_ARMADA38X_I2C_H_
|
||||
#define __SOC_MARVELL_ARMADA38X_I2C_H_
|
||||
|
||||
#include <types.h>
|
||||
|
||||
#define TWSI_SPEED 100000
|
||||
|
||||
#define MAX_I2C_NUM 2
|
||||
#define MAX_RETRY_CNT 1000
|
||||
#define TWSI_TIMEOUT_VALUE 0x500
|
||||
|
||||
#define MV_TWSI_SLAVE_REGS_OFFSET(chan_num) (0x11000 + (chan_num * 0x100))
|
||||
#define MV_TWSI_SLAVE_REGS_BASE(unit) (MV_TWSI_SLAVE_REGS_OFFSET(unit))
|
||||
#define TWSI_SLAVE_ADDR_REG(chan_num) (MV_TWSI_SLAVE_REGS_BASE(chan_num) + 0x00)
|
||||
|
||||
#define MV_CPUIF_REGS_OFFSET(cpu) (0x21800 + (cpu)*0x100)
|
||||
#define MV_CPUIF_REGS_BASE(cpu) (MV_CPUIF_REGS_OFFSET(cpu))
|
||||
#define CPU_MAIN_INT_CAUSE_REG(vec, cpu) \
|
||||
(MV_CPUIF_REGS_BASE(cpu) + 0x80 + (vec * 0x4))
|
||||
#define CPU_MAIN_INT_TWSI_OFFS(i) (2 + i)
|
||||
#define CPU_MAIN_INT_CAUSE_TWSI(i) (31 + i)
|
||||
#define TWSI_CPU_MAIN_INT_CAUSE_REG(cpu) CPU_MAIN_INT_CAUSE_REG(1, (cpu))
|
||||
#define MV_TWSI_CPU_MAIN_INT_CAUSE(ch_num, cpu) TWSI_CPU_MAIN_INT_CAUSE_REG(cpu)
|
||||
|
||||
#define MV_MBUS_REGS_OFFSET (0x20000)
|
||||
#define MV_CPUIF_SHARED_REGS_BASE (MV_MBUS_REGS_OFFSET)
|
||||
#define CPU_INT_SOURCE_CONTROL_REG(i) \
|
||||
(MV_CPUIF_SHARED_REGS_BASE + 0xB00 + (i * 0x4))
|
||||
|
||||
#define CPU_INT_SOURCE_CONTROL_IRQ_OFFS 28
|
||||
#define CPU_INT_SOURCE_CONTROL_IRQ_MASK (1 << CPU_INT_SOURCE_CONTROL_IRQ_OFFS)
|
||||
|
||||
#define TWSI_SLAVE_ADDR_GCE_ENA BIT(0)
|
||||
#define TWSI_SLAVE_ADDR_7_BIT_OFFS 0x1
|
||||
#define TWSI_SLAVE_ADDR_7_BIT_MASK (0xFF << TWSI_SLAVE_ADDR_7_BIT_OFFS)
|
||||
#define TWSI_SLAVE_ADDR_10_BIT_OFFS 0x7
|
||||
#define TWSI_SLAVE_ADDR_10_BIT_MASK 0x300
|
||||
#define TWSI_SLAVE_ADDR_10_BIT_CONST 0xF0
|
||||
|
||||
#define TWSI_DATA_REG(chan_num) (MV_TWSI_SLAVE_REGS_BASE(chan_num) + 0x04)
|
||||
#define TWSI_DATA_COMMAND_OFFS 0x0
|
||||
#define TWSI_DATA_COMMAND_MASK (0x1 << TWSI_DATA_COMMAND_OFFS)
|
||||
#define TWSI_DATA_COMMAND_WR (0x1 << TWSI_DATA_COMMAND_OFFS)
|
||||
#define TWSI_DATA_COMMAND_RD (0x0 << TWSI_DATA_COMMAND_OFFS)
|
||||
#define TWSI_DATA_ADDR_7_BIT_OFFS 0x1
|
||||
#define TWSI_DATA_ADDR_7_BIT_MASK (0xFF << TWSI_DATA_ADDR_7_BIT_OFFS)
|
||||
#define TWSI_DATA_ADDR_10_BIT_OFFS 0x7
|
||||
#define TWSI_DATA_ADDR_10_BIT_MASK 0x300
|
||||
#define TWSI_DATA_ADDR_10_BIT_CONST 0xF0
|
||||
|
||||
#define TWSI_CONTROL_REG(chan_num) (MV_TWSI_SLAVE_REGS_BASE(chan_num) + 0x08)
|
||||
#define TWSI_CONTROL_ACK BIT(2)
|
||||
#define TWSI_CONTROL_INT_FLAG_SET BIT(3)
|
||||
#define TWSI_CONTROL_STOP_BIT BIT(4)
|
||||
#define TWSI_CONTROL_START_BIT BIT(5)
|
||||
#define TWSI_CONTROL_ENA BIT(6)
|
||||
#define TWSI_CONTROL_INT_ENA BIT(7)
|
||||
|
||||
#define TWSI_STATUS_BAUDE_RATE_REG(chan_num) \
|
||||
(MV_TWSI_SLAVE_REGS_BASE(chan_num) + 0x0c)
|
||||
#define TWSI_BAUD_RATE_N_OFFS 0
|
||||
#define TWSI_BAUD_RATE_N_MASK (0x7 << TWSI_BAUD_RATE_N_OFFS)
|
||||
#define TWSI_BAUD_RATE_M_OFFS 3
|
||||
#define TWSI_BAUD_RATE_M_MASK (0xF << TWSI_BAUD_RATE_M_OFFS)
|
||||
|
||||
#define TWSI_EXTENDED_SLAVE_ADDR_REG(chan_num) \
|
||||
(MV_TWSI_SLAVE_REGS_BASE(chan_num) + 0x10)
|
||||
#define TWSI_EXTENDED_SLAVE_OFFS 0
|
||||
#define TWSI_EXTENDED_SLAVE_MASK (0xFF << TWSI_EXTENDED_SLAVE_OFFS)
|
||||
|
||||
#define TWSI_SOFT_RESET_REG(chan_num) (MV_TWSI_SLAVE_REGS_BASE(chan_num) + 0x1c)
|
||||
|
||||
#define TWSI_BUS_ERROR 0x00
|
||||
#define TWSI_START_CON_TRA 0x08
|
||||
#define TWSI_REPEATED_START_CON_TRA 0x10
|
||||
#define TWSI_AD_PLS_WR_BIT_TRA_ACK_REC 0x18
|
||||
#define TWSI_AD_PLS_WR_BIT_TRA_ACK_NOT_REC 0x20
|
||||
#define TWSI_M_TRAN_DATA_BYTE_ACK_REC 0x28
|
||||
#define TWSI_M_TRAN_DATA_BYTE_ACK_NOT_REC 0x30
|
||||
#define TWSI_M_LOST_ARB_DUR_AD_OR_DATA_TRA 0x38
|
||||
#define TWSI_AD_PLS_RD_BIT_TRA_ACK_REC 0x40
|
||||
#define TWSI_AD_PLS_RD_BIT_TRA_ACK_NOT_REC 0x48
|
||||
#define TWSI_M_REC_RD_DATA_ACK_TRA 0x50
|
||||
#define TWSI_M_REC_RD_DATA_ACK_NOT_TRA 0x58
|
||||
#define TWSI_SLA_REC_AD_PLS_WR_BIT_ACK_TRA 0x60
|
||||
#define TWSI_M_LOST_ARB_DUR_AD_TRA_AD_IS_TRGT_TO_SLA_ACK_TRA_W 0x68
|
||||
#define TWSI_GNL_CALL_REC_ACK_TRA 0x70
|
||||
#define TWSI_M_LOST_ARB_DUR_AD_TRA_GNL_CALL_AD_REC_ACK_TRA 0x78
|
||||
#define TWSI_SLA_REC_WR_DATA_AF_REC_SLA_AD_ACK_TRAN 0x80
|
||||
#define TWSI_SLA_REC_WR_DATA_AF_REC_SLA_AD_ACK_NOT_TRAN 0x88
|
||||
#define TWSI_SLA_REC_WR_DATA_AF_REC_GNL_CALL_ACK_TRAN 0x90
|
||||
#define TWSI_SLA_REC_WR_DATA_AF_REC_GNL_CALL_ACK_NOT_TRAN 0x98
|
||||
#define TWSI_SLA_REC_STOP_OR_REPEATED_STRT_CON 0xA0
|
||||
#define TWSI_SLA_REC_AD_PLS_RD_BIT_ACK_TRA 0xA8
|
||||
#define TWSI_M_LOST_ARB_DUR_AD_TRA_AD_IS_TRGT_TO_SLA_ACK_TRA_R 0xB0
|
||||
#define TWSI_SLA_TRA_RD_DATA_ACK_REC 0xB8
|
||||
#define TWSI_SLA_TRA_RD_DATA_ACK_NOT_REC 0xC0
|
||||
#define TWSI_SLA_TRA_LAST_RD_DATA_ACK_REC 0xC8
|
||||
#define TWSI_SEC_AD_PLS_WR_BIT_TRA_ACK_REC 0xD0
|
||||
#define TWSI_SEC_AD_PLS_WR_BIT_TRA_ACK_NOT_REC 0xD8
|
||||
#define TWSI_SEC_AD_PLS_RD_BIT_TRA_ACK_REC 0xE0
|
||||
#define TWSI_SEC_AD_PLS_RD_BIT_TRA_ACK_NOT_REC 0xE8
|
||||
#define TWSI_NO_REL_STS_INT_FLAG_IS_KEPT_0 0xF8
|
||||
|
||||
#endif // __SOC_MARVELL_ARMADA38X_I2C_H__
|
|
@ -21,6 +21,7 @@
|
|||
#include <assert.h>
|
||||
#include <console/console.h>
|
||||
#include <soc/common.h>
|
||||
#include <soc/clock.h>
|
||||
|
||||
/******************************************************************************
|
||||
base type define
|
||||
|
@ -352,7 +353,7 @@ int mv_spi_sys_init(unsigned char spi_id,
|
|||
MV_SPI_HAL_DATA hal_data;
|
||||
|
||||
hal_data.ctrl_model = MV_6810_DEV_ID;
|
||||
hal_data.tclk = MV_BOARD_TCLK_250MHZ;
|
||||
hal_data.tclk = mv_tclk_get();
|
||||
|
||||
return mv_spi_init(spi_id, cs_id, serial_baud_rate, &hal_data);
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <stdint.h>
|
||||
#include <assert.h>
|
||||
#include <soc/common.h>
|
||||
#include <soc/clock.h>
|
||||
|
||||
struct armada38x_uart {
|
||||
union {
|
||||
|
@ -94,7 +95,7 @@ static int armada38x_uart_tst_byte(struct armada38x_uart *uart_ptr)
|
|||
|
||||
unsigned int uart_platform_refclk(void)
|
||||
{
|
||||
return MV_BOARD_TCLK_250MHZ;
|
||||
return mv_tclk_get();
|
||||
}
|
||||
|
||||
uintptr_t uart_platform_base(int idx)
|
||||
|
|
Loading…
Reference in New Issue