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/list.h>
9 #include <linux/nubus.h>
10 #include <linux/seq_file.h>
11 #include <linux/slab.h>
13 #define to_nubus_board(d) container_of(d, struct nubus_board, dev)
14 #define to_nubus_driver(d) container_of(d, struct nubus_driver, driver)
16 static int nubus_bus_match(struct device
*dev
, struct device_driver
*driver
)
21 static int nubus_device_probe(struct device
*dev
)
23 struct nubus_driver
*ndrv
= to_nubus_driver(dev
->driver
);
27 err
= ndrv
->probe(to_nubus_board(dev
));
31 static int nubus_device_remove(struct device
*dev
)
33 struct nubus_driver
*ndrv
= to_nubus_driver(dev
->driver
);
36 if (dev
->driver
&& ndrv
->remove
)
37 err
= ndrv
->remove(to_nubus_board(dev
));
41 struct bus_type nubus_bus_type
= {
43 .match
= nubus_bus_match
,
44 .probe
= nubus_device_probe
,
45 .remove
= nubus_device_remove
,
47 EXPORT_SYMBOL(nubus_bus_type
);
49 int nubus_driver_register(struct nubus_driver
*ndrv
)
51 ndrv
->driver
.bus
= &nubus_bus_type
;
52 return driver_register(&ndrv
->driver
);
54 EXPORT_SYMBOL(nubus_driver_register
);
56 void nubus_driver_unregister(struct nubus_driver
*ndrv
)
58 driver_unregister(&ndrv
->driver
);
60 EXPORT_SYMBOL(nubus_driver_unregister
);
62 static struct device nubus_parent
= {
66 int __init
nubus_bus_register(void)
70 err
= device_register(&nubus_parent
);
74 err
= bus_register(&nubus_bus_type
);
78 device_unregister(&nubus_parent
);
82 static void nubus_device_release(struct device
*dev
)
84 struct nubus_board
*board
= to_nubus_board(dev
);
85 struct nubus_rsrc
*fres
, *tmp
;
87 list_for_each_entry_safe(fres
, tmp
, &nubus_func_rsrcs
, list
)
88 if (fres
->board
== board
) {
89 list_del(&fres
->list
);
95 int nubus_device_register(struct nubus_board
*board
)
97 board
->dev
.parent
= &nubus_parent
;
98 board
->dev
.release
= nubus_device_release
;
99 board
->dev
.bus
= &nubus_bus_type
;
100 dev_set_name(&board
->dev
, "slot.%X", board
->slot
);
101 return device_register(&board
->dev
);
104 static int nubus_print_device_name_fn(struct device
*dev
, void *data
)
106 struct nubus_board
*board
= to_nubus_board(dev
);
107 struct seq_file
*m
= data
;
109 seq_printf(m
, "Slot %X: %s\n", board
->slot
, board
->name
);
113 int nubus_proc_show(struct seq_file
*m
, void *data
)
115 return bus_for_each_dev(&nubus_bus_type
, NULL
, m
,
116 nubus_print_device_name_fn
);