From patchwork Mon Sep 23 01:59:25 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Lowry Li (Arm Technology China)" X-Patchwork-Id: 11155979 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id B02EE13BD for ; Mon, 23 Sep 2019 01:59:48 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 96CF6206C2 for ; Mon, 23 Sep 2019 01:59:48 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 96CF6206C2 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 1B3F589A77; Mon, 23 Sep 2019 01:59:46 +0000 (UTC) X-Original-To: dri-devel@lists.freedesktop.org Delivered-To: dri-devel@lists.freedesktop.org Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-db5eur03on0607.outbound.protection.outlook.com [IPv6:2a01:111:f400:fe0a::607]) by gabe.freedesktop.org (Postfix) with ESMTPS id 0EC8E89A77 for ; Mon, 23 Sep 2019 01:59:43 +0000 (UTC) Received: from AM6PR08CA0047.eurprd08.prod.outlook.com (2603:10a6:20b:c0::35) by HE1PR0801MB2042.eurprd08.prod.outlook.com (2603:10a6:3:51::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2284.20; Mon, 23 Sep 2019 01:59:34 +0000 Received: from AM5EUR03FT014.eop-EUR03.prod.protection.outlook.com (2a01:111:f400:7e08::201) by AM6PR08CA0047.outlook.office365.com (2603:10a6:20b:c0::35) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2284.20 via Frontend Transport; Mon, 23 Sep 2019 01:59:34 +0000 Received-SPF: TempError (protection.outlook.com: error in processing during lookup of arm.com: DNS Timeout) Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM5EUR03FT014.mail.protection.outlook.com (10.152.16.130) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2284.20 via Frontend Transport; Mon, 23 Sep 2019 01:59:32 +0000 Received: ("Tessian outbound 55d20e99e8e2:v31"); Mon, 23 Sep 2019 01:59:32 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: f48b24df6bd95348 X-CR-MTA-TID: 64aa7808 Received: from fbaa96855148.2 (ip-172-16-0-2.eu-west-1.compute.internal [104.47.2.59]) by 64aa7808-outbound-1.mta.getcheckrecipient.com id A5BEA2ED-2FCA-4280-B996-33DE8C72E4BC.1; Mon, 23 Sep 2019 01:59:27 +0000 Received: from EUR01-DB5-obe.outbound.protection.outlook.com (mail-db5eur01lp2059.outbound.protection.outlook.com [104.47.2.59]) by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id fbaa96855148.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 23 Sep 2019 01:59:27 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ZqekGOIxE3lB01y+m7TftbSui79huAbPo9zzUAyKUldHrPOx23DM3M1uciNGIonDEIeqqbW8TAWQOyrEjvtzRbKxEmjkCPiE4x7Rdsm+8ugbSnAKSgfLuUatSBF9otAmxrTyQSNp8bHk4tHC4Xl/dTs8KFtkvGZ1qHGn56/Po3j5piscPdZb4h+5l7b0WEIax5Yq496iHGwLT8leleDdfzxKtdubNKZ5fqHlZYFFBHSu47TPntinOfzvIi/tNQSDY+acpGZLZOmEUcMxVo7Cu/+pKzHWxoExTFT+efp+IbsM6FYIb7FokCHVh3Sxzv+MxtaWPse+oTATgoF/raBQqQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xkVpM/4SufNqFKctYlV5jXe82yzzwSsY+7peY6Zd000=; b=UjXG6808v8n3JVqr0n/xQlmytx6UxuW0reI/+wtBEfK78ZdYflsztgy3+o4NS5Upk2DZOf7d6bQOBog9p61x2J56GfmESAYuD7mC1MBMwBwgdWNz7psntTrdwj0ISn7uLvfvKTo9oMk5ltJhegJbnOupcQSyV34LWykaBErC907OBiANDdzBXw1waYUj4BWOyZDDghfhDjRS5IjJf1woKWIi58mMGMoPiKwcigvQXcaYiGq+48F+//Td2h4Vt04bIVy63hVnIz7Zc3Xsyg+nQsFZKfLSMZ+3YUAJn5eLUfhvjRi+5uki+d3A3f9aeN9wbL+XToCWLh0RxFJfQLx7qg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none Received: from VI1PR08MB5488.eurprd08.prod.outlook.com (52.133.246.150) by VI1PR08MB2783.eurprd08.prod.outlook.com (10.170.236.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2284.23; Mon, 23 Sep 2019 01:59:25 +0000 Received: from VI1PR08MB5488.eurprd08.prod.outlook.com ([fe80::d09e:254b:4d3b:456b]) by VI1PR08MB5488.eurprd08.prod.outlook.com ([fe80::d09e:254b:4d3b:456b%3]) with mapi id 15.20.2284.023; Mon, 23 Sep 2019 01:59:25 +0000 From: "Lowry Li (Arm Technology China)" To: Liviu Dudau , "james qian wang (Arm Technology China)" , "maarten.lankhorst@linux.intel.com" , "seanpaul@chromium.org" , "airlied@linux.ie" , Brian Starkey , Mihail Atanassov Subject: [PATCH] drm/komeda: Adds power management support Thread-Topic: [PATCH] drm/komeda: Adds power management support Thread-Index: AQHVcbKG61D12b8o90a0WJVQdsEzVw== Date: Mon, 23 Sep 2019 01:59:25 +0000 Message-ID: <20190923015908.26627-1-lowry.li@arm.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [113.29.88.7] x-clientproxiedby: HK0P153CA0034.APCP153.PROD.OUTLOOK.COM (2603:1096:203:17::22) To VI1PR08MB5488.eurprd08.prod.outlook.com (2603:10a6:803:137::22) Authentication-Results-Original: spf=none (sender IP is ) smtp.mailfrom=Lowry.Li@arm.com; x-ms-exchange-messagesentrepresentingtype: 1 x-mailer: git-send-email 2.17.1 x-ms-publictraffictype: Email X-MS-Office365-Filtering-Correlation-Id: 94c5abe1-0b33-4b6d-3b54-08d73fc9ad79 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam-Untrusted: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(7168020)(4627221)(201703031133081)(201702281549075)(8990200)(5600167)(711020)(4605104)(1401327)(4618075)(2017052603328)(7193020); SRVR:VI1PR08MB2783; X-MS-TrafficTypeDiagnostic: VI1PR08MB2783:|VI1PR08MB2783:|HE1PR0801MB2042: X-MS-Exchange-PUrlCount: 1 x-ms-exchange-transport-forked: True X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true x-ms-oob-tlc-oobclassifiers: OLM:6430;OLM:6430; x-forefront-prvs: 0169092318 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM; SFS:(10009020)(4636009)(376002)(366004)(346002)(39860400002)(396003)(136003)(189003)(199004)(86362001)(36756003)(476003)(6512007)(6306002)(99286004)(6486002)(486006)(25786009)(2616005)(256004)(14444005)(52116002)(305945005)(6636002)(71200400001)(186003)(8676002)(81166006)(7736002)(81156014)(386003)(6506007)(8936002)(26005)(102836004)(71190400001)(6436002)(4326008)(2201001)(55236004)(50226002)(6116002)(2501003)(5660300002)(3846002)(66066001)(66946007)(110136005)(478600001)(966005)(66476007)(66556008)(64756008)(66446008)(54906003)(2906002)(14454004)(1076003)(316002); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR08MB2783; H:VI1PR08MB5488.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; received-spf: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Message-Info-Original: m1JXKMmxNHoi3TrcTC6PDgU7RZuOx2Z5rlJLsIpbWKkMTdEHbl/xQWYUiR4P7fwWuEnXVL1+6TlKlG7NRA9sUrINGGAyqAYrbhp+08JsEZ+fGIPRwIb7fB/hNxuo5uERl5LIjk81mIkGlnHU76I1yvBz8iW4UYcVx+eXTrWAFc5s+h0+zwylXksOABvGWFTVOSTU3L+i9DlRF5z8Vv1jEdxjoOfC2paZ94uOFnTlcUJ+mzC3Bu2KAvXHEuKPyxzCBV0HC5OeZleYPUkWh7J4+Y7LmSH1umR9ukthaIw3DQMcvBmtnhyyaKRd/QT3jErcYRPbMr0nDMbu0RrGoHaAEBt/4W48JS4TVSDkXt8/FLXwR+Hc0BxraAtXQiAiFt5ra1o54M3OEZ4gZvT6mYZ+wTF+X2JVxNdcRfJjyc2CyWI= MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR08MB2783 Original-Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Lowry.Li@arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT014.eop-EUR03.prod.protection.outlook.com X-Forefront-Antispam-Report: CIP:63.35.35.123; IPV:CAL; SCL:-1; CTRY:IE; EFV:NLI; SFV:NSPM; SFS:(10009020)(4636009)(136003)(346002)(376002)(396003)(39860400002)(199004)(189003)(26826003)(356004)(8676002)(2501003)(6306002)(86362001)(14454004)(6486002)(36756003)(486006)(4326008)(102836004)(8746002)(3846002)(81156014)(66066001)(47776003)(99286004)(966005)(26005)(8936002)(6636002)(50226002)(2201001)(22756006)(7736002)(386003)(316002)(186003)(76130400001)(54906003)(305945005)(6116002)(81166006)(14444005)(2906002)(50466002)(36906005)(25786009)(6506007)(1076003)(70586007)(63350400001)(6512007)(478600001)(5660300002)(476003)(2616005)(70206006)(126002)(23756003)(336012)(110136005); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR0801MB2042; H:64aa7808-outbound-1.mta.getcheckrecipient.com; FPR:; SPF:TempError; LANG:en; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; A:1; MX:1; X-MS-Office365-Filtering-Correlation-Id-Prvs: 7659b1cb-acf3-4bcb-1c7c-08d73fc9a8d5 X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(2390118)(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600167)(710020)(711020)(4605104)(1401327)(4618075)(2017052603328)(7193020); SRVR:HE1PR0801MB2042; NoDisclaimer: True X-Forefront-PRVS: 0169092318 X-Microsoft-Antispam-Message-Info: Uv0+BkTaQsAQjsXa8iEAV0mqigssx6QgNbbcjXS1VwjRgatGm1froziH9fJJnMfskKzFWmMg4VbaP5fiDHTF+kZGimqcLI8xHrr6ZQDV4m0vb9vTfdFT5S2vmLLawE2t41njCqilzetzm434qTpdXy8UXVVh2qqNiaFcXcSLlIo81ZtbE4OtatYsx3l18P/bmjHSlQwWRnMqLx3y525nPK3NcN/FZlzX5uDtvujGmBgeZQDjHicSR8NnOHhSEmmS4AdE2+qEV7qEoZK6Bgq8VqiabtBbZahWT12H5akgwaq7tA8GXN2vUT5VI84N0vSrBxWA1hJ56Wi1uFaR+enzVAVhyumpnIl06gntZfyMDisbynGyLf8h3aAi+ujs+T3G/exnA1y7K6GF3EGywDojEf4B6lBrUvkOXRIarjK8HAI= X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Sep 2019 01:59:32.7043 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 94c5abe1-0b33-4b6d-3b54-08d73fc9ad79 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB2042 X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xkVpM/4SufNqFKctYlV5jXe82yzzwSsY+7peY6Zd000=; b=qQlP2UCn6BwkGQQJUJtBvC3fqVLGz6G6nI8ufVQz0tDErLBD3/M2R49/qtCC351/XnuppR4H8PWDr2N6a8xAt/zuJ0aYjv+2M0UBxkLGOOtl6Ge3hia0vVaJL4R6jJ5y6ePvV5e1cvGCDIV+nmPxXGDctn5RxmczQkBTKGw74uE= X-Mailman-Original-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=xkVpM/4SufNqFKctYlV5jXe82yzzwSsY+7peY6Zd000=; b=qQlP2UCn6BwkGQQJUJtBvC3fqVLGz6G6nI8ufVQz0tDErLBD3/M2R49/qtCC351/XnuppR4H8PWDr2N6a8xAt/zuJ0aYjv+2M0UBxkLGOOtl6Ge3hia0vVaJL4R6jJ5y6ePvV5e1cvGCDIV+nmPxXGDctn5RxmczQkBTKGw74uE= X-Mailman-Original-Authentication-Results: spf=temperror (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; lists.freedesktop.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;lists.freedesktop.org; dmarc=none action=none header.from=arm.com; X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Ayan Halder , "Jonathan Chai \(Arm Technology China\)" , "linux-kernel@vger.kernel.org" , "dri-devel@lists.freedesktop.org" , "Julien Yin \(Arm Technology China\)" , nd Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" From: "Lowry Li (Arm Technology China)" Adds system power management support in KMS kernel driver. Depends on: https://patchwork.freedesktop.org/series/62377/ Changes since v1: Since we have unified mclk/pclk/pipeline->aclk to one mclk, which will be turned on/off when crtc atomic enable/disable, removed runtime power management. Removes run time get/put related flow. Adds to disable the aclk when register access finished. Changes since v2: Rebases to the drm-misc-next branch. Signed-off-by: Lowry Li (Arm Technology China) Reviewed-by: James Qian Wang (Arm Technology China) --- .../gpu/drm/arm/display/komeda/komeda_crtc.c | 1 - .../gpu/drm/arm/display/komeda/komeda_dev.c | 65 +++++++++++++++++-- .../gpu/drm/arm/display/komeda/komeda_dev.h | 3 + .../gpu/drm/arm/display/komeda/komeda_drv.c | 30 ++++++++- 4 files changed, 91 insertions(+), 8 deletions(-) diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c index 38d5cb20e908..b47c0dabd0d1 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_crtc.c @@ -5,7 +5,6 @@ * */ #include -#include #include #include diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c index bee4633cdd9f..8a03324f02a5 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.c @@ -258,7 +258,7 @@ struct komeda_dev *komeda_dev_create(struct device *dev) product->product_id, MALIDP_CORE_ID_PRODUCT_ID(mdev->chip.core_id)); err = -ENODEV; - goto err_cleanup; + goto disable_clk; } DRM_INFO("Found ARM Mali-D%x version r%dp%d\n", @@ -271,19 +271,19 @@ struct komeda_dev *komeda_dev_create(struct device *dev) err = mdev->funcs->enum_resources(mdev); if (err) { DRM_ERROR("enumerate display resource failed.\n"); - goto err_cleanup; + goto disable_clk; } err = komeda_parse_dt(dev, mdev); if (err) { DRM_ERROR("parse device tree failed.\n"); - goto err_cleanup; + goto disable_clk; } err = komeda_assemble_pipelines(mdev); if (err) { DRM_ERROR("assemble display pipelines failed.\n"); - goto err_cleanup; + goto disable_clk; } dev->dma_parms = &mdev->dma_parms; @@ -296,11 +296,14 @@ struct komeda_dev *komeda_dev_create(struct device *dev) if (mdev->iommu && mdev->funcs->connect_iommu) { err = mdev->funcs->connect_iommu(mdev); if (err) { + DRM_ERROR("connect iommu failed.\n"); mdev->iommu = NULL; - goto err_cleanup; + goto disable_clk; } } + clk_disable_unprepare(mdev->aclk); + err = sysfs_create_group(&dev->kobj, &komeda_sysfs_attr_group); if (err) { DRM_ERROR("create sysfs group failed.\n"); @@ -313,6 +316,8 @@ struct komeda_dev *komeda_dev_create(struct device *dev) return mdev; +disable_clk: + clk_disable_unprepare(mdev->aclk); err_cleanup: komeda_dev_destroy(mdev); return ERR_PTR(err); @@ -330,8 +335,12 @@ void komeda_dev_destroy(struct komeda_dev *mdev) debugfs_remove_recursive(mdev->debugfs_root); #endif + if (mdev->aclk) + clk_prepare_enable(mdev->aclk); + if (mdev->iommu && mdev->funcs->disconnect_iommu) - mdev->funcs->disconnect_iommu(mdev); + if (mdev->funcs->disconnect_iommu(mdev)) + DRM_ERROR("disconnect iommu failed.\n"); mdev->iommu = NULL; for (i = 0; i < mdev->n_pipelines; i++) { @@ -359,3 +368,47 @@ void komeda_dev_destroy(struct komeda_dev *mdev) devm_kfree(dev, mdev); } + +int komeda_dev_resume(struct komeda_dev *mdev) +{ + int ret = 0; + + clk_prepare_enable(mdev->aclk); + + if (mdev->iommu && mdev->funcs->connect_iommu) { + ret = mdev->funcs->connect_iommu(mdev); + if (ret < 0) { + DRM_ERROR("connect iommu failed.\n"); + goto disable_clk; + } + } + + ret = mdev->funcs->enable_irq(mdev); + +disable_clk: + clk_disable_unprepare(mdev->aclk); + + return ret; +} + +int komeda_dev_suspend(struct komeda_dev *mdev) +{ + int ret = 0; + + clk_prepare_enable(mdev->aclk); + + if (mdev->iommu && mdev->funcs->disconnect_iommu) { + ret = mdev->funcs->disconnect_iommu(mdev); + if (ret < 0) { + DRM_ERROR("disconnect iommu failed.\n"); + goto disable_clk; + } + } + + ret = mdev->funcs->disable_irq(mdev); + +disable_clk: + clk_disable_unprepare(mdev->aclk); + + return ret; +} diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h index 8acf8c0601cc..414200233b64 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_dev.h +++ b/drivers/gpu/drm/arm/display/komeda/komeda_dev.h @@ -224,4 +224,7 @@ void komeda_print_events(struct komeda_events *evts); static inline void komeda_print_events(struct komeda_events *evts) {} #endif +int komeda_dev_resume(struct komeda_dev *mdev); +int komeda_dev_suspend(struct komeda_dev *mdev); + #endif /*_KOMEDA_DEV_H_*/ diff --git a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c index 69ace6f9055d..d6c2222c5d33 100644 --- a/drivers/gpu/drm/arm/display/komeda/komeda_drv.c +++ b/drivers/gpu/drm/arm/display/komeda/komeda_drv.c @@ -8,6 +8,7 @@ #include #include #include +#include #include #include "komeda_dev.h" #include "komeda_kms.h" @@ -136,13 +137,40 @@ static const struct of_device_id komeda_of_match[] = { MODULE_DEVICE_TABLE(of, komeda_of_match); +static int __maybe_unused komeda_pm_suspend(struct device *dev) +{ + struct komeda_drv *mdrv = dev_get_drvdata(dev); + struct drm_device *drm = &mdrv->kms->base; + int res; + + res = drm_mode_config_helper_suspend(drm); + + komeda_dev_suspend(mdrv->mdev); + + return res; +} + +static int __maybe_unused komeda_pm_resume(struct device *dev) +{ + struct komeda_drv *mdrv = dev_get_drvdata(dev); + struct drm_device *drm = &mdrv->kms->base; + + komeda_dev_resume(mdrv->mdev); + + return drm_mode_config_helper_resume(drm); +} + +static const struct dev_pm_ops komeda_pm_ops = { + SET_SYSTEM_SLEEP_PM_OPS(komeda_pm_suspend, komeda_pm_resume) +}; + static struct platform_driver komeda_platform_driver = { .probe = komeda_platform_probe, .remove = komeda_platform_remove, .driver = { .name = "komeda", .of_match_table = komeda_of_match, - .pm = NULL, + .pm = &komeda_pm_ops, }, };