18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * arch/arm/mach-pxa/include/mach/uncompress.h 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * Author: Nicolas Pitre 68c2ecf20Sopenharmony_ci * Copyright: (C) 2001 MontaVista Software Inc. 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#include <linux/serial_reg.h> 108c2ecf20Sopenharmony_ci#include <asm/mach-types.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ci#define FFUART_BASE (0x40100000) 138c2ecf20Sopenharmony_ci#define BTUART_BASE (0x40200000) 148c2ecf20Sopenharmony_ci#define STUART_BASE (0x40700000) 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_ciunsigned long uart_base; 178c2ecf20Sopenharmony_ciunsigned int uart_shift; 188c2ecf20Sopenharmony_ciunsigned int uart_is_pxa; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_cistatic inline unsigned char uart_read(int offset) 218c2ecf20Sopenharmony_ci{ 228c2ecf20Sopenharmony_ci return *(volatile unsigned char *)(uart_base + (offset << uart_shift)); 238c2ecf20Sopenharmony_ci} 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_cistatic inline void uart_write(unsigned char val, int offset) 268c2ecf20Sopenharmony_ci{ 278c2ecf20Sopenharmony_ci *(volatile unsigned char *)(uart_base + (offset << uart_shift)) = val; 288c2ecf20Sopenharmony_ci} 298c2ecf20Sopenharmony_ci 308c2ecf20Sopenharmony_cistatic inline int uart_is_enabled(void) 318c2ecf20Sopenharmony_ci{ 328c2ecf20Sopenharmony_ci /* assume enabled by default for non-PXA uarts */ 338c2ecf20Sopenharmony_ci return uart_is_pxa ? uart_read(UART_IER) & UART_IER_UUE : 1; 348c2ecf20Sopenharmony_ci} 358c2ecf20Sopenharmony_ci 368c2ecf20Sopenharmony_cistatic inline void putc(char c) 378c2ecf20Sopenharmony_ci{ 388c2ecf20Sopenharmony_ci if (!uart_is_enabled()) 398c2ecf20Sopenharmony_ci return; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci while (!(uart_read(UART_LSR) & UART_LSR_THRE)) 428c2ecf20Sopenharmony_ci barrier(); 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci uart_write(c, UART_TX); 458c2ecf20Sopenharmony_ci} 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci/* 488c2ecf20Sopenharmony_ci * This does not append a newline 498c2ecf20Sopenharmony_ci */ 508c2ecf20Sopenharmony_cistatic inline void flush(void) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci} 538c2ecf20Sopenharmony_ci 548c2ecf20Sopenharmony_cistatic inline void arch_decomp_setup(void) 558c2ecf20Sopenharmony_ci{ 568c2ecf20Sopenharmony_ci /* initialize to default */ 578c2ecf20Sopenharmony_ci uart_base = FFUART_BASE; 588c2ecf20Sopenharmony_ci uart_shift = 2; 598c2ecf20Sopenharmony_ci uart_is_pxa = 1; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci if (machine_is_littleton() || machine_is_intelmote2() 628c2ecf20Sopenharmony_ci || machine_is_csb726() || machine_is_stargate2() 638c2ecf20Sopenharmony_ci || machine_is_cm_x300() || machine_is_balloon3()) 648c2ecf20Sopenharmony_ci uart_base = STUART_BASE; 658c2ecf20Sopenharmony_ci 668c2ecf20Sopenharmony_ci if (machine_is_arcom_zeus()) { 678c2ecf20Sopenharmony_ci uart_base = 0x10000000; /* nCS4 */ 688c2ecf20Sopenharmony_ci uart_shift = 1; 698c2ecf20Sopenharmony_ci uart_is_pxa = 0; 708c2ecf20Sopenharmony_ci } 718c2ecf20Sopenharmony_ci} 72