aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2014-06-15 06:21:23 -0400
committerRussell King <rmk+kernel@arm.linux.org.uk>2014-07-11 15:34:47 -0400
commit9611cb93fa65dde199f4f888bd034ffc80c7adf0 (patch)
treec42fdbea2faf79b6696e83be709133ec55bd3029
parentd8c96083cf5e4a910c20836414e8a06ebcf07317 (diff)
drm/armada: register crtc with port
Register the CRTC with the port node so that the DRM OF helpers can find the appropriate CRTC. This is important so that encoders can identify their corresponding possible CRTCs. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.c21
-rw-r--r--drivers/gpu/drm/armada/armada_crtc.h4
-rw-r--r--drivers/gpu/drm/armada/armada_drv.c2
3 files changed, 23 insertions, 4 deletions
diff --git a/drivers/gpu/drm/armada/armada_crtc.c b/drivers/gpu/drm/armada/armada_crtc.c
index 0642b5cfa563..3f620e21e06b 100644
--- a/drivers/gpu/drm/armada/armada_crtc.c
+++ b/drivers/gpu/drm/armada/armada_crtc.c
@@ -910,6 +910,8 @@ static void armada_drm_crtc_destroy(struct drm_crtc *crtc)
910 910
911 writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ENA); 911 writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ENA);
912 912
913 of_node_put(dcrtc->crtc.port);
914
913 kfree(dcrtc); 915 kfree(dcrtc);
914} 916}
915 917
@@ -1050,7 +1052,8 @@ static int armada_drm_crtc_create_properties(struct drm_device *dev)
1050} 1052}
1051 1053
1052int armada_drm_crtc_create(struct drm_device *drm, struct device *dev, 1054int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
1053 struct resource *res, int irq, const struct armada_variant *variant) 1055 struct resource *res, int irq, const struct armada_variant *variant,
1056 struct device_node *port)
1054{ 1057{
1055 struct armada_private *priv = drm->dev_private; 1058 struct armada_private *priv = drm->dev_private;
1056 struct armada_crtc *dcrtc; 1059 struct armada_crtc *dcrtc;
@@ -1123,6 +1126,7 @@ int armada_drm_crtc_create(struct drm_device *drm, struct device *dev,
1123 1126
1124 priv->dcrtc[dcrtc->num] = dcrtc; 1127 priv->dcrtc[dcrtc->num] = dcrtc;
1125 1128
1129 dcrtc->crtc.port = port;
1126 drm_crtc_init(drm, &dcrtc->crtc, &armada_crtc_funcs); 1130 drm_crtc_init(drm, &dcrtc->crtc, &armada_crtc_funcs);
1127 drm_crtc_helper_add(&dcrtc->crtc, &armada_crtc_helper_funcs); 1131 drm_crtc_helper_add(&dcrtc->crtc, &armada_crtc_helper_funcs);
1128 1132
@@ -1142,6 +1146,7 @@ armada_lcd_bind(struct device *dev, struct device *master, void *data)
1142 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1146 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
1143 int irq = platform_get_irq(pdev, 0); 1147 int irq = platform_get_irq(pdev, 0);
1144 const struct armada_variant *variant; 1148 const struct armada_variant *variant;
1149 struct device_node *port = NULL;
1145 1150
1146 if (irq < 0) 1151 if (irq < 0)
1147 return irq; 1152 return irq;
@@ -1156,15 +1161,27 @@ armada_lcd_bind(struct device *dev, struct device *master, void *data)
1156 variant = (const struct armada_variant *)id->driver_data; 1161 variant = (const struct armada_variant *)id->driver_data;
1157 } else { 1162 } else {
1158 const struct of_device_id *match; 1163 const struct of_device_id *match;
1164 struct device_node *np, *parent = dev->of_node;
1159 1165
1160 match = of_match_device(dev->driver->of_match_table, dev); 1166 match = of_match_device(dev->driver->of_match_table, dev);
1161 if (!match) 1167 if (!match)
1162 return -ENXIO; 1168 return -ENXIO;
1163 1169
1170 np = of_get_child_by_name(parent, "ports");
1171 if (np)
1172 parent = np;
1173 port = of_get_child_by_name(parent, "port");
1174 of_node_put(np);
1175 if (!port) {
1176 dev_err(dev, "no port node found in %s\n",
1177 parent->full_name);
1178 return -ENXIO;
1179 }
1180
1164 variant = match->data; 1181 variant = match->data;
1165 } 1182 }
1166 1183
1167 return armada_drm_crtc_create(drm, dev, res, irq, variant); 1184 return armada_drm_crtc_create(drm, dev, res, irq, variant, port);
1168} 1185}
1169 1186
1170static void 1187static void
diff --git a/drivers/gpu/drm/armada/armada_crtc.h b/drivers/gpu/drm/armada/armada_crtc.h
index 0d9a80392b1e..98102a5a9af5 100644
--- a/drivers/gpu/drm/armada/armada_crtc.h
+++ b/drivers/gpu/drm/armada/armada_crtc.h
@@ -75,8 +75,10 @@ struct armada_crtc {
75}; 75};
76#define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc) 76#define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc)
77 77
78struct device_node;
78int armada_drm_crtc_create(struct drm_device *, struct device *, 79int armada_drm_crtc_create(struct drm_device *, struct device *,
79 struct resource *, int, const struct armada_variant *); 80 struct resource *, int, const struct armada_variant *,
81 struct device_node *);
80void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int); 82void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int);
81void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int); 83void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int);
82void armada_drm_crtc_disable_irq(struct armada_crtc *, u32); 84void armada_drm_crtc_disable_irq(struct armada_crtc *, u32);
diff --git a/drivers/gpu/drm/armada/armada_drv.c b/drivers/gpu/drm/armada/armada_drv.c
index f237f44d8b6d..e2d5792b140f 100644
--- a/drivers/gpu/drm/armada/armada_drv.c
+++ b/drivers/gpu/drm/armada/armada_drv.c
@@ -169,7 +169,7 @@ static int armada_drm_load(struct drm_device *dev, unsigned long flags)
169 goto err_kms; 169 goto err_kms;
170 170
171 ret = armada_drm_crtc_create(dev, dev->dev, res[n], irq, 171 ret = armada_drm_crtc_create(dev, dev->dev, res[n], irq,
172 variant); 172 variant, NULL);
173 if (ret) 173 if (ret)
174 goto err_kms; 174 goto err_kms;
175 } 175 }