Commit 6ccd895e authored by Dave Airlie's avatar Dave Airlie

Merge tag 'drm-misc-fixes-2018-12-05' of git://anongit.freedesktop.org/drm/drm-misc into drm-fixes

UAPI:
- Distinguish lease events from hotplug (Daniel)

Other:
- omap: Restore panel-dpi bus flags (Tomi)
- omap: Fix a couple of dsi issues (Sebastian)

Cc: Sebastian Reichel <sebastian.reichel@collabora.com>
Cc: Tomi Valkeinen <tomi.valkeinen@ti.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Signed-off-by: default avatarDave Airlie <airlied@redhat.com>

From: Sean Paul <sean@poorly.run>
Link: https://patchwork.freedesktop.org/patch/msgid/20181205201428.GA35447@art_vandelay
parents c6c2097a b31a3ca7
...@@ -54,7 +54,7 @@ ...@@ -54,7 +54,7 @@
#define SN_AUX_ADDR_7_0_REG 0x76 #define SN_AUX_ADDR_7_0_REG 0x76
#define SN_AUX_LENGTH_REG 0x77 #define SN_AUX_LENGTH_REG 0x77
#define SN_AUX_CMD_REG 0x78 #define SN_AUX_CMD_REG 0x78
#define AUX_CMD_SEND BIT(1) #define AUX_CMD_SEND BIT(0)
#define AUX_CMD_REQ(x) ((x) << 4) #define AUX_CMD_REQ(x) ((x) << 4)
#define SN_AUX_RDATA_REG(x) (0x79 + (x)) #define SN_AUX_RDATA_REG(x) (0x79 + (x))
#define SN_SSC_CONFIG_REG 0x93 #define SN_SSC_CONFIG_REG 0x93
......
...@@ -71,7 +71,7 @@ MODULE_PARM_DESC(drm_fbdev_overalloc, ...@@ -71,7 +71,7 @@ MODULE_PARM_DESC(drm_fbdev_overalloc,
#if IS_ENABLED(CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM) #if IS_ENABLED(CONFIG_DRM_FBDEV_LEAK_PHYS_SMEM)
static bool drm_leak_fbdev_smem = false; static bool drm_leak_fbdev_smem = false;
module_param_unsafe(drm_leak_fbdev_smem, bool, 0600); module_param_unsafe(drm_leak_fbdev_smem, bool, 0600);
MODULE_PARM_DESC(fbdev_emulation, MODULE_PARM_DESC(drm_leak_fbdev_smem,
"Allow unsafe leaking fbdev physical smem address [default=false]"); "Allow unsafe leaking fbdev physical smem address [default=false]");
#endif #endif
......
...@@ -104,6 +104,8 @@ struct device *drm_sysfs_minor_alloc(struct drm_minor *minor); ...@@ -104,6 +104,8 @@ struct device *drm_sysfs_minor_alloc(struct drm_minor *minor);
int drm_sysfs_connector_add(struct drm_connector *connector); int drm_sysfs_connector_add(struct drm_connector *connector);
void drm_sysfs_connector_remove(struct drm_connector *connector); void drm_sysfs_connector_remove(struct drm_connector *connector);
void drm_sysfs_lease_event(struct drm_device *dev);
/* drm_gem.c */ /* drm_gem.c */
int drm_gem_init(struct drm_device *dev); int drm_gem_init(struct drm_device *dev);
void drm_gem_destroy(struct drm_device *dev); void drm_gem_destroy(struct drm_device *dev);
......
...@@ -296,7 +296,7 @@ void drm_lease_destroy(struct drm_master *master) ...@@ -296,7 +296,7 @@ void drm_lease_destroy(struct drm_master *master)
if (master->lessor) { if (master->lessor) {
/* Tell the master to check the lessee list */ /* Tell the master to check the lessee list */
drm_sysfs_hotplug_event(dev); drm_sysfs_lease_event(dev);
drm_master_put(&master->lessor); drm_master_put(&master->lessor);
} }
......
...@@ -301,6 +301,16 @@ void drm_sysfs_connector_remove(struct drm_connector *connector) ...@@ -301,6 +301,16 @@ void drm_sysfs_connector_remove(struct drm_connector *connector)
connector->kdev = NULL; connector->kdev = NULL;
} }
void drm_sysfs_lease_event(struct drm_device *dev)
{
char *event_string = "LEASE=1";
char *envp[] = { event_string, NULL };
DRM_DEBUG("generating lease event\n");
kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, envp);
}
/** /**
* drm_sysfs_hotplug_event - generate a DRM uevent * drm_sysfs_hotplug_event - generate a DRM uevent
* @dev: DRM device * @dev: DRM device
......
...@@ -177,6 +177,7 @@ static int panel_dpi_probe(struct platform_device *pdev) ...@@ -177,6 +177,7 @@ static int panel_dpi_probe(struct platform_device *pdev)
dssdev->type = OMAP_DISPLAY_TYPE_DPI; dssdev->type = OMAP_DISPLAY_TYPE_DPI;
dssdev->owner = THIS_MODULE; dssdev->owner = THIS_MODULE;
dssdev->of_ports = BIT(0); dssdev->of_ports = BIT(0);
drm_bus_flags_from_videomode(&ddata->vm, &dssdev->bus_flags);
omapdss_display_init(dssdev); omapdss_display_init(dssdev);
omapdss_device_register(dssdev); omapdss_device_register(dssdev);
......
...@@ -5418,9 +5418,15 @@ static int dsi_probe(struct platform_device *pdev) ...@@ -5418,9 +5418,15 @@ static int dsi_probe(struct platform_device *pdev)
dsi->num_lanes_supported = 3; dsi->num_lanes_supported = 3;
} }
r = of_platform_populate(dev->of_node, NULL, NULL, dev);
if (r) {
DSSERR("Failed to populate DSI child devices: %d\n", r);
goto err_pm_disable;
}
r = dsi_init_output(dsi); r = dsi_init_output(dsi);
if (r) if (r)
goto err_pm_disable; goto err_of_depopulate;
r = dsi_probe_of(dsi); r = dsi_probe_of(dsi);
if (r) { if (r) {
...@@ -5428,22 +5434,16 @@ static int dsi_probe(struct platform_device *pdev) ...@@ -5428,22 +5434,16 @@ static int dsi_probe(struct platform_device *pdev)
goto err_uninit_output; goto err_uninit_output;
} }
r = of_platform_populate(dev->of_node, NULL, NULL, dev);
if (r) {
DSSERR("Failed to populate DSI child devices: %d\n", r);
goto err_uninit_output;
}
r = component_add(&pdev->dev, &dsi_component_ops); r = component_add(&pdev->dev, &dsi_component_ops);
if (r) if (r)
goto err_of_depopulate; goto err_uninit_output;
return 0; return 0;
err_of_depopulate:
of_platform_depopulate(dev);
err_uninit_output: err_uninit_output:
dsi_uninit_output(dsi); dsi_uninit_output(dsi);
err_of_depopulate:
of_platform_depopulate(dev);
err_pm_disable: err_pm_disable:
pm_runtime_disable(dev); pm_runtime_disable(dev);
return r; return r;
......
...@@ -432,7 +432,7 @@ struct omap_dss_device { ...@@ -432,7 +432,7 @@ struct omap_dss_device {
const struct omap_dss_driver *driver; const struct omap_dss_driver *driver;
const struct omap_dss_device_ops *ops; const struct omap_dss_device_ops *ops;
unsigned long ops_flags; unsigned long ops_flags;
unsigned long bus_flags; u32 bus_flags;
/* helper variable for driver suspend/resume */ /* helper variable for driver suspend/resume */
bool activate_after_resume; bool activate_after_resume;
......
...@@ -52,18 +52,45 @@ static const struct drm_encoder_funcs omap_encoder_funcs = { ...@@ -52,18 +52,45 @@ static const struct drm_encoder_funcs omap_encoder_funcs = {
.destroy = omap_encoder_destroy, .destroy = omap_encoder_destroy,
}; };
static void omap_encoder_mode_set(struct drm_encoder *encoder, static void omap_encoder_hdmi_mode_set(struct drm_encoder *encoder,
struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode) struct drm_display_mode *adjusted_mode)
{ {
struct drm_device *dev = encoder->dev; struct drm_device *dev = encoder->dev;
struct omap_encoder *omap_encoder = to_omap_encoder(encoder); struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
struct omap_dss_device *dssdev = omap_encoder->output;
struct drm_connector *connector; struct drm_connector *connector;
struct omap_dss_device *dssdev;
struct videomode vm = { 0 };
bool hdmi_mode; bool hdmi_mode;
hdmi_mode = false;
list_for_each_entry(connector, &dev->mode_config.connector_list, head) {
if (connector->encoder == encoder) {
hdmi_mode = omap_connector_get_hdmi_mode(connector);
break;
}
}
if (dssdev->ops->hdmi.set_hdmi_mode)
dssdev->ops->hdmi.set_hdmi_mode(dssdev, hdmi_mode);
if (hdmi_mode && dssdev->ops->hdmi.set_infoframe) {
struct hdmi_avi_infoframe avi;
int r; int r;
r = drm_hdmi_avi_infoframe_from_display_mode(&avi, adjusted_mode,
false);
if (r == 0)
dssdev->ops->hdmi.set_infoframe(dssdev, &avi);
}
}
static void omap_encoder_mode_set(struct drm_encoder *encoder,
struct drm_display_mode *mode,
struct drm_display_mode *adjusted_mode)
{
struct omap_encoder *omap_encoder = to_omap_encoder(encoder);
struct omap_dss_device *dssdev;
struct videomode vm = { 0 };
drm_display_mode_to_videomode(adjusted_mode, &vm); drm_display_mode_to_videomode(adjusted_mode, &vm);
/* /*
...@@ -112,27 +139,8 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder, ...@@ -112,27 +139,8 @@ static void omap_encoder_mode_set(struct drm_encoder *encoder,
} }
/* Set the HDMI mode and HDMI infoframe if applicable. */ /* Set the HDMI mode and HDMI infoframe if applicable. */
hdmi_mode = false; if (omap_encoder->output->output_type == OMAP_DISPLAY_TYPE_HDMI)
list_for_each_entry(connector, &dev->mode_config.connector_list, head) { omap_encoder_hdmi_mode_set(encoder, adjusted_mode);
if (connector->encoder == encoder) {
hdmi_mode = omap_connector_get_hdmi_mode(connector);
break;
}
}
dssdev = omap_encoder->output;
if (dssdev->ops->hdmi.set_hdmi_mode)
dssdev->ops->hdmi.set_hdmi_mode(dssdev, hdmi_mode);
if (hdmi_mode && dssdev->ops->hdmi.set_infoframe) {
struct hdmi_avi_infoframe avi;
r = drm_hdmi_avi_infoframe_from_display_mode(&avi, adjusted_mode,
false);
if (r == 0)
dssdev->ops->hdmi.set_infoframe(dssdev, &avi);
}
} }
static void omap_encoder_disable(struct drm_encoder *encoder) static void omap_encoder_disable(struct drm_encoder *encoder)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment