On Fri, 2009-05-22 at 20:15 +0800, Ma Ling wrote:
> We use connector type id as sequence to avoid duplicate connector name.
> However for some connectors that advertise multiple functions
> we have to meet the same issue, i.e. connector advertise two functions-
> DVI and VGA, actually only VGA is real one, in init function card0-VGA-1
> is allocated for CRT, and card0-DVI-D-1 is allocated for DVI, but until
> detection process complete we could be aware of VGA, not DVI for this 
> connector,
> then we change constructed connector type as VGA, which cause that
> the name card0-VGA-1 would be allocated to both a CRT and that connector.
> The patch intends to avoid above case by exporting get and put connector type 
> id.

This whole renaming connectors thing seems broken to me.  Whatever
detection is required should be done once at init, and appropriate
connectors created.  Is there something preventing that?

> Signed-off-by: Ma Ling <[email protected]>
> ---
>  drivers/gpu/drm/drm_crtc.c  |   14 ++++++++++++--
>  drivers/gpu/drm/drm_sysfs.c |    3 +++
>  include/drm/drm_crtc.h      |    3 +++
>  3 files changed, 18 insertions(+), 2 deletions(-)
> 
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 94a7688..a876f71 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -148,6 +148,16 @@ static struct drm_conn_prop_enum_list 
> drm_connector_enum_list[] =
>       { DRM_MODE_CONNECTOR_HDMIB, "HDMI Type B", 0 },
>  };
>  
> +int drm_get_connector_type_id(struct drm_connector *connector)
> +{
> +     return  ++drm_connector_enum_list[connector->connector_type].count;
> +}
> +
> +void drm_put_connector_type_id(struct drm_connector *connector)
> +{
> +     --drm_connector_enum_list[connector->connector_type].count;
> +}
> +
>  static struct drm_prop_enum_list drm_encoder_enum_list[] =
>  {    { DRM_MODE_ENCODER_NONE, "None" },
>       { DRM_MODE_ENCODER_DAC, "DAC" },
> @@ -451,8 +461,7 @@ void drm_connector_init(struct drm_device *dev,
>       connector->funcs = funcs;
>       drm_mode_object_get(dev, &connector->base, DRM_MODE_OBJECT_CONNECTOR);
>       connector->connector_type = connector_type;
> -     connector->connector_type_id =
> -             ++drm_connector_enum_list[connector_type].count; /* TODO */
> +     connector->connector_type_id = drm_get_connector_type_id(connector);
>       INIT_LIST_HEAD(&connector->user_modes);
>       INIT_LIST_HEAD(&connector->probed_modes);
>       INIT_LIST_HEAD(&connector->modes);
> @@ -485,6 +494,7 @@ void drm_connector_cleanup(struct drm_connector 
> *connector)
>       struct drm_device *dev = connector->dev;
>       struct drm_display_mode *mode, *t;
>  
> +     drm_put_connector_type_id(connector);
>       list_for_each_entry_safe(mode, t, &connector->probed_modes, head)
>               drm_mode_remove(connector, mode);
>  
> diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
> index 8f93729..b56c0b9 100644
> --- a/drivers/gpu/drm/drm_sysfs.c
> +++ b/drivers/gpu/drm/drm_sysfs.c
> @@ -343,6 +343,8 @@ int drm_sysfs_connector_add(struct drm_connector 
> *connector)
>       /* We shouldn't get called more than once for the same connector */
>       BUG_ON(device_is_registered(&connector->kdev));
>  
> +     drm_put_connector_type_id(connector);
> +     drm_get_connector_type_id(connector);
>       connector->kdev.parent = &dev->primary->kdev;
>       connector->kdev.class = drm_class;
>       connector->kdev.release = drm_sysfs_device_release;
> @@ -428,6 +430,7 @@ void drm_sysfs_connector_remove(struct drm_connector 
> *connector)
>       DRM_DEBUG("removing \"%s\" from sysfs\n",
>                 drm_get_connector_name(connector));
>  
> +     drm_put_connector_type_id(connector);
>       for (i = 0; i < ARRAY_SIZE(connector_attrs); i++)
>               device_remove_file(&connector->kdev, &connector_attrs[i]);
>       sysfs_remove_bin_file(&connector->kdev.kobj, &edid_attr);
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 3c1924c..64ce824 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -733,4 +733,7 @@ extern int drm_mode_gamma_get_ioctl(struct drm_device 
> *dev,
>  extern int drm_mode_gamma_set_ioctl(struct drm_device *dev,
>                                   void *data, struct drm_file *file_priv);
>  extern bool drm_detect_hdmi_monitor(struct edid *edid);
> +
> +extern int drm_get_connector_type_id(struct drm_connector *connector);
> +extern void drm_put_connector_type_id(struct drm_connector *connector);
>  #endif /* __DRM_CRTC_H__ */
> -- 
> 1.5.4.4
> 
> 
> 
> _______________________________________________
> Intel-gfx mailing list
> [email protected]
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
-- 
Eric Anholt
[email protected]                         [email protected]


Attachment: signature.asc
Description: This is a digitally signed message part

------------------------------------------------------------------------------
Register Now for Creativity and Technology (CaT), June 3rd, NYC. CaT
is a gathering of tech-side developers & brand creativity professionals. Meet
the minds behind Google Creative Lab, Visual Complexity, Processing, & 
iPhoneDevCamp asthey present alongside digital heavyweights like Barbarian
Group, R/GA, & Big Spaceship. http://www.creativitycat.com 
--
_______________________________________________
Dri-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to