Skip to content

Commit

Permalink
parisc: remove klist iterators
Browse files Browse the repository at this point in the history
commit 11c3b5c
Author: Greg Kroah-Hartman <[email protected]>
Date:   Tue Dec 16 12:24:56 2008 -0800

    driver core: move klist_children into private structure

Broke our parisc build pretty badly because we touch the klists directly
in three cases (AGP, SBA and GSC).  Although GregKH will revert this
patch, there's no reason we should be using the iterators directly, we
can just move to the standard device_for_each_child() API.

Signed-off-by: James Bottomley <[email protected]>
Tested-by: Helge Deller <[email protected]>
Tested-by: Kyle McMartin <[email protected]>
Signed-off-by: Kyle McMartin <[email protected]>
  • Loading branch information
James Bottomley authored and Kyle McMartin committed Mar 13, 2009
1 parent 8980a7b commit bfe4f4f
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 55 deletions.
23 changes: 11 additions & 12 deletions drivers/char/agp/parisc-agp.c
Original file line number Diff line number Diff line change
Expand Up @@ -359,9 +359,16 @@ parisc_agp_setup(void __iomem *ioc_hpa, void __iomem *lba_hpa)
return error;
}

static struct device *next_device(struct klist_iter *i) {
struct klist_node * n = klist_next(i);
return n ? container_of(n, struct device, knode_parent) : NULL;
static int
find_quicksilver(struct device *dev, void *data)
{
struct parisc_device **lba = data;
struct parisc_device *padev = to_parisc_device(dev);

if (IS_QUICKSILVER(padev))
*lba = padev;

return 0;
}

static int
Expand All @@ -372,8 +379,6 @@ parisc_agp_init(void)
int err = -1;
struct parisc_device *sba = NULL, *lba = NULL;
struct lba_device *lbadev = NULL;
struct device *dev = NULL;
struct klist_iter i;

if (!sba_list)
goto out;
Expand All @@ -386,13 +391,7 @@ parisc_agp_init(void)
}

/* Now search our Pluto for our precious AGP device... */
klist_iter_init(&sba->dev.klist_children, &i);
while ((dev = next_device(&i))) {
struct parisc_device *padev = to_parisc_device(dev);
if (IS_QUICKSILVER(padev))
lba = padev;
}
klist_iter_exit(&i);
device_for_each_child(&sba->dev, &lba, find_quicksilver);

if (!lba) {
printk(KERN_INFO DRVPFX "No AGP devices found.\n");
Expand Down
39 changes: 22 additions & 17 deletions drivers/parisc/gsc.c
Original file line number Diff line number Diff line change
Expand Up @@ -186,29 +186,34 @@ void gsc_asic_assign_irq(struct gsc_asic *asic, int local_irq, int *irqp)
*irqp = irq;
}

static struct device *next_device(struct klist_iter *i)
struct gsc_fixup_struct {
void (*choose_irq)(struct parisc_device *, void *);
void *ctrl;
};

static int gsc_fixup_irqs_callback(struct device *dev, void *data)
{
struct klist_node * n = klist_next(i);
return n ? container_of(n, struct device, knode_parent) : NULL;
struct parisc_device *padev = to_parisc_device(dev);
struct gsc_fixup_struct *gf = data;

/* work-around for 715/64 and others which have parent
at path [5] and children at path [5/0/x] */
if (padev->id.hw_type == HPHW_FAULTY)
gsc_fixup_irqs(padev, gf->ctrl, gf->choose_irq);
gf->choose_irq(padev, gf->ctrl);

return 0;
}

void gsc_fixup_irqs(struct parisc_device *parent, void *ctrl,
void (*choose_irq)(struct parisc_device *, void *))
{
struct device *dev;
struct klist_iter i;

klist_iter_init(&parent->dev.klist_children, &i);
while ((dev = next_device(&i))) {
struct parisc_device *padev = to_parisc_device(dev);

/* work-around for 715/64 and others which have parent
at path [5] and children at path [5/0/x] */
if (padev->id.hw_type == HPHW_FAULTY)
return gsc_fixup_irqs(padev, ctrl, choose_irq);
choose_irq(padev, ctrl);
}
klist_iter_exit(&i);
struct gsc_fixup_struct data = {
.choose_irq = choose_irq,
.ctrl = ctrl,
};

device_for_each_child(&parent->dev, &data, gsc_fixup_irqs_callback);
}

