[PATCH v2 4/7] media: qcom: camss: Add SM8450 CAMSS support

Frank Li Frank.li at oss.nxp.com
Wed Oct 28 08:31:12 PDT 2026


On Tue, Oct 27, 2026 at 12:49:54AM +0200, Vladimir Zapolskiy wrote:
> Add support of the camera subsystem (CAMSS) found on Qualcomm SM8450 SoC.
>
> The CAMSS IP on SM8450 contains:
> * three CSID and two CSID lite, which are supported by CSID 680,
> * three VFE and two VFE lite blocks, which are supported by VFE 680,
> * three CSI test pattern generators, which are supported by TPG Gen1.
>
> Qualcomm SM8450 CSIPHYs are supported by the CSI2 PHY driver only.
>
> Signed-off-by: Vladimir Zapolskiy <vz at kernel.org>
> ---
>  drivers/media/platform/qcom/camss/camss-vfe.c |   2 +
>  drivers/media/platform/qcom/camss/camss.c     | 236 ++++++++++++++++++
>  drivers/media/platform/qcom/camss/camss.h     |   1 +
>  3 files changed, 239 insertions(+)
>
> diff --git a/drivers/media/platform/qcom/camss/camss-vfe.c b/drivers/media/platform/qcom/camss/camss-vfe.c
> index 2680a9914765..8ebd67bd9b2e 100644
> --- a/drivers/media/platform/qcom/camss/camss-vfe.c
> +++ b/drivers/media/platform/qcom/camss/camss-vfe.c
> @@ -350,6 +350,7 @@ static u32 vfe_src_pad_code(struct vfe_line *line, u32 sink_code,
>  	case CAMSS_8280XP:
>  	case CAMSS_8300:
>  	case CAMSS_845:
> +	case CAMSS_8450:
>  	case CAMSS_8550:
>  	case CAMSS_8650:
>  	case CAMSS_8775P:
> @@ -2010,6 +2011,7 @@ static int vfe_bpl_align_rdi(struct vfe_device *vfe)
>  	case CAMSS_8280XP:
>  	case CAMSS_8300:
>  	case CAMSS_845:
> +	case CAMSS_8450:
>  	case CAMSS_8550:
>  	case CAMSS_8650:
>  	case CAMSS_8775P:
> diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
> index b0d60e70e4bb..1db66976e51b 100644
> --- a/drivers/media/platform/qcom/camss/camss.c
> +++ b/drivers/media/platform/qcom/camss/camss.c
> @@ -2967,6 +2967,226 @@ static const struct resources_icc icc_res_sc8280xp[] = {
>  	},
>  };
>
> +static const struct camss_subdev_resources csid_res_sm8450[] = {
> +	/* CSID0 */
> +	{
> +		.regulators = {},
> +		.clock = { "cpas_ahb", "csid", "csiphy_rx" },
> +		.clock_rate = { { 0 },
> +				{ 480000000 },
> +				{ 400000000 }, },
> +		.reg = { "csid0" },
> +		.interrupt = { "csid0" },
> +		.csid = {
> +			.hw_ops = &csid_ops_680,
> +			.parent_dev_ops = &vfe_parent_dev_ops,
> +			.formats = &csid_formats_gen2,
> +		},
> +	},
> +	/* CSID1 */
> +	{
> +		.regulators = {},
> +		.clock = { "cpas_ahb", "csid", "csiphy_rx" },
> +		.clock_rate = { { 0 },
> +				{ 480000000 },
> +				{ 400000000 }, },
> +		.reg = { "csid1" },
> +		.interrupt = { "csid1" },
> +		.csid = {
> +			.hw_ops = &csid_ops_680,
> +			.parent_dev_ops = &vfe_parent_dev_ops,
> +			.formats = &csid_formats_gen2,
> +		},
> +	},
> +	/* CSID2 */
> +	{
> +		.regulators = {},
> +		.clock = { "cpas_ahb", "csid", "csiphy_rx" },
> +		.clock_rate = { { 0 },
> +				{ 480000000 },
> +				{ 400000000 }, },
> +		.reg = { "csid2" },
> +		.interrupt = { "csid2" },
> +		.csid = {
> +			.hw_ops = &csid_ops_680,
> +			.parent_dev_ops = &vfe_parent_dev_ops,
> +			.formats = &csid_formats_gen2,
> +		},
> +	},
> +	/* CSID_LITE0 */
> +	{
> +		.regulators = {},
> +		.clock = { "cpas_ahb", "vfe_lite_csid", "vfe_lite_cphy_rx",
> +			   "csiphy_rx" },
> +		.clock_rate = { { 0 },
> +				{ 480000000 },
> +				{ 400000000 },
> +				{ 400000000 }, },
> +		.reg = { "csid_lite0" },
> +		.interrupt = { "csid_lite0" },
> +		.csid = {
> +			.is_lite = true,
> +			.hw_ops = &csid_ops_680,
> +			.parent_dev_ops = &vfe_parent_dev_ops,
> +			.formats = &csid_formats_gen2,
> +		},
> +	},
> +	/* CSID_LITE1 */
> +	{
> +		.regulators = {},
> +		.clock = { "cpas_ahb", "vfe_lite_csid", "vfe_lite_cphy_rx",
> +			   "csiphy_rx" },
> +		.clock_rate = { { 0 },
> +				{ 480000000 },
> +				{ 400000000 },
> +				{ 400000000 }, },
> +		.reg = { "csid_lite1" },
> +		.interrupt = { "csid_lite1" },
> +		.csid = {
> +			.is_lite = true,
> +			.hw_ops = &csid_ops_680,
> +			.parent_dev_ops = &vfe_parent_dev_ops,
> +			.formats = &csid_formats_gen2,
> +		},
> +	},
> +};
> +
> +static const struct camss_subdev_resources vfe_res_sm8450[] = {
> +	/* IFE0 */
> +	{
> +		.regulators = {},
> +		.clock = { "gcc_hf_axi", "camnoc_axi", "cpas_ahb",
> +			   "core_ahb", "cpas_fast_ahb", "cpas_vfe0",
> +			   "vfe0_fast_ahb", "vfe0" },
> +		.clock_rate = { { 0 },
> +				{ 300000000, 400000000 },
> +				{ 0 },
> +				{ 0 },
> +				{ 0 },
> +				{ 0 },
> +				{ 0 },
> +				{ 432000000, 594000000, 675000000, 727000000 }, },

Nit:
	Can you align clock and clock_rate wrap method,

	"gcc_hf_axi", "camnoc_axi", "cpas_ahb",

	{0}, { 300000000, 400000000 }, {0},

1st line have 3 clock at .clock,
clock rate also 3 clock_rate.

So reader can know corresponding rate quickly,

	for example, If I know rate of cpas_fast_ahb, reader can simple
locate by second row and second col.

Frank



More information about the linux-phy mailing list