OSDN Git Service
(root)
/
uclinux-h8
/
linux.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[uclinux-h8/linux.git]
/
drivers
/
gpu
/
drm
/
drm_dp_mst_topology.c
diff --git
a/drivers/gpu/drm/drm_dp_mst_topology.c
b/drivers/gpu/drm/drm_dp_mst_topology.c
index
b0487c9
..
eb603f1
100644
(file)
--- a/
drivers/gpu/drm/drm_dp_mst_topology.c
+++ b/
drivers/gpu/drm/drm_dp_mst_topology.c
@@
-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);
from an EDID retrieval */
if (port->connector) {
mutex_lock(&mgr->destroy_connector_lock);
- list_add(&port->
connector->destroy_lis
t, &mgr->destroy_connector_list);
+ list_add(&port->
nex
t, &mgr->destroy_connector_list);
mutex_unlock(&mgr->destroy_connector_lock);
schedule_work(&mgr->destroy_connector_work);
mutex_unlock(&mgr->destroy_connector_lock);
schedule_work(&mgr->destroy_connector_work);
+ return;
}
drm_dp_port_teardown_pdt(port, port->pdt);
}
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);
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
/*
* 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);
*/
for (;;) {
mutex_lock(&mgr->destroy_connector_lock);
-
connector = list_first_entry_or_null(&mgr->destroy_connector_list, struct drm_connector, destroy_lis
t);
- if (!
connector
) {
+
port = list_first_entry_or_null(&mgr->destroy_connector_list, struct drm_dp_mst_port, nex
t);
+ if (!
port
) {
mutex_unlock(&mgr->destroy_connector_lock);
break;
}
mutex_unlock(&mgr->destroy_connector_lock);
break;
}
- list_del(&
connector->destroy_lis
t);
+ list_del(&
port->nex
t);
mutex_unlock(&mgr->destroy_connector_lock);
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);
}
}
}
}