riscv:driver:drm:
authorkeith.zhao <keith.zhao@starfivetech.com>
Thu, 9 Feb 2023 10:02:30 +0000 (02:02 -0800)
committerkeith.zhao <keith.zhao@starfivetech.com>
Thu, 9 Feb 2023 10:02:30 +0000 (02:02 -0800)
after mipi panel shows logo in uboot stage , star kernel will report dc_isr error message
so register the isr handle after dc_enable to avoid this
this is a workround , need do more fix on it next !!

Signed-off-by:keith.zhao<keith.zhao@statfivetech.com>

drivers/gpu/drm/verisilicon/vs_dc.c
drivers/gpu/drm/verisilicon/vs_dc.h

index 95c9b27d62d29f61231bc248df4c8163c8ed8d67..f6ab561cb38a1f59f342828c1fbddd50c98a7814 100644 (file)
@@ -641,6 +641,20 @@ static void dc_deinit(struct device *dev)
                dev_err(dev, "assert vout resets error.\n");
 }
 
+static irqreturn_t dc_isr(int irq, void *data)
+{
+       struct vs_dc *dc = data;
+       struct vs_dc_info *dc_info = dc->hw.info;
+       u32 i, ret;
+
+       ret = dc_hw_get_interrupt(&dc->hw);
+
+       for (i = 0; i < dc_info->panel_num; i++)
+               vs_crtc_handle_vblank(&dc->crtc[i]->base, dc_hw_check_underflow(&dc->hw));
+
+       return IRQ_HANDLED;
+}
+
 
 ///////////////////////////////////////////////////////////
 static int dc_init(struct device *dev)
@@ -746,6 +760,7 @@ static void vs_dc_enable(struct device *dev, struct drm_crtc *crtc)
        struct dc_hw_display display;
        int ret;
 
+
        if (dc->init_finished == false) {
                ret = dc_vout_clk_enable(dev, dc);
                if (ret)
@@ -841,6 +856,12 @@ static void vs_dc_enable(struct device *dev, struct drm_crtc *crtc)
        //regmap_update_bits(dc->dss_regmap, 0x8, BIT(3), 1 << 3);
 
        dc_hw_setup_display(&dc->hw, &display);
+       ret = devm_request_irq(dev, dc->irq, dc_isr, 0, dev_name(dev), dc);
+       if (ret < 0) {
+               dev_err(dev, "Failed to install irq:%u.\n", dc->irq);
+               return;
+       }
+
 }
 
 static void vs_dc_disable(struct device *dev, struct drm_crtc *crtc)
@@ -1379,19 +1400,7 @@ static int vs_dc_check_plane(struct device *dev, struct drm_plane *plane,
                                                  true, true);
 }
 
-static irqreturn_t dc_isr(int irq, void *data)
-{
-       struct vs_dc *dc = data;
-       struct vs_dc_info *dc_info = dc->hw.info;
-       u32 i, ret;
 
-       ret = dc_hw_get_interrupt(&dc->hw);
-
-       for (i = 0; i < dc_info->panel_num; i++)
-               vs_crtc_handle_vblank(&dc->crtc[i]->base, dc_hw_check_underflow(&dc->hw));
-
-       return IRQ_HANDLED;
-}
 
 static void vs_dc_commit(struct device *dev)
 {
@@ -1569,6 +1578,7 @@ static int dc_bind(struct device *dev, struct device *master, void *data)
 
 /*vout clk disable*/
        vs_dc_clock_disable(dc);
+       printk("====> %s, %d--devm_request_irq.\n", __func__, __LINE__);
 
        return 0;
 
@@ -1635,13 +1645,7 @@ static int dc_probe(struct platform_device *pdev)
        if (IS_ERR(dc->hw.mmu_base))
                return PTR_ERR(dc->hw.mmu_base);
 #endif
-
-       irq = platform_get_irq(pdev, 0);
-       ret = devm_request_irq(dev, irq, dc_isr, 0, dev_name(dev), dc);
-       if (ret < 0) {
-               dev_err(dev, "Failed to install irq:%u.\n", irq);
-               return ret;
-       }
+       dc->irq = platform_get_irq(pdev, 0);
 
        dev_set_drvdata(dev, dc);
 
index b2e807ac56f52059640a0f280b6fbf9e23e8a781..b7416052bb0a0ad5790ac6241894c8b1d04a7848 100644 (file)
@@ -95,7 +95,7 @@ struct vs_dc {
        struct regmap *dss_regmap;
 
        bool init_finished;
-
+    int irq;
 };
 
 extern struct platform_driver dc_platform_driver;