* Yicong Yang <yangyicong@xxxxxxxxxx> [240205 08:55]: > On 2024/2/5 14:51, Tony Lindgren wrote: > > Can you please confirm if this still happens also with commit 6f699743aebf > > ("serial: core: Fix runtime PM handling for pending tx")? It adds a check > > for -EINPROGRESS. > > Tested nagetive on latest v6.8-rc3. Paste the current code snippet below in __uart_start(): OK thanks for confirming it. > In our issue case, the dev->power.runtime_status == RPM_RESUMING as analyzed in > commit. So we cannot pass the pm_runtime_active() check and the chars will still > be pending. OK > Do you mean something like below? > > static int serial_port_runtime_suspend(struct device *dev) > { > struct serial_port_device *port_dev = to_serial_base_port_device(dev); > struct uart_port *port; > unsigned long flags; > int ret = 0; > > port = port_dev->port; > > if (port->flags & UPF_DEAD) > return ret; > > spin_lock_irqsave(&port->lock, flags); > if (__serial_port_busy(port)) { > port->ops->start_tx(port); > ret = -EBUSY; > } > spin_unlock_irqrestore(&port->lock, flags); > > return ret; > } Yes the above should work. > If so will the port fail to suspend after flushing the pending chars? Considering > underlay driver like amba-pl011 doesn't implement runtime power management, does > anyone will get the port into suspend routine later? I'm not quite sure about it. Hmm yeah you may need to also call pm_runtime_mark_last_busy() to ensure the port gets idled later on. Not sure if PM runtime core does that for you on returning -EBUSY, worth checking it :) The PM runtime hierarchy will block the serial port controller driver from suspending, so the port drivers won't runtime suspend. > In the patch's implementation the pending chars will be flushed in runtime_resume() > callback and rpm_resume() will try to call rpm_idle() later. On serial_port_runtime_suspend() the serial port controller will be active, so you can call start_tx() directly. Regards, Tony