/** * radeon_hotplug_work_func - display hotplug work handler * * @work: work struct * * This is the hot plug event work handler (all asics). * The work gets scheduled from the irq handler if there * was a hot plug interrupt. It walks the connector table * and calls the hotplug handler for each one, then sends * a drm hotplug event to alert userspace. */ static void radeon_hotplug_work_func(void *arg, int pending) { struct radeon_device *rdev = arg; struct drm_device *dev = rdev->ddev; struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector *connector; if (mode_config->num_connector) { list_for_each_entry(connector, &mode_config->connector_list, head) radeon_connector_hotplug(connector); } /* Just fire off a uevent and let userspace tell us what to do */ drm_helper_hpd_irq_event(dev); }
static void radeon_dp_work_func(struct work_struct *work) { struct radeon_device *rdev = container_of(work, struct radeon_device, dp_work); struct drm_device *dev = rdev->ddev; struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector *connector; /* this should take a mutex */ if (mode_config->num_connector) { list_for_each_entry(connector, &mode_config->connector_list, head) radeon_connector_hotplug(connector); } }
/* * Handle hotplug events outside the interrupt handler proper. */ static void radeon_hotplug_work_func(struct work_struct *work) { struct radeon_device *rdev = container_of(work, struct radeon_device, hotplug_work); struct drm_device *dev = rdev->ddev; struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector *connector; if (mode_config->num_connector) { list_for_each_entry(connector, &mode_config->connector_list, head) radeon_connector_hotplug(connector); } /* Just fire off a uevent and let userspace tell us what to do */ drm_sysfs_hotplug_event(dev); }
static void radeon_hotplug_work_func(struct work_struct *work) { struct radeon_device *rdev = container_of(work, struct radeon_device, hotplug_work); struct drm_device *dev = rdev->ddev; struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector *connector; if (mode_config->num_connector) { list_for_each_entry(connector, &mode_config->connector_list, head) radeon_connector_hotplug(connector); } drm_helper_hpd_irq_event(dev); }
/** * radeon_hotplug_work_func - display hotplug work handler * * @work: work struct * * This is the hot plug event work handler (all asics). * The work gets scheduled from the irq handler if there * was a hot plug interrupt. It walks the connector table * and calls the hotplug handler for each one, then sends * a drm hotplug event to alert userspace. */ static void radeon_hotplug_work_func(struct work_struct *work) { struct radeon_device *rdev = container_of(work, struct radeon_device, hotplug_work); struct drm_device *dev = rdev->ddev; struct drm_mode_config *mode_config = &dev->mode_config; struct drm_connector *connector; /* we can race here at startup, some boards seem to trigger * hotplug irqs when they shouldn't. */ if (!rdev->mode_info.mode_config_initialized) return; mutex_lock(&mode_config->mutex); if (mode_config->num_connector) { list_for_each_entry(connector, &mode_config->connector_list, head) radeon_connector_hotplug(connector); } mutex_unlock(&mode_config->mutex); /* Just fire off a uevent and let userspace tell us what to do */ drm_helper_hpd_irq_event(dev); }