From patchwork Wed May 9 09:44:18 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johan Hovold X-Patchwork-Id: 10388917 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork.web.codeaurora.org (Postfix) with ESMTP id E377B602C2 for ; Wed, 9 May 2018 09:44:56 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id D48BD288D0 for ; Wed, 9 May 2018 09:44:56 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id C8C0228EBD; Wed, 9 May 2018 09:44:56 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-7.8 required=2.0 tests=BAYES_00,DKIM_SIGNED, MAILING_LIST_MULTI, RCVD_IN_DNSWL_HI, T_DKIM_INVALID autolearn=unavailable version=3.3.1 Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 63212288D0 for ; Wed, 9 May 2018 09:44:56 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S934212AbeEIJog (ORCPT ); Wed, 9 May 2018 05:44:36 -0400 Received: from mail-lf0-f68.google.com ([209.85.215.68]:44297 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S933938AbeEIJod (ORCPT ); Wed, 9 May 2018 05:44:33 -0400 Received: by mail-lf0-f68.google.com with SMTP id h197-v6so49995084lfg.11; Wed, 09 May 2018 02:44:32 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=sender:from:to:cc:subject:date:message-id; bh=YkpBIJCb6wlr4ke2gDmX9BUrGQUMUNXCgtkmcFyCzaE=; b=pRuz0tiE2jpoQ9xVqtmJ5aNogK/GcoOSZQYcS/nQiJH0grmB7Ef2L+MFweX6HmBILe 76paAI3uRrwGZ1i2+RHbizPFhzkifIwO3QfkYRceEFl4MDY7eqK6WTJ/QN5ILzCdqNlz 2BvObtZxuDICicuAXeRX1tA68ERC2DruTMZlxWexVVeJnlSHqPqUnW5PsySjqm1tPBOn fGZPPJPFJTuu7blo8wD0o2HMNrbzWKn/Tv6ce2yMzqU4ClbKu1knGQ83i8MlnAjb4pC4 lW/DWtQZ6BAdKRSD5RUvmEASR3WDLeIijEYdyAioulJRIeKVySihIwkrMjgeCAM3aAOp QavA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:sender:from:to:cc:subject:date:message-id; bh=YkpBIJCb6wlr4ke2gDmX9BUrGQUMUNXCgtkmcFyCzaE=; b=bnUX9/dvk5L+l5WihJXAlDnLbfYfMM8HsF7L8+wNFykRAX7LIhp2jtH7rE3X5mR52b qqS8XlFdCbJUJnGpBDS++utdoktVBFFirQi2NEnSCBY+TgE2jk5ourovZriK36ARYsu4 BDAg9/xISf6FyjtgjxzEBlLccWGsa108TIGvreKAV1vL/1AyWIOBSCLyF+xKqjfRUyC4 vb3w1kg5GWNyGR2CL3sw1z9ZAlusI4AtTkKT+ZXd7vY0NXVOLq28lsJla/Nl4IPKv8z7 OtwkT0StYOYmjeSpQECmuEFkL3ozsHmbasHK3pU+DlbSx+XfBcxkaGX5dkHhgCOqougb 6Wkg== X-Gm-Message-State: ALQs6tAy6jrCESG8aIA/jvB/dYd/mZxCHPUutJfOoKprJq84si4ef7Ch sgFkEh5HgwVW/3xFveV5EkQ= X-Google-Smtp-Source: AB8JxZqvQVaim+9zGV2L3GdHTdl8UwG4hHXIx+xDGyjx3wXF4/1vj8QFE6OP1zmuMcxDmwXX0yYdzA== X-Received: by 2002:a2e:5718:: with SMTP id l24-v6mr20658125ljb.51.1525859071833; Wed, 09 May 2018 02:44:31 -0700 (PDT) Received: from xi.terra (c-8bb2e655.07-184-6d6c6d4.cust.bredbandsbolaget.se. [85.230.178.139]) by smtp.gmail.com with ESMTPSA id l14-v6sm5665831lfc.72.2018.05.09.02.44.30 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 09 May 2018 02:44:30 -0700 (PDT) Received: from johan by xi.terra with local (Exim 4.90_1) (envelope-from ) id 1fGLeB-0003W0-HN; Wed, 09 May 2018 11:44:31 +0200 From: Johan Hovold To: Greg Kroah-Hartman Cc: Rob Herring , Sebastian Reichel , Tony Lindgren , "H. Nikolaus Schaller" , Andreas Kemnade , Mark Rutland , Arnd Bergmann , Pavel Machek , linux-kernel@vger.kernel.org, linux-serial@vger.kernel.org, linux-pm@vger.kernel.org, Johan Hovold Subject: [PATCH 1/2] serdev: add controller runtime PM support Date: Wed, 9 May 2018 11:44:18 +0200 Message-Id: <20180509094419.13470-1-johan@kernel.org> X-Mailer: git-send-email 2.17.0 Sender: linux-pm-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pm@vger.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Add support for controller runtime power management to serdev core. This is needed to allow slave drivers to manage the runtime PM state of the underlying serial controller when its driver, in turn, implements more aggressive runtime power management (e.g. using autosuspend). For some applications, for example, where loss off initial data after a remote-wakeup event is acceptable or where rx is not used at all, aggressive serial controller runtime PM may be used without further involvement of the slave driver. But when this is not the case, the slave driver must be able to indicate when incoming data is expected in order to avoid data loss. To facilitate the common case, where the serial controller power state is active whenever the port is open (which is the case with just about every serial driver), and where data loss is not acceptable and cannot even be prevented by explicit controller runtime power management, an RPM reference is taken in serdev open and put again at close. This reference can later be balanced by any serdev driver which wants and/or can handle aggressive controller runtime PM. Note that the .ignore_children flag is set for the serdev controller to allow the underlying hardware to idle when no I/O is expected, regardless of the slave device RPM state. Signed-off-by: Johan Hovold Acked-by: Tony Lindgren Reviewed-by: Sebastian Reichel --- drivers/tty/serdev/core.c | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/drivers/tty/serdev/core.c b/drivers/tty/serdev/core.c index df93b727e984..e5e84303faca 100644 --- a/drivers/tty/serdev/core.c +++ b/drivers/tty/serdev/core.c @@ -13,6 +13,7 @@ #include #include #include +#include #include #include @@ -143,11 +144,28 @@ EXPORT_SYMBOL_GPL(serdev_device_remove); int serdev_device_open(struct serdev_device *serdev) { struct serdev_controller *ctrl = serdev->ctrl; + int ret; if (!ctrl || !ctrl->ops->open) return -EINVAL; - return ctrl->ops->open(ctrl); + ret = ctrl->ops->open(ctrl); + if (ret) + return ret; + + ret = pm_runtime_get_sync(&ctrl->dev); + if (ret < 0) { + pm_runtime_put_noidle(&ctrl->dev); + goto err_close; + } + + return 0; + +err_close: + if (ctrl->ops->close) + ctrl->ops->close(ctrl); + + return ret; } EXPORT_SYMBOL_GPL(serdev_device_open); @@ -158,6 +176,8 @@ void serdev_device_close(struct serdev_device *serdev) if (!ctrl || !ctrl->ops->close) return; + pm_runtime_put(&ctrl->dev); + ctrl->ops->close(ctrl); } EXPORT_SYMBOL_GPL(serdev_device_close); @@ -416,6 +436,9 @@ struct serdev_controller *serdev_controller_alloc(struct device *parent, dev_set_name(&ctrl->dev, "serial%d", id); + pm_runtime_no_callbacks(&ctrl->dev); + pm_suspend_ignore_children(&ctrl->dev, true); + dev_dbg(&ctrl->dev, "allocated controller 0x%p id %d\n", ctrl, id); return ctrl; @@ -547,20 +570,23 @@ int serdev_controller_add(struct serdev_controller *ctrl) if (ret) return ret; + pm_runtime_enable(&ctrl->dev); + ret_of = of_serdev_register_devices(ctrl); ret_acpi = acpi_serdev_register_devices(ctrl); if (ret_of && ret_acpi) { dev_dbg(&ctrl->dev, "no devices registered: of:%d acpi:%d\n", ret_of, ret_acpi); ret = -ENODEV; - goto out_dev_del; + goto err_rpm_disable; } dev_dbg(&ctrl->dev, "serdev%d registered: dev:%p\n", ctrl->nr, &ctrl->dev); return 0; -out_dev_del: +err_rpm_disable: + pm_runtime_disable(&ctrl->dev); device_del(&ctrl->dev); return ret; }; @@ -591,6 +617,7 @@ void serdev_controller_remove(struct serdev_controller *ctrl) dummy = device_for_each_child(&ctrl->dev, NULL, serdev_remove_device); + pm_runtime_disable(&ctrl->dev); device_del(&ctrl->dev); } EXPORT_SYMBOL_GPL(serdev_controller_remove);