From nobody Thu Jan 1 07:21:54 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 94FAAC25B6B for ; Tue, 24 Oct 2023 22:43:21 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344577AbjJXWnS (ORCPT ); Tue, 24 Oct 2023 18:43:18 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:43362 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344534AbjJXWnQ (ORCPT ); Tue, 24 Oct 2023 18:43:16 -0400 Received: from mail-wm1-x32c.google.com (mail-wm1-x32c.google.com [IPv6:2a00:1450:4864:20::32c]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EBBFF10C9 for ; Tue, 24 Oct 2023 15:43:12 -0700 (PDT) Received: by mail-wm1-x32c.google.com with SMTP id 5b1f17b1804b1-40850b244beso39634135e9.2 for ; Tue, 24 Oct 2023 15:43:12 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1698187391; x=1698792191; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=hrQaHUrwh7HJvf21NYxjrE9wnjwO6QY5+QCpxbGvHFY=; b=l90hOl7CuvqmFnXTPORBMNy5/Y/R4Ai2jYIA8Qfhr4fvQLtV6rPrOHTbOpQ/6P21tW nEtFatviDFy02eyCjIwTHtQY4oq21nP+JldvmKp1THmBv50WyRZzpE6aalw5Yk165IbB ZQlsH80hRp+cuSjF7s/hdGKlytb1pXv+IJcN0/eriYKSQoqIU8f+dDcg+F+XKwnOuptq ZaXZPmjkg5rfu+aywNRCx3/UopnipyCNUawtE+bfFn/9x3T0yBVxE/qG7D3FFi/rvNGg 9Lo6rfdQQKspIEeHVXqSc2XQi4AYmAJtdtqx9L/oe/nu14yihvP6ZmR9qrmrV9dbC6KC jbiQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698187391; x=1698792191; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=hrQaHUrwh7HJvf21NYxjrE9wnjwO6QY5+QCpxbGvHFY=; b=LC91BgWXX6fVOgq37DpulzMOu/XZylDERNUZuLtLLIRNKMU8+PVzXPcnKl8HqmtMhB jygk1ubMKJCjr3fJOUTDvABE+EFuRCiL/SsBWkY9jiL/in1F/+fkK5FKSvTT22DvnbM3 99+6s6ROJB4z6Hiz5lJLpMaM9BsRJQSeO0ko5uzO4T07PFy8X86NrACQxXyTOAJ0BIst P6OtpUOJIzNUO6uAjLxQLGpV1XNDXZtIqrPKuBNBFW4jp66hoQ7mzHR+/EEbwToqdZMh earwueEr+0gaa1HMx34xrXzhC4LPtZ+ZH7+al3hjf5idhCcwWq5UFHcIDEISn8XE4la6 Ag5w== X-Gm-Message-State: AOJu0Yx4YbVlV+8S17/937wUuHhhxgKrUKrzv6p7bIdS9u/S4mSnyES5 blKiKgdEGGgh6TZoIEmNhpcOfg== X-Google-Smtp-Source: AGHT+IH3El5r8BZAxqxEWrtMM2P1MvtwTTWIE8tDk6kZdHK1qx+HR75WBrMqGzKiqBJf5SADeBboAw== X-Received: by 2002:a05:600c:1d22:b0:408:4475:8cc1 with SMTP id l34-20020a05600c1d2200b0040844758cc1mr11448428wms.35.1698187391213; Tue, 24 Oct 2023 15:43:11 -0700 (PDT) Received: from sagittarius-a.nxsw.local ([37.228.218.3]) by smtp.gmail.com with ESMTPSA id j6-20020a05600c190600b0040641a9d49bsm13049531wmq.17.2023.10.24.15.43.10 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Oct 2023 15:43:10 -0700 (PDT) From: Bryan O'Donoghue To: hverkuil-cisco@xs4all.nl, laurent.pinchart@ideasonboard.com, rfoss@kernel.org, todor.too@gmail.com, agross@kernel.org, andersson@kernel.org, konrad.dybcio@linaro.org, mchehab@kernel.org Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Bryan O'Donoghue Subject: [PATCH 1/4] media: qcom: camss: Convert to per-VFE pointer for power-domain linkages Date: Tue, 24 Oct 2023 23:42:52 +0100 Message-ID: <20231024224255.754779-2-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231024224255.754779-1-bryan.odonoghue@linaro.org> References: <20231024224255.754779-1-bryan.odonoghue@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Right now we use the top-level camss structure to provide pointers via VFE id index back to genpd linkages. In effect this hard-codes VFE indexes to power-domain indexes in the dtsi and mandates a very particular ordering of power domains in the dtsi, which bears no relationship to a real hardware dependency. As a first step to rationalising the VFE power-domain code and breaking the magic indexing in dtsi use per-VFE pointers to genpd linkages. The top-level index in msm_vfe_subdev_init is still used to attain the initial so no functional or logical change arises from this change. Signed-off-by: Bryan O'Donoghue --- drivers/media/platform/qcom/camss/camss-vfe-170.c | 12 ++++++------ drivers/media/platform/qcom/camss/camss-vfe-4-7.c | 12 ++++-------- drivers/media/platform/qcom/camss/camss-vfe-4-8.c | 10 ++++------ drivers/media/platform/qcom/camss/camss-vfe-480.c | 12 ++++++------ drivers/media/platform/qcom/camss/camss-vfe.c | 3 +++ drivers/media/platform/qcom/camss/camss-vfe.h | 2 ++ 6 files changed, 25 insertions(+), 26 deletions(-) diff --git a/drivers/media/platform/qcom/camss/camss-vfe-170.c b/drivers/me= dia/platform/qcom/camss/camss-vfe-170.c index 0b211fed12760..59b0ea0aac48f 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe-170.c +++ b/drivers/media/platform/qcom/camss/camss-vfe-170.c @@ -638,7 +638,7 @@ static void vfe_pm_domain_off(struct vfe_device *vfe) if (vfe->id >=3D camss->res->vfe_num) return; =20 - device_link_del(camss->genpd_link[vfe->id]); + device_link_del(vfe->genpd_link); } =20 /* @@ -653,11 +653,11 @@ static int vfe_pm_domain_on(struct vfe_device *vfe) if (id >=3D camss->res->vfe_num) return 0; =20 - camss->genpd_link[id] =3D device_link_add(camss->dev, camss->genpd[id], - DL_FLAG_STATELESS | - DL_FLAG_PM_RUNTIME | - DL_FLAG_RPM_ACTIVE); - if (!camss->genpd_link[id]) + vfe->genpd_link =3D device_link_add(camss->dev, vfe->genpd, + DL_FLAG_STATELESS | + DL_FLAG_PM_RUNTIME | + DL_FLAG_RPM_ACTIVE); + if (!vfe->genpd_link) return -EINVAL; =20 return 0; diff --git a/drivers/media/platform/qcom/camss/camss-vfe-4-7.c b/drivers/me= dia/platform/qcom/camss/camss-vfe-4-7.c index b65ed0fef595e..c668494ee1e98 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe-4-7.c +++ b/drivers/media/platform/qcom/camss/camss-vfe-4-7.c @@ -1109,14 +1109,10 @@ static void vfe_isr_read(struct vfe_device *vfe, u3= 2 *value0, u32 *value1) */ static void vfe_pm_domain_off(struct vfe_device *vfe) { - struct camss *camss; - if (!vfe) return; =20 - camss =3D vfe->camss; - - device_link_del(camss->genpd_link[vfe->id]); + device_link_del(vfe->genpd_link); } =20 /* @@ -1128,10 +1124,10 @@ static int vfe_pm_domain_on(struct vfe_device *vfe) struct camss *camss =3D vfe->camss; enum vfe_line_id id =3D vfe->id; =20 - camss->genpd_link[id] =3D device_link_add(camss->dev, camss->genpd[id], D= L_FLAG_STATELESS | - DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE); + vfe->genpd_link =3D device_link_add(camss->dev, vfe->genpd, DL_FLAG_STATE= LESS | + DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE); =20 - if (!camss->genpd_link[id]) { + if (!vfe->genpd_link) { dev_err(vfe->camss->dev, "Failed to add VFE#%d to power domain\n", id); return -EINVAL; } diff --git a/drivers/media/platform/qcom/camss/camss-vfe-4-8.c b/drivers/me= dia/platform/qcom/camss/camss-vfe-4-8.c index 7b3805177f037..5bd5b6b3c992a 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe-4-8.c +++ b/drivers/media/platform/qcom/camss/camss-vfe-4-8.c @@ -1099,9 +1099,7 @@ static void vfe_isr_read(struct vfe_device *vfe, u32 = *value0, u32 *value1) */ static void vfe_pm_domain_off(struct vfe_device *vfe) { - struct camss *camss =3D vfe->camss; - - device_link_del(camss->genpd_link[vfe->id]); + device_link_del(vfe->genpd_link); } =20 /* @@ -1113,10 +1111,10 @@ static int vfe_pm_domain_on(struct vfe_device *vfe) struct camss *camss =3D vfe->camss; enum vfe_line_id id =3D vfe->id; =20 - camss->genpd_link[id] =3D device_link_add(camss->dev, camss->genpd[id], D= L_FLAG_STATELESS | - DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE); + vfe->genpd_link =3D device_link_add(camss->dev, vfe->genpd, DL_FLAG_STATE= LESS | + DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE); =20 - if (!camss->genpd_link[id]) { + if (!vfe->genpd_link) { dev_err(vfe->camss->dev, "Failed to add VFE#%d to power domain\n", id); return -EINVAL; } diff --git a/drivers/media/platform/qcom/camss/camss-vfe-480.c b/drivers/me= dia/platform/qcom/camss/camss-vfe-480.c index f2368b77fc6d6..ca16a7ebb2903 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe-480.c +++ b/drivers/media/platform/qcom/camss/camss-vfe-480.c @@ -463,7 +463,7 @@ static void vfe_pm_domain_off(struct vfe_device *vfe) if (vfe->id >=3D camss->res->vfe_num) return; =20 - device_link_del(camss->genpd_link[vfe->id]); + device_link_del(vfe->genpd_link); } =20 /* @@ -478,11 +478,11 @@ static int vfe_pm_domain_on(struct vfe_device *vfe) if (id >=3D camss->res->vfe_num) return 0; =20 - camss->genpd_link[id] =3D device_link_add(camss->dev, camss->genpd[id], - DL_FLAG_STATELESS | - DL_FLAG_PM_RUNTIME | - DL_FLAG_RPM_ACTIVE); - if (!camss->genpd_link[id]) + vfe->genpd_link =3D device_link_add(camss->dev, vfe->genpd, + DL_FLAG_STATELESS | + DL_FLAG_PM_RUNTIME | + DL_FLAG_RPM_ACTIVE); + if (!vfe->genpd_link) return -EINVAL; =20 return 0; diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/= platform/qcom/camss/camss-vfe.c index 4839e2cedfe58..3d31f4289b724 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.c +++ b/drivers/media/platform/qcom/camss/camss-vfe.c @@ -1347,6 +1347,9 @@ int msm_vfe_subdev_init(struct camss *camss, struct v= fe_device *vfe, if (!res->line_num) return -EINVAL; =20 + if (camss->genpd) + vfe->genpd =3D camss->genpd[id]; + vfe->line_num =3D res->line_num; vfe->ops->subdev_init(dev, vfe); =20 diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/= platform/qcom/camss/camss-vfe.h index 09baded0dcdd6..c1c50023d4876 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.h +++ b/drivers/media/platform/qcom/camss/camss-vfe.h @@ -150,6 +150,8 @@ struct vfe_device { const struct vfe_hw_ops_gen1 *ops_gen1; struct vfe_isr_ops isr_ops; struct camss_video_ops video_ops; + struct device *genpd; + struct device_link *genpd_link; }; =20 struct camss_subdev_resources; --=20 2.42.0 From nobody Thu Jan 1 07:21:54 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 810A7C25B70 for ; Tue, 24 Oct 2023 22:43:23 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344617AbjJXWnW (ORCPT ); Tue, 24 Oct 2023 18:43:22 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35494 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344567AbjJXWnR (ORCPT ); Tue, 24 Oct 2023 18:43:17 -0400 Received: from mail-lj1-x22e.google.com (mail-lj1-x22e.google.com [IPv6:2a00:1450:4864:20::22e]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 0421FB0 for ; Tue, 24 Oct 2023 15:43:14 -0700 (PDT) Received: by mail-lj1-x22e.google.com with SMTP id 38308e7fff4ca-2c5087d19a6so75020301fa.0 for ; Tue, 24 Oct 2023 15:43:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1698187392; x=1698792192; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=zkACzb7psfwrF2ylOIwNjRys80z1c/kWNppo4uFItzk=; b=jJixoakFDtnSRnmPrPFXzw0/vsJI/hiA6KXHtxNlg5zUjttyqXOIlmvzgOwCOA+gCZ /bjfgdfu1TAp36/VHs16SdoVG2OvdJS1bzVDDpD5Ud/0tqTb9M0LTEnV2S4NcMOKOhRy XMT/BOnaJV2TlqxY671Cg1xqxNo6aXW0++wudyQCfrVSE6Y0SdnZffFh6FjWkqFbgANx jEeh2CsFtVC+p0s6VUJL8ii6cL1SOnbM8H/Bd2CAbs+Tn7SpMKlYD8Nm5csp43lVMNjO VcFxtxOavnj3+HL1pl3i5hvEezm1zzLq321nhENIqXn8HRBhQ00UNNqFL70sxQYqMSzM 5YdA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698187392; x=1698792192; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=zkACzb7psfwrF2ylOIwNjRys80z1c/kWNppo4uFItzk=; b=g9WmNqkICAepaueBxJAG5qGqCtaxTwXosKlFZ09zq3E+EGvstklUrW4PDlkf2i6NnC DGKgzWUQIfDpLCOYByUYnBx7MfLYvJapWWOC160fgjRZOdC3oSm3Rb4wFUOrJRHPlfzJ cK6tCvOVthzABdPBzvlLK8BGpHci7toxurVAB2ZHx5Aor7s+a90gbBtUgCJwEOYhmXrR s3UGzYI0OfsbpLwmpnfONUxc4theAX3MylocfLBRf8nIB5UndRMUNqgU9EkljbAgD7/F QAMcSQH8Oc8MISEwEUOzatVLvWJ/qOJB9VdtOBXPW8Cx787l1W/mU3MleWj8cRGnzwt+ ALUA== X-Gm-Message-State: AOJu0YwOLlpegU0KyKNluZ2toVdgTJ0O4L08Zg9I7C72NSS2DxSozm+Q AAjDQpNJvG/u4e6fLT4gEW9/Fg== X-Google-Smtp-Source: AGHT+IFm9hZ76V6UiwyitE61nx7oNkEi1F9vqgVXj4aFJ1Y22vRm82vR14VpGzq8T8CkpAq4FtAt6A== X-Received: by 2002:a2e:a22c:0:b0:2c5:1bd3:5658 with SMTP id i12-20020a2ea22c000000b002c51bd35658mr9502780ljm.28.1698187392142; Tue, 24 Oct 2023 15:43:12 -0700 (PDT) Received: from sagittarius-a.nxsw.local ([37.228.218.3]) by smtp.gmail.com with ESMTPSA id j6-20020a05600c190600b0040641a9d49bsm13049531wmq.17.2023.10.24.15.43.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Oct 2023 15:43:11 -0700 (PDT) From: Bryan O'Donoghue To: hverkuil-cisco@xs4all.nl, laurent.pinchart@ideasonboard.com, rfoss@kernel.org, todor.too@gmail.com, agross@kernel.org, andersson@kernel.org, konrad.dybcio@linaro.org, mchehab@kernel.org Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Bryan O'Donoghue Subject: [PATCH 2/4] media: qcom: camss: Use common VFE pm_domain_on/pm_domain_off where applicable Date: Tue, 24 Oct 2023 23:42:53 +0100 Message-ID: <20231024224255.754779-3-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231024224255.754779-1-bryan.odonoghue@linaro.org> References: <20231024224255.754779-1-bryan.odonoghue@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" For the various versions of VFE we have a boiler-plate pm_domain_on/pm_domain_off callback pair of the general form. - Error check. Not always done but applicable to all. - device_link_add (DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE); - Error check returning -EINVAL on error. - Return 0 Reduce the pattern down to a common callback. VFE 4.1 is a special case which to me also indicates that it is worthwhile maintaining an indirection for the vfe_pm_domain_{on|off} for now. Otherwise lets chuck out a bunch of needlessly replicated code. Signed-off-by: Bryan O'Donoghue Reviewed-by: Konrad Dybcio --- .../media/platform/qcom/camss/camss-vfe-170.c | 36 ------------------- .../media/platform/qcom/camss/camss-vfe-4-1.c | 8 ++--- .../media/platform/qcom/camss/camss-vfe-4-7.c | 32 ----------------- .../media/platform/qcom/camss/camss-vfe-4-8.c | 29 --------------- .../media/platform/qcom/camss/camss-vfe-480.c | 36 ------------------- drivers/media/platform/qcom/camss/camss-vfe.c | 34 ++++++++++++++++++ drivers/media/platform/qcom/camss/camss-vfe.h | 12 +++++++ 7 files changed, 50 insertions(+), 137 deletions(-) diff --git a/drivers/media/platform/qcom/camss/camss-vfe-170.c b/drivers/me= dia/platform/qcom/camss/camss-vfe-170.c index 59b0ea0aac48f..795ac3815339a 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe-170.c +++ b/drivers/media/platform/qcom/camss/camss-vfe-170.c @@ -627,42 +627,6 @@ static void vfe_isr_wm_done(struct vfe_device *vfe, u8= wm) spin_unlock_irqrestore(&vfe->output_lock, flags); } =20 -/* - * vfe_pm_domain_off - Disable power domains specific to this VFE. - * @vfe: VFE Device - */ -static void vfe_pm_domain_off(struct vfe_device *vfe) -{ - struct camss *camss =3D vfe->camss; - - if (vfe->id >=3D camss->res->vfe_num) - return; - - device_link_del(vfe->genpd_link); -} - -/* - * vfe_pm_domain_on - Enable power domains specific to this VFE. - * @vfe: VFE Device - */ -static int vfe_pm_domain_on(struct vfe_device *vfe) -{ - struct camss *camss =3D vfe->camss; - enum vfe_line_id id =3D vfe->id; - - if (id >=3D camss->res->vfe_num) - return 0; - - vfe->genpd_link =3D device_link_add(camss->dev, vfe->genpd, - DL_FLAG_STATELESS | - DL_FLAG_PM_RUNTIME | - DL_FLAG_RPM_ACTIVE); - if (!vfe->genpd_link) - return -EINVAL; - - return 0; -} - /* * vfe_queue_buffer - Add empty buffer * @vid: Video device structure diff --git a/drivers/media/platform/qcom/camss/camss-vfe-4-1.c b/drivers/me= dia/platform/qcom/camss/camss-vfe-4-1.c index 2911e4126e7ad..ef6b34c915df1 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe-4-1.c +++ b/drivers/media/platform/qcom/camss/camss-vfe-4-1.c @@ -936,7 +936,7 @@ static irqreturn_t vfe_isr(int irq, void *dev) * vfe_pm_domain_off - Disable power domains specific to this VFE. * @vfe: VFE Device */ -static void vfe_pm_domain_off(struct vfe_device *vfe) +static void vfe_4_1_pm_domain_off(struct vfe_device *vfe) { /* nop */ } @@ -945,7 +945,7 @@ static void vfe_pm_domain_off(struct vfe_device *vfe) * vfe_pm_domain_on - Enable power domains specific to this VFE. * @vfe: VFE Device */ -static int vfe_pm_domain_on(struct vfe_device *vfe) +static int vfe_4_1_pm_domain_on(struct vfe_device *vfe) { return 0; } @@ -999,8 +999,8 @@ const struct vfe_hw_ops vfe_ops_4_1 =3D { .hw_version =3D vfe_hw_version, .isr_read =3D vfe_isr_read, .isr =3D vfe_isr, - .pm_domain_off =3D vfe_pm_domain_off, - .pm_domain_on =3D vfe_pm_domain_on, + .pm_domain_off =3D vfe_4_1_pm_domain_off, + .pm_domain_on =3D vfe_4_1_pm_domain_on, .reg_update_clear =3D vfe_reg_update_clear, .reg_update =3D vfe_reg_update, .subdev_init =3D vfe_subdev_init, diff --git a/drivers/media/platform/qcom/camss/camss-vfe-4-7.c b/drivers/me= dia/platform/qcom/camss/camss-vfe-4-7.c index c668494ee1e98..7655d22a9fda2 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe-4-7.c +++ b/drivers/media/platform/qcom/camss/camss-vfe-4-7.c @@ -1103,38 +1103,6 @@ static void vfe_isr_read(struct vfe_device *vfe, u32= *value0, u32 *value1) writel_relaxed(VFE_0_IRQ_CMD_GLOBAL_CLEAR, vfe->base + VFE_0_IRQ_CMD); } =20 -/* - * vfe_pm_domain_off - Disable power domains specific to this VFE. - * @vfe: VFE Device - */ -static void vfe_pm_domain_off(struct vfe_device *vfe) -{ - if (!vfe) - return; - - device_link_del(vfe->genpd_link); -} - -/* - * vfe_pm_domain_on - Enable power domains specific to this VFE. - * @vfe: VFE Device - */ -static int vfe_pm_domain_on(struct vfe_device *vfe) -{ - struct camss *camss =3D vfe->camss; - enum vfe_line_id id =3D vfe->id; - - vfe->genpd_link =3D device_link_add(camss->dev, vfe->genpd, DL_FLAG_STATE= LESS | - DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE); - - if (!vfe->genpd_link) { - dev_err(vfe->camss->dev, "Failed to add VFE#%d to power domain\n", id); - return -EINVAL; - } - - return 0; -} - static void vfe_violation_read(struct vfe_device *vfe) { u32 violation =3D readl_relaxed(vfe->base + VFE_0_VIOLATION_STATUS); diff --git a/drivers/media/platform/qcom/camss/camss-vfe-4-8.c b/drivers/me= dia/platform/qcom/camss/camss-vfe-4-8.c index 5bd5b6b3c992a..f52fa30f3853e 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe-4-8.c +++ b/drivers/media/platform/qcom/camss/camss-vfe-4-8.c @@ -1093,35 +1093,6 @@ static void vfe_isr_read(struct vfe_device *vfe, u32= *value0, u32 *value1) writel_relaxed(VFE_0_IRQ_CMD_GLOBAL_CLEAR, vfe->base + VFE_0_IRQ_CMD); } =20 -/* - * vfe_pm_domain_off - Disable power domains specific to this VFE. - * @vfe: VFE Device - */ -static void vfe_pm_domain_off(struct vfe_device *vfe) -{ - device_link_del(vfe->genpd_link); -} - -/* - * vfe_pm_domain_on - Enable power domains specific to this VFE. - * @vfe: VFE Device - */ -static int vfe_pm_domain_on(struct vfe_device *vfe) -{ - struct camss *camss =3D vfe->camss; - enum vfe_line_id id =3D vfe->id; - - vfe->genpd_link =3D device_link_add(camss->dev, vfe->genpd, DL_FLAG_STATE= LESS | - DL_FLAG_PM_RUNTIME | DL_FLAG_RPM_ACTIVE); - - if (!vfe->genpd_link) { - dev_err(vfe->camss->dev, "Failed to add VFE#%d to power domain\n", id); - return -EINVAL; - } - - return 0; -} - static void vfe_violation_read(struct vfe_device *vfe) { u32 violation =3D readl_relaxed(vfe->base + VFE_0_VIOLATION_STATUS); diff --git a/drivers/media/platform/qcom/camss/camss-vfe-480.c b/drivers/me= dia/platform/qcom/camss/camss-vfe-480.c index ca16a7ebb2903..4652e8b4cff58 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe-480.c +++ b/drivers/media/platform/qcom/camss/camss-vfe-480.c @@ -452,42 +452,6 @@ static void vfe_isr_wm_done(struct vfe_device *vfe, u8= wm) spin_unlock_irqrestore(&vfe->output_lock, flags); } =20 -/* - * vfe_pm_domain_off - Disable power domains specific to this VFE. - * @vfe: VFE Device - */ -static void vfe_pm_domain_off(struct vfe_device *vfe) -{ - struct camss *camss =3D vfe->camss; - - if (vfe->id >=3D camss->res->vfe_num) - return; - - device_link_del(vfe->genpd_link); -} - -/* - * vfe_pm_domain_on - Enable power domains specific to this VFE. - * @vfe: VFE Device - */ -static int vfe_pm_domain_on(struct vfe_device *vfe) -{ - struct camss *camss =3D vfe->camss; - enum vfe_line_id id =3D vfe->id; - - if (id >=3D camss->res->vfe_num) - return 0; - - vfe->genpd_link =3D device_link_add(camss->dev, vfe->genpd, - DL_FLAG_STATELESS | - DL_FLAG_PM_RUNTIME | - DL_FLAG_RPM_ACTIVE); - if (!vfe->genpd_link) - return -EINVAL; - - return 0; -} - /* * vfe_queue_buffer - Add empty buffer * @vid: Video device structure diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/= platform/qcom/camss/camss-vfe.c index 3d31f4289b724..fc3733baa668d 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.c +++ b/drivers/media/platform/qcom/camss/camss-vfe.c @@ -474,6 +474,40 @@ void vfe_isr_reset_ack(struct vfe_device *vfe) complete(&vfe->reset_complete); } =20 +/* + * vfe_pm_domain_off - Disable power domains specific to this VFE. + * @vfe: VFE Device + */ +void vfe_pm_domain_off(struct vfe_device *vfe) +{ + if (!vfe->genpd) + return; + + device_link_del(vfe->genpd_link); +} + +/* + * vfe_pm_domain_on - Enable power domains specific to this VFE. + * @vfe: VFE Device + */ +int vfe_pm_domain_on(struct vfe_device *vfe) +{ + struct camss *camss =3D vfe->camss; + enum vfe_line_id id =3D vfe->id; + + if (!vfe->genpd) + return 0; + + vfe->genpd_link =3D device_link_add(camss->dev, vfe->genpd, + DL_FLAG_STATELESS | + DL_FLAG_PM_RUNTIME | + DL_FLAG_RPM_ACTIVE); + if (!vfe->genpd_link) + return -EINVAL; + + return 0; +} + static int vfe_match_clock_names(struct vfe_device *vfe, struct camss_clock *clock) { diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/= platform/qcom/camss/camss-vfe.h index c1c50023d4876..992a2103ec44c 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.h +++ b/drivers/media/platform/qcom/camss/camss-vfe.h @@ -203,6 +203,18 @@ int vfe_reset(struct vfe_device *vfe); */ int vfe_disable(struct vfe_line *line); =20 +/* + * vfe_pm_domain_off - Disable power domains specific to this VFE. + * @vfe: VFE Device + */ +void vfe_pm_domain_off(struct vfe_device *vfe); + +/* + * vfe_pm_domain_on - Enable power domains specific to this VFE. + * @vfe: VFE Device + */ +int vfe_pm_domain_on(struct vfe_device *vfe); + extern const struct vfe_hw_ops vfe_ops_4_1; extern const struct vfe_hw_ops vfe_ops_4_7; extern const struct vfe_hw_ops vfe_ops_4_8; --=20 2.42.0 From nobody Thu Jan 1 07:21:54 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 62469C25B47 for ; Tue, 24 Oct 2023 22:43:26 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344623AbjJXWn0 (ORCPT ); Tue, 24 Oct 2023 18:43:26 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35550 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344534AbjJXWnU (ORCPT ); Tue, 24 Oct 2023 18:43:20 -0400 Received: from mail-wm1-x336.google.com (mail-wm1-x336.google.com [IPv6:2a00:1450:4864:20::336]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id B827210CF for ; Tue, 24 Oct 2023 15:43:14 -0700 (PDT) Received: by mail-wm1-x336.google.com with SMTP id 5b1f17b1804b1-40859c46447so26416355e9.1 for ; Tue, 24 Oct 2023 15:43:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1698187393; x=1698792193; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=nRUzcqXrJpaCGHIX3C89YackOmf/WIqYpEcrqSvOKDE=; b=FOnbeoq0cZUCggodhAuaItHob8B5v1vU6s3VPln4nJGx+CPGqrLa7rm+LOd5cF4gD4 56qwrC9ZYCiQ88fR1DMFSIpg9Bo//H/FnZ4uUNePwTaN0t5ywyD9BuqdylaSICQl+YeG 5IfyR8NhBthGGxQTPHyID1WAHI1L9S/I9M+GGuFlnSjLaY6Tq/BkZYMUqkopOwXiKB+t fdII+dYFOmcw6pnEj8yXBkb+9802L6oMAW6zC/qntzunMeznoIk0H6r+uL0/1bJh/n0r d4yIUPz86W336PGX1RP9mBq8z2FnGzWrXHPM/feXguyGrIx9xfT81VsaTAUQ3qv1KhQ5 UcKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698187393; x=1698792193; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=nRUzcqXrJpaCGHIX3C89YackOmf/WIqYpEcrqSvOKDE=; b=LRaeY9BWRMCRqQbR4hbalBGKpG3SdE2UG/Y3I9TEMouhnZoKPTiW4qK3LMm+wT/c8B 8YvsIdHECOhpKSZPcIVHkG5EqS+LyahzIu0M1L2JCR1iuQaJHfR/3s4yiIM2nEtt2u2s AO8UBgQTok5fef4HHLEWuKgYOT066SPud3tzyXTqqIWrqH/3GMUXi9nadV/vg42xFe6g yLkW5z4e6cSL3i55VjxAgCllwXPGEgSqorvjr39CD/JbaSaYUqzpKfWObUs/2fxob+eF wjxdS+h2N1hCv/Slhgd4hJbHoX/azaVIaSSXcohWamiVp2xjxxY23vXioLHFeDC4BXiQ SaIQ== X-Gm-Message-State: AOJu0Yz0Dc6eEf/RCzg53Tvm/tcKGyMualKyzpDEgkZBsGf6rBLuFFaF pqgQYxirUzHI5XLfF7c6zZ855uN8wEJ95Wjlsko9Dg== X-Google-Smtp-Source: AGHT+IFxCvF6GecGq39a2dirJVqwelsXV7gUpdMmgqkL2vDx2yrADu5ybN+Qc3UF6XyTYRpQr2lnlA== X-Received: by 2002:a05:600c:4fc7:b0:407:5b54:bb10 with SMTP id o7-20020a05600c4fc700b004075b54bb10mr10815166wmq.8.1698187393238; Tue, 24 Oct 2023 15:43:13 -0700 (PDT) Received: from sagittarius-a.nxsw.local ([37.228.218.3]) by smtp.gmail.com with ESMTPSA id j6-20020a05600c190600b0040641a9d49bsm13049531wmq.17.2023.10.24.15.43.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Oct 2023 15:43:12 -0700 (PDT) From: Bryan O'Donoghue To: hverkuil-cisco@xs4all.nl, laurent.pinchart@ideasonboard.com, rfoss@kernel.org, todor.too@gmail.com, agross@kernel.org, andersson@kernel.org, konrad.dybcio@linaro.org, mchehab@kernel.org Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Bryan O'Donoghue Subject: [PATCH 3/4] media: qcom: camss: Move VFE power-domain specifics into vfe.c Date: Tue, 24 Oct 2023 23:42:54 +0100 Message-ID: <20231024224255.754779-4-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231024224255.754779-1-bryan.odonoghue@linaro.org> References: <20231024224255.754779-1-bryan.odonoghue@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Moving the location of the hooks to VFE power domains has several advantages. 1. Separation of concerns and functional decomposition. vfe.c should be responsible for and know best how manage power-domains for a VFE, excising from camss.c follows this principle. 2. Embeddeding a pointer to genpd in struct camss_vfe{} meas that we can dispense with a bunch of kmalloc array inside of camss.c. 3. Splitting up titan top gdsc from vfe/ife gdsc provides a base for breaking up magic indexes in dtsi. Signed-off-by: Bryan O'Donoghue --- drivers/media/platform/qcom/camss/camss-vfe.c | 24 ++++++- drivers/media/platform/qcom/camss/camss-vfe.h | 2 + drivers/media/platform/qcom/camss/camss.c | 63 +++++++++---------- drivers/media/platform/qcom/camss/camss.h | 4 +- 4 files changed, 55 insertions(+), 38 deletions(-) diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/= platform/qcom/camss/camss-vfe.c index fc3733baa668d..bc14ae4771e31 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.c +++ b/drivers/media/platform/qcom/camss/camss-vfe.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include @@ -493,7 +494,6 @@ void vfe_pm_domain_off(struct vfe_device *vfe) int vfe_pm_domain_on(struct vfe_device *vfe) { struct camss *camss =3D vfe->camss; - enum vfe_line_id id =3D vfe->id; =20 if (!vfe->genpd) return 0; @@ -1381,8 +1381,13 @@ int msm_vfe_subdev_init(struct camss *camss, struct = vfe_device *vfe, if (!res->line_num) return -EINVAL; =20 - if (camss->genpd) - vfe->genpd =3D camss->genpd[id]; + if (camss->genpd) { + vfe->genpd =3D dev_pm_domain_attach_by_id(camss->dev, id); + if (IS_ERR(vfe->genpd)) { + ret =3D PTR_ERR(vfe->genpd); + return ret; + } + } =20 vfe->line_num =3D res->line_num; vfe->ops->subdev_init(dev, vfe); @@ -1506,6 +1511,19 @@ int msm_vfe_subdev_init(struct camss *camss, struct = vfe_device *vfe, return 0; } =20 +/* + * msm_vfe_genpd_cleanup - Cleanup VFE genpd linkages + * @vfe: VFE device + * + */ +void msm_vfe_genpd_cleanup(struct vfe_device *vfe) +{ + if (vfe->genpd_link) + device_link_del(vfe->genpd_link); + + dev_pm_domain_detach(vfe->genpd, true); +} + /* * vfe_link_setup - Setup VFE connections * @entity: Pointer to media entity structure diff --git a/drivers/media/platform/qcom/camss/camss-vfe.h b/drivers/media/= platform/qcom/camss/camss-vfe.h index 992a2103ec44c..cdbe59d8d437e 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.h +++ b/drivers/media/platform/qcom/camss/camss-vfe.h @@ -159,6 +159,8 @@ struct camss_subdev_resources; int msm_vfe_subdev_init(struct camss *camss, struct vfe_device *vfe, const struct camss_subdev_resources *res, u8 id); =20 +void msm_vfe_genpd_cleanup(struct vfe_device *vfe); + int msm_vfe_register_entities(struct vfe_device *vfe, struct v4l2_device *v4l2_dev); =20 diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/plat= form/qcom/camss/camss.c index 8e78dd8d5961e..523b36d86f6cf 100644 --- a/drivers/media/platform/qcom/camss/camss.c +++ b/drivers/media/platform/qcom/camss/camss.c @@ -1479,7 +1479,6 @@ static const struct media_device_ops camss_media_ops = =3D { static int camss_configure_pd(struct camss *camss) { struct device *dev =3D camss->dev; - int i; int ret; =20 camss->genpd_num =3D of_count_phandle_with_args(dev->of_node, @@ -1498,45 +1497,36 @@ static int camss_configure_pd(struct camss *camss) if (camss->genpd_num =3D=3D 1) return 0; =20 - camss->genpd =3D devm_kmalloc_array(dev, camss->genpd_num, - sizeof(*camss->genpd), GFP_KERNEL); - if (!camss->genpd) - return -ENOMEM; - - camss->genpd_link =3D devm_kmalloc_array(dev, camss->genpd_num, - sizeof(*camss->genpd_link), - GFP_KERNEL); - if (!camss->genpd_link) - return -ENOMEM; + /* + * If the number of power-domains is greather than the number of VFEs + * then the additional power-domain is for the entire CAMSS block the + * 'top' power-domain. + */ + if (camss->genpd_num <=3D camss->res->vfe_num) + return 0; =20 /* * VFE power domains are in the beginning of the list, and while all * power domains should be attached, only if TITAN_TOP power domain is * found in the list, it should be linked over here. */ - for (i =3D 0; i < camss->genpd_num; i++) { - camss->genpd[i] =3D dev_pm_domain_attach_by_id(camss->dev, i); - if (IS_ERR(camss->genpd[i])) { - ret =3D PTR_ERR(camss->genpd[i]); - goto fail_pm; - } + camss->genpd =3D dev_pm_domain_attach_by_id(camss->dev, camss->genpd_num = - 1); + if (IS_ERR(camss->genpd)) { + ret =3D PTR_ERR(camss->genpd); + goto fail_pm; } - - if (i > camss->res->vfe_num) { - camss->genpd_link[i - 1] =3D device_link_add(camss->dev, camss->genpd[i = - 1], - DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | - DL_FLAG_RPM_ACTIVE); - if (!camss->genpd_link[i - 1]) { - ret =3D -EINVAL; - goto fail_pm; - } + camss->genpd_link =3D device_link_add(camss->dev, camss->genpd, + DL_FLAG_STATELESS | DL_FLAG_PM_RUNTIME | + DL_FLAG_RPM_ACTIVE); + if (!camss->genpd_link) { + ret =3D -EINVAL; + goto fail_pm; } =20 return 0; =20 fail_pm: - for (--i ; i >=3D 0; i--) - dev_pm_domain_detach(camss->genpd[i], true); + dev_pm_domain_detach(camss->genpd, true); =20 return ret; } @@ -1558,18 +1548,25 @@ static int camss_icc_get(struct camss *camss) return 0; } =20 -static void camss_genpd_cleanup(struct camss *camss) +static void camss_genpd_subdevice_cleanup(struct camss *camss) { int i; =20 + for (i =3D 0; i < camss->vfe_total_num; i++) + msm_vfe_genpd_cleanup(&camss->vfe[i]); +} + +static void camss_genpd_cleanup(struct camss *camss) +{ if (camss->genpd_num =3D=3D 1) return; =20 - if (camss->genpd_num > camss->res->vfe_num) - device_link_del(camss->genpd_link[camss->genpd_num - 1]); + if (camss->genpd_link) + device_link_del(camss->genpd_link); + + dev_pm_domain_detach(camss->genpd, true); =20 - for (i =3D 0; i < camss->genpd_num; i++) - dev_pm_domain_detach(camss->genpd[i], true); + camss_genpd_subdevice_cleanup(camss); } =20 /* diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/plat= form/qcom/camss/camss.h index 8acad7321c09d..95486c494afc6 100644 --- a/drivers/media/platform/qcom/camss/camss.h +++ b/drivers/media/platform/qcom/camss/camss.h @@ -106,8 +106,8 @@ struct camss { struct vfe_device *vfe; atomic_t ref_count; int genpd_num; - struct device **genpd; - struct device_link **genpd_link; + struct device *genpd; + struct device_link *genpd_link; struct icc_path *icc_path[ICC_SM8250_COUNT]; const struct camss_resources *res; unsigned int vfe_total_num; --=20 2.42.0 From nobody Thu Jan 1 07:21:54 2026 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 92F3BC07545 for ; Tue, 24 Oct 2023 22:43:29 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1344649AbjJXWn2 (ORCPT ); Tue, 24 Oct 2023 18:43:28 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:35564 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1344581AbjJXWnU (ORCPT ); Tue, 24 Oct 2023 18:43:20 -0400 Received: from mail-wm1-x332.google.com (mail-wm1-x332.google.com [IPv6:2a00:1450:4864:20::332]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E5FEE10C6 for ; Tue, 24 Oct 2023 15:43:15 -0700 (PDT) Received: by mail-wm1-x332.google.com with SMTP id 5b1f17b1804b1-40907b82ab9so1295265e9.1 for ; Tue, 24 Oct 2023 15:43:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1698187394; x=1698792194; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=SrD6kKZF7oe0EGz2m2BzMlSzxhpuIf6zdpgGnAoBqe0=; b=RHEOHoJzJFJArR915qg0a07zoxtYPHOcfW64btcAsV3T3nqme2vbZFmmgql02eXOr2 P5MJJnE7NE3gG1cxgJw3/kspr9hGS9WboqNNC04aPuFPVIj3JV+PWLvXUTBt/g9vTSCW S4VLy7GS+mcGBeeM9fzCOn+ViZ2Uc+xB2uVlQBc6StdX9QiefvqyD1toUNUDMQDyIacz RHzjr5XBZRiPUoHWFN9+NDpAqLpYlSVyafPdVU7q4r965vZrUVU4LHnaqB5V0/WJcbkU vrgH39kyTsezYSFIT5aC+xwdzRWZuKMg2wynefvQ6wFdLRb789jxVq0MrEHI95G90DLn WQKA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1698187394; x=1698792194; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=SrD6kKZF7oe0EGz2m2BzMlSzxhpuIf6zdpgGnAoBqe0=; b=kKcwYMoZ+6bIZwXKa4BhZY8xqafsx9jJVzNzE2/xUpX55z3SSW3z7+awXzAnvOFTLo stEuEqKIQyb1tjaigc28cwrD0fGwj2unci6M4SZ6sYTaZ+46vt0eapgRqGPhcyAE8VEa nddckjcXW0F2uCZl6bss9rGmPnm/cSc5tVBGJCP+U4qHIlzF0poFCa/m2kf6y00jEP/C R1uqVhBVSyv0g5paqnaPZfYEw65mbploIuOd6McxxoOaKwMyZug9tVvbg3a3eyHElJ2W 91cDeR8t41qzDth69RCDr191xQv5Nbbun0sdJYa2taDuFTKi6tkWxD4pGLw0s7Osuj16 wCSw== X-Gm-Message-State: AOJu0YwUGFP/0yUVFj3V/y4AtIZxRy8DY3W2DF23V/z0SKgE+sfXzmOA n8yaxfw6kszeHOlBektIFlwKwQ== X-Google-Smtp-Source: AGHT+IEYf4pOVluKThmKF4lza0zIsYrPshinEKC/xI+uP8ok92ga7euV1fdER2WyFhm8p6FlDFgF6A== X-Received: by 2002:a05:600c:3414:b0:401:c7ec:b930 with SMTP id y20-20020a05600c341400b00401c7ecb930mr15349644wmp.10.1698187394317; Tue, 24 Oct 2023 15:43:14 -0700 (PDT) Received: from sagittarius-a.nxsw.local ([37.228.218.3]) by smtp.gmail.com with ESMTPSA id j6-20020a05600c190600b0040641a9d49bsm13049531wmq.17.2023.10.24.15.43.13 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 24 Oct 2023 15:43:13 -0700 (PDT) From: Bryan O'Donoghue To: hverkuil-cisco@xs4all.nl, laurent.pinchart@ideasonboard.com, rfoss@kernel.org, todor.too@gmail.com, agross@kernel.org, andersson@kernel.org, konrad.dybcio@linaro.org, mchehab@kernel.org Cc: linux-media@vger.kernel.org, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, Bryan O'Donoghue Subject: [PATCH 4/4] media: qcom: camss: Add support for named power-domains Date: Tue, 24 Oct 2023 23:42:55 +0100 Message-ID: <20231024224255.754779-5-bryan.odonoghue@linaro.org> X-Mailer: git-send-email 2.42.0 In-Reply-To: <20231024224255.754779-1-bryan.odonoghue@linaro.org> References: <20231024224255.754779-1-bryan.odonoghue@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Right now we use fixed indexes to assign power-domains, with a requirement for the TOP GDSC to come last in the list. Adding support for named power-domains means the declaration in the dtsi can come in any order. After this change we continue to support the old indexing - if a SoC resource declration or the in-use dtb doesn't declare power-domain names we fall back to the default legacy indexing. From this point on though new SoC additions should contain named power-domains, eventually we will drop support for legacy indexing. Signed-off-by: Bryan O'Donoghue --- drivers/media/platform/qcom/camss/camss-vfe.c | 24 ++++++++++++++++- drivers/media/platform/qcom/camss/camss.c | 26 +++++++++++++++---- drivers/media/platform/qcom/camss/camss.h | 2 ++ 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/= platform/qcom/camss/camss-vfe.c index bc14ae4771e31..12c64c505befd 100644 --- a/drivers/media/platform/qcom/camss/camss-vfe.c +++ b/drivers/media/platform/qcom/camss/camss-vfe.c @@ -1381,7 +1381,29 @@ int msm_vfe_subdev_init(struct camss *camss, struct = vfe_device *vfe, if (!res->line_num) return -EINVAL; =20 - if (camss->genpd) { + /* Power domain */ + + if (res->pd_name) { + vfe->genpd =3D dev_pm_domain_attach_by_name(camss->dev, + res->pd_name); + if (IS_ERR(vfe->genpd)) { + ret =3D PTR_ERR(vfe->genpd); + return ret; + } + } + + if (camss->genpd && !vfe->genpd) { + /* + * Legacy magic index. + * Requires + * power-domain =3D , + * , + * + * id must correspondng to the index of the VFE which must + * come before the TOP GDSC. VFE Lite has no individually + * collapasible domain which is why id < vfe_num is a valid + * check. + */ vfe->genpd =3D dev_pm_domain_attach_by_id(camss->dev, id); if (IS_ERR(vfe->genpd)) { ret =3D PTR_ERR(vfe->genpd); diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/plat= form/qcom/camss/camss.c index 523b36d86f6cf..fb5276f4d9448 100644 --- a/drivers/media/platform/qcom/camss/camss.c +++ b/drivers/media/platform/qcom/camss/camss.c @@ -1506,12 +1506,28 @@ static int camss_configure_pd(struct camss *camss) return 0; =20 /* - * VFE power domains are in the beginning of the list, and while all - * power domains should be attached, only if TITAN_TOP power domain is - * found in the list, it should be linked over here. + * If a power-domain name is defined try to use it. + * It is possible we are running a new kernel with an old dtb so + * fallback to indexes even if a pd_name is defined but not found. */ - camss->genpd =3D dev_pm_domain_attach_by_id(camss->dev, camss->genpd_num = - 1); - if (IS_ERR(camss->genpd)) { + if (camss->res->pd_name) { + camss->genpd =3D dev_pm_domain_attach_by_name(camss->dev, + camss->res->pd_name); + if (IS_ERR(camss->genpd)) { + ret =3D PTR_ERR(camss->genpd); + goto fail_pm; + } + } + + if (!camss->genpd) { + /* + * Legacy magic index. TITAN_TOP GDSC must be the last + * item in the power-domain list. + */ + camss->genpd =3D dev_pm_domain_attach_by_id(camss->dev, + camss->genpd_num - 1); + } + if (IS_ERR_OR_NULL(camss->genpd)) { ret =3D PTR_ERR(camss->genpd); goto fail_pm; } diff --git a/drivers/media/platform/qcom/camss/camss.h b/drivers/media/plat= form/qcom/camss/camss.h index 95486c494afc6..6762ce9631476 100644 --- a/drivers/media/platform/qcom/camss/camss.h +++ b/drivers/media/platform/qcom/camss/camss.h @@ -48,6 +48,7 @@ struct camss_subdev_resources { u32 clock_rate[CAMSS_RES_MAX][CAMSS_RES_MAX]; char *reg[CAMSS_RES_MAX]; char *interrupt[CAMSS_RES_MAX]; + char *pd_name; u8 line_num; const void *ops; }; @@ -83,6 +84,7 @@ enum icc_count { =20 struct camss_resources { enum camss_version version; + const char *pd_name; const struct camss_subdev_resources *csiphy_res; const struct camss_subdev_resources *csid_res; const struct camss_subdev_resources *ispif_res; --=20 2.42.0