• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // SPDX-License-Identifier: MIT
2 /*
3  * Copyright © 2021 Intel Corporation
4  */
5 
6 #include <linux/kernel.h>
7 #include <linux/pwm.h>
8 
9 #include "intel_backlight.h"
10 #include "intel_connector.h"
11 #include "intel_de.h"
12 #include "intel_display_types.h"
13 #include "intel_dp_aux_backlight.h"
14 #include "intel_dsi_dcs_backlight.h"
15 #include "intel_panel.h"
16 
17 /**
18  * scale - scale values from one range to another
19  * @source_val: value in range [@source_min..@source_max]
20  * @source_min: minimum legal value for @source_val
21  * @source_max: maximum legal value for @source_val
22  * @target_min: corresponding target value for @source_min
23  * @target_max: corresponding target value for @source_max
24  *
25  * Return @source_val in range [@source_min..@source_max] scaled to range
26  * [@target_min..@target_max].
27  */
scale(u32 source_val,u32 source_min,u32 source_max,u32 target_min,u32 target_max)28 static u32 scale(u32 source_val,
29 		 u32 source_min, u32 source_max,
30 		 u32 target_min, u32 target_max)
31 {
32 	u64 target_val;
33 
34 	WARN_ON(source_min > source_max);
35 	WARN_ON(target_min > target_max);
36 
37 	/* defensive */
38 	source_val = clamp(source_val, source_min, source_max);
39 
40 	/* avoid overflows */
41 	target_val = mul_u32_u32(source_val - source_min,
42 				 target_max - target_min);
43 	target_val = DIV_ROUND_CLOSEST_ULL(target_val, source_max - source_min);
44 	target_val += target_min;
45 
46 	return target_val;
47 }
48 
49 /*
50  * Scale user_level in range [0..user_max] to [0..hw_max], clamping the result
51  * to [hw_min..hw_max].
52  */
clamp_user_to_hw(struct intel_connector * connector,u32 user_level,u32 user_max)53 static u32 clamp_user_to_hw(struct intel_connector *connector,
54 			    u32 user_level, u32 user_max)
55 {
56 	struct intel_panel *panel = &connector->panel;
57 	u32 hw_level;
58 
59 	hw_level = scale(user_level, 0, user_max, 0, panel->backlight.max);
60 	hw_level = clamp(hw_level, panel->backlight.min, panel->backlight.max);
61 
62 	return hw_level;
63 }
64 
65 /* Scale hw_level in range [hw_min..hw_max] to [0..user_max]. */
scale_hw_to_user(struct intel_connector * connector,u32 hw_level,u32 user_max)66 static u32 scale_hw_to_user(struct intel_connector *connector,
67 			    u32 hw_level, u32 user_max)
68 {
69 	struct intel_panel *panel = &connector->panel;
70 
71 	return scale(hw_level, panel->backlight.min, panel->backlight.max,
72 		     0, user_max);
73 }
74 
intel_panel_invert_pwm_level(struct intel_connector * connector,u32 val)75 u32 intel_panel_invert_pwm_level(struct intel_connector *connector, u32 val)
76 {
77 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
78 	struct intel_panel *panel = &connector->panel;
79 
80 	drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
81 
82 	if (dev_priv->params.invert_brightness < 0)
83 		return val;
84 
85 	if (dev_priv->params.invert_brightness > 0 ||
86 	    dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS) {
87 		return panel->backlight.pwm_level_max - val + panel->backlight.pwm_level_min;
88 	}
89 
90 	return val;
91 }
92 
intel_panel_set_pwm_level(const struct drm_connector_state * conn_state,u32 val)93 void intel_panel_set_pwm_level(const struct drm_connector_state *conn_state, u32 val)
94 {
95 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
96 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
97 	struct intel_panel *panel = &connector->panel;
98 
99 	drm_dbg_kms(&i915->drm, "set backlight PWM = %d\n", val);
100 	panel->backlight.pwm_funcs->set(conn_state, val);
101 }
102 
intel_panel_backlight_level_to_pwm(struct intel_connector * connector,u32 val)103 u32 intel_panel_backlight_level_to_pwm(struct intel_connector *connector, u32 val)
104 {
105 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
106 	struct intel_panel *panel = &connector->panel;
107 
108 	drm_WARN_ON_ONCE(&dev_priv->drm,
109 			 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);
110 
111 	val = scale(val, panel->backlight.min, panel->backlight.max,
112 		    panel->backlight.pwm_level_min, panel->backlight.pwm_level_max);
113 
114 	return intel_panel_invert_pwm_level(connector, val);
115 }
116 
intel_panel_backlight_level_from_pwm(struct intel_connector * connector,u32 val)117 u32 intel_panel_backlight_level_from_pwm(struct intel_connector *connector, u32 val)
118 {
119 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
120 	struct intel_panel *panel = &connector->panel;
121 
122 	drm_WARN_ON_ONCE(&dev_priv->drm,
123 			 panel->backlight.max == 0 || panel->backlight.pwm_level_max == 0);
124 
125 	if (dev_priv->params.invert_brightness > 0 ||
126 	    (dev_priv->params.invert_brightness == 0 && dev_priv->quirks & QUIRK_INVERT_BRIGHTNESS))
127 		val = panel->backlight.pwm_level_max - (val - panel->backlight.pwm_level_min);
128 
129 	return scale(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max,
130 		     panel->backlight.min, panel->backlight.max);
131 }
132 
lpt_get_backlight(struct intel_connector * connector,enum pipe unused)133 static u32 lpt_get_backlight(struct intel_connector *connector, enum pipe unused)
134 {
135 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
136 
137 	return intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & BACKLIGHT_DUTY_CYCLE_MASK;
138 }
139 
pch_get_backlight(struct intel_connector * connector,enum pipe unused)140 static u32 pch_get_backlight(struct intel_connector *connector, enum pipe unused)
141 {
142 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
143 
144 	return intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
145 }
146 
i9xx_get_backlight(struct intel_connector * connector,enum pipe unused)147 static u32 i9xx_get_backlight(struct intel_connector *connector, enum pipe unused)
148 {
149 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
150 	struct intel_panel *panel = &connector->panel;
151 	u32 val;
152 
153 	val = intel_de_read(dev_priv, BLC_PWM_CTL) & BACKLIGHT_DUTY_CYCLE_MASK;
154 	if (DISPLAY_VER(dev_priv) < 4)
155 		val >>= 1;
156 
157 	if (panel->backlight.combination_mode) {
158 		u8 lbpc;
159 
160 		pci_read_config_byte(to_pci_dev(dev_priv->drm.dev), LBPC, &lbpc);
161 		val *= lbpc;
162 	}
163 
164 	return val;
165 }
166 
vlv_get_backlight(struct intel_connector * connector,enum pipe pipe)167 static u32 vlv_get_backlight(struct intel_connector *connector, enum pipe pipe)
168 {
169 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
170 
171 	if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
172 		return 0;
173 
174 	return intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & BACKLIGHT_DUTY_CYCLE_MASK;
175 }
176 
bxt_get_backlight(struct intel_connector * connector,enum pipe unused)177 static u32 bxt_get_backlight(struct intel_connector *connector, enum pipe unused)
178 {
179 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
180 	struct intel_panel *panel = &connector->panel;
181 
182 	return intel_de_read(dev_priv,
183 			     BXT_BLC_PWM_DUTY(panel->backlight.controller));
184 }
185 
ext_pwm_get_backlight(struct intel_connector * connector,enum pipe unused)186 static u32 ext_pwm_get_backlight(struct intel_connector *connector, enum pipe unused)
187 {
188 	struct intel_panel *panel = &connector->panel;
189 	struct pwm_state state;
190 
191 	pwm_get_state(panel->backlight.pwm, &state);
192 	return pwm_get_relative_duty_cycle(&state, 100);
193 }
194 
lpt_set_backlight(const struct drm_connector_state * conn_state,u32 level)195 static void lpt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
196 {
197 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
198 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
199 
200 	u32 val = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2) & ~BACKLIGHT_DUTY_CYCLE_MASK;
201 	intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, val | level);
202 }
203 
pch_set_backlight(const struct drm_connector_state * conn_state,u32 level)204 static void pch_set_backlight(const struct drm_connector_state *conn_state, u32 level)
205 {
206 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
207 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
208 	u32 tmp;
209 
210 	tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL) & ~BACKLIGHT_DUTY_CYCLE_MASK;
211 	intel_de_write(dev_priv, BLC_PWM_CPU_CTL, tmp | level);
212 }
213 
i9xx_set_backlight(const struct drm_connector_state * conn_state,u32 level)214 static void i9xx_set_backlight(const struct drm_connector_state *conn_state, u32 level)
215 {
216 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
217 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
218 	struct intel_panel *panel = &connector->panel;
219 	u32 tmp, mask;
220 
221 	drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
222 
223 	if (panel->backlight.combination_mode) {
224 		u8 lbpc;
225 
226 		lbpc = level * 0xfe / panel->backlight.pwm_level_max + 1;
227 		level /= lbpc;
228 		pci_write_config_byte(to_pci_dev(dev_priv->drm.dev), LBPC, lbpc);
229 	}
230 
231 	if (DISPLAY_VER(dev_priv) == 4) {
232 		mask = BACKLIGHT_DUTY_CYCLE_MASK;
233 	} else {
234 		level <<= 1;
235 		mask = BACKLIGHT_DUTY_CYCLE_MASK_PNV;
236 	}
237 
238 	tmp = intel_de_read(dev_priv, BLC_PWM_CTL) & ~mask;
239 	intel_de_write(dev_priv, BLC_PWM_CTL, tmp | level);
240 }
241 
vlv_set_backlight(const struct drm_connector_state * conn_state,u32 level)242 static void vlv_set_backlight(const struct drm_connector_state *conn_state, u32 level)
243 {
244 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
245 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
246 	enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
247 	u32 tmp;
248 
249 	tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe)) & ~BACKLIGHT_DUTY_CYCLE_MASK;
250 	intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), tmp | level);
251 }
252 
bxt_set_backlight(const struct drm_connector_state * conn_state,u32 level)253 static void bxt_set_backlight(const struct drm_connector_state *conn_state, u32 level)
254 {
255 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
256 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
257 	struct intel_panel *panel = &connector->panel;
258 
259 	intel_de_write(dev_priv,
260 		       BXT_BLC_PWM_DUTY(panel->backlight.controller), level);
261 }
262 
ext_pwm_set_backlight(const struct drm_connector_state * conn_state,u32 level)263 static void ext_pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
264 {
265 	struct intel_panel *panel = &to_intel_connector(conn_state->connector)->panel;
266 
267 	pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
268 	pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
269 }
270 
271 static void
intel_panel_actually_set_backlight(const struct drm_connector_state * conn_state,u32 level)272 intel_panel_actually_set_backlight(const struct drm_connector_state *conn_state, u32 level)
273 {
274 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
275 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
276 	struct intel_panel *panel = &connector->panel;
277 
278 	drm_dbg_kms(&i915->drm, "set backlight level = %d\n", level);
279 
280 	panel->backlight.funcs->set(conn_state, level);
281 }
282 
283 /* set backlight brightness to level in range [0..max], assuming hw min is
284  * respected.
285  */
intel_panel_set_backlight_acpi(const struct drm_connector_state * conn_state,u32 user_level,u32 user_max)286 void intel_panel_set_backlight_acpi(const struct drm_connector_state *conn_state,
287 				    u32 user_level, u32 user_max)
288 {
289 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
290 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
291 	struct intel_panel *panel = &connector->panel;
292 	u32 hw_level;
293 
294 	/*
295 	 * Lack of crtc may occur during driver init because
296 	 * connection_mutex isn't held across the entire backlight
297 	 * setup + modeset readout, and the BIOS can issue the
298 	 * requests at any time.
299 	 */
300 	if (!panel->backlight.present || !conn_state->crtc)
301 		return;
302 
303 	mutex_lock(&dev_priv->backlight_lock);
304 
305 	drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
306 
307 	hw_level = clamp_user_to_hw(connector, user_level, user_max);
308 	panel->backlight.level = hw_level;
309 
310 	if (panel->backlight.device)
311 		panel->backlight.device->props.brightness =
312 			scale_hw_to_user(connector,
313 					 panel->backlight.level,
314 					 panel->backlight.device->props.max_brightness);
315 
316 	if (panel->backlight.enabled)
317 		intel_panel_actually_set_backlight(conn_state, hw_level);
318 
319 	mutex_unlock(&dev_priv->backlight_lock);
320 }
321 
lpt_disable_backlight(const struct drm_connector_state * old_conn_state,u32 level)322 static void lpt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level)
323 {
324 	struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
325 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
326 	u32 tmp;
327 
328 	intel_panel_set_pwm_level(old_conn_state, level);
329 
330 	/*
331 	 * Although we don't support or enable CPU PWM with LPT/SPT based
332 	 * systems, it may have been enabled prior to loading the
333 	 * driver. Disable to avoid warnings on LCPLL disable.
334 	 *
335 	 * This needs rework if we need to add support for CPU PWM on PCH split
336 	 * platforms.
337 	 */
338 	tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
339 	if (tmp & BLM_PWM_ENABLE) {
340 		drm_dbg_kms(&dev_priv->drm,
341 			    "cpu backlight was enabled, disabling\n");
342 		intel_de_write(dev_priv, BLC_PWM_CPU_CTL2,
343 			       tmp & ~BLM_PWM_ENABLE);
344 	}
345 
346 	tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
347 	intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
348 }
349 
pch_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)350 static void pch_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
351 {
352 	struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
353 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
354 	u32 tmp;
355 
356 	intel_panel_set_pwm_level(old_conn_state, val);
357 
358 	tmp = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
359 	intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, tmp & ~BLM_PWM_ENABLE);
360 
361 	tmp = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
362 	intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, tmp & ~BLM_PCH_PWM_ENABLE);
363 }
364 
i9xx_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)365 static void i9xx_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
366 {
367 	intel_panel_set_pwm_level(old_conn_state, val);
368 }
369 
i965_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)370 static void i965_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
371 {
372 	struct drm_i915_private *dev_priv = to_i915(old_conn_state->connector->dev);
373 	u32 tmp;
374 
375 	intel_panel_set_pwm_level(old_conn_state, val);
376 
377 	tmp = intel_de_read(dev_priv, BLC_PWM_CTL2);
378 	intel_de_write(dev_priv, BLC_PWM_CTL2, tmp & ~BLM_PWM_ENABLE);
379 }
380 
vlv_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)381 static void vlv_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
382 {
383 	struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
384 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
385 	enum pipe pipe = to_intel_crtc(old_conn_state->crtc)->pipe;
386 	u32 tmp;
387 
388 	intel_panel_set_pwm_level(old_conn_state, val);
389 
390 	tmp = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
391 	intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
392 		       tmp & ~BLM_PWM_ENABLE);
393 }
394 
bxt_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)395 static void bxt_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
396 {
397 	struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
398 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
399 	struct intel_panel *panel = &connector->panel;
400 	u32 tmp;
401 
402 	intel_panel_set_pwm_level(old_conn_state, val);
403 
404 	tmp = intel_de_read(dev_priv,
405 			    BXT_BLC_PWM_CTL(panel->backlight.controller));
406 	intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
407 		       tmp & ~BXT_BLC_PWM_ENABLE);
408 
409 	if (panel->backlight.controller == 1) {
410 		val = intel_de_read(dev_priv, UTIL_PIN_CTL);
411 		val &= ~UTIL_PIN_ENABLE;
412 		intel_de_write(dev_priv, UTIL_PIN_CTL, val);
413 	}
414 }
415 
cnp_disable_backlight(const struct drm_connector_state * old_conn_state,u32 val)416 static void cnp_disable_backlight(const struct drm_connector_state *old_conn_state, u32 val)
417 {
418 	struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
419 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
420 	struct intel_panel *panel = &connector->panel;
421 	u32 tmp;
422 
423 	intel_panel_set_pwm_level(old_conn_state, val);
424 
425 	tmp = intel_de_read(dev_priv,
426 			    BXT_BLC_PWM_CTL(panel->backlight.controller));
427 	intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
428 		       tmp & ~BXT_BLC_PWM_ENABLE);
429 }
430 
ext_pwm_disable_backlight(const struct drm_connector_state * old_conn_state,u32 level)431 static void ext_pwm_disable_backlight(const struct drm_connector_state *old_conn_state, u32 level)
432 {
433 	struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
434 	struct intel_panel *panel = &connector->panel;
435 
436 	panel->backlight.pwm_state.enabled = false;
437 	pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
438 }
439 
intel_panel_disable_backlight(const struct drm_connector_state * old_conn_state)440 void intel_panel_disable_backlight(const struct drm_connector_state *old_conn_state)
441 {
442 	struct intel_connector *connector = to_intel_connector(old_conn_state->connector);
443 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
444 	struct intel_panel *panel = &connector->panel;
445 
446 	if (!panel->backlight.present)
447 		return;
448 
449 	/*
450 	 * Do not disable backlight on the vga_switcheroo path. When switching
451 	 * away from i915, the other client may depend on i915 to handle the
452 	 * backlight. This will leave the backlight on unnecessarily when
453 	 * another client is not activated.
454 	 */
455 	if (dev_priv->drm.switch_power_state == DRM_SWITCH_POWER_CHANGING) {
456 		drm_dbg_kms(&dev_priv->drm,
457 			    "Skipping backlight disable on vga switch\n");
458 		return;
459 	}
460 
461 	mutex_lock(&dev_priv->backlight_lock);
462 
463 	if (panel->backlight.device)
464 		panel->backlight.device->props.power = FB_BLANK_POWERDOWN;
465 	panel->backlight.enabled = false;
466 	panel->backlight.funcs->disable(old_conn_state, 0);
467 
468 	mutex_unlock(&dev_priv->backlight_lock);
469 }
470 
lpt_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)471 static void lpt_enable_backlight(const struct intel_crtc_state *crtc_state,
472 				 const struct drm_connector_state *conn_state, u32 level)
473 {
474 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
475 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
476 	struct intel_panel *panel = &connector->panel;
477 	u32 pch_ctl1, pch_ctl2, schicken;
478 
479 	pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
480 	if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
481 		drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
482 		pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
483 		intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
484 	}
485 
486 	if (HAS_PCH_LPT(dev_priv)) {
487 		schicken = intel_de_read(dev_priv, SOUTH_CHICKEN2);
488 		if (panel->backlight.alternate_pwm_increment)
489 			schicken |= LPT_PWM_GRANULARITY;
490 		else
491 			schicken &= ~LPT_PWM_GRANULARITY;
492 		intel_de_write(dev_priv, SOUTH_CHICKEN2, schicken);
493 	} else {
494 		schicken = intel_de_read(dev_priv, SOUTH_CHICKEN1);
495 		if (panel->backlight.alternate_pwm_increment)
496 			schicken |= SPT_PWM_GRANULARITY;
497 		else
498 			schicken &= ~SPT_PWM_GRANULARITY;
499 		intel_de_write(dev_priv, SOUTH_CHICKEN1, schicken);
500 	}
501 
502 	pch_ctl2 = panel->backlight.pwm_level_max << 16;
503 	intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
504 
505 	pch_ctl1 = 0;
506 	if (panel->backlight.active_low_pwm)
507 		pch_ctl1 |= BLM_PCH_POLARITY;
508 
509 	/* After LPT, override is the default. */
510 	if (HAS_PCH_LPT(dev_priv))
511 		pch_ctl1 |= BLM_PCH_OVERRIDE_ENABLE;
512 
513 	intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
514 	intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
515 	intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
516 		       pch_ctl1 | BLM_PCH_PWM_ENABLE);
517 
518 	/* This won't stick until the above enable. */
519 	intel_panel_set_pwm_level(conn_state, level);
520 }
521 
pch_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)522 static void pch_enable_backlight(const struct intel_crtc_state *crtc_state,
523 				 const struct drm_connector_state *conn_state, u32 level)
524 {
525 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
526 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
527 	struct intel_panel *panel = &connector->panel;
528 	enum transcoder cpu_transcoder = crtc_state->cpu_transcoder;
529 	u32 cpu_ctl2, pch_ctl1, pch_ctl2;
530 
531 	cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
532 	if (cpu_ctl2 & BLM_PWM_ENABLE) {
533 		drm_dbg_kms(&dev_priv->drm, "cpu backlight already enabled\n");
534 		cpu_ctl2 &= ~BLM_PWM_ENABLE;
535 		intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
536 	}
537 
538 	pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
539 	if (pch_ctl1 & BLM_PCH_PWM_ENABLE) {
540 		drm_dbg_kms(&dev_priv->drm, "pch backlight already enabled\n");
541 		pch_ctl1 &= ~BLM_PCH_PWM_ENABLE;
542 		intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
543 	}
544 
545 	if (cpu_transcoder == TRANSCODER_EDP)
546 		cpu_ctl2 = BLM_TRANSCODER_EDP;
547 	else
548 		cpu_ctl2 = BLM_PIPE(cpu_transcoder);
549 	intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2);
550 	intel_de_posting_read(dev_priv, BLC_PWM_CPU_CTL2);
551 	intel_de_write(dev_priv, BLC_PWM_CPU_CTL2, cpu_ctl2 | BLM_PWM_ENABLE);
552 
553 	/* This won't stick until the above enable. */
554 	intel_panel_set_pwm_level(conn_state, level);
555 
556 	pch_ctl2 = panel->backlight.pwm_level_max << 16;
557 	intel_de_write(dev_priv, BLC_PWM_PCH_CTL2, pch_ctl2);
558 
559 	pch_ctl1 = 0;
560 	if (panel->backlight.active_low_pwm)
561 		pch_ctl1 |= BLM_PCH_POLARITY;
562 
563 	intel_de_write(dev_priv, BLC_PWM_PCH_CTL1, pch_ctl1);
564 	intel_de_posting_read(dev_priv, BLC_PWM_PCH_CTL1);
565 	intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
566 		       pch_ctl1 | BLM_PCH_PWM_ENABLE);
567 }
568 
i9xx_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)569 static void i9xx_enable_backlight(const struct intel_crtc_state *crtc_state,
570 				  const struct drm_connector_state *conn_state, u32 level)
571 {
572 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
573 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
574 	struct intel_panel *panel = &connector->panel;
575 	u32 ctl, freq;
576 
577 	ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
578 	if (ctl & BACKLIGHT_DUTY_CYCLE_MASK_PNV) {
579 		drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
580 		intel_de_write(dev_priv, BLC_PWM_CTL, 0);
581 	}
582 
583 	freq = panel->backlight.pwm_level_max;
584 	if (panel->backlight.combination_mode)
585 		freq /= 0xff;
586 
587 	ctl = freq << 17;
588 	if (panel->backlight.combination_mode)
589 		ctl |= BLM_LEGACY_MODE;
590 	if (IS_PINEVIEW(dev_priv) && panel->backlight.active_low_pwm)
591 		ctl |= BLM_POLARITY_PNV;
592 
593 	intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
594 	intel_de_posting_read(dev_priv, BLC_PWM_CTL);
595 
596 	/* XXX: combine this into above write? */
597 	intel_panel_set_pwm_level(conn_state, level);
598 
599 	/*
600 	 * Needed to enable backlight on some 855gm models. BLC_HIST_CTL is
601 	 * 855gm only, but checking for gen2 is safe, as 855gm is the only gen2
602 	 * that has backlight.
603 	 */
604 	if (DISPLAY_VER(dev_priv) == 2)
605 		intel_de_write(dev_priv, BLC_HIST_CTL, BLM_HISTOGRAM_ENABLE);
606 }
607 
i965_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)608 static void i965_enable_backlight(const struct intel_crtc_state *crtc_state,
609 				  const struct drm_connector_state *conn_state, u32 level)
610 {
611 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
612 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
613 	struct intel_panel *panel = &connector->panel;
614 	enum pipe pipe = to_intel_crtc(conn_state->crtc)->pipe;
615 	u32 ctl, ctl2, freq;
616 
617 	ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
618 	if (ctl2 & BLM_PWM_ENABLE) {
619 		drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
620 		ctl2 &= ~BLM_PWM_ENABLE;
621 		intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
622 	}
623 
624 	freq = panel->backlight.pwm_level_max;
625 	if (panel->backlight.combination_mode)
626 		freq /= 0xff;
627 
628 	ctl = freq << 16;
629 	intel_de_write(dev_priv, BLC_PWM_CTL, ctl);
630 
631 	ctl2 = BLM_PIPE(pipe);
632 	if (panel->backlight.combination_mode)
633 		ctl2 |= BLM_COMBINATION_MODE;
634 	if (panel->backlight.active_low_pwm)
635 		ctl2 |= BLM_POLARITY_I965;
636 	intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2);
637 	intel_de_posting_read(dev_priv, BLC_PWM_CTL2);
638 	intel_de_write(dev_priv, BLC_PWM_CTL2, ctl2 | BLM_PWM_ENABLE);
639 
640 	intel_panel_set_pwm_level(conn_state, level);
641 }
642 
vlv_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)643 static void vlv_enable_backlight(const struct intel_crtc_state *crtc_state,
644 				 const struct drm_connector_state *conn_state, u32 level)
645 {
646 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
647 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
648 	struct intel_panel *panel = &connector->panel;
649 	enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
650 	u32 ctl, ctl2;
651 
652 	ctl2 = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
653 	if (ctl2 & BLM_PWM_ENABLE) {
654 		drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
655 		ctl2 &= ~BLM_PWM_ENABLE;
656 		intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
657 	}
658 
659 	ctl = panel->backlight.pwm_level_max << 16;
660 	intel_de_write(dev_priv, VLV_BLC_PWM_CTL(pipe), ctl);
661 
662 	/* XXX: combine this into above write? */
663 	intel_panel_set_pwm_level(conn_state, level);
664 
665 	ctl2 = 0;
666 	if (panel->backlight.active_low_pwm)
667 		ctl2 |= BLM_POLARITY_I965;
668 	intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe), ctl2);
669 	intel_de_posting_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
670 	intel_de_write(dev_priv, VLV_BLC_PWM_CTL2(pipe),
671 		       ctl2 | BLM_PWM_ENABLE);
672 }
673 
bxt_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)674 static void bxt_enable_backlight(const struct intel_crtc_state *crtc_state,
675 				 const struct drm_connector_state *conn_state, u32 level)
676 {
677 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
678 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
679 	struct intel_panel *panel = &connector->panel;
680 	enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
681 	u32 pwm_ctl, val;
682 
683 	/* Controller 1 uses the utility pin. */
684 	if (panel->backlight.controller == 1) {
685 		val = intel_de_read(dev_priv, UTIL_PIN_CTL);
686 		if (val & UTIL_PIN_ENABLE) {
687 			drm_dbg_kms(&dev_priv->drm,
688 				    "util pin already enabled\n");
689 			val &= ~UTIL_PIN_ENABLE;
690 			intel_de_write(dev_priv, UTIL_PIN_CTL, val);
691 		}
692 
693 		val = 0;
694 		if (panel->backlight.util_pin_active_low)
695 			val |= UTIL_PIN_POLARITY;
696 		intel_de_write(dev_priv, UTIL_PIN_CTL,
697 			       val | UTIL_PIN_PIPE(pipe) | UTIL_PIN_MODE_PWM | UTIL_PIN_ENABLE);
698 	}
699 
700 	pwm_ctl = intel_de_read(dev_priv,
701 				BXT_BLC_PWM_CTL(panel->backlight.controller));
702 	if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
703 		drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
704 		pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
705 		intel_de_write(dev_priv,
706 			       BXT_BLC_PWM_CTL(panel->backlight.controller),
707 			       pwm_ctl);
708 	}
709 
710 	intel_de_write(dev_priv,
711 		       BXT_BLC_PWM_FREQ(panel->backlight.controller),
712 		       panel->backlight.pwm_level_max);
713 
714 	intel_panel_set_pwm_level(conn_state, level);
715 
716 	pwm_ctl = 0;
717 	if (panel->backlight.active_low_pwm)
718 		pwm_ctl |= BXT_BLC_PWM_POLARITY;
719 
720 	intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
721 		       pwm_ctl);
722 	intel_de_posting_read(dev_priv,
723 			      BXT_BLC_PWM_CTL(panel->backlight.controller));
724 	intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
725 		       pwm_ctl | BXT_BLC_PWM_ENABLE);
726 }
727 
cnp_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)728 static void cnp_enable_backlight(const struct intel_crtc_state *crtc_state,
729 				 const struct drm_connector_state *conn_state, u32 level)
730 {
731 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
732 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
733 	struct intel_panel *panel = &connector->panel;
734 	u32 pwm_ctl;
735 
736 	pwm_ctl = intel_de_read(dev_priv,
737 				BXT_BLC_PWM_CTL(panel->backlight.controller));
738 	if (pwm_ctl & BXT_BLC_PWM_ENABLE) {
739 		drm_dbg_kms(&dev_priv->drm, "backlight already enabled\n");
740 		pwm_ctl &= ~BXT_BLC_PWM_ENABLE;
741 		intel_de_write(dev_priv,
742 			       BXT_BLC_PWM_CTL(panel->backlight.controller),
743 			       pwm_ctl);
744 	}
745 
746 	intel_de_write(dev_priv,
747 		       BXT_BLC_PWM_FREQ(panel->backlight.controller),
748 		       panel->backlight.pwm_level_max);
749 
750 	intel_panel_set_pwm_level(conn_state, level);
751 
752 	pwm_ctl = 0;
753 	if (panel->backlight.active_low_pwm)
754 		pwm_ctl |= BXT_BLC_PWM_POLARITY;
755 
756 	intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
757 		       pwm_ctl);
758 	intel_de_posting_read(dev_priv,
759 			      BXT_BLC_PWM_CTL(panel->backlight.controller));
760 	intel_de_write(dev_priv, BXT_BLC_PWM_CTL(panel->backlight.controller),
761 		       pwm_ctl | BXT_BLC_PWM_ENABLE);
762 }
763 
ext_pwm_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)764 static void ext_pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
765 				     const struct drm_connector_state *conn_state, u32 level)
766 {
767 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
768 	struct intel_panel *panel = &connector->panel;
769 
770 	pwm_set_relative_duty_cycle(&panel->backlight.pwm_state, level, 100);
771 	panel->backlight.pwm_state.enabled = true;
772 	pwm_apply_state(panel->backlight.pwm, &panel->backlight.pwm_state);
773 }
774 
__intel_panel_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state)775 static void __intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
776 					   const struct drm_connector_state *conn_state)
777 {
778 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
779 	struct intel_panel *panel = &connector->panel;
780 
781 	WARN_ON(panel->backlight.max == 0);
782 
783 	if (panel->backlight.level <= panel->backlight.min) {
784 		panel->backlight.level = panel->backlight.max;
785 		if (panel->backlight.device)
786 			panel->backlight.device->props.brightness =
787 				scale_hw_to_user(connector,
788 						 panel->backlight.level,
789 						 panel->backlight.device->props.max_brightness);
790 	}
791 
792 	panel->backlight.funcs->enable(crtc_state, conn_state, panel->backlight.level);
793 	panel->backlight.enabled = true;
794 	if (panel->backlight.device)
795 		panel->backlight.device->props.power = FB_BLANK_UNBLANK;
796 }
797 
intel_panel_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state)798 void intel_panel_enable_backlight(const struct intel_crtc_state *crtc_state,
799 				  const struct drm_connector_state *conn_state)
800 {
801 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
802 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
803 	struct intel_panel *panel = &connector->panel;
804 	enum pipe pipe = to_intel_crtc(crtc_state->uapi.crtc)->pipe;
805 
806 	if (!panel->backlight.present)
807 		return;
808 
809 	drm_dbg_kms(&dev_priv->drm, "pipe %c\n", pipe_name(pipe));
810 
811 	mutex_lock(&dev_priv->backlight_lock);
812 
813 	__intel_panel_enable_backlight(crtc_state, conn_state);
814 
815 	mutex_unlock(&dev_priv->backlight_lock);
816 }
817 
818 #if IS_ENABLED(CONFIG_BACKLIGHT_CLASS_DEVICE)
intel_panel_get_backlight(struct intel_connector * connector)819 static u32 intel_panel_get_backlight(struct intel_connector *connector)
820 {
821 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
822 	struct intel_panel *panel = &connector->panel;
823 	u32 val = 0;
824 
825 	mutex_lock(&dev_priv->backlight_lock);
826 
827 	if (panel->backlight.enabled)
828 		val = panel->backlight.funcs->get(connector, intel_connector_get_pipe(connector));
829 
830 	mutex_unlock(&dev_priv->backlight_lock);
831 
832 	drm_dbg_kms(&dev_priv->drm, "get backlight PWM = %d\n", val);
833 	return val;
834 }
835 
836 /* Scale user_level in range [0..user_max] to [hw_min..hw_max]. */
scale_user_to_hw(struct intel_connector * connector,u32 user_level,u32 user_max)837 static u32 scale_user_to_hw(struct intel_connector *connector,
838 			    u32 user_level, u32 user_max)
839 {
840 	struct intel_panel *panel = &connector->panel;
841 
842 	return scale(user_level, 0, user_max,
843 		     panel->backlight.min, panel->backlight.max);
844 }
845 
846 /* set backlight brightness to level in range [0..max], scaling wrt hw min */
intel_panel_set_backlight(const struct drm_connector_state * conn_state,u32 user_level,u32 user_max)847 static void intel_panel_set_backlight(const struct drm_connector_state *conn_state,
848 				      u32 user_level, u32 user_max)
849 {
850 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
851 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
852 	struct intel_panel *panel = &connector->panel;
853 	u32 hw_level;
854 
855 	if (!panel->backlight.present)
856 		return;
857 
858 	mutex_lock(&dev_priv->backlight_lock);
859 
860 	drm_WARN_ON(&dev_priv->drm, panel->backlight.max == 0);
861 
862 	hw_level = scale_user_to_hw(connector, user_level, user_max);
863 	panel->backlight.level = hw_level;
864 
865 	if (panel->backlight.enabled)
866 		intel_panel_actually_set_backlight(conn_state, hw_level);
867 
868 	mutex_unlock(&dev_priv->backlight_lock);
869 }
870 
intel_backlight_device_update_status(struct backlight_device * bd)871 static int intel_backlight_device_update_status(struct backlight_device *bd)
872 {
873 	struct intel_connector *connector = bl_get_data(bd);
874 	struct intel_panel *panel = &connector->panel;
875 	struct drm_device *dev = connector->base.dev;
876 
877 	drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
878 	DRM_DEBUG_KMS("updating intel_backlight, brightness=%d/%d\n",
879 		      bd->props.brightness, bd->props.max_brightness);
880 	intel_panel_set_backlight(connector->base.state, bd->props.brightness,
881 				  bd->props.max_brightness);
882 
883 	/*
884 	 * Allow flipping bl_power as a sub-state of enabled. Sadly the
885 	 * backlight class device does not make it easy to differentiate
886 	 * between callbacks for brightness and bl_power, so our backlight_power
887 	 * callback needs to take this into account.
888 	 */
889 	if (panel->backlight.enabled) {
890 		if (panel->backlight.power) {
891 			bool enable = bd->props.power == FB_BLANK_UNBLANK &&
892 				bd->props.brightness != 0;
893 			panel->backlight.power(connector, enable);
894 		}
895 	} else {
896 		bd->props.power = FB_BLANK_POWERDOWN;
897 	}
898 
899 	drm_modeset_unlock(&dev->mode_config.connection_mutex);
900 	return 0;
901 }
902 
intel_backlight_device_get_brightness(struct backlight_device * bd)903 static int intel_backlight_device_get_brightness(struct backlight_device *bd)
904 {
905 	struct intel_connector *connector = bl_get_data(bd);
906 	struct drm_device *dev = connector->base.dev;
907 	struct drm_i915_private *dev_priv = to_i915(dev);
908 	intel_wakeref_t wakeref;
909 	int ret = 0;
910 
911 	with_intel_runtime_pm(&dev_priv->runtime_pm, wakeref) {
912 		u32 hw_level;
913 
914 		drm_modeset_lock(&dev->mode_config.connection_mutex, NULL);
915 
916 		hw_level = intel_panel_get_backlight(connector);
917 		ret = scale_hw_to_user(connector,
918 				       hw_level, bd->props.max_brightness);
919 
920 		drm_modeset_unlock(&dev->mode_config.connection_mutex);
921 	}
922 
923 	return ret;
924 }
925 
926 static const struct backlight_ops intel_backlight_device_ops = {
927 	.update_status = intel_backlight_device_update_status,
928 	.get_brightness = intel_backlight_device_get_brightness,
929 };
930 
intel_backlight_device_register(struct intel_connector * connector)931 int intel_backlight_device_register(struct intel_connector *connector)
932 {
933 	struct drm_i915_private *i915 = to_i915(connector->base.dev);
934 	struct intel_panel *panel = &connector->panel;
935 	struct backlight_properties props;
936 	struct backlight_device *bd;
937 	const char *name;
938 	int ret = 0;
939 
940 	if (WARN_ON(panel->backlight.device))
941 		return -ENODEV;
942 
943 	if (!panel->backlight.present)
944 		return 0;
945 
946 	WARN_ON(panel->backlight.max == 0);
947 
948 	memset(&props, 0, sizeof(props));
949 	props.type = BACKLIGHT_RAW;
950 
951 	/*
952 	 * Note: Everything should work even if the backlight device max
953 	 * presented to the userspace is arbitrarily chosen.
954 	 */
955 	props.max_brightness = panel->backlight.max;
956 	props.brightness = scale_hw_to_user(connector,
957 					    panel->backlight.level,
958 					    props.max_brightness);
959 
960 	if (panel->backlight.enabled)
961 		props.power = FB_BLANK_UNBLANK;
962 	else
963 		props.power = FB_BLANK_POWERDOWN;
964 
965 	name = kstrdup("intel_backlight", GFP_KERNEL);
966 	if (!name)
967 		return -ENOMEM;
968 
969 	bd = backlight_device_get_by_name(name);
970 	if (bd) {
971 		put_device(&bd->dev);
972 		/*
973 		 * Using the same name independent of the drm device or connector
974 		 * prevents registration of multiple backlight devices in the
975 		 * driver. However, we need to use the default name for backward
976 		 * compatibility. Use unique names for subsequent backlight devices as a
977 		 * fallback when the default name already exists.
978 		 */
979 		kfree(name);
980 		name = kasprintf(GFP_KERNEL, "card%d-%s-backlight",
981 				 i915->drm.primary->index, connector->base.name);
982 		if (!name)
983 			return -ENOMEM;
984 	}
985 	bd = backlight_device_register(name, connector->base.kdev, connector,
986 				       &intel_backlight_device_ops, &props);
987 
988 	if (IS_ERR(bd)) {
989 		drm_err(&i915->drm,
990 			"[CONNECTOR:%d:%s] backlight device %s register failed: %ld\n",
991 			connector->base.base.id, connector->base.name, name, PTR_ERR(bd));
992 		ret = PTR_ERR(bd);
993 		goto out;
994 	}
995 
996 	panel->backlight.device = bd;
997 
998 	drm_dbg_kms(&i915->drm,
999 		    "[CONNECTOR:%d:%s] backlight device %s registered\n",
1000 		    connector->base.base.id, connector->base.name, name);
1001 
1002 out:
1003 	kfree(name);
1004 
1005 	return ret;
1006 }
1007 
intel_backlight_device_unregister(struct intel_connector * connector)1008 void intel_backlight_device_unregister(struct intel_connector *connector)
1009 {
1010 	struct intel_panel *panel = &connector->panel;
1011 
1012 	if (panel->backlight.device) {
1013 		backlight_device_unregister(panel->backlight.device);
1014 		panel->backlight.device = NULL;
1015 	}
1016 }
1017 #endif /* CONFIG_BACKLIGHT_CLASS_DEVICE */
1018 
1019 /*
1020  * CNP: PWM clock frequency is 19.2 MHz or 24 MHz.
1021  *      PWM increment = 1
1022  */
cnp_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1023 static u32 cnp_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1024 {
1025 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1026 
1027 	return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1028 				 pwm_freq_hz);
1029 }
1030 
1031 /*
1032  * BXT: PWM clock frequency = 19.2 MHz.
1033  */
bxt_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1034 static u32 bxt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1035 {
1036 	return DIV_ROUND_CLOSEST(KHz(19200), pwm_freq_hz);
1037 }
1038 
1039 /*
1040  * SPT: This value represents the period of the PWM stream in clock periods
1041  * multiplied by 16 (default increment) or 128 (alternate increment selected in
1042  * SCHICKEN_1 bit 0). PWM clock is 24 MHz.
1043  */
spt_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1044 static u32 spt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1045 {
1046 	struct intel_panel *panel = &connector->panel;
1047 	u32 mul;
1048 
1049 	if (panel->backlight.alternate_pwm_increment)
1050 		mul = 128;
1051 	else
1052 		mul = 16;
1053 
1054 	return DIV_ROUND_CLOSEST(MHz(24), pwm_freq_hz * mul);
1055 }
1056 
1057 /*
1058  * LPT: This value represents the period of the PWM stream in clock periods
1059  * multiplied by 128 (default increment) or 16 (alternate increment, selected in
1060  * LPT SOUTH_CHICKEN2 register bit 5).
1061  */
lpt_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1062 static u32 lpt_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1063 {
1064 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1065 	struct intel_panel *panel = &connector->panel;
1066 	u32 mul, clock;
1067 
1068 	if (panel->backlight.alternate_pwm_increment)
1069 		mul = 16;
1070 	else
1071 		mul = 128;
1072 
1073 	if (HAS_PCH_LPT_H(dev_priv))
1074 		clock = MHz(135); /* LPT:H */
1075 	else
1076 		clock = MHz(24); /* LPT:LP */
1077 
1078 	return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
1079 }
1080 
1081 /*
1082  * ILK/SNB/IVB: This value represents the period of the PWM stream in PCH
1083  * display raw clocks multiplied by 128.
1084  */
pch_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1085 static u32 pch_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1086 {
1087 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1088 
1089 	return DIV_ROUND_CLOSEST(KHz(RUNTIME_INFO(dev_priv)->rawclk_freq),
1090 				 pwm_freq_hz * 128);
1091 }
1092 
1093 /*
1094  * Gen2: This field determines the number of time base events (display core
1095  * clock frequency/32) in total for a complete cycle of modulated backlight
1096  * control.
1097  *
1098  * Gen3: A time base event equals the display core clock ([DevPNV] HRAW clock)
1099  * divided by 32.
1100  */
i9xx_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1101 static u32 i9xx_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1102 {
1103 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1104 	int clock;
1105 
1106 	if (IS_PINEVIEW(dev_priv))
1107 		clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1108 	else
1109 		clock = KHz(dev_priv->cdclk.hw.cdclk);
1110 
1111 	return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 32);
1112 }
1113 
1114 /*
1115  * Gen4: This value represents the period of the PWM stream in display core
1116  * clocks ([DevCTG] HRAW clocks) multiplied by 128.
1117  *
1118  */
i965_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1119 static u32 i965_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1120 {
1121 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1122 	int clock;
1123 
1124 	if (IS_G4X(dev_priv))
1125 		clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1126 	else
1127 		clock = KHz(dev_priv->cdclk.hw.cdclk);
1128 
1129 	return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * 128);
1130 }
1131 
1132 /*
1133  * VLV: This value represents the period of the PWM stream in display core
1134  * clocks ([DevCTG] 200MHz HRAW clocks) multiplied by 128 or 25MHz S0IX clocks
1135  * multiplied by 16. CHV uses a 19.2MHz S0IX clock.
1136  */
vlv_hz_to_pwm(struct intel_connector * connector,u32 pwm_freq_hz)1137 static u32 vlv_hz_to_pwm(struct intel_connector *connector, u32 pwm_freq_hz)
1138 {
1139 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1140 	int mul, clock;
1141 
1142 	if ((intel_de_read(dev_priv, CBR1_VLV) & CBR_PWM_CLOCK_MUX_SELECT) == 0) {
1143 		if (IS_CHERRYVIEW(dev_priv))
1144 			clock = KHz(19200);
1145 		else
1146 			clock = MHz(25);
1147 		mul = 16;
1148 	} else {
1149 		clock = KHz(RUNTIME_INFO(dev_priv)->rawclk_freq);
1150 		mul = 128;
1151 	}
1152 
1153 	return DIV_ROUND_CLOSEST(clock, pwm_freq_hz * mul);
1154 }
1155 
get_vbt_pwm_freq(struct drm_i915_private * dev_priv)1156 static u16 get_vbt_pwm_freq(struct drm_i915_private *dev_priv)
1157 {
1158 	u16 pwm_freq_hz = dev_priv->vbt.backlight.pwm_freq_hz;
1159 
1160 	if (pwm_freq_hz) {
1161 		drm_dbg_kms(&dev_priv->drm,
1162 			    "VBT defined backlight frequency %u Hz\n",
1163 			    pwm_freq_hz);
1164 	} else {
1165 		pwm_freq_hz = 200;
1166 		drm_dbg_kms(&dev_priv->drm,
1167 			    "default backlight frequency %u Hz\n",
1168 			    pwm_freq_hz);
1169 	}
1170 
1171 	return pwm_freq_hz;
1172 }
1173 
get_backlight_max_vbt(struct intel_connector * connector)1174 static u32 get_backlight_max_vbt(struct intel_connector *connector)
1175 {
1176 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1177 	struct intel_panel *panel = &connector->panel;
1178 	u16 pwm_freq_hz = get_vbt_pwm_freq(dev_priv);
1179 	u32 pwm;
1180 
1181 	if (!panel->backlight.pwm_funcs->hz_to_pwm) {
1182 		drm_dbg_kms(&dev_priv->drm,
1183 			    "backlight frequency conversion not supported\n");
1184 		return 0;
1185 	}
1186 
1187 	pwm = panel->backlight.pwm_funcs->hz_to_pwm(connector, pwm_freq_hz);
1188 	if (!pwm) {
1189 		drm_dbg_kms(&dev_priv->drm,
1190 			    "backlight frequency conversion failed\n");
1191 		return 0;
1192 	}
1193 
1194 	return pwm;
1195 }
1196 
1197 /*
1198  * Note: The setup hooks can't assume pipe is set!
1199  */
get_backlight_min_vbt(struct intel_connector * connector)1200 static u32 get_backlight_min_vbt(struct intel_connector *connector)
1201 {
1202 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1203 	struct intel_panel *panel = &connector->panel;
1204 	int min;
1205 
1206 	drm_WARN_ON(&dev_priv->drm, panel->backlight.pwm_level_max == 0);
1207 
1208 	/*
1209 	 * XXX: If the vbt value is 255, it makes min equal to max, which leads
1210 	 * to problems. There are such machines out there. Either our
1211 	 * interpretation is wrong or the vbt has bogus data. Or both. Safeguard
1212 	 * against this by letting the minimum be at most (arbitrarily chosen)
1213 	 * 25% of the max.
1214 	 */
1215 	min = clamp_t(int, dev_priv->vbt.backlight.min_brightness, 0, 64);
1216 	if (min != dev_priv->vbt.backlight.min_brightness) {
1217 		drm_dbg_kms(&dev_priv->drm,
1218 			    "clamping VBT min backlight %d/255 to %d/255\n",
1219 			    dev_priv->vbt.backlight.min_brightness, min);
1220 	}
1221 
1222 	/* vbt value is a coefficient in range [0..255] */
1223 	return scale(min, 0, 255, 0, panel->backlight.pwm_level_max);
1224 }
1225 
lpt_setup_backlight(struct intel_connector * connector,enum pipe unused)1226 static int lpt_setup_backlight(struct intel_connector *connector, enum pipe unused)
1227 {
1228 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1229 	struct intel_panel *panel = &connector->panel;
1230 	u32 cpu_ctl2, pch_ctl1, pch_ctl2, val;
1231 	bool alt, cpu_mode;
1232 
1233 	if (HAS_PCH_LPT(dev_priv))
1234 		alt = intel_de_read(dev_priv, SOUTH_CHICKEN2) & LPT_PWM_GRANULARITY;
1235 	else
1236 		alt = intel_de_read(dev_priv, SOUTH_CHICKEN1) & SPT_PWM_GRANULARITY;
1237 	panel->backlight.alternate_pwm_increment = alt;
1238 
1239 	pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
1240 	panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
1241 
1242 	pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
1243 	panel->backlight.pwm_level_max = pch_ctl2 >> 16;
1244 
1245 	cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
1246 
1247 	if (!panel->backlight.pwm_level_max)
1248 		panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1249 
1250 	if (!panel->backlight.pwm_level_max)
1251 		return -ENODEV;
1252 
1253 	panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1254 
1255 	panel->backlight.pwm_enabled = pch_ctl1 & BLM_PCH_PWM_ENABLE;
1256 
1257 	cpu_mode = panel->backlight.pwm_enabled && HAS_PCH_LPT(dev_priv) &&
1258 		   !(pch_ctl1 & BLM_PCH_OVERRIDE_ENABLE) &&
1259 		   (cpu_ctl2 & BLM_PWM_ENABLE);
1260 
1261 	if (cpu_mode) {
1262 		val = pch_get_backlight(connector, unused);
1263 
1264 		drm_dbg_kms(&dev_priv->drm,
1265 			    "CPU backlight register was enabled, switching to PCH override\n");
1266 
1267 		/* Write converted CPU PWM value to PCH override register */
1268 		lpt_set_backlight(connector->base.state, val);
1269 		intel_de_write(dev_priv, BLC_PWM_PCH_CTL1,
1270 			       pch_ctl1 | BLM_PCH_OVERRIDE_ENABLE);
1271 
1272 		intel_de_write(dev_priv, BLC_PWM_CPU_CTL2,
1273 			       cpu_ctl2 & ~BLM_PWM_ENABLE);
1274 	}
1275 
1276 	return 0;
1277 }
1278 
pch_setup_backlight(struct intel_connector * connector,enum pipe unused)1279 static int pch_setup_backlight(struct intel_connector *connector, enum pipe unused)
1280 {
1281 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1282 	struct intel_panel *panel = &connector->panel;
1283 	u32 cpu_ctl2, pch_ctl1, pch_ctl2;
1284 
1285 	pch_ctl1 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL1);
1286 	panel->backlight.active_low_pwm = pch_ctl1 & BLM_PCH_POLARITY;
1287 
1288 	pch_ctl2 = intel_de_read(dev_priv, BLC_PWM_PCH_CTL2);
1289 	panel->backlight.pwm_level_max = pch_ctl2 >> 16;
1290 
1291 	if (!panel->backlight.pwm_level_max)
1292 		panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1293 
1294 	if (!panel->backlight.pwm_level_max)
1295 		return -ENODEV;
1296 
1297 	panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1298 
1299 	cpu_ctl2 = intel_de_read(dev_priv, BLC_PWM_CPU_CTL2);
1300 	panel->backlight.pwm_enabled = (cpu_ctl2 & BLM_PWM_ENABLE) &&
1301 		(pch_ctl1 & BLM_PCH_PWM_ENABLE);
1302 
1303 	return 0;
1304 }
1305 
i9xx_setup_backlight(struct intel_connector * connector,enum pipe unused)1306 static int i9xx_setup_backlight(struct intel_connector *connector, enum pipe unused)
1307 {
1308 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1309 	struct intel_panel *panel = &connector->panel;
1310 	u32 ctl, val;
1311 
1312 	ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
1313 
1314 	if (DISPLAY_VER(dev_priv) == 2 || IS_I915GM(dev_priv) || IS_I945GM(dev_priv))
1315 		panel->backlight.combination_mode = ctl & BLM_LEGACY_MODE;
1316 
1317 	if (IS_PINEVIEW(dev_priv))
1318 		panel->backlight.active_low_pwm = ctl & BLM_POLARITY_PNV;
1319 
1320 	panel->backlight.pwm_level_max = ctl >> 17;
1321 
1322 	if (!panel->backlight.pwm_level_max) {
1323 		panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1324 		panel->backlight.pwm_level_max >>= 1;
1325 	}
1326 
1327 	if (!panel->backlight.pwm_level_max)
1328 		return -ENODEV;
1329 
1330 	if (panel->backlight.combination_mode)
1331 		panel->backlight.pwm_level_max *= 0xff;
1332 
1333 	panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1334 
1335 	val = i9xx_get_backlight(connector, unused);
1336 	val = intel_panel_invert_pwm_level(connector, val);
1337 	val = clamp(val, panel->backlight.pwm_level_min, panel->backlight.pwm_level_max);
1338 
1339 	panel->backlight.pwm_enabled = val != 0;
1340 
1341 	return 0;
1342 }
1343 
i965_setup_backlight(struct intel_connector * connector,enum pipe unused)1344 static int i965_setup_backlight(struct intel_connector *connector, enum pipe unused)
1345 {
1346 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1347 	struct intel_panel *panel = &connector->panel;
1348 	u32 ctl, ctl2;
1349 
1350 	ctl2 = intel_de_read(dev_priv, BLC_PWM_CTL2);
1351 	panel->backlight.combination_mode = ctl2 & BLM_COMBINATION_MODE;
1352 	panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
1353 
1354 	ctl = intel_de_read(dev_priv, BLC_PWM_CTL);
1355 	panel->backlight.pwm_level_max = ctl >> 16;
1356 
1357 	if (!panel->backlight.pwm_level_max)
1358 		panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1359 
1360 	if (!panel->backlight.pwm_level_max)
1361 		return -ENODEV;
1362 
1363 	if (panel->backlight.combination_mode)
1364 		panel->backlight.pwm_level_max *= 0xff;
1365 
1366 	panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1367 
1368 	panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE;
1369 
1370 	return 0;
1371 }
1372 
vlv_setup_backlight(struct intel_connector * connector,enum pipe pipe)1373 static int vlv_setup_backlight(struct intel_connector *connector, enum pipe pipe)
1374 {
1375 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1376 	struct intel_panel *panel = &connector->panel;
1377 	u32 ctl, ctl2;
1378 
1379 	if (drm_WARN_ON(&dev_priv->drm, pipe != PIPE_A && pipe != PIPE_B))
1380 		return -ENODEV;
1381 
1382 	ctl2 = intel_de_read(dev_priv, VLV_BLC_PWM_CTL2(pipe));
1383 	panel->backlight.active_low_pwm = ctl2 & BLM_POLARITY_I965;
1384 
1385 	ctl = intel_de_read(dev_priv, VLV_BLC_PWM_CTL(pipe));
1386 	panel->backlight.pwm_level_max = ctl >> 16;
1387 
1388 	if (!panel->backlight.pwm_level_max)
1389 		panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1390 
1391 	if (!panel->backlight.pwm_level_max)
1392 		return -ENODEV;
1393 
1394 	panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1395 
1396 	panel->backlight.pwm_enabled = ctl2 & BLM_PWM_ENABLE;
1397 
1398 	return 0;
1399 }
1400 
1401 static int
bxt_setup_backlight(struct intel_connector * connector,enum pipe unused)1402 bxt_setup_backlight(struct intel_connector *connector, enum pipe unused)
1403 {
1404 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1405 	struct intel_panel *panel = &connector->panel;
1406 	u32 pwm_ctl, val;
1407 
1408 	panel->backlight.controller = dev_priv->vbt.backlight.controller;
1409 
1410 	pwm_ctl = intel_de_read(dev_priv,
1411 				BXT_BLC_PWM_CTL(panel->backlight.controller));
1412 
1413 	/* Controller 1 uses the utility pin. */
1414 	if (panel->backlight.controller == 1) {
1415 		val = intel_de_read(dev_priv, UTIL_PIN_CTL);
1416 		panel->backlight.util_pin_active_low =
1417 					val & UTIL_PIN_POLARITY;
1418 	}
1419 
1420 	panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
1421 	panel->backlight.pwm_level_max =
1422 		intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller));
1423 
1424 	if (!panel->backlight.pwm_level_max)
1425 		panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1426 
1427 	if (!panel->backlight.pwm_level_max)
1428 		return -ENODEV;
1429 
1430 	panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1431 
1432 	panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
1433 
1434 	return 0;
1435 }
1436 
1437 static int
cnp_setup_backlight(struct intel_connector * connector,enum pipe unused)1438 cnp_setup_backlight(struct intel_connector *connector, enum pipe unused)
1439 {
1440 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1441 	struct intel_panel *panel = &connector->panel;
1442 	u32 pwm_ctl;
1443 
1444 	/*
1445 	 * CNP has the BXT implementation of backlight, but with only one
1446 	 * controller. TODO: ICP has multiple controllers but we only use
1447 	 * controller 0 for now.
1448 	 */
1449 	panel->backlight.controller = 0;
1450 
1451 	pwm_ctl = intel_de_read(dev_priv,
1452 				BXT_BLC_PWM_CTL(panel->backlight.controller));
1453 
1454 	panel->backlight.active_low_pwm = pwm_ctl & BXT_BLC_PWM_POLARITY;
1455 	panel->backlight.pwm_level_max =
1456 		intel_de_read(dev_priv, BXT_BLC_PWM_FREQ(panel->backlight.controller));
1457 
1458 	if (!panel->backlight.pwm_level_max)
1459 		panel->backlight.pwm_level_max = get_backlight_max_vbt(connector);
1460 
1461 	if (!panel->backlight.pwm_level_max)
1462 		return -ENODEV;
1463 
1464 	panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1465 
1466 	panel->backlight.pwm_enabled = pwm_ctl & BXT_BLC_PWM_ENABLE;
1467 
1468 	return 0;
1469 }
1470 
ext_pwm_setup_backlight(struct intel_connector * connector,enum pipe pipe)1471 static int ext_pwm_setup_backlight(struct intel_connector *connector,
1472 				   enum pipe pipe)
1473 {
1474 	struct drm_device *dev = connector->base.dev;
1475 	struct drm_i915_private *dev_priv = to_i915(dev);
1476 	struct intel_panel *panel = &connector->panel;
1477 	const char *desc;
1478 	u32 level;
1479 
1480 	/* Get the right PWM chip for DSI backlight according to VBT */
1481 	if (dev_priv->vbt.dsi.config->pwm_blc == PPS_BLC_PMIC) {
1482 		panel->backlight.pwm = pwm_get(dev->dev, "pwm_pmic_backlight");
1483 		desc = "PMIC";
1484 	} else {
1485 		panel->backlight.pwm = pwm_get(dev->dev, "pwm_soc_backlight");
1486 		desc = "SoC";
1487 	}
1488 
1489 	if (IS_ERR(panel->backlight.pwm)) {
1490 		drm_err(&dev_priv->drm, "Failed to get the %s PWM chip\n",
1491 			desc);
1492 		panel->backlight.pwm = NULL;
1493 		return -ENODEV;
1494 	}
1495 
1496 	panel->backlight.pwm_level_max = 100; /* 100% */
1497 	panel->backlight.pwm_level_min = get_backlight_min_vbt(connector);
1498 
1499 	if (pwm_is_enabled(panel->backlight.pwm)) {
1500 		/* PWM is already enabled, use existing settings */
1501 		pwm_get_state(panel->backlight.pwm, &panel->backlight.pwm_state);
1502 
1503 		level = pwm_get_relative_duty_cycle(&panel->backlight.pwm_state,
1504 						    100);
1505 		level = intel_panel_invert_pwm_level(connector, level);
1506 		panel->backlight.pwm_enabled = true;
1507 
1508 		drm_dbg_kms(&dev_priv->drm, "PWM already enabled at freq %ld, VBT freq %d, level %d\n",
1509 			    NSEC_PER_SEC / (unsigned long)panel->backlight.pwm_state.period,
1510 			    get_vbt_pwm_freq(dev_priv), level);
1511 	} else {
1512 		/* Set period from VBT frequency, leave other settings at 0. */
1513 		panel->backlight.pwm_state.period =
1514 			NSEC_PER_SEC / get_vbt_pwm_freq(dev_priv);
1515 	}
1516 
1517 	drm_info(&dev_priv->drm, "Using %s PWM for LCD backlight control\n",
1518 		 desc);
1519 	return 0;
1520 }
1521 
intel_pwm_set_backlight(const struct drm_connector_state * conn_state,u32 level)1522 static void intel_pwm_set_backlight(const struct drm_connector_state *conn_state, u32 level)
1523 {
1524 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
1525 	struct intel_panel *panel = &connector->panel;
1526 
1527 	panel->backlight.pwm_funcs->set(conn_state,
1528 				       intel_panel_invert_pwm_level(connector, level));
1529 }
1530 
intel_pwm_get_backlight(struct intel_connector * connector,enum pipe pipe)1531 static u32 intel_pwm_get_backlight(struct intel_connector *connector, enum pipe pipe)
1532 {
1533 	struct intel_panel *panel = &connector->panel;
1534 
1535 	return intel_panel_invert_pwm_level(connector,
1536 					    panel->backlight.pwm_funcs->get(connector, pipe));
1537 }
1538 
intel_pwm_enable_backlight(const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state,u32 level)1539 static void intel_pwm_enable_backlight(const struct intel_crtc_state *crtc_state,
1540 				       const struct drm_connector_state *conn_state, u32 level)
1541 {
1542 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
1543 	struct intel_panel *panel = &connector->panel;
1544 
1545 	panel->backlight.pwm_funcs->enable(crtc_state, conn_state,
1546 					   intel_panel_invert_pwm_level(connector, level));
1547 }
1548 
intel_pwm_disable_backlight(const struct drm_connector_state * conn_state,u32 level)1549 static void intel_pwm_disable_backlight(const struct drm_connector_state *conn_state, u32 level)
1550 {
1551 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
1552 	struct intel_panel *panel = &connector->panel;
1553 
1554 	panel->backlight.pwm_funcs->disable(conn_state,
1555 					    intel_panel_invert_pwm_level(connector, level));
1556 }
1557 
intel_pwm_setup_backlight(struct intel_connector * connector,enum pipe pipe)1558 static int intel_pwm_setup_backlight(struct intel_connector *connector, enum pipe pipe)
1559 {
1560 	struct intel_panel *panel = &connector->panel;
1561 	int ret = panel->backlight.pwm_funcs->setup(connector, pipe);
1562 
1563 	if (ret < 0)
1564 		return ret;
1565 
1566 	panel->backlight.min = panel->backlight.pwm_level_min;
1567 	panel->backlight.max = panel->backlight.pwm_level_max;
1568 	panel->backlight.level = intel_pwm_get_backlight(connector, pipe);
1569 	panel->backlight.enabled = panel->backlight.pwm_enabled;
1570 
1571 	return 0;
1572 }
1573 
intel_panel_update_backlight(struct intel_atomic_state * state,struct intel_encoder * encoder,const struct intel_crtc_state * crtc_state,const struct drm_connector_state * conn_state)1574 void intel_panel_update_backlight(struct intel_atomic_state *state,
1575 				  struct intel_encoder *encoder,
1576 				  const struct intel_crtc_state *crtc_state,
1577 				  const struct drm_connector_state *conn_state)
1578 {
1579 	struct intel_connector *connector = to_intel_connector(conn_state->connector);
1580 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1581 	struct intel_panel *panel = &connector->panel;
1582 
1583 	if (!panel->backlight.present)
1584 		return;
1585 
1586 	mutex_lock(&dev_priv->backlight_lock);
1587 	if (!panel->backlight.enabled)
1588 		__intel_panel_enable_backlight(crtc_state, conn_state);
1589 
1590 	mutex_unlock(&dev_priv->backlight_lock);
1591 }
1592 
intel_panel_setup_backlight(struct drm_connector * connector,enum pipe pipe)1593 int intel_panel_setup_backlight(struct drm_connector *connector, enum pipe pipe)
1594 {
1595 	struct drm_i915_private *dev_priv = to_i915(connector->dev);
1596 	struct intel_connector *intel_connector = to_intel_connector(connector);
1597 	struct intel_panel *panel = &intel_connector->panel;
1598 	int ret;
1599 
1600 	if (!dev_priv->vbt.backlight.present) {
1601 		if (dev_priv->quirks & QUIRK_BACKLIGHT_PRESENT) {
1602 			drm_dbg_kms(&dev_priv->drm,
1603 				    "no backlight present per VBT, but present per quirk\n");
1604 		} else {
1605 			drm_dbg_kms(&dev_priv->drm,
1606 				    "no backlight present per VBT\n");
1607 			return 0;
1608 		}
1609 	}
1610 
1611 	/* ensure intel_panel has been initialized first */
1612 	if (drm_WARN_ON(&dev_priv->drm, !panel->backlight.funcs))
1613 		return -ENODEV;
1614 
1615 	/* set level and max in panel struct */
1616 	mutex_lock(&dev_priv->backlight_lock);
1617 	ret = panel->backlight.funcs->setup(intel_connector, pipe);
1618 	mutex_unlock(&dev_priv->backlight_lock);
1619 
1620 	if (ret) {
1621 		drm_dbg_kms(&dev_priv->drm,
1622 			    "failed to setup backlight for connector %s\n",
1623 			    connector->name);
1624 		return ret;
1625 	}
1626 
1627 	panel->backlight.present = true;
1628 
1629 	drm_dbg_kms(&dev_priv->drm,
1630 		    "Connector %s backlight initialized, %s, brightness %u/%u\n",
1631 		    connector->name,
1632 		    enableddisabled(panel->backlight.enabled),
1633 		    panel->backlight.level, panel->backlight.max);
1634 
1635 	return 0;
1636 }
1637 
intel_panel_destroy_backlight(struct intel_panel * panel)1638 void intel_panel_destroy_backlight(struct intel_panel *panel)
1639 {
1640 	/* dispose of the pwm */
1641 	if (panel->backlight.pwm)
1642 		pwm_put(panel->backlight.pwm);
1643 
1644 	panel->backlight.present = false;
1645 }
1646 
1647 static const struct intel_panel_bl_funcs bxt_pwm_funcs = {
1648 	.setup = bxt_setup_backlight,
1649 	.enable = bxt_enable_backlight,
1650 	.disable = bxt_disable_backlight,
1651 	.set = bxt_set_backlight,
1652 	.get = bxt_get_backlight,
1653 	.hz_to_pwm = bxt_hz_to_pwm,
1654 };
1655 
1656 static const struct intel_panel_bl_funcs cnp_pwm_funcs = {
1657 	.setup = cnp_setup_backlight,
1658 	.enable = cnp_enable_backlight,
1659 	.disable = cnp_disable_backlight,
1660 	.set = bxt_set_backlight,
1661 	.get = bxt_get_backlight,
1662 	.hz_to_pwm = cnp_hz_to_pwm,
1663 };
1664 
1665 static const struct intel_panel_bl_funcs lpt_pwm_funcs = {
1666 	.setup = lpt_setup_backlight,
1667 	.enable = lpt_enable_backlight,
1668 	.disable = lpt_disable_backlight,
1669 	.set = lpt_set_backlight,
1670 	.get = lpt_get_backlight,
1671 	.hz_to_pwm = lpt_hz_to_pwm,
1672 };
1673 
1674 static const struct intel_panel_bl_funcs spt_pwm_funcs = {
1675 	.setup = lpt_setup_backlight,
1676 	.enable = lpt_enable_backlight,
1677 	.disable = lpt_disable_backlight,
1678 	.set = lpt_set_backlight,
1679 	.get = lpt_get_backlight,
1680 	.hz_to_pwm = spt_hz_to_pwm,
1681 };
1682 
1683 static const struct intel_panel_bl_funcs pch_pwm_funcs = {
1684 	.setup = pch_setup_backlight,
1685 	.enable = pch_enable_backlight,
1686 	.disable = pch_disable_backlight,
1687 	.set = pch_set_backlight,
1688 	.get = pch_get_backlight,
1689 	.hz_to_pwm = pch_hz_to_pwm,
1690 };
1691 
1692 static const struct intel_panel_bl_funcs ext_pwm_funcs = {
1693 	.setup = ext_pwm_setup_backlight,
1694 	.enable = ext_pwm_enable_backlight,
1695 	.disable = ext_pwm_disable_backlight,
1696 	.set = ext_pwm_set_backlight,
1697 	.get = ext_pwm_get_backlight,
1698 };
1699 
1700 static const struct intel_panel_bl_funcs vlv_pwm_funcs = {
1701 	.setup = vlv_setup_backlight,
1702 	.enable = vlv_enable_backlight,
1703 	.disable = vlv_disable_backlight,
1704 	.set = vlv_set_backlight,
1705 	.get = vlv_get_backlight,
1706 	.hz_to_pwm = vlv_hz_to_pwm,
1707 };
1708 
1709 static const struct intel_panel_bl_funcs i965_pwm_funcs = {
1710 	.setup = i965_setup_backlight,
1711 	.enable = i965_enable_backlight,
1712 	.disable = i965_disable_backlight,
1713 	.set = i9xx_set_backlight,
1714 	.get = i9xx_get_backlight,
1715 	.hz_to_pwm = i965_hz_to_pwm,
1716 };
1717 
1718 static const struct intel_panel_bl_funcs i9xx_pwm_funcs = {
1719 	.setup = i9xx_setup_backlight,
1720 	.enable = i9xx_enable_backlight,
1721 	.disable = i9xx_disable_backlight,
1722 	.set = i9xx_set_backlight,
1723 	.get = i9xx_get_backlight,
1724 	.hz_to_pwm = i9xx_hz_to_pwm,
1725 };
1726 
1727 static const struct intel_panel_bl_funcs pwm_bl_funcs = {
1728 	.setup = intel_pwm_setup_backlight,
1729 	.enable = intel_pwm_enable_backlight,
1730 	.disable = intel_pwm_disable_backlight,
1731 	.set = intel_pwm_set_backlight,
1732 	.get = intel_pwm_get_backlight,
1733 };
1734 
1735 /* Set up chip specific backlight functions */
1736 void
intel_panel_init_backlight_funcs(struct intel_panel * panel)1737 intel_panel_init_backlight_funcs(struct intel_panel *panel)
1738 {
1739 	struct intel_connector *connector =
1740 		container_of(panel, struct intel_connector, panel);
1741 	struct drm_i915_private *dev_priv = to_i915(connector->base.dev);
1742 
1743 	if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI &&
1744 	    intel_dsi_dcs_init_backlight_funcs(connector) == 0)
1745 		return;
1746 
1747 	if (IS_GEMINILAKE(dev_priv) || IS_BROXTON(dev_priv)) {
1748 		panel->backlight.pwm_funcs = &bxt_pwm_funcs;
1749 	} else if (INTEL_PCH_TYPE(dev_priv) >= PCH_CNP) {
1750 		panel->backlight.pwm_funcs = &cnp_pwm_funcs;
1751 	} else if (INTEL_PCH_TYPE(dev_priv) >= PCH_LPT) {
1752 		if (HAS_PCH_LPT(dev_priv))
1753 			panel->backlight.pwm_funcs = &lpt_pwm_funcs;
1754 		else
1755 			panel->backlight.pwm_funcs = &spt_pwm_funcs;
1756 	} else if (HAS_PCH_SPLIT(dev_priv)) {
1757 		panel->backlight.pwm_funcs = &pch_pwm_funcs;
1758 	} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) {
1759 		if (connector->base.connector_type == DRM_MODE_CONNECTOR_DSI) {
1760 			panel->backlight.pwm_funcs = &ext_pwm_funcs;
1761 		} else {
1762 			panel->backlight.pwm_funcs = &vlv_pwm_funcs;
1763 		}
1764 	} else if (DISPLAY_VER(dev_priv) == 4) {
1765 		panel->backlight.pwm_funcs = &i965_pwm_funcs;
1766 	} else {
1767 		panel->backlight.pwm_funcs = &i9xx_pwm_funcs;
1768 	}
1769 
1770 	if (connector->base.connector_type == DRM_MODE_CONNECTOR_eDP &&
1771 	    intel_dp_aux_init_backlight_funcs(connector) == 0)
1772 		return;
1773 
1774 	/* We're using a standard PWM backlight interface */
1775 	panel->backlight.funcs = &pwm_bl_funcs;
1776 }
1777