Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/arm/freescale/vybrid/vf_src.c
39537 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2013 Ruslan Bukin <[email protected]>
5
* All rights reserved.
6
*
7
* Redistribution and use in source and binary forms, with or without
8
* modification, are permitted provided that the following conditions
9
* are met:
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
* 2. Redistributions in binary form must reproduce the above copyright
13
* notice, this list of conditions and the following disclaimer in the
14
* documentation and/or other materials provided with the distribution.
15
*
16
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26
* SUCH DAMAGE.
27
*/
28
29
/*
30
* Vybrid Family System Reset Controller (SRC)
31
* Chapter 18, Vybrid Reference Manual, Rev. 5, 07/2013
32
*/
33
34
#include <sys/param.h>
35
#include <sys/systm.h>
36
#include <sys/bus.h>
37
#include <sys/kernel.h>
38
#include <sys/module.h>
39
#include <sys/malloc.h>
40
#include <sys/rman.h>
41
#include <sys/timeet.h>
42
#include <sys/timetc.h>
43
#include <sys/watchdog.h>
44
45
#include <dev/ofw/openfirm.h>
46
#include <dev/ofw/ofw_bus.h>
47
#include <dev/ofw/ofw_bus_subr.h>
48
49
#include <machine/bus.h>
50
#include <machine/cpu.h>
51
#include <machine/intr.h>
52
53
#include <arm/freescale/vybrid/vf_src.h>
54
#include <arm/freescale/vybrid/vf_common.h>
55
56
#define SRC_SCR 0x00 /* SRC Control Register */
57
#define SRC_SBMR1 0x04 /* SRC Boot Mode Register 1 */
58
#define SRC_SRSR 0x08 /* SRC Status Register */
59
#define SRC_SECR 0x0C /* SRC_SECR */
60
#define SRC_SICR 0x14 /* SRC Reset Interrupt Configuration Register */
61
#define SRC_SIMR 0x18 /* SRC Interrupt Masking Register */
62
#define SRC_SBMR2 0x1C /* SRC Boot Mode Register 2 */
63
#define SRC_GPR0 0x20 /* General Purpose Register */
64
#define SRC_GPR1 0x24 /* General Purpose Register */
65
#define SRC_GPR2 0x28 /* General Purpose Register */
66
#define SRC_GPR3 0x2C /* General Purpose Register */
67
#define SRC_GPR4 0x30 /* General Purpose Register */
68
#define SRC_MISC0 0x4C /* MISC0 */
69
#define SRC_MISC1 0x50 /* MISC1 */
70
#define SRC_MISC2 0x54 /* MISC2 */
71
#define SRC_MISC3 0x58 /* MISC3 */
72
73
struct src_softc {
74
struct resource *res[1];
75
bus_space_tag_t bst;
76
bus_space_handle_t bsh;
77
};
78
79
struct src_softc *src_sc;
80
81
static struct resource_spec src_spec[] = {
82
{ SYS_RES_MEMORY, 0, RF_ACTIVE },
83
{ -1, 0 }
84
};
85
86
int
87
src_swreset(void)
88
{
89
90
if (src_sc == NULL)
91
return (1);
92
93
WRITE4(src_sc, SRC_SCR, SW_RST);
94
95
return (0);
96
}
97
98
static int
99
src_probe(device_t dev)
100
{
101
102
if (!ofw_bus_status_okay(dev))
103
return (ENXIO);
104
105
if (!ofw_bus_is_compatible(dev, "fsl,mvf600-src"))
106
return (ENXIO);
107
108
device_set_desc(dev, "Vybrid Family System Reset Controller");
109
return (BUS_PROBE_DEFAULT);
110
}
111
112
static int
113
src_attach(device_t dev)
114
{
115
struct src_softc *sc;
116
117
sc = device_get_softc(dev);
118
119
if (bus_alloc_resources(dev, src_spec, sc->res)) {
120
device_printf(dev, "could not allocate resources\n");
121
return (ENXIO);
122
}
123
124
/* Memory interface */
125
sc->bst = rman_get_bustag(sc->res[0]);
126
sc->bsh = rman_get_bushandle(sc->res[0]);
127
128
src_sc = sc;
129
130
return (0);
131
}
132
133
static device_method_t src_methods[] = {
134
DEVMETHOD(device_probe, src_probe),
135
DEVMETHOD(device_attach, src_attach),
136
{ 0, 0 }
137
};
138
139
static driver_t src_driver = {
140
"src",
141
src_methods,
142
sizeof(struct src_softc),
143
};
144
145
DRIVER_MODULE(src, simplebus, src_driver, 0, 0);
146
147