Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/arm/freescale/vybrid/vf_dmamux.c
39536 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 Direct Memory Access Multiplexer (DMAMUX)
31
* Chapter 22, 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
#include <arm/freescale/vybrid/vf_dmamux.h>
55
56
#define DMAMUX_CHCFG(n) (0x1 * n) /* Channels 0-15 Cfg Reg */
57
#define CHCFG_ENBL (1 << 7) /* Channel Enable */
58
#define CHCFG_TRIG (1 << 6) /* Channel Trigger Enable */
59
#define CHCFG_SOURCE_MASK 0x3f /* Channel Source (Slot) */
60
#define CHCFG_SOURCE_SHIFT 0
61
62
struct dmamux_softc {
63
struct resource *res[4];
64
bus_space_tag_t bst[4];
65
bus_space_handle_t bsh[4];
66
};
67
68
struct dmamux_softc *dmamux_sc;
69
70
static struct resource_spec dmamux_spec[] = {
71
{ SYS_RES_MEMORY, 0, RF_ACTIVE }, /* DMAMUX0 */
72
{ SYS_RES_MEMORY, 1, RF_ACTIVE }, /* DMAMUX1 */
73
{ SYS_RES_MEMORY, 2, RF_ACTIVE }, /* DMAMUX2 */
74
{ SYS_RES_MEMORY, 3, RF_ACTIVE }, /* DMAMUX3 */
75
{ -1, 0 }
76
};
77
78
static int
79
dmamux_probe(device_t dev)
80
{
81
82
if (!ofw_bus_status_okay(dev))
83
return (ENXIO);
84
85
if (!ofw_bus_is_compatible(dev, "fsl,mvf600-dmamux"))
86
return (ENXIO);
87
88
device_set_desc(dev, "Vybrid Family Direct Memory Access Multiplexer");
89
return (BUS_PROBE_DEFAULT);
90
}
91
92
int
93
dmamux_configure(int mux, int source, int channel, int enable)
94
{
95
struct dmamux_softc *sc;
96
int reg;
97
98
sc = dmamux_sc;
99
100
MUX_WRITE1(sc, mux, DMAMUX_CHCFG(channel), 0x0);
101
102
reg = 0;
103
if (enable)
104
reg |= (CHCFG_ENBL);
105
106
reg &= ~(CHCFG_SOURCE_MASK << CHCFG_SOURCE_SHIFT);
107
reg |= (source << CHCFG_SOURCE_SHIFT);
108
109
MUX_WRITE1(sc, mux, DMAMUX_CHCFG(channel), reg);
110
111
return (0);
112
}
113
114
static int
115
dmamux_attach(device_t dev)
116
{
117
struct dmamux_softc *sc;
118
int i;
119
120
sc = device_get_softc(dev);
121
122
if (bus_alloc_resources(dev, dmamux_spec, sc->res)) {
123
device_printf(dev, "could not allocate resources\n");
124
return (ENXIO);
125
}
126
127
/* Memory interface */
128
for (i = 0; i < 4; i++) {
129
sc->bst[i] = rman_get_bustag(sc->res[i]);
130
sc->bsh[i] = rman_get_bushandle(sc->res[i]);
131
}
132
133
dmamux_sc = sc;
134
135
return (0);
136
}
137
138
static device_method_t dmamux_methods[] = {
139
DEVMETHOD(device_probe, dmamux_probe),
140
DEVMETHOD(device_attach, dmamux_attach),
141
{ 0, 0 }
142
};
143
144
static driver_t dmamux_driver = {
145
"dmamux",
146
dmamux_methods,
147
sizeof(struct dmamux_softc),
148
};
149
150
DRIVER_MODULE(dmamux, simplebus, dmamux_driver, 0, 0);
151
152