[PATCH 1/2] phy: rockchip-inno-usb2: Write to correct GRF
Kever Yang
kever.yang at rock-chips.com
Fri Mar 8 09:45:24 CET 2024
On 2024/2/26 06:10, Jonas Karlman wrote:
> On RK3399 the USB2PHY regs are located in the common GRF, remaining SoCs
> that is supported by this driver have the USB2PHY regs in a different
> GRF.
>
> When support for RK356x, RK3588 and RK3328 was added this driver was
> never updated to use correct GRF and have instead incorrectly written
> to wrong GRF for these SoCs.
>
> The default reset values for the USB2PHY have made USB mostly working
> even when wrong GRF was used, however, following have been observed:
>
> scanning bus usb at fd840000 for devices...
> ERROR: USB-error: DEVICENOTRESPONDING: Device did not respond to token (IN) or did
> not provide a handshake (OUT) (5)
> ERROR: USB-error: DEVICENOTRESPONDING: Device did not respond to token (IN) or did
> not provide a handshake (OUT) (5)
> unable to get device descriptor (error=-1)
>
> Fix this by using a regmap from rockchip,usbgrf prop and fall back to
> getting a regmap for parent udevice instead of always getting the
> common GRF.
>
> Also protect against accidental clear of bit 0 in a reg with offset 0,
> only bind driver to enabled otg/host-ports and remove unused headers.
>
> Fixes: 3da15f0b49a2 ("phy: rockchip-inno-usb2: Add USB2 PHY for rk3568")
> Fixes: cdf9010f6e17 ("phy: rockchip-inno-usb2: add initial support for rk3588 PHY")
> Fixes: 9aa93d84038b ("phy: rockchip-inno-usb2: Add USB2 PHY for RK3328")
> Signed-off-by: Jonas Karlman <jonas at kwiboo.se>
Reviewed-by: Kever Yang <kever.yang at rock-chips.com>
Thanks,
- Kever
> ---
> drivers/phy/rockchip/phy-rockchip-inno-usb2.c | 41 ++++++++++---------
> 1 file changed, 22 insertions(+), 19 deletions(-)
>
> diff --git a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
> index 70e61eccb79a..7317128d135e 100644
> --- a/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
> +++ b/drivers/phy/rockchip/phy-rockchip-inno-usb2.c
> @@ -6,23 +6,16 @@
> * Copyright (C) 2020 Amarula Solutions(India)
> */
>
> -#include <common.h>
> #include <clk-uclass.h>
> #include <dm.h>
> -#include <asm/global_data.h>
> #include <dm/device_compat.h>
> #include <dm/device-internal.h>
> #include <dm/lists.h>
> #include <generic-phy.h>
> -#include <reset.h>
> +#include <regmap.h>
> #include <syscon.h>
> -#include <asm/gpio.h>
> -#include <asm/io.h>
> -#include <linux/iopoll.h>
> #include <asm/arch-rockchip/clock.h>
>
> -DECLARE_GLOBAL_DATA_PTR;
> -
> #define usleep_range(a, b) udelay((b))
> #define BIT_WRITEABLE_SHIFT 16
>
> @@ -61,30 +54,39 @@ struct rockchip_usb2phy_cfg {
> };
>
> struct rockchip_usb2phy {
> - void *reg_base;
> + struct regmap *reg_base;
> struct clk phyclk;
> const struct rockchip_usb2phy_cfg *phy_cfg;
> };
>
> -static inline int property_enable(void *reg_base,
> +static inline int property_enable(struct regmap *base,
> const struct usb2phy_reg *reg, bool en)
> {
> unsigned int val, mask, tmp;
>
> + if (!reg->offset && !reg->enable && !reg->disable)
> + return 0;
> +
> tmp = en ? reg->enable : reg->disable;
> mask = GENMASK(reg->bitend, reg->bitstart);
> val = (tmp << reg->bitstart) | (mask << BIT_WRITEABLE_SHIFT);
>
> - return writel(val, reg_base + reg->offset);
> + return regmap_write(base, reg->offset, val);
> }
>
> -static inline bool property_enabled(void *reg_base,
> +static inline bool property_enabled(struct regmap *base,
> const struct usb2phy_reg *reg)
> {
> + int ret;
> unsigned int tmp, orig;
> unsigned int mask = GENMASK(reg->bitend, reg->bitstart);
>
> - orig = readl(reg_base + reg->offset);
> + if (!reg->offset && !reg->enable && !reg->disable)
> + return false;
> +
> + ret = regmap_read(base, reg->offset, &orig);
> + if (ret)
> + return false;
>
> tmp = (orig & mask) >> reg->bitstart;
> return tmp != reg->disable;
> @@ -248,7 +250,11 @@ static int rockchip_usb2phy_probe(struct udevice *dev)
> unsigned int reg;
> int index, ret;
>
> - priv->reg_base = syscon_get_first_range(ROCKCHIP_SYSCON_GRF);
> + if (dev_read_bool(dev, "rockchip,usbgrf"))
> + priv->reg_base =
> + syscon_regmap_lookup_by_phandle(dev, "rockchip,usbgrf");
> + else
> + priv->reg_base = syscon_get_regmap(dev_get_parent(dev));
> if (IS_ERR(priv->reg_base))
> return PTR_ERR(priv->reg_base);
>
> @@ -305,11 +311,8 @@ static int rockchip_usb2phy_bind(struct udevice *dev)
> int ret = 0;
>
> dev_for_each_subnode(node, dev) {
> - if (!ofnode_valid(node)) {
> - dev_info(dev, "subnode %s not found\n", dev->name);
> - ret = -ENXIO;
> - goto bind_fail;
> - }
> + if (!ofnode_is_enabled(node))
> + continue;
>
> name = ofnode_get_name(node);
> dev_dbg(dev, "subnode %s\n", name);
More information about the U-Boot
mailing list