Changeset View
Changeset View
Standalone View
Standalone View
sys/dev/bhnd/bhndb/bhndb_pci.c
Show First 20 Lines • Show All 600 Lines • ▼ Show 20 Lines | bhndb_disable_pci_clocks(struct bhndb_pci_softc *sc) | ||||
/* Enable both output pins */ | /* Enable both output pins */ | ||||
gpio_en |= (BHNDB_PCI_GPIO_PLL_OFF|BHNDB_PCI_GPIO_XTAL_ON); | gpio_en |= (BHNDB_PCI_GPIO_PLL_OFF|BHNDB_PCI_GPIO_XTAL_ON); | ||||
pci_write_config(sc->parent, BHNDB_PCI_GPIO_OUTEN, gpio_en, 4); | pci_write_config(sc->parent, BHNDB_PCI_GPIO_OUTEN, gpio_en, 4); | ||||
return (0); | return (0); | ||||
} | } | ||||
static bhnd_clksrc | |||||
bhndb_pci_pwrctl_get_clksrc(device_t dev, device_t child, | |||||
bhnd_clock clock) | |||||
{ | |||||
struct bhndb_pci_softc *sc; | |||||
uint32_t gpio_out; | |||||
sc = device_get_softc(dev); | |||||
/* Only supported on PCI devices */ | |||||
if (sc->pci_devclass != BHND_DEVCLASS_PCI) | |||||
return (ENODEV); | |||||
/* Only ILP is supported */ | |||||
if (clock != BHND_CLOCK_ILP) | |||||
return (ENXIO); | |||||
gpio_out = pci_read_config(sc->parent, BHNDB_PCI_GPIO_OUT, 4); | |||||
if (gpio_out & BHNDB_PCI_GPIO_SCS) | |||||
return (BHND_CLKSRC_PCI); | |||||
else | |||||
return (BHND_CLKSRC_XTAL); | |||||
} | |||||
static int | |||||
bhndb_pci_pwrctl_gate_clock(device_t dev, device_t child, | |||||
bhnd_clock clock) | |||||
{ | |||||
struct bhndb_pci_softc *sc = device_get_softc(dev); | |||||
/* Only supported on PCI devices */ | |||||
if (sc->pci_devclass != BHND_DEVCLASS_PCI) | |||||
return (ENODEV); | |||||
/* Only HT is supported */ | |||||
if (clock != BHND_CLOCK_HT) | |||||
return (ENXIO); | |||||
return (bhndb_disable_pci_clocks(sc)); | |||||
} | |||||
static int | |||||
bhndb_pci_pwrctl_ungate_clock(device_t dev, device_t child, | |||||
bhnd_clock clock) | |||||
{ | |||||
struct bhndb_pci_softc *sc = device_get_softc(dev); | |||||
/* Only supported on PCI devices */ | |||||
if (sc->pci_devclass != BHND_DEVCLASS_PCI) | |||||
return (ENODEV); | |||||
/* Only HT is supported */ | |||||
if (clock != BHND_CLOCK_HT) | |||||
return (ENXIO); | |||||
return (bhndb_enable_pci_clocks(sc)); | |||||
} | |||||
static device_method_t bhndb_pci_methods[] = { | static device_method_t bhndb_pci_methods[] = { | ||||
/* Device interface */ | /* Device interface */ | ||||
DEVMETHOD(device_probe, bhndb_pci_probe), | DEVMETHOD(device_probe, bhndb_pci_probe), | ||||
DEVMETHOD(device_attach, bhndb_pci_attach), | DEVMETHOD(device_attach, bhndb_pci_attach), | ||||
DEVMETHOD(device_resume, bhndb_pci_resume), | DEVMETHOD(device_resume, bhndb_pci_resume), | ||||
DEVMETHOD(device_suspend, bhndb_pci_suspend), | DEVMETHOD(device_suspend, bhndb_pci_suspend), | ||||
DEVMETHOD(device_detach, bhndb_pci_detach), | DEVMETHOD(device_detach, bhndb_pci_detach), | ||||
/* BHND interface */ | |||||
DEVMETHOD(bhnd_bus_pwrctl_get_clksrc, bhndb_pci_pwrctl_get_clksrc), | |||||
DEVMETHOD(bhnd_bus_pwrctl_gate_clock, bhndb_pci_pwrctl_gate_clock), | |||||
DEVMETHOD(bhnd_bus_pwrctl_ungate_clock, bhndb_pci_pwrctl_ungate_clock), | |||||
/* BHNDB interface */ | /* BHNDB interface */ | ||||
DEVMETHOD(bhndb_init_full_config, bhndb_pci_init_full_config), | DEVMETHOD(bhndb_init_full_config, bhndb_pci_init_full_config), | ||||
DEVMETHOD(bhndb_set_window_addr, bhndb_pci_set_window_addr), | DEVMETHOD(bhndb_set_window_addr, bhndb_pci_set_window_addr), | ||||
DEVMETHOD(bhndb_populate_board_info, bhndb_pci_populate_board_info), | DEVMETHOD(bhndb_populate_board_info, bhndb_pci_populate_board_info), | ||||
DEVMETHOD_END | DEVMETHOD_END | ||||
}; | }; | ||||
DEFINE_CLASS_1(bhndb, bhndb_pci_driver, bhndb_pci_methods, | DEFINE_CLASS_1(bhndb, bhndb_pci_driver, bhndb_pci_methods, | ||||
sizeof(struct bhndb_pci_softc), bhndb_driver); | sizeof(struct bhndb_pci_softc), bhndb_driver); | ||||
MODULE_VERSION(bhndb_pci, 1); | MODULE_VERSION(bhndb_pci, 1); | ||||
MODULE_DEPEND(bhndb_pci, bhnd_pci_hostb, 1, 1, 1); | MODULE_DEPEND(bhndb_pci, bhnd_pci_hostb, 1, 1, 1); | ||||
MODULE_DEPEND(bhndb_pci, bhnd_pcie2_hostb, 1, 1, 1); | |||||
MODULE_DEPEND(bhndb_pci, pci, 1, 1, 1); | MODULE_DEPEND(bhndb_pci, pci, 1, 1, 1); | ||||
MODULE_DEPEND(bhndb_pci, bhndb, 1, 1, 1); | MODULE_DEPEND(bhndb_pci, bhndb, 1, 1, 1); | ||||
MODULE_DEPEND(bhndb_pci, bhnd, 1, 1, 1); | MODULE_DEPEND(bhndb_pci, bhnd, 1, 1, 1); |