11.12Sthorpej/*	$NetBSD: com_cpcbus.c,v 1.12 2018/12/08 17:46:13 thorpej Exp $	*/
21.1Saugustss
31.1Saugustss/*
41.1Saugustss * Copyright (c) 2002 The NetBSD Foundation, Inc.
51.1Saugustss * All rights reserved.
61.1Saugustss *
71.1Saugustss * This code is derived from software contributed to The NetBSD Foundation
81.1Saugustss * by Lennart Augustsson (lennart@augustsson.net) at Sandburst Corp.
91.1Saugustss *
101.1Saugustss * Redistribution and use in source and binary forms, with or without
111.1Saugustss * modification, are permitted provided that the following conditions
121.1Saugustss * are met:
131.1Saugustss * 1. Redistributions of source code must retain the above copyright
141.1Saugustss *    notice, this list of conditions and the following disclaimer.
151.1Saugustss * 2. Redistributions in binary form must reproduce the above copyright
161.1Saugustss *    notice, this list of conditions and the following disclaimer in the
171.1Saugustss *    documentation and/or other materials provided with the distribution.
181.1Saugustss *
191.1Saugustss * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
201.1Saugustss * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
211.1Saugustss * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
221.1Saugustss * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
231.1Saugustss * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
241.1Saugustss * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
251.1Saugustss * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
261.1Saugustss * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
271.1Saugustss * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
281.1Saugustss * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
291.1Saugustss * POSSIBILITY OF SUCH DAMAGE.
301.1Saugustss */
311.5Slukem
321.5Slukem#include <sys/cdefs.h>
331.12Sthorpej__KERNEL_RCSID(0, "$NetBSD: com_cpcbus.c,v 1.12 2018/12/08 17:46:13 thorpej Exp $");
341.1Saugustss
351.1Saugustss#include <sys/param.h>
361.1Saugustss#include <sys/device.h>
371.1Saugustss#include <sys/tty.h>
381.1Saugustss#include <sys/systm.h>
391.1Saugustss
401.9Sad#include <sys/bus.h>
411.1Saugustss
421.1Saugustss#include <dev/ic/cpc700reg.h>
431.1Saugustss#include <dev/ic/cpc700var.h>
441.1Saugustss
451.1Saugustss#include <dev/ic/comreg.h>
461.1Saugustss#include <dev/ic/comvar.h>
471.1Saugustss
481.1Saugustssstruct com_cpc_softc {
491.1Saugustss	struct com_softc sc_com;
501.1Saugustss	void *sc_ih;
511.1Saugustss};
521.1Saugustss
531.10Scubestatic int	com_cpc_match(device_t, cfdata_t , void *);
541.10Scubestatic void	com_cpc_attach(device_t, device_t, void *);
551.1Saugustss
561.10ScubeCFATTACH_DECL_NEW(com_cpcbus, sizeof(struct com_cpc_softc),
571.4Sthorpej    com_cpc_match, com_cpc_attach, NULL, NULL);
581.1Saugustss
591.1Saugustssint
601.10Scubecom_cpc_match(device_t parent, cfdata_t cf, void *aux)
611.1Saugustss{
621.1Saugustss	struct cpcbus_attach_args *caa = aux;
631.1Saugustss
641.1Saugustss	return (strcmp(caa->cpca_name, "com") == 0);
651.1Saugustss}
661.1Saugustss
671.1Saugustssvoid
681.10Scubecom_cpc_attach(device_t parent, device_t self, void *aux)
691.1Saugustss{
701.1Saugustss	struct cpcbus_attach_args *caa = aux;
711.10Scube	struct com_cpc_softc *sc = device_private(self);
721.1Saugustss	int iobase = caa->cpca_addr;
731.1Saugustss	int irq = caa->cpca_irq;
741.7Sgdamore	bus_space_handle_t ioh;
751.1Saugustss
761.10Scube	sc->sc_com.sc_dev = self;
771.10Scube
781.7Sgdamore	if (!com_is_console(caa->cpca_tag, iobase, &ioh) &&
791.7Sgdamore	    bus_space_map(caa->cpca_tag, iobase, COM_NPORTS, 0, &ioh)) {
801.10Scube		aprint_error_dev(self, "can't map i/o space\n");
811.1Saugustss		return;
821.1Saugustss	}
831.12Sthorpej	com_init_regs(&sc->sc_com.sc_regs, caa->cpca_tag, ioh, iobase);
841.1Saugustss
851.1Saugustss	sc->sc_com.sc_frequency = CPC_COM_SPEED(caa->cpca_freq);
861.1Saugustss
871.1Saugustss	com_attach_subr(&sc->sc_com);
881.1Saugustss
891.1Saugustss	sc->sc_ih = intr_establish(irq, IST_LEVEL, IPL_SERIAL, comintr,
901.1Saugustss				   &sc->sc_com);
911.1Saugustss}
92