Linux Audio

Check our new training course

Loading...
v3.5.6
 1/*
 2 *  Atheros AR7XXX/AR9XXX SoC early printk support
 3 *
 4 *  Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
 5 *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
 6 *
 7 *  This program is free software; you can redistribute it and/or modify it
 8 *  under the terms of the GNU General Public License version 2 as published
 9 *  by the Free Software Foundation.
10 */
11
12#include <linux/io.h>
13#include <linux/errno.h>
14#include <linux/serial_reg.h>
15#include <asm/addrspace.h>
16
17#include <asm/mach-ath79/ath79.h>
18#include <asm/mach-ath79/ar71xx_regs.h>
19#include <asm/mach-ath79/ar933x_uart.h>
20
21static void (*_prom_putchar) (unsigned char);
22
23static inline void prom_putchar_wait(void __iomem *reg, u32 mask, u32 val)
24{
25	u32 t;
26
27	do {
28		t = __raw_readl(reg);
29		if ((t & mask) == val)
30			break;
31	} while (1);
32}
33
 
 
34static void prom_putchar_ar71xx(unsigned char ch)
35{
36	void __iomem *base = (void __iomem *)(KSEG1ADDR(AR71XX_UART_BASE));
37
38	prom_putchar_wait(base + UART_LSR * 4, UART_LSR_THRE, UART_LSR_THRE);
39	__raw_writel(ch, base + UART_TX * 4);
40	prom_putchar_wait(base + UART_LSR * 4, UART_LSR_THRE, UART_LSR_THRE);
41}
42
43static void prom_putchar_ar933x(unsigned char ch)
44{
45	void __iomem *base = (void __iomem *)(KSEG1ADDR(AR933X_UART_BASE));
46
47	prom_putchar_wait(base + AR933X_UART_DATA_REG, AR933X_UART_DATA_TX_CSR,
48			  AR933X_UART_DATA_TX_CSR);
49	__raw_writel(AR933X_UART_DATA_TX_CSR | ch, base + AR933X_UART_DATA_REG);
50	prom_putchar_wait(base + AR933X_UART_DATA_REG, AR933X_UART_DATA_TX_CSR,
51			  AR933X_UART_DATA_TX_CSR);
52}
53
54static void prom_putchar_dummy(unsigned char ch)
55{
56	/* nothing to do */
57}
58
59static void prom_putchar_init(void)
60{
61	void __iomem *base;
62	u32 id;
63
64	base = (void __iomem *)(KSEG1ADDR(AR71XX_RESET_BASE));
65	id = __raw_readl(base + AR71XX_RESET_REG_REV_ID);
66	id &= REV_ID_MAJOR_MASK;
67
68	switch (id) {
69	case REV_ID_MAJOR_AR71XX:
70	case REV_ID_MAJOR_AR7240:
71	case REV_ID_MAJOR_AR7241:
72	case REV_ID_MAJOR_AR7242:
73	case REV_ID_MAJOR_AR913X:
74	case REV_ID_MAJOR_AR9341:
75	case REV_ID_MAJOR_AR9342:
76	case REV_ID_MAJOR_AR9344:
 
 
77		_prom_putchar = prom_putchar_ar71xx;
78		break;
79
80	case REV_ID_MAJOR_AR9330:
81	case REV_ID_MAJOR_AR9331:
82		_prom_putchar = prom_putchar_ar933x;
83		break;
84
85	default:
86		_prom_putchar = prom_putchar_dummy;
87		break;
88	}
89}
90
91void prom_putchar(unsigned char ch)
92{
93	if (!_prom_putchar)
94		prom_putchar_init();
95
96	_prom_putchar(ch);
97}
v4.17
  1/*
  2 *  Atheros AR7XXX/AR9XXX SoC early printk support
  3 *
  4 *  Copyright (C) 2008-2011 Gabor Juhos <juhosg@openwrt.org>
  5 *  Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org>
  6 *
  7 *  This program is free software; you can redistribute it and/or modify it
  8 *  under the terms of the GNU General Public License version 2 as published
  9 *  by the Free Software Foundation.
 10 */
 11
 12#include <linux/io.h>
 13#include <linux/errno.h>
 14#include <linux/serial_reg.h>
 15#include <asm/addrspace.h>
 16
 17#include <asm/mach-ath79/ath79.h>
 18#include <asm/mach-ath79/ar71xx_regs.h>
 19#include <asm/mach-ath79/ar933x_uart.h>
 20
 21static void (*_prom_putchar) (unsigned char);
 22
 23static inline void prom_putchar_wait(void __iomem *reg, u32 mask, u32 val)
 24{
 25	u32 t;
 26
 27	do {
 28		t = __raw_readl(reg);
 29		if ((t & mask) == val)
 30			break;
 31	} while (1);
 32}
 33
 34#define BOTH_EMPTY (UART_LSR_TEMT | UART_LSR_THRE)
 35
 36static void prom_putchar_ar71xx(unsigned char ch)
 37{
 38	void __iomem *base = (void __iomem *)(KSEG1ADDR(AR71XX_UART_BASE));
 39
 40	prom_putchar_wait(base + UART_LSR * 4, BOTH_EMPTY, BOTH_EMPTY);
 41	__raw_writel(ch, base + UART_TX * 4);
 42	prom_putchar_wait(base + UART_LSR * 4, BOTH_EMPTY, BOTH_EMPTY);
 43}
 44
 45static void prom_putchar_ar933x(unsigned char ch)
 46{
 47	void __iomem *base = (void __iomem *)(KSEG1ADDR(AR933X_UART_BASE));
 48
 49	prom_putchar_wait(base + AR933X_UART_DATA_REG, AR933X_UART_DATA_TX_CSR,
 50			  AR933X_UART_DATA_TX_CSR);
 51	__raw_writel(AR933X_UART_DATA_TX_CSR | ch, base + AR933X_UART_DATA_REG);
 52	prom_putchar_wait(base + AR933X_UART_DATA_REG, AR933X_UART_DATA_TX_CSR,
 53			  AR933X_UART_DATA_TX_CSR);
 54}
 55
 56static void prom_putchar_dummy(unsigned char ch)
 57{
 58	/* nothing to do */
 59}
 60
 61static void prom_putchar_init(void)
 62{
 63	void __iomem *base;
 64	u32 id;
 65
 66	base = (void __iomem *)(KSEG1ADDR(AR71XX_RESET_BASE));
 67	id = __raw_readl(base + AR71XX_RESET_REG_REV_ID);
 68	id &= REV_ID_MAJOR_MASK;
 69
 70	switch (id) {
 71	case REV_ID_MAJOR_AR71XX:
 72	case REV_ID_MAJOR_AR7240:
 73	case REV_ID_MAJOR_AR7241:
 74	case REV_ID_MAJOR_AR7242:
 75	case REV_ID_MAJOR_AR913X:
 76	case REV_ID_MAJOR_AR9341:
 77	case REV_ID_MAJOR_AR9342:
 78	case REV_ID_MAJOR_AR9344:
 79	case REV_ID_MAJOR_QCA9556:
 80	case REV_ID_MAJOR_QCA9558:
 81		_prom_putchar = prom_putchar_ar71xx;
 82		break;
 83
 84	case REV_ID_MAJOR_AR9330:
 85	case REV_ID_MAJOR_AR9331:
 86		_prom_putchar = prom_putchar_ar933x;
 87		break;
 88
 89	default:
 90		_prom_putchar = prom_putchar_dummy;
 91		break;
 92	}
 93}
 94
 95void prom_putchar(unsigned char ch)
 96{
 97	if (!_prom_putchar)
 98		prom_putchar_init();
 99
100	_prom_putchar(ch);
101}