blob: 28c053e22ea6866b039e20576cd1d88ebaf7f082 [file] [log] [blame]
Brian Swetland2500aa12009-01-01 04:33:55 -08001/*
Brian Swetlandddf61a22009-01-29 20:46:14 -08002 * Copyright (c) 2009, Google Inc.
Brian Swetland2500aa12009-01-01 04:33:55 -08003 * All rights reserved.
Matthew Qin7791fe82014-02-25 17:19:19 +08004 * Copyright (c) 2009-2014, The Linux Foundation. All rights reserved.
Brian Swetland2500aa12009-01-01 04:33:55 -08005 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 * * Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * * Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in
13 * the documentation and/or other materials provided with the
14 * distribution.
15 * * Neither the name of Google, Inc. nor the names of its contributors
16 * may be used to endorse or promote products derived from this
17 * software without specific prior written permission.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
22 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
23 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
24 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
25 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
26 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
27 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
28 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
29 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
Pavel Nedev94eaaad2013-06-10 14:50:59 +030033#include <stdlib.h>
Brian Swetland2500aa12009-01-01 04:33:55 -080034#include <debug.h>
35#include <printf.h>
36#include <arch/arm/dcc.h>
Dima Zavin6e274c22009-01-28 17:28:41 -080037#include <dev/fbcon.h>
Brian Swetland2500aa12009-01-01 04:33:55 -080038#include <dev/uart.h>
Deepa Dinamani72125892013-05-06 16:50:38 -070039#include <platform/timer.h>
Pavel Nedev420ecf52013-05-14 14:04:22 +030040#include <platform.h>
Brian Swetland2500aa12009-01-01 04:33:55 -080041
Matthew Qin7791fe82014-02-25 17:19:19 +080042#if PON_VIB_SUPPORT
43#include <vibrator.h>
44#endif
45
Deepa Dinamani72125892013-05-06 16:50:38 -070046static void write_dcc(char c)
47{
48 uint32_t timeout = 10;
49
50 /* Note: Smallest sampling rate for DCC is 50us.
51 * This can be changed by SNOOPer.Rate on T32 window.
52 */
53 while (timeout)
54 {
55 if (dcc_putc(c) == 0)
56 break;
57 udelay(50);
58 timeout--;
59 }
60}
Pavel Nedev94eaaad2013-06-10 14:50:59 +030061
62#if WITH_DEBUG_LOG_BUF
63
64#ifndef LK_LOG_BUF_SIZE
65#define LK_LOG_BUF_SIZE (4096) /* align on 4k */
66#endif
67
68#define LK_LOG_COOKIE 0x474f4c52 /* "RLOG" in ASCII */
69
70struct lk_log {
71 struct lk_log_header {
72 unsigned cookie;
73 unsigned max_size;
74 unsigned size_written;
75 unsigned idx;
76 } header;
77 char data[LK_LOG_BUF_SIZE];
78};
79
80static struct lk_log log = {
81 .header = {
82 .cookie = LK_LOG_COOKIE,
83 .max_size = sizeof(log.data),
84 .size_written = 0,
85 .idx = 0,
86 },
87 .data = {0}
88};
89
90static void log_putc(char c)
91{
92 log.data[log.header.idx++] = c;
93 log.header.size_written++;
94 if (unlikely(log.header.idx >= log.header.max_size))
95 log.header.idx = 0;
96}
97#endif /* WITH_DEBUG_LOG_BUF */
98
Brian Swetland2500aa12009-01-01 04:33:55 -080099void _dputc(char c)
100{
Pavel Nedev94eaaad2013-06-10 14:50:59 +0300101#if WITH_DEBUG_LOG_BUF
102 log_putc(c);
103#endif
Brian Swetlandddf61a22009-01-29 20:46:14 -0800104#if WITH_DEBUG_DCC
Brian Swetland2500aa12009-01-01 04:33:55 -0800105 if (c == '\n') {
Deepa Dinamani72125892013-05-06 16:50:38 -0700106 write_dcc('\r');
Brian Swetland2500aa12009-01-01 04:33:55 -0800107 }
Deepa Dinamani72125892013-05-06 16:50:38 -0700108 write_dcc(c) ;
Brian Swetland2500aa12009-01-01 04:33:55 -0800109#endif
Brian Swetlandddf61a22009-01-29 20:46:14 -0800110#if WITH_DEBUG_UART
111 uart_putc(0, c);
112#endif
113#if WITH_DEBUG_FBCON && WITH_DEV_FBCON
Dima Zavin6e274c22009-01-28 17:28:41 -0800114 fbcon_putc(c);
115#endif
Ajay Dudani168f6cb2009-12-07 19:04:02 -0800116#if WITH_DEBUG_JTAG
117 jtag_dputc(c);
118#endif
Brian Swetland2500aa12009-01-01 04:33:55 -0800119}
120
Travis Geiselbrechtdbc2c682009-06-28 12:18:39 -0700121int dgetc(char *c, bool wait)
Brian Swetland2500aa12009-01-01 04:33:55 -0800122{
Brian Swetlandc82fda92009-01-02 01:53:42 -0800123 int n;
Brian Swetlandddf61a22009-01-29 20:46:14 -0800124#if WITH_DEBUG_DCC
Brian Swetlandc82fda92009-01-02 01:53:42 -0800125 n = dcc_getc();
Brian Swetlandddf61a22009-01-29 20:46:14 -0800126#elif WITH_DEBUG_UART
127 n = uart_getc(0, 0);
Brian Swetlandc82fda92009-01-02 01:53:42 -0800128#else
Brian Swetlandddf61a22009-01-29 20:46:14 -0800129 n = -1;
Brian Swetlandc82fda92009-01-02 01:53:42 -0800130#endif
Brian Swetland2500aa12009-01-01 04:33:55 -0800131 if (n < 0) {
132 return -1;
133 } else {
134 *c = n;
135 return 0;
136 }
Brian Swetland2500aa12009-01-01 04:33:55 -0800137}
138
139void platform_halt(void)
140{
Matthew Qin7791fe82014-02-25 17:19:19 +0800141#if PON_VIB_SUPPORT
142 vib_turn_off();
143#endif
Pavel Nedev420ecf52013-05-14 14:04:22 +0300144 if (set_download_mode(NORMAL_DLOAD) == 0)
145 {
146 dprintf(CRITICAL, "HALT: reboot into dload mode...\n");
147 reboot_device(0);
148 dprintf(CRITICAL, "HALT: reboot_device failed\n");
149 }
150 else
151 {
152 dprintf(CRITICAL, "HALT: set_download_mode not supported\n");
153 }
154 dprintf(CRITICAL, "HALT: spinning forever...\n");
Ajay Dudanib01e5062011-12-03 23:23:42 -0800155 for (;;) ;
Brian Swetland2500aa12009-01-01 04:33:55 -0800156}