| .. | .. |
|---|
| 20 | 20 | #ifdef CONFIG_DRM_ANALOGIX_DP |
|---|
| 21 | 21 | #include <drm/bridge/analogix_dp.h> |
|---|
| 22 | 22 | #endif |
|---|
| 23 | | -#include <dt-bindings/soc/rockchip-system-status.h> |
|---|
| 24 | 23 | |
|---|
| 25 | 24 | #include <linux/debugfs.h> |
|---|
| 26 | 25 | #include <linux/fixp-arith.h> |
|---|
| .. | .. |
|---|
| 46 | 45 | #include <linux/rockchip/cpu.h> |
|---|
| 47 | 46 | #include <linux/workqueue.h> |
|---|
| 48 | 47 | #include <linux/types.h> |
|---|
| 48 | +#include <soc/rockchip/rockchip_csu.h> |
|---|
| 49 | 49 | #include <soc/rockchip/rockchip_dmc.h> |
|---|
| 50 | 50 | #include <soc/rockchip/rockchip-system-status.h> |
|---|
| 51 | 51 | #include <uapi/linux/videodev2.h> |
|---|
| .. | .. |
|---|
| 885 | 885 | struct clk *pclk; |
|---|
| 886 | 886 | struct reset_control *ahb_rst; |
|---|
| 887 | 887 | struct reset_control *axi_rst; |
|---|
| 888 | + struct csu_clk *csu_aclk; |
|---|
| 888 | 889 | |
|---|
| 889 | 890 | /* list_head of extend clk */ |
|---|
| 890 | 891 | struct list_head extend_clk_list_head; |
|---|
| .. | .. |
|---|
| 929 | 930 | { MEDIA_BUS_FMT_UYYVYY8_0_5X24, "UYYVYY8_0_5X24" }, |
|---|
| 930 | 931 | { MEDIA_BUS_FMT_YUV10_1X30, "YUV10_1X30" }, |
|---|
| 931 | 932 | { MEDIA_BUS_FMT_UYYVYY10_0_5X30, "UYYVYY10_0_5X30" }, |
|---|
| 933 | + { MEDIA_BUS_FMT_RGB565_2X8_LE, "RGB565_2X8_LE" }, |
|---|
| 932 | 934 | { MEDIA_BUS_FMT_RGB888_3X8, "RGB888_3X8" }, |
|---|
| 933 | 935 | { MEDIA_BUS_FMT_RGB888_DUMMY_4X8, "RGB888_DUMMY_4X8" }, |
|---|
| 934 | 936 | { MEDIA_BUS_FMT_RGB888_1X24, "RGB888_1X24" }, |
|---|
| .. | .. |
|---|
| 3243 | 3245 | return 0; |
|---|
| 3244 | 3246 | } |
|---|
| 3245 | 3247 | |
|---|
| 3248 | +static void vop2_wb_encoder_atomic_disable(struct drm_encoder *encoder, |
|---|
| 3249 | + struct drm_atomic_state *state) |
|---|
| 3250 | +{ |
|---|
| 3251 | + struct drm_crtc *crtc = encoder->crtc; |
|---|
| 3252 | + struct vop2_video_port *vp = to_vop2_video_port(crtc); |
|---|
| 3253 | + |
|---|
| 3254 | + if (!crtc->state->active_changed && !crtc->state->mode_changed) { |
|---|
| 3255 | + crtc->state->connectors_changed = false; |
|---|
| 3256 | + DRM_DEBUG("VP%d force change connectors_changed to false when disable wb\n", vp->id); |
|---|
| 3257 | + } |
|---|
| 3258 | +} |
|---|
| 3259 | + |
|---|
| 3246 | 3260 | static const struct drm_encoder_helper_funcs vop2_wb_encoder_helper_funcs = { |
|---|
| 3247 | 3261 | .atomic_check = vop2_wb_encoder_atomic_check, |
|---|
| 3262 | + .atomic_disable = vop2_wb_encoder_atomic_disable, |
|---|
| 3248 | 3263 | }; |
|---|
| 3249 | 3264 | |
|---|
| 3250 | 3265 | static const struct drm_connector_helper_funcs vop2_wb_connector_helper_funcs = { |
|---|
| .. | .. |
|---|
| 5142 | 5157 | actual_w = drm_rect_width(src) >> 16; |
|---|
| 5143 | 5158 | actual_h = drm_rect_height(src) >> 16; |
|---|
| 5144 | 5159 | |
|---|
| 5145 | | - if (!actual_w || !actual_h) { |
|---|
| 5160 | + if (!actual_w || !actual_h || !bpp) { |
|---|
| 5146 | 5161 | vop2_win_disable(win, true); |
|---|
| 5147 | 5162 | return; |
|---|
| 5148 | 5163 | } |
|---|
| .. | .. |
|---|
| 5263 | 5278 | /* AFBC pic_vir_width is count by pixel, this is different |
|---|
| 5264 | 5279 | * with WIN_VIR_STRIDE. |
|---|
| 5265 | 5280 | */ |
|---|
| 5266 | | - if (!bpp) { |
|---|
| 5267 | | - WARN(1, "bpp is zero\n"); |
|---|
| 5268 | | - bpp = 1; |
|---|
| 5269 | | - } |
|---|
| 5270 | 5281 | stride = (fb->pitches[0] << 3) / bpp; |
|---|
| 5271 | 5282 | if ((stride & 0x3f) && |
|---|
| 5272 | 5283 | (vpstate->xmirror_en || vpstate->rotate_90_en || vpstate->rotate_270_en)) |
|---|
| .. | .. |
|---|
| 6111 | 6122 | return 0; |
|---|
| 6112 | 6123 | } |
|---|
| 6113 | 6124 | |
|---|
| 6125 | +static void vop2_crtc_csu_set_rate(struct drm_crtc *crtc) |
|---|
| 6126 | +{ |
|---|
| 6127 | + struct vop2_video_port *vp = to_vop2_video_port(crtc); |
|---|
| 6128 | + struct vop2 *vop2 = vp->vop2; |
|---|
| 6129 | + unsigned long aclk_rate = 0, dclk_rate = 0; |
|---|
| 6130 | + u32 csu_div = 0; |
|---|
| 6131 | + |
|---|
| 6132 | + if (!vop2->csu_aclk) |
|---|
| 6133 | + return; |
|---|
| 6134 | + |
|---|
| 6135 | + aclk_rate = clk_get_rate(vop2->aclk); |
|---|
| 6136 | + dclk_rate = clk_get_rate(vp->dclk); |
|---|
| 6137 | + if (!dclk_rate) |
|---|
| 6138 | + return; |
|---|
| 6139 | + |
|---|
| 6140 | + /* aclk >= 1/2 * dclk */ |
|---|
| 6141 | + csu_div = aclk_rate * 2 / dclk_rate; |
|---|
| 6142 | + |
|---|
| 6143 | + rockchip_csu_set_div(vop2->csu_aclk, csu_div); |
|---|
| 6144 | +} |
|---|
| 6145 | + |
|---|
| 6114 | 6146 | static int vop2_crtc_loader_protect(struct drm_crtc *crtc, bool on, void *data) |
|---|
| 6115 | 6147 | { |
|---|
| 6116 | 6148 | struct vop2_video_port *vp = to_vop2_video_port(crtc); |
|---|
| .. | .. |
|---|
| 6190 | 6222 | cubic_lut_mst = cubic_lut->offset + private->cubic_lut_dma_addr; |
|---|
| 6191 | 6223 | VOP_MODULE_SET(vop2, vp, cubic_lut_mst, cubic_lut_mst); |
|---|
| 6192 | 6224 | } |
|---|
| 6225 | + |
|---|
| 6226 | + vop2_crtc_csu_set_rate(crtc); |
|---|
| 6193 | 6227 | } else { |
|---|
| 6194 | 6228 | vop2_crtc_atomic_disable(crtc, NULL); |
|---|
| 6195 | 6229 | } |
|---|
| .. | .. |
|---|
| 6330 | 6364 | |
|---|
| 6331 | 6365 | /* only need to dump once at first active crtc for vop2 */ |
|---|
| 6332 | 6366 | for (i = 0; i < vop2_data->nr_vps; i++) { |
|---|
| 6333 | | - if (vop2->vps[i].rockchip_crtc.crtc.state->active) { |
|---|
| 6367 | + if (vop2->vps[i].rockchip_crtc.crtc.state && |
|---|
| 6368 | + vop2->vps[i].rockchip_crtc.crtc.state->active) { |
|---|
| 6334 | 6369 | first_active_crtc = &vop2->vps[i].rockchip_crtc.crtc; |
|---|
| 6335 | 6370 | break; |
|---|
| 6336 | 6371 | } |
|---|
| .. | .. |
|---|
| 6373 | 6408 | |
|---|
| 6374 | 6409 | /* only need to dump once at first active crtc for vop2 */ |
|---|
| 6375 | 6410 | for (i = 0; i < vop2_data->nr_vps; i++) { |
|---|
| 6376 | | - if (vop2->vps[i].rockchip_crtc.crtc.state->active) { |
|---|
| 6411 | + if (vop2->vps[i].rockchip_crtc.crtc.state && |
|---|
| 6412 | + vop2->vps[i].rockchip_crtc.crtc.state->active) { |
|---|
| 6377 | 6413 | first_active_crtc = &vop2->vps[i].rockchip_crtc.crtc; |
|---|
| 6378 | 6414 | break; |
|---|
| 6379 | 6415 | } |
|---|
| .. | .. |
|---|
| 6543 | 6579 | } else { |
|---|
| 6544 | 6580 | if (request_clock > VOP2_MAX_DCLK_RATE) |
|---|
| 6545 | 6581 | request_clock = request_clock >> 2; |
|---|
| 6546 | | - clock = clk_round_rate(vp->dclk, request_clock * 1000) / 1000; |
|---|
| 6582 | + clock = rockchip_drm_dclk_round_rate(vop2->version, vp->dclk, |
|---|
| 6583 | + request_clock * 1000) / 1000; |
|---|
| 6547 | 6584 | } |
|---|
| 6548 | 6585 | |
|---|
| 6549 | 6586 | /* |
|---|
| .. | .. |
|---|
| 6586 | 6623 | size_t bandwidth; |
|---|
| 6587 | 6624 | |
|---|
| 6588 | 6625 | if (src_width <= 0 || src_height <= 0 || dst_width <= 0 || |
|---|
| 6589 | | - dst_height <= 0) |
|---|
| 6626 | + dst_height <= 0 || !bpp) |
|---|
| 6590 | 6627 | return 0; |
|---|
| 6591 | 6628 | |
|---|
| 6592 | 6629 | bandwidth = src_width * bpp / 8; |
|---|
| .. | .. |
|---|
| 6832 | 6869 | if (mode->flags & DRM_MODE_FLAG_DBLCLK || vcstate->output_if & VOP_OUTPUT_IF_BT656) |
|---|
| 6833 | 6870 | adj_mode->crtc_clock *= 2; |
|---|
| 6834 | 6871 | |
|---|
| 6872 | + /* |
|---|
| 6873 | + * For RK3528, the path of CVBS output is like: |
|---|
| 6874 | + * VOP BT656 ENCODER -> CVBS BT656 DECODER -> CVBS ENCODER -> CVBS VDAC |
|---|
| 6875 | + * The vop2 dclk should be four times crtc_clock for CVBS sampling clock needs. |
|---|
| 6876 | + */ |
|---|
| 6877 | + if (vop2->version == VOP_VERSION_RK3528 && vcstate->output_if & VOP_OUTPUT_IF_BT656) |
|---|
| 6878 | + adj_mode->crtc_clock *= 4; |
|---|
| 6879 | + |
|---|
| 6835 | 6880 | if (vp->mcu_timing.mcu_pix_total) |
|---|
| 6836 | 6881 | adj_mode->crtc_clock *= rockchip_drm_get_cycles_per_pixel(vcstate->bus_format) * |
|---|
| 6837 | 6882 | (vp->mcu_timing.mcu_pix_total + 1); |
|---|
| .. | .. |
|---|
| 6847 | 6892 | } |
|---|
| 6848 | 6893 | drm_connector_list_iter_end(&conn_iter); |
|---|
| 6849 | 6894 | |
|---|
| 6850 | | - if (adj_mode->crtc_clock <= VOP2_MAX_DCLK_RATE) |
|---|
| 6851 | | - adj_mode->crtc_clock = DIV_ROUND_UP(clk_round_rate(vp->dclk, |
|---|
| 6852 | | - adj_mode->crtc_clock * 1000), 1000); |
|---|
| 6895 | + if (adj_mode->crtc_clock <= VOP2_MAX_DCLK_RATE) { |
|---|
| 6896 | + adj_mode->crtc_clock = rockchip_drm_dclk_round_rate(vop2->version, vp->dclk, |
|---|
| 6897 | + adj_mode->crtc_clock * 1000); |
|---|
| 6898 | + adj_mode->crtc_clock = DIV_ROUND_UP(adj_mode->crtc_clock, 1000); |
|---|
| 6899 | + } |
|---|
| 6853 | 6900 | return true; |
|---|
| 6854 | 6901 | } |
|---|
| 6855 | 6902 | |
|---|
| .. | .. |
|---|
| 7745 | 7792 | vop2_set_system_status(vop2); |
|---|
| 7746 | 7793 | |
|---|
| 7747 | 7794 | vop2_lock(vop2); |
|---|
| 7748 | | - DRM_DEV_INFO(vop2->dev, "Update mode to %dx%d%s%d, type: %d(if:%x, flag:0x%x) for vp%d dclk: %d\n", |
|---|
| 7795 | + DRM_DEV_INFO(vop2->dev, "Update mode to %dx%d%s%d, type: %d(if:%x, flag:0x%x) for vp%d dclk: %llu\n", |
|---|
| 7749 | 7796 | hdisplay, adjusted_mode->vdisplay, interlaced ? "i" : "p", |
|---|
| 7750 | 7797 | drm_mode_vrefresh(adjusted_mode), |
|---|
| 7751 | 7798 | vcstate->output_type, vcstate->output_if, vcstate->output_flags, |
|---|
| 7752 | | - vp->id, adjusted_mode->crtc_clock * 1000); |
|---|
| 7799 | + vp->id, (unsigned long long)adjusted_mode->crtc_clock * 1000); |
|---|
| 7753 | 7800 | |
|---|
| 7754 | 7801 | if (adjusted_mode->hdisplay > VOP2_MAX_VP_OUTPUT_WIDTH) { |
|---|
| 7755 | 7802 | vcstate->splice_mode = true; |
|---|
| .. | .. |
|---|
| 8081 | 8128 | if (ret < 0) |
|---|
| 8082 | 8129 | goto out; |
|---|
| 8083 | 8130 | |
|---|
| 8084 | | - clk_set_rate(vp->dclk, dclk->rate); |
|---|
| 8131 | + rockchip_drm_dclk_set_rate(vop2->version, vp->dclk, dclk->rate); |
|---|
| 8085 | 8132 | DRM_DEV_INFO(vop2->dev, "set %s to %ld, get %ld\n", |
|---|
| 8086 | 8133 | __clk_get_name(vp->dclk), dclk->rate, clk_get_rate(vp->dclk)); |
|---|
| 8087 | 8134 | } else { |
|---|
| 8088 | | - /* |
|---|
| 8089 | | - * For RK3528, the path of CVBS output is like: |
|---|
| 8090 | | - * VOP BT656 ENCODER -> CVBS BT656 DECODER -> CVBS ENCODER -> CVBS VDAC |
|---|
| 8091 | | - * The vop2 dclk should be four times crtc_clock for CVBS sampling clock needs. |
|---|
| 8092 | | - */ |
|---|
| 8093 | | - if (vop2->version == VOP_VERSION_RK3528 && vcstate->output_if & VOP_OUTPUT_IF_BT656) |
|---|
| 8094 | | - clk_set_rate(vp->dclk, 4 * adjusted_mode->crtc_clock * 1000); |
|---|
| 8095 | | - else |
|---|
| 8096 | | - clk_set_rate(vp->dclk, adjusted_mode->crtc_clock * 1000); |
|---|
| 8135 | + rockchip_drm_dclk_set_rate(vop2->version, vp->dclk, |
|---|
| 8136 | + adjusted_mode->crtc_clock * 1000); |
|---|
| 8097 | 8137 | } |
|---|
| 8098 | 8138 | |
|---|
| 8099 | 8139 | if (vp_data->feature & VOP_FEATURE_OVERSCAN) |
|---|
| .. | .. |
|---|
| 8122 | 8162 | if (is_vop3(vop2)) |
|---|
| 8123 | 8163 | vop3_setup_pipe_dly(vp, NULL); |
|---|
| 8124 | 8164 | |
|---|
| 8165 | + vop2_crtc_csu_set_rate(crtc); |
|---|
| 8125 | 8166 | vop2_cfg_done(crtc); |
|---|
| 8126 | 8167 | |
|---|
| 8127 | 8168 | /* |
|---|
| .. | .. |
|---|
| 8158 | 8199 | vop2_crtc_load_lut(crtc); |
|---|
| 8159 | 8200 | vop2_cfg_done(crtc); |
|---|
| 8160 | 8201 | vop2_wait_for_fs_by_done_bit_status(vp); |
|---|
| 8202 | + } |
|---|
| 8203 | + |
|---|
| 8204 | + /* |
|---|
| 8205 | + * In RK3588 VOP, HDMI1/eDP1 MUX1 module's reset signal should be released |
|---|
| 8206 | + * when PD_VOP turn on. If this reset signal is not be released, the HDMI1 |
|---|
| 8207 | + * or eDP1 output interface can't work normally. |
|---|
| 8208 | + * However, If the deassert signal want to transfer to HDMI1/eDP1 MUX1 and |
|---|
| 8209 | + * take effect, it need the video port0 dclk's source clk work a few moment. |
|---|
| 8210 | + * In some cases, the video port0 dclk's source clk is disabled(now only the |
|---|
| 8211 | + * hdmi0/1 phy pll as the dclk source parent will appear) after PD_VOP turn |
|---|
| 8212 | + * on, for example, vidoe port0 dclk source select hdmi phy pll. To fix |
|---|
| 8213 | + * this issue, enable video port0 dclk for a few monent when active a video |
|---|
| 8214 | + * port which attach to eDP1/HDMI1. |
|---|
| 8215 | + */ |
|---|
| 8216 | + if (vop2->version == VOP_VERSION_RK3588) { |
|---|
| 8217 | + if (vp->id != 0 && (vp->output_if & (VOP_OUTPUT_IF_eDP1 | VOP_OUTPUT_IF_HDMI1))) { |
|---|
| 8218 | + struct vop2_video_port *vp0 = &vop2->vps[0]; |
|---|
| 8219 | + |
|---|
| 8220 | + clk_prepare_enable(vp0->dclk); |
|---|
| 8221 | + if (!clk_get_rate(vp0->dclk)) |
|---|
| 8222 | + clk_set_rate(vp0->dclk, 148500000); |
|---|
| 8223 | + udelay(20); |
|---|
| 8224 | + clk_disable_unprepare(vp0->dclk); |
|---|
| 8225 | + } |
|---|
| 8161 | 8226 | } |
|---|
| 8162 | 8227 | out: |
|---|
| 8163 | 8228 | vop2_unlock(vop2); |
|---|
| .. | .. |
|---|
| 10941 | 11006 | return 0; |
|---|
| 10942 | 11007 | } |
|---|
| 10943 | 11008 | |
|---|
| 10944 | | -static struct drm_plane *vop2_cursor_plane_init(struct vop2_video_port *vp) |
|---|
| 11009 | +static struct drm_plane *vop2_cursor_plane_init(struct vop2_video_port *vp, u32 possible_crtcs) |
|---|
| 10945 | 11010 | { |
|---|
| 10946 | 11011 | struct vop2 *vop2 = vp->vop2; |
|---|
| 10947 | 11012 | struct drm_plane *cursor = NULL; |
|---|
| 10948 | 11013 | struct vop2_win *win; |
|---|
| 10949 | | - unsigned long possible_crtcs = 0; |
|---|
| 10950 | 11014 | |
|---|
| 10951 | 11015 | win = vop2_find_win_by_phys_id(vop2, vp->cursor_win_id); |
|---|
| 10952 | 11016 | if (win) { |
|---|
| 10953 | | - if (vop2->disable_win_move) { |
|---|
| 10954 | | - const struct vop2_data *vop2_data = vop2->data; |
|---|
| 10955 | | - struct drm_crtc *crtc = vop2_find_crtc_by_plane_mask(vop2, win->phys_id); |
|---|
| 10956 | | - |
|---|
| 10957 | | - if (crtc) |
|---|
| 10958 | | - possible_crtcs = drm_crtc_mask(crtc); |
|---|
| 10959 | | - else |
|---|
| 10960 | | - possible_crtcs = (1 << vop2_data->nr_vps) - 1; |
|---|
| 10961 | | - } |
|---|
| 10962 | | - |
|---|
| 10963 | 11017 | if (win->possible_crtcs) |
|---|
| 10964 | 11018 | possible_crtcs = win->possible_crtcs; |
|---|
| 10965 | 11019 | win->type = DRM_PLANE_TYPE_CURSOR; |
|---|
| .. | .. |
|---|
| 11263 | 11317 | possible_crtcs = BIT(registered_num_crtcs); |
|---|
| 11264 | 11318 | |
|---|
| 11265 | 11319 | /* |
|---|
| 11266 | | - * we assume a vp with a zere plane_mask(set from dts or bootloader) |
|---|
| 11320 | + * we assume a vp with a zero plane_mask(set from dts or bootloader) |
|---|
| 11267 | 11321 | * as unused. |
|---|
| 11268 | 11322 | */ |
|---|
| 11269 | | - if (!vp->plane_mask && bootloader_initialized) |
|---|
| 11323 | + if (!vp->plane_mask && bootloader_initialized) { |
|---|
| 11324 | + DRM_DEV_INFO(vop2->dev, "VP%d plane_mask is zero, so ignore register crtc\n", vp->id); |
|---|
| 11270 | 11325 | continue; |
|---|
| 11326 | + } |
|---|
| 11271 | 11327 | |
|---|
| 11272 | 11328 | if (vop2_soc_is_rk3566()) |
|---|
| 11273 | 11329 | soc_id = vp_data->soc_id[1]; |
|---|
| .. | .. |
|---|
| 11389 | 11445 | } |
|---|
| 11390 | 11446 | |
|---|
| 11391 | 11447 | if (vp->cursor_win_id >= 0) { |
|---|
| 11392 | | - cursor = vop2_cursor_plane_init(vp); |
|---|
| 11448 | + cursor = vop2_cursor_plane_init(vp, possible_crtcs); |
|---|
| 11393 | 11449 | if (!cursor) |
|---|
| 11394 | 11450 | DRM_WARN("failed to init cursor plane for vp%d\n", vp->id); |
|---|
| 11395 | 11451 | else |
|---|
| .. | .. |
|---|
| 11587 | 11643 | struct vop2_win *win; |
|---|
| 11588 | 11644 | struct vop2_layer *layer; |
|---|
| 11589 | 11645 | char name[DRM_PROP_NAME_LEN]; |
|---|
| 11646 | + char area_name[DRM_PROP_NAME_LEN]; |
|---|
| 11590 | 11647 | unsigned int num_wins = 0; |
|---|
| 11591 | 11648 | uint8_t plane_id = 0; |
|---|
| 11592 | 11649 | unsigned int i, j; |
|---|
| .. | .. |
|---|
| 11662 | 11719 | area->phys_id = win->phys_id; |
|---|
| 11663 | 11720 | area->area_id = j + 1; |
|---|
| 11664 | 11721 | area->plane_id = plane_id++; |
|---|
| 11665 | | - snprintf(name, min(sizeof(name), strlen(win->name)), "%s", win->name); |
|---|
| 11666 | | - snprintf(name, sizeof(name), "%s%d", name, area->area_id); |
|---|
| 11722 | + snprintf(area_name, min(sizeof(area_name), strlen(win->name)), "%s", win->name); |
|---|
| 11723 | + snprintf(name, sizeof(name), "%s%d", area_name, area->area_id); |
|---|
| 11667 | 11724 | area->name = devm_kstrdup(vop2->dev, name, GFP_KERNEL); |
|---|
| 11668 | 11725 | num_wins++; |
|---|
| 11669 | 11726 | } |
|---|
| .. | .. |
|---|
| 11957 | 12014 | return PTR_ERR(vop2->axi_rst); |
|---|
| 11958 | 12015 | } |
|---|
| 11959 | 12016 | |
|---|
| 12017 | + vop2->csu_aclk = rockchip_csu_get(dev, "aclk"); |
|---|
| 12018 | + if (IS_ERR(vop2->csu_aclk)) |
|---|
| 12019 | + vop2->csu_aclk = NULL; |
|---|
| 12020 | + |
|---|
| 11960 | 12021 | vop2->irq = platform_get_irq(pdev, 0); |
|---|
| 11961 | 12022 | if (vop2->irq < 0) { |
|---|
| 11962 | 12023 | DRM_DEV_ERROR(dev, "cannot find irq for vop2\n"); |
|---|