60 lines
1.4 KiB
C
60 lines
1.4 KiB
C
/*
|
|
* Copyright (C) 2020 Sartura Ltd.
|
|
* Author: Luka Kovacic <luka.kovacic@sartura.hr>
|
|
*
|
|
* SPDX-License-Identifier: BSD-3-Clause
|
|
* https://spdx.org/licenses
|
|
*/
|
|
|
|
#include <armada_common.h>
|
|
#include <common/debug.h>
|
|
#include <drivers/delay_timer.h>
|
|
#include <drivers/ti/uart/uart_16550.h>
|
|
#include <drivers/console.h>
|
|
#include <plat_marvell.h>
|
|
|
|
/*****************************************************************************
|
|
* Platform specific power off functions
|
|
* Power off PSU / Send command to power management MCU / ...
|
|
*****************************************************************************
|
|
*/
|
|
|
|
unsigned char add_xor_checksum(unsigned char *buf, unsigned char xor_len)
|
|
{
|
|
unsigned char xor_sum = 0;
|
|
unsigned int i;
|
|
|
|
for (i = 0; i < xor_len; i++)
|
|
xor_sum ^= buf[i];
|
|
|
|
return xor_sum;
|
|
}
|
|
|
|
int system_power_off(void)
|
|
{
|
|
static console_t console;
|
|
|
|
/* WT61P803 MCU system_off_now command */
|
|
unsigned char system_off_now[4] = { '@', 'C', '0' };
|
|
int i, len;
|
|
|
|
len = sizeof(system_off_now);
|
|
system_off_now[len - 1] = add_xor_checksum(system_off_now, len);
|
|
|
|
console_16550_register(PLAT_MARVELL_BOOT_UART_BASE + 0x100,
|
|
PLAT_MARVELL_BOOT_UART_CLK_IN_HZ, 115200, &console);
|
|
|
|
/* Send system_off_now to console */
|
|
for (i = 0; i < len; i++) {
|
|
console.putc(system_off_now[i], &console);
|
|
udelay(1000);
|
|
}
|
|
|
|
console.flush(&console);
|
|
(void)console_unregister(&console);
|
|
|
|
mdelay(100);
|
|
|
|
return 0;
|
|
}
|