1/*-
2 * Copyright (c) 2015 Michal Meloun
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27#include <sys/cdefs.h>
28__FBSDID("$FreeBSD: stable/11/sys/arm/nvidia/drm2/tegra_hdmi.c 310600 2016-12-26 14:36:05Z mmel $");
29
30#include <sys/param.h>
31#include <sys/systm.h>
32#include <sys/bus.h>
33#include <sys/gpio.h>
34#include <sys/kernel.h>
35#include <sys/module.h>
36#include <sys/malloc.h>
37#include <sys/rman.h>
38#include <sys/sysctl.h>
39
40#include <machine/bus.h>
41
42#include <dev/extres/clk/clk.h>
43#include <dev/extres/hwreset/hwreset.h>
44#include <dev/extres/regulator/regulator.h>
45#include <dev/drm2/drmP.h>
46#include <dev/drm2/drm_crtc.h>
47#include <dev/drm2/drm_crtc_helper.h>
48#include <dev/drm2/drm_fb_helper.h>
49#include <dev/gpio/gpiobusvar.h>
50#include <dev/ofw/ofw_bus.h>
51#include <dev/ofw/ofw_bus_subr.h>
52
53#include <arm/nvidia/drm2/tegra_drm.h>
54#include <arm/nvidia/drm2/tegra_hdmi_reg.h>
55#include <arm/nvidia/drm2/tegra_dc_reg.h>
56#include <arm/nvidia/drm2/hdmi.h>
57
58#include "tegra_dc_if.h"
59#include "tegra_drm_if.h"
60
61#define	WR4(_sc, _r, _v)	bus_write_4((_sc)->mem_res, 4 * (_r), (_v))
62#define	RD4(_sc, _r)		bus_read_4((_sc)->mem_res, 4 * (_r))
63
64/* HDA stream format verb. */
65#define AC_FMT_CHAN_GET(x)		(((x) >>  0) & 0xf)
66#define AC_FMT_CHAN_BITS_GET(x)		(((x) >>  4) & 0x7)
67#define AC_FMT_DIV_GET(x)		(((x) >>  8) & 0x7)
68#define AC_FMT_MUL_GET(x)		(((x) >> 11) & 0x7)
69#define AC_FMT_BASE_44K			(1 << 14)
70#define AC_FMT_TYPE_NON_PCM		(1 << 15)
71
72#define	HDMI_REKEY_DEFAULT		56
73#define HDMI_ELD_BUFFER_SIZE		96
74
75#define	HDMI_DC_CLOCK_MULTIPIER		2
76
77struct audio_reg {
78	uint32_t	audio_clk;
79	bus_size_t	acr_reg;
80	bus_size_t	nval_reg;
81	bus_size_t	aval_reg;
82};
83
84static const struct audio_reg audio_regs[] =
85{
86	{
87		.audio_clk = 32000,
88		.acr_reg = HDMI_NV_PDISP_HDMI_ACR_0320_SUBPACK_LOW,
89		.nval_reg = HDMI_NV_PDISP_SOR_AUDIO_NVAL_0320,
90		.aval_reg = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0320,
91	},
92	{
93		.audio_clk = 44100,
94		.acr_reg = HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW,
95		.nval_reg = HDMI_NV_PDISP_SOR_AUDIO_NVAL_0441,
96		.aval_reg = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0441,
97	},
98	{
99		.audio_clk = 88200,
100		.acr_reg = HDMI_NV_PDISP_HDMI_ACR_0882_SUBPACK_LOW,
101		.nval_reg = HDMI_NV_PDISP_SOR_AUDIO_NVAL_0882,
102		.aval_reg = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0882,
103	},
104	{
105		.audio_clk = 176400,
106		.acr_reg = HDMI_NV_PDISP_HDMI_ACR_1764_SUBPACK_LOW,
107		.nval_reg = HDMI_NV_PDISP_SOR_AUDIO_NVAL_1764,
108		.aval_reg = HDMI_NV_PDISP_SOR_AUDIO_AVAL_1764,
109	},
110	{
111		.audio_clk = 48000,
112		.acr_reg = HDMI_NV_PDISP_HDMI_ACR_0480_SUBPACK_LOW,
113		.nval_reg = HDMI_NV_PDISP_SOR_AUDIO_NVAL_0480,
114		.aval_reg = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0480,
115	},
116	{
117		.audio_clk = 96000,
118		.acr_reg = HDMI_NV_PDISP_HDMI_ACR_0960_SUBPACK_LOW,
119		.nval_reg = HDMI_NV_PDISP_SOR_AUDIO_NVAL_0960,
120		.aval_reg = HDMI_NV_PDISP_SOR_AUDIO_AVAL_0960,
121	},
122	{
123		.audio_clk = 192000,
124		.acr_reg = HDMI_NV_PDISP_HDMI_ACR_1920_SUBPACK_LOW,
125		.nval_reg = HDMI_NV_PDISP_SOR_AUDIO_NVAL_1920,
126		.aval_reg = HDMI_NV_PDISP_SOR_AUDIO_AVAL_1920,
127	},
128};
129
130struct tmds_config {
131	uint32_t pclk;
132	uint32_t pll0;
133	uint32_t pll1;
134	uint32_t drive_c;
135	uint32_t pe_c;
136	uint32_t peak_c;
137	uint32_t pad_ctls;
138};
139
140static const struct tmds_config tegra124_tmds_config[] =
141{
142	{	/* 480p/576p / 25.2MHz/27MHz */
143		.pclk = 27000000,
144		.pll0 = 0x01003010,
145		.pll1 = 0x00301B00,
146		.drive_c = 0x1F1F1F1F,
147		.pe_c = 0x00000000,
148		.peak_c = 0x03030303,
149		.pad_ctls = 0x800034BB,
150	},
151	{	/* 720p/1080i / 74.25MHz  */
152		.pclk = 74250000,
153		.pll0 = 0x01003110,
154		.pll1 = 0x00301500,
155		.drive_c = 0x2C2C2C2C,
156		.pe_c = 0x00000000,
157		.peak_c = 0x07070707,
158		.pad_ctls = 0x800034BB,
159	},
160	{	 /* 1080p / 148.5MHz */
161		.pclk = 148500000,
162		.pll0 = 0x01003310,
163		.pll1 = 0x00301500,
164		.drive_c = 0x33333333,
165		.pe_c = 0x00000000,
166		.peak_c = 0x0C0C0C0C,
167		.pad_ctls = 0x800034BB,
168	},
169	{	/* 2216p / 297MHz  */
170		.pclk = UINT_MAX,
171		.pll0 = 0x01003F10,
172		.pll1 = 0x00300F00,
173		.drive_c = 0x37373737,
174		.pe_c = 0x00000000,
175		.peak_c = 0x17171717,
176		.pad_ctls = 0x800036BB,
177	},
178};
179
180
181struct hdmi_softc {
182	device_t		dev;
183	struct resource		*mem_res;
184	struct resource		*irq_res;
185	void			*irq_ih;
186
187	clk_t			clk_parent;
188	clk_t			clk_hdmi;
189	hwreset_t		hwreset_hdmi;
190	regulator_t		supply_hdmi;
191	regulator_t		supply_pll;
192	regulator_t		supply_vdd;
193
194	uint64_t		pclk;
195	boolean_t 		hdmi_mode;
196
197	int			audio_src_type;
198	int			audio_freq;
199	int			audio_chans;
200
201	struct tegra_drm 	*drm;
202	struct tegra_drm_encoder output;
203
204	const struct tmds_config *tmds_config;
205	int			n_tmds_configs;
206};
207
208static struct ofw_compat_data compat_data[] = {
209	{"nvidia,tegra124-hdmi",	1},
210	{NULL,				0},
211};
212
213/* These functions have been copied from newer version of drm_edid.c */
214/* ELD Header Block */
215#define DRM_ELD_HEADER_BLOCK_SIZE	4
216#define DRM_ELD_BASELINE_ELD_LEN	2       /* in dwords! */
217static int drm_eld_size(const uint8_t *eld)
218{
219	return DRM_ELD_HEADER_BLOCK_SIZE + eld[DRM_ELD_BASELINE_ELD_LEN] * 4;
220}
221
222static int
223drm_hdmi_avi_infoframe_from_display_mode(struct hdmi_avi_infoframe *frame,
224    struct drm_display_mode *mode)
225{
226	int rv;
227
228	if (!frame || !mode)
229		return -EINVAL;
230
231	rv = hdmi_avi_infoframe_init(frame);
232	if (rv < 0)
233		return rv;
234
235	if (mode->flags & DRM_MODE_FLAG_DBLCLK)
236		frame->pixel_repeat = 1;
237
238	frame->video_code = drm_match_cea_mode(mode);
239
240	frame->picture_aspect = HDMI_PICTURE_ASPECT_NONE;
241#ifdef FREEBSD_NOTYET
242	/*
243	 * Populate picture aspect ratio from either
244	 * user input (if specified) or from the CEA mode list.
245	*/
246	if (mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_4_3 ||
247	    mode->picture_aspect_ratio == HDMI_PICTURE_ASPECT_16_9)
248		frame->picture_aspect = mode->picture_aspect_ratio;
249	else if (frame->video_code > 0)
250		frame->picture_aspect = drm_get_cea_aspect_ratio(
251		    frame->video_code);
252#endif
253
254	frame->active_aspect = HDMI_ACTIVE_ASPECT_PICTURE;
255	frame->scan_mode = HDMI_SCAN_MODE_UNDERSCAN;
256
257	return 0;
258}
259/* --------------------------------------------------------------------- */
260
261static int
262hdmi_setup_clock(struct tegra_drm_encoder *output, clk_t clk, uint64_t pclk)
263{
264	struct hdmi_softc *sc;
265	uint64_t freq;
266	int rv;
267
268	sc = device_get_softc(output->dev);
269
270	/* Disable consumers clock for while. */
271	rv = clk_disable(sc->clk_hdmi);
272	if (rv != 0) {
273		device_printf(sc->dev, "Cannot disable 'hdmi' clock\n");
274		return (rv);
275	}
276	rv = clk_disable(clk);
277	if (rv != 0) {
278		device_printf(sc->dev, "Cannot disable display clock\n");
279		return (rv);
280	}
281
282	/* Set frequency  for Display Controller PLL. */
283	freq = HDMI_DC_CLOCK_MULTIPIER * pclk;
284	rv = clk_set_freq(sc->clk_parent, freq, 0);
285	if (rv != 0) {
286		device_printf(output->dev,
287		    "Cannot set display pixel frequency\n");
288		return (rv);
289	}
290
291	/* Reparent display controller */
292	rv = clk_set_parent_by_clk(clk, sc->clk_parent);
293	if (rv != 0) {
294		device_printf(output->dev, "Cannot set parent clock\n");
295		return (rv);
296
297	}
298	rv = clk_set_freq(clk, freq, 0);
299	if (rv != 0) {
300		device_printf(output->dev,
301		    "Cannot set display controller frequency\n");
302		return (rv);
303	}
304	rv = clk_set_freq(sc->clk_hdmi, pclk, 0);
305	if (rv != 0) {
306		device_printf(output->dev,
307		    "Cannot set display controller frequency\n");
308		return (rv);
309	}
310
311	/* And reenable consumers clock. */
312	rv = clk_enable(clk);
313	if (rv != 0) {
314		device_printf(sc->dev, "Cannot enable display clock\n");
315		return (rv);
316	}
317	rv = clk_enable(sc->clk_hdmi);
318	if (rv != 0) {
319		device_printf(sc->dev, "Cannot enable 'hdmi' clock\n");
320		return (rv);
321	}
322
323	rv = clk_get_freq(clk, &freq);
324	if (rv != 0) {
325		device_printf(output->dev,
326		    "Cannot get display controller frequency\n");
327		return (rv);
328	}
329
330	DRM_DEBUG_KMS("DC frequency: %llu\n", freq);
331
332	return (0);
333}
334
335/* -------------------------------------------------------------------
336 *
337 *	Infoframes.
338 *
339 */
340static void
341avi_setup_infoframe(struct hdmi_softc *sc, struct drm_display_mode *mode)
342{
343	struct hdmi_avi_infoframe frame;
344	uint8_t buf[17], *hdr, *pb;;
345	ssize_t rv;
346
347	rv = drm_hdmi_avi_infoframe_from_display_mode(&frame, mode);
348	if (rv < 0) {
349		device_printf(sc->dev, "Cannot setup AVI infoframe: %zd\n", rv);
350		return;
351	}
352	rv = hdmi_avi_infoframe_pack(&frame, buf, sizeof(buf));
353	if (rv < 0) {
354		device_printf(sc->dev, "Cannot pack AVI infoframe: %zd\n", rv);
355		return;
356	}
357	hdr = buf + 0;
358	pb = buf + 3;
359	WR4(sc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_HEADER,
360	    (hdr[2] << 16) | (hdr[1] << 8) | (hdr[0] << 0));
361	WR4(sc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_LOW,
362	    (pb[3] << 24) |(pb[2] << 16) | (pb[1] << 8) | (pb[0] << 0));
363	WR4(sc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK0_HIGH,
364	    (pb[6] << 16) | (pb[5] << 8) | (pb[4] << 0));
365	WR4(sc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_LOW,
366	    (pb[10] << 24) |(pb[9] << 16) | (pb[8] << 8) | (pb[7] << 0));
367	WR4(sc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_SUBPACK1_HIGH,
368	    (pb[13] << 16) | (pb[12] << 8) | (pb[11] << 0));
369
370	WR4(sc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL,
371	   AVI_INFOFRAME_CTRL_ENABLE);
372}
373
374static void
375audio_setup_infoframe(struct hdmi_softc *sc)
376{
377	struct hdmi_audio_infoframe frame;
378	uint8_t buf[14], *hdr, *pb;
379	ssize_t rv;
380
381
382	rv = hdmi_audio_infoframe_init(&frame);
383	frame.channels = sc->audio_chans;
384	rv = hdmi_audio_infoframe_pack(&frame, buf, sizeof(buf));
385	if (rv < 0) {
386		device_printf(sc->dev, "Cannot pack audio infoframe\n");
387		return;
388	}
389	hdr = buf + 0;
390	pb = buf + 3;
391	WR4(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_HEADER,
392	    (hdr[2] << 16) | (hdr[1] << 8) | (hdr[0] << 0));
393	WR4(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_LOW,
394	    (pb[3] << 24) |(pb[2] << 16) | (pb[1] << 8) | (pb[0] << 0));
395	WR4(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_SUBPACK0_HIGH,
396	    (pb[5] << 8) | (pb[4] << 0));
397
398	WR4(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL,
399	   AUDIO_INFOFRAME_CTRL_ENABLE);
400}
401
402/* -------------------------------------------------------------------
403 *
404 *	Audio
405 *
406 */
407static void
408init_hda_eld(struct hdmi_softc *sc)
409{
410	size_t size;
411	int i ;
412	uint32_t val;
413
414	size = drm_eld_size(sc->output.connector.eld);
415	for (i = 0; i < HDMI_ELD_BUFFER_SIZE; i++) {
416		val = i << 8;
417		if (i < size)
418			val |= sc->output.connector.eld[i];
419		WR4(sc, HDMI_NV_PDISP_SOR_AUDIO_HDA_ELD_BUFWR, val);
420	}
421	WR4(sc,HDMI_NV_PDISP_SOR_AUDIO_HDA_PRESENSE,
422	    SOR_AUDIO_HDA_PRESENSE_VALID | SOR_AUDIO_HDA_PRESENSE_PRESENT);
423}
424
425static int
426get_audio_regs(int freq, bus_size_t *acr_reg, bus_size_t *nval_reg,
427    bus_size_t *aval_reg)
428{
429	int i;
430	const struct audio_reg *reg;
431
432	for (i = 0; i < nitems(audio_regs) ; i++) {
433		reg = audio_regs + i;
434		if (reg->audio_clk == freq) {
435			if (acr_reg != NULL)
436				*acr_reg = reg->acr_reg;
437			if (nval_reg != NULL)
438				*nval_reg = reg->nval_reg;
439			if (aval_reg != NULL)
440				*aval_reg = reg->aval_reg;
441			return (0);
442		}
443	}
444	return (ERANGE);
445}
446
447#define FR_BITS 16
448#define TO_FFP(x) (((int64_t)(x)) << FR_BITS)
449#define TO_INT(x) ((int)((x) >> FR_BITS))
450static int
451get_hda_cts_n(uint32_t audio_freq_hz, uint32_t pixclk_freq_hz,
452    uint32_t *best_cts, uint32_t *best_n, uint32_t *best_a)
453{
454	int min_n;
455	int max_n;
456	int ideal_n;
457	int n;
458	int cts;
459	int aval;
460	int64_t err_f;
461	int64_t min_err_f;
462	int64_t cts_f;
463	int64_t aval_f;
464	int64_t half_f;		/* constant 0.5 */
465	bool better_n;
466
467	/*
468	 * All floats are in fixed I48.16 format.
469	 *
470	 * Ideal ACR interval is 1000 hz (1 ms);
471	 * acceptable is 300 hz .. 1500 hz
472	 */
473	min_n = 128 * audio_freq_hz / 1500;
474	max_n = 128 * audio_freq_hz / 300;
475	ideal_n = 128 * audio_freq_hz / 1000;
476	min_err_f = TO_FFP(100);
477	half_f = TO_FFP(1) / 2;
478
479	*best_n = 0;
480	*best_cts = 0;
481	*best_a = 0;
482
483	for (n = min_n; n <= max_n; n++) {
484		cts_f = TO_FFP(pixclk_freq_hz);
485		cts_f *= n;
486		cts_f /= 128 * audio_freq_hz;
487		cts = TO_INT(cts_f + half_f);		/* round */
488		err_f = cts_f - TO_FFP(cts);
489		if (err_f < 0)
490			err_f = -err_f;
491		aval_f = TO_FFP(24000000);
492		aval_f *= n;
493		aval_f /= 128 * audio_freq_hz;
494		aval = TO_INT(aval_f);			/* truncate */
495
496		better_n = abs(n - ideal_n) < abs((int)(*best_n) - ideal_n);
497		if (TO_FFP(aval) == aval_f &&
498		    (err_f < min_err_f || (err_f == min_err_f && better_n))) {
499
500			min_err_f = err_f;
501			*best_n = (uint32_t)n;
502			*best_cts = (uint32_t)cts;
503			*best_a = (uint32_t)aval;
504
505			if (err_f == 0 && n == ideal_n)
506				break;
507		}
508	}
509	return (0);
510}
511#undef FR_BITS
512#undef TO_FFP
513#undef TO_INT
514
515static int
516audio_setup(struct hdmi_softc *sc)
517{
518	uint32_t val;
519	uint32_t audio_n;
520	uint32_t audio_cts;
521	uint32_t audio_aval;
522	uint64_t hdmi_freq;
523	bus_size_t aval_reg;
524	int rv;
525
526	if (!sc->hdmi_mode)
527		return (ENOTSUP);
528	rv  = get_audio_regs(sc->audio_freq, NULL, NULL, &aval_reg);
529	if (rv != 0) {
530		device_printf(sc->dev, "Unsupported audio frequency.\n");
531		return (rv);
532	}
533
534	rv = clk_get_freq(sc->clk_hdmi, &hdmi_freq);
535	if (rv != 0) {
536		device_printf(sc->dev, "Cannot get hdmi frequency: %d\n", rv);
537		return (rv);
538	}
539
540	rv = get_hda_cts_n(sc->audio_freq, hdmi_freq, &audio_cts, &audio_n,
541	    &audio_aval);
542	if (rv != 0) {
543		device_printf(sc->dev, "Cannot compute audio coefs: %d\n", rv);
544		return (rv);
545	}
546
547	/* Audio infoframe. */
548	audio_setup_infoframe(sc);
549	/* Setup audio source */
550	WR4(sc, HDMI_NV_PDISP_SOR_AUDIO_CNTRL0,
551	    SOR_AUDIO_CNTRL0_SOURCE_SELECT(sc->audio_src_type) |
552	    SOR_AUDIO_CNTRL0_INJECT_NULLSMPL);
553
554	val = RD4(sc, HDMI_NV_PDISP_SOR_AUDIO_SPARE0);
555	val |= SOR_AUDIO_SPARE0_HBR_ENABLE;
556	WR4(sc, HDMI_NV_PDISP_SOR_AUDIO_SPARE0, val);
557
558	WR4(sc, HDMI_NV_PDISP_HDMI_ACR_CTRL, 0);
559
560	WR4(sc, HDMI_NV_PDISP_AUDIO_N,
561	    AUDIO_N_RESETF |
562	    AUDIO_N_GENERATE_ALTERNATE |
563	    AUDIO_N_VALUE(audio_n - 1));
564
565	WR4(sc, HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_HIGH,
566	    ACR_SUBPACK_N(audio_n) | ACR_ENABLE);
567
568	WR4(sc, HDMI_NV_PDISP_HDMI_ACR_0441_SUBPACK_LOW,
569	    ACR_SUBPACK_CTS(audio_cts));
570
571	WR4(sc, HDMI_NV_PDISP_HDMI_SPARE,
572	    SPARE_HW_CTS | SPARE_FORCE_SW_CTS | SPARE_CTS_RESET_VAL(1));
573
574	val = RD4(sc, HDMI_NV_PDISP_AUDIO_N);
575	val &= ~AUDIO_N_RESETF;
576	WR4(sc, HDMI_NV_PDISP_AUDIO_N, val);
577
578	WR4(sc, aval_reg, audio_aval);
579
580	return (0);
581}
582
583static void
584audio_disable(struct hdmi_softc *sc) {
585	uint32_t val;
586
587	/* Disable audio */
588	val = RD4(sc,  HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
589	val &= ~GENERIC_CTRL_AUDIO;
590	WR4(sc, HDMI_NV_PDISP_HDMI_GENERIC_CTRL, val);
591
592	/* Disable audio infoframes */
593	val = RD4(sc,  HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
594	val &= ~AUDIO_INFOFRAME_CTRL_ENABLE;
595	WR4(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL, val);
596}
597
598static void
599audio_enable(struct hdmi_softc *sc) {
600	uint32_t val;
601
602	if (!sc->hdmi_mode)
603		audio_disable(sc);
604
605	/* Enable audio infoframes */
606	val = RD4(sc,  HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL);
607	val |= AUDIO_INFOFRAME_CTRL_ENABLE;
608	WR4(sc, HDMI_NV_PDISP_HDMI_AUDIO_INFOFRAME_CTRL, val);
609
610	/* Enable audio */
611	val = RD4(sc,  HDMI_NV_PDISP_HDMI_GENERIC_CTRL);
612	val |= GENERIC_CTRL_AUDIO;
613	WR4(sc, HDMI_NV_PDISP_HDMI_GENERIC_CTRL, val);
614}
615
616/* -------------------------------------------------------------------
617 *
618 *    HDMI.
619 *
620 */
621 /* Process format change notification from HDA */
622static void
623hda_intr(struct hdmi_softc *sc)
624{
625	uint32_t val;
626	int rv;
627
628	if (!sc->hdmi_mode)
629		return;
630
631	val = RD4(sc, HDMI_NV_PDISP_SOR_AUDIO_HDA_CODEC_SCRATCH0);
632	if ((val & (1 << 30)) == 0) {
633		audio_disable(sc);
634		return;
635	}
636
637	/* XXX Move this to any header */
638	/* Keep in sync with HDA */
639	sc->audio_freq =  val & 0x00FFFFFF;
640	sc->audio_chans = (val >> 24) & 0x0f;
641	DRM_DEBUG_KMS("%d channel(s) at %dHz\n", sc->audio_chans,
642	    sc->audio_freq);
643
644	rv = audio_setup(sc);
645	if (rv != 0) {
646		audio_disable(sc);
647		return;
648	}
649
650	audio_enable(sc);
651}
652
653static void
654tmds_init(struct hdmi_softc *sc, const struct tmds_config *tmds)
655{
656
657	WR4(sc, HDMI_NV_PDISP_SOR_PLL0, tmds->pll0);
658	WR4(sc, HDMI_NV_PDISP_SOR_PLL1, tmds->pll1);
659	WR4(sc, HDMI_NV_PDISP_PE_CURRENT, tmds->pe_c);
660	WR4(sc, HDMI_NV_PDISP_SOR_LANE_DRIVE_CURRENT, tmds->drive_c);
661	WR4(sc, HDMI_NV_PDISP_SOR_IO_PEAK_CURRENT, tmds->peak_c);
662	WR4(sc, HDMI_NV_PDISP_SOR_PAD_CTLS0, tmds->pad_ctls);
663}
664
665static int
666hdmi_sor_start(struct hdmi_softc *sc, struct drm_display_mode *mode)
667{
668	int i;
669	uint32_t val;
670
671	/* Enable TMDS macro */
672	val = RD4(sc, HDMI_NV_PDISP_SOR_PLL0);
673	val &= ~SOR_PLL0_PWR;
674	val &= ~SOR_PLL0_VCOPD;
675	val &= ~SOR_PLL0_PULLDOWN;
676	WR4(sc, HDMI_NV_PDISP_SOR_PLL0, val);
677	DELAY(10);
678
679	val = RD4(sc, HDMI_NV_PDISP_SOR_PLL0);
680	val &= ~SOR_PLL0_PDBG;
681	WR4(sc, HDMI_NV_PDISP_SOR_PLL0, val);
682
683	WR4(sc, HDMI_NV_PDISP_SOR_PWR, SOR_PWR_SETTING_NEW);
684	WR4(sc, HDMI_NV_PDISP_SOR_PWR, 0);
685
686	/* Wait until SOR is ready */
687	for (i = 1000; i > 0; i--) {
688		val = RD4(sc, HDMI_NV_PDISP_SOR_PWR);
689		if ((val & SOR_PWR_SETTING_NEW) == 0)
690			break;
691		DELAY(10);
692	}
693	if (i <= 0) {
694		device_printf(sc->dev, "Timeouted while enabling SOR power.\n");
695		return (ETIMEDOUT);
696	}
697
698	val = SOR_STATE2_ASY_OWNER(ASY_OWNER_HEAD0) |
699	    SOR_STATE2_ASY_SUBOWNER(SUBOWNER_BOTH) |
700	    SOR_STATE2_ASY_CRCMODE(ASY_CRCMODE_COMPLETE) |
701	    SOR_STATE2_ASY_PROTOCOL(ASY_PROTOCOL_SINGLE_TMDS_A);
702	if (mode->flags & DRM_MODE_FLAG_NHSYNC)
703		val |= SOR_STATE2_ASY_HSYNCPOL_NEG;
704	if (mode->flags & DRM_MODE_FLAG_NVSYNC)
705		val |= SOR_STATE2_ASY_VSYNCPOL_NEG;
706	WR4(sc, HDMI_NV_PDISP_SOR_STATE2, val);
707
708	WR4(sc, HDMI_NV_PDISP_SOR_STATE1, SOR_STATE1_ASY_ORMODE_NORMAL |
709	    SOR_STATE1_ASY_HEAD_OPMODE(ASY_HEAD_OPMODE_AWAKE));
710
711	WR4(sc, HDMI_NV_PDISP_SOR_STATE0, 0);
712	WR4(sc, HDMI_NV_PDISP_SOR_STATE0, SOR_STATE0_UPDATE);
713
714	val = RD4(sc, HDMI_NV_PDISP_SOR_STATE1);
715	val |= SOR_STATE1_ATTACHED;
716	WR4(sc, HDMI_NV_PDISP_SOR_STATE1, val);
717
718	WR4(sc, HDMI_NV_PDISP_SOR_STATE0, 0);
719
720	return 0;
721}
722
723static int
724hdmi_disable(struct hdmi_softc *sc)
725{
726	struct tegra_crtc *crtc;
727	device_t dc;
728	uint32_t val;
729
730	dc = NULL;
731	if (sc->output.encoder.crtc != NULL) {
732		crtc = container_of(sc->output.encoder.crtc, struct tegra_crtc,
733		     drm_crtc);
734		dc = crtc->dev;
735	}
736
737	if (dc != NULL) {
738		TEGRA_DC_HDMI_ENABLE(dc, false);
739		TEGRA_DC_DISPLAY_ENABLE(dc, false);
740	}
741	audio_disable(sc);
742	val = RD4(sc,  HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL);
743	val &= ~AVI_INFOFRAME_CTRL_ENABLE;
744	WR4(sc, HDMI_NV_PDISP_HDMI_AVI_INFOFRAME_CTRL, val);
745
746	/* Disable interrupts */
747	WR4(sc, HDMI_NV_PDISP_INT_ENABLE, 0);
748	WR4(sc, HDMI_NV_PDISP_INT_MASK, 0);
749
750	return (0);
751}
752
753static int
754hdmi_enable(struct hdmi_softc *sc)
755{
756	uint64_t freq;
757	struct drm_display_mode *mode;
758	struct tegra_crtc *crtc;
759	uint32_t val, h_sync_width, h_back_porch, h_front_porch, h_pulse_start;
760	uint32_t h_max_ac_packet, div8_2;
761	device_t dc;
762	int i, rv;
763
764	mode = &sc->output.encoder.crtc->mode;
765	crtc = container_of(sc->output.encoder.crtc, struct tegra_crtc,
766	    drm_crtc);
767	dc = crtc->dev;
768
769	/* Compute all timings first. */
770	sc->pclk = mode->clock * 1000;
771	h_sync_width = mode->hsync_end - mode->hsync_start;
772	h_back_porch = mode->htotal - mode->hsync_end;
773	h_front_porch = mode->hsync_start - mode->hdisplay;
774	h_pulse_start = 1 + h_sync_width + h_back_porch - 10;
775	h_max_ac_packet = (h_sync_width + h_back_porch + h_front_porch -
776	    HDMI_REKEY_DEFAULT - 18) / 32;
777
778	/* Check if HDMI device is connected and detected. */
779	if (sc->output.connector.edid_blob_ptr == NULL) {
780		sc->hdmi_mode = false;
781	} else {
782		sc->hdmi_mode = drm_detect_hdmi_monitor(
783		    (struct edid *)sc->output.connector.edid_blob_ptr->data);
784	}
785
786	/* Get exact HDMI pixel frequency. */
787	rv = clk_get_freq(sc->clk_hdmi, &freq);
788	if (rv != 0) {
789		device_printf(sc->dev,
790		    "Cannot get 'hdmi' clock frequency\n");
791		    return (rv);
792	}
793	DRM_DEBUG_KMS("HDMI frequency: %llu Hz\n", freq);
794
795	/* Wakeup SOR power */
796	val = RD4(sc, HDMI_NV_PDISP_SOR_PLL0);
797	val &= ~SOR_PLL0_PDBG;
798	WR4(sc, HDMI_NV_PDISP_SOR_PLL0, val);
799	DELAY(10);
800
801	val = RD4(sc, HDMI_NV_PDISP_SOR_PLL0);
802	val &= ~SOR_PLL0_PWR;
803	WR4(sc, HDMI_NV_PDISP_SOR_PLL0, val);
804
805	/* Setup timings */
806	TEGRA_DC_SETUP_TIMING(dc, h_pulse_start);
807	WR4(sc, HDMI_NV_PDISP_HDMI_VSYNC_WINDOW,
808	    VSYNC_WINDOW_START(0x200) | VSYNC_WINDOW_END(0x210) |
809	    VSYNC_WINDOW_ENABLE);
810
811	/* Setup video source and adjust video range */
812	val = 0;
813	if  (crtc->nvidia_head != 0)
814		HDMI_SRC_DISPLAYB;
815	if ((mode->hdisplay != 640) || (mode->vdisplay != 480))
816		val |= ARM_VIDEO_RANGE_LIMITED;
817	WR4(sc, HDMI_NV_PDISP_INPUT_CONTROL, val);
818
819	/* Program SOR reference clock - it uses 8.2 fractional divisor */
820	div8_2 = (freq * 4) / 1000000;
821	val = SOR_REFCLK_DIV_INT(div8_2 >> 2) | SOR_REFCLK_DIV_FRAC(div8_2);
822	WR4(sc, HDMI_NV_PDISP_SOR_REFCLK, val);
823
824	/* Setup audio */
825	if (sc->hdmi_mode) {
826		rv = audio_setup(sc);
827		if (rv != 0)
828			sc->hdmi_mode = false;
829	}
830
831	/* Init HDA ELD */
832	init_hda_eld(sc);
833	val = HDMI_CTRL_REKEY(HDMI_REKEY_DEFAULT);
834	val |= HDMI_CTRL_MAX_AC_PACKET(h_max_ac_packet);
835	if (sc->hdmi_mode)
836		val |= HDMI_CTRL_ENABLE;
837	WR4(sc, HDMI_NV_PDISP_HDMI_CTRL, val);
838
839	/* Setup TMDS */
840	for (i = 0; i < sc->n_tmds_configs; i++) {
841		if (sc->pclk <= sc->tmds_config[i].pclk) {
842			tmds_init(sc, sc->tmds_config + i);
843			break;
844		}
845	}
846
847	/* Program sequencer. */
848	WR4(sc, HDMI_NV_PDISP_SOR_SEQ_CTL,
849	    SOR_SEQ_PU_PC(0) | SOR_SEQ_PU_PC_ALT(0) |
850	    SOR_SEQ_PD_PC(8) | SOR_SEQ_PD_PC_ALT(8));
851
852	val = SOR_SEQ_INST_WAIT_TIME(1) |
853	    SOR_SEQ_INST_WAIT_UNITS(WAIT_UNITS_VSYNC) |
854	    SOR_SEQ_INST_HALT |
855	    SOR_SEQ_INST_DRIVE_PWM_OUT_LO;
856	WR4(sc, HDMI_NV_PDISP_SOR_SEQ_INST(0), val);
857	WR4(sc, HDMI_NV_PDISP_SOR_SEQ_INST(8), val);
858
859	val = RD4(sc,HDMI_NV_PDISP_SOR_CSTM);
860	val &= ~SOR_CSTM_LVDS_ENABLE;
861	val &= ~SOR_CSTM_ROTCLK(~0);
862	val |= SOR_CSTM_ROTCLK(2);
863	val &= ~SOR_CSTM_MODE(~0);
864	val |= SOR_CSTM_MODE(CSTM_MODE_TMDS);
865	val |= SOR_CSTM_PLLDIV;
866	WR4(sc, HDMI_NV_PDISP_SOR_CSTM, val);
867
868	TEGRA_DC_DISPLAY_ENABLE(dc, false);
869
870	rv = hdmi_sor_start(sc, mode);
871	if (rv != 0)
872		return (rv);
873
874	TEGRA_DC_HDMI_ENABLE(dc, true);
875	TEGRA_DC_DISPLAY_ENABLE(dc, true);
876
877	/* Enable HDA codec interrupt */
878	WR4(sc, HDMI_NV_PDISP_INT_MASK, INT_CODEC_SCRATCH0);
879	WR4(sc, HDMI_NV_PDISP_INT_ENABLE, INT_CODEC_SCRATCH0);
880
881	if (sc->hdmi_mode) {
882		avi_setup_infoframe(sc, mode);
883		audio_enable(sc);
884	}
885
886	return (0);
887}
888
889/* -------------------------------------------------------------------
890 *
891 *	DRM Interface.
892 *
893 */
894static enum drm_mode_status
895hdmi_connector_mode_valid(struct drm_connector *connector,
896    struct drm_display_mode *mode)
897{
898	struct tegra_drm_encoder *output;
899	struct hdmi_softc *sc;
900	int rv;
901	uint64_t freq;
902
903	output = container_of(connector, struct tegra_drm_encoder,
904	     connector);
905	sc = device_get_softc(output->dev);
906
907	freq = HDMI_DC_CLOCK_MULTIPIER * mode->clock * 1000;
908	rv = clk_test_freq(sc->clk_parent, freq, 0);
909	DRM_DEBUG_KMS("Test HDMI frequency: %u kHz, rv: %d\n", mode->clock, rv);
910	if (rv != 0)
911		return (MODE_NOCLOCK);
912
913	return (MODE_OK);
914}
915
916
917static const struct drm_connector_helper_funcs hdmi_connector_helper_funcs = {
918	.get_modes = tegra_drm_connector_get_modes,
919	.mode_valid = hdmi_connector_mode_valid,
920	.best_encoder = tegra_drm_connector_best_encoder,
921};
922
923static const struct drm_connector_funcs hdmi_connector_funcs = {
924	.dpms = drm_helper_connector_dpms,
925	.detect = tegra_drm_connector_detect,
926	.fill_modes = drm_helper_probe_single_connector_modes,
927	.destroy = drm_connector_cleanup,
928};
929
930static const struct drm_encoder_funcs hdmi_encoder_funcs = {
931	.destroy = drm_encoder_cleanup,
932};
933
934static void
935hdmi_encoder_dpms(struct drm_encoder *encoder, int mode)
936{
937
938	/* Empty function. */
939}
940
941static bool
942hdmi_encoder_mode_fixup(struct drm_encoder *encoder,
943    const struct drm_display_mode *mode,
944    struct drm_display_mode *adjusted)
945{
946
947	return (true);
948}
949
950static void
951hdmi_encoder_prepare(struct drm_encoder *encoder)
952{
953
954	/* Empty function. */
955}
956
957static void
958hdmi_encoder_commit(struct drm_encoder *encoder)
959{
960
961	/* Empty function. */
962}
963
964static void
965hdmi_encoder_mode_set(struct drm_encoder *encoder,
966    struct drm_display_mode *mode, struct drm_display_mode *adjusted)
967{
968	struct tegra_drm_encoder *output;
969	struct hdmi_softc *sc;
970	int rv;
971
972	output = container_of(encoder, struct tegra_drm_encoder, encoder);
973	sc = device_get_softc(output->dev);
974	rv = hdmi_enable(sc);
975	if (rv != 0)
976		device_printf(sc->dev, "Cannot enable HDMI port\n");
977
978}
979
980static void
981hdmi_encoder_disable(struct drm_encoder *encoder)
982{
983	struct tegra_drm_encoder *output;
984	struct hdmi_softc *sc;
985	int rv;
986
987	output = container_of(encoder, struct tegra_drm_encoder, encoder);
988	sc = device_get_softc(output->dev);
989	if (sc == NULL)
990		return;
991	rv = hdmi_disable(sc);
992	if (rv != 0)
993		device_printf(sc->dev, "Cannot disable HDMI port\n");
994}
995
996static const struct drm_encoder_helper_funcs hdmi_encoder_helper_funcs = {
997	.dpms = hdmi_encoder_dpms,
998	.mode_fixup = hdmi_encoder_mode_fixup,
999	.prepare = hdmi_encoder_prepare,
1000	.commit = hdmi_encoder_commit,
1001	.mode_set = hdmi_encoder_mode_set,
1002	.disable = hdmi_encoder_disable,
1003};
1004
1005/* -------------------------------------------------------------------
1006 *
1007 *	Bus and infrastructure.
1008 *
1009 */
1010static int
1011hdmi_init_client(device_t dev, device_t host1x, struct tegra_drm *drm)
1012{
1013	struct hdmi_softc *sc;
1014	phandle_t node;
1015	int rv;
1016
1017	sc = device_get_softc(dev);
1018	node = ofw_bus_get_node(sc->dev);
1019	sc->drm = drm;
1020	sc->output.setup_clock = &hdmi_setup_clock;
1021
1022	rv = tegra_drm_encoder_attach(&sc->output, node);
1023	if (rv != 0) {
1024		device_printf(dev, "Cannot attach output connector\n");
1025		return(ENXIO);
1026	}
1027
1028	/* Connect this encoder + connector  to DRM. */
1029	drm_connector_init(&drm->drm_dev, &sc->output.connector,
1030	   &hdmi_connector_funcs, DRM_MODE_CONNECTOR_HDMIA);
1031
1032	drm_connector_helper_add(&sc->output.connector,
1033	    &hdmi_connector_helper_funcs);
1034
1035	sc->output.connector.dpms = DRM_MODE_DPMS_OFF;
1036
1037	drm_encoder_init(&drm->drm_dev, &sc->output.encoder,
1038	    &hdmi_encoder_funcs, DRM_MODE_ENCODER_TMDS);
1039
1040	drm_encoder_helper_add(&sc->output.encoder, &hdmi_encoder_helper_funcs);
1041
1042	drm_mode_connector_attach_encoder(&sc->output.connector,
1043	  &sc->output.encoder);
1044
1045	rv = tegra_drm_encoder_init(&sc->output, drm);
1046	if (rv < 0) {
1047		device_printf(sc->dev, "Unable to init HDMI output\n");
1048		return (rv);
1049	}
1050	sc->output.encoder.possible_crtcs = 0x3;
1051	return (0);
1052}
1053
1054static int
1055hdmi_exit_client(device_t dev, device_t host1x, struct tegra_drm *drm)
1056{
1057	struct hdmi_softc *sc;
1058
1059	sc = device_get_softc(dev);
1060	tegra_drm_encoder_exit(&sc->output, drm);
1061	return (0);
1062}
1063
1064static int
1065get_fdt_resources(struct hdmi_softc *sc, phandle_t node)
1066{
1067	int rv;
1068
1069	rv = regulator_get_by_ofw_property(sc->dev, 0, "hdmi-supply",
1070	    &sc->supply_hdmi);
1071	if (rv != 0) {
1072		device_printf(sc->dev, "Cannot get 'hdmi' regulator\n");
1073		return (ENXIO);
1074	}
1075	rv = regulator_get_by_ofw_property(sc->dev,0,  "pll-supply",
1076	    &sc->supply_pll);
1077	if (rv != 0) {
1078		device_printf(sc->dev, "Cannot get 'pll' regulator\n");
1079		return (ENXIO);
1080	}
1081	rv = regulator_get_by_ofw_property(sc->dev, 0, "vdd-supply",
1082	    &sc->supply_vdd);
1083	if (rv != 0) {
1084		device_printf(sc->dev, "Cannot get 'vdd' regulator\n");
1085		return (ENXIO);
1086	}
1087
1088	rv = hwreset_get_by_ofw_name(sc->dev, 0, "hdmi", &sc->hwreset_hdmi);
1089	if (rv != 0) {
1090		device_printf(sc->dev, "Cannot get 'hdmi' reset\n");
1091		return (ENXIO);
1092	}
1093	rv = clk_get_by_ofw_name(sc->dev, 0, "parent", &sc->clk_parent);
1094	if (rv != 0) {
1095		device_printf(sc->dev, "Cannot get 'parent' clock\n");
1096		return (ENXIO);
1097	}
1098	rv = clk_get_by_ofw_name(sc->dev, 0, "hdmi", &sc->clk_hdmi);
1099	if (rv != 0) {
1100		device_printf(sc->dev, "Cannot get 'hdmi' clock\n");
1101		return (ENXIO);
1102	}
1103
1104	return (0);
1105}
1106
1107static int
1108enable_fdt_resources(struct hdmi_softc *sc)
1109{
1110	int rv;
1111
1112
1113	rv = clk_set_parent_by_clk(sc->clk_hdmi, sc->clk_parent);
1114	if (rv != 0) {
1115		device_printf(sc->dev,
1116		    "Cannot set parent for 'hdmi' clock\n");
1117		return (rv);
1118	}
1119
1120	/* 594 MHz is arbitrarily selected value */
1121	rv = clk_set_freq(sc->clk_parent, 594000000, 0);
1122	if (rv != 0) {
1123		device_printf(sc->dev,
1124		    "Cannot set frequency for 'hdmi' parent clock\n");
1125		return (rv);
1126	}
1127	rv = clk_set_freq(sc->clk_hdmi, 594000000 / 4, 0);
1128	if (rv != 0) {
1129		device_printf(sc->dev,
1130		    "Cannot set frequency for 'hdmi' parent clock\n");
1131		return (rv);
1132	}
1133
1134	rv = regulator_enable(sc->supply_hdmi);
1135	if (rv != 0) {
1136		device_printf(sc->dev, "Cannot enable  'hdmi' regulator\n");
1137		return (rv);
1138	}
1139	rv = regulator_enable(sc->supply_pll);
1140	if (rv != 0) {
1141		device_printf(sc->dev, "Cannot enable  'pll' regulator\n");
1142		return (rv);
1143	}
1144	rv = regulator_enable(sc->supply_vdd);
1145	if (rv != 0) {
1146		device_printf(sc->dev, "Cannot enable  'vdd' regulator\n");
1147		return (rv);
1148	}
1149
1150	rv = clk_enable(sc->clk_hdmi);
1151	if (rv != 0) {
1152		device_printf(sc->dev, "Cannot enable 'hdmi' clock\n");
1153		return (rv);
1154	}
1155
1156	rv = hwreset_deassert(sc->hwreset_hdmi);
1157	if (rv != 0) {
1158		device_printf(sc->dev, "Cannot unreset  'hdmi' reset\n");
1159		return (rv);
1160	}
1161	return (0);
1162}
1163
1164static void
1165hdmi_intr(void *arg)
1166{
1167	struct hdmi_softc *sc;
1168	uint32_t status;
1169
1170	sc = arg;
1171
1172	/* Confirm interrupt */
1173	status = RD4(sc, HDMI_NV_PDISP_INT_STATUS);
1174	WR4(sc, HDMI_NV_PDISP_INT_STATUS, status);
1175
1176	/* process audio verb from HDA */
1177	if (status & INT_CODEC_SCRATCH0)
1178		hda_intr(sc);
1179}
1180
1181static int
1182hdmi_probe(device_t dev)
1183{
1184
1185	if (!ofw_bus_status_okay(dev))
1186		return (ENXIO);
1187
1188	if (ofw_bus_search_compatible(dev, compat_data)->ocd_data == 0)
1189		return (ENXIO);
1190
1191	device_set_desc(dev, "Tegra HDMI");
1192	return (BUS_PROBE_DEFAULT);
1193}
1194
1195static int
1196hdmi_attach(device_t dev)
1197{
1198	struct hdmi_softc *sc;
1199	phandle_t node;
1200	int rid, rv;
1201
1202	sc = device_get_softc(dev);
1203	sc->dev = dev;
1204	sc->output.dev = sc->dev;
1205	node = ofw_bus_get_node(sc->dev);
1206
1207	sc->audio_src_type = SOURCE_SELECT_AUTO;
1208	sc->audio_freq = 44100;
1209	sc->audio_chans = 2;
1210	sc->hdmi_mode = false;
1211
1212	sc->tmds_config = tegra124_tmds_config;
1213	sc->n_tmds_configs = nitems(tegra124_tmds_config);
1214
1215	rid = 0;
1216	sc->mem_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
1217	    RF_ACTIVE);
1218	if (sc->mem_res == NULL) {
1219		device_printf(dev, "Cannot allocate memory resources\n");
1220		goto fail;
1221	}
1222
1223	rid = 0;
1224	sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE);
1225	if (sc->irq_res == NULL) {
1226		device_printf(dev, "Cannot allocate IRQ resources\n");
1227		goto fail;
1228	}
1229
1230	rv = bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC | INTR_MPSAFE,
1231	    NULL, hdmi_intr, sc, &sc->irq_ih);
1232	if (rv != 0) {
1233		device_printf(dev,
1234		    "WARNING: unable to register interrupt handler\n");
1235		goto fail;
1236	}
1237
1238	rv = get_fdt_resources(sc, node);
1239	if (rv != 0) {
1240		device_printf(dev, "Cannot parse FDT resources\n");
1241		goto fail;
1242	}
1243	rv = enable_fdt_resources(sc);
1244	if (rv != 0) {
1245		device_printf(dev, "Cannot enable FDT resources\n");
1246		goto fail;
1247	}
1248
1249	rv = TEGRA_DRM_REGISTER_CLIENT(device_get_parent(sc->dev), sc->dev);
1250	if (rv != 0) {
1251		device_printf(dev, "Cannot register DRM device\n");
1252		goto fail;
1253	}
1254	return (bus_generic_attach(dev));
1255
1256fail:
1257	TEGRA_DRM_DEREGISTER_CLIENT(device_get_parent(sc->dev), sc->dev);
1258
1259	if (sc->irq_ih != NULL)
1260		bus_teardown_intr(dev, sc->irq_res, sc->irq_ih);
1261	if (sc->clk_parent != NULL)
1262		clk_release(sc->clk_parent);
1263	if (sc->clk_hdmi != NULL)
1264		clk_release(sc->clk_hdmi);
1265	if (sc->hwreset_hdmi != NULL)
1266		hwreset_release(sc->hwreset_hdmi);
1267	if (sc->supply_hdmi != NULL)
1268		regulator_release(sc->supply_hdmi);
1269	if (sc->supply_pll != NULL)
1270		regulator_release(sc->supply_pll);
1271	if (sc->supply_vdd != NULL)
1272		regulator_release(sc->supply_vdd);
1273	if (sc->irq_res != NULL)
1274		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
1275	if (sc->mem_res != NULL)
1276		bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->mem_res);
1277	return (ENXIO);
1278}
1279
1280static int
1281hdmi_detach(device_t dev)
1282{
1283	struct hdmi_softc *sc;
1284	sc = device_get_softc(dev);
1285
1286	TEGRA_DRM_DEREGISTER_CLIENT(device_get_parent(sc->dev), sc->dev);
1287
1288	if (sc->irq_ih != NULL)
1289		bus_teardown_intr(dev, sc->irq_res, sc->irq_ih);
1290	if (sc->clk_parent != NULL)
1291		clk_release(sc->clk_parent);
1292	if (sc->clk_hdmi != NULL)
1293		clk_release(sc->clk_hdmi);
1294	if (sc->hwreset_hdmi != NULL)
1295		hwreset_release(sc->hwreset_hdmi);
1296	if (sc->supply_hdmi != NULL)
1297		regulator_release(sc->supply_hdmi);
1298	if (sc->supply_pll != NULL)
1299		regulator_release(sc->supply_pll);
1300	if (sc->supply_vdd != NULL)
1301		regulator_release(sc->supply_vdd);
1302	if (sc->irq_res != NULL)
1303		bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
1304	if (sc->mem_res != NULL)
1305		bus_release_resource(dev, SYS_RES_MEMORY, 0, sc->mem_res);
1306	return (bus_generic_detach(dev));
1307}
1308
1309static device_method_t tegra_hdmi_methods[] = {
1310	/* Device interface */
1311	DEVMETHOD(device_probe,			hdmi_probe),
1312	DEVMETHOD(device_attach,		hdmi_attach),
1313	DEVMETHOD(device_detach,		hdmi_detach),
1314
1315	/* tegra drm interface */
1316	DEVMETHOD(tegra_drm_init_client,	hdmi_init_client),
1317	DEVMETHOD(tegra_drm_exit_client,	hdmi_exit_client),
1318
1319	DEVMETHOD_END
1320};
1321
1322static devclass_t tegra_hdmi_devclass;
1323DEFINE_CLASS_0(tegra_hdmi, tegra_hdmi_driver, tegra_hdmi_methods,
1324    sizeof(struct hdmi_softc));
1325DRIVER_MODULE(tegra_hdmi, host1x, tegra_hdmi_driver,
1326tegra_hdmi_devclass, 0, 0);
1327