- device_t/softc split.

- use aprint_* function.
This commit is contained in:
nonaka 2011-06-09 17:29:42 +00:00
parent 3a128b33dc
commit c09d499033
5 changed files with 93 additions and 93 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: pxa2x0.c,v 1.18 2009/08/09 06:12:33 kiyohara Exp $ */
/* $NetBSD: pxa2x0.c,v 1.19 2011/06/09 17:29:42 nonaka Exp $ */
/*
* Copyright (c) 2002, 2005 Genetec Corporation. All rights reserved.
@ -99,7 +99,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pxa2x0.c,v 1.18 2009/08/09 06:12:33 kiyohara Exp $");
__KERNEL_RCSID(0, "$NetBSD: pxa2x0.c,v 1.19 2011/06/09 17:29:42 nonaka Exp $");
#include "pxaintc.h"
#include "pxagpio.h"
@ -126,7 +126,7 @@ __KERNEL_RCSID(0, "$NetBSD: pxa2x0.c,v 1.18 2009/08/09 06:12:33 kiyohara Exp $")
#include <arm/xscale/xscalereg.h>
struct pxaip_softc {
struct device sc_dev;
device_t sc_dev;
bus_space_tag_t sc_bust;
bus_dma_tag_t sc_dmat;
bus_space_handle_t sc_bush_clk;
@ -134,10 +134,9 @@ struct pxaip_softc {
};
/* prototypes */
static int pxaip_match(struct device *, struct cfdata *, void *);
static void pxaip_attach(struct device *, struct device *, void *);
static int pxaip_search(struct device *, struct cfdata *,
const int *, void *);
static int pxaip_match(device_t, cfdata_t, void *);
static void pxaip_attach(device_t, device_t, void *);
static int pxaip_search(device_t, cfdata_t, const int *, void *);
static void pxaip_attach_critical(struct pxaip_softc *);
static int pxaip_print(void *, const char *);
@ -154,7 +153,7 @@ static int pxaip_measure_cpuclock(struct pxaip_softc *);
#endif
/* attach structures */
CFATTACH_DECL(pxaip, sizeof(struct pxaip_softc),
CFATTACH_DECL_NEW(pxaip, sizeof(struct pxaip_softc),
pxaip_match, pxaip_attach, NULL, NULL);
static struct pxaip_softc *pxaip_sc;
@ -166,7 +165,7 @@ static vaddr_t pxaclkman_regs;
(*((volatile uint32_t *)(pxaclkman_regs + (reg))))
static int
pxaip_match(struct device *parent, struct cfdata *match, void *aux)
pxaip_match(device_t parent, cfdata_t match, void *aux)
{
#if !defined(CPU_XSCALE_PXA270)
@ -190,16 +189,17 @@ pxaip_match(struct device *parent, struct cfdata *match, void *aux)
}
static void
pxaip_attach(struct device *parent, struct device *self, void *aux)
pxaip_attach(device_t parent, device_t self, void *aux)
{
struct pxaip_softc *sc = (struct pxaip_softc *)self;
struct pxaip_softc *sc = device_private(self);
int cpuclock;
pxaip_sc = sc;
sc->sc_dev = self;
sc->sc_bust = &pxa2x0_bs_tag;
sc->sc_dmat = &pxa2x0_bus_dma_tag;
aprint_normal(": PXA2x0 Onchip Peripheral Bus\n");
aprint_normal(": Onchip Peripheral Bus\n");
if (bus_space_map(sc->sc_bust, PXA2X0_CLKMAN_BASE, PXA2X0_CLKMAN_SIZE,
0, &sc->sc_bush_clk))
@ -234,8 +234,7 @@ pxaip_attach(struct device *parent, struct device *self, void *aux)
}
static int
pxaip_search(struct device *parent, struct cfdata *cf,
const int *ldesc, void *aux)
pxaip_search(device_t parent, cfdata_t cf, const int *ldesc, void *aux)
{
struct pxaip_softc *sc = aux;
struct pxaip_attach_args aa;
@ -265,7 +264,7 @@ pxaip_attach_critical(struct pxaip_softc *sc)
aa.pxa_addr = PXA2X0_INTCTL_BASE;
aa.pxa_size = PXA2X0_INTCTL_SIZE;
aa.pxa_intr = PXAIPCF_INTR_DEFAULT;
if (config_found(&sc->sc_dev, &aa, pxaip_print) == NULL)
if (config_found(sc->sc_dev, &aa, pxaip_print) == NULL)
panic("pxaip_attach_critical: failed to attach INTC!");
#if NPXAGPIO > 0
@ -275,7 +274,7 @@ pxaip_attach_critical(struct pxaip_softc *sc)
aa.pxa_addr = PXA2X0_GPIO_BASE;
aa.pxa_size = PXA2X0_GPIO_SIZE;
aa.pxa_intr = PXAIPCF_INTR_DEFAULT;
if (config_found(&sc->sc_dev, &aa, pxaip_print) == NULL)
if (config_found(sc->sc_dev, &aa, pxaip_print) == NULL)
panic("pxaip_attach_critical: failed to attach GPIO!");
#endif
@ -286,7 +285,7 @@ pxaip_attach_critical(struct pxaip_softc *sc)
aa.pxa_addr = PXA2X0_DMAC_BASE;
aa.pxa_size = PXA2X0_DMAC_SIZE;
aa.pxa_intr = PXA2X0_INT_DMA;
if (config_found(&sc->sc_dev, &aa, pxaip_print) == NULL)
if (config_found(sc->sc_dev, &aa, pxaip_print) == NULL)
panic("pxaip_attach_critical: failed to attach DMAC!");
#endif
}
@ -294,7 +293,7 @@ pxaip_attach_critical(struct pxaip_softc *sc)
static int
pxaip_print(void *aux, const char *name)
{
struct pxaip_attach_args *sa = (struct pxaip_attach_args*)aux;
struct pxaip_attach_args *sa = (struct pxaip_attach_args *)aux;
if (sa->pxa_addr != PXAIPCF_ADDR_DEFAULT) {
aprint_normal(" addr 0x%lx", sa->pxa_addr);

View File

@ -1,4 +1,4 @@
/* $NetBSD: pxa2x0_ac97.c,v 1.7 2007/10/17 19:53:44 garbled Exp $ */
/* $NetBSD: pxa2x0_ac97.c,v 1.8 2011/06/09 17:29:42 nonaka Exp $ */
/*
* Copyright (c) 2003, 2005 Wasabi Systems, Inc.
@ -75,7 +75,7 @@ struct acu_dma {
#define KERNADDR(ad) ((void *)((ad)->ad_addr))
struct acu_softc {
struct device sc_dev;
device_t sc_dev;
bus_space_tag_t sc_bust;
bus_dma_tag_t sc_dmat;
bus_space_handle_t sc_bush;
@ -113,10 +113,10 @@ struct acu_softc {
struct audio_encoding_set *sc_encodings;
};
static int pxaacu_match(struct device *, struct cfdata *, void *);
static void pxaacu_attach(struct device *, struct device *, void *);
static int pxaacu_match(device_t, cfdata_t, void *);
static void pxaacu_attach(device_t, device_t, void *);
CFATTACH_DECL(pxaacu, sizeof(struct acu_softc),
CFATTACH_DECL_NEW(pxaacu, sizeof(struct acu_softc),
pxaacu_match, pxaacu_attach, NULL, NULL);
static int acu_codec_attach(void *, struct ac97_codec_if *);
@ -230,7 +230,7 @@ acu_wait_gsr(struct acu_softc *sc, u_int32_t bit)
}
static int
pxaacu_match(struct device *parent, struct cfdata *cf, void *aux)
pxaacu_match(device_t parent, cfdata_t cf, void *aux)
{
struct pxaip_attach_args *pxa = aux;
struct pxa2x0_gpioconf *gpioconf;
@ -256,11 +256,12 @@ pxaacu_match(struct device *parent, struct cfdata *cf, void *aux)
}
static void
pxaacu_attach(struct device *parent, struct device *self, void *aux)
pxaacu_attach(device_t parent, device_t self, void *aux)
{
struct acu_softc *sc = (struct acu_softc *)self;
struct acu_softc *sc = device_private(self);
struct pxaip_attach_args *pxa = aux;
sc->sc_dev = self;
sc->sc_bust = pxa->pxa_iot;
sc->sc_dmat = pxa->pxa_dmat;
@ -269,7 +270,7 @@ pxaacu_attach(struct device *parent, struct device *self, void *aux)
if (bus_space_map(sc->sc_bust, pxa->pxa_addr, pxa->pxa_size, 0,
&sc->sc_bush)) {
aprint_error("%s: Can't map registers!\n", sc->sc_dev.dv_xname);
aprint_error_dev(self, "Can't map registers!\n");
return;
}
@ -293,8 +294,7 @@ pxaacu_attach(struct device *parent, struct device *self, void *aux)
delay(100);
pxa2x0_clkman_config(CKEN_AC97, false);
bus_space_unmap(sc->sc_bust, sc->sc_bush, pxa->pxa_size);
aprint_error("%s: Primary codec not ready\n",
sc->sc_dev.dv_xname);
aprint_error_dev(self, "Primary codec not ready\n");
return;
}
@ -311,9 +311,8 @@ pxaacu_attach(struct device *parent, struct device *self, void *aux)
sc->sc_in_reset = 0;
sc->sc_dac_rate = sc->sc_adc_rate = 0;
if (ac97_attach(&sc->sc_host_if, &sc->sc_dev)) {
aprint_error("%s: Failed to attach primary codec\n",
sc->sc_dev.dv_xname);
if (ac97_attach(&sc->sc_host_if, sc->sc_dev)) {
aprint_error_dev(self, "Failed to attach primary codec\n");
fail:
acu_reg_write(sc, AC97_GCR, 0);
delay(100);
@ -324,14 +323,13 @@ pxaacu_attach(struct device *parent, struct device *self, void *aux)
if (auconv_create_encodings(acu_formats, ACU_NFORMATS,
&sc->sc_encodings)) {
aprint_error("%s: Failed to create encodings\n",
sc->sc_dev.dv_xname);
aprint_error_dev(self, "Failed to create encodings\n");
if (sc->sc_codec_if != NULL)
(sc->sc_codec_if->vtbl->detach)(sc->sc_codec_if);
goto fail;
}
sc->sc_audiodev = audio_attach_mi(&acu_hw_if, sc, &sc->sc_dev);
sc->sc_audiodev = audio_attach_mi(&acu_hw_if, sc, sc->sc_dev);
/*
* As a work-around for braindamage in the PXA250's AC97 controller
@ -463,8 +461,8 @@ acu_codec_reset(void *arg)
delay(100);
if (acu_wait_gsr(sc, GSR_PCR)) {
printf("%s: acu_codec_reset: failed to ready after reset\n",
sc->sc_dev.dv_xname);
aprint_error_dev(sc->sc_dev,
"acu_codec_reset: failed to ready after reset\n");
return (ETIMEDOUT);
}
@ -488,7 +486,7 @@ acu_intr(void *arg)
acu_reg_write(sc, AC97_POCR, 0);
reg = acu_reg_read(sc, AC97_POSR);
acu_reg_write(sc, AC97_POSR, reg);
printf("%s: Tx PCM Fifo underrun\n", sc->sc_dev.dv_xname);
aprint_error_dev(sc->sc_dev, "Tx PCM Fifo underrun\n");
}
/*
@ -502,7 +500,7 @@ acu_intr(void *arg)
acu_reg_write(sc, AC97_PICR, 0);
reg = acu_reg_read(sc, AC97_PISR);
acu_reg_write(sc, AC97_PISR, reg);
printf("%s: Rx PCM Fifo overrun\n", sc->sc_dev.dv_xname);
aprint_error_dev(sc->sc_dev, "Rx PCM Fifo overrun\n");
}
return (1);
@ -925,9 +923,9 @@ acu_tx_loop_segment(struct dmac_xfer *dx, int status)
panic("acu_tx_loop_segment: xfer mismatch!");
if (status) {
printf(
"%s: acu_tx_loop_segment: non-zero completion status %d\n",
sc->sc_dev.dv_xname, status);
aprint_error_dev(sc->sc_dev,
"acu_tx_loop_segment: non-zero completion status %d\n",
status);
}
s = splaudio();
@ -949,9 +947,9 @@ acu_rx_loop_segment(struct dmac_xfer *dx, int status)
panic("acu_rx_loop_segment: xfer mismatch!");
if (status) {
printf(
"%s: acu_rx_loop_segment: non-zero completion status %d\n",
sc->sc_dev.dv_xname, status);
aprint_error_dev(sc->sc_dev,
"acu_rx_loop_segment: non-zero completion status %d\n",
status);
}
s = splaudio();

View File

@ -1,4 +1,4 @@
/* $NetBSD: pxa2x0_dmac.c,v 1.6 2009/03/16 11:42:31 nonaka Exp $ */
/* $NetBSD: pxa2x0_dmac.c,v 1.7 2011/06/09 17:29:42 nonaka Exp $ */
/*
* Copyright (c) 2003, 2005 Wasabi Systems, Inc.
@ -163,7 +163,7 @@ struct dmac_dmover {
#endif
struct pxadmac_softc {
struct device sc_dev;
device_t sc_dev;
bus_space_tag_t sc_bust;
bus_dma_tag_t sc_dmat;
bus_space_handle_t sc_bush;
@ -216,10 +216,10 @@ struct pxadmac_softc {
#endif
};
static int pxadmac_match(struct device *, struct cfdata *, void *);
static void pxadmac_attach(struct device *, struct device *, void *);
static int pxadmac_match(device_t, cfdata_t, void *);
static void pxadmac_attach(device_t, device_t, void *);
CFATTACH_DECL(pxadmac, sizeof(struct pxadmac_softc),
CFATTACH_DECL_NEW(pxadmac, sizeof(struct pxadmac_softc),
pxadmac_match, pxadmac_attach, NULL, NULL);
static struct pxadmac_softc *pxadmac_sc;
@ -278,7 +278,7 @@ dmac_free_channel(struct pxadmac_softc *sc, dmac_priority_t priority,
}
static int
pxadmac_match(struct device *parent, struct cfdata *cf, void *aux)
pxadmac_match(device_t parent, cfdata_t cf, void *aux)
{
struct pxaip_attach_args *pxa = aux;
@ -292,13 +292,14 @@ pxadmac_match(struct device *parent, struct cfdata *cf, void *aux)
}
static void
pxadmac_attach(struct device *parent, struct device *self, void *aux)
pxadmac_attach(device_t parent, device_t self, void *aux)
{
struct pxadmac_softc *sc = (struct pxadmac_softc *)self;
struct pxadmac_softc *sc = device_private(self);
struct pxaip_attach_args *pxa = aux;
struct pxa2x0_dma_desc *dd;
int i, nsegs;
sc->sc_dev = self;
sc->sc_bust = pxa->pxa_iot;
sc->sc_dmat = pxa->pxa_dmat;
@ -306,7 +307,7 @@ pxadmac_attach(struct device *parent, struct device *self, void *aux)
if (bus_space_map(sc->sc_bust, pxa->pxa_addr, pxa->pxa_size, 0,
&sc->sc_bush)) {
aprint_error("%s: Can't map registers!\n", sc->sc_dev.dv_xname);
aprint_error_dev(self, "Can't map registers!\n");
return;
}
@ -1186,8 +1187,9 @@ dmac_channel_intr(struct pxadmac_softc *sc, u_int channel)
dmac_reg_write(sc, DMAC_DCSR(channel), dcsr & ~DCSR_RUN);
if ((dxs = sc->sc_active[channel]) == NULL) {
printf("%s: Stray DMAC interrupt for unallocated channel %d\n",
sc->sc_dev.dv_xname, channel);
aprint_error_dev(sc->sc_dev,
"Stray DMAC interrupt for unallocated channel %d\n",
channel);
return (0);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: pxa2x0_gpio.c,v 1.13 2009/08/04 12:11:33 kiyohara Exp $ */
/* $NetBSD: pxa2x0_gpio.c,v 1.14 2011/06/09 17:29:42 nonaka Exp $ */
/*
* Copyright 2003 Wasabi Systems, Inc.
@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: pxa2x0_gpio.c,v 1.13 2009/08/04 12:11:33 kiyohara Exp $");
__KERNEL_RCSID(0, "$NetBSD: pxa2x0_gpio.c,v 1.14 2011/06/09 17:29:42 nonaka Exp $");
#include "opt_pxa2x0_gpio.h"
@ -65,7 +65,7 @@ struct gpio_irq_handler {
};
struct pxagpio_softc {
struct device sc_dev;
device_t sc_dev;
bus_space_tag_t sc_bust;
bus_space_handle_t sc_bush;
void *sc_irqcookie[4];
@ -77,10 +77,10 @@ struct pxagpio_softc {
#endif
};
static int pxagpio_match(struct device *, struct cfdata *, void *);
static void pxagpio_attach(struct device *, struct device *, void *);
static int pxagpio_match(device_t, cfdata_t, void *);
static void pxagpio_attach(device_t, device_t, void *);
CFATTACH_DECL(pxagpio, sizeof(struct pxagpio_softc),
CFATTACH_DECL_NEW(pxagpio, sizeof(struct pxagpio_softc),
pxagpio_match, pxagpio_attach, NULL, NULL);
static struct pxagpio_softc *pxagpio_softc;
@ -120,7 +120,7 @@ pxagpio_reg_write(struct pxagpio_softc *sc, int reg, u_int32_t val)
}
static int
pxagpio_match(struct device *parent, struct cfdata *cf, void *aux)
pxagpio_match(device_t parent, cfdata_t cf, void *aux)
{
struct pxaip_attach_args *pxa = aux;
@ -133,18 +133,19 @@ pxagpio_match(struct device *parent, struct cfdata *cf, void *aux)
}
static void
pxagpio_attach(struct device *parent, struct device *self, void *aux)
pxagpio_attach(device_t parent, device_t self, void *aux)
{
struct pxagpio_softc *sc = (struct pxagpio_softc *)self;
struct pxagpio_softc *sc = device_private(self);
struct pxaip_attach_args *pxa = aux;
sc->sc_dev = self;
sc->sc_bust = pxa->pxa_iot;
aprint_normal(": GPIO Controller\n");
if (bus_space_map(sc->sc_bust, pxa->pxa_addr, pxa->pxa_size, 0,
&sc->sc_bush)) {
aprint_error("%s: Can't map registers!\n", sc->sc_dev.dv_xname);
aprint_error_dev(self, "Can't map registers!\n");
return;
}
@ -176,8 +177,7 @@ pxagpio_attach(struct device *parent, struct device *self, void *aux)
sc->sc_irqcookie[2] = pxa2x0_intr_establish(PXA2X0_INT_GPION, IPL_BIO,
gpio_intrN, sc);
if (sc->sc_irqcookie[2] == NULL) {
aprint_error("%s: failed to hook main GPIO interrupt\n",
sc->sc_dev.dv_xname);
aprint_error_dev(self, "failed to hook main GPIO interrupt\n");
return;
}
#endif
@ -323,8 +323,7 @@ gpio_intr0(void *arg)
#ifdef DIAGNOSTIC
if (sc->sc_handlers[0] == NULL) {
printf("%s: stray GPIO#0 edge interrupt\n",
sc->sc_dev.dv_xname);
aprint_error_dev(sc->sc_dev, "stray GPIO#0 edge interrupt\n");
return (0);
}
#endif
@ -342,8 +341,7 @@ gpio_intr1(void *arg)
#ifdef DIAGNOSTIC
if (sc->sc_handlers[1] == NULL) {
printf("%s: stray GPIO#1 edge interrupt\n",
sc->sc_dev.dv_xname);
aprint_error_dev(sc->sc_dev, "stray GPIO#1 edge interrupt\n");
return (0);
}
#endif
@ -385,8 +383,9 @@ gpio_dispatch(struct pxagpio_softc *sc, int gpio_base)
*/
#ifdef DEBUG
if ((gedr & sc->sc_mask[bank]) == 0) {
printf("%s: stray GPIO interrupt. Bank %d, GEDR 0x%08x, mask 0x%08x\n",
sc->sc_dev.dv_xname, bank, gedr, sc->sc_mask[bank]);
aprint_error_dev(sc->sc_dev,
"stray GPIO interrupt. Bank %d, GEDR 0x%08x, mask 0x%08x\n",
bank, gedr, sc->sc_mask[bank]);
return (1); /* XXX: Pretend we dealt with it */
}
#endif
@ -405,8 +404,9 @@ gpio_dispatch(struct pxagpio_softc *sc, int gpio_base)
gedr &= ~mask;
if ((gh = *ghp) == NULL) {
printf("%s: unhandled GPIO interrupt. GPIO#%d\n",
sc->sc_dev.dv_xname, gpio_base + i);
aprint_error_dev(sc->sc_dev,
"unhandled GPIO interrupt. GPIO#%d\n",
gpio_base + i);
continue;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: pxa2x0_udc.c,v 1.3 2009/08/09 06:24:03 kiyohara Exp $ */
/* $NetBSD: pxa2x0_udc.c,v 1.4 2011/06/09 17:29:42 nonaka Exp $ */
/* $OpenBSD: pxa27x_udc.c,v 1.5 2005/03/30 14:24:39 dlg Exp $ */
/*
@ -31,7 +31,7 @@
#include <arm/xscale/pxa2x0_gpio.h>
struct pxaudc_softc {
struct device sc_dev;
device_t sc_dev;
bus_space_tag_t sc_iot;
bus_space_handle_t sc_ioh;
bus_size_t sc_size;
@ -39,18 +39,18 @@ struct pxaudc_softc {
void *sc_powerhook;
};
static int pxaudc_match(struct device *, struct cfdata *, void *);
static void pxaudc_attach(struct device *, struct device *, void *);
static int pxaudc_detach(struct device *, int);
static int pxaudc_match(device_t, cfdata_t, void *);
static void pxaudc_attach(device_t, device_t, void *);
static int pxaudc_detach(device_t, int);
CFATTACH_DECL(pxaudc, sizeof(struct pxaudc_softc),
CFATTACH_DECL_NEW(pxaudc, sizeof(struct pxaudc_softc),
pxaudc_match, pxaudc_attach, pxaudc_detach, NULL);
static void pxaudc_power(int, void *);
static void pxaudc_enable(struct pxaudc_softc *);
static int
pxaudc_match(struct device *parent, struct cfdata *cf, void *aux)
pxaudc_match(device_t parent, cfdata_t cf, void *aux)
{
struct pxaip_attach_args *pxa = aux;
@ -62,24 +62,26 @@ pxaudc_match(struct device *parent, struct cfdata *cf, void *aux)
}
static void
pxaudc_attach(struct device *parent, struct device *self, void *aux)
pxaudc_attach(device_t parent, device_t self, void *aux)
{
struct pxaudc_softc *sc = (struct pxaudc_softc *)self;
struct pxaudc_softc *sc = device_private(self);
struct pxaip_attach_args *pxa = (struct pxaip_attach_args *)aux;
sc->sc_dev = self;
sc->sc_iot = pxa->pxa_iot;
sc->sc_size = 0;
sc->sc_powerhook = NULL;
aprint_normal(": USB Device Controller\n");
aprint_naive("\n");
if (bus_space_map(sc->sc_iot, pxa->pxa_addr, pxa->pxa_size, 0,
&sc->sc_ioh)) {
aprint_error(": couldn't map memory space\n");
aprint_error_dev(self, "couldn't map memory space\n");
return;
}
sc->sc_size = pxa->pxa_size;
printf(": PXA2x0 USB Device Controller\n");
bus_space_barrier(sc->sc_iot, sc->sc_ioh, 0, sc->sc_size,
BUS_SPACE_BARRIER_READ|BUS_SPACE_BARRIER_WRITE);
@ -87,18 +89,17 @@ pxaudc_attach(struct device *parent, struct device *self, void *aux)
pxaudc_enable(sc);
sc->sc_powerhook = powerhook_establish(sc->sc_dev.dv_xname,
sc->sc_powerhook = powerhook_establish(device_xname(self),
pxaudc_power, sc);
if (sc->sc_powerhook == NULL) {
aprint_error("%s: unable to establish powerhook.\n",
sc->sc_dev.dv_xname);
aprint_error_dev(self, "unable to establish powerhook.\n");
}
}
static int
pxaudc_detach(struct device *self, int flags)
pxaudc_detach(device_t self, int flags)
{
struct pxaudc_softc *sc = (struct pxaudc_softc *)self;
struct pxaudc_softc *sc = device_private(self);
if (sc->sc_powerhook)
powerhook_disestablish(sc->sc_powerhook);