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/pinctrl/pinmux.h>
20 #include <linux/pinctrl/consumer.h>
21 #include <drm/drm_encoder_slave.h>
23 #include "tilcdc_drv.h"
26 struct tilcdc_module base
;
27 struct i2c_adapter
*i2c
;
29 #define to_slave_module(x) container_of(x, struct slave_module, base)
31 static const struct tilcdc_panel_info slave_info
= {
48 struct slave_encoder
{
49 struct drm_encoder_slave base
;
50 struct slave_module
*mod
;
52 #define to_slave_encoder(x) container_of(to_encoder_slave(x), struct slave_encoder, base)
54 static inline struct drm_encoder_slave_funcs
*
55 get_slave_funcs(struct drm_encoder
*enc
)
57 return to_encoder_slave(enc
)->slave_funcs
;
60 static void slave_encoder_destroy(struct drm_encoder
*encoder
)
62 struct slave_encoder
*slave_encoder
= to_slave_encoder(encoder
);
63 if (get_slave_funcs(encoder
))
64 get_slave_funcs(encoder
)->destroy(encoder
);
65 drm_encoder_cleanup(encoder
);
69 static void slave_encoder_prepare(struct drm_encoder
*encoder
)
71 drm_i2c_encoder_prepare(encoder
);
72 tilcdc_crtc_set_panel_info(encoder
->crtc
, &slave_info
);
75 static bool slave_encoder_fixup(struct drm_encoder
*encoder
,
76 const struct drm_display_mode
*mode
,
77 struct drm_display_mode
*adjusted_mode
)
80 * tilcdc does not generate VESA-complient sync but aligns
81 * VS on the second edge of HS instead of first edge.
82 * We use adjusted_mode, to fixup sync by aligning both rising
83 * edges and add HSKEW offset to let the slave encoder fix it up.
85 adjusted_mode
->hskew
= mode
->hsync_end
- mode
->hsync_start
;
86 adjusted_mode
->flags
|= DRM_MODE_FLAG_HSKEW
;
88 if (mode
->flags
& DRM_MODE_FLAG_NHSYNC
) {
89 adjusted_mode
->flags
|= DRM_MODE_FLAG_PHSYNC
;
90 adjusted_mode
->flags
&= ~DRM_MODE_FLAG_NHSYNC
;
92 adjusted_mode
->flags
|= DRM_MODE_FLAG_NHSYNC
;
93 adjusted_mode
->flags
&= ~DRM_MODE_FLAG_PHSYNC
;
96 return drm_i2c_encoder_mode_fixup(encoder
, mode
, adjusted_mode
);
100 static const struct drm_encoder_funcs slave_encoder_funcs
= {
101 .destroy
= slave_encoder_destroy
,
104 static const struct drm_encoder_helper_funcs slave_encoder_helper_funcs
= {
105 .dpms
= drm_i2c_encoder_dpms
,
106 .mode_fixup
= slave_encoder_fixup
,
107 .prepare
= slave_encoder_prepare
,
108 .commit
= drm_i2c_encoder_commit
,
109 .mode_set
= drm_i2c_encoder_mode_set
,
110 .save
= drm_i2c_encoder_save
,
111 .restore
= drm_i2c_encoder_restore
,
114 static const struct i2c_board_info info
= {
115 I2C_BOARD_INFO("tda998x", 0x70)
118 static struct drm_encoder
*slave_encoder_create(struct drm_device
*dev
,
119 struct slave_module
*mod
)
121 struct slave_encoder
*slave_encoder
;
122 struct drm_encoder
*encoder
;
125 slave_encoder
= kzalloc(sizeof(*slave_encoder
), GFP_KERNEL
);
126 if (!slave_encoder
) {
127 dev_err(dev
->dev
, "allocation failed\n");
131 slave_encoder
->mod
= mod
;
133 encoder
= &slave_encoder
->base
.base
;
134 encoder
->possible_crtcs
= 1;
136 ret
= drm_encoder_init(dev
, encoder
, &slave_encoder_funcs
,
137 DRM_MODE_ENCODER_TMDS
);
141 drm_encoder_helper_add(encoder
, &slave_encoder_helper_funcs
);
143 ret
= drm_i2c_encoder_init(dev
, to_encoder_slave(encoder
), mod
->i2c
, &info
);
150 slave_encoder_destroy(encoder
);
158 struct slave_connector
{
159 struct drm_connector base
;
161 struct drm_encoder
*encoder
; /* our connected encoder */
162 struct slave_module
*mod
;
164 #define to_slave_connector(x) container_of(x, struct slave_connector, base)
166 static void slave_connector_destroy(struct drm_connector
*connector
)
168 struct slave_connector
*slave_connector
= to_slave_connector(connector
);
169 drm_connector_unregister(connector
);
170 drm_connector_cleanup(connector
);
171 kfree(slave_connector
);
174 static enum drm_connector_status
slave_connector_detect(
175 struct drm_connector
*connector
,
178 struct drm_encoder
*encoder
= to_slave_connector(connector
)->encoder
;
179 return get_slave_funcs(encoder
)->detect(encoder
, connector
);
182 static int slave_connector_get_modes(struct drm_connector
*connector
)
184 struct drm_encoder
*encoder
= to_slave_connector(connector
)->encoder
;
185 return get_slave_funcs(encoder
)->get_modes(encoder
, connector
);
188 static int slave_connector_mode_valid(struct drm_connector
*connector
,
189 struct drm_display_mode
*mode
)
191 struct drm_encoder
*encoder
= to_slave_connector(connector
)->encoder
;
192 struct tilcdc_drm_private
*priv
= connector
->dev
->dev_private
;
195 ret
= tilcdc_crtc_mode_valid(priv
->crtc
, mode
);
199 return get_slave_funcs(encoder
)->mode_valid(encoder
, mode
);
202 static struct drm_encoder
*slave_connector_best_encoder(
203 struct drm_connector
*connector
)
205 struct slave_connector
*slave_connector
= to_slave_connector(connector
);
206 return slave_connector
->encoder
;
209 static int slave_connector_set_property(struct drm_connector
*connector
,
210 struct drm_property
*property
, uint64_t value
)
212 struct drm_encoder
*encoder
= to_slave_connector(connector
)->encoder
;
213 return get_slave_funcs(encoder
)->set_property(encoder
,
214 connector
, property
, value
);
217 static const struct drm_connector_funcs slave_connector_funcs
= {
218 .destroy
= slave_connector_destroy
,
219 .dpms
= drm_helper_connector_dpms
,
220 .detect
= slave_connector_detect
,
221 .fill_modes
= drm_helper_probe_single_connector_modes
,
222 .set_property
= slave_connector_set_property
,
225 static const struct drm_connector_helper_funcs slave_connector_helper_funcs
= {
226 .get_modes
= slave_connector_get_modes
,
227 .mode_valid
= slave_connector_mode_valid
,
228 .best_encoder
= slave_connector_best_encoder
,
231 static struct drm_connector
*slave_connector_create(struct drm_device
*dev
,
232 struct slave_module
*mod
, struct drm_encoder
*encoder
)
234 struct slave_connector
*slave_connector
;
235 struct drm_connector
*connector
;
238 slave_connector
= kzalloc(sizeof(*slave_connector
), GFP_KERNEL
);
239 if (!slave_connector
) {
240 dev_err(dev
->dev
, "allocation failed\n");
244 slave_connector
->encoder
= encoder
;
245 slave_connector
->mod
= mod
;
247 connector
= &slave_connector
->base
;
249 drm_connector_init(dev
, connector
, &slave_connector_funcs
,
250 DRM_MODE_CONNECTOR_HDMIA
);
251 drm_connector_helper_add(connector
, &slave_connector_helper_funcs
);
253 connector
->polled
= DRM_CONNECTOR_POLL_CONNECT
|
254 DRM_CONNECTOR_POLL_DISCONNECT
;
256 connector
->interlace_allowed
= 0;
257 connector
->doublescan_allowed
= 0;
259 get_slave_funcs(encoder
)->create_resources(encoder
, connector
);
261 ret
= drm_mode_connector_attach_encoder(connector
, encoder
);
265 drm_connector_register(connector
);
270 slave_connector_destroy(connector
);
278 static int slave_modeset_init(struct tilcdc_module
*mod
, struct drm_device
*dev
)
280 struct slave_module
*slave_mod
= to_slave_module(mod
);
281 struct tilcdc_drm_private
*priv
= dev
->dev_private
;
282 struct drm_encoder
*encoder
;
283 struct drm_connector
*connector
;
285 encoder
= slave_encoder_create(dev
, slave_mod
);
289 connector
= slave_connector_create(dev
, slave_mod
, encoder
);
293 priv
->encoders
[priv
->num_encoders
++] = encoder
;
294 priv
->connectors
[priv
->num_connectors
++] = connector
;
299 static const struct tilcdc_module_ops slave_module_ops
= {
300 .modeset_init
= slave_modeset_init
,
307 static struct of_device_id slave_of_match
[];
309 static int slave_probe(struct platform_device
*pdev
)
311 struct device_node
*node
= pdev
->dev
.of_node
;
312 struct device_node
*i2c_node
;
313 struct slave_module
*slave_mod
;
314 struct tilcdc_module
*mod
;
315 struct pinctrl
*pinctrl
;
316 uint32_t i2c_phandle
;
317 struct i2c_adapter
*slavei2c
;
320 /* bail out early if no DT data: */
322 dev_err(&pdev
->dev
, "device-tree data is missing\n");
326 /* Bail out early if i2c not specified */
327 if (of_property_read_u32(node
, "i2c", &i2c_phandle
)) {
328 dev_err(&pdev
->dev
, "could not get i2c bus phandle\n");
332 i2c_node
= of_find_node_by_phandle(i2c_phandle
);
334 dev_err(&pdev
->dev
, "could not get i2c bus node\n");
338 /* but defer the probe if it can't be initialized it might come later */
339 slavei2c
= of_find_i2c_adapter_by_node(i2c_node
);
340 of_node_put(i2c_node
);
344 tilcdc_slave_probedefer(true);
345 dev_err(&pdev
->dev
, "could not get i2c\n");
349 slave_mod
= kzalloc(sizeof(*slave_mod
), GFP_KERNEL
);
355 mod
= &slave_mod
->base
;
356 pdev
->dev
.platform_data
= mod
;
358 mod
->preferred_bpp
= slave_info
.bpp
;
360 slave_mod
->i2c
= slavei2c
;
362 tilcdc_module_init(mod
, "slave", &slave_module_ops
);
364 pinctrl
= devm_pinctrl_get_select_default(&pdev
->dev
);
366 dev_warn(&pdev
->dev
, "pins are not configured\n");
368 tilcdc_slave_probedefer(false);
373 i2c_put_adapter(slavei2c
);
377 static int slave_remove(struct platform_device
*pdev
)
379 struct tilcdc_module
*mod
= dev_get_platdata(&pdev
->dev
);
380 struct slave_module
*slave_mod
= to_slave_module(mod
);
382 tilcdc_module_cleanup(mod
);
388 static struct of_device_id slave_of_match
[] = {
389 { .compatible
= "ti,tilcdc,slave", },
393 struct platform_driver slave_driver
= {
394 .probe
= slave_probe
,
395 .remove
= slave_remove
,
397 .owner
= THIS_MODULE
,
399 .of_match_table
= slave_of_match
,
403 int __init
tilcdc_slave_init(void)
405 return platform_driver_register(&slave_driver
);
408 void __exit
tilcdc_slave_fini(void)
410 platform_driver_unregister(&slave_driver
);