blob: eb008741e3bccd7d6ae9aff6fb58fee7492840d4 [file] [log] [blame]
Luka Kovacic6ae17022019-12-04 21:46:37 +01001/*
2 * Copyright (C) 2020 Sartura Ltd.
3 * Author: Luka Kovacic <luka.kovacic@sartura.hr>
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 * https://spdx.org/licenses
7 */
8
9#include <armada_common.h>
10#include <common/debug.h>
11#include <drivers/delay_timer.h>
12#include <drivers/ti/uart/uart_16550.h>
13#include <drivers/console.h>
14#include <plat_marvell.h>
15
16/*****************************************************************************
17 * Platform specific power off functions
18 * Power off PSU / Send command to power management MCU / ...
19 *****************************************************************************
20 */
21
22unsigned char add_xor_checksum(unsigned char *buf, unsigned char xor_len)
23{
24 unsigned char xor_sum = 0;
25 unsigned int i;
26
27 for (i = 0; i < xor_len; i++)
28 xor_sum ^= buf[i];
29
30 return xor_sum;
31}
32
33int system_power_off(void)
34{
35 static console_t console;
36
37 /* WT61P803 MCU system_off_now command */
38 unsigned char system_off_now[4] = { '@', 'C', '0' };
39 int i, len;
40
41 len = sizeof(system_off_now);
42 system_off_now[len - 1] = add_xor_checksum(system_off_now, len);
43
Pali Rohár168d81e2021-05-14 13:21:56 +020044 console_16550_register(PLAT_MARVELL_UART_BASE + 0x100,
45 PLAT_MARVELL_UART_CLK_IN_HZ, 115200, &console);
Luka Kovacic6ae17022019-12-04 21:46:37 +010046
47 /* Send system_off_now to console */
48 for (i = 0; i < len; i++) {
49 console.putc(system_off_now[i], &console);
50 udelay(1000);
51 }
52
53 console.flush(&console);
54 (void)console_unregister(&console);
55
56 mdelay(100);
57
58 return 0;
59}