Add driver for ScanLogic SL811HS/T USB Host Controller.

XXX It's experimental code yet.

For x68k: USB part of Nereid USB/Ethernet/memory board
For ISA:  ISA USB Host board from Morphy planning
This commit is contained in:
isaki 2002-08-11 13:17:52 +00:00
parent 1c708a4b08
commit dd0e0396bc
10 changed files with 2249 additions and 4 deletions

View File

@ -1,4 +1,4 @@
# $NetBSD: files.x68k,v 1.46 2002/04/22 09:41:21 augustss Exp $ # $NetBSD: files.x68k,v 1.47 2002/08/11 13:17:52 isaki Exp $
# #
# new style config file for x68k architecture # new style config file for x68k architecture
# #
@ -181,6 +181,10 @@ file arch/x68k/dev/pow.c pow needs-count
attach ne at intio with ne_intio: rtl80x9 attach ne at intio with ne_intio: rtl80x9
file arch/x68k/dev/if_ne_intio.c ne_intio file arch/x68k/dev/if_ne_intio.c ne_intio
# Nereid USB
attach slhci at intio with slhci_intio
file arch/x68k/dev/slhci_intio.c slhci_intio
# memory disk # memory disk
file dev/md_root.c memory_disk_hooks file dev/md_root.c memory_disk_hooks
major {md = 8} major {md = 8}
@ -205,3 +209,6 @@ file arch/m68k/m68k/linux_trap.c compat_linux
# OSS audio driver compatibility # OSS audio driver compatibility
include "compat/ossaudio/files.ossaudio" include "compat/ossaudio/files.ossaudio"
# USB support
include "dev/usb/files.usb"

View File

