use locator passing versions of xxxsubmatch() and simplify the code by

using arithmetics instead of case statements
This commit is contained in:
drochner 2004-09-13 12:34:00 +00:00
parent a987cab220
commit b04ad75025
3 changed files with 51 additions and 134 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: i82365.c,v 1.86 2004/08/16 15:46:37 mycroft Exp $ */
/* $NetBSD: i82365.c,v 1.87 2004/09/13 12:34:00 drochner Exp $ */
/*
* Copyright (c) 2004 Charles M. Hannum. All rights reserved.
@ -49,7 +49,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: i82365.c,v 1.86 2004/08/16 15:46:37 mycroft Exp $");
__KERNEL_RCSID(0, "$NetBSD: i82365.c,v 1.87 2004/09/13 12:34:00 drochner Exp $");
#define PCICDEBUG
@ -70,6 +70,8 @@ __KERNEL_RCSID(0, "$NetBSD: i82365.c,v 1.86 2004/08/16 15:46:37 mycroft Exp $");
#include <dev/ic/i82365reg.h>
#include <dev/ic/i82365var.h>
#include "locators.h"
#ifdef PCICDEBUG
int pcic_debug = 0;
#define DPRINTF(arg) if (pcic_debug) printf arg;
@ -87,7 +89,8 @@ int pcic_debug = 0;
void pcic_attach_socket __P((struct pcic_handle *));
void pcic_attach_socket_finish __P((struct pcic_handle *));
int pcic_submatch __P((struct device *, struct cfdata *, void *));
int pcic_submatch __P((struct device *, struct cfdata *,
const locdesc_t *, void *));
int pcic_print __P((void *arg, const char *pnp));
int pcic_intr_socket __P((struct pcic_handle *));
void pcic_poll_intr __P((void *));
@ -247,6 +250,7 @@ pcic_attach(sc)
h->ph_parent = (struct device *)sc;
h->chip = chip;
h->socket = socket;
h->sock = chip * PCIC_CHIP_OFFSET + socket * PCIC_SOCKET_OFFSET;
h->laststate = PCIC_LASTSTATE_EMPTY;
/* initialize pcic_read and pcic_write functions */
@ -392,6 +396,8 @@ pcic_attach_socket(h)
{
struct pcmciabus_attach_args paa;
struct pcic_softc *sc = (struct pcic_softc *)h->ph_parent;
int help[3];
locdesc_t *ldesc = (void *)help; /* XXX */
/* initialize the rest of the handle */
@ -408,7 +414,12 @@ pcic_attach_socket(h)
paa.iobase = sc->iobase;
paa.iosize = sc->iosize;
h->pcmcia = config_found_sm(&sc->dev, &paa, pcic_print, pcic_submatch);
ldesc->len = 2;
ldesc->locs[PCMCIABUSCF_CONTROLLER] = h->chip;
ldesc->locs[PCMCIABUSCF_SOCKET] = h->socket;
h->pcmcia = config_found_sm_loc(&sc->dev, "pcmciabus", ldesc, &paa,
pcic_print, pcic_submatch);
if (h->pcmcia == NULL) {
h->flags &= ~PCIC_FLAG_SOCKETP;
return;
@ -511,24 +522,9 @@ pcic_create_event_thread(arg)
void *arg;
{
struct pcic_handle *h = arg;
const char *cs;
char cs[4];
switch (h->sock) {
case C0SA:
cs = "0,0";
break;
case C0SB:
cs = "0,1";
break;
case C1SA:
cs = "1,0";
break;
case C1SB:
cs = "1,1";
break;
default:
panic("pcic_create_event_thread: unknown pcic socket");
}
snprintf(cs, sizeof(cs), "%d,%d", h->chip, h->socket);
if (kthread_create1(pcic_event_thread, h, &h->event_thread,
"%s,%s", h->ph_parent->dv_xname, cs)) {
@ -646,64 +642,20 @@ pcic_event_thread(arg)
}
int
pcic_submatch(parent, cf, aux)
pcic_submatch(parent, cf, ldesc, aux)
struct device *parent;
struct cfdata *cf;
const locdesc_t *ldesc;
void *aux;
{
struct pcmciabus_attach_args *paa = aux;
struct pcic_handle *h = (struct pcic_handle *) paa->pch;
switch (h->sock) {
case C0SA:
if (cf->pcmciabuscf_controller !=
PCMCIABUSCF_CONTROLLER_DEFAULT &&
cf->pcmciabuscf_controller != 0)
if (cf->cf_loc[PCMCIABUSCF_CONTROLLER] != PCMCIABUSCF_CONTROLLER_DEFAULT &&
cf->cf_loc[PCMCIABUSCF_CONTROLLER] != ldesc->locs[PCMCIABUSCF_CONTROLLER])
return 0;
if (cf->pcmciabuscf_socket !=
PCMCIABUSCF_SOCKET_DEFAULT &&
cf->pcmciabuscf_socket != 0)
if (cf->cf_loc[PCMCIABUSCF_SOCKET] != PCMCIABUSCF_SOCKET_DEFAULT &&
cf->cf_loc[PCMCIABUSCF_SOCKET] != ldesc->locs[PCMCIABUSCF_SOCKET])
return 0;
break;
case C0SB:
if (cf->pcmciabuscf_controller !=
PCMCIABUSCF_CONTROLLER_DEFAULT &&
cf->pcmciabuscf_controller != 0)
return 0;
if (cf->pcmciabuscf_socket !=
PCMCIABUSCF_SOCKET_DEFAULT &&
cf->pcmciabuscf_socket != 1)
return 0;
break;
case C1SA:
if (cf->pcmciabuscf_controller !=
PCMCIABUSCF_CONTROLLER_DEFAULT &&
cf->pcmciabuscf_controller != 1)
return 0;
if (cf->pcmciabuscf_socket !=
PCMCIABUSCF_SOCKET_DEFAULT &&
cf->pcmciabuscf_socket != 0)
return 0;
break;
case C1SB:
if (cf->pcmciabuscf_controller !=
PCMCIABUSCF_CONTROLLER_DEFAULT &&
cf->pcmciabuscf_controller != 1)
return 0;
if (cf->pcmciabuscf_socket !=
PCMCIABUSCF_SOCKET_DEFAULT &&
cf->pcmciabuscf_socket != 1)
return 0;
break;
default:
panic("unknown pcic socket");
}
return (config_match(parent, cf, aux));
}
@ -719,22 +671,7 @@ pcic_print(arg, pnp)
if (pnp)
aprint_normal("pcmcia at %s", pnp);
switch (h->sock) {
case C0SA:
aprint_normal(" controller 0 socket 0");
break;
case C0SB:
aprint_normal(" controller 0 socket 1");
break;
case C1SA:
aprint_normal(" controller 1 socket 0");
break;
case C1SB:
aprint_normal(" controller 1 socket 1");
break;
default:
panic("unknown pcic socket");
}
aprint_normal(" controller %d socket %d", h->chip, h->socket);
return (UNCONF);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: i82365var.h,v 1.20 2004/08/12 13:37:40 mycroft Exp $ */
/* $NetBSD: i82365var.h,v 1.21 2004/09/13 12:34:00 drochner Exp $ */
/*
* Copyright (c) 1997 Marc Horowitz. All rights reserved.
@ -58,7 +58,8 @@ struct pcic_handle {
int vendor; /* vendor of chip */
int chip; /* chip index 0 or 1 */
int sock;
int socket; /* socket index 0 or 1 */
int sock; /* register offset */
int flags;
int laststate;
int memalloc;

View File

@ -1,4 +1,4 @@
/* $NetBSD: tcic2.c,v 1.16 2004/08/11 06:56:57 mycroft Exp $ */
/* $NetBSD: tcic2.c,v 1.17 2004/09/13 12:34:00 drochner Exp $ */
/*
* Copyright (c) 1998, 1999 Christoph Badura. All rights reserved.
@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: tcic2.c,v 1.16 2004/08/11 06:56:57 mycroft Exp $");
__KERNEL_RCSID(0, "$NetBSD: tcic2.c,v 1.17 2004/09/13 12:34:00 drochner Exp $");
#undef TCICDEBUG
@ -51,6 +51,8 @@ __KERNEL_RCSID(0, "$NetBSD: tcic2.c,v 1.16 2004/08/11 06:56:57 mycroft Exp $");
#include <dev/ic/tcic2reg.h>
#include <dev/ic/tcic2var.h>
#include "locators.h"
#ifdef TCICDEBUG
int tcic_debug = 1;
#define DPRINTF(arg) if (tcic_debug) printf arg;
@ -68,7 +70,8 @@ int tcic_debug = 1;
void tcic_attach_socket __P((struct tcic_handle *));
void tcic_init_socket __P((struct tcic_handle *));
int tcic_submatch __P((struct device *, struct cfdata *, void *));
int tcic_submatch __P((struct device *, struct cfdata *,
const locdesc_t *, void *));
int tcic_print __P((void *arg, const char *pnp));
int tcic_intr_socket __P((struct tcic_handle *));
@ -409,6 +412,8 @@ tcic_attach_socket(h)
struct tcic_handle *h;
{
struct pcmciabus_attach_args paa;
int help[3];
locdesc_t *ldesc = (void *)help; /* XXX */
/* initialize the rest of the handle */
@ -425,8 +430,12 @@ tcic_attach_socket(h)
paa.iobase = h->sc->iobase;
paa.iosize = h->sc->iosize;
h->pcmcia = config_found_sm(&h->sc->dev, &paa, tcic_print,
tcic_submatch);
ldesc->len = 2;
ldesc->locs[PCMCIABUSCF_CONTROLLER] = 0;
ldesc->locs[PCMCIABUSCF_SOCKET] = h->sock;
h->pcmcia = config_found_sm_loc(&h->sc->dev, "pcmciabus", ldesc, &paa,
tcic_print, tcic_submatch);
/* if there's actually a pcmcia device attached, initialize the slot */
@ -529,42 +538,20 @@ tcic_init_socket(h)
}
int
tcic_submatch(parent, cf, aux)
tcic_submatch(parent, cf, ldesc, aux)
struct device *parent;
struct cfdata *cf;
const locdesc_t *ldesc;
void *aux;
{
struct pcmciabus_attach_args *paa = aux;
struct tcic_handle *h = (struct tcic_handle *) paa->pch;
switch (h->sock) {
case 0:
if (cf->pcmciabuscf_controller !=
PCMCIABUSCF_CONTROLLER_DEFAULT &&
cf->pcmciabuscf_controller != 0)
if (cf->cf_loc[PCMCIABUSCF_CONTROLLER] != PCMCIABUSCF_CONTROLLER_DEFAULT &&
cf->cf_loc[PCMCIABUSCF_CONTROLLER] != ldesc->locs[PCMCIABUSCF_CONTROLLER])
return 0;
if (cf->pcmciabuscf_socket !=
PCMCIABUSCF_SOCKET_DEFAULT &&
cf->pcmciabuscf_socket != 0)
if (cf->cf_loc[PCMCIABUSCF_SOCKET] != PCMCIABUSCF_SOCKET_DEFAULT &&
cf->cf_loc[PCMCIABUSCF_SOCKET] != ldesc->locs[PCMCIABUSCF_SOCKET])
return 0;
break;
case 1:
if (cf->pcmciabuscf_controller !=
PCMCIABUSCF_CONTROLLER_DEFAULT &&
cf->pcmciabuscf_controller != 0)
return 0;
if (cf->pcmciabuscf_socket !=
PCMCIABUSCF_SOCKET_DEFAULT &&
cf->pcmciabuscf_socket != 1)
return 0;
break;
default:
panic("unknown tcic socket");
}
return (config_match(parent, cf, aux));
}
@ -580,16 +567,8 @@ tcic_print(arg, pnp)
if (pnp)
aprint_normal("pcmcia at %s", pnp);
switch (h->sock) {
case 0:
aprint_normal(" socket 0");
break;
case 1:
aprint_normal(" socket 1");
break;
default:
panic("unknown tcic socket");
}
aprint_normal(" socket %d", h->sock);
return (UNCONF);
}