Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 25b7bb58 authored by Cornelia Huck's avatar Cornelia Huck Committed by Martin Schwidefsky
Browse files

[S390] cio: Add css_driver_{register,unregister}.



Add wrapper functions for driver_register and driver_unregister so
that css drivers don't need to muck with struct device_driver
directly.

Signed-off-by: default avatarCornelia Huck <cornelia.huck@de.ibm.com>
Signed-off-by: default avatarMartin Schwidefsky <schwidefsky@de.ibm.com>
parent 98c13c28
Loading
Loading
Loading
Loading
+27 −0
Original line number Original line Diff line number Diff line
@@ -837,6 +837,33 @@ struct bus_type css_bus_type = {
	.shutdown = css_shutdown,
	.shutdown = css_shutdown,
};
};


/**
 * css_driver_register - register a css driver
 * @cdrv: css driver to register
 *
 * This is mainly a wrapper around driver_register that sets name
 * and bus_type in the embedded struct device_driver correctly.
 */
int css_driver_register(struct css_driver *cdrv)
{
	cdrv->drv.name = cdrv->name;
	cdrv->drv.bus = &css_bus_type;
	return driver_register(&cdrv->drv);
}
EXPORT_SYMBOL_GPL(css_driver_register);

/**
 * css_driver_unregister - unregister a css driver
 * @cdrv: css driver to unregister
 *
 * This is a wrapper around driver_unregister.
 */
void css_driver_unregister(struct css_driver *cdrv)
{
	driver_unregister(&cdrv->drv);
}
EXPORT_SYMBOL_GPL(css_driver_unregister);

subsys_initcall(init_channel_subsystem);
subsys_initcall(init_channel_subsystem);


MODULE_LICENSE("GPL");
MODULE_LICENSE("GPL");
+4 −0
Original line number Original line Diff line number Diff line
@@ -132,6 +132,7 @@ struct css_driver {
	int (*probe)(struct subchannel *);
	int (*probe)(struct subchannel *);
	int (*remove)(struct subchannel *);
	int (*remove)(struct subchannel *);
	void (*shutdown)(struct subchannel *);
	void (*shutdown)(struct subchannel *);
	const char *name;
};
};


#define to_cssdriver(n) container_of(n, struct css_driver, drv)
#define to_cssdriver(n) container_of(n, struct css_driver, drv)
@@ -141,6 +142,9 @@ struct css_driver {
 */
 */
extern struct bus_type css_bus_type;
extern struct bus_type css_bus_type;


extern int css_driver_register(struct css_driver *);
extern void css_driver_unregister(struct css_driver *);

extern void css_sch_device_unregister(struct subchannel *);
extern void css_sch_device_unregister(struct subchannel *);
extern struct subchannel * get_subchannel_by_schid(struct subchannel_id);
extern struct subchannel * get_subchannel_by_schid(struct subchannel_id);
extern int css_init_done;
extern int css_init_done;
+4 −6
Original line number Original line Diff line number Diff line
@@ -125,10 +125,7 @@ static void io_subchannel_shutdown(struct subchannel *);


static struct css_driver io_subchannel_driver = {
static struct css_driver io_subchannel_driver = {
	.subchannel_type = SUBCHANNEL_TYPE_IO,
	.subchannel_type = SUBCHANNEL_TYPE_IO,
	.drv = {
	.name = "io_subchannel",
	.name = "io_subchannel",
		.bus  = &css_bus_type,
	},
	.irq = io_subchannel_irq,
	.irq = io_subchannel_irq,
	.notify = io_subchannel_notify,
	.notify = io_subchannel_notify,
	.verify = io_subchannel_verify,
	.verify = io_subchannel_verify,
@@ -167,7 +164,8 @@ init_ccw_bus_type (void)
	if ((ret = bus_register (&ccw_bus_type)))
	if ((ret = bus_register (&ccw_bus_type)))
		goto out_err;
		goto out_err;


	if ((ret = driver_register(&io_subchannel_driver.drv)))
	ret = css_driver_register(&io_subchannel_driver);
	if (ret)
		goto out_err;
		goto out_err;


	wait_event(ccw_device_init_wq,
	wait_event(ccw_device_init_wq,
@@ -187,7 +185,7 @@ init_ccw_bus_type (void)
static void __exit
static void __exit
cleanup_ccw_bus_type (void)
cleanup_ccw_bus_type (void)
{
{
	driver_unregister(&io_subchannel_driver.drv);
	css_driver_unregister(&io_subchannel_driver);
	bus_unregister(&ccw_bus_type);
	bus_unregister(&ccw_bus_type);
	destroy_workqueue(ccw_device_notify_work);
	destroy_workqueue(ccw_device_notify_work);
	destroy_workqueue(ccw_device_work);
	destroy_workqueue(ccw_device_work);