lpc_machdep.c revision 257199
1169691Skan/*-
2169691Skan * Copyright (c) 1994-1998 Mark Brinicombe.
3169691Skan * Copyright (c) 1994 Brini.
4169691Skan * All rights reserved.
5169691Skan *
6169691Skan * This code is derived from software written for Brini by Mark Brinicombe
7169691Skan *
8169691Skan * Redistribution and use in source and binary forms, with or without
9169691Skan * modification, are permitted provided that the following conditions
10169691Skan * are met:
11169691Skan * 1. Redistributions of source code must retain the above copyright
12169691Skan *    notice, this list of conditions and the following disclaimer.
13169691Skan * 2. Redistributions in binary form must reproduce the above copyright
14169691Skan *    notice, this list of conditions and the following disclaimer in the
15169691Skan *    documentation and/or other materials provided with the distribution.
16169691Skan * 3. All advertising materials mentioning features or use of this software
17169691Skan *    must display the following acknowledgement:
18169691Skan *      This product includes software developed by Brini.
19169691Skan * 4. The name of the company nor the name of the author may be used to
20169691Skan *    endorse or promote products derived from this software without specific
21169691Skan *    prior written permission.
22169691Skan *
23169691Skan * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
24169691Skan * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25169691Skan * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26169691Skan * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27169691Skan * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28169691Skan * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
29169691Skan * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30169691Skan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31169691Skan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32169691Skan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33169691Skan * SUCH DAMAGE.
34169691Skan *
35169691Skan * from: FreeBSD: //depot/projects/arm/src/sys/arm/at91/kb920x_machdep.c, rev 45
36169691Skan */
37169691Skan
38169691Skan#include "opt_ddb.h"
39169691Skan#include "opt_platform.h"
40169691Skan
41169691Skan#include <sys/cdefs.h>
42169691Skan__FBSDID("$FreeBSD: head/sys/arm/lpc/lpc_machdep.c 257199 2013-10-27 00:51:46Z ian $");
43169691Skan
44169691Skan#define _ARM32_BUS_DMA_PRIVATE
45169691Skan#include <sys/param.h>
46169691Skan#include <sys/systm.h>
47169691Skan#include <sys/bus.h>
48169691Skan
49169691Skan#include <vm/vm.h>
50169691Skan#include <vm/pmap.h>
51169691Skan
52169691Skan#include <machine/bus.h>
53169691Skan#include <machine/frame.h> /* For trapframe_t, used in <machine/machdep.h> */
54169691Skan#include <machine/machdep.h>
55169691Skan
56169691Skan#include <arm/lpc/lpcreg.h>
57169691Skan#include <arm/lpc/lpcvar.h>
58169691Skan
59169691Skan#include <dev/fdt/fdt_common.h>
60169691Skan#include <dev/ic/ns16550.h>
61169691Skan
62169691Skanvm_offset_t
63169691Skaninitarm_lastaddr(void)
64169691Skan{
65169691Skan
66169691Skan	if (fdt_immr_addr(LPC_DEV_BASE) != 0)
67169691Skan		while (1);
68169691Skan
69169691Skan	/* Platform-specific initialisation */
70169691Skan	return (fdt_immr_va - ARM_NOCACHE_KVA_SIZE);
71169691Skan}
72169691Skan
73169691Skanvoid
74169691Skaninitarm_gpio_init(void)
75169691Skan{
76169691Skan
77169691Skan	/*
78169691Skan	 * Set initial values of GPIO output ports
79169691Skan	 */
80169691Skan	platform_gpio_init();
81169691Skan}
82169691Skan
83169691Skanvoid
84169691Skaninitarm_late_init(void)
85169691Skan{
86169691Skan}
87169691Skan
88169691Skan#define FDT_DEVMAP_MAX	(1 + 2 + 1 + 1)
89169691Skanstatic struct pmap_devmap fdt_devmap[FDT_DEVMAP_MAX] = {
90169691Skan	{ 0, 0, 0, 0, 0, }
91169691Skan};
92169691Skan
93169691Skan/*
94169691Skan * Construct pmap_devmap[] with DT-derived config data.
95169691Skan */
96169691Skanint
97169691Skanplatform_devmap_init(void)
98169691Skan{
99169691Skan
100169691Skan	/*
101169691Skan	 * IMMR range.
102169691Skan	 */
103169691Skan	fdt_devmap[0].pd_va = fdt_immr_va;
104169691Skan	fdt_devmap[0].pd_pa = fdt_immr_pa;
105169691Skan	fdt_devmap[0].pd_size = fdt_immr_size;
106169691Skan	fdt_devmap[0].pd_prot = VM_PROT_READ | VM_PROT_WRITE;
107169691Skan	fdt_devmap[0].pd_cache = PTE_NOCACHE;
108169691Skan
109169691Skan	pmap_devmap_bootstrap_table = &fdt_devmap[0];
110169691Skan	return (0);
111169691Skan}
112169691Skan
113169691Skanstruct arm32_dma_range *
114169691Skanbus_dma_get_range(void)
115169691Skan{
116169691Skan
117169691Skan	return (NULL);
118169691Skan}
119169691Skan
120169691Skanint
121169691Skanbus_dma_get_range_nb(void)
122169691Skan{
123169691Skan
124169691Skan	return (0);
125169691Skan}
126169691Skan
127169691Skanvoid
128169691Skancpu_reset(void)
129169691Skan{
130169691Skan	/* Enable WDT */
131169691Skan	bus_space_write_4(fdtbus_bs_tag,
132	    LPC_CLKPWR_BASE, LPC_CLKPWR_TIMCLK_CTRL,
133	    LPC_CLKPWR_TIMCLK_CTRL_WATCHDOG);
134
135	/* Instant assert of RESETOUT_N with pulse length 1ms */
136	bus_space_write_4(fdtbus_bs_tag, LPC_WDTIM_BASE, LPC_WDTIM_PULSE, 13000);
137	bus_space_write_4(fdtbus_bs_tag, LPC_WDTIM_BASE, LPC_WDTIM_MCTRL, 0x70);
138
139	for (;;);
140}
141
142