Received: by 2002:a05:6a10:9afc:0:0:0:0 with SMTP id t28csp119758pxm; Fri, 25 Feb 2022 05:08:49 -0800 (PST) X-Google-Smtp-Source: ABdhPJz6EpmZiPiErO9vQMsFJjY3yducTScrj9lubjE0ilU6e7LVaOrA28xawdEUHVTa10qQs4Bn X-Received: by 2002:a17:906:11d7:b0:6ce:2999:c831 with SMTP id o23-20020a17090611d700b006ce2999c831mr6064422eja.336.1645794529011; Fri, 25 Feb 2022 05:08:49 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1645794529; cv=none; d=google.com; s=arc-20160816; b=aiCo9HDDfXxOOEERHEQWiOd7SglxdBVyG+e5NjgN45622nWKfsnXObj85+I12IE2oe z36PxUVoAyYNo/fi4gv/GIFdjbMR7zz5d8KRV2QqX7KKGffd7PkotHF0/ffGwH1/GQ7n 6Uik7fOlOcb4tFm1YHVeaRzMlpVhGItDYM/scIK/+xEK02UyMFVV4lRKmhF8kqo/bJ9/ LrRMe5xda2mQ2EFGqxBNmM4SbwJqdFdzGT4Ypp2OqT5sqUW+6GoszBnWF6Chz69aM5mt USGEy4DqAGpDeAZ1OUmc2msA5AHFRx3eb63LqNfCzXeJE9Rx2IgMkUdH/agHiZ+q2Sq5 gbEw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:in-reply-to:from :references:cc:to:content-language:subject:user-agent:mime-version :date:message-id:dkim-signature; bh=S03W/v4Sem2mf4yd9q7U4zp9iPV/7nhrtmNq97g5wQg=; b=o+9v7hFKXZEutun5bNZM9ppRk3FZl2NV8t5mfUGz6Gl0U3Xy95SpPJts90tr4BPoez Q5pahNtgFalNL0WcPZRjv4jgyi8VkZgpBazt6MEgkJh4m867Z/Q/jAB0P0rWFDAGb/Gn 3V4c+AsgfUsxlAxC6VcC3O/y12cQCQush7h41Lc4zsKf5tjCEuJs6QaBV4cKCTZA87SC nvXsZM9/jMmuCjLxKi6xim140RNmgsAXunCcWC11T0ibQVVfKrHck9Mgi5u9FOq33KM9 VHCOVYeWz+q1ohVfur9QPaH2TE5wqu2vmcN0UGFGXVEndEfHDIv1jFgMtiZxEkymcUpB LD1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b=NUdBb0+v; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=collabora.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id k24-20020aa7d2d8000000b004134f26020bsi1668321edr.237.2022.02.25.05.08.24; Fri, 25 Feb 2022 05:08:48 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@collabora.com header.s=mail header.b=NUdBb0+v; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=collabora.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229960AbiBYMHL (ORCPT + 99 others); Fri, 25 Feb 2022 07:07:11 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55648 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229537AbiBYMHK (ORCPT ); Fri, 25 Feb 2022 07:07:10 -0500 Received: from bhuna.collabora.co.uk (bhuna.collabora.co.uk [46.235.227.227]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C9D9C267D; Fri, 25 Feb 2022 04:06:34 -0800 (PST) Received: from [127.0.0.1] (localhost [127.0.0.1]) (Authenticated sender: kholk11) with ESMTPSA id 6B3AC1F42522 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=collabora.com; s=mail; t=1645790793; bh=bCvONPGPweF9C0iIikhI+xXmgfTZPFzQXLGikPMic4Q=; h=Date:Subject:To:Cc:References:From:In-Reply-To:From; b=NUdBb0+vQZH9FR5rKRZuLNISs3qEAxljfZxyX/wjLatzxAmwaTmRWfJmN854GQnnP elhn7SJKFAOyWwiGMiAw7rGokii5TDEQBg9fCuv3L9ofZuZ1zFN+F64J8dP9dYQTlJ dcsEF3s1quTSkbShgCbYTkm6yK4R8RAVDKjQI/BV2C3ToBbzXP8/Lh+OPo+U+TDLzB TOQSvp5E1tgdUAdbB3rZ9f6gekB+4LKSz3UsPHk6meK51t9YoX0odctJxl76GeijL9 zNrysxDz9Bv8nxRlUybyWDDYCYDTDhrObaNriQVzfep8rKnf3RxcLPhvK/gH0IDDHF 8i6+AtMAKSCHQ== Message-ID: Date: Fri, 25 Feb 2022 13:06:29 +0100 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.5.1 Subject: Re: [PATCH v8 14/19] phy: phy-mtk-dp: Add driver for DP phy Content-Language: en-US To: Guillaume Ranquet , airlied@linux.ie, chunfeng.yun@mediatek.com, chunkuang.hu@kernel.org, ck.hu@mediatek.com, daniel@ffwll.ch, deller@gmx.de, jitao.shi@mediatek.com, kishon@ti.com, maarten.lankhorst@linux.intel.com, matthias.bgg@gmail.com, mripard@kernel.org, p.zabel@pengutronix.de, robh+dt@kernel.org, tzimmermann@suse.de, vkoul@kernel.org Cc: dri-devel@lists.freedesktop.org, linux-mediatek@lists.infradead.org, devicetree@vger.kernel.org, linux-kernel@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-phy@lists.infradead.org, linux-fbdev@vger.kernel.org, Markus Schneider-Pargmann References: <20220218145437.18563-1-granquet@baylibre.com> <20220218145437.18563-15-granquet@baylibre.com> From: AngeloGioacchino Del Regno In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NICE_REPLY_A,SPF_HELO_PASS, SPF_PASS,T_SCC_BODY_TEXT_LINE,UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Il 25/02/22 12:49, Guillaume Ranquet ha scritto: > Quoting AngeloGioacchino Del Regno (2022-02-21 15:31:51) >> Il 18/02/22 15:54, Guillaume Ranquet ha scritto: >>> From: Markus Schneider-Pargmann >>> >>> This is a new driver that supports the integrated DisplayPort phy for >>> mediatek SoCs, especially the mt8195. The phy is integrated into the >>> DisplayPort controller and will be created by the mtk-dp driver. This >>> driver expects a struct regmap to be able to work on the same registers >>> as the DisplayPort controller. It sets the device data to be the struct >>> phy so that the DisplayPort controller can easily work with it. >>> >>> The driver does not have any devicetree bindings because the datasheet >>> does not list the controller and the phy as distinct units. >>> >>> The interaction with the controller can be covered by the configure >>> callback of the phy framework and its displayport parameters. >>> >>> Signed-off-by: Markus Schneider-Pargmann >>> Signed-off-by: Guillaume Ranquet >>> --- >>> MAINTAINERS | 1 + >>> drivers/phy/mediatek/Kconfig | 8 ++ >>> drivers/phy/mediatek/Makefile | 1 + >>> drivers/phy/mediatek/phy-mtk-dp.c | 199 ++++++++++++++++++++++++++++++ >>> 4 files changed, 209 insertions(+) >>> create mode 100644 drivers/phy/mediatek/phy-mtk-dp.c >>> ..snip.. >>> +static int mtk_dp_phy_reset(struct phy *phy) >>> +{ >>> + struct mtk_dp_phy *dp_phy = phy_get_drvdata(phy); >>> + >>> + regmap_update_bits(dp_phy->regs, MTK_DP_PHY_DIG_SW_RST, >>> + DP_GLB_SW_RST_PHYD, 0); >> >> Please, when you add delays/sleeps, add a comment explaining the reason for that. >> >> To you.. and to me as well.. the reason is very much known and honestly obvious, >> but let's be nice with people that don't know the MediaTek platforms :) >> > It's sadly not obvious to me, I've asked mediatek engineers mutlple > times for these > kind of information, but I'm rather short on information... :-/ > Clearly, the PHY needs at least 50uS to perform software reset (SW_RST) of the digital (controller? my brain doesn't want to cooperate on giving the right word right now, sorry), so we sleep that time after asserting the reset bit to comply with this timing. >>> + usleep_range(50, 200); >>> + regmap_update_bits(dp_phy->regs, MTK_DP_PHY_DIG_SW_RST, >>> + DP_GLB_SW_RST_PHYD, 1); >>> + >>> + return 0; >>> +} >>> + >>> +static const struct phy_ops mtk_dp_phy_dev_ops = { >>> + .init = mtk_dp_phy_init, >>> + .configure = mtk_dp_phy_configure, >>> + .reset = mtk_dp_phy_reset, >>> + .owner = THIS_MODULE, >>> +}; >>> + >>> +static int mtk_dp_phy_probe(struct platform_device *pdev) >>> +{ >>> + struct device *dev = &pdev->dev; >>> + struct mtk_dp_phy *dp_phy; >>> + struct phy *phy; >> >> struct regmap *regs = (blah); >> >> if (!dp_phy->regs) >> return -EINVAL; >> >> Doing that before allocating the dp_phy struct seems sensible as, even >> if it's unlikely that this platform data is not passed, we'd be sparing >> some time around. >> >> Besides - I think that the error message is not necessary here, but, if >> you really want to keep it, please return dev_err_probe(): using it in >> these cases is also allowed. >> > You are right, it's logical to return as early as possible. > >>> + >>> + dp_phy = devm_kzalloc(dev, sizeof(*dp_phy), GFP_KERNEL); >>> + if (!dp_phy) >>> + return -ENOMEM; >>> + >>> + dp_phy->regs = *(struct regmap **)dev->platform_data; >>> + if (!dp_phy->regs) { >>> + dev_err(dev, "No data passed, requires struct regmap**\n"); >>> + return -EINVAL; >>> + } >>> + >>> + phy = devm_phy_create(dev, NULL, &mtk_dp_phy_dev_ops); >> >> if (IS_ERR(phy)) >> return dev_err_probe(dev, PTR_ERR(phy), "Cannot create DP PHY\n"); >> >>> + if (IS_ERR(phy)) { >>> + dev_err(dev, "Failed to create DP PHY: %ld\n", PTR_ERR(phy)); >>> + return PTR_ERR(phy); >>> + } >>> + phy_set_drvdata(phy, dp_phy); >>> + >>> + if (!dev->of_node) >> >> This will never happen if you use DT to probe this driver - and please do! >> >> An example device-tree binding would be: >> >> dp_phy: phy@somewhere { >> compatible = "mediatek,mt8195-dp-phy", "mediatek,dp-phy"; >> reg = <...>; >> #phy-cells = <0>; >> }; >> >> mtk_dp: displayport-controller@somewhere_else { >> compatible = "mediatek,mt8195-edp-tx", "mediatek,edp-tx"; >> reg = <....>; >> other-properties; >> >> phys = <&dp_phy>; >> phy-names = "dp"; >> }; >> >> Also, remember: since you're nicely using regmap, if you - for any reason - need >> to share the same iospace between the two drivers, you can always use a >> syscon node for that purpose. >> > Sadly, I'm not using DT to prove this driver... and this driver will > probably never > be used with DT. > This phy is actually an integral part of the dp ip, this driver is > only a "logical" > separation between the DP/phy functionnalities. > It's probed from the DP driver with a call to `platform_register_device()`. > Both the DP and phy driver share the same regmap struct. > > Markus tried to explain that in the commit message, please tell me if this needs > a reword? > The original discussion is here: > https://lore.kernel.org/all/CAAOTY__cJMqcAieEraJ2sz4gi0Zs-aiNXz38_x7dPQea6HvYEg@mail.gmail.com/ > I understand the fact that the PHY is part of the entire block, but you cannot guarantee that the next block will have an entirely different PHY and also an entirely different port IP. I will pretty much oversimplify this as to make sure that you understand the strategy and concerns that I have in mind, and why I think that this should still be probed separately with its own device-tree compatible: 1. The DisplayPort IP that we have in MT8195 is composed of A - DisplayPort PHY, let's give it a fantasy version V1.0 B - DisplayPort "port" IP, also fantasy version V1.0 2. DisplayPort IP in a future MT9988 chip may be composed of A - DisplayPort PHY, V1.0 B - DisplayPort "port" IP, V1.1, maybe in a different iospace 3. Of course, it may happen that MT9999 chip may have a variant of the one in 9988 A - DisplayPort PHY, V1.01, maybe in a different iospace B - DisplayPort "port" IP, V1.1 In cases 2, 3, having both drivers probed as I suggest, will allow to not only specify a different iospace (which may not be contiguous anymore!), but also to avoid specifying a different compatible string for one of the two components which are not carrying any variation in the register layout and/or management. This, in turn, will also make it easier for developers reading the SoC device trees to get more immediate knowledge of the hardware, but of course this is not a primary reason, but more like a side-benefit. > I didn't know about syscon, I'll have a look... but it's definitively what > I'm doing here... > P.S.: As for "holes in the middle", remember that device-tree supports "ranges"! >>> + phy_create_lookup(phy, "dp", dev_name(dev)); >>> + >>> + return 0; >>> +} >>> + >>> +struct platform_driver mtk_dp_phy_driver = { >>> + .probe = mtk_dp_phy_probe, >>> + .driver = { >>> + .name = "mediatek-dp-phy", >>> + }, >>> +}; >>> +module_platform_driver(mtk_dp_phy_driver); >>> + >>> +MODULE_AUTHOR("Markus Schneider-Pargmann "); >>> +MODULE_DESCRIPTION("MediaTek DP PHY Driver"); >>> +MODULE_LICENSE("GPL v2"); >>