xref: /OK3568_Linux_fs/u-boot/arch/arm/mach-rockchip/rockchip_debugger.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /*
2*4882a593Smuzhiyun  * (C) Copyright 2018 Rockchip Electronics Co., Ltd
3*4882a593Smuzhiyun  *
4*4882a593Smuzhiyun  * SPDX-License-Identifier:     GPL-2.0+
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <asm/io.h>
8*4882a593Smuzhiyun #include <common.h>
9*4882a593Smuzhiyun #include <irq-generic.h>
10*4882a593Smuzhiyun #include <rk_timer_irq.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun /*
13*4882a593Smuzhiyun  * Currently, we support a timer timeout to generate a IRQ to dump cpu context.
14*4882a593Smuzhiyun  */
15*4882a593Smuzhiyun #define ROCKCHIP_DEBUGGER_TIMEOUT	5	/* seconds */
16*4882a593Smuzhiyun 
rockchip_debugger_isr(int irq,void * data)17*4882a593Smuzhiyun static void rockchip_debugger_isr(int irq, void *data)
18*4882a593Smuzhiyun {
19*4882a593Smuzhiyun 	writel(TIMER_CLR_INT, TIMER_BASE + TIMER_INTSTATUS);
20*4882a593Smuzhiyun }
21*4882a593Smuzhiyun 
rockchip_debugger_init(void)22*4882a593Smuzhiyun int rockchip_debugger_init(void)
23*4882a593Smuzhiyun {
24*4882a593Smuzhiyun 	uint32_t load_count0, load_count1;
25*4882a593Smuzhiyun 	uint64_t delay_c = ROCKCHIP_DEBUGGER_TIMEOUT * COUNTER_FREQUENCY;
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	if (!delay_c)
28*4882a593Smuzhiyun 		return 0;
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun 	printf("Enable rockchip debugger\n");
31*4882a593Smuzhiyun 
32*4882a593Smuzhiyun 	/* Disable first */
33*4882a593Smuzhiyun 	writel(0, TIMER_BASE + TIMER_CTRL);
34*4882a593Smuzhiyun 
35*4882a593Smuzhiyun 	/* Config */
36*4882a593Smuzhiyun 	load_count0 = (uint32_t)(delay_c);
37*4882a593Smuzhiyun 	load_count1 = (uint32_t)(delay_c >> 32);
38*4882a593Smuzhiyun 	writel(load_count0, TIMER_BASE + TIMER_LOAD_COUNT0);
39*4882a593Smuzhiyun 	writel(load_count1, TIMER_BASE + TIMER_LOAD_COUNT1);
40*4882a593Smuzhiyun 	writel(TIMER_CLR_INT, TIMER_BASE + TIMER_INTSTATUS);
41*4882a593Smuzhiyun 	writel(TIMER_EN | TIMER_INT_EN, TIMER_BASE + TIMER_CTRL);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	/* Request irq */
44*4882a593Smuzhiyun 	irq_install_handler(TIMER_IRQ, rockchip_debugger_isr, NULL);
45*4882a593Smuzhiyun 	irq_handler_enable(TIMER_IRQ);
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun 	return 0;
48*4882a593Smuzhiyun }
49