struct gpio_desc *enable_gpio;
        struct gpio_desc *hpd_gpio;
 
+       const struct edp_panel_entry *detected_panel;
+
        struct edid *edid;
 
        struct drm_display_mode override_mode;
 
 static int generic_edp_panel_probe(struct device *dev, struct panel_edp *panel)
 {
-       const struct edp_panel_entry *edp_panel;
        struct panel_desc *desc;
        u32 panel_id;
        char vend[4];
        }
        drm_edid_decode_panel_id(panel_id, vend, &product_id);
 
-       edp_panel = find_edp_panel(panel_id);
+       panel->detected_panel = find_edp_panel(panel_id);
 
        /*
         * We're using non-optimized timings and want it really obvious that
         * someone needs to add an entry to the table, so we'll do a WARN_ON
         * splat.
         */
-       if (WARN_ON(!edp_panel)) {
+       if (WARN_ON(!panel->detected_panel)) {
                dev_warn(dev,
                         "Unknown panel %s %#06x, using conservative timings\n",
                         vend, product_id);
                 */
                desc->delay.unprepare = 2000;
                desc->delay.enable = 200;
+
+               panel->detected_panel = ERR_PTR(-EINVAL);
        } else {
                dev_info(dev, "Detected %s %s (%#06x)\n",
-                        vend, edp_panel->name, product_id);
+                        vend, panel->detected_panel->name, product_id);
 
                /* Update the delay; everything else comes from EDID */
-               desc->delay = *edp_panel->delay;
+               desc->delay = *panel->detected_panel->delay;
        }
 
        ret = 0;
        return ret;
 }
 
+static ssize_t detected_panel_show(struct device *dev,
+                                  struct device_attribute *attr, char *buf)
+{
+       struct panel_edp *p = dev_get_drvdata(dev);
+
+       if (IS_ERR(p->detected_panel))
+               return sysfs_emit(buf, "UNKNOWN\n");
+       else if (!p->detected_panel)
+               return sysfs_emit(buf, "HARDCODED\n");
+       else
+               return sysfs_emit(buf, "%s\n", p->detected_panel->name);
+}
+
+static const DEVICE_ATTR_RO(detected_panel);
+
+static void edp_panel_remove_detected_panel(void *data)
+{
+       struct panel_edp *p = data;
+
+       device_remove_file(p->base.dev, &dev_attr_detected_panel);
+}
+
 static int panel_edp_probe(struct device *dev, const struct panel_desc *desc,
                           struct drm_dp_aux *aux)
 {
 
        drm_panel_add(&panel->base);
 
+       err = device_create_file(dev, &dev_attr_detected_panel);
+       if (!err)
+               devm_add_action_or_reset(dev, edp_panel_remove_detected_panel, panel);
+
        return 0;
 
 err_finished_pm_runtime: