Move the socket reference counting into pcmcia_socket_{enable,disable}(), and

use that where needed.
This commit is contained in:
mycroft 2004-08-10 23:34:06 +00:00
parent 32dee96c25
commit 76ad292990
1 changed files with 27 additions and 29 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pcmcia.c,v 1.58 2004/08/10 19:15:08 mycroft Exp $ */ /* $NetBSD: pcmcia.c,v 1.59 2004/08/10 23:34:06 mycroft Exp $ */
/* /*
* Copyright (c) 2004 Charles M. Hannum. All rights reserved. * Copyright (c) 2004 Charles M. Hannum. All rights reserved.
@ -48,7 +48,7 @@
*/ */
#include <sys/cdefs.h> #include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pcmcia.c,v 1.58 2004/08/10 19:15:08 mycroft Exp $"); __KERNEL_RCSID(0, "$NetBSD: pcmcia.c,v 1.59 2004/08/10 23:34:06 mycroft Exp $");
#include "opt_pcmciaverbose.h" #include "opt_pcmciaverbose.h"
@ -149,36 +149,33 @@ pcmcia_card_attach(dev)
struct pcmcia_softc *sc = (struct pcmcia_softc *) dev; struct pcmcia_softc *sc = (struct pcmcia_softc *) dev;
struct pcmcia_function *pf; struct pcmcia_function *pf;
struct pcmcia_attach_args paa; struct pcmcia_attach_args paa;
int attached; int attached = 0;
/* /*
* this is here so that when socket_enable calls gettype, trt happens * this is here so that when socket_enable calls gettype, trt happens
*/ */
SIMPLEQ_FIRST(&sc->card.pf_head) = NULL; SIMPLEQ_FIRST(&sc->card.pf_head) = NULL;
pcmcia_chip_socket_enable(sc->pct, sc->pch); pcmcia_socket_enable(dev);
pcmcia_read_cis(sc); pcmcia_read_cis(sc);
pcmcia_chip_socket_disable(sc->pct, sc->pch);
pcmcia_check_cis_quirks(sc); pcmcia_check_cis_quirks(sc);
pcmcia_socket_disable(dev);
/* /*
* bail now if the card has no functions, or if there was an error in * bail now if the card has no functions, or if there was an error in
* the cis. * the cis.
*/ */
if (sc->card.error) if (sc->card.error)
return (1); goto done;
if (SIMPLEQ_EMPTY(&sc->card.pf_head)) if (SIMPLEQ_EMPTY(&sc->card.pf_head))
return (1); goto done;
if (pcmcia_verbose) if (pcmcia_verbose)
pcmcia_print_cis(sc); pcmcia_print_cis(sc);
attached = 0;
SIMPLEQ_FOREACH(pf, &sc->card.pf_head, pf_list) { SIMPLEQ_FOREACH(pf, &sc->card.pf_head, pf_list) {
if (SIMPLEQ_EMPTY(&pf->cfe_head)) if (SIMPLEQ_EMPTY(&pf->cfe_head))
continue; continue;
@ -211,6 +208,7 @@ pcmcia_card_attach(dev)
attached++; attached++;
} }
done:
return (attached ? 0 : 1); return (attached ? 0 : 1);
} }
@ -428,20 +426,28 @@ pcmcia_function_init(pf, cfe)
pf->cfe = cfe; pf->cfe = cfe;
} }
void pcmcia_socket_enable(dev) void
pcmcia_socket_enable(dev)
struct device *dev; struct device *dev;
{ {
struct pcmcia_softc *sc = (void *)dev; struct pcmcia_softc *sc = (void *)dev;
pcmcia_chip_socket_enable(sc->pct, sc->pch); if (sc->sc_enabled_count++ == 0)
pcmcia_chip_socket_enable(sc->pct, sc->pch);
DPRINTF(("%s: ++enabled_count = %d\n", sc->dev.dv_xname,
sc->sc_enabled_count));
} }
void pcmcia_socket_disable(dev) void
pcmcia_socket_disable(dev)
struct device *dev; struct device *dev;
{ {
struct pcmcia_softc *sc = (void *)dev; struct pcmcia_softc *sc = (void *)dev;
pcmcia_chip_socket_disable(sc->pct, sc->pch); if (--sc->sc_enabled_count == 0)
pcmcia_chip_socket_disable(sc->pct, sc->pch);
DPRINTF(("%s: --enabled_count = %d\n", sc->dev.dv_xname,
sc->sc_enabled_count));
} }
/* Enable a PCMCIA function */ /* Enable a PCMCIA function */
@ -461,10 +467,7 @@ pcmcia_function_enable(pf)
* Increase the reference count on the socket, enabling power, if * Increase the reference count on the socket, enabling power, if
* necessary. * necessary.
*/ */
if (sc->sc_enabled_count++ == 0) pcmcia_socket_enable(&sc->dev);
pcmcia_chip_socket_enable(sc->pct, sc->pch);
DPRINTF(("%s: ++enabled_count = %d\n", sc->dev.dv_xname,
sc->sc_enabled_count));
if (pf->pf_flags & PFF_ENABLED) { if (pf->pf_flags & PFF_ENABLED) {
/* /*
@ -582,11 +585,8 @@ bad:
* Decrement the reference count, and power down the socket, if * Decrement the reference count, and power down the socket, if
* necessary. * necessary.
*/ */
if (--sc->sc_enabled_count == 0)
pcmcia_chip_socket_disable(sc->pct, sc->pch);
DPRINTF(("%s: --enabled_count = %d\n", sc->dev.dv_xname,
sc->sc_enabled_count));
printf("%s: couldn't map the CCR\n", pf->child->dv_xname); printf("%s: couldn't map the CCR\n", pf->child->dv_xname);
pcmcia_socket_disable(&sc->dev);
return (error); return (error);
} }
@ -596,6 +596,7 @@ void
pcmcia_function_disable(pf) pcmcia_function_disable(pf)
struct pcmcia_function *pf; struct pcmcia_function *pf;
{ {
struct pcmcia_softc *sc = pf->sc;
struct pcmcia_function *tmp; struct pcmcia_function *tmp;
int reg; int reg;
@ -609,7 +610,7 @@ pcmcia_function_disable(pf)
goto out; goto out;
} }
if (pcmcia_mfc(pf->sc)) { if (pcmcia_mfc(sc)) {
reg = pcmcia_ccr_read(pf, PCMCIA_CCR_OPTION); reg = pcmcia_ccr_read(pf, PCMCIA_CCR_OPTION);
reg &= ~(PCMCIA_CCR_OPTION_FUNC_ENABLE| reg &= ~(PCMCIA_CCR_OPTION_FUNC_ENABLE|
PCMCIA_CCR_OPTION_ADDR_DECODE| PCMCIA_CCR_OPTION_ADDR_DECODE|
@ -624,7 +625,7 @@ pcmcia_function_disable(pf)
*/ */
pf->pf_flags &= ~PFF_ENABLED; pf->pf_flags &= ~PFF_ENABLED;
SIMPLEQ_FOREACH(tmp, &pf->sc->card.pf_head, pf_list) { SIMPLEQ_FOREACH(tmp, &sc->card.pf_head, pf_list) {
if ((tmp->pf_flags & PFF_ENABLED) && if ((tmp->pf_flags & PFF_ENABLED) &&
(pf->ccr_base >= (tmp->ccr_base - tmp->pf_ccr_offset)) && (pf->ccr_base >= (tmp->ccr_base - tmp->pf_ccr_offset)) &&
((pf->ccr_base + PCMCIA_CCR_SIZE) <= ((pf->ccr_base + PCMCIA_CCR_SIZE) <=
@ -643,10 +644,7 @@ out:
* Decrement the reference count, and power down the socket, if * Decrement the reference count, and power down the socket, if
* necessary. * necessary.
*/ */
if (--pf->sc->sc_enabled_count == 0) pcmcia_socket_disable(&sc->dev);
pcmcia_chip_socket_disable(pf->sc->pct, pf->sc->pch);
DPRINTF(("%s: --enabled_count = %d\n", pf->sc->dev.dv_xname,
pf->sc->sc_enabled_count));
} }
int int