aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/nubus
diff options
context:
space:
mode:
authorFinn Thain <fthain@telegraphics.com.au>2018-01-13 17:37:13 -0500
committerGeert Uytterhoeven <geert@linux-m68k.org>2018-01-16 16:47:29 +0100
commit41b848160eabb22957652936b66ccafd95ab5ad8 (patch)
treef38449c4f4a4694f6c3215262919dc45c92aeb24 /drivers/nubus
parentnubus: Rename struct nubus_dev (diff)
downloadlinux-dev-41b848160eabb22957652936b66ccafd95ab5ad8.tar.xz
linux-dev-41b848160eabb22957652936b66ccafd95ab5ad8.zip
nubus: Adopt standard linked list implementation
This increases code re-use and improves readability. Cc: "David S. Miller" <davem@davemloft.net> Cc: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Acked-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Tested-by: Stan Johnson <userm57@yahoo.com> Signed-off-by: Finn Thain <fthain@telegraphics.com.au> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Diffstat (limited to 'drivers/nubus')
-rw-r--r--drivers/nubus/nubus.c45
-rw-r--r--drivers/nubus/proc.c11
2 files changed, 15 insertions, 41 deletions
diff --git a/drivers/nubus/nubus.c b/drivers/nubus/nubus.c
index 3657b13c0022..0bb54ccd7a1a 100644
--- a/drivers/nubus/nubus.c
+++ b/drivers/nubus/nubus.c
@@ -32,7 +32,7 @@
/* Globals */
-struct nubus_rsrc *nubus_func_rsrcs;
+LIST_HEAD(nubus_func_rsrcs);
struct nubus_board *nubus_boards;
/* Meaning of "bytelanes":
@@ -305,33 +305,20 @@ EXPORT_SYMBOL(nubus_rewinddir);
/* Driver interface functions, more or less like in pci.c */
-struct nubus_rsrc *nubus_find_type(unsigned short category, unsigned short type,
- const struct nubus_rsrc *from)
+struct nubus_rsrc *nubus_first_rsrc_or_null(void)
{
- struct nubus_rsrc *itor = from ? from->next : nubus_func_rsrcs;
-
- while (itor) {
- if (itor->category == category && itor->type == type)
- return itor;
- itor = itor->next;
- }
- return NULL;
+ return list_first_entry_or_null(&nubus_func_rsrcs, struct nubus_rsrc,
+ list);
}
-EXPORT_SYMBOL(nubus_find_type);
+EXPORT_SYMBOL(nubus_first_rsrc_or_null);
-struct nubus_rsrc *nubus_find_slot(unsigned int slot,
- const struct nubus_rsrc *from)
+struct nubus_rsrc *nubus_next_rsrc_or_null(struct nubus_rsrc *from)
{
- struct nubus_rsrc *itor = from ? from->next : nubus_func_rsrcs;
-
- while (itor) {
- if (itor->board->slot == slot)
- return itor;
- itor = itor->next;
- }
- return NULL;
+ if (list_is_last(&from->list, &nubus_func_rsrcs))
+ return NULL;
+ return list_next_entry(from, list);
}
-EXPORT_SYMBOL(nubus_find_slot);
+EXPORT_SYMBOL(nubus_next_rsrc_or_null);
int
nubus_find_rsrc(struct nubus_dir *dir, unsigned char rsrc_type,
@@ -819,7 +806,6 @@ static struct nubus_board * __init nubus_add_board(int slot, int bytelanes)
while (nubus_readdir(&dir, &ent) != -1) {
struct nubus_rsrc *fres;
- struct nubus_rsrc **fresp;
fres = nubus_get_functional_resource(board, slot, &ent);
if (fres == NULL)
@@ -834,16 +820,7 @@ static struct nubus_board * __init nubus_add_board(int slot, int bytelanes)
}
prev_resid = fres->resid;
- /* We zeroed this out above */
- if (board->first_func_rsrc == NULL)
- board->first_func_rsrc = fres;
-
- /* Put it on the func. resource list. Keep entries in order. */
- for (fresp = &nubus_func_rsrcs; *fresp != NULL;
- fresp = &((*fresp)->next))
- /* spin */;
- *fresp = fres;
- fres->next = NULL;
+ list_add_tail(&fres->list, &nubus_func_rsrcs);
}
/* Put it on the global NuBus board chain. Keep entries in order. */
diff --git a/drivers/nubus/proc.c b/drivers/nubus/proc.c
index f2b118330be0..60c0f40b4d5e 100644
--- a/drivers/nubus/proc.c
+++ b/drivers/nubus/proc.c
@@ -36,15 +36,12 @@
static int
nubus_devices_proc_show(struct seq_file *m, void *v)
{
- struct nubus_rsrc *fres = nubus_func_rsrcs;
+ struct nubus_rsrc *fres;
- while (fres) {
- seq_printf(m, "%x\t%04x %04x %04x %04x",
+ for_each_func_rsrc(fres)
+ seq_printf(m, "%x\t%04x %04x %04x %04x\t%08lx\n",
fres->board->slot, fres->category, fres->type,
- fres->dr_sw, fres->dr_hw);
- seq_printf(m, "\t%08lx\n", fres->board->slot_addr);
- fres = fres->next;
- }
+ fres->dr_sw, fres->dr_hw, fres->board->slot_addr);
return 0;
}