Skip to content

Commit

Permalink
drm/connector: Give connector sysfs devices there own device_type
Browse files Browse the repository at this point in the history
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
  • Loading branch information
Hans de Goede committed Aug 20, 2021
1 parent c778244 commit 331de7d
Showing 1 changed file with 37 additions and 13 deletions.
50 changes: 37 additions & 13 deletions drivers/gpu/drm/drm_sysfs.c
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,10 @@ static struct device_type drm_sysfs_device_minor = {
.name = "drm_minor"
};

static struct device_type drm_sysfs_device_connector = {
.name = "drm_connector",
};

struct class *drm_class;

static char *drm_devnode(struct device *dev, umode_t *mode)
Expand Down Expand Up @@ -102,6 +106,11 @@ void drm_sysfs_destroy(void)
drm_class = NULL;
}

static void drm_sysfs_release(struct device *dev)
{
kfree(dev);
}

/*
* Connector properties
*/
Expand Down Expand Up @@ -273,27 +282,47 @@ static const struct attribute_group *connector_dev_groups[] = {
int drm_sysfs_connector_add(struct drm_connector *connector)
{
struct drm_device *dev = connector->dev;
struct device *kdev;
int r;

if (connector->kdev)
return 0;

connector->kdev =
device_create_with_groups(drm_class, dev->primary->kdev, 0,
connector, connector_dev_groups,
"card%d-%s", dev->primary->index,
connector->name);
kdev = kzalloc(sizeof(*kdev), GFP_KERNEL);
if (!kdev)
return -ENOMEM;

device_initialize(kdev);
kdev->class = drm_class;
kdev->type = &drm_sysfs_device_connector;
kdev->parent = dev->primary->kdev;
kdev->groups = connector_dev_groups;
kdev->release = drm_sysfs_release;
dev_set_drvdata(kdev, connector);

r = dev_set_name(kdev, "card%d-%s", dev->primary->index, connector->name);
if (r)
goto err_free;

DRM_DEBUG("adding \"%s\" to sysfs\n",
connector->name);

if (IS_ERR(connector->kdev)) {
DRM_ERROR("failed to register connector device: %ld\n", PTR_ERR(connector->kdev));
return PTR_ERR(connector->kdev);
r = device_add(kdev);
if (r) {
drm_err(dev, "failed to register connector device: %d\n", r);
goto err_free;
}

connector->kdev = kdev;

if (connector->ddc)
return sysfs_create_link(&connector->kdev->kobj,
&connector->ddc->dev.kobj, "ddc");
return 0;

err_free:
put_device(kdev);
return r;
}

void drm_sysfs_connector_remove(struct drm_connector *connector)
Expand Down Expand Up @@ -374,11 +403,6 @@ void drm_sysfs_connector_status_event(struct drm_connector *connector,
}
EXPORT_SYMBOL(drm_sysfs_connector_status_event);

static void drm_sysfs_release(struct device *dev)
{
kfree(dev);
}

struct device *drm_sysfs_minor_alloc(struct drm_minor *minor)
{
const char *minor_str;
Expand Down

0 comments on commit 331de7d

Please sign in to comment.