2014-04-09 03:45:46 +02:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2012 The Linux Foundation. All rights reserved.
|
|
|
|
* Source : APQ8064 LK boot
|
|
|
|
*
|
|
|
|
* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
|
|
|
|
*
|
|
|
|
* Redistribution and use in source and binary forms, with or without
|
|
|
|
* modification, are permitted provided that the following conditions
|
|
|
|
* are met:
|
|
|
|
* * Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* * Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in
|
|
|
|
* the documentation and/or other materials provided with the
|
|
|
|
* distribution.
|
|
|
|
* * Neither the name of Google, Inc. nor the names of its contributors
|
|
|
|
* may be used to endorse or promote products derived from this
|
|
|
|
* software without specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
|
|
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
|
|
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
|
|
|
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
|
|
|
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
|
|
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
|
|
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
|
|
|
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
|
|
|
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
|
|
|
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
|
|
|
|
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*/
|
|
|
|
|
2014-04-23 23:00:59 +02:00
|
|
|
#include <arch/io.h>
|
|
|
|
#include <boot/coreboot_tables.h>
|
|
|
|
#include <console/console.h>
|
|
|
|
#include <console/uart.h>
|
2014-10-20 22:20:49 +02:00
|
|
|
#include <delay.h>
|
gpio: Extend common GPIO header, simplify function names
We've had gpiolib.h which defines a few common GPIO access functions for
a while, but it wasn't really complete. This patch adds the missing
gpio_output() function, and also renames the unwieldy
gpio_get_in_value() and gpio_set_out_value() to the much easier to
handle gpio_get() and gpio_set(). The header is renamed to the simpler
gpio.h while we're at it (there was never really anything "lib" about
it, and it was presumably just chosen due to the IPQ806x include/
conflict problem that is now resolved).
It also moves the definition of gpio_t into SoC-specific code, so that
different implementations are free to encode their platform-specific
GPIO parameters in those 4 bytes in the most convenient way (such as the
rk3288 with a bitfield struct). Every SoC intending to use this common
API should supply a <soc/gpio.h> that typedefs gpio_t to a type at most
4 bytes in length. Files accessing the API only need to include <gpio.h>
which may pull in additional things (like a gpio_t creation macro) from
<soc/gpio.h> on its own.
For now the API is still only used on non-x86 SoCs. Whether it makes
sense to expand it to x86 as well should be separately evaluated at a
later point (by someone who understands those systems better). Also,
Exynos retains its old, incompatible GPIO API even though it would be a
prime candidate, because it's currently just not worth the effort.
BUG=None
TEST=Compiled on Daisy, Peach_Pit, Nyan_Blaze, Rush_Ryu, Storm and
Veyron_Pinky.
Change-Id: Ieee77373c2bd13d07ece26fa7f8b08be324842fe
Signed-off-by: Patrick Georgi <pgeorgi@chromium.org>
Original-Commit-Id: 9e04902ada56b929e3829f2c3b4aeb618682096e
Original-Change-Id: I6c1e7d1e154d9b02288aabedb397e21e1aadfa15
Original-Signed-off-by: Julius Werner <jwerner@chromium.org>
Original-Reviewed-on: https://chromium-review.googlesource.com/220975
Original-Reviewed-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: http://review.coreboot.org/9400
Tested-by: build bot (Jenkins)
Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
2014-09-25 00:40:49 +02:00
|
|
|
#include <gpio.h>
|
2014-10-20 22:20:49 +02:00
|
|
|
#include <soc/clock.h>
|
|
|
|
#include <soc/gsbi.h>
|
|
|
|
#include <soc/ipq_uart.h>
|
2014-04-23 23:00:59 +02:00
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdlib.h>
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
#define FIFO_DATA_SIZE 4
|
|
|
|
|
2014-04-23 23:00:59 +02:00
|
|
|
typedef struct {
|
|
|
|
unsigned uart_dm_base;
|
|
|
|
unsigned uart_gsbi_base;
|
|
|
|
unsigned uart_gsbi;
|
|
|
|
uart_clk_mnd_t mnd_value;
|
|
|
|
gpio_func_data_t dbg_uart_gpio[NO_OF_DBG_UART_GPIOS];
|
|
|
|
} uart_params_t;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* All constants lifted from u-boot's
|
|
|
|
* board/qcom/ipq806x_cdp/ipq806x_board_param.h
|
|
|
|
*/
|
|
|
|
static const uart_params_t uart_board_param = {
|
|
|
|
.uart_dm_base = UART4_DM_BASE,
|
|
|
|
.uart_gsbi_base = UART_GSBI4_BASE,
|
|
|
|
.uart_gsbi = GSBI_4,
|
|
|
|
.mnd_value = { 12, 625, 313 },
|
|
|
|
.dbg_uart_gpio = {
|
|
|
|
{
|
|
|
|
.gpio = 10,
|
|
|
|
.func = 1,
|
|
|
|
.dir = GPIO_OUTPUT,
|
|
|
|
.pull = GPIO_NO_PULL,
|
|
|
|
.drvstr = GPIO_12MA,
|
|
|
|
.enable = GPIO_DISABLE
|
|
|
|
},
|
|
|
|
{
|
|
|
|
.gpio = 11,
|
|
|
|
.func = 1,
|
|
|
|
.dir = GPIO_INPUT,
|
|
|
|
.pull = GPIO_NO_PULL,
|
|
|
|
.drvstr = GPIO_12MA,
|
|
|
|
.enable = GPIO_DISABLE
|
|
|
|
},
|
|
|
|
}
|
|
|
|
};
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
static unsigned int msm_boot_uart_dm_init(unsigned int uart_dm_base);
|
|
|
|
|
|
|
|
/* Received data is valid or not */
|
|
|
|
static int valid_data = 0;
|
|
|
|
|
|
|
|
/* Received data */
|
|
|
|
static unsigned int word = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* msm_boot_uart_dm_init_rx_transfer - Init Rx transfer
|
|
|
|
* @uart_dm_base: UART controller base address
|
|
|
|
*/
|
|
|
|
static unsigned int msm_boot_uart_dm_init_rx_transfer(unsigned int uart_dm_base)
|
|
|
|
{
|
|
|
|
/* Reset receiver */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_CMD_RESET_RX,
|
2014-04-09 03:45:46 +02:00
|
|
|
MSM_BOOT_UART_DM_CR(uart_dm_base));
|
|
|
|
|
|
|
|
/* Enable receiver */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_CR_RX_ENABLE,
|
2014-04-09 03:45:46 +02:00
|
|
|
MSM_BOOT_UART_DM_CR(uart_dm_base));
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_DMRX_DEF_VALUE,
|
2014-04-09 03:45:46 +02:00
|
|
|
MSM_BOOT_UART_DM_DMRX(uart_dm_base));
|
|
|
|
|
|
|
|
/* Clear stale event */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_CMD_RES_STALE_INT,
|
2014-04-09 03:45:46 +02:00
|
|
|
MSM_BOOT_UART_DM_CR(uart_dm_base));
|
|
|
|
|
|
|
|
/* Enable stale event */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_GCMD_ENA_STALE_EVT,
|
2014-04-09 03:45:46 +02:00
|
|
|
MSM_BOOT_UART_DM_CR(uart_dm_base));
|
|
|
|
|
|
|
|
return MSM_BOOT_UART_DM_E_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* msm_boot_uart_dm_read - reads a word from the RX FIFO.
|
|
|
|
* @data: location where the read data is stored
|
|
|
|
* @count: no of valid data in the FIFO
|
|
|
|
* @wait: indicates blocking call or not blocking call
|
|
|
|
*
|
|
|
|
* Reads a word from the RX FIFO. If no data is available blocks if
|
|
|
|
* @wait is true, else returns %MSM_BOOT_UART_DM_E_RX_NOT_READY.
|
|
|
|
*/
|
2014-04-23 23:00:59 +02:00
|
|
|
#if 0 /* Not used yet */
|
2014-04-09 03:45:46 +02:00
|
|
|
static unsigned int
|
|
|
|
msm_boot_uart_dm_read(unsigned int *data, int *count, int wait)
|
|
|
|
{
|
|
|
|
static int total_rx_data = 0;
|
|
|
|
static int rx_data_read = 0;
|
|
|
|
unsigned int base = 0;
|
|
|
|
uint32_t status_reg;
|
|
|
|
|
2014-04-23 23:00:59 +02:00
|
|
|
base = uart_board_param.uart_dm_base;
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
if (data == NULL)
|
|
|
|
return MSM_BOOT_UART_DM_E_INVAL;
|
|
|
|
|
2014-04-23 23:00:59 +02:00
|
|
|
status_reg = readl_i(MSM_BOOT_UART_DM_MISR(base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* Check for DM_RXSTALE for RX transfer to finish */
|
|
|
|
while (!(status_reg & MSM_BOOT_UART_DM_RXSTALE)) {
|
2014-04-23 23:00:59 +02:00
|
|
|
status_reg = readl_i(MSM_BOOT_UART_DM_MISR(base));
|
2014-04-09 03:45:46 +02:00
|
|
|
if (!wait)
|
|
|
|
return MSM_BOOT_UART_DM_E_RX_NOT_READY;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Check for Overrun error. We'll just reset Error Status */
|
2014-04-23 23:00:59 +02:00
|
|
|
if (readl_i(MSM_BOOT_UART_DM_SR(base)) &
|
2014-04-09 03:45:46 +02:00
|
|
|
MSM_BOOT_UART_DM_SR_UART_OVERRUN) {
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_CMD_RESET_ERR_STAT,
|
2014-04-09 03:45:46 +02:00
|
|
|
MSM_BOOT_UART_DM_CR(base));
|
|
|
|
total_rx_data = rx_data_read = 0;
|
|
|
|
msm_boot_uart_dm_init(base);
|
|
|
|
return MSM_BOOT_UART_DM_E_RX_NOT_READY;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* Read UART_DM_RX_TOTAL_SNAP for actual number of bytes received */
|
|
|
|
if (total_rx_data == 0)
|
2014-04-23 23:00:59 +02:00
|
|
|
total_rx_data = readl_i(MSM_BOOT_UART_DM_RX_TOTAL_SNAP(base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* Data available in FIFO; read a word. */
|
2014-04-23 23:00:59 +02:00
|
|
|
*data = readl_i(MSM_BOOT_UART_DM_RF(base, 0));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* WAR for http://prism/CR/548280 */
|
|
|
|
if (*data == 0) {
|
|
|
|
return MSM_BOOT_UART_DM_E_RX_NOT_READY;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* increment the total count of chars we've read so far */
|
|
|
|
rx_data_read += FIFO_DATA_SIZE;
|
|
|
|
|
|
|
|
/* actual count of valid data in word */
|
|
|
|
*count = ((total_rx_data < rx_data_read) ?
|
|
|
|
(FIFO_DATA_SIZE - (rx_data_read - total_rx_data)) :
|
|
|
|
FIFO_DATA_SIZE);
|
|
|
|
|
|
|
|
/* If there are still data left in FIFO we'll read them before
|
|
|
|
* initializing RX Transfer again
|
|
|
|
*/
|
|
|
|
if (rx_data_read < total_rx_data)
|
|
|
|
return MSM_BOOT_UART_DM_E_SUCCESS;
|
|
|
|
|
|
|
|
msm_boot_uart_dm_init_rx_transfer(base);
|
|
|
|
total_rx_data = rx_data_read = 0;
|
|
|
|
|
|
|
|
return MSM_BOOT_UART_DM_E_SUCCESS;
|
|
|
|
}
|
2014-04-23 23:00:59 +02:00
|
|
|
#endif
|
2014-04-09 03:45:46 +02:00
|
|
|
|
2014-05-28 03:03:38 +02:00
|
|
|
void uart_tx_byte(int idx, unsigned char data)
|
2014-04-09 03:45:46 +02:00
|
|
|
{
|
2014-04-23 23:00:59 +02:00
|
|
|
unsigned int base = uart_board_param.uart_dm_base;
|
2014-04-09 03:45:46 +02:00
|
|
|
|
2014-05-28 03:03:38 +02:00
|
|
|
/* Wait until transmit FIFO is empty. */
|
|
|
|
while (!(readl_i(MSM_BOOT_UART_DM_SR(base)) &
|
|
|
|
MSM_BOOT_UART_DM_SR_TXEMT))
|
|
|
|
udelay(1);
|
2014-04-09 03:45:46 +02:00
|
|
|
|
2014-05-28 03:03:38 +02:00
|
|
|
/*
|
|
|
|
* TX FIFO is ready to accept new character(s). First write number of
|
|
|
|
* characters to be transmitted.
|
|
|
|
*/
|
|
|
|
writel_i(1, MSM_BOOT_UART_DM_NO_CHARS_FOR_TX(base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
2014-05-28 03:03:38 +02:00
|
|
|
/* And now write the character(s) */
|
|
|
|
writel_i(data, MSM_BOOT_UART_DM_TF(base, 0));
|
2014-04-09 03:45:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* msm_boot_uart_dm_reset - resets UART controller
|
|
|
|
* @base: UART controller base address
|
|
|
|
*/
|
|
|
|
static unsigned int msm_boot_uart_dm_reset(unsigned int base)
|
|
|
|
{
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_CMD_RESET_RX, MSM_BOOT_UART_DM_CR(base));
|
|
|
|
writel_i(MSM_BOOT_UART_DM_CMD_RESET_TX, MSM_BOOT_UART_DM_CR(base));
|
|
|
|
writel_i(MSM_BOOT_UART_DM_CMD_RESET_ERR_STAT,
|
|
|
|
MSM_BOOT_UART_DM_CR(base));
|
|
|
|
writel_i(MSM_BOOT_UART_DM_CMD_RES_TX_ERR, MSM_BOOT_UART_DM_CR(base));
|
|
|
|
writel_i(MSM_BOOT_UART_DM_CMD_RES_STALE_INT, MSM_BOOT_UART_DM_CR(base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
return MSM_BOOT_UART_DM_E_SUCCESS;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* msm_boot_uart_dm_init - initilaizes UART controller
|
|
|
|
* @uart_dm_base: UART controller base address
|
|
|
|
*/
|
|
|
|
static unsigned int msm_boot_uart_dm_init(unsigned int uart_dm_base)
|
|
|
|
{
|
|
|
|
/* Configure UART mode registers MR1 and MR2 */
|
|
|
|
/* Hardware flow control isn't supported */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(0x0, MSM_BOOT_UART_DM_MR1(uart_dm_base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* 8-N-1 configuration: 8 data bits - No parity - 1 stop bit */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_8_N_1_MODE,
|
|
|
|
MSM_BOOT_UART_DM_MR2(uart_dm_base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* Configure Interrupt Mask register IMR */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_IMR_ENABLED,
|
|
|
|
MSM_BOOT_UART_DM_IMR(uart_dm_base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Configure Tx and Rx watermarks configuration registers
|
|
|
|
* TX watermark value is set to 0 - interrupt is generated when
|
|
|
|
* FIFO level is less than or equal to 0
|
|
|
|
*/
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_TFW_VALUE,
|
|
|
|
MSM_BOOT_UART_DM_TFWR(uart_dm_base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* RX watermark value */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_RFW_VALUE,
|
|
|
|
MSM_BOOT_UART_DM_RFWR(uart_dm_base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* Configure Interrupt Programming Register */
|
|
|
|
/* Set initial Stale timeout value */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_STALE_TIMEOUT_LSB,
|
2014-04-09 03:45:46 +02:00
|
|
|
MSM_BOOT_UART_DM_IPR(uart_dm_base));
|
|
|
|
|
|
|
|
/* Configure IRDA if required */
|
|
|
|
/* Disabling IRDA mode */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(0x0, MSM_BOOT_UART_DM_IRDA(uart_dm_base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* Configure hunt character value in HCR register */
|
|
|
|
/* Keep it in reset state */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(0x0, MSM_BOOT_UART_DM_HCR(uart_dm_base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/*
|
|
|
|
* Configure Rx FIFO base address
|
|
|
|
* Both TX/RX shares same SRAM and default is half-n-half.
|
|
|
|
* Sticking with default value now.
|
|
|
|
* As such RAM size is (2^RAM_ADDR_WIDTH, 32-bit entries).
|
|
|
|
* We have found RAM_ADDR_WIDTH = 0x7f
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* Issue soft reset command */
|
|
|
|
msm_boot_uart_dm_reset(uart_dm_base);
|
|
|
|
|
|
|
|
/* Enable/Disable Rx/Tx DM interfaces */
|
|
|
|
/* Data Mover not currently utilized. */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(0x0, MSM_BOOT_UART_DM_DMEN(uart_dm_base));
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* Enable transmitter */
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(MSM_BOOT_UART_DM_CR_TX_ENABLE,
|
2014-04-09 03:45:46 +02:00
|
|
|
MSM_BOOT_UART_DM_CR(uart_dm_base));
|
|
|
|
|
|
|
|
/* Initialize Receive Path */
|
|
|
|
msm_boot_uart_dm_init_rx_transfer(uart_dm_base);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2014-04-23 23:00:59 +02:00
|
|
|
* uart_init - initializes UART
|
2014-04-09 03:45:46 +02:00
|
|
|
*
|
|
|
|
* Initializes clocks, GPIO and UART controller.
|
|
|
|
*/
|
2014-04-23 23:00:59 +02:00
|
|
|
void uart_init(int idx)
|
2014-04-09 03:45:46 +02:00
|
|
|
{
|
2014-04-23 23:00:59 +02:00
|
|
|
/* Note int idx isn't used in this driver. */
|
2014-04-09 03:45:46 +02:00
|
|
|
unsigned int dm_base, gsbi_base;
|
|
|
|
|
2014-04-23 23:00:59 +02:00
|
|
|
dm_base = uart_board_param.uart_dm_base;
|
|
|
|
gsbi_base = uart_board_param.uart_gsbi_base;
|
|
|
|
ipq_configure_gpio(uart_board_param.dbg_uart_gpio,
|
|
|
|
NO_OF_DBG_UART_GPIOS);
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/* Configure the uart clock */
|
2014-04-23 23:00:59 +02:00
|
|
|
uart_clock_config(uart_board_param.uart_gsbi,
|
|
|
|
uart_board_param.mnd_value.m_value,
|
|
|
|
uart_board_param.mnd_value.n_value,
|
|
|
|
uart_board_param.mnd_value.d_value,
|
|
|
|
0);
|
2014-04-09 03:45:46 +02:00
|
|
|
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(GSBI_PROTOCOL_CODE_I2C_UART <<
|
2014-04-09 03:45:46 +02:00
|
|
|
GSBI_CTRL_REG_PROTOCOL_CODE_S,
|
|
|
|
GSBI_CTRL_REG(gsbi_base));
|
2014-04-23 23:00:59 +02:00
|
|
|
writel_i(UART_DM_CLK_RX_TX_BIT_RATE, MSM_BOOT_UART_DM_CSR(dm_base));
|
|
|
|
|
2014-04-09 03:45:46 +02:00
|
|
|
/* Intialize UART_DM */
|
|
|
|
msm_boot_uart_dm_init(dm_base);
|
2014-04-23 23:00:59 +02:00
|
|
|
}
|
2014-04-09 03:45:46 +02:00
|
|
|
|
2014-04-23 23:00:59 +02:00
|
|
|
#if 0 /* Not used yet */
|
|
|
|
uint32_t uartmem_getbaseaddr(void)
|
|
|
|
{
|
|
|
|
return uart_board_param.uart_dm_base;
|
2014-04-09 03:45:46 +02:00
|
|
|
}
|
2014-04-23 23:00:59 +02:00
|
|
|
#endif
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/**
|
2014-04-23 23:00:59 +02:00
|
|
|
* uart_tx_flush - transmits a string of data
|
2014-04-09 03:45:46 +02:00
|
|
|
* @s: string to transmit
|
|
|
|
*/
|
2014-04-23 23:00:59 +02:00
|
|
|
void uart_tx_flush(int idx)
|
2014-04-09 03:45:46 +02:00
|
|
|
{
|
2014-04-23 23:00:59 +02:00
|
|
|
unsigned int base = uart_board_param.uart_dm_base;
|
|
|
|
|
|
|
|
while (!(readl_i(MSM_BOOT_UART_DM_SR(base)) &
|
|
|
|
MSM_BOOT_UART_DM_SR_TXEMT))
|
|
|
|
;
|
2014-04-09 03:45:46 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2014-04-23 23:00:59 +02:00
|
|
|
* uart_can_rx_byte - checks if data available for reading
|
2014-04-09 03:45:46 +02:00
|
|
|
*
|
|
|
|
* Returns 1 if data available, 0 otherwise
|
|
|
|
*/
|
2014-04-23 23:00:59 +02:00
|
|
|
#if 0 /* Not used yet */
|
|
|
|
int uart_can_rx_byte(void)
|
2014-04-09 03:45:46 +02:00
|
|
|
{
|
|
|
|
/* Return if data is already read */
|
|
|
|
if (valid_data)
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
/* Read data from the FIFO */
|
2014-04-23 23:00:59 +02:00
|
|
|
if (msm_boot_uart_dm_read(&word, &valid_data, 0) !=
|
|
|
|
MSM_BOOT_UART_DM_E_SUCCESS)
|
2014-04-09 03:45:46 +02:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
2014-04-23 23:00:59 +02:00
|
|
|
#endif
|
2014-04-09 03:45:46 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* ipq806x_serial_getc - reads a character
|
|
|
|
*
|
|
|
|
* Returns the character read from serial port.
|
|
|
|
*/
|
2014-04-23 23:00:59 +02:00
|
|
|
uint8_t uart_rx_byte(int idx)
|
2014-04-09 03:45:46 +02:00
|
|
|
{
|
2014-04-23 23:00:59 +02:00
|
|
|
uint8_t byte;
|
2014-04-09 03:45:46 +02:00
|
|
|
|
2014-04-23 23:00:59 +02:00
|
|
|
#if 0 /* Not used yet */
|
|
|
|
while (!uart_can_rx_byte()) {
|
2014-04-09 03:45:46 +02:00
|
|
|
/* wait for incoming data */
|
|
|
|
}
|
2014-04-23 23:00:59 +02:00
|
|
|
#endif
|
|
|
|
byte = (uint8_t)(word & 0xff);
|
2014-04-09 03:45:46 +02:00
|
|
|
word = word >> 8;
|
|
|
|
valid_data--;
|
|
|
|
|
|
|
|
return byte;
|
|
|
|
}
|
2014-04-23 23:00:59 +02:00
|
|
|
#ifndef __PRE_RAM__
|
|
|
|
/* TODO: Implement fuction */
|
|
|
|
void uart_fill_lb(void *data)
|
2014-04-09 03:45:46 +02:00
|
|
|
{
|
|
|
|
}
|
2014-04-23 23:00:59 +02:00
|
|
|
#endif
|