| /* |
| * This program is free software; you can redistribute it and/or modify it |
| * under the terms of the GNU General Public License version 2 as published |
| * by the Free Software Foundation. |
| * |
| * Copyright (C) 2010 John Crispin <blogic@openwrt.org> |
| */ |
| |
| #include <linux/module.h> |
| #include <linux/clk.h> |
| #include <asm/bootinfo.h> |
| #include <asm/time.h> |
| |
| #include <lantiq.h> |
| |
| #include "prom.h" |
| #include "clk.h" |
| |
| static struct ltq_soc_info soc_info; |
| |
| unsigned int ltq_get_cpu_ver(void) |
| { |
| return soc_info.rev; |
| } |
| EXPORT_SYMBOL(ltq_get_cpu_ver); |
| |
| unsigned int ltq_get_soc_type(void) |
| { |
| return soc_info.type; |
| } |
| EXPORT_SYMBOL(ltq_get_soc_type); |
| |
| const char *get_system_type(void) |
| { |
| return soc_info.sys_type; |
| } |
| |
| void prom_free_prom_memory(void) |
| { |
| } |
| |
| static void __init prom_init_cmdline(void) |
| { |
| int argc = fw_arg0; |
| char **argv = (char **) KSEG1ADDR(fw_arg1); |
| int i; |
| |
| for (i = 0; i < argc; i++) { |
| char *p = (char *) KSEG1ADDR(argv[i]); |
| |
| if (p && *p) { |
| strlcat(arcs_cmdline, p, sizeof(arcs_cmdline)); |
| strlcat(arcs_cmdline, " ", sizeof(arcs_cmdline)); |
| } |
| } |
| } |
| |
| void __init prom_init(void) |
| { |
| struct clk *clk; |
| |
| ltq_soc_detect(&soc_info); |
| clk_init(); |
| clk = clk_get(0, "cpu"); |
| snprintf(soc_info.sys_type, LTQ_SYS_TYPE_LEN - 1, "%s rev1.%d", |
| soc_info.name, soc_info.rev); |
| clk_put(clk); |
| soc_info.sys_type[LTQ_SYS_TYPE_LEN - 1] = '\0'; |
| pr_info("SoC: %s\n", soc_info.sys_type); |
| prom_init_cmdline(); |
| } |