{"id":2220301,"url":"http://patchwork.ozlabs.org/api/1.1/patches/2220301/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-gpio/patch/20260406-gmsl2-3_serdes-v10-20-645560fedca5@analog.com/","project":{"id":42,"url":"http://patchwork.ozlabs.org/api/1.1/projects/42/?format=json","name":"Linux GPIO development","link_name":"linux-gpio","list_id":"linux-gpio.vger.kernel.org","list_email":"linux-gpio@vger.kernel.org","web_url":"","scm_url":"","webscm_url":""},"msgid":"<20260406-gmsl2-3_serdes-v10-20-645560fedca5@analog.com>","date":"2026-04-06T20:14:59","name":"[v10,20/22] staging: media: remove MAX96712 driver","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"0f88050d68229031dfc380cd4873eff5b2dba893","submitter":{"id":88270,"url":"http://patchwork.ozlabs.org/api/1.1/people/88270/?format=json","name":"Dumitru Ceclan via B4 Relay","email":"devnull+dumitru.ceclan.analog.com@kernel.org"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/linux-gpio/patch/20260406-gmsl2-3_serdes-v10-20-645560fedca5@analog.com/mbox/","series":[{"id":498894,"url":"http://patchwork.ozlabs.org/api/1.1/series/498894/?format=json","web_url":"http://patchwork.ozlabs.org/project/linux-gpio/list/?series=498894","date":"2026-04-06T20:14:42","name":"media: i2c: add Maxim GMSL2/3 serializer and deserializer drivers","version":10,"mbox":"http://patchwork.ozlabs.org/series/498894/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2220301/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2220301/checks/","tags":{},"headers":{"Return-Path":"\n <linux-gpio+bounces-34740-incoming=patchwork.ozlabs.org@vger.kernel.org>","X-Original-To":["incoming@patchwork.ozlabs.org","linux-gpio@vger.kernel.org"],"Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=kernel.org header.i=@kernel.org header.a=rsa-sha256\n header.s=k20201202 header.b=sMcPZmcI;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=vger.kernel.org\n (client-ip=2600:3c04:e001:36c::12fc:5321; helo=tor.lore.kernel.org;\n envelope-from=linux-gpio+bounces-34740-incoming=patchwork.ozlabs.org@vger.kernel.org;\n receiver=patchwork.ozlabs.org)","smtp.subspace.kernel.org;\n\tdkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=\"sMcPZmcI\"","smtp.subspace.kernel.org;\n arc=none smtp.client-ip=10.30.226.201"],"Received":["from tor.lore.kernel.org (tor.lore.kernel.org\n [IPv6:2600:3c04:e001:36c::12fc:5321])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fqLLC1rHXz1yGn\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 07 Apr 2026 06:20:35 +1000 (AEST)","from smtp.subspace.kernel.org (conduit.subspace.kernel.org\n [100.90.174.1])\n\tby tor.lore.kernel.org (Postfix) with ESMTP id 8A6EE30532B3\n\tfor <incoming@patchwork.ozlabs.org>; Mon,  6 Apr 2026 20:16:17 +0000 (UTC)","from localhost.localdomain (localhost.localdomain [127.0.0.1])\n\tby smtp.subspace.kernel.org (Postfix) with ESMTP id 20A6C3A451B;\n\tMon,  6 Apr 2026 20:15:24 +0000 (UTC)","from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org\n [10.30.226.201])\n\t(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby smtp.subspace.kernel.org (Postfix) with ESMTPS id EB4E73A1693;\n\tMon,  6 Apr 2026 20:15:22 +0000 (UTC)","by smtp.kernel.org (Postfix) with ESMTPS id CD8A1C2BCAF;\n\tMon,  6 Apr 2026 20:15:22 +0000 (UTC)","from aws-us-west-2-korg-lkml-1.web.codeaurora.org\n (localhost.localdomain [127.0.0.1])\n\tby smtp.lore.kernel.org (Postfix) with ESMTP id C5384FB5160;\n\tMon,  6 Apr 2026 20:15:22 +0000 (UTC)"],"ARC-Seal":"i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;\n\tt=1775506523; cv=none;\n b=FCdKBdOeZbPuSFW21WYFzxuam+IKSGVhTkJxxxnMPKn2isCoPjAobvThgeyA4rnBgH1mlpZTfeL84Js6tRQbpEIDuMYemc7kVAkMh9gW47GIN9lujN+uobBxv+QBJrkoPUwj4rRoFUvg1CM+ElB92r173rqM7OGq7+CJMmV4zy4=","ARC-Message-Signature":"i=1; a=rsa-sha256; d=subspace.kernel.org;\n\ts=arc-20240116; t=1775506523; c=relaxed/simple;\n\tbh=q8JdSlz/sGOHHt/Ac+w9APfy6Cj45+wRXOnIUl4w6a4=;\n\th=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References:\n\t In-Reply-To:To:Cc;\n b=qWE8XKS1KPFSsXH2Apir42CbgYSaGS25aBRzG+MV3Pvn2VrWMWtROzHSe9vVHZlt739/EGORSebMJj6BQ9EWRapNsrfI7OXaRTZecGtt0Cd85DedH3WG4A0wvxPXKLafVPmkkMcWgGT/ztYRXNvVIWWH8vgoSffa9N33XR2+Res=","ARC-Authentication-Results":"i=1; smtp.subspace.kernel.org;\n dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org\n header.b=sMcPZmcI; arc=none smtp.client-ip=10.30.226.201","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;\n\ts=k20201202; t=1775506522;\n\tbh=q8JdSlz/sGOHHt/Ac+w9APfy6Cj45+wRXOnIUl4w6a4=;\n\th=From:Date:Subject:References:In-Reply-To:To:Cc:Reply-To:From;\n\tb=sMcPZmcI23Pi7YJNUx/Y3ZWg1/zYpl7Sza06ZKVK1yYCEsVjbfUret7CAPwVsXPFi\n\t Q9a2XZQLTfriSlHGc8Oj13WPVchRHgxeX7b/sulsxAWK4v4cmGxo/R5YcQ1UIAG8A2\n\t k1N4VNZgSpsaTDS1ie3hhdjTyKuEWak6ia59GLKdQsZszdUWPgBeFk74xFydJOaq+e\n\t MUudIarYeCokkfIurpeuO/qcwCuHY83NvF2mYOGEv2f4OcWFw5DTTHVXkwqXqB0XDz\n\t /7oL2uzBQA9XjqSSHImKH9TpvG1EzfSCnhh7ckFfEy097Ln/QbW6xfCKMhVAtssv/g\n\t mBWJXtDDO/4Aw==","From":"Dumitru Ceclan via B4 Relay\n <devnull+dumitru.ceclan.analog.com@kernel.org>","Date":"Mon, 06 Apr 2026 23:14:59 +0300","Subject":"[PATCH v10 20/22] staging: media: remove MAX96712 driver","Precedence":"bulk","X-Mailing-List":"linux-gpio@vger.kernel.org","List-Id":"<linux-gpio.vger.kernel.org>","List-Subscribe":"<mailto:linux-gpio+subscribe@vger.kernel.org>","List-Unsubscribe":"<mailto:linux-gpio+unsubscribe@vger.kernel.org>","MIME-Version":"1.0","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"8bit","Message-Id":"<20260406-gmsl2-3_serdes-v10-20-645560fedca5@analog.com>","References":"<20260406-gmsl2-3_serdes-v10-0-645560fedca5@analog.com>","In-Reply-To":"<20260406-gmsl2-3_serdes-v10-0-645560fedca5@analog.com>","To":"Tomi Valkeinen <tomi.valkeinen+renesas@ideasonboard.com>,\n  Mauro Carvalho Chehab <mchehab@kernel.org>,\n  Sakari Ailus <sakari.ailus@linux.intel.com>,\n  Laurent Pinchart <laurent.pinchart@ideasonboard.com>,\n  Julien Massot <julien.massot@collabora.com>, Rob Herring <robh@kernel.org>,\n\t=?utf-8?q?Niklas_S=C3=B6derlund?= <niklas.soderlund@ragnatech.se>,\n  Greg Kroah-Hartman <gregkh@linuxfoundation.org>,\n  Cosmin Tanislav <cosmin.tanislav@analog.com>","Cc":"mitrutzceclan@gmail.com, linux-media@vger.kernel.org,\n  linux-kernel@vger.kernel.org, devicetree@vger.kernel.org,\n  linux-staging@lists.linux.dev, linux-gpio@vger.kernel.org, =?utf-8?q?Nikla?=\n\t=?utf-8?q?s_S=C3=B6derlund?= <niklas.soderlund+renesas@ragnatech.se>,\n  Martin Hecht <Martin.Hecht@avnet.eu>,\n  Cosmin Tanislav <demonsingur@gmail.com>","X-Mailer":"b4 0.14.3","X-Developer-Signature":"v=1; a=ed25519-sha256; t=1775506518; l=16827;\n i=dumitru.ceclan@analog.com; s=20240313; h=from:subject:message-id;\n bh=hGO+PFOPKRq4ydzuhZArk6kb/8QBEn07ZGO1bLJT/R0=;\n b=4OlFyXVh84UZNvS4rs8wzKFB3nEDisJqNuJqBUTrgVxynvwqW8XWjJ4ZQfK/FPepWTKEtEOcp\n CZfrL4YPk1DBFjXOZkHp7UHNbhFQxZG8QuANTfO0NM2HAuQ4vHz7++b","X-Developer-Key":"i=dumitru.ceclan@analog.com; a=ed25519;\n pk=HdqMlVyrcazwoiai7oN6ghU+Bj1pusGUFRl30jhS7Bo=","X-Endpoint-Received":"by B4 Relay for dumitru.ceclan@analog.com/20240313\n with auth_id=140","X-Original-From":"Dumitru Ceclan <dumitru.ceclan@analog.com>","Reply-To":"dumitru.ceclan@analog.com"},"content":"From: Cosmin Tanislav <demonsingur@gmail.com>\n\nRemove the staging MAX96712 driver.\nIts functionality has been moved to the MAX96724 driver which makes use\nof the Maxim GMSL2/3 deserializer framework.\n\nSigned-off-by: Cosmin Tanislav <demonsingur@gmail.com>\nAcked-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>\n---\n MAINTAINERS                               |   1 -\n drivers/staging/media/Kconfig             |   2 -\n drivers/staging/media/Makefile            |   1 -\n drivers/staging/media/max96712/Kconfig    |  14 -\n drivers/staging/media/max96712/Makefile   |   2 -\n drivers/staging/media/max96712/max96712.c | 487 ------------------------------\n 6 files changed, 507 deletions(-)","diff":"diff --git a/MAINTAINERS b/MAINTAINERS\nindex 70d3eeef8bfe..6a6a04ce2787 100644\n--- a/MAINTAINERS\n+++ b/MAINTAINERS\n@@ -15222,7 +15222,6 @@ M:\tNiklas Söderlund <niklas.soderlund@ragnatech.se>\n L:\tlinux-media@vger.kernel.org\n S:\tMaintained\n F:\tDocumentation/devicetree/bindings/media/i2c/maxim,max96712.yaml\n-F:\tdrivers/staging/media/max96712/max96712.c\n \n MAX96714 GMSL2 DESERIALIZER DRIVER\n M:\tJulien Massot <julien.massot@collabora.com>\ndiff --git a/drivers/staging/media/Kconfig b/drivers/staging/media/Kconfig\nindex ab250c89cd4d..edcec810433d 100644\n--- a/drivers/staging/media/Kconfig\n+++ b/drivers/staging/media/Kconfig\n@@ -30,8 +30,6 @@ source \"drivers/staging/media/ipu3/Kconfig\"\n \n source \"drivers/staging/media/ipu7/Kconfig\"\n \n-source \"drivers/staging/media/max96712/Kconfig\"\n-\n source \"drivers/staging/media/meson/vdec/Kconfig\"\n \n source \"drivers/staging/media/starfive/Kconfig\"\ndiff --git a/drivers/staging/media/Makefile b/drivers/staging/media/Makefile\nindex 4a073938b2b2..e38421c81d0e 100644\n--- a/drivers/staging/media/Makefile\n+++ b/drivers/staging/media/Makefile\n@@ -2,7 +2,6 @@\n obj-$(CONFIG_VIDEO_ATMEL_ISC_BASE)\t+= deprecated/atmel/\n obj-$(CONFIG_INTEL_ATOMISP)     += atomisp/\n obj-$(CONFIG_VIDEO_IMX_MEDIA)\t+= imx/\n-obj-$(CONFIG_VIDEO_MAX96712)\t+= max96712/\n obj-$(CONFIG_VIDEO_MESON_VDEC)\t+= meson/vdec/\n obj-$(CONFIG_VIDEO_STARFIVE_CAMSS)\t+= starfive/\n obj-$(CONFIG_VIDEO_SUNXI)\t+= sunxi/\ndiff --git a/drivers/staging/media/max96712/Kconfig b/drivers/staging/media/max96712/Kconfig\ndeleted file mode 100644\nindex 117fadf81bd0..000000000000\n--- a/drivers/staging/media/max96712/Kconfig\n+++ /dev/null\n@@ -1,14 +0,0 @@\n-# SPDX-License-Identifier: GPL-2.0\n-config VIDEO_MAX96712\n-\ttristate \"Maxim MAX96712 Quad GMSL2 Deserializer support\"\n-\tdepends on I2C\n-\tdepends on OF_GPIO\n-\tdepends on VIDEO_DEV\n-\tselect V4L2_FWNODE\n-\tselect VIDEO_V4L2_SUBDEV_API\n-\tselect MEDIA_CONTROLLER\n-\thelp\n-\t  This driver supports the Maxim MAX96712 Quad GMSL2 Deserializer.\n-\n-\t  To compile this driver as a module, choose M here: the\n-\t  module will be called max96712.\ndiff --git a/drivers/staging/media/max96712/Makefile b/drivers/staging/media/max96712/Makefile\ndeleted file mode 100644\nindex 70c1974ce3f0..000000000000\n--- a/drivers/staging/media/max96712/Makefile\n+++ /dev/null\n@@ -1,2 +0,0 @@\n-# SPDX-License-Identifier: GPL-2.0\n-obj-$(CONFIG_VIDEO_MAX96712) += max96712.o\ndiff --git a/drivers/staging/media/max96712/max96712.c b/drivers/staging/media/max96712/max96712.c\ndeleted file mode 100644\nindex 0751b2e04895..000000000000\n--- a/drivers/staging/media/max96712/max96712.c\n+++ /dev/null\n@@ -1,487 +0,0 @@\n-// SPDX-License-Identifier: GPL-2.0\n-/*\n- * Maxim MAX96712 Quad GMSL2 Deserializer Driver\n- *\n- * Copyright (C) 2021 Renesas Electronics Corporation\n- * Copyright (C) 2021 Niklas Söderlund\n- */\n-\n-#include <linux/delay.h>\n-#include <linux/i2c.h>\n-#include <linux/module.h>\n-#include <linux/of_graph.h>\n-#include <linux/regmap.h>\n-\n-#include <media/v4l2-ctrls.h>\n-#include <media/v4l2-fwnode.h>\n-#include <media/v4l2-subdev.h>\n-\n-#define DEBUG_EXTRA_REG\t\t\t0x09\n-#define DEBUG_EXTRA_PCLK_25MHZ\t\t0x00\n-#define DEBUG_EXTRA_PCLK_75MHZ\t\t0x01\n-\n-enum max96712_pattern {\n-\tMAX96712_PATTERN_CHECKERBOARD = 0,\n-\tMAX96712_PATTERN_GRADIENT,\n-};\n-\n-struct max96712_info {\n-\tunsigned int dpllfreq;\n-\tbool have_debug_extra;\n-};\n-\n-struct max96712_priv {\n-\tstruct i2c_client *client;\n-\tstruct regmap *regmap;\n-\tstruct gpio_desc *gpiod_pwdn;\n-\n-\tconst struct max96712_info *info;\n-\n-\tbool cphy;\n-\tstruct v4l2_mbus_config_mipi_csi2 mipi;\n-\n-\tstruct v4l2_subdev sd;\n-\tstruct v4l2_ctrl_handler ctrl_handler;\n-\tstruct media_pad pads[1];\n-\n-\tenum max96712_pattern pattern;\n-};\n-\n-static int max96712_write(struct max96712_priv *priv, unsigned int reg, u8 val)\n-{\n-\tint ret;\n-\n-\tret = regmap_write(priv->regmap, reg, val);\n-\tif (ret)\n-\t\tdev_err(&priv->client->dev, \"write 0x%04x failed\\n\", reg);\n-\n-\treturn ret;\n-}\n-\n-static int max96712_update_bits(struct max96712_priv *priv, unsigned int reg,\n-\t\t\t\tu8 mask, u8 val)\n-{\n-\tint ret;\n-\n-\tret = regmap_update_bits(priv->regmap, reg, mask, val);\n-\tif (ret)\n-\t\tdev_err(&priv->client->dev, \"update 0x%04x failed\\n\", reg);\n-\n-\treturn ret;\n-}\n-\n-static int max96712_write_bulk(struct max96712_priv *priv, unsigned int reg,\n-\t\t\t       const void *val, size_t val_count)\n-{\n-\tint ret;\n-\n-\tret = regmap_bulk_write(priv->regmap, reg, val, val_count);\n-\tif (ret)\n-\t\tdev_err(&priv->client->dev, \"bulk write 0x%04x failed\\n\", reg);\n-\n-\treturn ret;\n-}\n-\n-static int max96712_write_bulk_value(struct max96712_priv *priv,\n-\t\t\t\t     unsigned int reg, unsigned int val,\n-\t\t\t\t     size_t val_count)\n-{\n-\tunsigned int i;\n-\tu8 values[4];\n-\n-\tfor (i = 1; i <= val_count; i++)\n-\t\tvalues[i - 1] = (val >> ((val_count - i) * 8)) & 0xff;\n-\n-\treturn max96712_write_bulk(priv, reg, &values, val_count);\n-}\n-\n-static void max96712_reset(struct max96712_priv *priv)\n-{\n-\tmax96712_update_bits(priv, 0x13, 0x40, 0x40);\n-\tmsleep(20);\n-}\n-\n-static void max96712_mipi_enable(struct max96712_priv *priv, bool enable)\n-{\n-\tif (enable) {\n-\t\tmax96712_update_bits(priv, 0x40b, 0x02, 0x02);\n-\t\tmax96712_update_bits(priv, 0x8a0, 0x80, 0x80);\n-\t} else {\n-\t\tmax96712_update_bits(priv, 0x8a0, 0x80, 0x00);\n-\t\tmax96712_update_bits(priv, 0x40b, 0x02, 0x00);\n-\t}\n-}\n-\n-static void max96712_mipi_configure(struct max96712_priv *priv)\n-{\n-\tunsigned int i;\n-\tu8 phy5 = 0;\n-\n-\tmax96712_mipi_enable(priv, false);\n-\n-\t/* Select 2x4 mode. */\n-\tmax96712_write(priv, 0x8a0, 0x04);\n-\n-\t/* TODO: Add support for 2-lane and 1-lane configurations. */\n-\tif (priv->cphy) {\n-\t\t/* Configure a 3-lane C-PHY using PHY0 and PHY1. */\n-\t\tmax96712_write(priv, 0x94a, 0xa0);\n-\n-\t\t/* Configure C-PHY timings. */\n-\t\tmax96712_write(priv, 0x8ad, 0x3f);\n-\t\tmax96712_write(priv, 0x8ae, 0x7d);\n-\t} else {\n-\t\t/* Configure a 4-lane D-PHY using PHY0 and PHY1. */\n-\t\tmax96712_write(priv, 0x94a, 0xc0);\n-\t}\n-\n-\t/* Configure lane mapping for PHY0 and PHY1. */\n-\t/* TODO: Add support for lane swapping. */\n-\tmax96712_write(priv, 0x8a3, 0xe4);\n-\n-\t/* Configure lane polarity for PHY0 and PHY1. */\n-\tfor (i = 0; i < priv->mipi.num_data_lanes + 1; i++)\n-\t\tif (priv->mipi.lane_polarities[i])\n-\t\t\tphy5 |= BIT(i == 0 ? 5 : i < 3 ? i - 1 : i);\n-\tmax96712_write(priv, 0x8a5, phy5);\n-\n-\t/* Set link frequency for PHY0 and PHY1. */\n-\tmax96712_update_bits(priv, 0x415, 0x3f,\n-\t\t\t     ((priv->info->dpllfreq / 100) & 0x1f) | BIT(5));\n-\tmax96712_update_bits(priv, 0x418, 0x3f,\n-\t\t\t     ((priv->info->dpllfreq / 100) & 0x1f) | BIT(5));\n-\n-\t/* Enable PHY0 and PHY1 */\n-\tmax96712_update_bits(priv, 0x8a2, 0xf0, 0x30);\n-}\n-\n-static void max96712_pattern_enable(struct max96712_priv *priv, bool enable)\n-{\n-\tconst u32 h_active = 1920;\n-\tconst u32 h_fp = 88;\n-\tconst u32 h_sw = 44;\n-\tconst u32 h_bp = 148;\n-\tconst u32 h_tot = h_active + h_fp + h_sw + h_bp;\n-\n-\tconst u32 v_active = 1080;\n-\tconst u32 v_fp = 4;\n-\tconst u32 v_sw = 5;\n-\tconst u32 v_bp = 36;\n-\tconst u32 v_tot = v_active + v_fp + v_sw + v_bp;\n-\n-\tif (!enable) {\n-\t\tmax96712_write(priv, 0x1051, 0x00);\n-\t\treturn;\n-\t}\n-\n-\t/* Set PCLK to 75MHz if device have DEBUG_EXTRA register. */\n-\tif (priv->info->have_debug_extra)\n-\t\tmax96712_write(priv, DEBUG_EXTRA_REG, DEBUG_EXTRA_PCLK_75MHZ);\n-\n-\t/* Configure Video Timing Generator for 1920x1080 @ 30 fps. */\n-\tmax96712_write_bulk_value(priv, 0x1052, 0, 3);\n-\tmax96712_write_bulk_value(priv, 0x1055, v_sw * h_tot, 3);\n-\tmax96712_write_bulk_value(priv, 0x1058,\n-\t\t\t\t  (v_active + v_fp + + v_bp) * h_tot, 3);\n-\tmax96712_write_bulk_value(priv, 0x105b, 0, 3);\n-\tmax96712_write_bulk_value(priv, 0x105e, h_sw, 2);\n-\tmax96712_write_bulk_value(priv, 0x1060, h_active + h_fp + h_bp, 2);\n-\tmax96712_write_bulk_value(priv, 0x1062, v_tot, 2);\n-\tmax96712_write_bulk_value(priv, 0x1064,\n-\t\t\t\t  h_tot * (v_sw + v_bp) + (h_sw + h_bp), 3);\n-\tmax96712_write_bulk_value(priv, 0x1067, h_active, 2);\n-\tmax96712_write_bulk_value(priv, 0x1069, h_fp + h_sw + h_bp, 2);\n-\tmax96712_write_bulk_value(priv, 0x106b, v_active, 2);\n-\n-\t/* Generate VS, HS and DE in free-running mode. */\n-\tmax96712_write(priv, 0x1050, 0xfb);\n-\n-\t/* Configure Video Pattern Generator. */\n-\tif (priv->pattern == MAX96712_PATTERN_CHECKERBOARD) {\n-\t\t/* Set checkerboard pattern size. */\n-\t\tmax96712_write(priv, 0x1074, 0x3c);\n-\t\tmax96712_write(priv, 0x1075, 0x3c);\n-\t\tmax96712_write(priv, 0x1076, 0x3c);\n-\n-\t\t/* Set checkerboard pattern colors. */\n-\t\tmax96712_write_bulk_value(priv, 0x106e, 0xfecc00, 3);\n-\t\tmax96712_write_bulk_value(priv, 0x1071, 0x006aa7, 3);\n-\n-\t\t/* Generate checkerboard pattern. */\n-\t\tmax96712_write(priv, 0x1051, 0x10);\n-\t} else {\n-\t\t/* Set gradient increment. */\n-\t\tmax96712_write(priv, 0x106d, 0x10);\n-\n-\t\t/* Generate gradient pattern. */\n-\t\tmax96712_write(priv, 0x1051, 0x20);\n-\t}\n-}\n-\n-static int max96712_s_stream(struct v4l2_subdev *sd, int enable)\n-{\n-\tstruct max96712_priv *priv = v4l2_get_subdevdata(sd);\n-\n-\tif (enable) {\n-\t\tmax96712_pattern_enable(priv, true);\n-\t\tmax96712_mipi_enable(priv, true);\n-\t} else {\n-\t\tmax96712_mipi_enable(priv, false);\n-\t\tmax96712_pattern_enable(priv, false);\n-\t}\n-\n-\treturn 0;\n-}\n-\n-static const struct v4l2_subdev_video_ops max96712_video_ops = {\n-\t.s_stream = max96712_s_stream,\n-};\n-\n-static int max96712_init_state(struct v4l2_subdev *sd,\n-\t\t\t       struct v4l2_subdev_state *state)\n-{\n-\tstatic const struct v4l2_mbus_framefmt default_fmt = {\n-\t\t.width          = 1920,\n-\t\t.height         = 1080,\n-\t\t.code           = MEDIA_BUS_FMT_RGB888_1X24,\n-\t\t.colorspace     = V4L2_COLORSPACE_SRGB,\n-\t\t.field          = V4L2_FIELD_NONE,\n-\t\t.ycbcr_enc      = V4L2_YCBCR_ENC_DEFAULT,\n-\t\t.quantization   = V4L2_QUANTIZATION_DEFAULT,\n-\t\t.xfer_func      = V4L2_XFER_FUNC_DEFAULT,\n-\t};\n-\tstruct v4l2_mbus_framefmt *fmt;\n-\n-\tfmt = v4l2_subdev_state_get_format(state, 0);\n-\t*fmt = default_fmt;\n-\n-\treturn 0;\n-}\n-\n-static const struct v4l2_subdev_internal_ops max96712_internal_ops = {\n-\t.init_state = max96712_init_state,\n-};\n-\n-static const struct v4l2_subdev_pad_ops max96712_pad_ops = {\n-\t.get_fmt = v4l2_subdev_get_fmt,\n-\t.set_fmt = v4l2_subdev_get_fmt,\n-};\n-\n-static const struct v4l2_subdev_ops max96712_subdev_ops = {\n-\t.video = &max96712_video_ops,\n-\t.pad = &max96712_pad_ops,\n-};\n-\n-static const char * const max96712_test_pattern[] = {\n-\t\"Checkerboard\",\n-\t\"Gradient\",\n-};\n-\n-static int max96712_s_ctrl(struct v4l2_ctrl *ctrl)\n-{\n-\tstruct max96712_priv *priv =\n-\t\tcontainer_of(ctrl->handler, struct max96712_priv, ctrl_handler);\n-\n-\tswitch (ctrl->id) {\n-\tcase V4L2_CID_TEST_PATTERN:\n-\t\tpriv->pattern = ctrl->val ?\n-\t\t\tMAX96712_PATTERN_GRADIENT :\n-\t\t\tMAX96712_PATTERN_CHECKERBOARD;\n-\t\tbreak;\n-\t}\n-\treturn 0;\n-}\n-\n-static const struct v4l2_ctrl_ops max96712_ctrl_ops = {\n-\t.s_ctrl = max96712_s_ctrl,\n-};\n-\n-static int max96712_v4l2_register(struct max96712_priv *priv)\n-{\n-\tlong pixel_rate;\n-\tint ret;\n-\n-\tpriv->sd.internal_ops = &max96712_internal_ops;\n-\tv4l2_i2c_subdev_init(&priv->sd, priv->client, &max96712_subdev_ops);\n-\tpriv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE;\n-\tpriv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;\n-\n-\tv4l2_ctrl_handler_init(&priv->ctrl_handler, 2);\n-\n-\t/*\n-\t * TODO: Once V4L2_CID_LINK_FREQ is changed from a menu control to an\n-\t * INT64 control it should be used here instead of V4L2_CID_PIXEL_RATE.\n-\t */\n-\tpixel_rate = priv->info->dpllfreq / priv->mipi.num_data_lanes * 1000000;\n-\tv4l2_ctrl_new_std(&priv->ctrl_handler, NULL, V4L2_CID_PIXEL_RATE,\n-\t\t\t  pixel_rate, pixel_rate, 1, pixel_rate);\n-\n-\tv4l2_ctrl_new_std_menu_items(&priv->ctrl_handler, &max96712_ctrl_ops,\n-\t\t\t\t     V4L2_CID_TEST_PATTERN,\n-\t\t\t\t     ARRAY_SIZE(max96712_test_pattern) - 1,\n-\t\t\t\t     0, 0, max96712_test_pattern);\n-\n-\tpriv->sd.ctrl_handler = &priv->ctrl_handler;\n-\tret = priv->ctrl_handler.error;\n-\tif (ret)\n-\t\tgoto error;\n-\n-\tpriv->pads[0].flags = MEDIA_PAD_FL_SOURCE;\n-\tret = media_entity_pads_init(&priv->sd.entity, 1, priv->pads);\n-\tif (ret)\n-\t\tgoto error;\n-\n-\tv4l2_set_subdevdata(&priv->sd, priv);\n-\n-\tpriv->sd.state_lock = priv->ctrl_handler.lock;\n-\tret = v4l2_subdev_init_finalize(&priv->sd);\n-\tif (ret)\n-\t\tgoto error;\n-\n-\tret = v4l2_async_register_subdev(&priv->sd);\n-\tif (ret < 0) {\n-\t\tdev_err(&priv->client->dev, \"Unable to register subdevice\\n\");\n-\t\tgoto error;\n-\t}\n-\n-\treturn 0;\n-error:\n-\tv4l2_ctrl_handler_free(&priv->ctrl_handler);\n-\n-\treturn ret;\n-}\n-\n-static int max96712_parse_dt(struct max96712_priv *priv)\n-{\n-\tstruct fwnode_handle *ep;\n-\tstruct v4l2_fwnode_endpoint v4l2_ep = {\n-\t\t.bus_type = V4L2_MBUS_UNKNOWN,\n-\t};\n-\tunsigned int supported_lanes;\n-\tint ret;\n-\n-\tep = fwnode_graph_get_endpoint_by_id(dev_fwnode(&priv->client->dev), 4,\n-\t\t\t\t\t     0, 0);\n-\tif (!ep) {\n-\t\tdev_err(&priv->client->dev, \"Not connected to subdevice\\n\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tret = v4l2_fwnode_endpoint_parse(ep, &v4l2_ep);\n-\tfwnode_handle_put(ep);\n-\tif (ret) {\n-\t\tdev_err(&priv->client->dev, \"Could not parse v4l2 endpoint\\n\");\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tswitch (v4l2_ep.bus_type) {\n-\tcase V4L2_MBUS_CSI2_DPHY:\n-\t\tsupported_lanes = 4;\n-\t\tpriv->cphy = false;\n-\t\tbreak;\n-\tcase V4L2_MBUS_CSI2_CPHY:\n-\t\tsupported_lanes = 3;\n-\t\tpriv->cphy = true;\n-\t\tbreak;\n-\tdefault:\n-\t\tdev_err(&priv->client->dev, \"Unsupported bus-type %u\\n\",\n-\t\t\tv4l2_ep.bus_type);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tif (v4l2_ep.bus.mipi_csi2.num_data_lanes != supported_lanes) {\n-\t\tdev_err(&priv->client->dev, \"Only %u data lanes supported\\n\",\n-\t\t\tsupported_lanes);\n-\t\treturn -EINVAL;\n-\t}\n-\n-\tpriv->mipi = v4l2_ep.bus.mipi_csi2;\n-\n-\treturn 0;\n-}\n-\n-static const struct regmap_config max96712_i2c_regmap = {\n-\t.reg_bits = 16,\n-\t.val_bits = 8,\n-\t.max_register = 0x1f00,\n-};\n-\n-static int max96712_probe(struct i2c_client *client)\n-{\n-\tstruct max96712_priv *priv;\n-\tint ret;\n-\n-\tpriv = devm_kzalloc(&client->dev, sizeof(*priv), GFP_KERNEL);\n-\tif (!priv)\n-\t\treturn -ENOMEM;\n-\n-\tpriv->info = of_device_get_match_data(&client->dev);\n-\n-\tpriv->client = client;\n-\n-\tpriv->regmap = devm_regmap_init_i2c(client, &max96712_i2c_regmap);\n-\tif (IS_ERR(priv->regmap))\n-\t\treturn PTR_ERR(priv->regmap);\n-\n-\tpriv->gpiod_pwdn = devm_gpiod_get_optional(&client->dev, \"enable\",\n-\t\t\t\t\t\t   GPIOD_OUT_HIGH);\n-\tif (IS_ERR(priv->gpiod_pwdn))\n-\t\treturn PTR_ERR(priv->gpiod_pwdn);\n-\n-\tgpiod_set_consumer_name(priv->gpiod_pwdn, \"max96712-pwdn\");\n-\tgpiod_set_value_cansleep(priv->gpiod_pwdn, 1);\n-\n-\tif (priv->gpiod_pwdn)\n-\t\tusleep_range(4000, 5000);\n-\n-\tmax96712_reset(priv);\n-\n-\tret = max96712_parse_dt(priv);\n-\tif (ret)\n-\t\treturn ret;\n-\n-\tmax96712_mipi_configure(priv);\n-\n-\treturn max96712_v4l2_register(priv);\n-}\n-\n-static void max96712_remove(struct i2c_client *client)\n-{\n-\tstruct v4l2_subdev *sd = i2c_get_clientdata(client);\n-\tstruct max96712_priv *priv = container_of(sd, struct max96712_priv, sd);\n-\n-\tv4l2_async_unregister_subdev(&priv->sd);\n-\n-\tgpiod_set_value_cansleep(priv->gpiod_pwdn, 0);\n-}\n-\n-static const struct max96712_info max96712_info_max96712 = {\n-\t.dpllfreq = 1000,\n-\t.have_debug_extra = true,\n-};\n-\n-static const struct max96712_info max96712_info_max96724 = {\n-\t.dpllfreq = 1200,\n-};\n-\n-static const struct of_device_id max96712_of_table[] = {\n-\t{ .compatible = \"maxim,max96712\", .data = &max96712_info_max96712 },\n-\t{ .compatible = \"maxim,max96724\", .data = &max96712_info_max96724 },\n-\t{ /* sentinel */ }\n-};\n-MODULE_DEVICE_TABLE(of, max96712_of_table);\n-\n-static struct i2c_driver max96712_i2c_driver = {\n-\t.driver\t= {\n-\t\t.name = \"max96712\",\n-\t\t.of_match_table\t= of_match_ptr(max96712_of_table),\n-\t},\n-\t.probe = max96712_probe,\n-\t.remove = max96712_remove,\n-};\n-\n-module_i2c_driver(max96712_i2c_driver);\n-\n-MODULE_DESCRIPTION(\"Maxim MAX96712 Quad GMSL2 Deserializer Driver\");\n-MODULE_AUTHOR(\"Niklas Söderlund <niklas.soderlund@ragnatech.se>\");\n-MODULE_LICENSE(\"GPL\");\n","prefixes":["v10","20/22"]}