@ -0,0 +1,206 @@
/* $NetBSD: slhci_intio.c,v 1.1 2002/08/11 13:17:52 isaki Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Tetsuya Isaki.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* USB part of Nereid Ethernet/USB/Memory board
*/
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <machine/bus.h>
#include <machine/cpu.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdivar.h>
#include <dev/ic/sl811hsreg.h>
#include <dev/ic/sl811hsvar.h>
#include <arch/x68k/dev/intiovar.h>
#include <arch/x68k/dev/slhci_intio_var.h>
static int slhci_intio_match(struct device *, struct cfdata *, void *);
static void slhci_intio_attach(struct device *, struct device *, void *);
static void slhci_intio_enable_power(void *, int);
static void slhci_intio_enable_intr(void *, int);
static int slhci_intio_intr(void *);
struct cfattach slhci_intio_ca = {
sizeof(struct slhci_intio_softc), slhci_intio_match, slhci_intio_attach
};
static int
slhci_intio_match(struct device *parent, struct cfdata *cf, void *aux)
{
struct intio_attach_args *ia = aux;
bus_space_tag_t iot = ia->ia_bst;
bus_space_handle_t ioh;
bus_space_handle_t nch;
int nc_addr;
int nc_size;
if (ia->ia_addr == INTIOCF_ADDR_DEFAULT)
ia->ia_addr = SLHCI_INTIO_ADDR1;
if (ia->ia_intr == INTIOCF_INTR_DEFAULT)
ia->ia_intr = SLHCI_INTIO_INTR1;
/* fixed parameters */
if ( !(ia->ia_addr == SLHCI_INTIO_ADDR1 &&
ia->ia_intr == SLHCI_INTIO_INTR1 ) &&
!(ia->ia_addr == SLHCI_INTIO_ADDR2 &&
ia->ia_intr == SLHCI_INTIO_INTR2 ) )
return 0;
/* Whether the control port is accessible or not */
nc_addr = ia->ia_addr + NEREID_ADDR_OFFSET;
nc_size = 0x02;
if (badbaddr((caddr_t)INTIO_ADDR(nc_addr)))
return 0;
/* Map two I/O spaces */
ia->ia_size = SL11_PORTSIZE * 2;
if (bus_space_map(iot, ia->ia_addr, ia->ia_size,
BUS_SPACE_MAP_SHIFTED, &ioh))
return 0;
if (bus_space_map(iot, nc_addr, nc_size,
BUS_SPACE_MAP_SHIFTED, &nch))
return 0;
bus_space_unmap(iot, ioh, ia->ia_size);
bus_space_unmap(iot, nch, nc_size);
return 1;
}
static void
slhci_intio_attach(struct device *parent, struct device *self, void *aux)
{
struct slhci_intio_softc *sc = (struct slhci_intio_softc *)self;
struct intio_attach_args *ia = aux;
bus_space_tag_t iot = ia->ia_bst;
bus_space_handle_t ioh;
int nc_addr;
int nc_size;
printf(": Nereid USB\n");
/* Map I/O space */
if (bus_space_map(iot, ia->ia_addr, SL11_PORTSIZE * 2,
BUS_SPACE_MAP_SHIFTED, &ioh)) {
printf("%s: can't map I/O space\n",
sc->sc_sc.sc_bus.bdev.dv_xname);
return;
}
nc_addr = ia->ia_addr + NEREID_ADDR_OFFSET;
nc_size = 0x02;
if (bus_space_map(iot, nc_addr, nc_size,
BUS_SPACE_MAP_SHIFTED, &sc->sc_nch)) {
printf("%s: can't map I/O control space\n",
sc->sc_sc.sc_bus.bdev.dv_xname);
return;
}
/* Initialize sc */
sc->sc_sc.sc_iot = iot;
sc->sc_sc.sc_ioh = ioh;
sc->sc_sc.sc_dmat = ia->ia_dmat;
sc->sc_sc.sc_enable_power = slhci_intio_enable_power;
sc->sc_sc.sc_enable_intr = slhci_intio_enable_intr;
sc->sc_sc.sc_arg = sc;
/* Establish the interrupt handler */
if (intio_intr_establish(ia->ia_intr, "slhci", slhci_intio_intr, sc)) {
printf("%s: can't establish interrupt\n",
sc->sc_sc.sc_bus.bdev.dv_xname);
return;
}
/* Reset controller */
bus_space_write_1(iot, sc->sc_nch, NEREID_CTRL, NEREID_CTRL_RESET);
delay(40000);
/* Attach SL811HS/T */
if (slhci_attach(&sc->sc_sc, self))
return;
}
static void
slhci_intio_enable_power(void *arg, int mode)
{
struct slhci_intio_softc *sc = arg;
bus_space_tag_t iot = sc->sc_sc.sc_iot;
u_int8_t r;
r = bus_space_read_1(iot, sc->sc_nch, NEREID_CTRL);
if (mode == POWER_ON)
bus_space_write_1(iot, sc->sc_nch, NEREID_CTRL,
r | NEREID_CTRL_POWER);
else
bus_space_write_1(iot, sc->sc_nch, NEREID_CTRL,
r & ~NEREID_CTRL_POWER);
}
static void
slhci_intio_enable_intr(void *arg, int mode)
{
struct slhci_intio_softc *sc = arg;
bus_space_tag_t iot = sc->sc_sc.sc_iot;
u_int8_t r;
r = bus_space_read_1(iot, sc->sc_nch, NEREID_CTRL);
if (mode == INTR_ON)
bus_space_write_1(iot, sc->sc_nch, NEREID_CTRL,
r | NEREID_CTRL_INTR);
else
bus_space_write_1(iot, sc->sc_nch, NEREID_CTRL,
r & ~NEREID_CTRL_INTR);
}
static int
slhci_intio_intr(void *arg)
{
struct slhci_intio_softc *sc = arg;
return slhci_intr(&sc->sc_sc);
}

View File

@ -0,0 +1,59 @@
/* $NetBSD: slhci_intio_var.h,v 1.1 2002/08/11 13:17:52 isaki Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Tetsuya Isaki.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* USB part of Nereid Ethernet/USB/Memory board
*/
#define SLHCI_INTIO_ADDR1 (0xece380)
#define SLHCI_INTIO_ADDR2 (0xeceb80)
#define SLHCI_INTIO_INTR1 (0xfb)
#define SLHCI_INTIO_INTR2 (0xfa)
#define NEREID_ADDR_OFFSET (0xece3f0 - 0xece380) /* Nereid control port */
#define NEREID_CTRL (0)
#define NEREID_CTRL_RESET (0x01)
#define NEREID_CTRL_POWER (0x02)
#define NEREID_CTRL_INTR (0x04)
#define NEREID_CTRL_DIPSW (0x08)
struct slhci_intio_softc {
struct slhci_softc sc_sc;
bus_space_handle_t sc_nch; /* Nereid control port handle */
};

View File

