mirror of
https://github.com/torvalds/linux.git
synced 2024-11-28 23:21:31 +00:00
84a9582fd2
We want to enable runtime PM for serial port device drivers in a generic way. To do this, we want to have the serial core layer manage the registered physical serial controller devices. To manage serial controllers, let's set up a struct bus and struct device for the serial core controller as suggested by Greg and Jiri. The serial core controller devices are children of the physical serial port device. The serial core controller device is needed to support multiple different kind of ports connected to single physical serial port device. Let's also set up a struct device for the serial core port. The serial core port instances are children of the serial core controller device. With the serial core port device we can now flush pending TX on the runtime PM resume as suggested by Johan. Suggested-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Suggested-by: Jiri Slaby <jirislaby@kernel.org> Suggested-by: Johan Hovold <johan@kernel.org> Signed-off-by: Tony Lindgren <tony@atomide.com> Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com> Link: https://lore.kernel.org/r/20230525113034.46880-1-tony@atomide.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
69 lines
1.6 KiB
C
69 lines
1.6 KiB
C
// SPDX-License-Identifier: GPL-2.0+
|
|
/*
|
|
* Serial core controller driver
|
|
*
|
|
* Copyright (C) 2023 Texas Instruments Incorporated - https://www.ti.com/
|
|
* Author: Tony Lindgren <tony@atomide.com>
|
|
*
|
|
* This driver manages the serial core controller struct device instances.
|
|
* The serial core controller devices are children of the physical serial
|
|
* port device.
|
|
*/
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/module.h>
|
|
#include <linux/pm_runtime.h>
|
|
#include <linux/serial_core.h>
|
|
#include <linux/spinlock.h>
|
|
|
|
#include "serial_base.h"
|
|
|
|
static int serial_ctrl_probe(struct device *dev)
|
|
{
|
|
pm_runtime_enable(dev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int serial_ctrl_remove(struct device *dev)
|
|
{
|
|
pm_runtime_disable(dev);
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
* Serial core controller device init functions. Note that the physical
|
|
* serial port device driver may not have completed probe at this point.
|
|
*/
|
|
int serial_ctrl_register_port(struct uart_driver *drv, struct uart_port *port)
|
|
{
|
|
return serial_core_register_port(drv, port);
|
|
}
|
|
|
|
void serial_ctrl_unregister_port(struct uart_driver *drv, struct uart_port *port)
|
|
{
|
|
serial_core_unregister_port(drv, port);
|
|
}
|
|
|
|
static struct device_driver serial_ctrl_driver = {
|
|
.name = "ctrl",
|
|
.suppress_bind_attrs = true,
|
|
.probe = serial_ctrl_probe,
|
|
.remove = serial_ctrl_remove,
|
|
};
|
|
|
|
int serial_base_ctrl_init(void)
|
|
{
|
|
return serial_base_driver_register(&serial_ctrl_driver);
|
|
}
|
|
|
|
void serial_base_ctrl_exit(void)
|
|
{
|
|
serial_base_driver_unregister(&serial_ctrl_driver);
|
|
}
|
|
|
|
MODULE_AUTHOR("Tony Lindgren <tony@atomide.com>");
|
|
MODULE_DESCRIPTION("Serial core controller driver");
|
|
MODULE_LICENSE("GPL");
|