| /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved. |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License version 2 and |
| * only version 2 as published by the Free Software Foundation. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| */ |
| |
| #ifndef _DPU_HW_CDM_H |
| #define _DPU_HW_CDM_H |
| |
| #include "dpu_hw_mdss.h" |
| #include "dpu_hw_top.h" |
| #include "dpu_hw_blk.h" |
| |
| struct dpu_hw_cdm; |
| |
| struct dpu_hw_cdm_cfg { |
| u32 output_width; |
| u32 output_height; |
| u32 output_bit_depth; |
| u32 h_cdwn_type; |
| u32 v_cdwn_type; |
| const struct dpu_format *output_fmt; |
| u32 output_type; |
| int flags; |
| }; |
| |
| enum dpu_hw_cdwn_type { |
| CDM_CDWN_DISABLE, |
| CDM_CDWN_PIXEL_DROP, |
| CDM_CDWN_AVG, |
| CDM_CDWN_COSITE, |
| CDM_CDWN_OFFSITE, |
| }; |
| |
| enum dpu_hw_cdwn_output_type { |
| CDM_CDWN_OUTPUT_HDMI, |
| CDM_CDWN_OUTPUT_WB, |
| }; |
| |
| enum dpu_hw_cdwn_output_bit_depth { |
| CDM_CDWN_OUTPUT_8BIT, |
| CDM_CDWN_OUTPUT_10BIT, |
| }; |
| |
| /** |
| * struct dpu_hw_cdm_ops : Interface to the chroma down Hw driver functions |
| * Assumption is these functions will be called after |
| * clocks are enabled |
| * @setup_csc: Programs the csc matrix |
| * @setup_cdwn: Sets up the chroma down sub module |
| * @enable: Enables the output to interface and programs the |
| * output packer |
| * @disable: Puts the cdm in bypass mode |
| */ |
| struct dpu_hw_cdm_ops { |
| /** |
| * Programs the CSC matrix for conversion from RGB space to YUV space, |
| * it is optional to call this function as this matrix is automatically |
| * set during initialization, user should call this if it wants |
| * to program a different matrix than default matrix. |
| * @cdm: Pointer to the chroma down context structure |
| * @data Pointer to CSC configuration data |
| * return: 0 if success; error code otherwise |
| */ |
| int (*setup_csc_data)(struct dpu_hw_cdm *cdm, |
| struct dpu_csc_cfg *data); |
| |
| /** |
| * Programs the Chroma downsample part. |
| * @cdm Pointer to chroma down context |
| */ |
| int (*setup_cdwn)(struct dpu_hw_cdm *cdm, |
| struct dpu_hw_cdm_cfg *cfg); |
| |
| /** |
| * Enable the CDM module |
| * @cdm Pointer to chroma down context |
| */ |
| int (*enable)(struct dpu_hw_cdm *cdm, |
| struct dpu_hw_cdm_cfg *cfg); |
| |
| /** |
| * Disable the CDM module |
| * @cdm Pointer to chroma down context |
| */ |
| void (*disable)(struct dpu_hw_cdm *cdm); |
| }; |
| |
| struct dpu_hw_cdm { |
| struct dpu_hw_blk base; |
| struct dpu_hw_blk_reg_map hw; |
| |
| /* chroma down */ |
| const struct dpu_cdm_cfg *caps; |
| enum dpu_cdm idx; |
| |
| /* mdp top hw driver */ |
| struct dpu_hw_mdp *hw_mdp; |
| |
| /* ops */ |
| struct dpu_hw_cdm_ops ops; |
| }; |
| |
| /** |
| * dpu_hw_cdm - convert base object dpu_hw_base to container |
| * @hw: Pointer to base hardware block |
| * return: Pointer to hardware block container |
| */ |
| static inline struct dpu_hw_cdm *to_dpu_hw_cdm(struct dpu_hw_blk *hw) |
| { |
| return container_of(hw, struct dpu_hw_cdm, base); |
| } |
| |
| /** |
| * dpu_hw_cdm_init - initializes the cdm hw driver object. |
| * should be called once before accessing every cdm. |
| * @idx: cdm index for which driver object is required |
| * @addr: mapped register io address of MDP |
| * @m : pointer to mdss catalog data |
| * @hw_mdp: pointer to mdp top hw driver object |
| */ |
| struct dpu_hw_cdm *dpu_hw_cdm_init(enum dpu_cdm idx, |
| void __iomem *addr, |
| struct dpu_mdss_cfg *m, |
| struct dpu_hw_mdp *hw_mdp); |
| |
| /** |
| * dpu_hw_cdm_destroy - destroys CDM driver context |
| * @cdm: pointer to CDM driver context |
| */ |
| void dpu_hw_cdm_destroy(struct dpu_hw_cdm *cdm); |
| |
| #endif /*_DPU_HW_CDM_H */ |