167468Snon/*	$NecBSD: tmc18c30_pisa.c,v 1.22 1998/11/26 01:59:21 honda Exp $	*/
267468Snon/*	$NetBSD$	*/
367468Snon
4139749Simp/*-
567468Snon * [Ported for FreeBSD]
667468Snon *  Copyright (c) 2000
767468Snon *      Noriaki Mitsunaga, Mitsuru Iwasaki and Takanori Watanabe.
867468Snon *      All rights reserved.
967468Snon * [NetBSD for NEC PC-98 series]
1067468Snon *  Copyright (c) 1996, 1997, 1998
1167468Snon *	NetBSD/pc98 porting staff. All rights reserved.
1267468Snon *  Copyright (c) 1996, 1997, 1998
1367468Snon *	Naofumi HONDA. All rights reserved.
1467468Snon *  Copyright (c) 1996, 1997, 1998
1567468Snon *	Kouichi Matsuda. All rights reserved.
1667468Snon *
1767468Snon *  Redistribution and use in source and binary forms, with or without
1867468Snon *  modification, are permitted provided that the following conditions
1967468Snon *  are met:
2067468Snon *  1. Redistributions of source code must retain the above copyright
2167468Snon *     notice, this list of conditions and the following disclaimer.
2267468Snon *  2. Redistributions in binary form must reproduce the above copyright
2367468Snon *     notice, this list of conditions and the following disclaimer in the
2467468Snon *     documentation and/or other materials provided with the distribution.
2567468Snon *  3. The name of the author may not be used to endorse or promote products
2667468Snon *     derived from this software without specific prior written permission.
2767468Snon *
2867468Snon * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
2967468Snon * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
3067468Snon * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
3167468Snon * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
3267468Snon * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
3367468Snon * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
3467468Snon * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3567468Snon * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
3667468Snon * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
3767468Snon * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
3867468Snon * POSSIBILITY OF SUCH DAMAGE.
3967468Snon */
4067468Snon
41119420Sobrien#include <sys/cdefs.h>
42119420Sobrien__FBSDID("$FreeBSD: releng/10.3/sys/dev/stg/tmc18c30_pccard.c 240325 2012-09-10 18:49:49Z jhb $");
43119420Sobrien
4467468Snon#include <sys/param.h>
45129764Simp#include <sys/errno.h>
46129764Simp#include <sys/kernel.h>
47129764Simp#include <sys/malloc.h>
48129764Simp#include <sys/module.h>
4967468Snon#include <sys/systm.h>
5067468Snon
5167468Snon#include <machine/bus.h>
5267468Snon
53240172Sjhb#include <sys/bus.h>
5467468Snon
55107363Snon#include <dev/pccard/pccardvar.h>
56107363Snon
5767468Snon#include <cam/scsi/scsi_low.h>
5867468Snon
5967468Snon#include <dev/stg/tmc18c30reg.h>
6067468Snon#include <dev/stg/tmc18c30var.h>
61113205Smdodd#include <dev/stg/tmc18c30.h>
6267468Snon
63129764Simp#include "pccarddevs.h"
6467468Snon
65107363Snonstatic const struct pccard_product stg_products[] = {
66147580Simp	PCMCIA_CARD(FUTUREDOMAIN, SCSI2GO),
67147580Simp	PCMCIA_CARD(IBM, SCSICARD),
68147580Simp	PCMCIA_CARD(RATOC, REX5536),
69147580Simp	PCMCIA_CARD(RATOC, REX5536AM),
70147580Simp	PCMCIA_CARD(RATOC, REX5536M),
71107363Snon	{ NULL }
72107363Snon};
73107363Snon
7467468Snon/*
75150440Simp * Additional code for FreeBSD new-bus PC Card frontend
7667468Snon */
77150440Simpstatic int
78150440Simpstg_pccard_probe(device_t dev)
79107363Snon{
80107363Snon  	const struct pccard_product *pp;
81107363Snon
82107363Snon	if ((pp = pccard_product_lookup(dev, stg_products,
83107363Snon	    sizeof(stg_products[0]), NULL)) != NULL) {
84113315Simp		if (pp->pp_name != NULL)
85113315Simp			device_set_desc(dev, pp->pp_name);
86107363Snon		return(0);
87107363Snon	}
88107363Snon	return(EIO);
89107363Snon}
90107363Snon
9167468Snonstatic int
92150440Simpstg_pccard_attach(device_t dev)
9367468Snon{
9467468Snon	struct stg_softc	*sc = device_get_softc(dev);
9567468Snon	int			error;
9667468Snon
97113205Smdodd	sc->port_rid = 0;
98113205Smdodd	sc->irq_rid = 0;
9967468Snon	error = stg_alloc_resource(dev);
10067468Snon	if (error) {
10167468Snon		return(error);
10267468Snon	}
10367468Snon
104113205Smdodd	if (stg_probe(dev) == 0) {
10567468Snon		stg_release_resource(dev);
10667468Snon		return(ENXIO);
10767468Snon	}
10873280Smarkm	error = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_CAM | INTR_ENTROPY,
109166901Spiso			       NULL, stg_intr, (void *)sc, &sc->stg_intrhand);
11067468Snon	if (error) {
11167468Snon		stg_release_resource(dev);
11267468Snon		return(error);
11367468Snon	}
11467468Snon
115113205Smdodd	if (stg_attach(dev) == 0) {
11667468Snon		stg_release_resource(dev);
11767468Snon		return(ENXIO);
11867468Snon	}
11967468Snon
12067468Snon	return(0);
12167468Snon}
12267468Snon
12367468Snonstatic device_method_t stg_pccard_methods[] = {
12467468Snon	/* Device interface */
125150440Simp	DEVMETHOD(device_probe,		stg_pccard_probe),
126150440Simp	DEVMETHOD(device_attach,	stg_pccard_attach),
127113205Smdodd	DEVMETHOD(device_detach,	stg_detach),
12867468Snon	{ 0, 0 }
12967468Snon};
13067468Snon
13167468Snonstatic driver_t stg_pccard_driver = {
13267468Snon	"stg",
13367468Snon	stg_pccard_methods,
13467468Snon	sizeof(struct stg_softc),
13567468Snon};
13667468Snon
137113205SmdoddDRIVER_MODULE(stg, pccard, stg_pccard_driver, stg_devclass, 0, 0);
13887983SnonMODULE_DEPEND(stg, scsi_low, 1, 1, 1);
139