|
@@ -7,10 +7,12 @@
|
|
|
* (at your option) any later version.
|
|
|
*/
|
|
|
|
|
|
+#include <linux/clk.h>
|
|
|
+#include <linux/mfd/syscon.h>
|
|
|
#include <linux/module.h>
|
|
|
#include <linux/platform_device.h>
|
|
|
-#include <linux/mfd/syscon.h>
|
|
|
#include <linux/regmap.h>
|
|
|
+
|
|
|
#include <drm/drm_of.h>
|
|
|
#include <drm/drmP.h>
|
|
|
#include <drm/drm_crtc_helper.h>
|
|
@@ -44,6 +46,7 @@ struct rockchip_hdmi {
|
|
|
struct regmap *regmap;
|
|
|
struct drm_encoder encoder;
|
|
|
const struct rockchip_hdmi_chip_data *chip_data;
|
|
|
+ struct clk *vpll_clk;
|
|
|
};
|
|
|
|
|
|
#define to_rockchip_hdmi(x) container_of(x, struct rockchip_hdmi, x)
|
|
@@ -160,6 +163,7 @@ static const struct dw_hdmi_phy_config rockchip_phy_config[] = {
|
|
|
static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi)
|
|
|
{
|
|
|
struct device_node *np = hdmi->dev->of_node;
|
|
|
+ int ret;
|
|
|
|
|
|
hdmi->regmap = syscon_regmap_lookup_by_phandle(np, "rockchip,grf");
|
|
|
if (IS_ERR(hdmi->regmap)) {
|
|
@@ -167,6 +171,22 @@ static int rockchip_hdmi_parse_dt(struct rockchip_hdmi *hdmi)
|
|
|
return PTR_ERR(hdmi->regmap);
|
|
|
}
|
|
|
|
|
|
+ hdmi->vpll_clk = devm_clk_get(hdmi->dev, "vpll");
|
|
|
+ if (PTR_ERR(hdmi->vpll_clk) == -ENOENT) {
|
|
|
+ hdmi->vpll_clk = NULL;
|
|
|
+ } else if (PTR_ERR(hdmi->vpll_clk) == -EPROBE_DEFER) {
|
|
|
+ return -EPROBE_DEFER;
|
|
|
+ } else if (IS_ERR(hdmi->vpll_clk)) {
|
|
|
+ dev_err(hdmi->dev, "failed to get grf clock\n");
|
|
|
+ return PTR_ERR(hdmi->vpll_clk);
|
|
|
+ }
|
|
|
+
|
|
|
+ ret = clk_prepare_enable(hdmi->vpll_clk);
|
|
|
+ if (ret) {
|
|
|
+ dev_err(hdmi->dev, "Failed to enable HDMI vpll: %d\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
@@ -209,6 +229,9 @@ static void dw_hdmi_rockchip_encoder_mode_set(struct drm_encoder *encoder,
|
|
|
struct drm_display_mode *mode,
|
|
|
struct drm_display_mode *adj_mode)
|
|
|
{
|
|
|
+ struct rockchip_hdmi *hdmi = to_rockchip_hdmi(encoder);
|
|
|
+
|
|
|
+ clk_set_rate(hdmi->vpll_clk, adj_mode->clock * 1000);
|
|
|
}
|
|
|
|
|
|
static void dw_hdmi_rockchip_encoder_enable(struct drm_encoder *encoder)
|