From patchwork Sun Feb 25 12:51:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Linus Walleij X-Patchwork-Id: 129521 Delivered-To: patch@linaro.org Received: by 10.46.66.2 with SMTP id p2csp2580802lja; Sun, 25 Feb 2018 04:54:20 -0800 (PST) X-Google-Smtp-Source: AH8x226M9vGvtvI3FBZsWhoV7HZInpYpOud0Zo2RnstrHYkm/ozDQdZvHW41MB27QrJgrxSbtJnA X-Received: by 10.101.72.2 with SMTP id h2mr5922561pgs.240.1519563259943; Sun, 25 Feb 2018 04:54:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1519563259; cv=none; d=google.com; s=arc-20160816; b=DgxphI3Vl1BNOxtdxEeEUwX70fBjspZ898LEhZF76ppk4wjxkdc7Y03Ez7qHubyBvM 4kGslIyug+CRBhKb94hr72I1J2DJOIe5CW5DeRNRyctxFqsbiOsCWoD24NKiH3l22x1X D9Ry5LQI/GtgKWh7a+hzLBNDMNsvYbvnTcXa32TUUFhdxEVBOg1Hcu1aD9L6IBNHgHz7 DOnBC+OoHLCpxo2UFZbo5z3heKe809VJuYWP9WvXg/ISbIGFMyHWYd/Uc7GOatg9xOMb QA497qTeGq01w2sioBv207Bu0me8Om2M1VPxG9mMUFrlImnGHOpzXIWeBWn48K1ivdHJ u6Ig== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:references:in-reply-to:message-id:date :subject:cc:to:from:dkim-signature:arc-authentication-results; bh=kcn0wdf0t5kx0IG2eQWcThYyZ3bGMuy3GTXTGN05orU=; b=O/3LELkRgRqarH2+fz9ex/Ksm2XtuzKjlaSSW/yFpiaDRBlKBz1nKW54Y9AhbdMfo5 zdWz/TYQDH9kb3NH+ps14lNdZ+L8IuPl1Ml24Q6vpqtu4rLPzXCg2hJor2EijprSO0ES zN4Yr8LVAQMQLjXioehxdyS4LMRwpkBHiv80nagK+HVb4nLIqIrOXvKW79lynwVQO/DM j9wusjLmyU6lYd6JA+lfAAmTn1eAcOaKKPckgwpFDufyDgvcQg9PpLcPOf5OIhORuV9F MVZ6xoht+pJVh0tPnIu+osdvyn1KZzcDMJondyDf5aEqzIi3RIVVopXB4c0J1bgdBqFx HkEg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=RHOeLXN6; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id l77si5131892pfk.210.2018.02.25.04.54.19; Sun, 25 Feb 2018 04:54:19 -0800 (PST) Received-SPF: pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=RHOeLXN6; spf=pass (google.com: best guess record for domain of netdev-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751793AbeBYMyR (ORCPT + 8 others); Sun, 25 Feb 2018 07:54:17 -0500 Received: from mail-lf0-f68.google.com ([209.85.215.68]:34926 "EHLO mail-lf0-f68.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751765AbeBYMyE (ORCPT ); Sun, 25 Feb 2018 07:54:04 -0500 Received: by mail-lf0-f68.google.com with SMTP id 70so18438972lfw.2 for ; Sun, 25 Feb 2018 04:54:03 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=kcn0wdf0t5kx0IG2eQWcThYyZ3bGMuy3GTXTGN05orU=; b=RHOeLXN6+VB80Zd+6XRl3MNsfYRIAH4zr+UxTC4yq7+6DcA9hiqPKxm+2wALlkoN40 wX2Kltl4rRd5vi0E/lGb7iPo06adXOPlWmPkrMAigiD3LxgKvZfZDAkbeGwF1ONkXzB/ LLLRoLMm8jTV9CK1mBFGYcNRYkaWGUDysakso= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=kcn0wdf0t5kx0IG2eQWcThYyZ3bGMuy3GTXTGN05orU=; b=NHJVDLOwnbhk+Kc1nF2cVakgYr/lP0KuexWg0COsQPUQavYIpGAevqzZuTOrTTh5Cb sziQZ7EVusoMjXPdRdUJBVHeFcy1gm3uMqxCSaz05V0+inxlVUa+GSJOWyP2fa7yErhQ c9YlpbZ/Z1veHLGKirVSeqmGUwqRg/nO0TCq2RtZBETPrUwllzgDxXVcrfIgKERerk3+ 7m8Y2Q54ZEW1xbQ9VkeCn9cpltZYmcRviiy/eHiG9Zwymo0PPVZD1xDPMFpMzeDRlPWa GUfMxpuD45MvGwI5SipeRE2oaprPo5n9chDtFpyXnIXlo6m4WwAIy0EQqzknd2KMMffy DVXQ== X-Gm-Message-State: APf1xPC8hLeDF11X6J0Fi1lzUL39RdpjZnhruRkeyGJSQeGxSd9OcPPl L6PWO4STCtUDnvyLoaQlULfDBg== X-Received: by 10.46.21.13 with SMTP id s13mr5460180ljd.58.1519563242703; Sun, 25 Feb 2018 04:54:02 -0800 (PST) Received: from localhost.localdomain (c-cb7471d5.014-348-6c756e10.cust.bredbandsbolaget.se. [213.113.116.203]) by smtp.gmail.com with ESMTPSA id 5sm1456574lfp.17.2018.02.25.04.54.01 (version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256); Sun, 25 Feb 2018 04:54:01 -0800 (PST) From: Linus Walleij To: Andrew Lunn , Florian Fainelli , "David S . Miller" Cc: netdev@vger.kernel.org, Laurent Pinchart , Linus Walleij Subject: [PATCH net-next 5/5] net: mdio-gpio: Move to gpiod API Date: Sun, 25 Feb 2018 13:51:32 +0100 Message-Id: <20180225125132.25275-6-linus.walleij@linaro.org> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180225125132.25275-1-linus.walleij@linaro.org> References: <20180225125132.25275-1-linus.walleij@linaro.org> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Move the bitbanged GPIO based MDIO driver over to using the gpiolib GPIO descriptors and transfer the line inversion and optional MDO handling semantics to gpiolib. The driver has been parsing the device tree to handle GPIO semantics on its own, but this is completely unnecessary as the gpiolib can handle all inversion and optional line semantics. This cuts down the code a lot and makes the driver simpler. Switch mdio_gpio_bus_init() to return an error pointer and handle this in probe() so we can back out of e.g. -EPROBE_DEFER properly if we need to. After this the GPIO MDIO driver only use GPIO descriptors and is completely decoupled from the old GPIO API. Signed-off-by: Linus Walleij --- drivers/net/phy/mdio-gpio.c | 81 +++++++++++++-------------------------------- 1 file changed, 23 insertions(+), 58 deletions(-) -- 2.14.3 diff --git a/drivers/net/phy/mdio-gpio.c b/drivers/net/phy/mdio-gpio.c index 9146077b5278..5740f16a0f30 100644 --- a/drivers/net/phy/mdio-gpio.c +++ b/drivers/net/phy/mdio-gpio.c @@ -25,9 +25,7 @@ #include #include #include -#include - -#include +#include #include struct mdio_gpio_info { @@ -94,41 +92,23 @@ static const struct mdiobb_ops mdio_gpio_ops = { static struct mii_bus *mdio_gpio_bus_init(struct device *dev, struct mdio_gpio_info *bitbang) { - unsigned long mdo_flags = GPIOF_OUT_INIT_HIGH; - unsigned long mdc_flags = GPIOF_OUT_INIT_LOW; - unsigned long mdio_flags = GPIOF_DIR_IN; struct device_node *np = dev->of_node; - enum of_gpio_flags flags; struct mii_bus *new_bus; - bool mdio_active_low; - bool mdc_active_low; - bool mdo_active_low; - unsigned int mdio; - unsigned int mdc; - unsigned int mdo; int bus_id; int ret, i; - ret = of_get_gpio_flags(np, 0, &flags); - if (ret < 0) - return NULL; - - mdc = ret; - mdc_active_low = flags & OF_GPIO_ACTIVE_LOW; - - ret = of_get_gpio_flags(np, 1, &flags); - if (ret < 0) - return NULL; - mdio = ret; - mdio_active_low = flags & OF_GPIO_ACTIVE_LOW; - - ret = of_get_gpio_flags(np, 2, &flags); - if (ret > 0) { - mdo = ret; - mdo_active_low = flags & OF_GPIO_ACTIVE_LOW; - } else { - mdo = 0; - } + bitbang->mdc = + devm_gpiod_get_index(dev, NULL, 0, GPIOD_OUT_LOW); + if (IS_ERR(bitbang->mdc)) + return ERR_CAST(bitbang->mdc); + bitbang->mdio = + devm_gpiod_get_index(dev, NULL, 1, GPIOD_IN); + if (IS_ERR(bitbang->mdio)) + return ERR_CAST(bitbang->mdio); + bitbang->mdo = + devm_gpiod_get_index_optional(dev, NULL, 2, GPIOD_OUT_HIGH); + if (IS_ERR(bitbang->mdo)) + return ERR_CAST(bitbang->mdo); bus_id = of_alias_get_id(np, "mdio-gpio"); if (bus_id < 0) { @@ -137,27 +117,21 @@ static struct mii_bus *mdio_gpio_bus_init(struct device *dev, } bitbang->ctrl.ops = &mdio_gpio_ops; - bitbang->mdc = gpio_to_desc(mdc); - if (mdc_active_low) - mdc_flags = GPIOF_OUT_INIT_HIGH | GPIOF_ACTIVE_LOW; - bitbang->mdio = gpio_to_desc(mdio); - if (mdio_active_low) - mdio_flags |= GPIOF_ACTIVE_LOW; - if (mdo) { - bitbang->mdo = gpio_to_desc(mdo); - if (mdo_active_low) - mdo_flags = GPIOF_OUT_INIT_LOW | GPIOF_ACTIVE_LOW; - } new_bus = alloc_mdio_bitbang(&bitbang->ctrl); - if (!new_bus) + if (!new_bus) { + ret = -ENOMEM; goto out; + } new_bus->name = "GPIO Bitbanged MDIO", new_bus->parent = dev; - if (new_bus->phy_mask == ~0) + if (new_bus->phy_mask == ~0) { + dev_err(dev, "no PHY in mask\n"); + ret = -ENODEV; goto out_free_bus; + } for (i = 0; i < PHY_MAX_ADDR; i++) if (!new_bus->irq[i]) @@ -168,15 +142,6 @@ static struct mii_bus *mdio_gpio_bus_init(struct device *dev, else strncpy(new_bus->id, "gpio", MII_BUS_ID_SIZE); - if (devm_gpio_request_one(dev, mdc, mdc_flags, "mdc")) - goto out_free_bus; - - if (devm_gpio_request_one(dev, mdio, mdio_flags, "mdio")) - goto out_free_bus; - - if (mdo && devm_gpio_request_one(dev, mdo, mdo_flags, "mdo")) - goto out_free_bus; - dev_set_drvdata(dev, new_bus); return new_bus; @@ -184,7 +149,7 @@ static struct mii_bus *mdio_gpio_bus_init(struct device *dev, out_free_bus: free_mdio_bitbang(new_bus); out: - return NULL; + return ERR_PTR(ret); } static void mdio_gpio_bus_deinit(struct device *dev) @@ -216,8 +181,8 @@ static int mdio_gpio_probe(struct platform_device *pdev) return -ENOMEM; new_bus = mdio_gpio_bus_init(dev, bitbang); - if (!new_bus) - return -ENODEV; + if (IS_ERR(new_bus)) + return PTR_ERR(new_bus); ret = of_mdiobus_register(new_bus, np); if (ret)