3
3
* Copyright (c) 2021 MediaTek Inc.
4
4
*/
5
5
6
+ #include <linux/bitfield.h>
6
7
#include <linux/clk.h>
7
8
#include <linux/component.h>
8
9
#include <linux/module.h>
17
18
18
19
#define DISP_AAL_EN 0x0000
19
20
#define AAL_EN BIT(0)
21
+ #define DISP_AAL_CFG 0x0020
22
+ #define AAL_RELAY_MODE BIT(0)
23
+ #define AAL_GAMMA_LUT_EN BIT(1)
20
24
#define DISP_AAL_SIZE 0x0030
25
+ #define DISP_AAL_SIZE_HSIZE GENMASK(28, 16)
26
+ #define DISP_AAL_SIZE_VSIZE GENMASK(12, 0)
21
27
#define DISP_AAL_OUTPUT_SIZE 0x04d8
22
-
28
+ #define DISP_AAL_GAMMA_LUT 0x0700
29
+ #define DISP_AAL_GAMMA_LUT_R GENMASK(29, 20)
30
+ #define DISP_AAL_GAMMA_LUT_G GENMASK(19, 10)
31
+ #define DISP_AAL_GAMMA_LUT_B GENMASK(9, 0)
32
+ #define DISP_AAL_LUT_BITS 10
33
+ #define DISP_AAL_LUT_SIZE 512
23
34
24
35
struct mtk_disp_aal_data {
25
36
bool has_gamma ;
26
37
};
27
38
39
+ /**
40
+ * struct mtk_disp_aal - Display Adaptive Ambient Light driver structure
41
+ * @clk: clock for DISP_AAL controller
42
+ * @regs: MMIO registers base
43
+ * @cmdq_reg: CMDQ Client register
44
+ * @data: platform specific data for DISP_AAL
45
+ */
28
46
struct mtk_disp_aal {
29
47
struct clk * clk ;
30
48
void __iomem * regs ;
@@ -51,17 +69,69 @@ void mtk_aal_config(struct device *dev, unsigned int w,
51
69
unsigned int bpc , struct cmdq_pkt * cmdq_pkt )
52
70
{
53
71
struct mtk_disp_aal * aal = dev_get_drvdata (dev );
72
+ u32 sz ;
73
+
74
+ sz = FIELD_PREP (DISP_AAL_SIZE_HSIZE , w );
75
+ sz |= FIELD_PREP (DISP_AAL_SIZE_VSIZE , h );
54
76
55
- mtk_ddp_write (cmdq_pkt , w << 16 | h , & aal -> cmdq_reg , aal -> regs , DISP_AAL_SIZE );
56
- mtk_ddp_write (cmdq_pkt , w << 16 | h , & aal -> cmdq_reg , aal -> regs , DISP_AAL_OUTPUT_SIZE );
77
+ mtk_ddp_write (cmdq_pkt , sz , & aal -> cmdq_reg , aal -> regs , DISP_AAL_SIZE );
78
+ mtk_ddp_write (cmdq_pkt , sz , & aal -> cmdq_reg , aal -> regs , DISP_AAL_OUTPUT_SIZE );
57
79
}
58
80
59
- void mtk_aal_gamma_set (struct device * dev , struct drm_crtc_state * state )
81
+ /**
82
+ * mtk_aal_gamma_get_lut_size() - Get gamma LUT size for AAL
83
+ * @dev: Pointer to struct device
84
+ *
85
+ * Return: 0 if gamma control not supported in AAL or gamma LUT size
86
+ */
87
+ unsigned int mtk_aal_gamma_get_lut_size (struct device * dev )
60
88
{
61
89
struct mtk_disp_aal * aal = dev_get_drvdata (dev );
62
90
63
91
if (aal -> data && aal -> data -> has_gamma )
64
- mtk_gamma_set_common (aal -> regs , state , false);
92
+ return DISP_AAL_LUT_SIZE ;
93
+ return 0 ;
94
+ }
95
+
96
+ void mtk_aal_gamma_set (struct device * dev , struct drm_crtc_state * state )
97
+ {
98
+ struct mtk_disp_aal * aal = dev_get_drvdata (dev );
99
+ struct drm_color_lut * lut ;
100
+ unsigned int i ;
101
+ u32 cfg_val ;
102
+
103
+ /* If gamma is not supported in AAL, go out immediately */
104
+ if (!(aal -> data && aal -> data -> has_gamma ))
105
+ return ;
106
+
107
+ /* Also, if there's no gamma lut there's nothing to do here. */
108
+ if (!state -> gamma_lut )
109
+ return ;
110
+
111
+ lut = (struct drm_color_lut * )state -> gamma_lut -> data ;
112
+ for (i = 0 ; i < DISP_AAL_LUT_SIZE ; i ++ ) {
113
+ struct drm_color_lut hwlut = {
114
+ .red = drm_color_lut_extract (lut [i ].red , DISP_AAL_LUT_BITS ),
115
+ .green = drm_color_lut_extract (lut [i ].green , DISP_AAL_LUT_BITS ),
116
+ .blue = drm_color_lut_extract (lut [i ].blue , DISP_AAL_LUT_BITS )
117
+ };
118
+ u32 word ;
119
+
120
+ word = FIELD_PREP (DISP_AAL_GAMMA_LUT_R , hwlut .red );
121
+ word |= FIELD_PREP (DISP_AAL_GAMMA_LUT_G , hwlut .green );
122
+ word |= FIELD_PREP (DISP_AAL_GAMMA_LUT_B , hwlut .blue );
123
+ writel (word , aal -> regs + DISP_AAL_GAMMA_LUT + i * 4 );
124
+ }
125
+
126
+ cfg_val = readl (aal -> regs + DISP_AAL_CFG );
127
+
128
+ /* Enable the gamma table */
129
+ cfg_val |= FIELD_PREP (AAL_GAMMA_LUT_EN , 1 );
130
+
131
+ /* Disable RELAY mode to pass the processed image */
132
+ cfg_val &= ~AAL_RELAY_MODE ;
133
+
134
+ writel (cfg_val , aal -> regs + DISP_AAL_CFG );
65
135
}
66
136
67
137
void mtk_aal_start (struct device * dev )
@@ -144,10 +214,9 @@ static const struct mtk_disp_aal_data mt8173_aal_driver_data = {
144
214
};
145
215
146
216
static const struct of_device_id mtk_disp_aal_driver_dt_match [] = {
147
- { .compatible = "mediatek,mt8173-disp-aal" ,
148
- .data = & mt8173_aal_driver_data },
149
- { .compatible = "mediatek,mt8183-disp-aal" },
150
- {},
217
+ { .compatible = "mediatek,mt8173-disp-aal" , .data = & mt8173_aal_driver_data },
218
+ { .compatible = "mediatek,mt8183-disp-aal" },
219
+ { /* sentinel */ }
151
220
};
152
221
MODULE_DEVICE_TABLE (of , mtk_disp_aal_driver_dt_match );
153
222
0 commit comments