source: trunk/target/linux/ar71xx/files/arch/mips/ar71xx/prom.c @ 13488

Last change on this file since 13488 was 13488, checked in by juhosg, 9 years ago

[ar71xx] update mips_machine stuff

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.6 KB
Line 
1/*
2 *  Atheros AR71xx SoC specific prom routines
3 *
4 *  Copyright (C) 2008 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/kernel.h>
13#include <linux/init.h>
14#include <linux/io.h>
15#include <linux/serial_reg.h>
16
17#include <asm/bootinfo.h>
18#include <asm/addrspace.h>
19#include <asm/fw/myloader/myloader.h>
20
21#include <asm/mach-ar71xx/ar71xx.h>
22#include <asm/mach-ar71xx/platform.h>
23
24struct board_rec {
25        char            *name;
26        unsigned long   mach_type;
27};
28
29static int ar71xx_prom_argc __initdata;
30static char **ar71xx_prom_argv __initdata;
31static char **ar71xx_prom_envp __initdata;
32
33static struct board_rec boards[] __initdata = {
34        {
35                .name           = "411",
36                .mach_type      = AR71XX_MACH_RB_411,
37        }, {
38                .name           = "433",
39                .mach_type      = AR71XX_MACH_RB_433,
40        }, {
41                .name           = "450",
42                .mach_type      = AR71XX_MACH_RB_450,
43        }, {
44                .name           = "493",
45                .mach_type      = AR71XX_MACH_RB_493,
46        }, {
47                .name           = "AW-NR580",
48                .mach_type      = AR71XX_MACH_AW_NR580,
49        }, {
50                .name           = "AP83",
51                .mach_type      = AR71XX_MACH_AP83,
52        }
53};
54
55static __init char *ar71xx_prom_getargv(const char *name)
56{
57        int len = strlen(name);
58        int i;
59
60        if (!ar71xx_prom_argv)
61                return NULL;
62
63        for (i = 0; i < ar71xx_prom_argc; i++) {
64                char *argv = ar71xx_prom_argv[i];
65
66                if (!argv)
67                        continue;
68
69                if (strncmp(name, argv, len) == 0 && (argv)[len] == '=')
70                        return argv + len + 1;
71        }
72
73        return NULL;
74}
75
76static __init char *ar71xx_prom_getenv(const char *envname)
77{
78        int len = strlen(envname);
79        char **env;
80
81        if (!ar71xx_prom_envp)
82                return NULL;
83
84        for (env = ar71xx_prom_envp; *env != NULL; env++)
85                if (strncmp(envname, *env, len) == 0 && (*env)[len] == '=')
86                        return *env + len + 1;
87
88        return NULL;
89}
90
91static __init unsigned long find_board_byname(char *name)
92{
93        int i;
94
95        for (i = 0; i < ARRAY_SIZE(boards); i++)
96                if (strcmp(name, boards[i].name) == 0)
97                        return boards[i].mach_type;
98
99        return AR71XX_MACH_GENERIC;
100}
101
102static int ar71xx_prom_init_myloader(void)
103{
104        struct myloader_info *mylo;
105
106        mylo = myloader_get_info();
107        if (!mylo)
108                return 0;
109
110        switch (mylo->did) {
111        case DEVID_COMPEX_WP543:
112                ar71xx_mach_type = AR71XX_MACH_WP543;
113                break;
114        default:
115                printk(KERN_WARNING "prom: unknown device id: %x\n",
116                                mylo->did);
117        }
118        ar71xx_set_mac_base(mylo->macs[0]);
119
120        return 1;
121}
122
123static void ar71xx_prom_init_generic(void)
124{
125        char *p;
126
127        ar71xx_prom_argc = fw_arg0;
128        ar71xx_prom_argv = (char **)fw_arg1;
129        ar71xx_prom_envp = (char **)fw_arg2;
130
131        p = ar71xx_prom_getenv("board");
132        if (!p)
133                p = ar71xx_prom_getargv("board");
134        if (p)
135                ar71xx_mach_type = find_board_byname(p);
136
137        p = ar71xx_prom_getenv("ethaddr");
138        if (!p)
139                p = ar71xx_prom_getargv("kmac");
140        if (p)
141                ar71xx_parse_mac_addr(p);
142}
143
144void __init prom_init(void)
145{
146        printk(KERN_DEBUG "prom: fw_arg0=%08x, fw_arg1=%08x, "
147                        "fw_arg2=%08x, fw_arg3=%08x\n",
148                        (unsigned int)fw_arg0, (unsigned int)fw_arg1,
149                        (unsigned int)fw_arg2, (unsigned int)fw_arg3);
150
151        ar71xx_mach_type = AR71XX_MACH_GENERIC;
152
153        if (ar71xx_prom_init_myloader())
154                return;
155
156        ar71xx_prom_init_generic();
157}
158
159void __init prom_free_prom_memory(void)
160{
161        /* We do not have to prom memory to free */
162}
163
164#define UART_READ(r) \
165        __raw_readl((void __iomem *)(KSEG1ADDR(AR71XX_UART_BASE) + 4 * (r)))
166
167#define UART_WRITE(r, v) \
168        __raw_writel((v), (void __iomem *)(KSEG1ADDR(AR71XX_UART_BASE) + 4*(r)))
169
170void prom_putchar(unsigned char ch)
171{
172        while (((UART_READ(UART_LSR)) & UART_LSR_THRE) == 0);
173        UART_WRITE(UART_TX, ch);
174        while (((UART_READ(UART_LSR)) & UART_LSR_THRE) == 0);
175}
Note: See TracBrowser for help on using the repository browser.