1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /* Copyright (c) 2015-2018, The Linux Foundation. All rights reserved.
3  */
4 
5 #ifndef _DPU_HW_DSPP_H
6 #define _DPU_HW_DSPP_H
7 
8 struct dpu_hw_dspp;
9 
10 /**
11  * struct dpu_hw_pcc_coeff - PCC coefficient structure for each color
12  *                            component.
13  * @r: red coefficient.
14  * @g: green coefficient.
15  * @b: blue coefficient.
16  */
17 
18 struct dpu_hw_pcc_coeff {
19 	__u32 r;
20 	__u32 g;
21 	__u32 b;
22 };
23 
24 /**
25  * struct dpu_hw_pcc - pcc feature structure
26  * @r: red coefficients.
27  * @g: green coefficients.
28  * @b: blue coefficients.
29  */
30 struct dpu_hw_pcc_cfg {
31 	struct dpu_hw_pcc_coeff r;
32 	struct dpu_hw_pcc_coeff g;
33 	struct dpu_hw_pcc_coeff b;
34 };
35 
36 /**
37  * struct dpu_hw_dspp_ops - interface to the dspp hardware driver functions
38  * Caller must call the init function to get the dspp context for each dspp
39  * Assumption is these functions will be called after clocks are enabled
40  */
41 struct dpu_hw_dspp_ops {
42 	/**
43 	 * setup_pcc - setup dspp pcc
44 	 * @ctx: Pointer to dspp context
45 	 * @cfg: Pointer to configuration
46 	 */
47 	void (*setup_pcc)(struct dpu_hw_dspp *ctx, struct dpu_hw_pcc_cfg *cfg);
48 
49 };
50 
51 /**
52  * struct dpu_hw_dspp - dspp description
53  * @base: Hardware block base structure
54  * @hw: Block hardware details
55  * @idx: DSPP index
56  * @cap: Pointer to layer_cfg
57  * @ops: Pointer to operations possible for this DSPP
58  */
59 struct dpu_hw_dspp {
60 	struct dpu_hw_blk base;
61 	struct dpu_hw_blk_reg_map hw;
62 
63 	/* dspp */
64 	int idx;
65 	const struct dpu_dspp_cfg *cap;
66 
67 	/* Ops */
68 	struct dpu_hw_dspp_ops ops;
69 };
70 
71 /**
72  * dpu_hw_dspp - convert base object dpu_hw_base to container
73  * @hw: Pointer to base hardware block
74  * return: Pointer to hardware block container
75  */
to_dpu_hw_dspp(struct dpu_hw_blk * hw)76 static inline struct dpu_hw_dspp *to_dpu_hw_dspp(struct dpu_hw_blk *hw)
77 {
78 	return container_of(hw, struct dpu_hw_dspp, base);
79 }
80 
81 /**
82  * dpu_hw_dspp_init - initializes the dspp hw driver object.
83  * should be called once before accessing every dspp.
84  * @idx:  DSPP index for which driver object is required
85  * @addr: Mapped register io address of MDP
86  * @Return: pointer to structure or ERR_PTR
87  */
88 struct dpu_hw_dspp *dpu_hw_dspp_init(enum dpu_dspp idx,
89 	void __iomem *addr, const struct dpu_mdss_cfg *m);
90 
91 /**
92  * dpu_hw_dspp_destroy(): Destroys DSPP driver context
93  * @dspp: Pointer to DSPP driver context
94  */
95 void dpu_hw_dspp_destroy(struct dpu_hw_dspp *dspp);
96 
97 #endif /*_DPU_HW_DSPP_H */
98 
99