summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJyri Sarha <jsarha@ti.com>2019-08-02 08:55:22 -0400
committerJyri Sarha <jsarha@ti.com>2019-08-02 09:00:42 -0400
commit57d8396504b3a93f284e51b866740a3e7419a3d9 (patch)
tree5d62258d8f661ee1ab460127ca63de6b9cefff48
parent93386368a138e2ccc40459af5b05dd2e39bcd3db (diff)
drm/tilcdc: Remove obsolete crtc_mode_valid() hack
Earlier there were no mode_valid() helper for crtc and tilcdc had a hack to over come this limitation. But now the mode_valid() helper is there (has been since v4.13), so it is about time to get rid of that hack. Signed-off-by: Jyri Sarha <jsarha@ti.com> Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com> Link: https://patchwork.freedesktop.org/patch/msgid/ <5c4dcb5b1e7975bd2b7ca86f7addf219cd0f9a06.1564750248.git.jsarha@ti.com
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_crtc.c28
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_drv.c1
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_drv.h2
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_external.c88
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_external.h1
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_panel.c9
-rw-r--r--drivers/gpu/drm/tilcdc/tilcdc_tfp410.c9
7 files changed, 19 insertions, 119 deletions
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
index 8fa9b3e5e230..e9dd5e5cb4e7 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_crtc.c
@@ -650,9 +650,6 @@ static bool tilcdc_crtc_mode_fixup(struct drm_crtc *crtc,
650static int tilcdc_crtc_atomic_check(struct drm_crtc *crtc, 650static int tilcdc_crtc_atomic_check(struct drm_crtc *crtc,
651 struct drm_crtc_state *state) 651 struct drm_crtc_state *state)
652{ 652{
653 struct drm_display_mode *mode = &state->mode;
654 int ret;
655
656 /* If we are not active we don't care */ 653 /* If we are not active we don't care */
657 if (!state->active) 654 if (!state->active)
658 return 0; 655 return 0;
@@ -664,12 +661,6 @@ static int tilcdc_crtc_atomic_check(struct drm_crtc *crtc,
664 return -EINVAL; 661 return -EINVAL;
665 } 662 }
666 663
667 ret = tilcdc_crtc_mode_valid(crtc, mode);
668 if (ret) {
669 dev_dbg(crtc->dev->dev, "Mode \"%s\" not valid", mode->name);
670 return -EINVAL;
671 }
672
673 return 0; 664 return 0;
674} 665}
675 666
@@ -721,13 +712,6 @@ static const struct drm_crtc_funcs tilcdc_crtc_funcs = {
721 .disable_vblank = tilcdc_crtc_disable_vblank, 712 .disable_vblank = tilcdc_crtc_disable_vblank,
722}; 713};
723 714
724static const struct drm_crtc_helper_funcs tilcdc_crtc_helper_funcs = {
725 .mode_fixup = tilcdc_crtc_mode_fixup,
726 .atomic_check = tilcdc_crtc_atomic_check,
727 .atomic_enable = tilcdc_crtc_atomic_enable,
728 .atomic_disable = tilcdc_crtc_atomic_disable,
729};
730
731int tilcdc_crtc_max_width(struct drm_crtc *crtc) 715int tilcdc_crtc_max_width(struct drm_crtc *crtc)
732{ 716{
733 struct drm_device *dev = crtc->dev; 717 struct drm_device *dev = crtc->dev;
@@ -742,7 +726,9 @@ int tilcdc_crtc_max_width(struct drm_crtc *crtc)
742 return max_width; 726 return max_width;
743} 727}
744 728
745int tilcdc_crtc_mode_valid(struct drm_crtc *crtc, struct drm_display_mode *mode) 729static enum drm_mode_status
730tilcdc_crtc_mode_valid(struct drm_crtc *crtc,
731 const struct drm_display_mode *mode)
746{ 732{
747 struct tilcdc_drm_private *priv = crtc->dev->dev_private; 733 struct tilcdc_drm_private *priv = crtc->dev->dev_private;
748 unsigned int bandwidth; 734 unsigned int bandwidth;
@@ -830,6 +816,14 @@ int tilcdc_crtc_mode_valid(struct drm_crtc *crtc, struct drm_display_mode *mode)
830 return MODE_OK; 816 return MODE_OK;
831} 817}
832 818
819static const struct drm_crtc_helper_funcs tilcdc_crtc_helper_funcs = {
820 .mode_valid = tilcdc_crtc_mode_valid,
821 .mode_fixup = tilcdc_crtc_mode_fixup,
822 .atomic_check = tilcdc_crtc_atomic_check,
823 .atomic_enable = tilcdc_crtc_atomic_enable,
824 .atomic_disable = tilcdc_crtc_atomic_disable,
825};
826
833void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc, 827void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc,
834 const struct tilcdc_panel_info *info) 828 const struct tilcdc_panel_info *info)
835{ 829{
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index 3046a4a4232d..2a9e67597375 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -199,7 +199,6 @@ static void tilcdc_fini(struct drm_device *dev)
199 drm_kms_helper_poll_fini(dev); 199 drm_kms_helper_poll_fini(dev);
200 drm_irq_uninstall(dev); 200 drm_irq_uninstall(dev);
201 drm_mode_config_cleanup(dev); 201 drm_mode_config_cleanup(dev);
202 tilcdc_remove_external_device(dev);
203 202
204 if (priv->clk) 203 if (priv->clk)
205 clk_put(priv->clk); 204 clk_put(priv->clk);
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.h b/drivers/gpu/drm/tilcdc/tilcdc_drv.h
index e93f801a4ce7..18815e75ca4f 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.h
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.h
@@ -77,7 +77,6 @@ struct tilcdc_drm_private {
77 77
78 struct drm_encoder *external_encoder; 78 struct drm_encoder *external_encoder;
79 struct drm_connector *external_connector; 79 struct drm_connector *external_connector;
80 const struct drm_connector_helper_funcs *connector_funcs;
81 80
82 bool is_registered; 81 bool is_registered;
83 bool is_componentized; 82 bool is_componentized;
@@ -159,7 +158,6 @@ void tilcdc_crtc_set_panel_info(struct drm_crtc *crtc,
159 const struct tilcdc_panel_info *info); 158 const struct tilcdc_panel_info *info);
160void tilcdc_crtc_set_simulate_vesa_sync(struct drm_crtc *crtc, 159void tilcdc_crtc_set_simulate_vesa_sync(struct drm_crtc *crtc,
161 bool simulate_vesa_sync); 160 bool simulate_vesa_sync);
162int tilcdc_crtc_mode_valid(struct drm_crtc *crtc, struct drm_display_mode *mode);
163int tilcdc_crtc_max_width(struct drm_crtc *crtc); 161int tilcdc_crtc_max_width(struct drm_crtc *crtc);
164void tilcdc_crtc_shutdown(struct drm_crtc *crtc); 162void tilcdc_crtc_shutdown(struct drm_crtc *crtc);
165int tilcdc_crtc_update_fb(struct drm_crtc *crtc, 163int tilcdc_crtc_update_fb(struct drm_crtc *crtc,
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.c b/drivers/gpu/drm/tilcdc/tilcdc_external.c
index 39f4c0a02349..43d756b7810e 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_external.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_external.c
@@ -38,64 +38,6 @@ static const struct tilcdc_panel_info panel_info_default = {
38 .raster_order = 0, 38 .raster_order = 0,
39}; 39};
40 40
41static int tilcdc_external_mode_valid(struct drm_connector *connector,
42 struct drm_display_mode *mode)
43{
44 struct tilcdc_drm_private *priv = connector->dev->dev_private;
45 int ret;
46
47 ret = tilcdc_crtc_mode_valid(priv->crtc, mode);
48 if (ret != MODE_OK)
49 return ret;
50
51 BUG_ON(priv->external_connector != connector);
52 BUG_ON(!priv->connector_funcs);
53
54 /* If the connector has its own mode_valid call it. */
55 if (!IS_ERR(priv->connector_funcs) &&
56 priv->connector_funcs->mode_valid)
57 return priv->connector_funcs->mode_valid(connector, mode);
58
59 return MODE_OK;
60}
61
62static int tilcdc_add_external_connector(struct drm_device *dev,
63 struct drm_connector *connector)
64{
65 struct tilcdc_drm_private *priv = dev->dev_private;
66 struct drm_connector_helper_funcs *connector_funcs;
67
68 /* There should never be more than one connector */
69 if (WARN_ON(priv->external_connector))
70 return -EINVAL;
71
72 priv->external_connector = connector;
73 connector_funcs = devm_kzalloc(dev->dev, sizeof(*connector_funcs),
74 GFP_KERNEL);
75 if (!connector_funcs)
76 return -ENOMEM;
77
78 /* connector->helper_private contains always struct
79 * connector_helper_funcs pointer. For tilcdc crtc to have a
80 * say if a specific mode is Ok, we need to install our own
81 * helper functions. In our helper functions we copy
82 * everything else but use our own mode_valid() (above).
83 */
84 if (connector->helper_private) {
85 priv->connector_funcs = connector->helper_private;
86 *connector_funcs = *priv->connector_funcs;
87 } else {
88 priv->connector_funcs = ERR_PTR(-ENOENT);
89 }
90 connector_funcs->mode_valid = tilcdc_external_mode_valid;
91 drm_connector_helper_add(connector, connector_funcs);
92
93 dev_dbg(dev->dev, "External connector '%s' connected\n",
94 connector->name);
95
96 return 0;
97}
98
99static 41static
100struct drm_connector *tilcdc_encoder_find_connector(struct drm_device *ddev, 42struct drm_connector *tilcdc_encoder_find_connector(struct drm_device *ddev,
101 struct drm_encoder *encoder) 43 struct drm_encoder *encoder)
@@ -116,7 +58,6 @@ struct drm_connector *tilcdc_encoder_find_connector(struct drm_device *ddev,
116int tilcdc_add_component_encoder(struct drm_device *ddev) 58int tilcdc_add_component_encoder(struct drm_device *ddev)
117{ 59{
118 struct tilcdc_drm_private *priv = ddev->dev_private; 60 struct tilcdc_drm_private *priv = ddev->dev_private;
119 struct drm_connector *connector;
120 struct drm_encoder *encoder; 61 struct drm_encoder *encoder;
121 62
122 list_for_each_entry(encoder, &ddev->mode_config.encoder_list, head) 63 list_for_each_entry(encoder, &ddev->mode_config.encoder_list, head)
@@ -128,28 +69,17 @@ int tilcdc_add_component_encoder(struct drm_device *ddev)
128 return -ENODEV; 69 return -ENODEV;
129 } 70 }
130 71
131 connector = tilcdc_encoder_find_connector(ddev, encoder); 72 priv->external_connector =
73 tilcdc_encoder_find_connector(ddev, encoder);
132 74
133 if (!connector) 75 if (!priv->external_connector)
134 return -ENODEV; 76 return -ENODEV;
135 77
136 /* Only tda998x is supported at the moment. */ 78 /* Only tda998x is supported at the moment. */
137 tilcdc_crtc_set_simulate_vesa_sync(priv->crtc, true); 79 tilcdc_crtc_set_simulate_vesa_sync(priv->crtc, true);
138 tilcdc_crtc_set_panel_info(priv->crtc, &panel_info_tda998x); 80 tilcdc_crtc_set_panel_info(priv->crtc, &panel_info_tda998x);
139 81
140 return tilcdc_add_external_connector(ddev, connector); 82 return 0;
141}
142
143void tilcdc_remove_external_device(struct drm_device *dev)
144{
145 struct tilcdc_drm_private *priv = dev->dev_private;
146
147 /* Restore the original helper functions, if any. */
148 if (IS_ERR(priv->connector_funcs))
149 drm_connector_helper_add(priv->external_connector, NULL);
150 else if (priv->connector_funcs)
151 drm_connector_helper_add(priv->external_connector,
152 priv->connector_funcs);
153} 83}
154 84
155static const struct drm_encoder_funcs tilcdc_external_encoder_funcs = { 85static const struct drm_encoder_funcs tilcdc_external_encoder_funcs = {
@@ -160,7 +90,6 @@ static
160int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge) 90int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
161{ 91{
162 struct tilcdc_drm_private *priv = ddev->dev_private; 92 struct tilcdc_drm_private *priv = ddev->dev_private;
163 struct drm_connector *connector;
164 int ret; 93 int ret;
165 94
166 priv->external_encoder->possible_crtcs = BIT(0); 95 priv->external_encoder->possible_crtcs = BIT(0);
@@ -173,13 +102,12 @@ int tilcdc_attach_bridge(struct drm_device *ddev, struct drm_bridge *bridge)
173 102
174 tilcdc_crtc_set_panel_info(priv->crtc, &panel_info_default); 103 tilcdc_crtc_set_panel_info(priv->crtc, &panel_info_default);
175 104
176 connector = tilcdc_encoder_find_connector(ddev, priv->external_encoder); 105 priv->external_connector =
177 if (!connector) 106 tilcdc_encoder_find_connector(ddev, priv->external_encoder);
107 if (!priv->external_connector)
178 return -ENODEV; 108 return -ENODEV;
179 109
180 ret = tilcdc_add_external_connector(ddev, connector); 110 return 0;
181
182 return ret;
183} 111}
184 112
185int tilcdc_attach_external_device(struct drm_device *ddev) 113int tilcdc_attach_external_device(struct drm_device *ddev)
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_external.h b/drivers/gpu/drm/tilcdc/tilcdc_external.h
index 7024b4877fdf..fb4476694cd8 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_external.h
+++ b/drivers/gpu/drm/tilcdc/tilcdc_external.h
@@ -8,7 +8,6 @@
8#define __TILCDC_EXTERNAL_H__ 8#define __TILCDC_EXTERNAL_H__
9 9
10int tilcdc_add_component_encoder(struct drm_device *dev); 10int tilcdc_add_component_encoder(struct drm_device *dev);
11void tilcdc_remove_external_device(struct drm_device *dev);
12int tilcdc_get_external_components(struct device *dev, 11int tilcdc_get_external_components(struct device *dev,
13 struct component_match **match); 12 struct component_match **match);
14int tilcdc_attach_external_device(struct drm_device *ddev); 13int tilcdc_attach_external_device(struct drm_device *ddev);
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_panel.c b/drivers/gpu/drm/tilcdc/tilcdc_panel.c
index 11eb9fd38c4e..5584e656b857 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_panel.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_panel.c
@@ -163,14 +163,6 @@ static int panel_connector_get_modes(struct drm_connector *connector)
163 return i; 163 return i;
164} 164}
165 165
166static int panel_connector_mode_valid(struct drm_connector *connector,
167 struct drm_display_mode *mode)
168{
169 struct tilcdc_drm_private *priv = connector->dev->dev_private;
170 /* our only constraints are what the crtc can generate: */
171 return tilcdc_crtc_mode_valid(priv->crtc, mode);
172}
173
174static struct drm_encoder *panel_connector_best_encoder( 166static struct drm_encoder *panel_connector_best_encoder(
175 struct drm_connector *connector) 167 struct drm_connector *connector)
176{ 168{
@@ -188,7 +180,6 @@ static const struct drm_connector_funcs panel_connector_funcs = {
188 180
189static const struct drm_connector_helper_funcs panel_connector_helper_funcs = { 181static const struct drm_connector_helper_funcs panel_connector_helper_funcs = {
190 .get_modes = panel_connector_get_modes, 182 .get_modes = panel_connector_get_modes,
191 .mode_valid = panel_connector_mode_valid,
192 .best_encoder = panel_connector_best_encoder, 183 .best_encoder = panel_connector_best_encoder,
193}; 184};
194 185
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
index c6e4e52f32bc..525dc1c0f1c1 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_tfp410.c
@@ -175,14 +175,6 @@ static int tfp410_connector_get_modes(struct drm_connector *connector)
175 return ret; 175 return ret;
176} 176}
177 177
178static int tfp410_connector_mode_valid(struct drm_connector *connector,
179 struct drm_display_mode *mode)
180{
181 struct tilcdc_drm_private *priv = connector->dev->dev_private;
182 /* our only constraints are what the crtc can generate: */
183 return tilcdc_crtc_mode_valid(priv->crtc, mode);
184}
185
186static struct drm_encoder *tfp410_connector_best_encoder( 178static struct drm_encoder *tfp410_connector_best_encoder(
187 struct drm_connector *connector) 179 struct drm_connector *connector)
188{ 180{
@@ -201,7 +193,6 @@ static const struct drm_connector_funcs tfp410_connector_funcs = {
201 193
202static const struct drm_connector_helper_funcs tfp410_connector_helper_funcs = { 194static const struct drm_connector_helper_funcs tfp410_connector_helper_funcs = {
203 .get_modes = tfp410_connector_get_modes, 195 .get_modes = tfp410_connector_get_modes,
204 .mode_valid = tfp410_connector_mode_valid,
205 .best_encoder = tfp410_connector_best_encoder, 196 .best_encoder = tfp410_connector_best_encoder,
206}; 197};
207 198