162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2010 John Crispin <john@phrozen.org> 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/cpu.h> 862306a36Sopenharmony_ci#include <lantiq_soc.h> 962306a36Sopenharmony_ci#include <asm/setup.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci#define ASC_BUF 1024 1262306a36Sopenharmony_ci#define LTQ_ASC_FSTAT ((u32 *)(LTQ_EARLY_ASC + 0x0048)) 1362306a36Sopenharmony_ci#ifdef __BIG_ENDIAN 1462306a36Sopenharmony_ci#define LTQ_ASC_TBUF ((u32 *)(LTQ_EARLY_ASC + 0x0020 + 3)) 1562306a36Sopenharmony_ci#else 1662306a36Sopenharmony_ci#define LTQ_ASC_TBUF ((u32 *)(LTQ_EARLY_ASC + 0x0020)) 1762306a36Sopenharmony_ci#endif 1862306a36Sopenharmony_ci#define TXMASK 0x3F00 1962306a36Sopenharmony_ci#define TXOFFSET 8 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_civoid prom_putchar(char c) 2262306a36Sopenharmony_ci{ 2362306a36Sopenharmony_ci unsigned long flags; 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ci local_irq_save(flags); 2662306a36Sopenharmony_ci do { } while ((ltq_r32(LTQ_ASC_FSTAT) & TXMASK) >> TXOFFSET); 2762306a36Sopenharmony_ci if (c == '\n') 2862306a36Sopenharmony_ci ltq_w8('\r', LTQ_ASC_TBUF); 2962306a36Sopenharmony_ci ltq_w8(c, LTQ_ASC_TBUF); 3062306a36Sopenharmony_ci local_irq_restore(flags); 3162306a36Sopenharmony_ci} 32