@ -1,4 +1,4 @@
# $NetBSD: files,v 1.544 2002/08/11 12:09:44 drochner Exp $ # $NetBSD: files,v 1.545 2002/08/11 13:17:55 isaki Exp $
# @(#)files.newconf 7.5 (Berkeley) 5/10/93 # @(#)files.newconf 7.5 (Berkeley) 5/10/93
@ -820,6 +820,11 @@ file dev/usb/ohci.c ohci needs-flag
device ehci: usbus device ehci: usbus
file dev/usb/ehci.c ehci needs-flag file dev/usb/ehci.c ehci needs-flag
# SL811HS/T USB controller
defflag opt_slhci.h SLHCI_DEBUG
device slhci: usbus
file dev/ic/sl811hs.c slhci needs-flag
# radio devices, attaches to radio hardware driver # radio devices, attaches to radio hardware driver
device radio device radio
attach radio at radiodev attach radio at radiodev

View File

@ -1,4 +1,4 @@
# $NetBSD: DEVNAMES,v 1.118 2002/07/22 01:24:41 ichiro Exp $ # $NetBSD: DEVNAMES,v 1.119 2002/08/11 13:17:53 isaki Exp $
# #
# This file contains all used device names and defined attributes in # This file contains all used device names and defined attributes in
# alphabetical order. New devices added to the system somewhere should first # alphabetical order. New devices added to the system somewhere should first
@ -1017,6 +1017,7 @@ siotty luna68k
sip MI sip MI
skbd hpcmips skbd hpcmips
skbdif hpcmips skbdif hpcmips
slhci MI
sm MI sm MI
smap playstation2 smap playstation2
smc93cx6 MI Attribute smc93cx6 MI Attribute

1606
sys/dev/ic/sl811hs.c Normal file

File diff suppressed because it is too large Load Diff

124
sys/dev/ic/sl811hsreg.h Normal file
View File

@ -0,0 +1,124 @@
/* $NetBSD: sl811hsreg.h,v 1.1 2002/08/11 13:17:53 isaki Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Tetsuya Isaki.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* ScanLogic SL811HS/T USB Host Controller
*/
#define SL11_IDX_ADDR (0x00)
#define SL11_IDX_DATA (0x01)
#define SL11_PORTSIZE (0x02)
#define SL11_E0BASE (0x00) /* Base of Control0 */
#define SL11_E0CTRL (0x00) /* Host Control Register */
#define SL11_E0ADDR (0x01) /* Host Base Address */
#define SL11_E0LEN (0x02) /* Host Base Length */
#define SL11_E0STAT (0x03) /* USB Status (Read) */
#define SL11_E0PID SL11_E0STAT /* Host PID, Device Endpoint (Write) */
#define SL11_E0CONT (0x04) /* Transfer Count (Read) */
#define SL11_E0DEV SL11_E0CONT /* Host Device Address (Write) */
#define SL11_E1BASE (0x08) /* Base of Control1 */
#define SL11_E1CTRL (SL11_E1BASE + SL11_E0CTRL)
#define SL11_E1ADDR (SL11_E1BASE + SL11_E0ADDR)
#define SL11_E1LEN (SL11_E1BASE + SL11_E0LEN)
#define SL11_E1STAT (SL11_E1BASE + SL11_E0STAT)
#define SL11_E1PID (SL11_E1BASE + SL11_E0PID)
#define SL11_E1CONT (SL11_E1BASE + SL11_E0CONT)
#define SL11_E1DEV (SL11_E1BASE + SL11_E0DEV)
#define SL11_CTRL (0x05) /* Control Register1 */
#define SL11_IER (0x06) /* Interrupt Enable Register */
#define SL11_ISR (0x0d) /* Interrupt Status Register */
#define SL11_DATA (0x0e) /* SOF Counter Low (Write) */
#define SL11_REV SL11_DATA /* HW Revision Register (Read) */
#define SL811_CSOF (0x0f) /* SOF Counter High(R), Control2(W) */
#define SL11_MEM (0x10) /* Memory Buffer (0x10 - 0xff) */
#define SL11_EPCTRL_ARM (0x01)
#define SL11_EPCTRL_ENABLE (0x02)
#define SL11_EPCTRL_DIRECTION (0x04)
#define SL11_EPCTRL_ISO (0x10)
#define SL11_EPCTRL_SOF (0x20)
#define SL11_EPCTRL_DATATOGGLE (0x40)
#define SL11_EPCTRL_PREAMBLE (0x80)
#define SL11_EPPID_PIDMASK (0xf0)
#define SL11_EPPID_EPMASK (0x0f)
#define SL11_EPSTAT_ACK (0x01)
#define SL11_EPSTAT_ERROR (0x02)
#define SL11_EPSTAT_TIMEOUT (0x04)
#define SL11_EPSTAT_SEQUENCE (0x08)
#define SL11_EPSTAT_SETUP (0x10)
#define SL11_EPSTAT_OVERFLOW (0x20)
#define SL11_EPSTAT_NAK (0x40)
#define SL11_EPSTAT_STALL (0x80)
#define SL11_CTRL_ENABLESOF (0x01)
#define SL11_CTRL_EOF2 (0x04)
#define SL11_CTRL_RESETENGINE (0x08)
#define SL11_CTRL_JKSTATE (0x10)
#define SL11_CTRL_LOWSPEED (0x20)
#define SL11_CTRL_SUSPEND (0x40)
#define SL11_IER_USBA (0x01) /* USB-A done */
#define SL11_IER_USBB (0x02) /* USB-B done */
#define SL11_IER_BABBLE (0x04) /* Babble detection */
#define SL11_IER_SOFTIMER (0x10) /* 1ms SOF timer */
#define SL11_IER_INSERT (0x20) /* Slave Insert/Remove detection */
#define SL11_IER_RESET (0x40) /* USB Reset/Resume */
#define SL11_ISR_USBA (0x01) /* USB-A done */
#define SL11_ISR_USBB (0x02) /* USB-B done */
#define SL11_ISR_BABBLE (0x04) /* Babble detection */
#define SL11_ISR_SOFTIMER (0x10) /* 1ms SOF timer */
#define SL11_ISR_INSERT (0x20) /* Slave Insert/Remove detection */
#define SL11_ISR_RESET (0x40) /* USB Reset/Resume */
#define SL11_ISR_DATA (0x80) /* Value of the Data+ pin */
#define SL11_REV_USBA (0x01) /* USB-A */
#define SL11_REV_USBB (0x02) /* USB-B */
#define SL11_REV_REVMASK (0xf0) /* HW Revision */
#define SL11_REV_REVSL11H (0x00) /* HW is SL11H */
#define SL11_REV_REVSL811HS (0x10) /* HW is SL811HS */
#define SL811_CSOF_SOFMASK (0x3f) /* SOF High Counter */
#define SL811_CSOF_POLARITY (0x40) /* Change polarity */
#define SL811_CSOF_MASTER (0x80) /* Master/Slave selection */

