On 08/20/2012 01:31 PM, InKi Dae wrote:
> 2012/8/20 Joonyoung Shim <jy0922.shim at samsung.com>:
>> On 08/20/2012 10:52 AM, InKi Dae wrote:
>>> 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.
>>
>> No, it is considered.
>>
> where is subdrv->remove() called when exynos_drm_encoder_create() is
> failed? I think if failed then subdrv->remove() should be called and
> if exynos_drm_connector_create() is failed then not only
> encoder->funcs->destory() but also subdrv->remove()

OK, but just add subdrv->remove(). Then if it needs, please split function.

>>> 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.
>>
>> It's ok, but it just splitting.
>>
>>
>>>>> 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
>>
>> _______________________________________________
>> dri-devel mailing list
>> dri-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/dri-devel

Reply via email to