[PATCH 02/13] drm/exynos: separated subdrv->probe call and encoder/connector creation.
InKi Dae
inki.dae at samsung.com
Sun Aug 19 18:52:29 PDT 2012
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
More information about the dri-devel
mailing list