Thread (23 messages) 23 messages, 8 authors, 2015-01-20

Re: [PATCH v5 5/5] tty/serial: Add Spreadtrum sc9836-uart driver support

From: Lyra Zhang <zhang.lyra@gmail.com>
Date: 2015-01-20 07:37:43
Also in: linux-arm-kernel, linux-devicetree, linux-serial, lkml

Hi, Rob

I still have a question to be conform, specific describes below:

On Mon, Jan 19, 2015 at 10:11 PM, Rob Herring [off-list ref] wrote:
On Mon, Jan 19, 2015 at 3:55 AM, Lyra Zhang [off-list ref] wrote:
quoted
On Sat, Jan 17, 2015 at 12:41 AM, Rob Herring [off-list ref] wrote:
quoted
On Fri, Jan 16, 2015 at 4:00 AM, Chunyan Zhang
[off-list ref] wrote:
quoted
Add a full sc9836-uart driver for SC9836 SoC which is based on the
spreadtrum sharkl64 platform.
This driver also support earlycon.
This patch also replaced the spaces between the macros and their
values with the tabs in serial_core.h
[...]
quoted
quoted
quoted
+static int __init sprd_serial_init(void)
+{
+       int ret = 0;
+
+       ret = uart_register_driver(&sprd_uart_driver);
This can be done in probe now. Then you can use module_platform_driver().
Question:
1. there are 4 uart ports configured in dt for sprd_serial, so probe
will be called 4 times, but uart_register_driver only needs to be
called one time, so can we use uart_driver.state to check if
uart_register_driver has already been called ?
Yes.
quoted
2. if I use module_platform_driver() instead of
module_init(sprd_serial_init)  and  module_exit(sprd_serial_exit) , I
must move uart_unregister_driver() which is now processed in
sprd_serial_exit() to sprd_remove(), there is a similar problem with
probe(), sprd_remove() will also be called 4 times, and actually it
should be called only one time. How can we deal with this case?
Look at pl01x or Samsung UART drivers which have done this conversion.
Samsung UART does use module_platform_driver, but pl010/pl011 doesn't.
In the Samsung UART driver, uart_unregister_driver is processed in
remove(), like below:

static int s3c24xx_serial_remove(struct platform_device *dev)
{
    struct uart_port *port = s3c24xx_dev_to_port(&dev->dev);

    if (port) {
        s3c24xx_serial_cpufreq_deregister(to_ourport(port));
        uart_remove_one_port(&s3c24xx_uart_drv, port);
    }

    uart_unregister_driver(&s3c24xx_uart_drv);
}

if this serial has more than one ports, uart_unregister_driver() must
be called multiple times when the device need to be removed.
I think there may be a problem because that uart_unregister_driver()
will do kfree(drv->state) every time when it's called.

Thanks,
Chunyan
quoted
3. for the second question, we can check the platform_device->id, if
it is equal to the index of last port (e.g. 4 for this case), then
uart_unregister_driver() can be called. Does it work correctly? since
for this case, we must keep the order of releasing ports.
The id will not be the line index in the DT case. I don't think you
can guarantee the order either.

It would be better to make uart_{un}register_driver deal with being
called multiple times so drivers don't have to deal with getting this
correct. I'm not sure if that is feasible though.

Rob
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help