linux/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2015 MediaTek Inc.
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 *
   8 * This program is distributed in the hope that it will be useful,
   9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 * GNU General Public License for more details.
  12 */
  13
  14#ifndef MTK_DRM_DDP_COMP_H
  15#define MTK_DRM_DDP_COMP_H
  16
  17#include <linux/io.h>
  18
  19struct device;
  20struct device_node;
  21struct drm_crtc;
  22struct drm_device;
  23struct mtk_plane_state;
  24struct drm_crtc_state;
  25
  26enum mtk_ddp_comp_type {
  27        MTK_DISP_OVL,
  28        MTK_DISP_RDMA,
  29        MTK_DISP_WDMA,
  30        MTK_DISP_COLOR,
  31        MTK_DISP_AAL,
  32        MTK_DISP_GAMMA,
  33        MTK_DISP_UFOE,
  34        MTK_DSI,
  35        MTK_DPI,
  36        MTK_DISP_PWM,
  37        MTK_DISP_MUTEX,
  38        MTK_DISP_OD,
  39        MTK_DISP_BLS,
  40        MTK_DDP_COMP_TYPE_MAX,
  41};
  42
  43enum mtk_ddp_comp_id {
  44        DDP_COMPONENT_AAL,
  45        DDP_COMPONENT_BLS,
  46        DDP_COMPONENT_COLOR0,
  47        DDP_COMPONENT_COLOR1,
  48        DDP_COMPONENT_DPI0,
  49        DDP_COMPONENT_DSI0,
  50        DDP_COMPONENT_DSI1,
  51        DDP_COMPONENT_GAMMA,
  52        DDP_COMPONENT_OD,
  53        DDP_COMPONENT_OVL0,
  54        DDP_COMPONENT_OVL1,
  55        DDP_COMPONENT_PWM0,
  56        DDP_COMPONENT_PWM1,
  57        DDP_COMPONENT_RDMA0,
  58        DDP_COMPONENT_RDMA1,
  59        DDP_COMPONENT_RDMA2,
  60        DDP_COMPONENT_UFOE,
  61        DDP_COMPONENT_WDMA0,
  62        DDP_COMPONENT_WDMA1,
  63        DDP_COMPONENT_ID_MAX,
  64};
  65
  66struct mtk_ddp_comp;
  67
  68struct mtk_ddp_comp_funcs {
  69        void (*config)(struct mtk_ddp_comp *comp, unsigned int w,
  70                       unsigned int h, unsigned int vrefresh, unsigned int bpc);
  71        void (*start)(struct mtk_ddp_comp *comp);
  72        void (*stop)(struct mtk_ddp_comp *comp);
  73        void (*enable_vblank)(struct mtk_ddp_comp *comp, struct drm_crtc *crtc);
  74        void (*disable_vblank)(struct mtk_ddp_comp *comp);
  75        void (*layer_on)(struct mtk_ddp_comp *comp, unsigned int idx);
  76        void (*layer_off)(struct mtk_ddp_comp *comp, unsigned int idx);
  77        void (*layer_config)(struct mtk_ddp_comp *comp, unsigned int idx,
  78                             struct mtk_plane_state *state);
  79        void (*gamma_set)(struct mtk_ddp_comp *comp,
  80                          struct drm_crtc_state *state);
  81};
  82
  83struct mtk_ddp_comp {
  84        struct clk *clk;
  85        void __iomem *regs;
  86        int irq;
  87        struct device *larb_dev;
  88        enum mtk_ddp_comp_id id;
  89        const struct mtk_ddp_comp_funcs *funcs;
  90};
  91
  92static inline void mtk_ddp_comp_config(struct mtk_ddp_comp *comp,
  93                                       unsigned int w, unsigned int h,
  94                                       unsigned int vrefresh, unsigned int bpc)
  95{
  96        if (comp->funcs && comp->funcs->config)
  97                comp->funcs->config(comp, w, h, vrefresh, bpc);
  98}
  99
 100static inline void mtk_ddp_comp_start(struct mtk_ddp_comp *comp)
 101{
 102        if (comp->funcs && comp->funcs->start)
 103                comp->funcs->start(comp);
 104}
 105
 106static inline void mtk_ddp_comp_stop(struct mtk_ddp_comp *comp)
 107{
 108        if (comp->funcs && comp->funcs->stop)
 109                comp->funcs->stop(comp);
 110}
 111
 112static inline void mtk_ddp_comp_enable_vblank(struct mtk_ddp_comp *comp,
 113                                              struct drm_crtc *crtc)
 114{
 115        if (comp->funcs && comp->funcs->enable_vblank)
 116                comp->funcs->enable_vblank(comp, crtc);
 117}
 118
 119static inline void mtk_ddp_comp_disable_vblank(struct mtk_ddp_comp *comp)
 120{
 121        if (comp->funcs && comp->funcs->disable_vblank)
 122                comp->funcs->disable_vblank(comp);
 123}
 124
 125static inline void mtk_ddp_comp_layer_on(struct mtk_ddp_comp *comp,
 126                                         unsigned int idx)
 127{
 128        if (comp->funcs && comp->funcs->layer_on)
 129                comp->funcs->layer_on(comp, idx);
 130}
 131
 132static inline void mtk_ddp_comp_layer_off(struct mtk_ddp_comp *comp,
 133                                          unsigned int idx)
 134{
 135        if (comp->funcs && comp->funcs->layer_off)
 136                comp->funcs->layer_off(comp, idx);
 137}
 138
 139static inline void mtk_ddp_comp_layer_config(struct mtk_ddp_comp *comp,
 140                                             unsigned int idx,
 141                                             struct mtk_plane_state *state)
 142{
 143        if (comp->funcs && comp->funcs->layer_config)
 144                comp->funcs->layer_config(comp, idx, state);
 145}
 146
 147static inline void mtk_ddp_gamma_set(struct mtk_ddp_comp *comp,
 148                                     struct drm_crtc_state *state)
 149{
 150        if (comp->funcs && comp->funcs->gamma_set)
 151                comp->funcs->gamma_set(comp, state);
 152}
 153
 154int mtk_ddp_comp_get_id(struct device_node *node,
 155                        enum mtk_ddp_comp_type comp_type);
 156int mtk_ddp_comp_init(struct device *dev, struct device_node *comp_node,
 157                      struct mtk_ddp_comp *comp, enum mtk_ddp_comp_id comp_id,
 158                      const struct mtk_ddp_comp_funcs *funcs);
 159int mtk_ddp_comp_register(struct drm_device *drm, struct mtk_ddp_comp *comp);
 160void mtk_ddp_comp_unregister(struct drm_device *drm, struct mtk_ddp_comp *comp);
 161void mtk_dither_set(struct mtk_ddp_comp *comp, unsigned int bpc,
 162                    unsigned int CFG);
 163
 164#endif /* MTK_DRM_DDP_COMP_H */
 165