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