Re: [PATCH 6/9] phy: cadence: sierra: Don't configure if any plls are already locked
From: Philipp Zabel
Date: Mon Nov 09 2020 - 03:39:46 EST
On Tue, 2020-11-03 at 09:25 +0530, Kishon Vijay Abraham I wrote:
> From: Faiz Abbas <faiz_abbas@xxxxxx>
>
> Serdes lanes might be shared between multiple cores in some usecases
> and its not possible to lock PLLs for both the lanes independently
> by the two cores. This requires a bootloader to configure both the
> lanes at early boot time.
>
> To handle this case, skip all configuration if any of the plls are
> already locked. This is done by adding an already_configured flag
> and using it to gate every register access as well as any phy_ops.
>
> Signed-off-by: Faiz Abbas <faiz_abbas@xxxxxx>
> Signed-off-by: Kishon Vijay Abraham I <kishon@xxxxxx>
> ---
> drivers/phy/cadence/phy-cadence-sierra.c | 127 ++++++++++++++---------
> 1 file changed, 78 insertions(+), 49 deletions(-)
>
> diff --git a/drivers/phy/cadence/phy-cadence-sierra.c b/drivers/phy/cadence/phy-cadence-sierra.c
> index e08548417bce..145e42837b7b 100644
> --- a/drivers/phy/cadence/phy-cadence-sierra.c
> +++ b/drivers/phy/cadence/phy-cadence-sierra.c
> @@ -364,6 +364,10 @@ static const struct phy_ops ops = {
> .owner = THIS_MODULE,
> };
>
> +static const struct phy_ops noop_ops = {
> + .owner = THIS_MODULE,
> +};
> +
> static int cdns_sierra_get_optional(struct cdns_sierra_inst *inst,
> struct device_node *child)
> {
> @@ -477,6 +481,49 @@ static int cdns_regmap_init_blocks(struct cdns_sierra_phy *sp,
> return 0;
> }
>
> +static int cdns_sierra_phy_get_clocks(struct cdns_sierra_phy *sp,
> + struct device *dev)
> +{
> + struct clk *clk;
> + int ret;
> +
> + sp->clk = devm_clk_get_optional(dev, "phy_clk");
> + if (IS_ERR(sp->clk)) {
> + dev_err(dev, "failed to get clock phy_clk\n");
> + return PTR_ERR(sp->clk);
> + }
> +
> + sp->phy_rst = devm_reset_control_get(dev, "sierra_reset");
While you're at it, please use devm_reset_control_get_exclusive() here
and ...
> + if (IS_ERR(sp->phy_rst)) {
> + dev_err(dev, "failed to get reset\n");
> + return PTR_ERR(sp->phy_rst);
> + }
> +
> + sp->apb_rst = devm_reset_control_get_optional(dev, "sierra_apb");
... devm_reset_control_get_optional_exclusive() here.
regards
Philipp