int gsc_common_setup(struct parisc_device *parent, struct gsc_asic *gsc_asic)
Expand Down
61 changes: 35 additions & 26 deletions drivers/parisc/sba_iommu.c
Original file line number Diff line number Diff line change
Expand Up @@ -1206,31 +1206,49 @@ sba_alloc_pdir(unsigned int pdir_size)
return (void *) pdir_base;
}

static struct device *next_device(struct klist_iter *i)
struct ibase_data_struct {
struct ioc *ioc;
int ioc_num;
};

static int setup_ibase_imask_callback(struct device *dev, void *data)
{
struct klist_node * n = klist_next(i);
return n ? container_of(n, struct device, knode_parent) : NULL;
/* lba_set_iregs() is in drivers/parisc/lba_pci.c */
extern void lba_set_iregs(struct parisc_device *, u32, u32);
struct parisc_device *lba = to_parisc_device(dev);
struct ibase_data_struct *ibd = data;
int rope_num = (lba->hpa.start >> 13) & 0xf;
if (rope_num >> 3 == ibd->ioc_num)
lba_set_iregs(lba, ibd->ioc->ibase, ibd->ioc->imask);
return 0;
}

/* setup Mercury or Elroy IBASE/IMASK registers. */
static void
setup_ibase_imask(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
{
/* lba_set_iregs() is in drivers/parisc/lba_pci.c */
extern void lba_set_iregs(struct parisc_device *, u32, u32);
struct device *dev;
struct klist_iter i;

klist_iter_init(&sba->dev.klist_children, &i);
while ((dev = next_device(&i))) {
struct parisc_device *lba = to_parisc_device(dev);
int rope_num = (lba->hpa.start >> 13) & 0xf;
if (rope_num >> 3 == ioc_num)
lba_set_iregs(lba, ioc->ibase, ioc->imask);
}
klist_iter_exit(&i);
struct ibase_data_struct ibase_data = {
.ioc = ioc,
.ioc_num = ioc_num,
};

device_for_each_child(&sba->dev, &ibase_data,
setup_ibase_imask_callback);
}

#ifdef SBA_AGP_SUPPORT
static int
sba_ioc_find_quicksilver(struct device *dev, void *data)
{
int *agp_found = data;
struct parisc_device *lba = to_parisc_device(dev);

if (IS_QUICKSILVER(lba))
*agp_found = 1;
return 0;
}
#endif

static void
sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
{
Expand Down Expand Up @@ -1332,9 +1350,6 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
WRITE_REG(ioc->ibase | 31, ioc->ioc_hpa + IOC_PCOM);

#ifdef SBA_AGP_SUPPORT
{
struct klist_iter i;
struct device *dev = NULL;

/*
** If an AGP device is present, only use half of the IOV space
Expand All @@ -1344,13 +1359,7 @@ sba_ioc_init_pluto(struct parisc_device *sba, struct ioc *ioc, int ioc_num)
** We program the next pdir index after we stop w/ a key for
** the GART code to handshake on.
*/
klist_iter_init(&sba->dev.klist_children, &i);
while ((dev = next_device(&i))) {
struct parisc_device *lba = to_parisc_device(dev);
if (IS_QUICKSILVER(lba))
agp_found = 1;
}
klist_iter_exit(&i);
device_for_each_child(&sba->dev, &agp_found, sba_ioc_find_quicksilver);

if (agp_found && sba_reserve_agpgart) {
printk(KERN_INFO "%s: reserving %dMb of IOVA space for agpgart\n",
Expand Down

0 comments on commit bfe4f4f

Please sign in to comment.