Files
build/patch/u-boot/v2024.01/board_rk3318-box/general-add-phy-ops.patch
Paolo Sabatino efee17f217 rockchip64: bump rk3318-box uboot to v2024.01
* bump uboot version to v2024.01
 * add hdmi, vop driver for rk3328, enable hdmi
 * add inno hdmi phy driver
2024-04-22 12:39:09 +02:00

88 lines
2.3 KiB
Diff

diff --git a/include/generic-phy.h b/include/generic-phy.h
index eaab749166..d4dac4975c 100644
--- a/include/generic-phy.h
+++ b/include/generic-phy.h
@@ -185,6 +185,10 @@ struct phy_ops {
* Return: 0 if OK, or a negative error code
*/
int (*set_speed)(struct phy *phy, int speed);
+
+ unsigned long (*set_pll)(struct phy *phy, unsigned long rate);
+ int (*set_bus_width)(struct phy *phy, u32 bus_width);
+ long (*round_rate)(struct phy *phy, unsigned long rate);
};
/**
@@ -429,6 +433,12 @@ int generic_setup_phy(struct udevice *dev, struct phy *phy, int index);
*/
int generic_shutdown_phy(struct phy *phy);
+unsigned long generic_phy_set_pll(struct phy *phy, unsigned long rate);
+
+int generic_phy_set_bus_width(struct phy *phy, u32 bus_width);
+
+long generic_phy_round_rate(struct phy *phy, unsigned long rate);
+
#else /* CONFIG_PHY */
static inline int generic_phy_init(struct phy *phy)
diff --git a/drivers/phy/phy-uclass.c b/drivers/phy/phy-uclass.c
index 0dcfe258bc..e824ff7b9e 100644
--- a/drivers/phy/phy-uclass.c
+++ b/drivers/phy/phy-uclass.c
@@ -225,6 +225,54 @@ int generic_phy_get_by_name(struct udevice *dev, const char *phy_name,
return generic_phy_get_by_index(dev, index, phy);
}
+unsigned long generic_phy_set_pll(struct phy *phy, unsigned long rate)
+{
+ struct phy_ops const *ops;
+ int ret;
+
+ if (!generic_phy_valid(phy))
+ return 0;
+ ops = phy_dev_ops(phy->dev);
+ if (!ops->set_pll)
+ return 0;
+ ret = ops->set_pll(phy, rate);
+ if (ret)
+ dev_err(phy->dev, "PHY: Failed to set_pll %s: %d.\n",
+ phy->dev->name, ret);
+
+ return ret;
+}
+
+int generic_phy_set_bus_width(struct phy *phy, u32 bus_width)
+{
+ struct phy_ops const *ops;
+ int ret;
+
+ if (!generic_phy_valid(phy))
+ return 0;
+ ops = phy_dev_ops(phy->dev);
+ if (!ops->set_bus_width)
+ return 0;
+ ret = ops->set_bus_width(phy, bus_width);
+ if (ret)
+ dev_err(phy->dev, "PHY: Failed to set_bus_width %s: %d.\n",
+ phy->dev->name, ret);
+
+ return ret;
+}
+
+long generic_phy_round_rate(struct phy *phy, unsigned long rate)
+{
+ struct phy_ops const *ops;
+
+ if (!generic_phy_valid(phy))
+ return 0;
+ ops = phy_dev_ops(phy->dev);
+ if (!ops->round_rate)
+ return 0;
+ return ops->round_rate(phy, rate);
+}
+
int generic_phy_init(struct phy *phy)
{
struct phy_counts *counts;