1acf8d084SLoic Poulain // SPDX-License-Identifier: GPL-2.0 2acf8d084SLoic Poulain /* 3acf8d084SLoic Poulain * Qualcomm MSM Camera Subsystem - VFE (Video Front End) Module 340 (TFE) 4acf8d084SLoic Poulain * 5acf8d084SLoic Poulain * Copyright (c) 2025 Qualcomm Innovation Center, Inc. All rights reserved. 6acf8d084SLoic Poulain */ 7acf8d084SLoic Poulain 8acf8d084SLoic Poulain #include <linux/delay.h> 9*76d2d8f7SLoic Poulain #include <linux/bitfield.h> 10acf8d084SLoic Poulain #include <linux/interrupt.h> 11acf8d084SLoic Poulain #include <linux/io.h> 12acf8d084SLoic Poulain #include <linux/iopoll.h> 13acf8d084SLoic Poulain 14acf8d084SLoic Poulain #include "camss.h" 15acf8d084SLoic Poulain #include "camss-vfe.h" 16acf8d084SLoic Poulain 17acf8d084SLoic Poulain #define TFE_GLOBAL_RESET_CMD (0x014) 18acf8d084SLoic Poulain #define TFE_GLOBAL_RESET_CMD_CORE BIT(0) 19acf8d084SLoic Poulain 20acf8d084SLoic Poulain #define TFE_REG_UPDATE_CMD (0x02c) 21acf8d084SLoic Poulain 22acf8d084SLoic Poulain #define TFE_IRQ_CMD (0x030) 23acf8d084SLoic Poulain #define TFE_IRQ_CMD_CLEAR BIT(0) 24acf8d084SLoic Poulain #define TFE_IRQ_MASK_0 (0x034) 25acf8d084SLoic Poulain #define TFE_IRQ_MASK_0_RST_DONE BIT(0) 26acf8d084SLoic Poulain #define TFE_IRQ_MASK_0_BUS_WR BIT(1) 27acf8d084SLoic Poulain #define TFE_IRQ_MASK_1 (0x038) 28acf8d084SLoic Poulain #define TFE_IRQ_MASK_2 (0x03c) 29acf8d084SLoic Poulain #define TFE_IRQ_CLEAR_0 (0x040) 30acf8d084SLoic Poulain 31acf8d084SLoic Poulain #define TFE_IRQ_STATUS_0 (0x04c) 32acf8d084SLoic Poulain 33acf8d084SLoic Poulain #define BUS_REG(a) (0xa00 + (a)) 34acf8d084SLoic Poulain 35acf8d084SLoic Poulain #define TFE_BUS_IRQ_MASK_0 BUS_REG(0x18) 36acf8d084SLoic Poulain #define TFE_BUS_IRQ_MASK_RUP_DONE_MASK GENMASK(3, 0) 37acf8d084SLoic Poulain #define TFE_BUS_IRQ_MASK_RUP_DONE(sc) FIELD_PREP(TFE_BUS_IRQ_MASK_RUP_DONE_MASK, BIT(sc)) 38acf8d084SLoic Poulain #define TFE_BUS_IRQ_MASK_BUF_DONE_MASK GENMASK(15, 8) 39acf8d084SLoic Poulain #define TFE_BUS_IRQ_MASK_BUF_DONE(sg) FIELD_PREP(TFE_BUS_IRQ_MASK_BUF_DONE_MASK, BIT(sg)) 40acf8d084SLoic Poulain #define TFE_BUS_IRQ_MASK_0_CONS_VIOL BIT(28) 41acf8d084SLoic Poulain #define TFE_BUS_IRQ_MASK_0_VIOL BIT(30) 42acf8d084SLoic Poulain #define TFE_BUS_IRQ_MASK_0_IMG_VIOL BIT(31) 43acf8d084SLoic Poulain 44acf8d084SLoic Poulain #define TFE_BUS_IRQ_MASK_1 BUS_REG(0x1c) 45acf8d084SLoic Poulain #define TFE_BUS_IRQ_CLEAR_0 BUS_REG(0x20) 46acf8d084SLoic Poulain #define TFE_BUS_IRQ_STATUS_0 BUS_REG(0x28) 47acf8d084SLoic Poulain #define TFE_BUS_IRQ_CMD BUS_REG(0x30) 48acf8d084SLoic Poulain #define TFE_BUS_IRQ_CMD_CLEAR BIT(0) 49acf8d084SLoic Poulain 50acf8d084SLoic Poulain #define TFE_BUS_STATUS_CLEAR BUS_REG(0x60) 51acf8d084SLoic Poulain #define TFE_BUS_VIOLATION_STATUS BUS_REG(0x64) 52acf8d084SLoic Poulain #define TFE_BUS_OVERFLOW_STATUS BUS_REG(0x68) 53acf8d084SLoic Poulain #define TFE_BUS_IMAGE_SZ_VIOLATION_STATUS BUS_REG(0x70) 54acf8d084SLoic Poulain 55acf8d084SLoic Poulain #define TFE_BUS_CLIENT_CFG(c) BUS_REG(0x200 + (c) * 0x100) 56acf8d084SLoic Poulain #define TFE_BUS_CLIENT_CFG_EN BIT(0) 57acf8d084SLoic Poulain #define TFE_BUS_CLIENT_CFG_MODE_FRAME BIT(16) 58acf8d084SLoic Poulain #define TFE_BUS_IMAGE_ADDR(c) BUS_REG(0x204 + (c) * 0x100) 59acf8d084SLoic Poulain #define TFE_BUS_FRAME_INCR(c) BUS_REG(0x208 + (c) * 0x100) 60acf8d084SLoic Poulain #define TFE_BUS_IMAGE_CFG_0(c) BUS_REG(0x20c + (c) * 0x100) 61acf8d084SLoic Poulain #define TFE_BUS_IMAGE_CFG_0_DEFAULT 0xffff 62acf8d084SLoic Poulain #define TFE_BUS_IMAGE_CFG_1(c) BUS_REG(0x210 + (c) * 0x100) 63acf8d084SLoic Poulain #define TFE_BUS_IMAGE_CFG_2(c) BUS_REG(0x214 + (c) * 0x100) 64acf8d084SLoic Poulain #define TFE_BUS_IMAGE_CFG_2_DEFAULT 0xffff 65acf8d084SLoic Poulain #define TFE_BUS_PACKER_CFG(c) BUS_REG(0x218 + (c) * 0x100) 66acf8d084SLoic Poulain #define TFE_BUS_PACKER_CFG_FMT_PLAIN64 0xa 67acf8d084SLoic Poulain #define TFE_BUS_IRQ_SUBSAMPLE_CFG_0(c) BUS_REG(0x230 + (c) * 0x100) 68acf8d084SLoic Poulain #define TFE_BUS_IRQ_SUBSAMPLE_CFG_1(c) BUS_REG(0x234 + (c) * 0x100) 69acf8d084SLoic Poulain #define TFE_BUS_FRAMEDROP_CFG_0(c) BUS_REG(0x238 + (c) * 0x100) 70acf8d084SLoic Poulain #define TFE_BUS_FRAMEDROP_CFG_1(c) BUS_REG(0x23c + (c) * 0x100) 71acf8d084SLoic Poulain 72acf8d084SLoic Poulain /* 73acf8d084SLoic Poulain * TODO: differentiate the port id based on requested type of RDI, BHIST etc 74acf8d084SLoic Poulain * 75acf8d084SLoic Poulain * TFE write master IDs (clients) 76acf8d084SLoic Poulain * 77acf8d084SLoic Poulain * BAYER 0 78acf8d084SLoic Poulain * IDEAL_RAW 1 79acf8d084SLoic Poulain * STATS_TINTLESS_BG 2 80acf8d084SLoic Poulain * STATS_BHIST 3 81acf8d084SLoic Poulain * STATS_AWB_BG 4 82acf8d084SLoic Poulain * STATS_AEC_BG 5 83acf8d084SLoic Poulain * STATS_BAF 6 84acf8d084SLoic Poulain * RDI0 7 85acf8d084SLoic Poulain * RDI1 8 86acf8d084SLoic Poulain * RDI2 9 87acf8d084SLoic Poulain */ 88acf8d084SLoic Poulain #define RDI_WM(n) (7 + (n)) 89acf8d084SLoic Poulain #define TFE_WM_NUM 10 90acf8d084SLoic Poulain 91acf8d084SLoic Poulain enum tfe_iface { 92acf8d084SLoic Poulain TFE_IFACE_PIX, 93acf8d084SLoic Poulain TFE_IFACE_RDI0, 94acf8d084SLoic Poulain TFE_IFACE_RDI1, 95acf8d084SLoic Poulain TFE_IFACE_RDI2, 96acf8d084SLoic Poulain TFE_IFACE_NUM 97acf8d084SLoic Poulain }; 98acf8d084SLoic Poulain 99acf8d084SLoic Poulain enum tfe_subgroups { 100acf8d084SLoic Poulain TFE_SUBGROUP_BAYER, 101acf8d084SLoic Poulain TFE_SUBGROUP_IDEAL_RAW, 102acf8d084SLoic Poulain TFE_SUBGROUP_HDR, 103acf8d084SLoic Poulain TFE_SUBGROUP_BG, 104acf8d084SLoic Poulain TFE_SUBGROUP_BAF, 105acf8d084SLoic Poulain TFE_SUBGROUP_RDI0, 106acf8d084SLoic Poulain TFE_SUBGROUP_RDI1, 107acf8d084SLoic Poulain TFE_SUBGROUP_RDI2, 108acf8d084SLoic Poulain TFE_SUBGROUP_NUM 109acf8d084SLoic Poulain }; 110acf8d084SLoic Poulain 111acf8d084SLoic Poulain static enum tfe_iface tfe_line_iface_map[VFE_LINE_NUM_MAX] = { 112acf8d084SLoic Poulain [VFE_LINE_RDI0] = TFE_IFACE_RDI0, 113acf8d084SLoic Poulain [VFE_LINE_RDI1] = TFE_IFACE_RDI1, 114acf8d084SLoic Poulain [VFE_LINE_RDI2] = TFE_IFACE_RDI2, 115acf8d084SLoic Poulain [VFE_LINE_PIX] = TFE_IFACE_PIX, 116acf8d084SLoic Poulain }; 117acf8d084SLoic Poulain 118acf8d084SLoic Poulain static enum vfe_line_id tfe_subgroup_line_map[TFE_SUBGROUP_NUM] = { 119acf8d084SLoic Poulain [TFE_SUBGROUP_BAYER] = VFE_LINE_PIX, 120acf8d084SLoic Poulain [TFE_SUBGROUP_IDEAL_RAW] = VFE_LINE_PIX, 121acf8d084SLoic Poulain [TFE_SUBGROUP_HDR] = VFE_LINE_PIX, 122acf8d084SLoic Poulain [TFE_SUBGROUP_BG] = VFE_LINE_PIX, 123acf8d084SLoic Poulain [TFE_SUBGROUP_BAF] = VFE_LINE_PIX, 124acf8d084SLoic Poulain [TFE_SUBGROUP_RDI0] = VFE_LINE_RDI0, 125acf8d084SLoic Poulain [TFE_SUBGROUP_RDI1] = VFE_LINE_RDI1, 126acf8d084SLoic Poulain [TFE_SUBGROUP_RDI2] = VFE_LINE_RDI2, 127acf8d084SLoic Poulain }; 128acf8d084SLoic Poulain 129acf8d084SLoic Poulain static inline enum tfe_iface __line_to_iface(enum vfe_line_id line_id) 130acf8d084SLoic Poulain { 131acf8d084SLoic Poulain if (line_id <= VFE_LINE_NONE || line_id >= VFE_LINE_NUM_MAX) { 132acf8d084SLoic Poulain pr_warn("VFE: Invalid line %d\n", line_id); 133acf8d084SLoic Poulain return TFE_IFACE_RDI0; 134acf8d084SLoic Poulain } 135acf8d084SLoic Poulain 136acf8d084SLoic Poulain return tfe_line_iface_map[line_id]; 137acf8d084SLoic Poulain } 138acf8d084SLoic Poulain 139acf8d084SLoic Poulain static inline enum vfe_line_id __iface_to_line(unsigned int iface) 140acf8d084SLoic Poulain { 141acf8d084SLoic Poulain int i; 142acf8d084SLoic Poulain 143acf8d084SLoic Poulain for (i = 0; i < VFE_LINE_NUM_MAX; i++) { 144acf8d084SLoic Poulain if (tfe_line_iface_map[i] == iface) 145acf8d084SLoic Poulain return i; 146acf8d084SLoic Poulain } 147acf8d084SLoic Poulain 148acf8d084SLoic Poulain return VFE_LINE_NONE; 149acf8d084SLoic Poulain } 150acf8d084SLoic Poulain 151acf8d084SLoic Poulain static inline enum vfe_line_id __subgroup_to_line(enum tfe_subgroups sg) 152acf8d084SLoic Poulain { 153acf8d084SLoic Poulain if (sg >= TFE_SUBGROUP_NUM) 154acf8d084SLoic Poulain return VFE_LINE_NONE; 155acf8d084SLoic Poulain 156acf8d084SLoic Poulain return tfe_subgroup_line_map[sg]; 157acf8d084SLoic Poulain } 158acf8d084SLoic Poulain 159acf8d084SLoic Poulain static void vfe_global_reset(struct vfe_device *vfe) 160acf8d084SLoic Poulain { 161acf8d084SLoic Poulain writel(TFE_IRQ_MASK_0_RST_DONE, vfe->base + TFE_IRQ_MASK_0); 162acf8d084SLoic Poulain writel(TFE_GLOBAL_RESET_CMD_CORE, vfe->base + TFE_GLOBAL_RESET_CMD); 163acf8d084SLoic Poulain } 164acf8d084SLoic Poulain 165acf8d084SLoic Poulain static irqreturn_t vfe_isr(int irq, void *dev) 166acf8d084SLoic Poulain { 167acf8d084SLoic Poulain struct vfe_device *vfe = dev; 168acf8d084SLoic Poulain u32 status; 169acf8d084SLoic Poulain int i; 170acf8d084SLoic Poulain 171acf8d084SLoic Poulain status = readl_relaxed(vfe->base + TFE_IRQ_STATUS_0); 172acf8d084SLoic Poulain writel_relaxed(status, vfe->base + TFE_IRQ_CLEAR_0); 173acf8d084SLoic Poulain writel_relaxed(TFE_IRQ_CMD_CLEAR, vfe->base + TFE_IRQ_CMD); 174acf8d084SLoic Poulain 175acf8d084SLoic Poulain if (status & TFE_IRQ_MASK_0_RST_DONE) { 176acf8d084SLoic Poulain dev_dbg(vfe->camss->dev, "VFE%u: Reset done!", vfe->id); 177acf8d084SLoic Poulain vfe_isr_reset_ack(vfe); 178acf8d084SLoic Poulain } 179acf8d084SLoic Poulain 180acf8d084SLoic Poulain if (status & TFE_IRQ_MASK_0_BUS_WR) { 181acf8d084SLoic Poulain u32 bus_status = readl_relaxed(vfe->base + TFE_BUS_IRQ_STATUS_0); 182acf8d084SLoic Poulain 183acf8d084SLoic Poulain writel_relaxed(bus_status, vfe->base + TFE_BUS_IRQ_CLEAR_0); 184acf8d084SLoic Poulain writel_relaxed(TFE_BUS_IRQ_CMD_CLEAR, vfe->base + TFE_BUS_IRQ_CMD); 185acf8d084SLoic Poulain 186acf8d084SLoic Poulain for (i = 0; i < TFE_IFACE_NUM; i++) { 187acf8d084SLoic Poulain if (bus_status & TFE_BUS_IRQ_MASK_RUP_DONE(i)) 188acf8d084SLoic Poulain vfe->res->hw_ops->reg_update_clear(vfe, __iface_to_line(i)); 189acf8d084SLoic Poulain } 190acf8d084SLoic Poulain 191acf8d084SLoic Poulain for (i = 0; i < TFE_SUBGROUP_NUM; i++) { 192acf8d084SLoic Poulain if (bus_status & TFE_BUS_IRQ_MASK_BUF_DONE(i)) 193acf8d084SLoic Poulain vfe_buf_done(vfe, __subgroup_to_line(i)); 194acf8d084SLoic Poulain } 195acf8d084SLoic Poulain 196acf8d084SLoic Poulain if (bus_status & TFE_BUS_IRQ_MASK_0_CONS_VIOL) 197acf8d084SLoic Poulain dev_err_ratelimited(vfe->camss->dev, "VFE%u: Bad config violation", 198acf8d084SLoic Poulain vfe->id); 199acf8d084SLoic Poulain 200acf8d084SLoic Poulain if (bus_status & TFE_BUS_IRQ_MASK_0_VIOL) 201acf8d084SLoic Poulain dev_err_ratelimited(vfe->camss->dev, "VFE%u: Input data violation", 202acf8d084SLoic Poulain vfe->id); 203acf8d084SLoic Poulain 204acf8d084SLoic Poulain if (bus_status & TFE_BUS_IRQ_MASK_0_IMG_VIOL) 205acf8d084SLoic Poulain dev_err_ratelimited(vfe->camss->dev, "VFE%u: Image size violation", 206acf8d084SLoic Poulain vfe->id); 207acf8d084SLoic Poulain } 208acf8d084SLoic Poulain 209acf8d084SLoic Poulain status = readl_relaxed(vfe->base + TFE_BUS_OVERFLOW_STATUS); 210acf8d084SLoic Poulain if (status) { 211acf8d084SLoic Poulain writel_relaxed(status, vfe->base + TFE_BUS_STATUS_CLEAR); 212acf8d084SLoic Poulain for (i = 0; i < TFE_WM_NUM; i++) { 213acf8d084SLoic Poulain if (status & BIT(i)) 214acf8d084SLoic Poulain dev_err_ratelimited(vfe->camss->dev, 215acf8d084SLoic Poulain "VFE%u: bus overflow for wm %u\n", 216acf8d084SLoic Poulain vfe->id, i); 217acf8d084SLoic Poulain } 218acf8d084SLoic Poulain } 219acf8d084SLoic Poulain 220acf8d084SLoic Poulain return IRQ_HANDLED; 221acf8d084SLoic Poulain } 222acf8d084SLoic Poulain 223acf8d084SLoic Poulain static int vfe_halt(struct vfe_device *vfe) 224acf8d084SLoic Poulain { 225acf8d084SLoic Poulain /* rely on vfe_disable_output() to stop the VFE */ 226acf8d084SLoic Poulain return 0; 227acf8d084SLoic Poulain } 228acf8d084SLoic Poulain 229acf8d084SLoic Poulain static void vfe_enable_irq(struct vfe_device *vfe) 230acf8d084SLoic Poulain { 231acf8d084SLoic Poulain writel(TFE_IRQ_MASK_0_RST_DONE | TFE_IRQ_MASK_0_BUS_WR, 232acf8d084SLoic Poulain vfe->base + TFE_IRQ_MASK_0); 233acf8d084SLoic Poulain writel(TFE_BUS_IRQ_MASK_RUP_DONE_MASK | TFE_BUS_IRQ_MASK_BUF_DONE_MASK | 234acf8d084SLoic Poulain TFE_BUS_IRQ_MASK_0_CONS_VIOL | TFE_BUS_IRQ_MASK_0_VIOL | 235acf8d084SLoic Poulain TFE_BUS_IRQ_MASK_0_IMG_VIOL, vfe->base + TFE_BUS_IRQ_MASK_0); 236acf8d084SLoic Poulain } 237acf8d084SLoic Poulain 238acf8d084SLoic Poulain static void vfe_wm_update(struct vfe_device *vfe, u8 rdi, u32 addr, 239acf8d084SLoic Poulain struct vfe_line *line) 240acf8d084SLoic Poulain { 241acf8d084SLoic Poulain u8 wm = RDI_WM(rdi); 242acf8d084SLoic Poulain 243acf8d084SLoic Poulain writel_relaxed(addr, vfe->base + TFE_BUS_IMAGE_ADDR(wm)); 244acf8d084SLoic Poulain } 245acf8d084SLoic Poulain 246acf8d084SLoic Poulain static void vfe_wm_start(struct vfe_device *vfe, u8 rdi, struct vfe_line *line) 247acf8d084SLoic Poulain { 248acf8d084SLoic Poulain struct v4l2_pix_format_mplane *pix = &line->video_out.active_fmt.fmt.pix_mp; 249acf8d084SLoic Poulain u32 stride = pix->plane_fmt[0].bytesperline; 250acf8d084SLoic Poulain u8 wm = RDI_WM(rdi); 251acf8d084SLoic Poulain 252acf8d084SLoic Poulain /* Configuration for plain RDI frames */ 253acf8d084SLoic Poulain writel_relaxed(TFE_BUS_IMAGE_CFG_0_DEFAULT, vfe->base + TFE_BUS_IMAGE_CFG_0(wm)); 254acf8d084SLoic Poulain writel_relaxed(0u, vfe->base + TFE_BUS_IMAGE_CFG_1(wm)); 255acf8d084SLoic Poulain writel_relaxed(TFE_BUS_IMAGE_CFG_2_DEFAULT, vfe->base + TFE_BUS_IMAGE_CFG_2(wm)); 256acf8d084SLoic Poulain writel_relaxed(stride * pix->height, vfe->base + TFE_BUS_FRAME_INCR(wm)); 257acf8d084SLoic Poulain writel_relaxed(TFE_BUS_PACKER_CFG_FMT_PLAIN64, vfe->base + TFE_BUS_PACKER_CFG(wm)); 258acf8d084SLoic Poulain 259acf8d084SLoic Poulain /* No dropped frames, one irq per frame */ 260acf8d084SLoic Poulain writel_relaxed(0, vfe->base + TFE_BUS_FRAMEDROP_CFG_0(wm)); 261acf8d084SLoic Poulain writel_relaxed(1, vfe->base + TFE_BUS_FRAMEDROP_CFG_1(wm)); 262acf8d084SLoic Poulain writel_relaxed(0, vfe->base + TFE_BUS_IRQ_SUBSAMPLE_CFG_0(wm)); 263acf8d084SLoic Poulain writel_relaxed(1, vfe->base + TFE_BUS_IRQ_SUBSAMPLE_CFG_1(wm)); 264acf8d084SLoic Poulain 265acf8d084SLoic Poulain vfe_enable_irq(vfe); 266acf8d084SLoic Poulain 267acf8d084SLoic Poulain writel(TFE_BUS_CLIENT_CFG_EN | TFE_BUS_CLIENT_CFG_MODE_FRAME, 268acf8d084SLoic Poulain vfe->base + TFE_BUS_CLIENT_CFG(wm)); 269acf8d084SLoic Poulain 270acf8d084SLoic Poulain dev_dbg(vfe->camss->dev, "VFE%u: Started RDI%u width %u height %u stride %u\n", 271acf8d084SLoic Poulain vfe->id, rdi, pix->width, pix->height, stride); 272acf8d084SLoic Poulain } 273acf8d084SLoic Poulain 274acf8d084SLoic Poulain static void vfe_wm_stop(struct vfe_device *vfe, u8 rdi) 275acf8d084SLoic Poulain { 276acf8d084SLoic Poulain u8 wm = RDI_WM(rdi); 277acf8d084SLoic Poulain 278acf8d084SLoic Poulain writel(0, vfe->base + TFE_BUS_CLIENT_CFG(wm)); 279acf8d084SLoic Poulain 280acf8d084SLoic Poulain dev_dbg(vfe->camss->dev, "VFE%u: Stopped RDI%u\n", vfe->id, rdi); 281acf8d084SLoic Poulain } 282acf8d084SLoic Poulain 283acf8d084SLoic Poulain static const struct camss_video_ops vfe_video_ops_520 = { 284acf8d084SLoic Poulain .queue_buffer = vfe_queue_buffer_v2, 285acf8d084SLoic Poulain .flush_buffers = vfe_flush_buffers, 286acf8d084SLoic Poulain }; 287acf8d084SLoic Poulain 288acf8d084SLoic Poulain static void vfe_subdev_init(struct device *dev, struct vfe_device *vfe) 289acf8d084SLoic Poulain { 290acf8d084SLoic Poulain vfe->video_ops = vfe_video_ops_520; 291acf8d084SLoic Poulain } 292acf8d084SLoic Poulain 293acf8d084SLoic Poulain static void vfe_reg_update(struct vfe_device *vfe, enum vfe_line_id line_id) 294acf8d084SLoic Poulain { 295acf8d084SLoic Poulain vfe->reg_update |= BIT(__line_to_iface(line_id)); 296acf8d084SLoic Poulain writel_relaxed(vfe->reg_update, vfe->base + TFE_REG_UPDATE_CMD); 297acf8d084SLoic Poulain } 298acf8d084SLoic Poulain 299acf8d084SLoic Poulain static void vfe_reg_update_clear(struct vfe_device *vfe, enum vfe_line_id line_id) 300acf8d084SLoic Poulain { 301acf8d084SLoic Poulain vfe->reg_update &= ~BIT(__line_to_iface(line_id)); 302acf8d084SLoic Poulain } 303acf8d084SLoic Poulain 304acf8d084SLoic Poulain const struct vfe_hw_ops vfe_ops_340 = { 305acf8d084SLoic Poulain .global_reset = vfe_global_reset, 306acf8d084SLoic Poulain .hw_version = vfe_hw_version, 307acf8d084SLoic Poulain .isr = vfe_isr, 308acf8d084SLoic Poulain .pm_domain_off = vfe_pm_domain_off, 309acf8d084SLoic Poulain .pm_domain_on = vfe_pm_domain_on, 310acf8d084SLoic Poulain .subdev_init = vfe_subdev_init, 311acf8d084SLoic Poulain .vfe_disable = vfe_disable, 312acf8d084SLoic Poulain .vfe_enable = vfe_enable_v2, 313acf8d084SLoic Poulain .vfe_halt = vfe_halt, 314acf8d084SLoic Poulain .vfe_wm_start = vfe_wm_start, 315acf8d084SLoic Poulain .vfe_wm_stop = vfe_wm_stop, 316acf8d084SLoic Poulain .vfe_buf_done = vfe_buf_done, 317acf8d084SLoic Poulain .vfe_wm_update = vfe_wm_update, 318acf8d084SLoic Poulain .reg_update = vfe_reg_update, 319acf8d084SLoic Poulain .reg_update_clear = vfe_reg_update_clear, 320acf8d084SLoic Poulain }; 321