1 // SPDX-License-Identifier: GPL-2.0
3 // Bus implementation for the NuBus subsystem.
5 // Copyright (C) 2017 Finn Thain
7 #include <linux/device.h>
8 #include <linux/dma-mapping.h>
9 #include <linux/list.h>
10 #include <linux/nubus.h>
11 #include <linux/seq_file.h>
12 #include <linux/slab.h>
14 #define to_nubus_board(d) container_of(d, struct nubus_board, dev)
15 #define to_nubus_driver(d) container_of(d, struct nubus_driver, driver)
17 static int nubus_bus_match(struct device
*dev
, struct device_driver
*driver
)
22 static int nubus_device_probe(struct device
*dev
)
24 struct nubus_driver
*ndrv
= to_nubus_driver(dev
->driver
);
28 err
= ndrv
->probe(to_nubus_board(dev
));
32 static void nubus_device_remove(struct device
*dev
)
34 struct nubus_driver
*ndrv
= to_nubus_driver(dev
->driver
);
37 ndrv
->remove(to_nubus_board(dev
));
40 struct bus_type nubus_bus_type
= {
42 .match
= nubus_bus_match
,
43 .probe
= nubus_device_probe
,
44 .remove
= nubus_device_remove
,
46 EXPORT_SYMBOL(nubus_bus_type
);
48 int nubus_driver_register(struct nubus_driver
*ndrv
)
50 ndrv
->driver
.bus
= &nubus_bus_type
;
51 return driver_register(&ndrv
->driver
);
53 EXPORT_SYMBOL(nubus_driver_register
);
55 void nubus_driver_unregister(struct nubus_driver
*ndrv
)
57 driver_unregister(&ndrv
->driver
);
59 EXPORT_SYMBOL(nubus_driver_unregister
);
61 static struct device nubus_parent
= {
65 static int __init
nubus_bus_register(void)
67 return bus_register(&nubus_bus_type
);
69 postcore_initcall(nubus_bus_register
);
71 int __init
nubus_parent_device_register(void)
73 return device_register(&nubus_parent
);
76 static void nubus_device_release(struct device
*dev
)
78 struct nubus_board
*board
= to_nubus_board(dev
);
79 struct nubus_rsrc
*fres
, *tmp
;
81 list_for_each_entry_safe(fres
, tmp
, &nubus_func_rsrcs
, list
)
82 if (fres
->board
== board
) {
83 list_del(&fres
->list
);
89 int nubus_device_register(struct nubus_board
*board
)
91 board
->dev
.parent
= &nubus_parent
;
92 board
->dev
.release
= nubus_device_release
;
93 board
->dev
.bus
= &nubus_bus_type
;
94 dev_set_name(&board
->dev
, "slot.%X", board
->slot
);
95 board
->dev
.dma_mask
= &board
->dev
.coherent_dma_mask
;
96 dma_set_mask(&board
->dev
, DMA_BIT_MASK(32));
97 return device_register(&board
->dev
);
100 static int nubus_print_device_name_fn(struct device
*dev
, void *data
)
102 struct nubus_board
*board
= to_nubus_board(dev
);
103 struct seq_file
*m
= data
;
105 seq_printf(m
, "Slot %X: %s\n", board
->slot
, board
->name
);
109 int nubus_proc_show(struct seq_file
*m
, void *data
)
111 return bus_for_each_dev(&nubus_bus_type
, NULL
, m
,
112 nubus_print_device_name_fn
);