From patchwork Sun May 26 18:23:32 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Mugunthan V N X-Patchwork-Id: 2616791 Return-Path: X-Original-To: patchwork-linux-omap@patchwork.kernel.org Delivered-To: patchwork-process-083081@patchwork2.kernel.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by patchwork2.kernel.org (Postfix) with ESMTP id E9A1CDFB79 for ; Sun, 26 May 2013 18:23:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754825Ab3EZSW7 (ORCPT ); Sun, 26 May 2013 14:22:59 -0400 Received: from devils.ext.ti.com ([198.47.26.153]:51137 "EHLO devils.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754818Ab3EZSW6 (ORCPT ); Sun, 26 May 2013 14:22:58 -0400 Received: from dflxv15.itg.ti.com ([128.247.5.124]) by devils.ext.ti.com (8.13.7/8.13.7) with ESMTP id r4QIMpuJ017232; Sun, 26 May 2013 13:22:51 -0500 Received: from DLEE71.ent.ti.com (dlee71.ent.ti.com [157.170.170.114]) by dflxv15.itg.ti.com (8.14.3/8.13.8) with ESMTP id r4QIMpAN011465; Sun, 26 May 2013 13:22:51 -0500 Received: from dlelxv23.itg.ti.com (172.17.1.198) by DLEE71.ent.ti.com (157.170.170.114) with Microsoft SMTP Server id 14.2.342.3; Sun, 26 May 2013 13:22:51 -0500 Received: from a0131834-linux.india.ti.com (dbdp20.itg.ti.com [172.24.170.38]) by dlelxv23.itg.ti.com (8.13.8/8.13.8) with ESMTP id r4QIMgPK011073; Sun, 26 May 2013 13:22:49 -0500 From: Mugunthan V N To: CC: , , , , , Mugunthan V N Subject: [net-next PATCH v3 2/6] net: davinci_mdio: enhance pinctrl support Date: Sun, 26 May 2013 23:53:32 +0530 Message-ID: <1369592616-23972-3-git-send-email-mugunthanvnm@ti.com> X-Mailer: git-send-email 1.7.9.5 In-Reply-To: <1369592616-23972-1-git-send-email-mugunthanvnm@ti.com> References: <1369592616-23972-1-git-send-email-mugunthanvnm@ti.com> MIME-Version: 1.0 Sender: linux-omap-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-omap@vger.kernel.org Amend cpsw controller to optionally take a pin control handle and set the state of the pins to: - "default" on boot, resume - "sleep" on suspend() This should make it possible to optimize energy usage for the pins for the suspend/resume cycle. If any of the above pin states are missing in dt, a warning message about the missing state is displayed. If certain pin-states are not available, to remove this warning message pass respective state name with null phandler. Signed-off-by: Mugunthan V N --- drivers/net/ethernet/ti/davinci_mdio.c | 45 ++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/drivers/net/ethernet/ti/davinci_mdio.c b/drivers/net/ethernet/ti/davinci_mdio.c index 12aec17..9e6aaeb 100644 --- a/drivers/net/ethernet/ti/davinci_mdio.c +++ b/drivers/net/ethernet/ti/davinci_mdio.c @@ -38,6 +38,7 @@ #include #include #include +#include /* * This timeout definition is a worst-case ultra defensive measure against @@ -94,6 +95,11 @@ struct davinci_mdio_data { struct mii_bus *bus; bool suspended; unsigned long access_time; /* jiffies */ + + /* Two optional pin states - default & sleep */ + struct pinctrl *pinctrl; + struct pinctrl_state *pins_def; + struct pinctrl_state *pins_sleep; }; static void __davinci_mdio_reset(struct davinci_mdio_data *data) @@ -347,6 +353,35 @@ static int davinci_mdio_probe(struct platform_device *pdev) data->bus->parent = dev; data->bus->priv = data; + data->pinctrl = devm_pinctrl_get(&pdev->dev); + if (!IS_ERR(data->pinctrl)) { + data->pins_def = pinctrl_lookup_state(data->pinctrl, + PINCTRL_STATE_DEFAULT); + /* enable pins to be muxed in and configured */ + if (IS_ERR(data->pins_def)) + dev_warn(&pdev->dev, "could not get default pinstate\n"); + else + if (pinctrl_select_state(data->pinctrl, + data->pins_def)) + dev_err(&pdev->dev, + "could not set default pins\n"); + + data->pins_sleep = pinctrl_lookup_state(data->pinctrl, + PINCTRL_STATE_SLEEP); + if (IS_ERR(data->pins_sleep)) + dev_warn(&pdev->dev, "could not get sleep pinstate\n"); + } else { + /* Since we continue even when pinctrl node is not found, + * Invalidate pins as not available. This is to make sure that + * IS_ERR(pins_xxx) results in failure when used. + */ + data->pins_def = ERR_PTR(-ENODATA); + data->pins_sleep = ERR_PTR(-ENODATA); + + dev_warn(&pdev->dev, + "pins are not configured from the driver\n"); + } + pm_runtime_enable(&pdev->dev); pm_runtime_get_sync(&pdev->dev); data->clk = clk_get(&pdev->dev, "fck"); @@ -454,6 +489,11 @@ static int davinci_mdio_suspend(struct device *dev) data->suspended = true; spin_unlock(&data->lock); + /* Optionally let pins go into sleep states */ + if (!IS_ERR(data->pins_sleep)) + if (pinctrl_select_state(data->pinctrl, data->pins_sleep)) + dev_err(dev, "could not set pins to sleep state\n"); + return 0; } @@ -465,6 +505,11 @@ static int davinci_mdio_resume(struct device *dev) spin_lock(&data->lock); pm_runtime_get_sync(data->dev); + /* Optionaly enable pins to be muxed in and configured */ + if (!IS_ERR(data->pins_def)) + if (pinctrl_select_state(data->pinctrl, data->pins_def)) + dev_err(dev, "could not set default pins\n"); + /* restart the scan state machine */ ctrl = __raw_readl(&data->regs->control); ctrl |= CONTROL_ENABLE;