From patchwork Fri Dec 21 11:41:05 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Lee Jones X-Patchwork-Id: 207792 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id ED8CD2C0092 for ; Fri, 21 Dec 2012 22:41:14 +1100 (EST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751182Ab2LULlM (ORCPT ); Fri, 21 Dec 2012 06:41:12 -0500 Received: from mail-bk0-f45.google.com ([209.85.214.45]:41585 "EHLO mail-bk0-f45.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750868Ab2LULlL (ORCPT ); Fri, 21 Dec 2012 06:41:11 -0500 Received: by mail-bk0-f45.google.com with SMTP id jk13so2290170bkc.18 for ; Fri, 21 Dec 2012 03:41:09 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:date:from:to:cc:subject:message-id:references :mime-version:content-type:content-disposition:in-reply-to :user-agent:x-gm-message-state; bh=NZQUtvAd+ODftRA5lGDaGBIWXiQwaUuKZfvRvbs7YBE=; b=OV+IIProExMjHYzNv7+8XNFbbginVGPmAsetzJxOj/DuzNL2Lp+oYmvnH6jHId7jtH VWfaUhn74ExVgZfS+PCjllKTAUoqlKeQ0sNSxOGVRppB0zFFuO37lVtZCbn/7eFu2zg6 qnME1sLOcz68QmRv19Ql+l7iDQsJ1jucF4mvz50lfMI6HuXMSfD93vp0zUPHCHE7UFPY NnoOJ8lqSJ5Z+y0TU9x9YyPYFRUW+z3JxpMBWdPj6UY7Y3Tu/eZldhaV2tugZqdgfUs5 zCjo/jD8vxqwP4JJh8VETpmCzlVtA0Rr7t6FOKTEB74+WhFNyZsASkrbCh38mF29HGSn dojw== X-Received: by 10.205.125.137 with SMTP id gs9mr6256690bkc.22.1356090069243; Fri, 21 Dec 2012 03:41:09 -0800 (PST) Received: from gmail.com (cpc1-aztw13-0-0-cust473.18-1.cable.virginmedia.com. [77.102.241.218]) by mx.google.com with ESMTPS id v8sm9610647bku.6.2012.12.21.03.41.07 (version=SSLv3 cipher=OTHER); Fri, 21 Dec 2012 03:41:08 -0800 (PST) Date: Fri, 21 Dec 2012 11:41:05 +0000 From: Lee Jones To: Russell King - ARM Linux Cc: Linus Walleij , Steve Glendinning , Robert Marklund , linus.walleij@stericsson.com, arnd@arndb.de, netdev@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH 4/4 v2] net/smsc911x: Provide common clock functionality Message-ID: <20121221114105.GP2691@gmail.com> References: <1355937587-31730-1-git-send-email-lee.jones@linaro.org> <1355937587-31730-4-git-send-email-lee.jones@linaro.org> <20121220192441.GC14363@n2100.arm.linux.org.uk> <20121220203514.GN2691@gmail.com> <20121220205113.GD14363@n2100.arm.linux.org.uk> <20121221091306.GO2691@gmail.com> <20121221092421.GG14363@n2100.arm.linux.org.uk> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20121221092421.GG14363@n2100.arm.linux.org.uk> User-Agent: Mutt/1.5.21 (2010-09-15) X-Gm-Message-State: ALoCoQnQaJm9LLZgq0Nt1XUhOHtk8CqgGHtPajIrqAp4zn+OdWf6zjB7Jt3PlwAIDFfexT4GB+He Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Some platforms provide clocks which require enabling before the SMSC911x chip will power on. This patch uses the new common clk framework to do just that. If no clock is provided, it will just be ignored and the driver will continue to assume that no clock is required for the chip to run successfully. Cc: Steve Glendinning Cc: netdev@vger.kernel.org Signed-off-by: Lee Jones --- drivers/net/ethernet/smsc/smsc911x.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c index e112877..afa4d62 100644 --- a/drivers/net/ethernet/smsc/smsc911x.c +++ b/drivers/net/ethernet/smsc/smsc911x.c @@ -33,6 +33,7 @@ #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt #include +#include #include #include #include @@ -144,6 +145,9 @@ struct smsc911x_data { /* regulators */ struct regulator_bulk_data supplies[SMSC911X_NUM_SUPPLIES]; + + /* clock */ + struct clk *clk; }; /* Easy access to information */ @@ -369,7 +373,7 @@ out: } /* - * enable resources, currently just regulators. + * enable regulator and clock resources. */ static int smsc911x_enable_resources(struct platform_device *pdev) { @@ -382,6 +386,13 @@ static int smsc911x_enable_resources(struct platform_device *pdev) if (ret) netdev_err(ndev, "failed to enable regulators %d\n", ret); + + if (IS_ERR(pdata->clk)) { + ret = clk_prepare_enable(pdata->clk); + if (ret < 0) + netdev_err(ndev, "failed to enable clock %d\n", ret); + } + return ret; } @@ -396,6 +407,10 @@ static int smsc911x_disable_resources(struct platform_device *pdev) ret = regulator_bulk_disable(ARRAY_SIZE(pdata->supplies), pdata->supplies); + + if (IS_ERR(pdata->clk)) + clk_disable_unprepare(pdata->clk); + return ret; } @@ -421,6 +436,12 @@ static int smsc911x_request_resources(struct platform_device *pdev) if (ret) netdev_err(ndev, "couldn't get regulators %d\n", ret); + + /* Request clock */ + pdata->clk = clk_get(&pdev->dev, NULL); + if (IS_ERR(pdata->clk)) + netdev_warn(ndev, "couldn't get clock %li\n", PTR_ERR(pdata->clk)); + return ret; } @@ -436,6 +457,12 @@ static void smsc911x_free_resources(struct platform_device *pdev) /* Free regulators */ regulator_bulk_free(ARRAY_SIZE(pdata->supplies), pdata->supplies); + + /* Free clock */ + if (IS_ERR(pdata->clk)) { + clk_put(pdata->clk); + pdata->clk = NULL; + } } /* waits for MAC not busy, with timeout. Only called by smsc911x_mac_read