1
0
mirror of https://git.FreeBSD.org/src.git synced 2024-12-16 10:20:30 +00:00

Relocate interrupt sense setting for K2 SATA from the ATA driver to the

OFW PCI layer and read the sense directly from the device tree instead
of guessing.

MFC after:	1 week
This commit is contained in:
Nathan Whitehorn 2010-05-16 17:55:09 +00:00
parent f751743351
commit 4dea0435b5
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=208162
2 changed files with 25 additions and 15 deletions

View File

@ -41,9 +41,6 @@ __FBSDID("$FreeBSD$");
#include <sys/sema.h>
#include <sys/taskqueue.h>
#include <vm/uma.h>
#ifdef __powerpc__
#include <machine/intr_machdep.h>
#endif
#include <machine/stdarg.h>
#include <machine/resource.h>
#include <machine/bus.h>
@ -220,10 +217,6 @@ ata_serverworks_ch_attach(device_t dev)
ch->hw.tf_write = ata_serverworks_tf_write;
#ifdef __powerpc__
ch->hw.status = ata_serverworks_status;
/* Make sure that our interrupt is edge triggered */
powerpc_config_intr(bus_get_resource_start(device_get_parent(dev),
SYS_RES_IRQ, 0), INTR_TRIGGER_EDGE, INTR_POLARITY_HIGH);
#endif
if (ctlr->chip->chipid == ATA_K2) {

View File

@ -43,6 +43,7 @@ __FBSDID("$FreeBSD$");
#include <dev/ofw/openfirm.h>
#include <machine/bus.h>
#include <machine/intr_machdep.h>
#include <machine/resource.h>
#include <dev/pci/pcireg.h>
@ -192,20 +193,36 @@ ofw_pcibus_enum_devtree(device_t dev, u_int domain, u_int busno)
pci_add_child(dev, (struct pci_devinfo *)dinfo);
/*
* Some devices don't have an intpin set, but do have
* interrupts. These are fully specified, and set in the
* Some devices don't have an intpin set, but do have
* interrupts. These are fully specified, and set in the
* interrupts property, so add that value to the device's
* resource list.
*/
if (dinfo->opd_dinfo.cfg.intpin == 0) {
ofw_pci_intr_t intr;
*/
if (dinfo->opd_dinfo.cfg.intpin == 0) {
ofw_pci_intr_t intr[2];
phandle_t iparent;
int icells;
if (OF_getprop(child, "interrupts", &intr,
sizeof(intr)) > 0) {
resource_list_add(&dinfo->opd_dinfo.resources,
SYS_RES_IRQ, 0, intr, intr, 1);
iparent = 0;
icells = 1;
OF_getprop(child, "interrupt-parent", &iparent,
sizeof(iparent));
OF_getprop(iparent, "#interrupt-cells", &icells,
sizeof(icells));
if (iparent != 0 && icells > 1) {
powerpc_config_intr(intr[0],
(intr[1] & 1) ? INTR_TRIGGER_LEVEL :
INTR_TRIGGER_EDGE,
INTR_POLARITY_HIGH);
}
resource_list_add(&dinfo->opd_dinfo.resources,
SYS_RES_IRQ, 0, intr[0], intr[0], 1);
}
}
}
}
}