2 * Copyright (C) 2012 Avionic Design GmbH
3 * Copyright (C) 2012 NVIDIA CORPORATION. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation.
10 #include <linux/of_gpio.h>
12 #include <drm/drm_panel.h>
15 static int tegra_connector_get_modes(struct drm_connector
*connector
)
17 struct tegra_output
*output
= connector_to_output(connector
);
18 struct edid
*edid
= NULL
;
22 * If the panel provides one or more modes, use them exclusively and
23 * ignore any other means of obtaining a mode.
26 err
= output
->panel
->funcs
->get_modes(output
->panel
);
32 edid
= kmemdup(output
->edid
, sizeof(*edid
), GFP_KERNEL
);
34 edid
= drm_get_edid(connector
, output
->ddc
);
36 drm_mode_connector_update_edid_property(connector
, edid
);
39 err
= drm_add_edid_modes(connector
, edid
);
46 static int tegra_connector_mode_valid(struct drm_connector
*connector
,
47 struct drm_display_mode
*mode
)
49 struct tegra_output
*output
= connector_to_output(connector
);
50 enum drm_mode_status status
= MODE_OK
;
53 err
= tegra_output_check_mode(output
, mode
, &status
);
60 static struct drm_encoder
*
61 tegra_connector_best_encoder(struct drm_connector
*connector
)
63 struct tegra_output
*output
= connector_to_output(connector
);
65 return &output
->encoder
;
68 static const struct drm_connector_helper_funcs connector_helper_funcs
= {
69 .get_modes
= tegra_connector_get_modes
,
70 .mode_valid
= tegra_connector_mode_valid
,
71 .best_encoder
= tegra_connector_best_encoder
,
74 static enum drm_connector_status
75 tegra_connector_detect(struct drm_connector
*connector
, bool force
)
77 struct tegra_output
*output
= connector_to_output(connector
);
78 enum drm_connector_status status
= connector_status_unknown
;
80 if (output
->ops
->detect
)
81 return output
->ops
->detect(output
);
83 if (gpio_is_valid(output
->hpd_gpio
)) {
84 if (gpio_get_value(output
->hpd_gpio
) == 0)
85 status
= connector_status_disconnected
;
87 status
= connector_status_connected
;
90 status
= connector_status_disconnected
;
92 status
= connector_status_connected
;
94 if (connector
->connector_type
== DRM_MODE_CONNECTOR_LVDS
)
95 status
= connector_status_connected
;
101 static void drm_connector_clear(struct drm_connector
*connector
)
103 memset(connector
, 0, sizeof(*connector
));
106 static void tegra_connector_destroy(struct drm_connector
*connector
)
108 drm_connector_unregister(connector
);
109 drm_connector_cleanup(connector
);
110 drm_connector_clear(connector
);
113 static const struct drm_connector_funcs connector_funcs
= {
114 .dpms
= drm_helper_connector_dpms
,
115 .detect
= tegra_connector_detect
,
116 .fill_modes
= drm_helper_probe_single_connector_modes
,
117 .destroy
= tegra_connector_destroy
,
120 static void drm_encoder_clear(struct drm_encoder
*encoder
)
122 memset(encoder
, 0, sizeof(*encoder
));
125 static void tegra_encoder_destroy(struct drm_encoder
*encoder
)
127 drm_encoder_cleanup(encoder
);
128 drm_encoder_clear(encoder
);
131 static const struct drm_encoder_funcs encoder_funcs
= {
132 .destroy
= tegra_encoder_destroy
,
135 static void tegra_encoder_dpms(struct drm_encoder
*encoder
, int mode
)
137 struct tegra_output
*output
= encoder_to_output(encoder
);
138 struct drm_panel
*panel
= output
->panel
;
140 if (mode
!= DRM_MODE_DPMS_ON
) {
141 drm_panel_disable(panel
);
142 tegra_output_disable(output
);
144 tegra_output_enable(output
);
145 drm_panel_enable(panel
);
149 static bool tegra_encoder_mode_fixup(struct drm_encoder
*encoder
,
150 const struct drm_display_mode
*mode
,
151 struct drm_display_mode
*adjusted
)
156 static void tegra_encoder_prepare(struct drm_encoder
*encoder
)
160 static void tegra_encoder_commit(struct drm_encoder
*encoder
)
164 static void tegra_encoder_mode_set(struct drm_encoder
*encoder
,
165 struct drm_display_mode
*mode
,
166 struct drm_display_mode
*adjusted
)
168 struct tegra_output
*output
= encoder_to_output(encoder
);
171 err
= tegra_output_enable(output
);
173 dev_err(encoder
->dev
->dev
, "tegra_output_enable(): %d\n", err
);
176 static const struct drm_encoder_helper_funcs encoder_helper_funcs
= {
177 .dpms
= tegra_encoder_dpms
,
178 .mode_fixup
= tegra_encoder_mode_fixup
,
179 .prepare
= tegra_encoder_prepare
,
180 .commit
= tegra_encoder_commit
,
181 .mode_set
= tegra_encoder_mode_set
,
184 static irqreturn_t
hpd_irq(int irq
, void *data
)
186 struct tegra_output
*output
= data
;
188 drm_helper_hpd_irq_event(output
->connector
.dev
);
193 int tegra_output_probe(struct tegra_output
*output
)
195 struct device_node
*ddc
, *panel
;
196 enum of_gpio_flags flags
;
199 if (!output
->of_node
)
200 output
->of_node
= output
->dev
->of_node
;
202 panel
= of_parse_phandle(output
->of_node
, "nvidia,panel", 0);
204 output
->panel
= of_drm_find_panel(panel
);
206 return -EPROBE_DEFER
;
211 output
->edid
= of_get_property(output
->of_node
, "nvidia,edid", &size
);
213 ddc
= of_parse_phandle(output
->of_node
, "nvidia,ddc-i2c-bus", 0);
215 output
->ddc
= of_find_i2c_adapter_by_node(ddc
);
225 output
->hpd_gpio
= of_get_named_gpio_flags(output
->of_node
,
226 "nvidia,hpd-gpio", 0,
228 if (gpio_is_valid(output
->hpd_gpio
)) {
231 err
= gpio_request_one(output
->hpd_gpio
, GPIOF_DIR_IN
,
232 "HDMI hotplug detect");
234 dev_err(output
->dev
, "gpio_request_one(): %d\n", err
);
238 err
= gpio_to_irq(output
->hpd_gpio
);
240 dev_err(output
->dev
, "gpio_to_irq(): %d\n", err
);
241 gpio_free(output
->hpd_gpio
);
245 output
->hpd_irq
= err
;
247 flags
= IRQF_TRIGGER_RISING
| IRQF_TRIGGER_FALLING
|
250 err
= request_threaded_irq(output
->hpd_irq
, NULL
, hpd_irq
,
251 flags
, "hpd", output
);
253 dev_err(output
->dev
, "failed to request IRQ#%u: %d\n",
254 output
->hpd_irq
, err
);
255 gpio_free(output
->hpd_gpio
);
259 output
->connector
.polled
= DRM_CONNECTOR_POLL_HPD
;
265 int tegra_output_remove(struct tegra_output
*output
)
267 if (gpio_is_valid(output
->hpd_gpio
)) {
268 free_irq(output
->hpd_irq
, output
);
269 gpio_free(output
->hpd_gpio
);
273 put_device(&output
->ddc
->dev
);
278 int tegra_output_init(struct drm_device
*drm
, struct tegra_output
*output
)
280 int connector
, encoder
;
282 switch (output
->type
) {
283 case TEGRA_OUTPUT_RGB
:
284 connector
= DRM_MODE_CONNECTOR_LVDS
;
285 encoder
= DRM_MODE_ENCODER_LVDS
;
288 case TEGRA_OUTPUT_HDMI
:
289 connector
= DRM_MODE_CONNECTOR_HDMIA
;
290 encoder
= DRM_MODE_ENCODER_TMDS
;
293 case TEGRA_OUTPUT_DSI
:
294 connector
= DRM_MODE_CONNECTOR_DSI
;
295 encoder
= DRM_MODE_ENCODER_DSI
;
298 case TEGRA_OUTPUT_EDP
:
299 connector
= DRM_MODE_CONNECTOR_eDP
;
300 encoder
= DRM_MODE_ENCODER_TMDS
;
304 connector
= DRM_MODE_CONNECTOR_Unknown
;
305 encoder
= DRM_MODE_ENCODER_NONE
;
309 drm_connector_init(drm
, &output
->connector
, &connector_funcs
,
311 drm_connector_helper_add(&output
->connector
, &connector_helper_funcs
);
312 output
->connector
.dpms
= DRM_MODE_DPMS_OFF
;
315 drm_panel_attach(output
->panel
, &output
->connector
);
317 drm_encoder_init(drm
, &output
->encoder
, &encoder_funcs
, encoder
);
318 drm_encoder_helper_add(&output
->encoder
, &encoder_helper_funcs
);
320 drm_mode_connector_attach_encoder(&output
->connector
, &output
->encoder
);
321 drm_connector_register(&output
->connector
);
323 output
->encoder
.possible_crtcs
= 0x3;
328 int tegra_output_exit(struct tegra_output
*output
)