1*594f789aSthorpej /* $NetBSD: arcofi_dio.c,v 1.3 2024/01/16 05:48:28 thorpej Exp $ */
222f9ddb8Stsutsui /* $OpenBSD: arcofi_dio.c,v 1.1 2011/12/21 23:12:03 miod Exp $ */
322f9ddb8Stsutsui
422f9ddb8Stsutsui /*
522f9ddb8Stsutsui * Copyright (c) 2011 Miodrag Vallat.
622f9ddb8Stsutsui *
722f9ddb8Stsutsui * Permission to use, copy, modify, and distribute this software for any
822f9ddb8Stsutsui * purpose with or without fee is hereby granted, provided that the above
922f9ddb8Stsutsui * copyright notice and this permission notice appear in all copies.
1022f9ddb8Stsutsui *
1122f9ddb8Stsutsui * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1222f9ddb8Stsutsui * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1322f9ddb8Stsutsui * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1422f9ddb8Stsutsui * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1522f9ddb8Stsutsui * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1622f9ddb8Stsutsui * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1722f9ddb8Stsutsui * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1822f9ddb8Stsutsui */
1922f9ddb8Stsutsui
2022f9ddb8Stsutsui #include <sys/param.h>
2122f9ddb8Stsutsui #include <sys/systm.h>
2222f9ddb8Stsutsui #include <sys/conf.h>
2322f9ddb8Stsutsui #include <sys/device.h>
2422f9ddb8Stsutsui #include <sys/bus.h>
2522f9ddb8Stsutsui #include <sys/intr.h>
2622f9ddb8Stsutsui
2722f9ddb8Stsutsui #include <sys/audioio.h>
28e622eac4Sisaki #include <dev/audio/audio_if.h>
2922f9ddb8Stsutsui #include <dev/ic/arcofivar.h>
3022f9ddb8Stsutsui
3122f9ddb8Stsutsui #include <hp300/dev/dioreg.h>
3222f9ddb8Stsutsui #include <hp300/dev/diovar.h>
3322f9ddb8Stsutsui
3422f9ddb8Stsutsui #include <hp300/dev/diodevs.h>
3522f9ddb8Stsutsui
3622f9ddb8Stsutsui #define SOFTINT_AUDIO SOFTINT_SERIAL /* XXX */
3722f9ddb8Stsutsui
3822f9ddb8Stsutsui static void arcofi_dio_attach(device_t, device_t, void *);
3922f9ddb8Stsutsui static int arcofi_dio_match(device_t, cfdata_t, void *);
4022f9ddb8Stsutsui
4122f9ddb8Stsutsui struct arcofi_dio_softc {
4222f9ddb8Stsutsui struct arcofi_softc sc_arcofi;
4322f9ddb8Stsutsui
4422f9ddb8Stsutsui struct bus_space_tag sc_tag;
4522f9ddb8Stsutsui };
4622f9ddb8Stsutsui
4722f9ddb8Stsutsui CFATTACH_DECL_NEW(arcofi_dio, sizeof(struct arcofi_dio_softc),
4822f9ddb8Stsutsui arcofi_dio_match, arcofi_dio_attach, NULL, NULL);
4922f9ddb8Stsutsui
5022f9ddb8Stsutsui static int
arcofi_dio_match(device_t parent,cfdata_t match,void * aux)5122f9ddb8Stsutsui arcofi_dio_match(device_t parent, cfdata_t match, void *aux)
5222f9ddb8Stsutsui {
5322f9ddb8Stsutsui struct dio_attach_args *da = aux;
5422f9ddb8Stsutsui
5522f9ddb8Stsutsui if (da->da_id != DIO_DEVICE_ID_AUDIO)
5622f9ddb8Stsutsui return 0;
5722f9ddb8Stsutsui
5822f9ddb8Stsutsui return 1;
5922f9ddb8Stsutsui }
6022f9ddb8Stsutsui
6122f9ddb8Stsutsui static void
arcofi_dio_attach(device_t parent,device_t self,void * aux)6222f9ddb8Stsutsui arcofi_dio_attach(device_t parent, device_t self, void *aux)
6322f9ddb8Stsutsui {
6422f9ddb8Stsutsui struct arcofi_dio_softc *adsc = device_private(self);
6522f9ddb8Stsutsui struct arcofi_softc *sc = &adsc->sc_arcofi;
6622f9ddb8Stsutsui struct dio_attach_args *da = aux;
6722f9ddb8Stsutsui bus_space_tag_t iot = &adsc->sc_tag;
6822f9ddb8Stsutsui int ipl;
6922f9ddb8Stsutsui
7022f9ddb8Stsutsui sc->sc_dev = self;
7122f9ddb8Stsutsui
7222f9ddb8Stsutsui /* XXX is it better to use sc->sc_reg[] to handle odd sparse map? */
7322f9ddb8Stsutsui memcpy(iot, da->da_bst, sizeof(struct bus_space_tag));
7422f9ddb8Stsutsui dio_set_bus_space_oddbyte(iot);
7522f9ddb8Stsutsui sc->sc_iot = iot;
7622f9ddb8Stsutsui
7722f9ddb8Stsutsui if (bus_space_map(iot, da->da_addr, DIOII_SIZEOFF, 0,
7822f9ddb8Stsutsui &sc->sc_ioh) != 0) {
7922f9ddb8Stsutsui aprint_error(": can't map registers\n");
8022f9ddb8Stsutsui return;
8122f9ddb8Stsutsui }
8222f9ddb8Stsutsui
8322f9ddb8Stsutsui ipl = da->da_ipl;
84*594f789aSthorpej dio_intr_establish(arcofi_hwintr, sc, ipl, ISRPRI_AUDIO);
8522f9ddb8Stsutsui
8622f9ddb8Stsutsui aprint_normal("\n");
8722f9ddb8Stsutsui
8822f9ddb8Stsutsui arcofi_attach(sc, "dio");
8922f9ddb8Stsutsui }
90