[PATCH 02/13] drm/exynos: separated subdrv->probe call and encoder/connector creation.

InKi Dae inki.dae at samsung.com
Sun Aug 19 21:31:10 PDT 2012


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()

>
>> 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


More information about the dri-devel mailing list