Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

+23 -4
+19 -2
drivers/gpu/drm/armada/armada_crtc.c
··· 910 910 911 911 writel_relaxed(0, dcrtc->base + LCD_SPU_IRQ_ENA); 912 912 913 + of_node_put(dcrtc->crtc.port); 914 + 913 915 kfree(dcrtc); 914 916 } 915 917 ··· 1052 1050 } 1053 1051 1054 1052 int armada_drm_crtc_create(struct drm_device *drm, struct device *dev, 1055 - struct resource *res, int irq, const struct armada_variant *variant) 1053 + struct resource *res, int irq, const struct armada_variant *variant, 1054 + struct device_node *port) 1056 1055 { 1057 1056 struct armada_private *priv = drm->dev_private; 1058 1057 struct armada_crtc *dcrtc; ··· 1126 1123 1127 1124 priv->dcrtc[dcrtc->num] = dcrtc; 1128 1125 1126 + dcrtc->crtc.port = port; 1129 1127 drm_crtc_init(drm, &dcrtc->crtc, &armada_crtc_funcs); 1130 1128 drm_crtc_helper_add(&dcrtc->crtc, &armada_crtc_helper_funcs); 1131 1129 ··· 1146 1142 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 1147 1143 int irq = platform_get_irq(pdev, 0); 1148 1144 const struct armada_variant *variant; 1145 + struct device_node *port = NULL; 1149 1146 1150 1147 if (irq < 0) 1151 1148 return irq; ··· 1161 1156 variant = (const struct armada_variant *)id->driver_data; 1162 1157 } else { 1163 1158 const struct of_device_id *match; 1159 + struct device_node *np, *parent = dev->of_node; 1164 1160 1165 1161 match = of_match_device(dev->driver->of_match_table, dev); 1166 1162 if (!match) 1167 1163 return -ENXIO; 1168 1164 1165 + np = of_get_child_by_name(parent, "ports"); 1166 + if (np) 1167 + parent = np; 1168 + port = of_get_child_by_name(parent, "port"); 1169 + of_node_put(np); 1170 + if (!port) { 1171 + dev_err(dev, "no port node found in %s\n", 1172 + parent->full_name); 1173 + return -ENXIO; 1174 + } 1175 + 1169 1176 variant = match->data; 1170 1177 } 1171 1178 1172 - return armada_drm_crtc_create(drm, dev, res, irq, variant); 1179 + return armada_drm_crtc_create(drm, dev, res, irq, variant, port); 1173 1180 } 1174 1181 1175 1182 static void
+3 -1
drivers/gpu/drm/armada/armada_crtc.h
··· 75 75 }; 76 76 #define drm_to_armada_crtc(c) container_of(c, struct armada_crtc, crtc) 77 77 78 + struct device_node; 78 79 int 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 *); 80 82 void armada_drm_crtc_gamma_set(struct drm_crtc *, u16, u16, u16, int); 81 83 void armada_drm_crtc_gamma_get(struct drm_crtc *, u16 *, u16 *, u16 *, int); 82 84 void armada_drm_crtc_disable_irq(struct armada_crtc *, u32);
+1 -1
drivers/gpu/drm/armada/armada_drv.c
··· 169 169 goto err_kms; 170 170 171 171 ret = armada_drm_crtc_create(dev, dev->dev, res[n], irq, 172 - variant); 172 + variant, NULL); 173 173 if (ret) 174 174 goto err_kms; 175 175 }