Re: [PATCH v2 2/2] phy: qualcomm: usb: Add Super-Speed PHY driver

From: Jorge Ramirez
Date: Wed Jan 30 2019 - 06:38:27 EST


On 1/30/19 10:53, Jorge Ramirez wrote:
> On 1/29/19 21:27, Bjorn Andersson wrote:
>> On Tue 29 Jan 03:35 PST 2019, Jorge Ramirez-Ortiz wrote:
>>> diff --git a/drivers/phy/qualcomm/phy-qcom-usb-ss.c b/drivers/phy/qualcomm/phy-qcom-usb-ss.c
>>> new file mode 100644
>>> index 0000000..e6ae96e
>>> --- /dev/null
>>> +++ b/drivers/phy/qualcomm/phy-qcom-usb-ss.c
>>> @@ -0,0 +1,347 @@
>>> +// SPDX-License-Identifier: GPL-2.0
>>> +/*
>>> + * Copyright (c) 2012-2014,2017 The Linux Foundation. All rights reserved.
>>> + * Copyright (c) 2018, Linaro Limited
>>> + */
>>> +
>>> +#include <linux/clk.h>
>>> +#include <linux/delay.h>
>>> +#include <linux/err.h>
>>> +#include <linux/io.h>
>>> +#include <linux/kernel.h>
>>> +#include <linux/module.h>
>>> +#include <linux/of.h>
>>> +#include <linux/phy/phy.h>
>>> +#include <linux/platform_device.h>
>>> +#include <linux/regulator/consumer.h>
>>> +#include <linux/reset.h>
>>> +#include <linux/slab.h>
>>> +
>>> +#define PHY_CTRL0 0x6C
>>> +#define PHY_CTRL1 0x70
>>> +#define PHY_CTRL2 0x74
>>> +#define PHY_CTRL4 0x7C
>>> +
>>> +/* PHY_CTRL bits */
>>> +#define REF_PHY_EN BIT(0)
>>> +#define LANE0_PWR_ON BIT(2)
>>> +#define SWI_PCS_CLK_SEL BIT(4)
>>> +#define TST_PWR_DOWN BIT(4)
>>> +#define PHY_RESET BIT(7)
>>> +
>>> +enum phy_vdd_ctrl { ENABLE, DISABLE, };
>>
>> Use bool to describe boolean values.
>
> um, ok, but these are not booleans, they are actions (ie ctrl = action
> not true or false).
>
> anyway will change it to something else
>
>>
>>> +enum phy_regulator { VDD, VDDA1P8, };
>>
>> It doesn't look like you need either of these if you remove the
>> set_voltage calls.
>
> we need to point to the regulator in the array so we need an index to it
> somehow.

you are right, we dont

>
>>
>>> +
>>> +struct ssphy_priv {
>>> + void __iomem *base;
>>> + struct device *dev;
>>> + struct reset_control *reset_com;
>>> + struct reset_control *reset_phy;
>>> + struct regulator *vbus;
>>> + struct regulator_bulk_data *regs;
>>> + int num_regs;
>>> + struct clk_bulk_data *clks;
>>> + int num_clks;
>>> + enum phy_mode mode;
>>> +};
>>> +
>>> +static inline void qcom_ssphy_updatel(void __iomem *addr, u32 mask, u32 val)
>>> +{
>>> + writel((readl(addr) & ~mask) | val, addr);
>>> +}
>>> +
>>> +static inline int qcom_ssphy_vbus_enable(struct regulator *vbus)
>>> +{
>>> + return !regulator_is_enabled(vbus) ? regulator_enable(vbus) : 0;
>>
>> regulator_is_enabled() will check if the actual regulator is on, not if
>> you already voted for it.
>>
>> So if something else is enabling the vbus regulator you will skip your
>> enable and be in the mercy of them not releasing it. Presumably there's
>> only one consumer of this particular regulator, but it's a bad habit.
>
> yep
>
>>
>> Please keep track of this drivers requested state in this driver, if
>> qcom_ssphy_vbus_ctrl() is called not only for the state changes.
>
> um, there is not such a function: the ctrl function is not for vbus but
> for vdd

argh, sorry, it is me who misread my own driver. ok I know what you
mean. will send the updated driver shortly.