Module Name: src
Committed By: reinoud
Date: Mon Sep 29 14:47:53 UTC 2014
Modified Files:
src/sys/arch/arm/samsung: exynos_reg.h exynos_soc.c exynos_var.h
exynos_wdt.c
Log Message:
Phase 2 of samsung/exynos_* cleanup
To generate a diff of this commit:
cvs rdiff -u -r1.11 -r1.12 src/sys/arch/arm/samsung/exynos_reg.h
cvs rdiff -u -r1.20 -r1.21 src/sys/arch/arm/samsung/exynos_soc.c
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/samsung/exynos_var.h
cvs rdiff -u -r1.4 -r1.5 src/sys/arch/arm/samsung/exynos_wdt.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/arch/arm/samsung/exynos_reg.h
diff -u src/sys/arch/arm/samsung/exynos_reg.h:1.11 src/sys/arch/arm/samsung/exynos_reg.h:1.12
--- src/sys/arch/arm/samsung/exynos_reg.h:1.11 Tue Sep 9 21:24:10 2014
+++ src/sys/arch/arm/samsung/exynos_reg.h Mon Sep 29 14:47:52 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: exynos_reg.h,v 1.11 2014/09/09 21:24:10 reinoud Exp $ */
+/* $NetBSD: exynos_reg.h,v 1.12 2014/09/29 14:47:52 reinoud Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -182,6 +182,7 @@
#define PMU_PHY_ENABLE (1 << 0)
#define PMU_PHY_DISABLE (0)
+#define EXYNOS_PMU_DEBUG_CLKOUT 0x0A00
/* used SYSREG registers */
#define EXYNOS5_SYSREG_USB20_PHY_TYPE 0x230
Index: src/sys/arch/arm/samsung/exynos_soc.c
diff -u src/sys/arch/arm/samsung/exynos_soc.c:1.20 src/sys/arch/arm/samsung/exynos_soc.c:1.21
--- src/sys/arch/arm/samsung/exynos_soc.c:1.20 Fri Sep 5 08:01:05 2014
+++ src/sys/arch/arm/samsung/exynos_soc.c Mon Sep 29 14:47:52 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: exynos_soc.c,v 1.20 2014/09/05 08:01:05 skrll Exp $ */
+/* $NetBSD: exynos_soc.c,v 1.21 2014/09/29 14:47:52 reinoud Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
#define _ARM32_BUS_DMA_PRIVATE
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: exynos_soc.c,v 1.20 2014/09/05 08:01:05 skrll Exp $");
+__KERNEL_RCSID(1, "$NetBSD: exynos_soc.c,v 1.21 2014/09/29 14:47:52 reinoud Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -62,14 +62,11 @@ __KERNEL_RCSID(1, "$NetBSD: exynos_soc.c
/* XXXNH */
#include <evbarm/odroid/platform.h>
-bus_space_handle_t exynos_core_bsh;
-bus_space_handle_t exynos_audiocore_bsh;
/* these variables are retrieved in start.S and stored in .data */
uint32_t exynos_soc_id = 0;
uint32_t exynos_pop_id = 0;
-
/* cpu frequencies */
struct cpu_freq {
uint64_t freq;
@@ -123,10 +120,18 @@ static int cpu_freq_target = 0;
#define NFRQS 15
static char sysctl_cpu_freqs_txt[NFRQS*5];
+bus_space_handle_t exynos_core_bsh;
+bus_space_handle_t exynos_audiocore_bsh;
+
+bus_space_handle_t exynos_wdt_bsh;
+bus_space_handle_t exynos_pmu_bsh;
+bus_space_handle_t exynos_cmu_bsh;
+bus_space_handle_t exynos_cmu_apll_bsh;
+
+
static int sysctl_cpufreq_target(SYSCTLFN_ARGS);
static int sysctl_cpufreq_current(SYSCTLFN_ARGS);
-
/*
* the early serial console
*/
@@ -326,21 +331,11 @@ exynos_sysctl_cpufreq_init(void)
uint64_t
exynos_get_cpufreq(void)
{
- uint32_t reg = 0;
uint32_t regval;
uint32_t freq;
-#ifdef EXYNOS4
- if (IS_EXYNOS4_P())
- reg = EXYNOS4_CMU_APLL + PLL_CON0_OFFSET;
-#endif
-#ifdef EXYNOS5
- if (IS_EXYNOS5_P())
- reg = EXYNOS5_CMU_APLL + PLL_CON0_OFFSET;
-#endif
- KASSERT(reg);
-
- regval = bus_space_read_4(&exynos_bs_tag, exynos_core_bsh, reg);
+ regval = bus_space_read_4(&exynos_bs_tag, exynos_cmu_apll_bsh,
+ PLL_CON0_OFFSET);
freq = PLL_FREQ(EXYNOS_F_IN_FREQ, regval);
return freq;
@@ -351,7 +346,6 @@ static void
exynos_set_cpufreq(const struct cpu_freq *freqreq)
{
struct cpu_info *ci;
- uint32_t reg = 0;
uint32_t regval;
int M, P, S;
int cii;
@@ -364,19 +358,10 @@ exynos_set_cpufreq(const struct cpu_freq
__SHIFTIN(P, PLL_CON0_P) |
__SHIFTIN(S, PLL_CON0_S);
-#ifdef EXYNOS4
- if (IS_EXYNOS4_P())
- reg = EXYNOS4_CMU_APLL + PLL_CON0_OFFSET;
-#endif
-#ifdef EXYNOS5
- if (IS_EXYNOS5_P())
- reg = EXYNOS5_CMU_APLL + PLL_CON0_OFFSET;
-#endif
- KASSERT(reg);
-
/* enable PPL and write config */
regval |= PLL_CON0_ENABLE;
- bus_space_write_4(&exynos_bs_tag, exynos_core_bsh, reg, regval);
+ bus_space_write_4(&exynos_bs_tag, exynos_cmu_apll_bsh, PLL_CON0_OFFSET,
+ regval);
/* update our cycle counter i.e. our CPU frequency for all CPUs */
for (CPU_INFO_FOREACH(cii, ci)) {
@@ -449,7 +434,7 @@ sysctl_cpufreq_current(SYSCTLFN_ARGS)
#ifdef VERBOSE_INIT_ARM
#define DUMP_PLL(v, var) \
reg = EXYNOS##v##_CMU_##var + PLL_CON0_OFFSET;\
- regval = bus_space_read_4(&exynos_bs_tag, exynos_core_bsh, reg); \
+ regval = bus_space_read_4(&exynos_bs_tag, exynos_cmu_bsh, reg); \
freq = PLL_FREQ(EXYNOS_F_IN_FREQ, regval); \
printf("%8s at %d Mhz\n", #var, freq/(1000*1000));
@@ -463,44 +448,43 @@ exynos_dump_clocks(void)
printf("Initial PLL settings\n");
#ifdef EXYNOS4
- if (IS_EXYNOS4_P()) {
- DUMP_PLL(4, APLL);
- DUMP_PLL(4, MPLL);
- DUMP_PLL(4, EPLL);
- DUMP_PLL(4, VPLL);
- }
+ DUMP_PLL(4, APLL);
+ DUMP_PLL(4, MPLL);
+ DUMP_PLL(4, EPLL);
+ DUMP_PLL(4, VPLL);
#endif
#ifdef EXYNOS5
- if (IS_EXYNOS5_P()) {
- DUMP_PLL(5, APLL);
- DUMP_PLL(5, MPLL);
- DUMP_PLL(5, EPLL);
- DUMP_PLL(5, VPLL);
- DUMP_PLL(5, CPLL);
- DUMP_PLL(5, GPLL);
- DUMP_PLL(5, BPLL);
- }
+ DUMP_PLL(5, APLL);
+ DUMP_PLL(5, MPLL);
+ DUMP_PLL(5, EPLL);
+ DUMP_PLL(5, VPLL);
+ DUMP_PLL(5, CPLL);
+ DUMP_PLL(5, GPLL);
+ DUMP_PLL(5, BPLL);
#endif
}
#undef DUMP_PLL
#endif
-void
-exynos_clocks_bootstrap(void)
+/* XXX clock stuff needs major work XXX */
+static void
+exynos_init_clkout_for_usb(void)
{
#ifdef EXYNOS4
- if (IS_EXYNOS4_P()) {
- cpu_freq_settings = cpu_freq_settings_exynos4;
- ncpu_freq_settings = __arraycount(cpu_freq_settings_exynos4);
- }
+ bus_space_write_4(&exynos_bs_tag, exynos_pmu_bsh,
+ EXYNOS_PMU_DEBUG_CLKOUT, 0x900);
#endif
#ifdef EXYNOS5
- if (IS_EXYNOS5_P()) {
- cpu_freq_settings = cpu_freq_settings_exynos5;
- ncpu_freq_settings = __arraycount(cpu_freq_settings_exynos5);
- }
+ bus_space_write_4(&exynos_bs_tag, exynos_pmu_bsh,
+ EXYNOS_PMU_DEBUG_CLKOUT, 0x1000);
#endif
+}
+
+
+void
+exynos_clocks_bootstrap(void)
+{
KASSERT(ncpu_freq_settings != 0);
KASSERT(ncpu_freq_settings < NFRQS);
@@ -510,6 +494,9 @@ exynos_clocks_bootstrap(void)
/* set max cpufreq */
exynos_set_cpufreq(&cpu_freq_settings[ncpu_freq_settings-1]);
+
+ /* set external USB frequency to XCLKOUT */
+ exynos_init_clkout_for_usb();
}
@@ -518,25 +505,11 @@ exynos_bootstrap(vaddr_t iobase, vaddr_t
{
int error;
size_t core_size, audiocore_size;
- size_t audiocore_pbase, audiocore_vbase __diagused;
-
-#ifdef EXYNOS4
- if (IS_EXYNOS4_P()) {
- core_size = EXYNOS4_CORE_SIZE;
- audiocore_size = EXYNOS4_AUDIOCORE_SIZE;
- audiocore_pbase = EXYNOS4_AUDIOCORE_PBASE;
- audiocore_vbase = EXYNOS4_AUDIOCORE_VBASE;
- }
-#endif
-
-#ifdef EXYNOS5
- if (IS_EXYNOS5_P()) {
- core_size = EXYNOS5_CORE_SIZE;
- audiocore_size = EXYNOS5_AUDIOCORE_SIZE;
- audiocore_pbase = EXYNOS5_AUDIOCORE_PBASE;
- audiocore_vbase = EXYNOS5_AUDIOCORE_VBASE;
- }
-#endif
+ bus_addr_t audiocore_pbase;
+ bus_addr_t audiocore_vbase __diagused;
+ bus_addr_t exynos_wdt_offset;
+ bus_addr_t exynos_pmu_offset;
+ bus_addr_t exynos_cmu_apll_offset;
/* set up early console so we can use printf() and friends */
#ifdef EXYNOS_CONSOLE_EARLY
@@ -544,6 +517,33 @@ exynos_bootstrap(vaddr_t iobase, vaddr_t
cn_tab = &exynos_earlycons;
printf("Exynos early console operational\n\n");
#endif
+
+#ifdef EXYNOS4
+ core_size = EXYNOS4_CORE_SIZE;
+ audiocore_size = EXYNOS4_AUDIOCORE_SIZE;
+ audiocore_pbase = EXYNOS4_AUDIOCORE_PBASE;
+ audiocore_vbase = EXYNOS4_AUDIOCORE_VBASE;
+ exynos_wdt_offset = EXYNOS4_WDT_OFFSET;
+ exynos_pmu_offset = EXYNOS4_PMU_OFFSET;
+ exynos_cmu_apll_offset = EXYNOS4_CMU_APLL;
+
+ cpu_freq_settings = cpu_freq_settings_exynos4;
+ ncpu_freq_settings = __arraycount(cpu_freq_settings_exynos4);
+#endif
+
+#ifdef EXYNOS5
+ core_size = EXYNOS5_CORE_SIZE;
+ audiocore_size = EXYNOS5_AUDIOCORE_SIZE;
+ audiocore_pbase = EXYNOS5_AUDIOCORE_PBASE;
+ audiocore_vbase = EXYNOS5_AUDIOCORE_VBASE;
+ exynos_wdt_offset = EXYNOS5_WDT_OFFSET;
+ exynos_pmu_offset = EXYNOS5_PMU_OFFSET;
+ exynos_cmu_apll_offset = EXYNOS5_CMU_APLL;
+
+ cpu_freq_settings = cpu_freq_settings_exynos5;
+ ncpu_freq_settings = __arraycount(cpu_freq_settings_exynos5);
+#endif
+
/* map in the exynos io registers */
error = bus_space_map(&exynos_bs_tag, EXYNOS_CORE_PBASE,
core_size, 0, &exynos_core_bsh);
@@ -559,6 +559,26 @@ exynos_bootstrap(vaddr_t iobase, vaddr_t
__func__, error);
KASSERT(exynos_audiocore_bsh == audiocore_vbase);
+ /* map in commonly used subregions and common used register banks */
+ error = bus_space_subregion(&exynos_bs_tag, exynos_core_bsh,
+ exynos_wdt_offset, EXYNOS_BLOCK_SIZE, &exynos_wdt_bsh);
+ if (error)
+ panic("%s: failed to subregion wdt registers: %d",
+ __func__, error);
+
+ error = bus_space_subregion(&exynos_bs_tag, exynos_core_bsh,
+ exynos_pmu_offset, EXYNOS_BLOCK_SIZE, &exynos_pmu_bsh);
+ if (error)
+ panic("%s: failed to subregion pmu registers: %d",
+ __func__, error);
+
+ exynos_cmu_bsh = exynos_core_bsh;
+ error = bus_space_subregion(&exynos_bs_tag, exynos_cmu_bsh,
+ exynos_cmu_apll_offset, 0xfff, &exynos_cmu_apll_bsh);
+ if (error)
+ panic("%s: failed to subregion cmu apll registers: %d",
+ __func__, error);
+
/* init bus dma tags */
exynos_dma_bootstrap(physmem * PAGE_SIZE);
@@ -590,7 +610,7 @@ exynos_device_register(device_t self, vo
extern uint32_t exynos_soc_id;
switch (EXYNOS_PRODUCT_ID(exynos_soc_id)) {
-#if defined(EXYNOS5)
+#ifdef EXYNOS5
case 0xe5410:
/* offsets not changed on matt's request */
#if 0
@@ -600,7 +620,7 @@ exynos_device_register(device_t self, vo
#endif
break;
#endif
-#if defined(EXYNOS4)
+#ifdef EXYNOS4
case 0xe4410:
case 0xe4412: {
struct mpcore_attach_args * const mpcaa = aux;
Index: src/sys/arch/arm/samsung/exynos_var.h
diff -u src/sys/arch/arm/samsung/exynos_var.h:1.15 src/sys/arch/arm/samsung/exynos_var.h:1.16
--- src/sys/arch/arm/samsung/exynos_var.h:1.15 Fri Sep 5 08:01:05 2014
+++ src/sys/arch/arm/samsung/exynos_var.h Mon Sep 29 14:47:52 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: exynos_var.h,v 1.15 2014/09/05 08:01:05 skrll Exp $ */
+/* $NetBSD: exynos_var.h,v 1.16 2014/09/29 14:47:52 reinoud Exp $ */
/*-
* Copyright (c) 2013, 2014 The NetBSD Foundation, Inc.
@@ -69,6 +69,7 @@ extern uint32_t exynos_pop_id;
#define IS_EXYNOS5_P() (EXYNOS_PRODUCT_FAMILY(exynos_soc_id) == EXYNOS5_PRODUCT_FAMILY)
+
struct exyo_locators {
const char *loc_name;
bus_size_t loc_offset;
@@ -115,6 +116,9 @@ extern struct arm32_bus_dma_tag exynos_b
extern struct arm32_bus_dma_tag exynos_coherent_bus_dma_tag;
extern bus_space_handle_t exynos_core_bsh;
+extern bus_space_handle_t exynos_wdt_bsh;
+extern bus_space_handle_t exynos_pmu_bsh;
+extern bus_space_handle_t exynos_cmu_bsh;
extern void exynos_bootstrap(vaddr_t, vaddr_t);
extern void exynos_dma_bootstrap(psize_t memsize);
Index: src/sys/arch/arm/samsung/exynos_wdt.c
diff -u src/sys/arch/arm/samsung/exynos_wdt.c:1.4 src/sys/arch/arm/samsung/exynos_wdt.c:1.5
--- src/sys/arch/arm/samsung/exynos_wdt.c:1.4 Sat Apr 19 16:43:08 2014
+++ src/sys/arch/arm/samsung/exynos_wdt.c Mon Sep 29 14:47:52 2014
@@ -1,4 +1,4 @@
-/* $NetBSD: exynos_wdt.c,v 1.4 2014/04/19 16:43:08 reinoud Exp $ */
+/* $NetBSD: exynos_wdt.c,v 1.5 2014/09/29 14:47:52 reinoud Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
#include "exynos_wdt.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exynos_wdt.c,v 1.4 2014/04/19 16:43:08 reinoud Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exynos_wdt.c,v 1.5 2014/09/29 14:47:52 reinoud Exp $");
#include <sys/param.h>
#include <sys/bus.h>
@@ -44,6 +44,7 @@ __KERNEL_RCSID(0, "$NetBSD: exynos_wdt.c
#include <dev/sysmon/sysmonvar.h>
+#include <arm/samsung/exynos_io.h>
#include <arm/samsung/exynos_reg.h>
#include <arm/samsung/exynos_var.h>
@@ -268,24 +269,12 @@ void
exynos_wdt_reset(void)
{
bus_space_tag_t bst = &exynos_bs_tag;
- bus_space_handle_t bsh = exynos_core_bsh;
- bus_addr_t wdt_offset = 0;
-#ifdef EXYNOS4
- if (IS_EXYNOS4_P()) {
- wdt_offset = EXYNOS4_WDT_OFFSET;
- }
-#endif
-#ifdef EXYNOS5
- if (IS_EXYNOS5_P()) {
- wdt_offset = EXYNOS5_WDT_OFFSET;
- }
-#endif
- KASSERT(wdt_offset);
-
+ bus_space_handle_t bsh = exynos_wdt_bsh;
+
(void) splhigh();
- bus_space_write_4(bst, bsh, wdt_offset + EXYNOS_WDT_WTCON, 0);
- bus_space_write_4(bst, bsh, wdt_offset + EXYNOS_WDT_WTCNT, 1);
- bus_space_write_4(bst, bsh, wdt_offset + EXYNOS_WDT_WTCON,
+ bus_space_write_4(bst, bsh, EXYNOS_WDT_WTCON, 0);
+ bus_space_write_4(bst, bsh, EXYNOS_WDT_WTCNT, 1);
+ bus_space_write_4(bst, bsh, EXYNOS_WDT_WTCON,
WTCON_ENABLE | WTCON_RESET_ENABLE);
}