2012/8/20 Joonyoung Shim <jy0922.shim at samsung.com>:
> On 08/17/2012 06:50 PM, Inki Dae wrote:
>>
>> this patch separates sub driver's probe call and encoder/connector
>> creation
>> so that exynos drm core module can take exception when some operation was
>> failed properly.
>
>
> Which exceptions? I don't know this patch gives any benefit to us.
>

previous code didn't take exception when exynos_drm_encoder_create()
is falied. and for now, exynos_drm_encoder/connector_create functions
was called at exynos_drm_subdrv_probe() so know that this patch is for
code clean by separating them into two parts also.

>
>>
>> Signed-off-by: Inki Dae <inki.dae at samsung.com>
>> Signed-off-by: Kyungmin Park <kyungmin.park at samsung.com>
>> ---
>>   drivers/gpu/drm/exynos/exynos_drm_core.c |   93
>> +++++++++++++++++++++---------
>>   1 files changed, 65 insertions(+), 28 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_core.c
>> b/drivers/gpu/drm/exynos/exynos_drm_core.c
>> index 84dd099..1c8d5fe 100644
>> --- a/drivers/gpu/drm/exynos/exynos_drm_core.c
>> +++ b/drivers/gpu/drm/exynos/exynos_drm_core.c
>> @@ -34,30 +34,15 @@
>>     static LIST_HEAD(exynos_drm_subdrv_list);
>>   -static int exynos_drm_subdrv_probe(struct drm_device *dev,
>> +static int exynos_drm_create_enc_conn(struct drm_device *dev,
>>                                         struct exynos_drm_subdrv *subdrv)
>>   {
>>         struct drm_encoder *encoder;
>>         struct drm_connector *connector;
>> +       int ret;
>>         DRM_DEBUG_DRIVER("%s\n", __FILE__);
>>   -     if (subdrv->probe) {
>> -               int ret;
>> -
>> -               /*
>> -                * this probe callback would be called by sub driver
>> -                * after setting of all resources to this sub driver,
>> -                * such as clock, irq and register map are done or by
>> load()
>> -                * of exynos drm driver.
>> -                *
>> -                * P.S. note that this driver is considered for
>> modularization.
>> -                */
>> -               ret = subdrv->probe(dev, subdrv->dev);
>> -               if (ret)
>> -                       return ret;
>> -       }
>> -
>>         if (!subdrv->manager)
>>                 return 0;
>>   @@ -78,24 +63,22 @@ static int exynos_drm_subdrv_probe(struct drm_device
>> *dev,
>>         connector = exynos_drm_connector_create(dev, encoder);
>>         if (!connector) {
>>                 DRM_ERROR("failed to create connector\n");
>> -               encoder->funcs->destroy(encoder);
>> -               return -EFAULT;
>> +               ret = -EFAULT;
>> +               goto err_destroy_encoder;
>>         }
>>         subdrv->encoder = encoder;
>>         subdrv->connector = connector;
>>         return 0;
>> +
>> +err_destroy_encoder:
>> +       encoder->funcs->destroy(encoder);
>> +       return ret;
>>   }
>>   -static void exynos_drm_subdrv_remove(struct drm_device *dev,
>> -                                     struct exynos_drm_subdrv *subdrv)
>> +static void exynos_drm_destroy_enc_conn(struct exynos_drm_subdrv *subdrv)
>>   {
>> -       DRM_DEBUG_DRIVER("%s\n", __FILE__);
>> -
>> -       if (subdrv->remove)
>> -               subdrv->remove(dev);
>> -
>>         if (subdrv->encoder) {
>>                 struct drm_encoder *encoder = subdrv->encoder;
>>                 encoder->funcs->destroy(encoder);
>> @@ -109,9 +92,48 @@ static void exynos_drm_subdrv_remove(struct drm_device
>> *dev,
>>         }
>>   }
>>   +static int exynos_drm_subdrv_probe(struct drm_device *dev,
>> +                                       struct exynos_drm_subdrv *subdrv)
>> +{
>> +       if (subdrv->probe) {
>> +               int ret;
>> +
>> +               subdrv->drm_dev = dev;
>> +
>> +               /*
>> +                * this probe callback would be called by sub driver
>> +                * after setting of all resources to this sub driver,
>> +                * such as clock, irq and register map are done or by
>> load()
>> +                * of exynos drm driver.
>> +                *
>> +                * P.S. note that this driver is considered for
>> modularization.
>> +                */
>> +               ret = subdrv->probe(dev, subdrv->dev);
>> +               if (ret)
>> +                       return ret;
>> +       }
>> +
>> +       if (!subdrv->manager)
>> +               return -EINVAL;
>> +
>> +       subdrv->manager->dev = subdrv->dev;
>> +
>> +       return 0;
>> +}
>> +
>> +static void exynos_drm_subdrv_remove(struct drm_device *dev,
>> +                                     struct exynos_drm_subdrv *subdrv)
>> +{
>> +       DRM_DEBUG_DRIVER("%s\n", __FILE__);
>> +
>> +       if (subdrv->remove)
>> +               subdrv->remove(dev, subdrv->dev);
>> +}
>> +
>>   int exynos_drm_device_register(struct drm_device *dev)
>>   {
>>         struct exynos_drm_subdrv *subdrv, *n;
>> +       unsigned int fine_cnt = 0;
>>         int err;
>>         DRM_DEBUG_DRIVER("%s\n", __FILE__);
>> @@ -120,14 +142,27 @@ int exynos_drm_device_register(struct drm_device
>> *dev)
>>                 return -EINVAL;
>>         list_for_each_entry_safe(subdrv, n, &exynos_drm_subdrv_list, list)
>> {
>> -               subdrv->drm_dev = dev;
>>                 err = exynos_drm_subdrv_probe(dev, subdrv);
>>                 if (err) {
>>                         DRM_DEBUG("exynos drm subdrv probe failed.\n");
>>                         list_del(&subdrv->list);
>> +                       continue;
>>                 }
>> +
>> +               err = exynos_drm_create_enc_conn(dev, subdrv);
>> +               if (err) {
>> +                       DRM_DEBUG("failed to create encoder and
>> connector.\n");
>> +                       exynos_drm_subdrv_remove(dev, subdrv);
>> +                       list_del(&subdrv->list);
>> +                       continue;
>> +               }
>> +
>> +               fine_cnt++;
>>         }
>>   +     if (!fine_cnt)
>> +               return -EINVAL;
>> +
>>         return 0;
>>   }
>>   EXPORT_SYMBOL_GPL(exynos_drm_device_register);
>> @@ -143,8 +178,10 @@ int exynos_drm_device_unregister(struct drm_device
>> *dev)
>>                 return -EINVAL;
>>         }
>>   -     list_for_each_entry(subdrv, &exynos_drm_subdrv_list, list)
>> +       list_for_each_entry(subdrv, &exynos_drm_subdrv_list, list) {
>>                 exynos_drm_subdrv_remove(dev, subdrv);
>> +               exynos_drm_destroy_enc_conn(subdrv);
>> +       }
>>         return 0;
>>   }
>
>
> _______________________________________________
> dri-devel mailing list
> dri-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to