102
sys/dev/ic/sl811hsvar.h Normal file
View File

@ -0,0 +1,102 @@
/* $NetBSD: sl811hsvar.h,v 1.1 2002/08/11 13:17:54 isaki Exp $ */
/*
* Copyright (c) 2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Tetsuya Isaki.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
/*
* ScanLogic SL811HS/T USB Host Controller
*/
#define MS_TO_TICKS(ms) ((ms) * hz / 1000)
#define delay_ms(X) \
ltsleep(&slhci_dummy, PZERO | PCATCH, "slhci", MS_TO_TICKS(X), NULL)
#define SL11_PID_OUT (0x1)
#define SL11_PID_IN (0x9)
#define SL11_PID_SOF (0x5)
#define SL11_PID_SETUP (0xd)
struct slhci_xfer {
usbd_xfer_handle sx_xfer;
usb_callout_t sx_callout_t;
};
struct slhci_softc {
struct usbd_bus sc_bus;
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
bus_dma_tag_t sc_dmat;
void (*sc_enable_power)(void *, int);
void (*sc_enable_intr)(void *, int);
void *sc_arg;
int sc_powerstat;
#define POWER_ON (1)
#define POWER_OFF (0)
#define INTR_ON (1)
#define INTR_OFF (0)
device_ptr_t sc_child;
struct device *sc_parent; /* parent device */
int sc_sltype; /* revision */
#define SLTYPE_SL11H (0x00)
#define SLTYPE_SL811HS (0x01)
#define SLTYPE_SL811HS_R12 SLTYPE_SL811HS
#define SLTYPE_SL811HS_R14 (0x02)
u_int8_t sc_addr; /* device address of root hub */
u_int8_t sc_conf;
SIMPLEQ_HEAD(, usbd_xfer) sc_free_xfers;
/* Information for the root hub interrupt pipe */
int sc_interval;
usbd_xfer_handle sc_intr_xfer;
usb_callout_t sc_poll_handle;
int sc_flags;
#define SLF_RESET (0x01)
#define SLF_INSERT (0x02)
/* Root HUB specific members */
int sc_fullspeed;
int sc_connect; /* XXX */
int sc_change;
};
int sl811hs_find(struct slhci_softc *);
int slhci_attach(struct slhci_softc *, struct device *);
int slhci_intr(void *);

View File

