On Sun, Mar 01, 2026 at 01:51:28AM +0100, David Heidelberg via B4 Relay wrote:
> -static int csid_set_clock_rates(struct csid_device *csid)
> +static int csid_set_clock_rates(struct v4l2_subdev *sd, struct csid_device 
> *csid)
>  {
>       struct device *dev = csid->camss->dev;
> +     struct csiphy_device *csiphy = v4l2_get_subdevdata(sd);
> +     struct csiphy_lanes_cfg *lane_cfg = &csiphy->cfg.csi2->lane_cfg;

I believe there's a regression here from v3. I've been testing v4 of
this series on SA8775P (kernel 6.18) with a GMSL2 camera pipeline and
hit an invalid pointer dereference in csid_set_clock_rates() during
pipeline power-up:

  pc : camss_get_link_freq+0x1c/0xc4 [qcom_camss]
  lr : csid_set_power+0xc8/0x404 [qcom_camss]
  Code: 910003fd a90153f3 aa0003f4 a9025bf5 (b9400040)

The sd passed here from csid_set_power() is the csid subdev, so the
subdevdata is a csid_device rather than a csiphy_device. The csid_device
stores its linked csiphy_id during csid_link_setup(), so the fix is to
look it up through the camss device array:

    static int csid_set_clock_rates(struct csid_device *csid)
    {
        struct csiphy_device *csiphy = 
&csid->camss->csiphy[csid->phy.csiphy_id];
        struct csiphy_lanes_cfg *lane_cfg = &csiphy->cfg.csi2->lane_cfg;

This also lets us drop the v4l2_subdev parameter entirely since it's
no longer needed. With the above change my pipeline powers on and
streams correctly.

Tested-by: Cory Keitz <[email protected]>

---

Regards,
Cory

Reply via email to