blob: c9ef77014c9507a623c930b1e209c0d9d914c360 [file] [log] [blame]
Vadim Bendebury476f7312014-04-08 18:45:46 -07001/*
2 * Copyright (c) 2012 The Linux Foundation. All rights reserved.
3 * Source : APQ8064 LK boot
4 *
5 * Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * * Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * * Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in
14 * the documentation and/or other materials provided with the
15 * distribution.
16 * * Neither the name of Google, Inc. nor the names of its contributors
17 * may be used to endorse or promote products derived from this
18 * software without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
24 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
26 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
27 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 */
33
Vadim Bendeburyf17680b2014-04-23 14:00:59 -070034#include <arch/io.h>
35#include <boot/coreboot_tables.h>
36#include <console/console.h>
Vadim Bendeburyf17680b2014-04-23 14:00:59 -070037#include <console/uart.h>
Julius Werner73d1ed62014-10-20 13:20:49 -070038#include <delay.h>
Julius Wernereaa9c452014-09-24 15:40:49 -070039#include <gpio.h>
Julius Werner73d1ed62014-10-20 13:20:49 -070040#include <soc/clock.h>
Julius Werner73d1ed62014-10-20 13:20:49 -070041#include <soc/gsbi.h>
42#include <soc/ipq_uart.h>
Vadim Bendeburyf17680b2014-04-23 14:00:59 -070043#include <stdint.h>
44#include <stdlib.h>
Vadim Bendebury476f7312014-04-08 18:45:46 -070045
46#define FIFO_DATA_SIZE 4
47
Vadim Bendeburyf17680b2014-04-23 14:00:59 -070048typedef struct {
Vadim Bendeburyb67b7152015-01-13 12:46:57 -080049 void *uart_dm_base;
50 void *uart_gsbi_base;
Vadim Bendeburyf17680b2014-04-23 14:00:59 -070051 unsigned uart_gsbi;
52 uart_clk_mnd_t mnd_value;
53 gpio_func_data_t dbg_uart_gpio[NO_OF_DBG_UART_GPIOS];
54} uart_params_t;
55
56/*
57 * All constants lifted from u-boot's
58 * board/qcom/ipq806x_cdp/ipq806x_board_param.h
59 */
60static const uart_params_t uart_board_param = {
Vadim Bendeburyb67b7152015-01-13 12:46:57 -080061 .uart_dm_base = (void *)UART4_DM_BASE,
62 .uart_gsbi_base = (void *)UART_GSBI4_BASE,
Vadim Bendeburyf17680b2014-04-23 14:00:59 -070063 .uart_gsbi = GSBI_4,
64 .mnd_value = { 12, 625, 313 },
Vadim Bendeburyb67b7152015-01-13 12:46:57 -080065 .dbg_uart_gpio = {
66 {
67 .gpio = 10,
68 .func = 1,
69 .dir = GPIO_OUTPUT,
70 .pull = GPIO_NO_PULL,
71 .drvstr = GPIO_12MA,
72 .enable = GPIO_DISABLE
73 },
74 {
75 .gpio = 11,
76 .func = 1,
77 .dir = GPIO_INPUT,
78 .pull = GPIO_NO_PULL,
79 .drvstr = GPIO_12MA,
80 .enable = GPIO_DISABLE
81 },
82 }
Vadim Bendeburyf17680b2014-04-23 14:00:59 -070083};
Vadim Bendebury476f7312014-04-08 18:45:46 -070084
Vadim Bendebury476f7312014-04-08 18:45:46 -070085/**
86 * msm_boot_uart_dm_init_rx_transfer - Init Rx transfer
87 * @uart_dm_base: UART controller base address
88 */
Vadim Bendeburyb67b7152015-01-13 12:46:57 -080089static unsigned int msm_boot_uart_dm_init_rx_transfer(void *uart_dm_base)
Vadim Bendebury476f7312014-04-08 18:45:46 -070090{
91 /* Reset receiver */
Julius Werner2f37bd62015-02-19 14:51:15 -080092 write32(MSM_BOOT_UART_DM_CR(uart_dm_base),
93 MSM_BOOT_UART_DM_CMD_RESET_RX);
Vadim Bendebury476f7312014-04-08 18:45:46 -070094
95 /* Enable receiver */
Julius Werner2f37bd62015-02-19 14:51:15 -080096 write32(MSM_BOOT_UART_DM_CR(uart_dm_base),
97 MSM_BOOT_UART_DM_CR_RX_ENABLE);
98 write32(MSM_BOOT_UART_DM_DMRX(uart_dm_base),
99 MSM_BOOT_UART_DM_DMRX_DEF_VALUE);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700100
101 /* Clear stale event */
Julius Werner2f37bd62015-02-19 14:51:15 -0800102 write32(MSM_BOOT_UART_DM_CR(uart_dm_base),
103 MSM_BOOT_UART_DM_CMD_RES_STALE_INT);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700104
105 /* Enable stale event */
Julius Werner2f37bd62015-02-19 14:51:15 -0800106 write32(MSM_BOOT_UART_DM_CR(uart_dm_base),
107 MSM_BOOT_UART_DM_GCMD_ENA_STALE_EVT);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700108
109 return MSM_BOOT_UART_DM_E_SUCCESS;
110}
111
Vadim Bendebury7c256402015-01-13 13:07:48 -0800112#if IS_ENABLED(CONFIG_DRIVERS_UART)
113static unsigned int msm_boot_uart_dm_init(void *uart_dm_base);
114
115/* Received data is valid or not */
116static int valid_data = 0;
117
118/* Received data */
119static unsigned int word = 0;
120
Vadim Bendebury476f7312014-04-08 18:45:46 -0700121/**
122 * msm_boot_uart_dm_read - reads a word from the RX FIFO.
123 * @data: location where the read data is stored
124 * @count: no of valid data in the FIFO
125 * @wait: indicates blocking call or not blocking call
126 *
127 * Reads a word from the RX FIFO. If no data is available blocks if
128 * @wait is true, else returns %MSM_BOOT_UART_DM_E_RX_NOT_READY.
129 */
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700130 #if 0 /* Not used yet */
Vadim Bendebury476f7312014-04-08 18:45:46 -0700131static unsigned int
132msm_boot_uart_dm_read(unsigned int *data, int *count, int wait)
133{
134 static int total_rx_data = 0;
135 static int rx_data_read = 0;
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800136 void *base;
Vadim Bendebury476f7312014-04-08 18:45:46 -0700137 uint32_t status_reg;
138
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700139 base = uart_board_param.uart_dm_base;
Vadim Bendebury476f7312014-04-08 18:45:46 -0700140
141 if (data == NULL)
142 return MSM_BOOT_UART_DM_E_INVAL;
143
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800144 status_reg = readl(MSM_BOOT_UART_DM_MISR(base));
Vadim Bendebury476f7312014-04-08 18:45:46 -0700145
146 /* Check for DM_RXSTALE for RX transfer to finish */
147 while (!(status_reg & MSM_BOOT_UART_DM_RXSTALE)) {
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800148 status_reg = readl(MSM_BOOT_UART_DM_MISR(base));
Vadim Bendebury476f7312014-04-08 18:45:46 -0700149 if (!wait)
150 return MSM_BOOT_UART_DM_E_RX_NOT_READY;
151 }
152
153 /* Check for Overrun error. We'll just reset Error Status */
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800154 if (readl(MSM_BOOT_UART_DM_SR(base)) &
Vadim Bendebury476f7312014-04-08 18:45:46 -0700155 MSM_BOOT_UART_DM_SR_UART_OVERRUN) {
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800156 writel(MSM_BOOT_UART_DM_CMD_RESET_ERR_STAT,
Vadim Bendebury476f7312014-04-08 18:45:46 -0700157 MSM_BOOT_UART_DM_CR(base));
158 total_rx_data = rx_data_read = 0;
159 msm_boot_uart_dm_init(base);
160 return MSM_BOOT_UART_DM_E_RX_NOT_READY;
161 }
162
163 /* Read UART_DM_RX_TOTAL_SNAP for actual number of bytes received */
164 if (total_rx_data == 0)
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800165 total_rx_data = readl(MSM_BOOT_UART_DM_RX_TOTAL_SNAP(base));
Vadim Bendebury476f7312014-04-08 18:45:46 -0700166
167 /* Data available in FIFO; read a word. */
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800168 *data = readl(MSM_BOOT_UART_DM_RF(base, 0));
Vadim Bendebury476f7312014-04-08 18:45:46 -0700169
170 /* WAR for http://prism/CR/548280 */
171 if (*data == 0) {
172 return MSM_BOOT_UART_DM_E_RX_NOT_READY;
173 }
174
175 /* increment the total count of chars we've read so far */
176 rx_data_read += FIFO_DATA_SIZE;
177
178 /* actual count of valid data in word */
179 *count = ((total_rx_data < rx_data_read) ?
180 (FIFO_DATA_SIZE - (rx_data_read - total_rx_data)) :
181 FIFO_DATA_SIZE);
182
183 /* If there are still data left in FIFO we'll read them before
184 * initializing RX Transfer again
185 */
186 if (rx_data_read < total_rx_data)
187 return MSM_BOOT_UART_DM_E_SUCCESS;
188
189 msm_boot_uart_dm_init_rx_transfer(base);
190 total_rx_data = rx_data_read = 0;
191
192 return MSM_BOOT_UART_DM_E_SUCCESS;
193}
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700194#endif
Vadim Bendebury476f7312014-04-08 18:45:46 -0700195
Vadim Bendebury24a53dd2014-05-27 18:03:38 -0700196void uart_tx_byte(int idx, unsigned char data)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700197{
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800198 int num_of_chars = 1;
199 unsigned tx_data = 0;
200 void *base = uart_board_param.uart_dm_base;
Vadim Bendebury476f7312014-04-08 18:45:46 -0700201
Vadim Bendebury24a53dd2014-05-27 18:03:38 -0700202 /* Wait until transmit FIFO is empty. */
Julius Werner2f37bd62015-02-19 14:51:15 -0800203 while (!(read32(MSM_BOOT_UART_DM_SR(base)) &
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800204 MSM_BOOT_UART_DM_SR_TXEMT))
205 udelay(1);
Vadim Bendebury24a53dd2014-05-27 18:03:38 -0700206 /*
207 * TX FIFO is ready to accept new character(s). First write number of
208 * characters to be transmitted.
209 */
Julius Werner2f37bd62015-02-19 14:51:15 -0800210 write32(MSM_BOOT_UART_DM_NO_CHARS_FOR_TX(base), num_of_chars);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700211
Vadim Bendebury24a53dd2014-05-27 18:03:38 -0700212 /* And now write the character(s) */
Julius Werner2f37bd62015-02-19 14:51:15 -0800213 write32(MSM_BOOT_UART_DM_TF(base, 0), tx_data);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700214}
Vadim Bendebury7c256402015-01-13 13:07:48 -0800215#endif /* CONFIG_SERIAL_UART */
Vadim Bendebury476f7312014-04-08 18:45:46 -0700216
217/*
218 * msm_boot_uart_dm_reset - resets UART controller
219 * @base: UART controller base address
220 */
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800221static unsigned int msm_boot_uart_dm_reset(void *base)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700222{
Julius Werner2f37bd62015-02-19 14:51:15 -0800223 write32(MSM_BOOT_UART_DM_CR(base), MSM_BOOT_UART_DM_CMD_RESET_RX);
224 write32(MSM_BOOT_UART_DM_CR(base), MSM_BOOT_UART_DM_CMD_RESET_TX);
225 write32(MSM_BOOT_UART_DM_CR(base),
226 MSM_BOOT_UART_DM_CMD_RESET_ERR_STAT);
227 write32(MSM_BOOT_UART_DM_CR(base), MSM_BOOT_UART_DM_CMD_RES_TX_ERR);
228 write32(MSM_BOOT_UART_DM_CR(base), MSM_BOOT_UART_DM_CMD_RES_STALE_INT);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700229
230 return MSM_BOOT_UART_DM_E_SUCCESS;
231}
232
233/*
234 * msm_boot_uart_dm_init - initilaizes UART controller
235 * @uart_dm_base: UART controller base address
236 */
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800237static unsigned int msm_boot_uart_dm_init(void *uart_dm_base)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700238{
239 /* Configure UART mode registers MR1 and MR2 */
240 /* Hardware flow control isn't supported */
Julius Werner2f37bd62015-02-19 14:51:15 -0800241 write32(MSM_BOOT_UART_DM_MR1(uart_dm_base), 0x0);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700242
243 /* 8-N-1 configuration: 8 data bits - No parity - 1 stop bit */
Julius Werner2f37bd62015-02-19 14:51:15 -0800244 write32(MSM_BOOT_UART_DM_MR2(uart_dm_base),
245 MSM_BOOT_UART_DM_8_N_1_MODE);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700246
247 /* Configure Interrupt Mask register IMR */
Julius Werner2f37bd62015-02-19 14:51:15 -0800248 write32(MSM_BOOT_UART_DM_IMR(uart_dm_base),
249 MSM_BOOT_UART_DM_IMR_ENABLED);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700250
251 /*
252 * Configure Tx and Rx watermarks configuration registers
253 * TX watermark value is set to 0 - interrupt is generated when
254 * FIFO level is less than or equal to 0
255 */
Julius Werner2f37bd62015-02-19 14:51:15 -0800256 write32(MSM_BOOT_UART_DM_TFWR(uart_dm_base),
257 MSM_BOOT_UART_DM_TFW_VALUE);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700258
259 /* RX watermark value */
Julius Werner2f37bd62015-02-19 14:51:15 -0800260 write32(MSM_BOOT_UART_DM_RFWR(uart_dm_base),
261 MSM_BOOT_UART_DM_RFW_VALUE);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700262
263 /* Configure Interrupt Programming Register */
264 /* Set initial Stale timeout value */
Julius Werner2f37bd62015-02-19 14:51:15 -0800265 write32(MSM_BOOT_UART_DM_IPR(uart_dm_base),
266 MSM_BOOT_UART_DM_STALE_TIMEOUT_LSB);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700267
268 /* Configure IRDA if required */
269 /* Disabling IRDA mode */
Julius Werner2f37bd62015-02-19 14:51:15 -0800270 write32(MSM_BOOT_UART_DM_IRDA(uart_dm_base), 0x0);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700271
272 /* Configure hunt character value in HCR register */
273 /* Keep it in reset state */
Julius Werner2f37bd62015-02-19 14:51:15 -0800274 write32(MSM_BOOT_UART_DM_HCR(uart_dm_base), 0x0);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700275
276 /*
277 * Configure Rx FIFO base address
278 * Both TX/RX shares same SRAM and default is half-n-half.
279 * Sticking with default value now.
280 * As such RAM size is (2^RAM_ADDR_WIDTH, 32-bit entries).
281 * We have found RAM_ADDR_WIDTH = 0x7f
282 */
283
284 /* Issue soft reset command */
285 msm_boot_uart_dm_reset(uart_dm_base);
286
287 /* Enable/Disable Rx/Tx DM interfaces */
288 /* Data Mover not currently utilized. */
Julius Werner2f37bd62015-02-19 14:51:15 -0800289 write32(MSM_BOOT_UART_DM_DMEN(uart_dm_base), 0x0);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700290
291 /* Enable transmitter */
Julius Werner2f37bd62015-02-19 14:51:15 -0800292 write32(MSM_BOOT_UART_DM_CR(uart_dm_base),
293 MSM_BOOT_UART_DM_CR_TX_ENABLE);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700294
295 /* Initialize Receive Path */
296 msm_boot_uart_dm_init_rx_transfer(uart_dm_base);
297
298 return 0;
299}
300
301/**
Vadim Bendebury7c256402015-01-13 13:07:48 -0800302 * ipq806x_uart_init - initializes UART
Vadim Bendebury476f7312014-04-08 18:45:46 -0700303 *
304 * Initializes clocks, GPIO and UART controller.
305 */
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700306void uart_init(int idx)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700307{
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700308 /* Note int idx isn't used in this driver. */
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800309 void *dm_base;
310 void *gsbi_base;
Vadim Bendebury476f7312014-04-08 18:45:46 -0700311
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700312 dm_base = uart_board_param.uart_dm_base;
Vadim Bendebury7c256402015-01-13 13:07:48 -0800313
Julius Werner2f37bd62015-02-19 14:51:15 -0800314 if (read32(MSM_BOOT_UART_DM_CSR(dm_base)) == UART_DM_CLK_RX_TX_BIT_RATE)
Vadim Bendebury7c256402015-01-13 13:07:48 -0800315 return; /* UART must have been already initialized. */
316
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700317 gsbi_base = uart_board_param.uart_gsbi_base;
318 ipq_configure_gpio(uart_board_param.dbg_uart_gpio,
319 NO_OF_DBG_UART_GPIOS);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700320
321 /* Configure the uart clock */
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800322 uart_clock_config(uart_board_param.uart_gsbi,
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700323 uart_board_param.mnd_value.m_value,
324 uart_board_param.mnd_value.n_value,
325 uart_board_param.mnd_value.d_value,
326 0);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700327
Julius Werner2f37bd62015-02-19 14:51:15 -0800328 write32(GSBI_CTRL_REG(gsbi_base),
329 GSBI_PROTOCOL_CODE_I2C_UART << GSBI_CTRL_REG_PROTOCOL_CODE_S);
330 write32(MSM_BOOT_UART_DM_CSR(dm_base), UART_DM_CLK_RX_TX_BIT_RATE);
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700331
Vadim Bendebury476f7312014-04-08 18:45:46 -0700332 /* Intialize UART_DM */
333 msm_boot_uart_dm_init(dm_base);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700334}
335
Vadim Bendebury7c256402015-01-13 13:07:48 -0800336/* for the benefit of non-console uart init */
337void ipq806x_uart_init(void)
338{
339 uart_init(0);
340}
341
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700342#if 0 /* Not used yet */
343uint32_t uartmem_getbaseaddr(void)
344{
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800345 return (uint32_t)uart_board_param.uart_dm_base;
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700346}
347#endif
348
Vadim Bendebury476f7312014-04-08 18:45:46 -0700349/**
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700350 * uart_tx_flush - transmits a string of data
Vadim Bendebury476f7312014-04-08 18:45:46 -0700351 * @s: string to transmit
352 */
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700353void uart_tx_flush(int idx)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700354{
Vadim Bendeburyb67b7152015-01-13 12:46:57 -0800355 void *base = uart_board_param.uart_dm_base;
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700356
Julius Werner2f37bd62015-02-19 14:51:15 -0800357 while (!(read32(MSM_BOOT_UART_DM_SR(base)) &
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700358 MSM_BOOT_UART_DM_SR_TXEMT))
359 ;
Vadim Bendebury476f7312014-04-08 18:45:46 -0700360}
361
362/**
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700363 * uart_can_rx_byte - checks if data available for reading
Vadim Bendebury476f7312014-04-08 18:45:46 -0700364 *
365 * Returns 1 if data available, 0 otherwise
366 */
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700367 #if 0 /* Not used yet */
368int uart_can_rx_byte(void)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700369{
370 /* Return if data is already read */
371 if (valid_data)
372 return 1;
373
374 /* Read data from the FIFO */
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700375 if (msm_boot_uart_dm_read(&word, &valid_data, 0) !=
376 MSM_BOOT_UART_DM_E_SUCCESS)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700377 return 0;
378
379 return 1;
380}
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700381#endif
Vadim Bendebury476f7312014-04-08 18:45:46 -0700382
Vadim Bendebury7c256402015-01-13 13:07:48 -0800383#if IS_ENABLED(CONFIG_DRIVERS_UART)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700384/**
385 * ipq806x_serial_getc - reads a character
386 *
387 * Returns the character read from serial port.
388 */
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700389uint8_t uart_rx_byte(int idx)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700390{
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700391 uint8_t byte;
Vadim Bendebury476f7312014-04-08 18:45:46 -0700392
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700393#if 0 /* Not used yet */
394 while (!uart_can_rx_byte()) {
Vadim Bendebury476f7312014-04-08 18:45:46 -0700395 /* wait for incoming data */
396 }
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700397#endif
398 byte = (uint8_t)(word & 0xff);
Vadim Bendebury476f7312014-04-08 18:45:46 -0700399 word = word >> 8;
400 valid_data--;
401
402 return byte;
403}
Vadim Bendebury7c256402015-01-13 13:07:48 -0800404#endif
405
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700406#ifndef __PRE_RAM__
407/* TODO: Implement fuction */
408void uart_fill_lb(void *data)
Vadim Bendebury476f7312014-04-08 18:45:46 -0700409{
Vadim Bendebury476f7312014-04-08 18:45:46 -0700410}
Vadim Bendeburyf17680b2014-04-23 14:00:59 -0700411#endif