@ -1,4 +1,4 @@
# $NetBSD: files.isa,v 1.125 2002/07/17 21:10:30 drochner Exp $ # $NetBSD: files.isa,v 1.126 2002/08/11 13:17:54 isaki Exp $
# #
# Config file and device description for machine-independent ISA code. # Config file and device description for machine-independent ISA code.
# Included by ports that need it. Requires that the SCSI files be # Included by ports that need it. Requires that the SCSI files be
@ -477,6 +477,10 @@ device nsclpcsio: sysmon_envsys
attach nsclpcsio at isa with nsclpcsio_isa attach nsclpcsio at isa with nsclpcsio_isa
file dev/isa/nsclpcsio_isa.c nsclpcsio_isa file dev/isa/nsclpcsio_isa.c nsclpcsio_isa
# USB Controller
attach slhci at isa with slhci_isa
file dev/isa/slhci_isa.c slhci_isa
# #
# ISA Plug 'n Play autoconfiguration glue. # ISA Plug 'n Play autoconfiguration glue.
# THIS MUST COME AFTER ALL MI ISA DEVICES ARE DEFINED. This is because # THIS MUST COME AFTER ALL MI ISA DEVICES ARE DEFINED. This is because

131
sys/dev/isa/slhci_isa.c Normal file
View File

@ -0,0 +1,131 @@
/* $NetBSD: slhci_isa.c,v 1.1 2002/08/11 13:17:54 isaki Exp $ */
/*
* Copyright (c) 2001 Kiyoshi Ikehara. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by Kiyoshi Ikehara.
* 4. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
* IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*/
/*
* ISA-USB host board
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: slhci_isa.c,v 1.1 2002/08/11 13:17:54 isaki Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/device.h>
#include <machine/bus.h>
#include <machine/cpu.h>
#include <dev/usb/usb.h>
#include <dev/usb/usbdi.h>
#include <dev/usb/usbdivar.h>
#include <dev/ic/sl811hsreg.h>
#include <dev/ic/sl811hsvar.h>
#include <dev/isa/isavar.h>
struct slhci_isa_softc {
struct slhci_softc sc;
isa_chipset_tag_t sc_ic;
void *sc_ih;
};
static int slhci_isa_match(struct device *, struct cfdata *, void *);
static void slhci_isa_attach(struct device *, struct device *, void *);
struct cfattach slhci_isa_ca = {
sizeof(struct slhci_isa_softc), slhci_isa_match, slhci_isa_attach
};
static int
slhci_isa_match(struct device *parent, struct cfdata *cf, void *aux)
{
struct slhci_softc sc;
struct isa_attach_args *ia = aux;
bus_space_tag_t iot = ia->ia_iot;
bus_space_handle_t ioh;
int result = 0;
if (bus_space_map(iot, ia->ia_io[0].ir_addr, SL11_PORTSIZE, 0, &ioh))
goto out;
memset(&sc, 0, sizeof(sc));
sc.sc_iot = iot;
sc.sc_ioh = ioh;
if (sl811hs_find(&sc) >= 0)
result = 1;
bus_space_unmap(iot, ioh, SL11_PORTSIZE);
out:
return (result);
}
static void
slhci_isa_attach(struct device *parent, struct device *self, void *aux)
{
struct slhci_isa_softc *isc = (struct slhci_isa_softc *)self;
struct slhci_softc *sc = &isc->sc;
struct isa_attach_args *ia = aux;
bus_space_tag_t iot = ia->ia_iot;
bus_space_handle_t ioh;
printf("\n");
/* Map I/O space */
if (bus_space_map(iot, ia->ia_io[0].ir_addr, SL11_PORTSIZE, 0, &ioh)) {
printf("%s: can't map I/O space\n",
sc->sc_bus.bdev.dv_xname);
return;
}
/* Initialize sc */
sc->sc_iot = iot;
sc->sc_ioh = ioh;
sc->sc_dmat = ia->ia_dmat;
sc->sc_enable_power = NULL;
sc->sc_enable_intr = NULL;
sc->sc_arg = isc;
/* Establish the interrupt handler */
isc->sc_ih = isa_intr_establish(ia->ia_ic, ia->ia_irq[0].ir_irq,
IST_EDGE, IPL_USB, slhci_intr, sc);
if (isc->sc_ih == NULL) {
printf("%s: can't establish interrupt\n",
sc->sc_bus.bdev.dv_xname);
return;
}
/* Attach SL811HS/T */
if (slhci_attach(sc, self))
return;
}