xref: /freebsd/sys/dev/sound/fdt/dummy_codec.c (revision 2cfe870acdecd35b621932f2b0cb702c48ce087a)
1*2cfe870aSOleksandr Tymoshenko /*-
2*2cfe870aSOleksandr Tymoshenko  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3*2cfe870aSOleksandr Tymoshenko  *
4*2cfe870aSOleksandr Tymoshenko  * Copyright (c) 2020 Oleksandr Tymoshenko <gonzo@FreeBSD.org>
5*2cfe870aSOleksandr Tymoshenko  *
6*2cfe870aSOleksandr Tymoshenko  * Redistribution and use in source and binary forms, with or without
7*2cfe870aSOleksandr Tymoshenko  * modification, are permitted provided that the following conditions
8*2cfe870aSOleksandr Tymoshenko  * are met:
9*2cfe870aSOleksandr Tymoshenko  * 1. Redistributions of source code must retain the above copyright
10*2cfe870aSOleksandr Tymoshenko  *    notice, this list of conditions and the following disclaimer.
11*2cfe870aSOleksandr Tymoshenko  * 2. Redistributions in binary form must reproduce the above copyright
12*2cfe870aSOleksandr Tymoshenko  *    notice, this list of conditions and the following disclaimer in the
13*2cfe870aSOleksandr Tymoshenko  *    documentation and/or other materials provided with the distribution.
14*2cfe870aSOleksandr Tymoshenko  *
15*2cfe870aSOleksandr Tymoshenko  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16*2cfe870aSOleksandr Tymoshenko  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*2cfe870aSOleksandr Tymoshenko  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*2cfe870aSOleksandr Tymoshenko  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19*2cfe870aSOleksandr Tymoshenko  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
20*2cfe870aSOleksandr Tymoshenko  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
21*2cfe870aSOleksandr Tymoshenko  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
22*2cfe870aSOleksandr Tymoshenko  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23*2cfe870aSOleksandr Tymoshenko  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24*2cfe870aSOleksandr Tymoshenko  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25*2cfe870aSOleksandr Tymoshenko  * SUCH DAMAGE.
26*2cfe870aSOleksandr Tymoshenko  *
27*2cfe870aSOleksandr Tymoshenko  * $FreeBSD$
28*2cfe870aSOleksandr Tymoshenko  */
29*2cfe870aSOleksandr Tymoshenko 
30*2cfe870aSOleksandr Tymoshenko #include <sys/cdefs.h>
31*2cfe870aSOleksandr Tymoshenko __FBSDID("$FreeBSD$");
32*2cfe870aSOleksandr Tymoshenko 
33*2cfe870aSOleksandr Tymoshenko #include <sys/param.h>
34*2cfe870aSOleksandr Tymoshenko #include <sys/systm.h>
35*2cfe870aSOleksandr Tymoshenko #include <sys/bus.h>
36*2cfe870aSOleksandr Tymoshenko #include <sys/kernel.h>
37*2cfe870aSOleksandr Tymoshenko #include <sys/lock.h>
38*2cfe870aSOleksandr Tymoshenko #include <sys/module.h>
39*2cfe870aSOleksandr Tymoshenko #include <sys/mutex.h>
40*2cfe870aSOleksandr Tymoshenko #include <sys/rman.h>
41*2cfe870aSOleksandr Tymoshenko #include <sys/resource.h>
42*2cfe870aSOleksandr Tymoshenko #include <machine/bus.h>
43*2cfe870aSOleksandr Tymoshenko 
44*2cfe870aSOleksandr Tymoshenko #include <dev/ofw/ofw_bus.h>
45*2cfe870aSOleksandr Tymoshenko #include <dev/ofw/ofw_bus_subr.h>
46*2cfe870aSOleksandr Tymoshenko 
47*2cfe870aSOleksandr Tymoshenko #include "opt_snd.h"
48*2cfe870aSOleksandr Tymoshenko #include <dev/sound/pcm/sound.h>
49*2cfe870aSOleksandr Tymoshenko #include <dev/sound/fdt/audio_dai.h>
50*2cfe870aSOleksandr Tymoshenko #include "audio_dai_if.h"
51*2cfe870aSOleksandr Tymoshenko 
52*2cfe870aSOleksandr Tymoshenko static struct ofw_compat_data compat_data[] = {
53*2cfe870aSOleksandr Tymoshenko 	{ "dummy-codec",	1},
54*2cfe870aSOleksandr Tymoshenko 	{ NULL,			0 }
55*2cfe870aSOleksandr Tymoshenko };
56*2cfe870aSOleksandr Tymoshenko 
57*2cfe870aSOleksandr Tymoshenko struct dummy_codec_softc {
58*2cfe870aSOleksandr Tymoshenko 	device_t	dev;
59*2cfe870aSOleksandr Tymoshenko };
60*2cfe870aSOleksandr Tymoshenko 
61*2cfe870aSOleksandr Tymoshenko static int dummy_codec_probe(device_t dev);
62*2cfe870aSOleksandr Tymoshenko static int dummy_codec_attach(device_t dev);
63*2cfe870aSOleksandr Tymoshenko static int dummy_codec_detach(device_t dev);
64*2cfe870aSOleksandr Tymoshenko 
65*2cfe870aSOleksandr Tymoshenko static int
66*2cfe870aSOleksandr Tymoshenko dummy_codec_probe(device_t dev)
67*2cfe870aSOleksandr Tymoshenko {
68*2cfe870aSOleksandr Tymoshenko 	if (!ofw_bus_status_okay(dev))
69*2cfe870aSOleksandr Tymoshenko 		return (ENXIO);
70*2cfe870aSOleksandr Tymoshenko 
71*2cfe870aSOleksandr Tymoshenko 	if (!ofw_bus_search_compatible(dev, compat_data)->ocd_data)
72*2cfe870aSOleksandr Tymoshenko 		return (ENXIO);
73*2cfe870aSOleksandr Tymoshenko 
74*2cfe870aSOleksandr Tymoshenko 	device_set_desc(dev, "Dummy Codec");
75*2cfe870aSOleksandr Tymoshenko 	return (BUS_PROBE_DEFAULT);
76*2cfe870aSOleksandr Tymoshenko }
77*2cfe870aSOleksandr Tymoshenko 
78*2cfe870aSOleksandr Tymoshenko static int
79*2cfe870aSOleksandr Tymoshenko dummy_codec_attach(device_t dev)
80*2cfe870aSOleksandr Tymoshenko {
81*2cfe870aSOleksandr Tymoshenko 	struct dummy_codec_softc *sc;
82*2cfe870aSOleksandr Tymoshenko 	phandle_t node;
83*2cfe870aSOleksandr Tymoshenko 
84*2cfe870aSOleksandr Tymoshenko 	sc = device_get_softc(dev);
85*2cfe870aSOleksandr Tymoshenko 	sc->dev = dev;
86*2cfe870aSOleksandr Tymoshenko 
87*2cfe870aSOleksandr Tymoshenko 	node = ofw_bus_get_node(dev);
88*2cfe870aSOleksandr Tymoshenko 	OF_device_register_xref(OF_xref_from_node(node), dev);
89*2cfe870aSOleksandr Tymoshenko 
90*2cfe870aSOleksandr Tymoshenko 	return (0);
91*2cfe870aSOleksandr Tymoshenko }
92*2cfe870aSOleksandr Tymoshenko 
93*2cfe870aSOleksandr Tymoshenko static int
94*2cfe870aSOleksandr Tymoshenko dummy_codec_detach(device_t dev)
95*2cfe870aSOleksandr Tymoshenko {
96*2cfe870aSOleksandr Tymoshenko 
97*2cfe870aSOleksandr Tymoshenko 	return (0);
98*2cfe870aSOleksandr Tymoshenko }
99*2cfe870aSOleksandr Tymoshenko 
100*2cfe870aSOleksandr Tymoshenko static int
101*2cfe870aSOleksandr Tymoshenko dummy_codec_dai_init(device_t dev, uint32_t format)
102*2cfe870aSOleksandr Tymoshenko {
103*2cfe870aSOleksandr Tymoshenko 
104*2cfe870aSOleksandr Tymoshenko 	return (0);
105*2cfe870aSOleksandr Tymoshenko }
106*2cfe870aSOleksandr Tymoshenko 
107*2cfe870aSOleksandr Tymoshenko static device_method_t dummy_codec_methods[] = {
108*2cfe870aSOleksandr Tymoshenko 	/* Device interface */
109*2cfe870aSOleksandr Tymoshenko 	DEVMETHOD(device_probe,		dummy_codec_probe),
110*2cfe870aSOleksandr Tymoshenko 	DEVMETHOD(device_attach,	dummy_codec_attach),
111*2cfe870aSOleksandr Tymoshenko 	DEVMETHOD(device_detach,	dummy_codec_detach),
112*2cfe870aSOleksandr Tymoshenko 
113*2cfe870aSOleksandr Tymoshenko 	DEVMETHOD(audio_dai_init,	dummy_codec_dai_init),
114*2cfe870aSOleksandr Tymoshenko 
115*2cfe870aSOleksandr Tymoshenko 	DEVMETHOD_END
116*2cfe870aSOleksandr Tymoshenko };
117*2cfe870aSOleksandr Tymoshenko 
118*2cfe870aSOleksandr Tymoshenko static driver_t dummy_codec_driver = {
119*2cfe870aSOleksandr Tymoshenko 	"dummycodec",
120*2cfe870aSOleksandr Tymoshenko 	dummy_codec_methods,
121*2cfe870aSOleksandr Tymoshenko 	sizeof(struct dummy_codec_softc),
122*2cfe870aSOleksandr Tymoshenko };
123*2cfe870aSOleksandr Tymoshenko 
124*2cfe870aSOleksandr Tymoshenko static devclass_t dummy_codec_devclass;
125*2cfe870aSOleksandr Tymoshenko 
126*2cfe870aSOleksandr Tymoshenko DRIVER_MODULE(dummy_codec, simplebus, dummy_codec_driver, dummy_codec_devclass, 0, 0);
127*2cfe870aSOleksandr Tymoshenko SIMPLEBUS_PNP_INFO(compat_data);
128