On Thu, Aug 20, 2009 at 5:52 PM, Thomas Hellstrom<thellst...@vmware.com> wrote:
> The drm sysfs class suspend / resume methods could not distinguish
> between different device types wich could lead to illegal type casts.
>
> Use struct device_type and make sure the class suspend / resume callbacks
> are aware of those. There is no per device-type suspend / resume. Only
> new-style PM.
>
Something really mangled this patch, the whitespacing is all over the place
I've attempted to save it from two different emails clients but the
diff is really messed up.

I've hand patched it but whatever sent this really isn't nice.

Dave.


> Signed-off-by: Thomas Hellstrom <thellst...@vmware.com>
> Reviewed-by: Jesse Barnes <jbar...@virtuousgeek.org>
>
> ---
>  drivers/gpu/drm/drm_sysfs.c |   54
> ++++++++++++++++++++++++++----------------
>  1 files changed, 33 insertions(+), 21 deletions(-)
>
> diff --git a/drivers/gpu/drm/drm_sysfs.c b/drivers/gpu/drm/drm_sysfs.c
> index adc1794..c086460 100644
> --- a/drivers/gpu/drm/drm_sysfs.c
> +++ b/drivers/gpu/drm/drm_sysfs.c
> @@ -22,44 +22,55 @@
>  #define to_drm_minor(d) container_of(d, struct drm_minor, kdev)
>  #define to_drm_connector(d) container_of(d, struct drm_connector, kdev)
>
> +static struct device_type drm_sysfs_device_minor = {
> +       .name = "drm_minor"
> +
> +       /**
> +        * New pm system goes here.
> +        */
> +};
> +
>  /**
> - * drm_sysfs_suspend - DRM class suspend hook
> + * drm_class_suspend - DRM class suspend hook
>  * @dev: Linux device to suspend
>  * @state: power state to enter
>  *
>  * Just figures out what the actual struct drm_device associated with
>  * @dev is and calls its suspend hook, if present.
>  */
> -static int drm_sysfs_suspend(struct device *dev, pm_message_t state)
> +static int drm_class_suspend(struct device *dev, pm_message_t state)
>  {
> -       struct drm_minor *drm_minor = to_drm_minor(dev);
> -       struct drm_device *drm_dev = drm_minor->dev;
> -
> -       if (drm_minor->type == DRM_MINOR_LEGACY &&
> -           !drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
> -           drm_dev->driver->suspend)
> -               return drm_dev->driver->suspend(drm_dev, state);
> +       if (dev->type == &drm_sysfs_device_minor) {
> +               struct drm_minor *drm_minor = to_drm_minor(dev);
> +               struct drm_device *drm_dev = drm_minor->dev;
> +
> +               if (drm_minor->type == DRM_MINOR_LEGACY &&
> +                   !drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
> +                   drm_dev->driver->suspend)
> +                       return drm_dev->driver->suspend(drm_dev, state);
> +       }
>
>        return 0;
>  }
>
>  /**
> - * drm_sysfs_resume - DRM class resume hook
> + * drm_class_resume - DRM class resume hook
>  * @dev: Linux device to resume
>  *
>  * Just figures out what the actual struct drm_device associated with
>  * @dev is and calls its resume hook, if present.
>  */
> -static int drm_sysfs_resume(struct device *dev)
> +static int drm_class_resume(struct device *dev)
>  {
> -       struct drm_minor *drm_minor = to_drm_minor(dev);
> -       struct drm_device *drm_dev = drm_minor->dev;
> -
> -       if (drm_minor->type == DRM_MINOR_LEGACY &&
> -           !drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
> -           drm_dev->driver->resume)
> -               return drm_dev->driver->resume(drm_dev);
> -
> +       if (dev->type == &drm_sysfs_device_minor) {
> +               struct drm_minor *drm_minor = to_drm_minor(dev);
> +               struct drm_device *drm_dev = drm_minor->dev;
> +
> +               if (drm_minor->type == DRM_MINOR_LEGACY &&
> +                   !drm_core_check_feature(drm_dev, DRIVER_MODESET) &&
> +                   drm_dev->driver->resume)
> +                       return drm_dev->driver->resume(drm_dev);
> +       }
>        return 0;
>  }
>
> @@ -99,8 +110,8 @@ struct class *drm_sysfs_create(struct module *owner, char
> *name)
>                goto err_out;
>        }
>
> -       class->suspend = drm_sysfs_suspend;
> -       class->resume = drm_sysfs_resume;
> +       class->suspend = drm_class_suspend;
> +       class->resume = drm_class_resume;
>
>        err = class_create_file(class, &class_attr_version);
>        if (err)
> @@ -483,6 +494,7 @@ int drm_sysfs_device_add(struct drm_minor *minor)
>        minor->kdev.class = drm_class;
>        minor->kdev.release = drm_sysfs_device_release;
>        minor->kdev.devt = minor->device;
> +       minor->kdev.type = &drm_sysfs_device_minor;
>        if (minor->type == DRM_MINOR_CONTROL)
>                minor_str = "controlD%d";
>         else if (minor->type == DRM_MINOR_RENDER)
> --
> 1.6.1.3
>
>
>

------------------------------------------------------------------------------
Let Crystal Reports handle the reporting - Free Crystal Reports 2008 30-Day 
trial. Simplify your report design, integration and deployment - and focus on 
what you do best, core application coding. Discover what's new with 
Crystal Reports now.  http://p.sf.net/sfu/bobj-july
--
_______________________________________________
Dri-devel mailing list
Dri-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/dri-devel

Reply via email to