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_device_probe(struct device
*dev
)
19 struct nubus_driver
*ndrv
= to_nubus_driver(dev
->driver
);
23 err
= ndrv
->probe(to_nubus_board(dev
));
27 static void nubus_device_remove(struct device
*dev
)
29 struct nubus_driver
*ndrv
= to_nubus_driver(dev
->driver
);
32 ndrv
->remove(to_nubus_board(dev
));
35 static const struct bus_type nubus_bus_type
= {
37 .probe
= nubus_device_probe
,
38 .remove
= nubus_device_remove
,
41 int nubus_driver_register(struct nubus_driver
*ndrv
)
43 ndrv
->driver
.bus
= &nubus_bus_type
;
44 return driver_register(&ndrv
->driver
);
46 EXPORT_SYMBOL(nubus_driver_register
);
48 void nubus_driver_unregister(struct nubus_driver
*ndrv
)
50 driver_unregister(&ndrv
->driver
);
52 EXPORT_SYMBOL(nubus_driver_unregister
);
54 static struct device nubus_parent
= {
58 static int __init
nubus_bus_register(void)
60 return bus_register(&nubus_bus_type
);
62 postcore_initcall(nubus_bus_register
);
64 int __init
nubus_parent_device_register(void)
66 return device_register(&nubus_parent
);
69 static void nubus_device_release(struct device
*dev
)
71 struct nubus_board
*board
= to_nubus_board(dev
);
72 struct nubus_rsrc
*fres
, *tmp
;
74 list_for_each_entry_safe(fres
, tmp
, &nubus_func_rsrcs
, list
)
75 if (fres
->board
== board
) {
76 list_del(&fres
->list
);
82 int nubus_device_register(struct nubus_board
*board
)
84 board
->dev
.parent
= &nubus_parent
;
85 board
->dev
.release
= nubus_device_release
;
86 board
->dev
.bus
= &nubus_bus_type
;
87 dev_set_name(&board
->dev
, "slot.%X", board
->slot
);
88 board
->dev
.dma_mask
= &board
->dev
.coherent_dma_mask
;
89 dma_set_mask(&board
->dev
, DMA_BIT_MASK(32));
90 return device_register(&board
->dev
);
93 static int nubus_print_device_name_fn(struct device
*dev
, void *data
)
95 struct nubus_board
*board
= to_nubus_board(dev
);
96 struct seq_file
*m
= data
;
98 seq_printf(m
, "Slot %X: %s\n", board
->slot
, board
->name
);
102 int nubus_proc_show(struct seq_file
*m
, void *data
)
104 return bus_for_each_dev(&nubus_bus_type
, NULL
, m
,
105 nubus_print_device_name_fn
);