Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7945dc58 authored by Dave Airlie's avatar Dave Airlie
Browse files

Merge tag 'topic/drm-fixes-2015-08-14' of git://anongit.freedesktop.org/drm-intel into drm-next

single MST fixes from Maarten.

* tag 'topic/drm-fixes-2015-08-14' of git://anongit.freedesktop.org/drm-intel:
  drm/dp/mst: Remove port after removing connector.
parents 3acceca9 4772ff03
Loading
Loading
Loading
Loading
+13 −6
Original line number Diff line number Diff line
@@ -873,9 +873,10 @@ static void drm_dp_destroy_port(struct kref *kref)
		   from an EDID retrieval */
		if (port->connector) {
			mutex_lock(&mgr->destroy_connector_lock);
			list_add(&port->connector->destroy_list, &mgr->destroy_connector_list);
			list_add(&port->next, &mgr->destroy_connector_list);
			mutex_unlock(&mgr->destroy_connector_lock);
			schedule_work(&mgr->destroy_connector_work);
			return;
		}
		drm_dp_port_teardown_pdt(port, port->pdt);

@@ -2659,7 +2660,7 @@ static void drm_dp_tx_work(struct work_struct *work)
static void drm_dp_destroy_connector_work(struct work_struct *work)
{
	struct drm_dp_mst_topology_mgr *mgr = container_of(work, struct drm_dp_mst_topology_mgr, destroy_connector_work);
	struct drm_connector *connector;
	struct drm_dp_mst_port *port;

	/*
	 * Not a regular list traverse as we have to drop the destroy
@@ -2668,15 +2669,21 @@ static void drm_dp_destroy_connector_work(struct work_struct *work)
	 */
	for (;;) {
		mutex_lock(&mgr->destroy_connector_lock);
		connector = list_first_entry_or_null(&mgr->destroy_connector_list, struct drm_connector, destroy_list);
		if (!connector) {
		port = list_first_entry_or_null(&mgr->destroy_connector_list, struct drm_dp_mst_port, next);
		if (!port) {
			mutex_unlock(&mgr->destroy_connector_lock);
			break;
		}
		list_del(&connector->destroy_list);
		list_del(&port->next);
		mutex_unlock(&mgr->destroy_connector_lock);

		mgr->cbs->destroy_connector(mgr, connector);
		mgr->cbs->destroy_connector(mgr, port->connector);

		drm_dp_port_teardown_pdt(port, port->pdt);

		if (!port->input && port->vcpi.vcpi > 0)
			drm_dp_mst_put_payload_id(mgr, port->vcpi.vcpi);
		kfree(port);
	}
}

+0 −2
Original line number Diff line number Diff line
@@ -743,8 +743,6 @@ struct drm_connector {
	uint8_t num_h_tile, num_v_tile;
	uint8_t tile_h_loc, tile_v_loc;
	uint16_t tile_h_size, tile_v_size;

	struct list_head destroy_list;
};

/**