Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/arm/freescale/vybrid/vf_tcon.c
39537 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2014 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 Timing Controller (TCON)
31
* Chapter 58, 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_common.h>
54
55
#define TCON0_CTRL1 0x00
56
#define TCON_BYPASS (1 << 29)
57
58
struct tcon_softc {
59
struct resource *res[1];
60
bus_space_tag_t bst;
61
bus_space_handle_t bsh;
62
};
63
64
struct tcon_softc *tcon_sc;
65
66
static struct resource_spec tcon_spec[] = {
67
{ SYS_RES_MEMORY, 0, RF_ACTIVE },
68
{ -1, 0 }
69
};
70
71
uint32_t
72
tcon_bypass(void)
73
{
74
75
if (tcon_sc == NULL)
76
return (1);
77
78
WRITE4(tcon_sc, TCON0_CTRL1, TCON_BYPASS);
79
80
return (0);
81
}
82
83
static int
84
tcon_probe(device_t dev)
85
{
86
87
if (!ofw_bus_status_okay(dev))
88
return (ENXIO);
89
90
if (!ofw_bus_is_compatible(dev, "fsl,mvf600-tcon"))
91
return (ENXIO);
92
93
device_set_desc(dev, "Vybrid Family Timing Controller (TCON)");
94
return (BUS_PROBE_DEFAULT);
95
}
96
97
static int
98
tcon_attach(device_t dev)
99
{
100
struct tcon_softc *sc;
101
102
sc = device_get_softc(dev);
103
104
if (bus_alloc_resources(dev, tcon_spec, sc->res)) {
105
device_printf(dev, "could not allocate resources\n");
106
return (ENXIO);
107
}
108
109
/* Memory interface */
110
sc->bst = rman_get_bustag(sc->res[0]);
111
sc->bsh = rman_get_bushandle(sc->res[0]);
112
113
tcon_sc = sc;
114
115
return (0);
116
}
117
118
static device_method_t tcon_methods[] = {
119
DEVMETHOD(device_probe, tcon_probe),
120
DEVMETHOD(device_attach, tcon_attach),
121
{ 0, 0 }
122
};
123
124
static driver_t tcon_driver = {
125
"tcon",
126
tcon_methods,
127
sizeof(struct tcon_softc),
128
};
129
130
DRIVER_MODULE(tcon, simplebus, tcon_driver, 0, 0);
131
132