From patchwork Wed Jun 17 18:20:15 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Dan Murphy X-Patchwork-Id: 190889 Delivered-To: patch@linaro.org Received: by 2002:a92:cf06:0:0:0:0:0 with SMTP id c6csp688721ilo; Wed, 17 Jun 2020 11:21:18 -0700 (PDT) X-Google-Smtp-Source: ABdhPJzNJGGLQZ2wEVHeJn2DJm85FiIENFGJGt3iConfiQG4y0PfZJSsNZ6axYi6oMLM45eYJGjj X-Received: by 2002:a17:906:9257:: with SMTP id c23mr462314ejx.86.1592418078842; Wed, 17 Jun 2020 11:21:18 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1592418078; cv=none; d=google.com; s=arc-20160816; b=OKGC5aoeWPzk0ajAjQc6R9KvFdm8r4O3pT9IAzQeZmLq/tJpIhKgd14Ys7IFHOblQd /w0zvOz0KXMFCFinuhvBC7REaifzFPMPoBd1ov/EUDFpXXUTxL3v6SLiLdVB5uaydllU 6v0otC1hXw6ti9MQvugXEZwRaVrYztPdKMlhjYt/zRMpQNsdQbxXg8k6eqyME0cR2JvO rhVyPF6M03Q0GrmR3TVM2rAaaZF7HWU3ZBzwTMO0ewoRUILtPbFapiZtAE3I9qMckykA Zd2wq1Oxt3QTGgjykpR4P9jueUWwTBYlLJ0ddLW+cXlTIUbAJ4Iq0c1KERKWCFgKBsZb Hgew== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=ZNakNO/yn9w134SOd5ynDhx+3+mu8fsJN9YSibNbl20=; b=G5eP/Ae2UTjNQkPYccV0BVieyZL+LUoJdsYWjcV13B2HzuaD/Fj0s1jAABM47MTbuN maqAYGHMmKlygH116lP15hIIMzYnBJdlmp5rIdnzK7Brq0sqslhg1WHVh38vVQ7LpeXB bXhV5EXDusNNSC4udX6kDEPWqLOoPeCyVvWDW1KM0kMlZS+XDsf9mF/yMrhske9Ch9US yEic3vv6XoO53ZCbZyMhcjttsxHfTaPk9HnIBLaF9cglUqCDcpMCatO2iKSFeENm5ZLH WKrGaFmSZZJLM1InihF83Rr+EjMQJG5MCQvOJkowkfJ4/X0uSccovWI+cSJdpeoem+89 UL5Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=ir7fAGqY; spf=pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id f18si377646ejx.476.2020.06.17.11.21.18; Wed, 17 Jun 2020 11:21:18 -0700 (PDT) Received-SPF: pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@ti.com header.s=ti-com-17Q1 header.b=ir7fAGqY; spf=pass (google.com: domain of netdev-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=netdev-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=NONE dis=NONE) header.from=ti.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727870AbgFQSVO (ORCPT + 9 others); Wed, 17 Jun 2020 14:21:14 -0400 Received: from fllv0015.ext.ti.com ([198.47.19.141]:58074 "EHLO fllv0015.ext.ti.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727782AbgFQSUo (ORCPT ); Wed, 17 Jun 2020 14:20:44 -0400 Received: from fllv0034.itg.ti.com ([10.64.40.246]) by fllv0015.ext.ti.com (8.15.2/8.15.2) with ESMTP id 05HIKaE4039691; Wed, 17 Jun 2020 13:20:36 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=ti-com-17Q1; t=1592418036; bh=ZNakNO/yn9w134SOd5ynDhx+3+mu8fsJN9YSibNbl20=; h=From:To:CC:Subject:Date:In-Reply-To:References; b=ir7fAGqYjfCLlRirA0pQf3ozgPGgdkVp1TWvl33vI40UcEexF++LixsgC7KDKypiB no2IfGSEFofaoYvrbwfeEAftIz2kAk5H1eqfUx+fK85o+jOv5pp1Ghfs7dpjinRkPM xI4PxZB9zyS9tHLUu3DAejyPLsS793SHmK2dsTr8= Received: from DLEE114.ent.ti.com (dlee114.ent.ti.com [157.170.170.25]) by fllv0034.itg.ti.com (8.15.2/8.15.2) with ESMTPS id 05HIKaNA001355 (version=TLSv1.2 cipher=AES256-GCM-SHA384 bits=256 verify=FAIL); Wed, 17 Jun 2020 13:20:36 -0500 Received: from DLEE100.ent.ti.com (157.170.170.30) by DLEE114.ent.ti.com (157.170.170.25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1979.3; Wed, 17 Jun 2020 13:20:36 -0500 Received: from lelv0327.itg.ti.com (10.180.67.183) by DLEE100.ent.ti.com (157.170.170.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1979.3 via Frontend Transport; Wed, 17 Jun 2020 13:20:36 -0500 Received: from localhost (ileax41-snat.itg.ti.com [10.172.224.153]) by lelv0327.itg.ti.com (8.15.2/8.15.2) with ESMTP id 05HIKash068354; Wed, 17 Jun 2020 13:20:36 -0500 From: Dan Murphy To: , , , , CC: , , , Dan Murphy Subject: [PATCH net-next v7 2/6] net: phy: Add a helper to return the index for of the internal delay Date: Wed, 17 Jun 2020 13:20:15 -0500 Message-ID: <20200617182019.6790-3-dmurphy@ti.com> X-Mailer: git-send-email 2.26.2 In-Reply-To: <20200617182019.6790-1-dmurphy@ti.com> References: <20200617182019.6790-1-dmurphy@ti.com> MIME-Version: 1.0 X-EXCLAIMER-MD-CONFIG: e1e8a2fd-e40a-4ac6-ac9b-f7e9cc9ee180 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Add a helper function that will return the index in the array for the passed in internal delay value. The helper requires the array, size and delay value. The helper will then return the index for the exact match or return the index for the index to the closest smaller value. Signed-off-by: Dan Murphy --- drivers/net/phy/phy_device.c | 68 ++++++++++++++++++++++++++++++++++++ include/linux/phy.h | 4 +++ 2 files changed, 72 insertions(+) -- 2.26.2 diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 04946de74fa0..611d4e68e3c6 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -31,6 +31,7 @@ #include #include #include +#include MODULE_DESCRIPTION("PHY library"); MODULE_AUTHOR("Andy Fleming"); @@ -2657,6 +2658,73 @@ void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause) } EXPORT_SYMBOL(phy_get_pause); +/** + * phy_get_delay_index - returns the index of the internal delay + * @phydev: phy_device struct + * @dev: pointer to the devices device struct + * @delay_values: array of delays the PHY supports + * @size: the size of the delay array + * @is_rx: boolean to indicate to get the rx internal delay + * + * Returns the index within the array of internal delay passed in. + * Or if size == 0 then the delay read from the firmware is returned. + * The array must be in ascending order. + * Return errno if the delay is invalid or cannot be found. + */ +s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev, + const int *delay_values, int size, bool is_rx) +{ + int ret; + int i; + s32 delay; + + if (is_rx) + ret = device_property_read_u32(dev, "rx-internal-delay-ps", + &delay); + else + ret = device_property_read_u32(dev, "tx-internal-delay-ps", + &delay); + if (ret) { + phydev_err(phydev, "internal delay not defined\n"); + return -EINVAL; + } + + if (delay < 0) + return -EINVAL; + + if (size <= 0) + return delay; + + if (delay < delay_values[0] || delay > delay_values[size - 1]) { + phydev_err(phydev, "Delay %d is out of range\n", delay); + return -EINVAL; + } + + if (delay == delay_values[0]) + return 0; + + for (i = 1; i < size; i++) { + if (delay == delay_values[i]) + return i; + + /* Find an approximate index by looking up the table */ + if (delay > delay_values[i - 1] && + delay < delay_values[i]) { + if (delay - delay_values[i - 1] < + delay_values[i] - delay) + return i - 1; + else + return i; + } + } + + phydev_err(phydev, "error finding internal delay index for %d\n", + delay); + + return -EINVAL; +} +EXPORT_SYMBOL(phy_get_internal_delay); + static bool phy_drv_supports_irq(struct phy_driver *phydrv) { return phydrv->config_intr && phydrv->ack_interrupt; diff --git a/include/linux/phy.h b/include/linux/phy.h index 8c05d0fb5c00..917bfd422e06 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -1430,6 +1430,10 @@ void phy_set_asym_pause(struct phy_device *phydev, bool rx, bool tx); bool phy_validate_pause(struct phy_device *phydev, struct ethtool_pauseparam *pp); void phy_get_pause(struct phy_device *phydev, bool *tx_pause, bool *rx_pause); + +s32 phy_get_internal_delay(struct phy_device *phydev, struct device *dev, + const int *delay_values, int size, bool is_rx); + void phy_resolve_pause(unsigned long *local_adv, unsigned long *partner_adv, bool *tx_pause, bool *rx_pause);