Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

drm/connector: Give connector sysfs devices there own device_type

Give connector sysfs devices there own device_type, this allows us to
check if a device passed to functions dealing with generic devices is
a drm_connector or not.

A check like this is necessary in the drm_connector_acpi_bus_match()
function added in the next patch in this series.

Tested-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Reviewed-by: Lyude Paul <lyude@redhat.com>
Link: https://lore.kernel.org/r/20210817215201.795062-2-hdegoede@redhat.com

+37 -13
+37 -13
drivers/gpu/drm/drm_sysfs.c
··· 50 50 .name = "drm_minor" 51 51 }; 52 52 53 + static struct device_type drm_sysfs_device_connector = { 54 + .name = "drm_connector", 55 + }; 56 + 53 57 struct class *drm_class; 54 58 55 59 static char *drm_devnode(struct device *dev, umode_t *mode) ··· 104 100 class_remove_file(drm_class, &class_attr_version.attr); 105 101 class_destroy(drm_class); 106 102 drm_class = NULL; 103 + } 104 + 105 + static void drm_sysfs_release(struct device *dev) 106 + { 107 + kfree(dev); 107 108 } 108 109 109 110 /* ··· 282 273 int drm_sysfs_connector_add(struct drm_connector *connector) 283 274 { 284 275 struct drm_device *dev = connector->dev; 276 + struct device *kdev; 277 + int r; 285 278 286 279 if (connector->kdev) 287 280 return 0; 288 281 289 - connector->kdev = 290 - device_create_with_groups(drm_class, dev->primary->kdev, 0, 291 - connector, connector_dev_groups, 292 - "card%d-%s", dev->primary->index, 293 - connector->name); 282 + kdev = kzalloc(sizeof(*kdev), GFP_KERNEL); 283 + if (!kdev) 284 + return -ENOMEM; 285 + 286 + device_initialize(kdev); 287 + kdev->class = drm_class; 288 + kdev->type = &drm_sysfs_device_connector; 289 + kdev->parent = dev->primary->kdev; 290 + kdev->groups = connector_dev_groups; 291 + kdev->release = drm_sysfs_release; 292 + dev_set_drvdata(kdev, connector); 293 + 294 + r = dev_set_name(kdev, "card%d-%s", dev->primary->index, connector->name); 295 + if (r) 296 + goto err_free; 297 + 294 298 DRM_DEBUG("adding \"%s\" to sysfs\n", 295 299 connector->name); 296 300 297 - if (IS_ERR(connector->kdev)) { 298 - DRM_ERROR("failed to register connector device: %ld\n", PTR_ERR(connector->kdev)); 299 - return PTR_ERR(connector->kdev); 301 + r = device_add(kdev); 302 + if (r) { 303 + drm_err(dev, "failed to register connector device: %d\n", r); 304 + goto err_free; 300 305 } 306 + 307 + connector->kdev = kdev; 301 308 302 309 if (connector->ddc) 303 310 return sysfs_create_link(&connector->kdev->kobj, 304 311 &connector->ddc->dev.kobj, "ddc"); 305 312 return 0; 313 + 314 + err_free: 315 + put_device(kdev); 316 + return r; 306 317 } 307 318 308 319 void drm_sysfs_connector_remove(struct drm_connector *connector) ··· 402 373 kobject_uevent_env(&dev->primary->kdev->kobj, KOBJ_CHANGE, envp); 403 374 } 404 375 EXPORT_SYMBOL(drm_sysfs_connector_status_event); 405 - 406 - static void drm_sysfs_release(struct device *dev) 407 - { 408 - kfree(dev); 409 - } 410 376 411 377 struct device *drm_sysfs_minor_alloc(struct drm_minor *minor) 412 378 {