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: