xref: /netbsd-src/sys/arch/hp300/dev/arcofi_dio.c (revision 594f789a5c7bef0390e4223293d2f6fcada88e9b)
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