diff --git a/drivers/gpu/msm/adreno.c b/drivers/gpu/msm/adreno.c index 39126ba9f4df..3fe7dd82510d 100644 --- a/drivers/gpu/msm/adreno.c +++ b/drivers/gpu/msm/adreno.c @@ -1517,8 +1517,11 @@ static int adreno_probe(struct platform_device *pdev) KGSL_MEMSTORE_SIZE, 0, priv, "memstore"); status = PTR_ERR_OR_ZERO(device->memstore); - if (status) - goto out; + if (status) { + kgsl_device_platform_remove(device); + device->pdev = NULL; + return status; + } /* Initialize the snapshot engine */ size = adreno_dev->gpucore->snapshot_size; @@ -1533,10 +1536,6 @@ static int adreno_probe(struct platform_device *pdev) kgsl_device_snapshot_probe(device, size); - status = adreno_dispatcher_init(adreno_dev); - if (status) - goto out; - adreno_debugfs_init(adreno_dev); adreno_profile_init(adreno_dev); @@ -1577,13 +1576,8 @@ static int adreno_probe(struct platform_device *pdev) } } #endif -out: - if (status) { - kgsl_device_platform_remove(device); - device->pdev = NULL; - } - return status; + return 0; } static void _adreno_free_memories(struct adreno_device *adreno_dev) @@ -1816,6 +1810,10 @@ static int adreno_init(struct kgsl_device *device) if (test_bit(ADRENO_DEVICE_INITIALIZED, &adreno_dev->priv)) return 0; + ret = adreno_dispatcher_init(adreno_dev); + if (ret) + return ret; + ret = adreno_ringbuffer_init(adreno_dev); if (ret) return ret; diff --git a/drivers/gpu/msm/adreno_dispatch.c b/drivers/gpu/msm/adreno_dispatch.c index f396224fc2a5..a8f3e0592cf1 100644 --- a/drivers/gpu/msm/adreno_dispatch.c +++ b/drivers/gpu/msm/adreno_dispatch.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2013-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2013-2020, The Linux Foundation. All rights reserved. */ #include @@ -2802,8 +2802,16 @@ int adreno_dispatcher_init(struct adreno_device *adreno_dev) struct adreno_dispatcher *dispatcher = &adreno_dev->dispatcher; int ret, i; + if (test_bit(ADRENO_DISPATCHER_INIT, &dispatcher->priv)) + return 0; + memset(dispatcher, 0, sizeof(*dispatcher)); + ret = kobject_init_and_add(&dispatcher->kobj, &ktype_dispatcher, + &device->dev->kobj, "dispatch"); + if (ret) + return ret; + mutex_init(&dispatcher->mutex); timer_setup(&dispatcher->timer, adreno_dispatcher_timer, 0); @@ -2820,10 +2828,9 @@ int adreno_dispatcher_init(struct adreno_device *adreno_dev) for (i = 0; i < ARRAY_SIZE(dispatcher->jobs); i++) init_llist_head(&dispatcher->jobs[i]); - ret = kobject_init_and_add(&dispatcher->kobj, &ktype_dispatcher, - &device->dev->kobj, "dispatch"); + set_bit(ADRENO_DISPATCHER_INIT, &dispatcher->priv); - return ret; + return 0; } void adreno_dispatcher_halt(struct kgsl_device *device) diff --git a/drivers/gpu/msm/adreno_dispatch.h b/drivers/gpu/msm/adreno_dispatch.h index 254ab9f873df..3cfd4c60ae6d 100644 --- a/drivers/gpu/msm/adreno_dispatch.h +++ b/drivers/gpu/msm/adreno_dispatch.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2008-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2008-2020, The Linux Foundation. All rights reserved. */ #ifndef ____ADRENO_DISPATCHER_H @@ -83,7 +83,8 @@ struct adreno_dispatcher { enum adreno_dispatcher_flags { ADRENO_DISPATCHER_POWER = 0, - ADRENO_DISPATCHER_ACTIVE = 1, + ADRENO_DISPATCHER_ACTIVE, + ADRENO_DISPATCHER_INIT, }; struct adreno_device;