diff --git a/drivers/soc/rockchip/rk_fiq_debugger.c b/drivers/soc/rockchip/rk_fiq_debugger.c index 3d72ac3b4eab..629237da6a6b 100755 --- a/drivers/soc/rockchip/rk_fiq_debugger.c +++ b/drivers/soc/rockchip/rk_fiq_debugger.c @@ -189,6 +189,15 @@ static void debug_putc(struct platform_device *pdev, unsigned int c) rk_fiq_write(t, c, UART_TX); } +static int debug_getc_dummy(struct platform_device *pdev) +{ + return FIQ_DEBUGGER_NO_CHAR; +} + +static void debug_putc_dummy(struct platform_device *pdev, unsigned int c) +{ +} + static void debug_flush(struct platform_device *pdev) { struct rk_fiq_debugger *t; @@ -598,6 +607,41 @@ void rk_serial_debug_init(void __iomem *base, phys_addr_t phy_base, kfree(t); } +void rk_serial_debug_init_dummy(void) +{ + struct rk_fiq_debugger *t = NULL; + struct platform_device *pdev = NULL; + + t = kzalloc(sizeof(*t), GFP_KERNEL); + if (!t) { + pr_err("Failed to allocate for fiq debugger\n"); + return; + } + + t->pdata.uart_getc = debug_getc_dummy; + t->pdata.uart_putc = debug_putc_dummy; + + pdev = kzalloc(sizeof(*pdev), GFP_KERNEL); + if (!pdev) { + pr_err("Failed to alloc fiq debugger platform device\n"); + goto out2; + } + + pdev->name = "fiq_debugger"; + pdev->id = rk_fiq_debugger_id++; + pdev->dev.platform_data = &t->pdata; + if (platform_device_register(pdev)) { + pr_err("Failed to register fiq debugger\n"); + goto out3; + } + return; + +out3: + kfree(pdev); +out2: + kfree(t); +} + #if defined(CONFIG_OF) static const struct of_device_id rk_fiqdbg_of_match[] = { { .compatible = "rockchip,fiq-debugger", }, @@ -628,6 +672,11 @@ static int __init rk_fiqdbg_probe(struct platform_device *pdev) if (of_property_read_u32(np, "rockchip,serial-id", &serial_id)) return -EINVAL; + if (serial_id == -1) { + rk_serial_debug_init_dummy(); + return 0; + } + if (of_property_read_u32(np, "rockchip,irq-mode-enable", &irq_mode)) irq_mode = -1; diff --git a/drivers/staging/android/fiq_debugger/fiq_debugger.c b/drivers/staging/android/fiq_debugger/fiq_debugger.c index b046e2f5a511..8cc16cb0c347 100644 --- a/drivers/staging/android/fiq_debugger/fiq_debugger.c +++ b/drivers/staging/android/fiq_debugger/fiq_debugger.c @@ -232,7 +232,8 @@ static void fiq_debugger_uart_flush(struct fiq_debugger_state *state) static void fiq_debugger_putc(struct fiq_debugger_state *state, char c) { - state->pdata->uart_putc(state->pdev, c); + if (state->pdata->uart_putc) + state->pdata->uart_putc(state->pdev, c); } static void fiq_debugger_puts(struct fiq_debugger_state *state, char *s) @@ -756,7 +757,10 @@ static void fiq_debugger_handle_irq_context(struct fiq_debugger_state *state) static int fiq_debugger_getc(struct fiq_debugger_state *state) { - return state->pdata->uart_getc(state->pdev); + if (state->pdata->uart_getc) + return state->pdata->uart_getc(state->pdev); + else + return FIQ_DEBUGGER_NO_CHAR; } static int fiq_debugger_cmd_check_back(struct fiq_debugger_state *state, char c) @@ -770,9 +774,9 @@ static int fiq_debugger_cmd_check_back(struct fiq_debugger_state *state, char c) s = state->cmd_buf[state->back_pointer]; if (*s != 0) { for (i = 0; i < strlen(state->debug_buf) - 1; i++) { - state->pdata->uart_putc(state->pdev, 8); - state->pdata->uart_putc(state->pdev, ' '); - state->pdata->uart_putc(state->pdev, 8); + fiq_debugger_putc(state, 8); + fiq_debugger_putc(state, ' '); + fiq_debugger_putc(state, 8); } memset(state->debug_buf, 0, DEBUG_MAX); strcpy(state->debug_buf, s); @@ -794,9 +798,9 @@ static int fiq_debugger_cmd_check_back(struct fiq_debugger_state *state, char c) s = state->cmd_buf[state->back_pointer]; if (*s != 0) { for (i = 0; i < strlen(state->debug_buf) - 1; i++) { - state->pdata->uart_putc(state->pdev, 8); - state->pdata->uart_putc(state->pdev, ' '); - state->pdata->uart_putc(state->pdev, 8); + fiq_debugger_putc(state, 8); + fiq_debugger_putc(state, ' '); + fiq_debugger_putc(state, 8); } memset(state->debug_buf, 0, DEBUG_MAX); strcpy(state->debug_buf, s); @@ -807,9 +811,9 @@ static int fiq_debugger_cmd_check_back(struct fiq_debugger_state *state, char c) } else { cmd_clear: for (i = 0; i < strlen(state->debug_buf) - 1; i++) { - state->pdata->uart_putc(state->pdev, 8); - state->pdata->uart_putc(state->pdev, ' '); - state->pdata->uart_putc(state->pdev, 8); + fiq_debugger_putc(state, 8); + fiq_debugger_putc(state, ' '); + fiq_debugger_putc(state, 8); } memset(state->debug_buf, 0, DEBUG_MAX); state->debug_count = 0; @@ -847,9 +851,9 @@ static void fiq_debugger_cmd_tab(struct fiq_debugger_state *state) } for (j = 0; j < strlen(state->debug_buf); j++) { - state->pdata->uart_putc(state->pdev, 8); - state->pdata->uart_putc(state->pdev, ' '); - state->pdata->uart_putc(state->pdev, 8); + fiq_debugger_putc(state, 8); + fiq_debugger_putc(state, ' '); + fiq_debugger_putc(state, 8); } memset(state->debug_buf, 0, DEBUG_MAX); strcpy(state->debug_buf, cmd_buf[i]); @@ -932,9 +936,9 @@ static bool fiq_debugger_handle_uart_interrupt(struct fiq_debugger_state *state, } else if (last_c == '[' && (c == 'A' || c == 'B' || c == 'C' || c == 'D')) { if (state->debug_count > 0) { state->debug_count--; - state->pdata->uart_putc(state->pdev, 8); - state->pdata->uart_putc(state->pdev, ' '); - state->pdata->uart_putc(state->pdev, 8); + fiq_debugger_putc(state, 8); + fiq_debugger_putc(state, ' '); + fiq_debugger_putc(state, 8); } fiq_debugger_cmd_check_back(state, c); } else if (c == 9) { @@ -1375,13 +1379,14 @@ static int fiq_debugger_probe(struct platform_device *pdev) fiq = platform_get_irq_byname(pdev, "fiq"); uart_irq = platform_get_irq_byname(pdev, "uart_irq"); +#ifndef CONFIG_ARCH_ROCKCHIP /* uart_irq mode and fiq mode are mutually exclusive, but one of them * is required */ if ((uart_irq < 0 && fiq < 0) || (uart_irq >= 0 && fiq >= 0)) return -EINVAL; if (fiq >= 0 && !pdata->fiq_enable) return -EINVAL; - +#endif state = kzalloc(sizeof(*state), GFP_KERNEL); state->output.printf = fiq_debugger_printf; timer_setup(&state->sleep_timer, fiq_debugger_sleep_timer_expired, 0); @@ -1409,6 +1414,11 @@ static int fiq_debugger_probe(struct platform_device *pdev) wakeup_source_init(&state->debugger_wake_src, "serial-debug"); +#ifdef CONFIG_ARCH_ROCKCHIP + if (uart_irq < 0 && fiq < 0) + goto console_out; +#endif + state->clk = clk_get(&pdev->dev, NULL); if (IS_ERR(state->clk)) state->clk = NULL; @@ -1500,7 +1510,9 @@ static int fiq_debugger_probe(struct platform_device *pdev) if (state->clk) clk_disable(state->clk); - +#ifdef CONFIG_ARCH_ROCKCHIP +console_out: +#endif #if defined(CONFIG_FIQ_DEBUGGER_CONSOLE) spin_lock_init(&state->console_lock); state->console = fiq_debugger_console;