Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp3000150yba; Tue, 16 Apr 2019 02:29:08 -0700 (PDT) X-Google-Smtp-Source: APXvYqwtACt4CZai7VstT81vxuwMxe4662oZui+hVk+Y6lHfHw8Yf9CTX7qT1660Q8m2Kr6QVNgT X-Received: by 2002:a62:e412:: with SMTP id r18mr80909779pfh.207.1555406947997; Tue, 16 Apr 2019 02:29:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1555406947; cv=none; d=google.com; s=arc-20160816; b=ouwfu3eU3Gbolkprii8Yo2XyjR23L3sMWxT6nuyW/mLvlNhY0OehPcXiVWpKYWici1 eNckUo5zojprut1KUUGd0Qig14YVr1CYOlJbxduLM7U5tuQM8uc8XePo1g86hkfvaORo CEXSMmm0wRbCdDnJZYocNqcWC4kG3u5Mi8J4qJOLBBVl6braVIecvtoUGKkFqgvHt6+K tCO775P1+C2SAgUjLk0F48gcru6VlpRDvZa1wG7Rau+FWVh4TI/SZlBlCvWBTov/atSQ mb9GeGo1BDaNqlmLnY8l0rSzBO9fDLP8yd3XNHwwDLasYh06GbRmx5VkVQ7Aj9X7+PWN qb7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from; bh=SqSJf1qx+QuLCgAXmpSaiW9+NBfayUhxGOHTonm2zhc=; b=jAF+CIGJ6ZMr8AwdG2U5dG24JGBUmVj6flW0VwfOr7c5zDdORI71K4NGFQ0sNSv5Di sXjp4To3uPBAGx3hb1GxsSCB1YbpWD12DCepXo20tQCohhJeqUpMZCJTge7H11bWqH6v /rsrHizCPA/n061aVRx6xcgLS9XiHM6MAPdjWX7OpM0G+vAdFZV26UrDggAecGNAyibp iUAjFZNXDJonK7fOF2JFeqjCbC1KFD8Y9A/Fq0m92/hxPhr33pRnPcrtULHAAEZSeP6M K4zjNLTr0tKPMbjDcbBlOK3j/brujcT/S/LwJEkBGg/PKDCXUztgr/xSGxAjjKi/QnyZ cLQw== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id g4si45183841plp.196.2019.04.16.02.28.51; Tue, 16 Apr 2019 02:29:07 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1728993AbfDPJ2G (ORCPT + 99 others); Tue, 16 Apr 2019 05:28:06 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:18165 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1728959AbfDPJ2D (ORCPT ); Tue, 16 Apr 2019 05:28:03 -0400 X-UUID: 92abbd378ef74672a918cce58a8ad799-20190416 X-UUID: 92abbd378ef74672a918cce58a8ad799-20190416 Received: from mtkexhb01.mediatek.inc [(172.21.101.102)] by mailgw02.mediatek.com (envelope-from ) (mhqrelay.mediatek.com ESMTP with TLS) with ESMTP id 1217534502; Tue, 16 Apr 2019 17:27:54 +0800 Received: from MTKCAS06.mediatek.inc (172.21.101.30) by mtkmbs01n2.mediatek.inc (172.21.101.79) with Microsoft SMTP Server (TLS) id 15.0.1395.4; Tue, 16 Apr 2019 17:27:47 +0800 Received: from mtksdccf07.mediatek.inc (172.21.84.99) by MTKCAS06.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1395.4 via Frontend Transport; Tue, 16 Apr 2019 17:27:47 +0800 From: Stu Hsieh To: Mauro Carvalho Chehab , Rob Herring , CK Hu CC: Mark Rutland , Matthias Brugger , Stu Hsieh , , , , , , Subject: [PATCH v2 03/15] [media] mtk-mipicsi: add pm function Date: Tue, 16 Apr 2019 17:27:31 +0800 Message-ID: <1555406863-18069-4-git-send-email-stu.hsieh@mediatek.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1555406863-18069-1-git-send-email-stu.hsieh@mediatek.com> References: <1555406863-18069-1-git-send-email-stu.hsieh@mediatek.com> MIME-Version: 1.0 Content-Type: text/plain X-TM-SNTS-SMTP: F8A115F74A3FB00C08F721AA7D7A1D8E49C1960D65CAF6E8315D3D895B894B542000:8 X-MTK: N Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This patch add PM function to enable/disable clk and larb. Signed-off-by: Stu Hsieh --- .../media/platform/mtk-mipicsi/mtk_mipicsi.c | 80 +++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c b/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c index e26bebe17fe5..ec4f6b503b32 100644 --- a/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c +++ b/drivers/media/platform/mtk-mipicsi/mtk_mipicsi.c @@ -464,6 +464,85 @@ static struct soc_camera_host_ops mtk_soc_camera_host_ops = { .set_bus_param = mtk_mipicsi_set_bus_param, }; +static int mtk_mipicsi_pm_suspend(struct device *dev) +{ + struct soc_camera_host *ici = to_soc_camera_host(dev); + struct mtk_mipicsi_dev *mipicsi = NULL; + int ret = 0; + int i = 0; + + mipicsi = container_of(ici, struct mtk_mipicsi_dev, soc_host); + if (mipicsi->soc_host.icd != NULL) { + struct v4l2_subdev *sd = + soc_camera_to_subdev(mipicsi->soc_host.icd); + + ret = v4l2_subdev_call(sd, core, s_power, 0); + if (ret == -ENOIOCTLCMD) + ret = 0; + } + + /* close digtal and analog clock */ + for (i = 0; i < mipicsi->clk_num; ++i) + clk_disable_unprepare(mipicsi->clk[i]); + + if (mipicsi->larb_pdev != NULL) + mtk_smi_larb_put(mipicsi->larb_pdev); + + return ret; +} + +static int mtk_mipicsi_suspend(struct device *dev) +{ + if (pm_runtime_suspended(dev)) + return 0; + + return mtk_mipicsi_pm_suspend(dev); +} + +static int mtk_mipicsi_pm_resume(struct device *dev) +{ + struct soc_camera_host *ici = to_soc_camera_host(dev); + struct mtk_mipicsi_dev *mipicsi = + container_of(ici, struct mtk_mipicsi_dev, soc_host); + int ret = 0; + int i = 0; + + if (mipicsi->soc_host.icd != NULL) { + struct v4l2_subdev *sd = + soc_camera_to_subdev(mipicsi->soc_host.icd); + + ret = v4l2_subdev_call(sd, core, s_power, 1); + if (ret == -ENOIOCTLCMD) + ret = 0; + } + + if (mipicsi->larb_pdev != NULL) { + ret = mtk_smi_larb_get(mipicsi->larb_pdev); + if (ret != 0) + return ret; + } + + /* enable digtal clock */ + for (i = 0; i < mipicsi->clk_num; ++i) + (void)clk_prepare_enable(mipicsi->clk[i]); + + return ret; +} + +static int mtk_mipicsi_resume(struct device *dev) +{ + if (pm_runtime_suspended(dev)) + return 0; + + return mtk_mipicsi_pm_resume(dev); +} + +static const struct dev_pm_ops mtk_mipicsi_pm = { + SET_SYSTEM_SLEEP_PM_OPS(mtk_mipicsi_suspend, mtk_mipicsi_resume) + SET_RUNTIME_PM_OPS(mtk_mipicsi_pm_suspend, + mtk_mipicsi_pm_resume, NULL) +}; + static int seninf_mux_camsv_node_parse(struct mtk_mipicsi_dev *mipicsi, int index) { @@ -756,6 +835,7 @@ static const struct of_device_id mtk_mipicsi_of_match[] = { static struct platform_driver mtk_mipicsi_driver = { .driver = { .name = MTK_MIPICSI_DRV_NAME, + .pm = &mtk_mipicsi_pm, .of_match_table = of_match_ptr(mtk_mipicsi_of_match), }, .probe = mtk_mipicsi_probe, -- 2.18.0