Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
On 15.12.2017 23:25, Lucas Stach wrote: > Am Freitag, den 15.12.2017, 01:45 +0300 schrieb Dmitry Osipenko: >> On 15.12.2017 00:41, Lucas Stach wrote: >>> Am Montag, den 11.12.2017, 18:26 +0300 schrieb Dmitry Osipenko: On 11.12.2017 17:27, Thierry Reding wrote: > On Mon, Dec 11, 2017 at 04:53:56PM +0300, Dmitry Osipenko > wrote: >> On 11.12.2017 13:13, Thierry Reding wrote: >>> On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko >>> wrote: Add manual HW power management to drivers probe/remove in order to not fail in a case of runtime power management being disabled in kernel config. Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/dc.c | 164 +++ drivers/gpu/drm/tegra/dsi.c | 138 +-- - drivers/gpu/drm/tegra/hdmi.c | 90 - --- drivers/gpu/drm/tegra/sor.c | 103 +-- 4 files changed, 310 insertions(+), 185 deletions(-) >>> >>> I think that's the wrong way around. We unconditionally >>> select >>> PM on >>> 64-bit ARM already, and I think we should do the same on >>> 32-bit >>> ARM. >>> There's really no excuse not to enable runtime PM these >>> days. >> >> What is the rational behind enabling PM unconditionally? It >> is >> actually a very >> useful debug feature when there is something wrong with the >> PM. >> It looks like >> Tegra DRM driver is the only driver on Tegra that doesn't >> work >> properly with PM >> being disabled. Please, let's just fix it. > > What's useful about disabling PM? The problem with allowing !PM > is > that > it adds one more combination that needs to be build- and > runtime > tested. As I already stated, disabling PM is very useful for debugging when system hangs unexpectedly. I found it very helpful several times. >>> >>> This assumes that the bootloader/firmware left the power domains >>> powered up. Without PM_GENERIC_DOMAINS, which depends on CONFIG_PM >>> the >>> kernel has no means to control the state of the power domains. >>> Probe >>> deferral based on the power domain will also not work, so driver >>> may >>> probe and try to access power-gated devices, leading to system >>> hangs in >>> the common case. >> >> Pre-186 Tegra's do not use generic PM domains, but a custom API. >> Meanwhile T186 >> always has CONFIG_PM enabled. > > This is incorrect since a38045121bf4 (soc/tegra: pmc: Add generic PM > domain support), i.e. kernel 4.7. Power domains are defined only by T210/T186 in DT and both SoC's are ARM64, all ARM32 SoC's use custom API. Moreover T210 doesn't define powerdomain for DC in DT, so for DC it uses legacy API. BTW, I'll drop this patch since Thierry isn't positive about having !CONFIG_PM.
Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
Am Freitag, den 15.12.2017, 01:45 +0300 schrieb Dmitry Osipenko: > On 15.12.2017 00:41, Lucas Stach wrote: > > Am Montag, den 11.12.2017, 18:26 +0300 schrieb Dmitry Osipenko: > > > On 11.12.2017 17:27, Thierry Reding wrote: > > > > On Mon, Dec 11, 2017 at 04:53:56PM +0300, Dmitry Osipenko > > > > wrote: > > > > > On 11.12.2017 13:13, Thierry Reding wrote: > > > > > > On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko > > > > > > wrote: > > > > > > > Add manual HW power management to drivers probe/remove in > > > > > > > order to > > > > > > > not fail in a case of runtime power management being > > > > > > > disabled > > > > > > > in kernel > > > > > > > config. > > > > > > > > > > > > > > Signed-off-by: Dmitry Osipenko > > > > > > > --- > > > > > > > drivers/gpu/drm/tegra/dc.c | 164 > > > > > > > +++ > > > > > > > drivers/gpu/drm/tegra/dsi.c | 138 > > > > > > > +-- > > > > > > > - > > > > > > > drivers/gpu/drm/tegra/hdmi.c | 90 - > > > > > > > --- > > > > > > > drivers/gpu/drm/tegra/sor.c | 103 +-- > > > > > > > > > > > > > > > > > > > > > 4 files changed, 310 insertions(+), 185 deletions(-) > > > > > > > > > > > > I think that's the wrong way around. We unconditionally > > > > > > select > > > > > > PM on > > > > > > 64-bit ARM already, and I think we should do the same on > > > > > > 32-bit > > > > > > ARM. > > > > > > There's really no excuse not to enable runtime PM these > > > > > > days. > > > > > > > > > > What is the rational behind enabling PM unconditionally? It > > > > > is > > > > > actually a very > > > > > useful debug feature when there is something wrong with the > > > > > PM. > > > > > It looks like > > > > > Tegra DRM driver is the only driver on Tegra that doesn't > > > > > work > > > > > properly with PM > > > > > being disabled. Please, let's just fix it. > > > > > > > > What's useful about disabling PM? The problem with allowing !PM > > > > is > > > > that > > > > it adds one more combination that needs to be build- and > > > > runtime > > > > tested. > > > > > > As I already stated, disabling PM is very useful for debugging > > > when > > > system hangs > > > unexpectedly. I found it very helpful several times. > > > > This assumes that the bootloader/firmware left the power domains > > powered up. Without PM_GENERIC_DOMAINS, which depends on CONFIG_PM > > the > > kernel has no means to control the state of the power domains. > > Probe > > deferral based on the power domain will also not work, so driver > > may > > probe and try to access power-gated devices, leading to system > > hangs in > > the common case. > > Pre-186 Tegra's do not use generic PM domains, but a custom API. > Meanwhile T186 > always has CONFIG_PM enabled. This is incorrect since a38045121bf4 (soc/tegra: pmc: Add generic PM domain support), i.e. kernel 4.7. Regards, Lucas
Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
On 15.12.2017 00:41, Lucas Stach wrote: > Am Montag, den 11.12.2017, 18:26 +0300 schrieb Dmitry Osipenko: >> On 11.12.2017 17:27, Thierry Reding wrote: >>> On Mon, Dec 11, 2017 at 04:53:56PM +0300, Dmitry Osipenko wrote: On 11.12.2017 13:13, Thierry Reding wrote: > On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko > wrote: >> Add manual HW power management to drivers probe/remove in >> order to >> not fail in a case of runtime power management being disabled >> in kernel >> config. >> >> Signed-off-by: Dmitry Osipenko >> --- >> drivers/gpu/drm/tegra/dc.c | 164 >> +++ >> drivers/gpu/drm/tegra/dsi.c | 138 +-- >> - >> drivers/gpu/drm/tegra/hdmi.c | 90 >> drivers/gpu/drm/tegra/sor.c | 103 +-- >> >> 4 files changed, 310 insertions(+), 185 deletions(-) > > I think that's the wrong way around. We unconditionally select > PM on > 64-bit ARM already, and I think we should do the same on 32-bit > ARM. > There's really no excuse not to enable runtime PM these days. What is the rational behind enabling PM unconditionally? It is actually a very useful debug feature when there is something wrong with the PM. It looks like Tegra DRM driver is the only driver on Tegra that doesn't work properly with PM being disabled. Please, let's just fix it. >>> >>> What's useful about disabling PM? The problem with allowing !PM is >>> that >>> it adds one more combination that needs to be build- and runtime >>> tested. >> >> As I already stated, disabling PM is very useful for debugging when >> system hangs >> unexpectedly. I found it very helpful several times. > > This assumes that the bootloader/firmware left the power domains > powered up. Without PM_GENERIC_DOMAINS, which depends on CONFIG_PM the > kernel has no means to control the state of the power domains. Probe > deferral based on the power domain will also not work, so driver may > probe and try to access power-gated devices, leading to system hangs in > the common case. BTW, this probably explains why ARM64 has CONFIG_PM enabled, thanks.
Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
On 15.12.2017 00:41, Lucas Stach wrote: > Am Montag, den 11.12.2017, 18:26 +0300 schrieb Dmitry Osipenko: >> On 11.12.2017 17:27, Thierry Reding wrote: >>> On Mon, Dec 11, 2017 at 04:53:56PM +0300, Dmitry Osipenko wrote: On 11.12.2017 13:13, Thierry Reding wrote: > On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko > wrote: >> Add manual HW power management to drivers probe/remove in >> order to >> not fail in a case of runtime power management being disabled >> in kernel >> config. >> >> Signed-off-by: Dmitry Osipenko >> --- >> drivers/gpu/drm/tegra/dc.c | 164 >> +++ >> drivers/gpu/drm/tegra/dsi.c | 138 +-- >> - >> drivers/gpu/drm/tegra/hdmi.c | 90 >> drivers/gpu/drm/tegra/sor.c | 103 +-- >> >> 4 files changed, 310 insertions(+), 185 deletions(-) > > I think that's the wrong way around. We unconditionally select > PM on > 64-bit ARM already, and I think we should do the same on 32-bit > ARM. > There's really no excuse not to enable runtime PM these days. What is the rational behind enabling PM unconditionally? It is actually a very useful debug feature when there is something wrong with the PM. It looks like Tegra DRM driver is the only driver on Tegra that doesn't work properly with PM being disabled. Please, let's just fix it. >>> >>> What's useful about disabling PM? The problem with allowing !PM is >>> that >>> it adds one more combination that needs to be build- and runtime >>> tested. >> >> As I already stated, disabling PM is very useful for debugging when >> system hangs >> unexpectedly. I found it very helpful several times. > > This assumes that the bootloader/firmware left the power domains > powered up. Without PM_GENERIC_DOMAINS, which depends on CONFIG_PM the > kernel has no means to control the state of the power domains. Probe > deferral based on the power domain will also not work, so driver may > probe and try to access power-gated devices, leading to system hangs in > the common case. Pre-186 Tegra's do not use generic PM domains, but a custom API. Meanwhile T186 always has CONFIG_PM enabled.
Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
Am Montag, den 11.12.2017, 18:26 +0300 schrieb Dmitry Osipenko: > On 11.12.2017 17:27, Thierry Reding wrote: > > On Mon, Dec 11, 2017 at 04:53:56PM +0300, Dmitry Osipenko wrote: > > > On 11.12.2017 13:13, Thierry Reding wrote: > > > > On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko > > > > wrote: > > > > > Add manual HW power management to drivers probe/remove in > > > > > order to > > > > > not fail in a case of runtime power management being disabled > > > > > in kernel > > > > > config. > > > > > > > > > > Signed-off-by: Dmitry Osipenko > > > > > --- > > > > > drivers/gpu/drm/tegra/dc.c | 164 > > > > > +++ > > > > > drivers/gpu/drm/tegra/dsi.c | 138 +-- > > > > > - > > > > > drivers/gpu/drm/tegra/hdmi.c | 90 > > > > > drivers/gpu/drm/tegra/sor.c | 103 +-- > > > > > > > > > > 4 files changed, 310 insertions(+), 185 deletions(-) > > > > > > > > I think that's the wrong way around. We unconditionally select > > > > PM on > > > > 64-bit ARM already, and I think we should do the same on 32-bit > > > > ARM. > > > > There's really no excuse not to enable runtime PM these days. > > > > > > What is the rational behind enabling PM unconditionally? It is > > > actually a very > > > useful debug feature when there is something wrong with the PM. > > > It looks like > > > Tegra DRM driver is the only driver on Tegra that doesn't work > > > properly with PM > > > being disabled. Please, let's just fix it. > > > > What's useful about disabling PM? The problem with allowing !PM is > > that > > it adds one more combination that needs to be build- and runtime > > tested. > > As I already stated, disabling PM is very useful for debugging when > system hangs > unexpectedly. I found it very helpful several times. This assumes that the bootloader/firmware left the power domains powered up. Without PM_GENERIC_DOMAINS, which depends on CONFIG_PM the kernel has no means to control the state of the power domains. Probe deferral based on the power domain will also not work, so driver may probe and try to access power-gated devices, leading to system hangs in the common case. Regards, Lucas
Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
On 11.12.2017 17:27, Thierry Reding wrote: > On Mon, Dec 11, 2017 at 04:53:56PM +0300, Dmitry Osipenko wrote: >> On 11.12.2017 13:13, Thierry Reding wrote: >>> On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko wrote: Add manual HW power management to drivers probe/remove in order to not fail in a case of runtime power management being disabled in kernel config. Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/dc.c | 164 +++ drivers/gpu/drm/tegra/dsi.c | 138 +--- drivers/gpu/drm/tegra/hdmi.c | 90 drivers/gpu/drm/tegra/sor.c | 103 +-- 4 files changed, 310 insertions(+), 185 deletions(-) >>> >>> I think that's the wrong way around. We unconditionally select PM on >>> 64-bit ARM already, and I think we should do the same on 32-bit ARM. >>> There's really no excuse not to enable runtime PM these days. >> >> What is the rational behind enabling PM unconditionally? It is actually a >> very >> useful debug feature when there is something wrong with the PM. It looks like >> Tegra DRM driver is the only driver on Tegra that doesn't work properly with >> PM >> being disabled. Please, let's just fix it. > > What's useful about disabling PM? The problem with allowing !PM is that > it adds one more combination that needs to be build- and runtime tested. As I already stated, disabling PM is very useful for debugging when system hangs unexpectedly. I found it very helpful several times. > It also means we need to have extra code in the drivers to enable the > device when runtime PM is disabled. This is all a lot of extra effort > for little to no benefit. Nearly every driver has a dozen lines of extra code to handle disabled PM. I don't see why Tegra DRM should be an excuse. Also notice that I added some more error messages. Of course it would be nice if you could test disabled PM config option from time to time. I don't think it is very important config option for a regular user, but very useful for developing and for debugging when things break. So it shouldn't an extra testing burden for you. > Also, runtime PM is an integral part of mode setting in Tegra DRM, so I > would be suprised if things still work reliably after this patch. RGB, > DSI and HDMI might work properly, but the SOR is unlikely to work after > this because the only way to get it to reliably set a mode is by using > the full runtime suspend/resume cycle. I wasn't aware of the SOR's hazard, thanks for pointing at it. Probably performing power cycle on encoders enabling would be enough, wouldn't it?
Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
On Mon, Dec 11, 2017 at 04:53:56PM +0300, Dmitry Osipenko wrote: > On 11.12.2017 13:13, Thierry Reding wrote: > > On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko wrote: > >> Add manual HW power management to drivers probe/remove in order to > >> not fail in a case of runtime power management being disabled in kernel > >> config. > >> > >> Signed-off-by: Dmitry Osipenko > >> --- > >> drivers/gpu/drm/tegra/dc.c | 164 > >> +++ > >> drivers/gpu/drm/tegra/dsi.c | 138 +--- > >> drivers/gpu/drm/tegra/hdmi.c | 90 > >> drivers/gpu/drm/tegra/sor.c | 103 +-- > >> 4 files changed, 310 insertions(+), 185 deletions(-) > > > > I think that's the wrong way around. We unconditionally select PM on > > 64-bit ARM already, and I think we should do the same on 32-bit ARM. > > There's really no excuse not to enable runtime PM these days. > > What is the rational behind enabling PM unconditionally? It is actually a very > useful debug feature when there is something wrong with the PM. It looks like > Tegra DRM driver is the only driver on Tegra that doesn't work properly with > PM > being disabled. Please, let's just fix it. What's useful about disabling PM? The problem with allowing !PM is that it adds one more combination that needs to be build- and runtime tested. It also means we need to have extra code in the drivers to enable the device when runtime PM is disabled. This is all a lot of extra effort for little to no benefit. Also, runtime PM is an integral part of mode setting in Tegra DRM, so I would be suprised if things still work reliably after this patch. RGB, DSI and HDMI might work properly, but the SOR is unlikely to work after this because the only way to get it to reliably set a mode is by using the full runtime suspend/resume cycle. Thierry signature.asc Description: PGP signature
Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
On 11.12.2017 16:53, Dmitry Osipenko wrote: > On 11.12.2017 13:13, Thierry Reding wrote: >> On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko wrote: >>> Add manual HW power management to drivers probe/remove in order to >>> not fail in a case of runtime power management being disabled in kernel >>> config. >>> >>> Signed-off-by: Dmitry Osipenko >>> --- >>> drivers/gpu/drm/tegra/dc.c | 164 >>> +++ >>> drivers/gpu/drm/tegra/dsi.c | 138 +--- >>> drivers/gpu/drm/tegra/hdmi.c | 90 >>> drivers/gpu/drm/tegra/sor.c | 103 +-- >>> 4 files changed, 310 insertions(+), 185 deletions(-) >> >> I think that's the wrong way around. We unconditionally select PM on >> 64-bit ARM already, and I think we should do the same on 32-bit ARM. >> There's really no excuse not to enable runtime PM these days. > > What is the rational behind enabling PM unconditionally? It is actually a very > useful debug feature when there is something wrong with the PM. It looks like > Tegra DRM driver is the only driver on Tegra that doesn't work properly with > PM > being disabled. Please, let's just fix it. BTW, I've noticed that I sent wrong version of the patch. Will send proper in V2, of course of if you don't mind fixing the driver :)
Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
On 11.12.2017 13:13, Thierry Reding wrote: > On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko wrote: >> Add manual HW power management to drivers probe/remove in order to >> not fail in a case of runtime power management being disabled in kernel >> config. >> >> Signed-off-by: Dmitry Osipenko >> --- >> drivers/gpu/drm/tegra/dc.c | 164 >> +++ >> drivers/gpu/drm/tegra/dsi.c | 138 +--- >> drivers/gpu/drm/tegra/hdmi.c | 90 >> drivers/gpu/drm/tegra/sor.c | 103 +-- >> 4 files changed, 310 insertions(+), 185 deletions(-) > > I think that's the wrong way around. We unconditionally select PM on > 64-bit ARM already, and I think we should do the same on 32-bit ARM. > There's really no excuse not to enable runtime PM these days. What is the rational behind enabling PM unconditionally? It is actually a very useful debug feature when there is something wrong with the PM. It looks like Tegra DRM driver is the only driver on Tegra that doesn't work properly with PM being disabled. Please, let's just fix it.
Re: [PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
On Mon, Dec 11, 2017 at 02:19:44AM +0300, Dmitry Osipenko wrote: > Add manual HW power management to drivers probe/remove in order to > not fail in a case of runtime power management being disabled in kernel > config. > > Signed-off-by: Dmitry Osipenko > --- > drivers/gpu/drm/tegra/dc.c | 164 > +++ > drivers/gpu/drm/tegra/dsi.c | 138 +--- > drivers/gpu/drm/tegra/hdmi.c | 90 > drivers/gpu/drm/tegra/sor.c | 103 +-- > 4 files changed, 310 insertions(+), 185 deletions(-) I think that's the wrong way around. We unconditionally select PM on 64-bit ARM already, and I think we should do the same on 32-bit ARM. There's really no excuse not to enable runtime PM these days. Thierry signature.asc Description: PGP signature
[PATCH v1 2/2] drm/tegra: Support disabled CONFIG_PM
Add manual HW power management to drivers probe/remove in order to not fail in a case of runtime power management being disabled in kernel config. Signed-off-by: Dmitry Osipenko --- drivers/gpu/drm/tegra/dc.c | 164 +++ drivers/gpu/drm/tegra/dsi.c | 138 +--- drivers/gpu/drm/tegra/hdmi.c | 90 drivers/gpu/drm/tegra/sor.c | 103 +-- 4 files changed, 310 insertions(+), 185 deletions(-) diff --git a/drivers/gpu/drm/tegra/dc.c b/drivers/gpu/drm/tegra/dc.c index 6139d3e9cedf..9d442be081c5 100644 --- a/drivers/gpu/drm/tegra/dc.c +++ b/drivers/gpu/drm/tegra/dc.c @@ -1967,6 +1967,88 @@ static int tegra_dc_parse_dt(struct tegra_dc *dc) return 0; } +static int tegra_dc_power_off(struct tegra_dc *dc) +{ + int err; + + err = reset_control_assert(dc->rst); + if (err) { + dev_err(dc->dev, "failed to assert reset: %d\n", err); + return err; + } + + usleep_range(2000, 4000); + + if (dc->soc->has_powergate) + tegra_powergate_power_off(dc->powergate); + + clk_disable_unprepare(dc->clk); + + return 0; +} + +static int tegra_dc_power_on(struct tegra_dc *dc) +{ + int err; + + if (dc->soc->has_powergate) { + err = tegra_powergate_sequence_power_up(dc->powergate, dc->clk, + dc->rst); + if (err) { + dev_err(dc->dev, "failed to power partition: %d\n", + err); + return err; + } + } else { + err = clk_prepare_enable(dc->clk); + if (err) { + dev_err(dc->dev, "failed to enable clock: %d\n", err); + return err; + } + + err = reset_control_deassert(dc->rst); + if (err) { + dev_err(dc->dev, "failed to deassert reset: %d\n", err); + return err; + } + } + + return err; +} + +static int tegra_dc_hw_init(struct tegra_dc *dc) +{ + int err; + + err = clk_prepare_enable(dc->clk); + if (err) { + dev_err(dc->dev, "failed to enable clock: %d\n", err); + return err; + } + + usleep_range(2000, 4000); + err = reset_control_assert(dc->rst); + usleep_range(2000, 4000); + + clk_disable_unprepare(dc->clk); + + if (err) { + dev_err(dc->dev, "failed to assert reset: %d\n", err); + return err; + } + + if (dc->soc->has_powergate) { + if (dc->pipe == 0) + dc->powergate = TEGRA_POWERGATE_DIS; + else + dc->powergate = TEGRA_POWERGATE_DISB; + + tegra_powergate_power_off(dc->powergate); + } + + return 0; +} + static int tegra_dc_probe(struct platform_device *pdev) { struct resource *regs; @@ -2017,30 +2099,10 @@ static int tegra_dc_probe(struct platform_device *pdev) return PTR_ERR(dc->rst); } - /* assert reset and disable clock */ - err = clk_prepare_enable(dc->clk); - if (err < 0) + err = tegra_dc_hw_init(dc); + if (err) return err; - usleep_range(2000, 4000); - - err = reset_control_assert(dc->rst); - if (err < 0) - return err; - - usleep_range(2000, 4000); - - clk_disable_unprepare(dc->clk); - - if (dc->soc->has_powergate) { - if (dc->pipe == 0) - dc->powergate = TEGRA_POWERGATE_DIS; - else - dc->powergate = TEGRA_POWERGATE_DISB; - - tegra_powergate_power_off(dc->powergate); - } - regs = platform_get_resource(pdev, IORESOURCE_MEM, 0); dc->regs = devm_ioremap_resource(&pdev->dev, regs); if (IS_ERR(dc->regs)) @@ -2061,6 +2123,12 @@ static int tegra_dc_probe(struct platform_device *pdev) platform_set_drvdata(pdev, dc); pm_runtime_enable(&pdev->dev); + if (!pm_runtime_enabled(&pdev->dev)) { + err = tegra_dc_power_on(dc); + if (err) + return err; + } + INIT_LIST_HEAD(&dc->client.list); dc->client.ops = &dc_client_ops; dc->client.dev = &pdev->dev; @@ -2069,13 +2137,19 @@ static int tegra_dc_probe(struct platform_device *pdev) if (err < 0) { dev_err(&pdev->dev, "failed to register host1x client: %d\n", err); - return err; + goto power_off; } if (dc->pipe == 0) dc0 = dc; return 0; + +power_off: + if (!pm_runtime_enabled(&pdev->dev)) + tegra_dc_power_off(dc); + + return