[PATCH v8 14/15] media: atomisp: allow raw Bayer capture

From: mauriziocasciano7

Date: Fri Oct 02 2026 - 04:20:41 EST


AtomISP currently rejects all raw formats and silently substitutes
YUV420. This prevents userspace camera processing stacks from obtaining
unprocessed sensor frames.

Enumerate only the raw format matching the sensor media-bus code and
reconcile raw requests with the code selected by the sensor. Userspace
opts in by selecting that raw V4L2 pixel format with VIDIOC_S_FMT.

Raw formats expose the full sensor transport frame so ISP2401 can use
its copy pipeline. Processed formats retain the existing global padding
behavior; selecting a smaller receiver crop remains a userspace pipeline
decision.

Signed-off-by: Maurizio Casciano <mauriziocasciano7@xxxxxxxxx>
Assisted-by: LLM sparse
---
drivers/staging/media/atomisp/pci/atomisp_cmd.c | 14 +++++++++++---
.../staging/media/atomisp/pci/atomisp_ioctl.c | 17 ++++++++++++++---
2 files changed, 25 insertions(+), 6 deletions(-)

diff --git a/drivers/staging/media/atomisp/pci/atomisp_cmd.c
b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
index 4d4c0726d9de..e7b817fd779a 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_cmd.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_cmd.c
@@ -3822,8 +3822,7 @@ int atomisp_try_fmt(struct atomisp_device *isp,
struct v4l2_pix_format *f,
int ret;

fmt = atomisp_get_format_bridge(f->pixelformat);
- /* Currently, raw formats are broken!!! */
- if (!fmt || fmt->sh_fmt == IA_CSS_FRAME_FORMAT_RAW) {
+ if (!fmt) {
f->pixelformat = V4L2_PIX_FMT_YUV420;

fmt = atomisp_get_format_bridge(f->pixelformat);
@@ -3845,7 +3844,10 @@ int atomisp_try_fmt(struct atomisp_device *isp,
struct v4l2_pix_format *f,
* resolution + padding. Add padding here and remove it again after
* the set_fmt call, like atomisp_set_fmt_to_snr() does.
*/
- atomisp_get_pix_padding(isp, f, &padding);
+ if (fmt->sh_fmt == IA_CSS_FRAME_FORMAT_RAW)
+ padding = (struct v4l2_area) { };
+ else
+ atomisp_get_pix_padding(isp, f, &padding);
v4l2_fill_mbus_format(&ffmt, f, fmt->mbus_code);
ffmt.width += padding.width;
ffmt.height += padding.height;
@@ -3865,6 +3867,12 @@ int atomisp_try_fmt(struct atomisp_device *isp,
struct v4l2_pix_format *f,
return -EINVAL;
}

+ if (fmt->sh_fmt == IA_CSS_FRAME_FORMAT_RAW &&
+ fmt->mbus_code != snr_fmt->mbus_code) {
+ fmt = snr_fmt;
+ f->pixelformat = fmt->pixelformat;
+ }
+
f->width = ffmt.width - padding.width;
f->height = ffmt.height - padding.height;

diff --git a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
index 87c29a940f9b..9ce529b0c7b3 100644
--- a/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
+++ b/drivers/staging/media/atomisp/pci/atomisp_ioctl.c
@@ -537,12 +537,17 @@ static int atomisp_enum_framesizes(struct file
*file, void *priv,
.which = V4L2_SUBDEV_FORMAT_ACTIVE,
.code = input->code,
};
+ const struct atomisp_format_bridge *format;
struct v4l2_subdev_state *act_sd_state;
int ret;

if (!input->sensor)
return -EINVAL;

+ format = atomisp_get_format_bridge(fsize->pixel_format);
+ if (!format)
+ return -EINVAL;
+
if (input->crop_support)
return atomisp_enum_framesizes_crop(isp, fsize);

@@ -555,8 +560,13 @@ static int atomisp_enum_framesizes(struct file
*file, void *priv,
return ret;

fsize->type = V4L2_FRMSIZE_TYPE_DISCRETE;
- fsize->discrete.width = fse.max_width - pad_w;
- fsize->discrete.height = fse.max_height - pad_h;
+ if (format->sh_fmt == IA_CSS_FRAME_FORMAT_RAW) {
+ fsize->discrete.width = fse.max_width;
+ fsize->discrete.height = fse.max_height;
+ } else {
+ fsize->discrete.width = fse.max_width - pad_w;
+ fsize->discrete.height = fse.max_height - pad_h;
+ }

return 0;
}
@@ -630,7 +640,8 @@ static int atomisp_enum_fmt_cap(struct file *file, void *fh,
*
* FIXME: fix the pipeline to allow sensor format too.
*/
- if (format->sh_fmt == IA_CSS_FRAME_FORMAT_RAW)
+ if (format->sh_fmt == IA_CSS_FRAME_FORMAT_RAW &&
+ format->mbus_code != code.code)
continue;

/* Found a match. Now let's pick f->index'th one. */
--
2.53.0



On Fri, 02 Oct 2026 01:15:55 -0700, mauriziocasciano7@xxxxxxxxx wrote:
> Add camera support for the Lenovo Yoga Book YB1-X91L. The tablet uses
> an AtomISP ISP2401 with an OV2740 front sensor, an OV8858 rear sensor
> and a WV517S rear-camera lens actuator.
>
> The series adds the missing ACPI and bridge configuration, selects the
> OV2740 link frequency through the existing IPU PCI-ID mechanism, derives
> AtomISP CSI-2 timing from the sensor link frequency, enables raw Bayer
> capture and adds the sensor controls and actuator driver needed by the
> hardware.
>
> Runtime validation used the same 15-patch content on the current
> media_stage.git master. The final media-committers.git next rebase changes
> only three source line wraps needed by the media 80-column check:
>
> - W=1 builds and sparse builds of all eight affected objects passed both
> before and after the rebase.
> - A full x86_64 Debian binary package build passed and produced kernel
> 7.3.0-rc1-yogabook-media-v8-20261002-001605.
> - The kernel booted on a Lenovo Yoga Book YB1-X91L with AtomISP PCI ID
> 8086:22b8. OV2740 negotiated 288 MHz and OV8858 negotiated 360 MHz;
> both sensors bound and AtomISP registered two cameras.
> - OV8858 digital, red and blue gains were changed during streaming and
> read back correctly. Continuous raw capture produced changing frames
> from both sensors (6/8 unique rear samples and 8/8 unique front
> samples), including front-to-rear-to-front switching without OV8858,
> I2C or CSI errors.
> - Both front and rear cameras were also exercised successfully with
> Cheese.
> - v4l2-compliance 1.32.0 completed 47 tests on the AtomISP capture node:
> 40 succeeded and 7 failed in invalid-ioctl, multiple-open, input,
> control enumeration, stream-parameter and buffer tests. These failures
> remain a validation limitation; this series does not claim to make the
> staging AtomISP driver fully compliant.
>
> Only the Yoga Book 19.2 MHz OV8858 path was hardware-tested; the existing
> 24 MHz paths received build and static-analysis coverage but were not
> tested on separate hardware.
>
> ---
> Changes in v8:
>
> - Keep patch 2's commit message focused on the implementation, remove the
> invalid review Link and move runtime results to this cover letter.
> - Express OV8858 frequencies with HZ_PER_MHZ/HZ_PER_KHZ, name clock
> tables by their input and link frequencies, and remove platform names
> from the sensor driver.
> - Explain that V4L2 exposes standard red and blue balance controls but no
> standard green-balance control, so green remains the unity reference.
> - Replace the per-sensor link-frequency override with the IPU bridge's
> existing PCI-ID matching mechanism. Add an 8086:22b8-specific OV2740
> 288 MHz entry before the generic 360 MHz fallback. This removes the
> associated AtomISP hand-off patch and reduces the series to 15 patches.
> - Add the introducing commit to the OV2740 group-hold fix and mark it for
> stable backporting.
> - Use the documented Assisted-by tag syntax.
> - Keep the padding helper as a normal static function and avoid a
> single-use raw-format descriptor structure.
> - Retain Andy's Reviewed-by tags only where the corresponding patches did
> not change materially. In particular, drop the tag from the redesigned
> IPU bridge frequency patch.
>
> v7: https://lore.kernel.org/linux-media/cover.1788360629.git.mauriziocasciano7@xxxxxxxxx/
>
> Maurizio Casciano (15):
> media: ov8858: Extract digital gain programming
> media: ov8858: support 19.2 MHz clock and manual white balance
> media: ov2740: Use C99 initializers for ACPI IDs
> media: ov2740: Add OVTI2740 ACPI ID
> media: ov8858: Add INT3477 ACPI ID
> media: intel: ipu-bridge: Add Yoga Book camera sensors
> media: atomisp: Add Yoga Book camera configuration
> media: ov2740: support 288 MHz link frequency
> media: intel: ipu-bridge: select OV2740 frequency by IPU ID
> media: atomisp: derive CSI-2 timing from sensor link frequency
> media: ov2740: release group hold after gain write errors
> media: ov2740: add manual white balance controls
> media: atomisp: Use struct v4l2_area for padding
> media: atomisp: allow raw Bayer capture
> media: i2c: Add WV517S lens actuator driver
>
> MAINTAINERS | 1 +
> drivers/media/i2c/Kconfig | 11 +
> drivers/media/i2c/Makefile | 1 +
> drivers/media/i2c/ov2740.c | 114 +++++++--
> drivers/media/i2c/ov8858.c | 221 ++++++++++++++----
> drivers/media/i2c/wv517s.c | 208 +++++++++++++++++
> drivers/media/pci/intel/ipu-bridge.c | 13 ++
> .../staging/media/atomisp/pci/atomisp_cmd.c | 81 ++++---
> .../staging/media/atomisp/pci/atomisp_cmd.h | 6 +-
> .../staging/media/atomisp/pci/atomisp_csi2.c | 20 +-
> .../media/atomisp/pci/atomisp_csi2_bridge.c | 19 +-
> .../staging/media/atomisp/pci/atomisp_ioctl.c | 32 ++-
> .../media/atomisp/pci/atomisp_subdev.c | 4 +-
> .../media/atomisp/pci/atomisp_subdev.h | 3 +-
> 14 files changed, 605 insertions(+), 129 deletions(-)
> create mode 100644 drivers/media/i2c/wv517s.c
>
>
> base-commit: 4a069a763e8a86821edac4159f7c59a20015631b
>
> With Best Regards,
> Maurizio Casciano
> --
> 2.53.0