2 * Copyright (C) 2012 Texas Instruments
3 * Author: Rob Clark <robdclark@gmail.com>
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 as published by
7 * the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 * You should have received a copy of the GNU General Public License along with
15 * this program. If not, see <http://www.gnu.org/licenses/>.
18 #include <linux/i2c.h>
19 #include <linux/gpio.h>
20 #include <linux/of_gpio.h>
21 #include <linux/pinctrl/pinmux.h>
22 #include <linux/pinctrl/consumer.h>
24 #include "tilcdc_drv.h"
26 struct tfp410_module
{
27 struct tilcdc_module base
;
28 struct i2c_adapter
*i2c
;
31 #define to_tfp410_module(x) container_of(x, struct tfp410_module, base)
34 static const struct tilcdc_panel_info dvi_info
= {
50 struct tfp410_encoder
{
51 struct drm_encoder base
;
52 struct tfp410_module
*mod
;
55 #define to_tfp410_encoder(x) container_of(x, struct tfp410_encoder, base)
58 static void tfp410_encoder_destroy(struct drm_encoder
*encoder
)
60 struct tfp410_encoder
*tfp410_encoder
= to_tfp410_encoder(encoder
);
61 drm_encoder_cleanup(encoder
);
62 kfree(tfp410_encoder
);
65 static void tfp410_encoder_dpms(struct drm_encoder
*encoder
, int mode
)
67 struct tfp410_encoder
*tfp410_encoder
= to_tfp410_encoder(encoder
);
69 if (tfp410_encoder
->dpms
== mode
)
72 if (mode
== DRM_MODE_DPMS_ON
) {
74 gpio_direction_output(tfp410_encoder
->mod
->gpio
, 1);
77 gpio_direction_output(tfp410_encoder
->mod
->gpio
, 0);
80 tfp410_encoder
->dpms
= mode
;
83 static bool tfp410_encoder_mode_fixup(struct drm_encoder
*encoder
,
84 const struct drm_display_mode
*mode
,
85 struct drm_display_mode
*adjusted_mode
)
91 static void tfp410_encoder_prepare(struct drm_encoder
*encoder
)
93 tfp410_encoder_dpms(encoder
, DRM_MODE_DPMS_OFF
);
94 tilcdc_crtc_set_panel_info(encoder
->crtc
, &dvi_info
);
97 static void tfp410_encoder_commit(struct drm_encoder
*encoder
)
99 tfp410_encoder_dpms(encoder
, DRM_MODE_DPMS_ON
);
102 static void tfp410_encoder_mode_set(struct drm_encoder
*encoder
,
103 struct drm_display_mode
*mode
,
104 struct drm_display_mode
*adjusted_mode
)
109 static const struct drm_encoder_funcs tfp410_encoder_funcs
= {
110 .destroy
= tfp410_encoder_destroy
,
113 static const struct drm_encoder_helper_funcs tfp410_encoder_helper_funcs
= {
114 .dpms
= tfp410_encoder_dpms
,
115 .mode_fixup
= tfp410_encoder_mode_fixup
,
116 .prepare
= tfp410_encoder_prepare
,
117 .commit
= tfp410_encoder_commit
,
118 .mode_set
= tfp410_encoder_mode_set
,
121 static struct drm_encoder
*tfp410_encoder_create(struct drm_device
*dev
,
122 struct tfp410_module
*mod
)
124 struct tfp410_encoder
*tfp410_encoder
;
125 struct drm_encoder
*encoder
;
128 tfp410_encoder
= kzalloc(sizeof(*tfp410_encoder
), GFP_KERNEL
);
129 if (!tfp410_encoder
) {
130 dev_err(dev
->dev
, "allocation failed\n");
134 tfp410_encoder
->dpms
= DRM_MODE_DPMS_OFF
;
135 tfp410_encoder
->mod
= mod
;
137 encoder
= &tfp410_encoder
->base
;
138 encoder
->possible_crtcs
= 1;
140 ret
= drm_encoder_init(dev
, encoder
, &tfp410_encoder_funcs
,
141 DRM_MODE_ENCODER_TMDS
);
145 drm_encoder_helper_add(encoder
, &tfp410_encoder_helper_funcs
);
150 tfp410_encoder_destroy(encoder
);
158 struct tfp410_connector
{
159 struct drm_connector base
;
161 struct drm_encoder
*encoder
; /* our connected encoder */
162 struct tfp410_module
*mod
;
164 #define to_tfp410_connector(x) container_of(x, struct tfp410_connector, base)
167 static void tfp410_connector_destroy(struct drm_connector
*connector
)
169 struct tfp410_connector
*tfp410_connector
= to_tfp410_connector(connector
);
170 drm_connector_cleanup(connector
);
171 kfree(tfp410_connector
);
174 static enum drm_connector_status
tfp410_connector_detect(
175 struct drm_connector
*connector
,
178 struct tfp410_connector
*tfp410_connector
= to_tfp410_connector(connector
);
180 if (drm_probe_ddc(tfp410_connector
->mod
->i2c
))
181 return connector_status_connected
;
183 return connector_status_unknown
;
186 static int tfp410_connector_get_modes(struct drm_connector
*connector
)
188 struct tfp410_connector
*tfp410_connector
= to_tfp410_connector(connector
);
192 edid
= drm_get_edid(connector
, tfp410_connector
->mod
->i2c
);
194 drm_mode_connector_update_edid_property(connector
, edid
);
197 ret
= drm_add_edid_modes(connector
, edid
);
204 static int tfp410_connector_mode_valid(struct drm_connector
*connector
,
205 struct drm_display_mode
*mode
)
207 struct tilcdc_drm_private
*priv
= connector
->dev
->dev_private
;
208 /* our only constraints are what the crtc can generate: */
209 return tilcdc_crtc_mode_valid(priv
->crtc
, mode
);
212 static struct drm_encoder
*tfp410_connector_best_encoder(
213 struct drm_connector
*connector
)
215 struct tfp410_connector
*tfp410_connector
= to_tfp410_connector(connector
);
216 return tfp410_connector
->encoder
;
219 static const struct drm_connector_funcs tfp410_connector_funcs
= {
220 .destroy
= tfp410_connector_destroy
,
221 .dpms
= drm_helper_connector_dpms
,
222 .detect
= tfp410_connector_detect
,
223 .fill_modes
= drm_helper_probe_single_connector_modes
,
226 static const struct drm_connector_helper_funcs tfp410_connector_helper_funcs
= {
227 .get_modes
= tfp410_connector_get_modes
,
228 .mode_valid
= tfp410_connector_mode_valid
,
229 .best_encoder
= tfp410_connector_best_encoder
,
232 static struct drm_connector
*tfp410_connector_create(struct drm_device
*dev
,
233 struct tfp410_module
*mod
, struct drm_encoder
*encoder
)
235 struct tfp410_connector
*tfp410_connector
;
236 struct drm_connector
*connector
;
239 tfp410_connector
= kzalloc(sizeof(*tfp410_connector
), GFP_KERNEL
);
240 if (!tfp410_connector
) {
241 dev_err(dev
->dev
, "allocation failed\n");
245 tfp410_connector
->encoder
= encoder
;
246 tfp410_connector
->mod
= mod
;
248 connector
= &tfp410_connector
->base
;
250 drm_connector_init(dev
, connector
, &tfp410_connector_funcs
,
251 DRM_MODE_CONNECTOR_DVID
);
252 drm_connector_helper_add(connector
, &tfp410_connector_helper_funcs
);
254 connector
->polled
= DRM_CONNECTOR_POLL_CONNECT
|
255 DRM_CONNECTOR_POLL_DISCONNECT
;
257 connector
->interlace_allowed
= 0;
258 connector
->doublescan_allowed
= 0;
260 ret
= drm_mode_connector_attach_encoder(connector
, encoder
);
264 drm_sysfs_connector_add(connector
);
269 tfp410_connector_destroy(connector
);
277 static int tfp410_modeset_init(struct tilcdc_module
*mod
, struct drm_device
*dev
)
279 struct tfp410_module
*tfp410_mod
= to_tfp410_module(mod
);
280 struct tilcdc_drm_private
*priv
= dev
->dev_private
;
281 struct drm_encoder
*encoder
;
282 struct drm_connector
*connector
;
284 encoder
= tfp410_encoder_create(dev
, tfp410_mod
);
288 connector
= tfp410_connector_create(dev
, tfp410_mod
, encoder
);
292 priv
->encoders
[priv
->num_encoders
++] = encoder
;
293 priv
->connectors
[priv
->num_connectors
++] = connector
;
298 static void tfp410_destroy(struct tilcdc_module
*mod
)
300 struct tfp410_module
*tfp410_mod
= to_tfp410_module(mod
);
303 i2c_put_adapter(tfp410_mod
->i2c
);
305 if (!IS_ERR_VALUE(tfp410_mod
->gpio
))
306 gpio_free(tfp410_mod
->gpio
);
308 tilcdc_module_cleanup(mod
);
312 static const struct tilcdc_module_ops tfp410_module_ops
= {
313 .modeset_init
= tfp410_modeset_init
,
314 .destroy
= tfp410_destroy
,
321 static struct of_device_id tfp410_of_match
[];
323 static int tfp410_probe(struct platform_device
*pdev
)
325 struct device_node
*node
= pdev
->dev
.of_node
;
326 struct device_node
*i2c_node
;
327 struct tfp410_module
*tfp410_mod
;
328 struct tilcdc_module
*mod
;
329 struct pinctrl
*pinctrl
;
330 uint32_t i2c_phandle
;
333 /* bail out early if no DT data: */
335 dev_err(&pdev
->dev
, "device-tree data is missing\n");
339 tfp410_mod
= kzalloc(sizeof(*tfp410_mod
), GFP_KERNEL
);
343 mod
= &tfp410_mod
->base
;
345 tilcdc_module_init(mod
, "tfp410", &tfp410_module_ops
);
347 pinctrl
= devm_pinctrl_get_select_default(&pdev
->dev
);
349 dev_warn(&pdev
->dev
, "pins are not configured\n");
351 if (of_property_read_u32(node
, "i2c", &i2c_phandle
)) {
352 dev_err(&pdev
->dev
, "could not get i2c bus phandle\n");
356 mod
->preferred_bpp
= dvi_info
.bpp
;
358 i2c_node
= of_find_node_by_phandle(i2c_phandle
);
360 dev_err(&pdev
->dev
, "could not get i2c bus node\n");
364 tfp410_mod
->i2c
= of_find_i2c_adapter_by_node(i2c_node
);
365 if (!tfp410_mod
->i2c
) {
366 dev_err(&pdev
->dev
, "could not get i2c\n");
370 of_node_put(i2c_node
);
372 tfp410_mod
->gpio
= of_get_named_gpio_flags(node
, "powerdn-gpio",
374 if (IS_ERR_VALUE(tfp410_mod
->gpio
)) {
375 dev_warn(&pdev
->dev
, "No power down GPIO\n");
377 ret
= gpio_request(tfp410_mod
->gpio
, "DVI_PDn");
379 dev_err(&pdev
->dev
, "could not get DVI_PDn gpio\n");
391 static int tfp410_remove(struct platform_device
*pdev
)
396 static struct of_device_id tfp410_of_match
[] = {
397 { .compatible
= "ti,tilcdc,tfp410", },
401 struct platform_driver tfp410_driver
= {
402 .probe
= tfp410_probe
,
403 .remove
= tfp410_remove
,
405 .owner
= THIS_MODULE
,
407 .of_match_table
= tfp410_of_match
,
411 int __init
tilcdc_tfp410_init(void)
413 return platform_driver_register(&tfp410_driver
);
416 void __exit
tilcdc_tfp410_fini(void)
418 platform_driver_unregister(&tfp410_driver
);