On 28/02/2025 17:53, Pratap Nirujogi wrote: > Add driver for OmniVision 5.2M OV05C10 sensor. This driver > supports only the full size normal 2888x1808@30fps 2-lane > sensor profile. > > Signed-off-by: Pratap Nirujogi <pratap.nirujogi@xxxxxxx> > --- > drivers/media/i2c/Kconfig | 10 + > drivers/media/i2c/Makefile | 1 + > drivers/media/i2c/ov05c.c | 1031 ++++++++++++++++++++++++++++++++++++ > 3 files changed, 1042 insertions(+) > create mode 100644 drivers/media/i2c/ov05c.c > > diff --git a/drivers/media/i2c/Kconfig b/drivers/media/i2c/Kconfig > index 8ba096b8ebca..fd160feabc41 100644 > --- a/drivers/media/i2c/Kconfig > +++ b/drivers/media/i2c/Kconfig > @@ -337,6 +337,16 @@ config VIDEO_OG01A1B > To compile this driver as a module, choose M here: the > module will be called og01a1b. > > +config VIDEO_OV05C > + tristate "OmniVision OV05 sensor support" > + select V4L2_CCI_I2C > + help > + This is a Video4Linux2 sensor driver for the OmniVision > + OV05C camera. > + > + To compile this driver as a module, choose M here: the > + module will be called OV05C. > + > config VIDEO_OV01A10 > tristate "OmniVision OV01A10 sensor support" > help > diff --git a/drivers/media/i2c/Makefile b/drivers/media/i2c/Makefile > index fbb988bd067a..08bfc2d59be2 100644 > --- a/drivers/media/i2c/Makefile > +++ b/drivers/media/i2c/Makefile > @@ -80,6 +80,7 @@ obj-$(CONFIG_VIDEO_MT9V011) += mt9v011.o > obj-$(CONFIG_VIDEO_MT9V032) += mt9v032.o > obj-$(CONFIG_VIDEO_MT9V111) += mt9v111.o > obj-$(CONFIG_VIDEO_OG01A1B) += og01a1b.o > +obj-$(CONFIG_VIDEO_OV05C) += ov05c.o > obj-$(CONFIG_VIDEO_OV01A10) += ov01a10.o > obj-$(CONFIG_VIDEO_OV02A10) += ov02a10.o > obj-$(CONFIG_VIDEO_OV08D10) += ov08d10.o > diff --git a/drivers/media/i2c/ov05c.c b/drivers/media/i2c/ov05c.c > new file mode 100644 > index 000000000000..96c4f74af4a9 > --- /dev/null > +++ b/drivers/media/i2c/ov05c.c > @@ -0,0 +1,1031 @@ > +/* SPDX-License-Identifier: MIT */ > +/* > + * Copyright (C) 2025 Advanced Micro Devices, Inc. All rights reserved. > + * All Rights Reserved. > + * > + * Permission is hereby granted, free of charge, to any person obtaining a > + * copy of this software and associated documentation files (the > + * "Software"), to deal in the Software without restriction, including > + * without limitation the rights to use, copy, modify, merge, publish, > + * distribute, sub license, and/or sell copies of the Software, and to > + * permit persons to whom the Software is furnished to do so, subject to > + * the following conditions: > + * > + * The above copyright notice and this permission notice (including the > + * next paragraph) shall be included in all copies or substantial portions > + * of the Software. > + * > + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR > + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, > + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL > + * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, > + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR > + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE > + * USE OR OTHER DEALINGS IN THE SOFTWARE. What's with AMD? Second patch that day, same issues. Drop license boilerplate. > + * > + */ > + > +#include <linux/acpi.h> > +#include <linux/i2c.h> > +#include <linux/module.h> > +#include <linux/delay.h> > +#include <linux/units.h> > +#include <linux/pm_runtime.h> > +#include <linux/gpio.h> > +#include <media/v4l2-ctrls.h> > +#include <media/v4l2-device.h> > +#include <media/v4l2-fwnode.h> > +#include <media/v4l2-cci.h> ... > + > +static int ov05c_probe(struct i2c_client *client) > +{ > + struct ov05c *ov05c; > + int i, ret; > + > + ov05c = devm_kzalloc(&client->dev, sizeof(*ov05c), GFP_KERNEL); > + if (!ov05c) > + return -ENOMEM; > + > + client->dev.init_name = DRV_NAME; > + > + /* create sensor enable gpio control */ > + ov05c->enable_gpio = devm_gpiod_get(&client->dev, "sensor0_enable", GPIOD_OUT_LOW); s/sensor0_enable/enable/ > + if (IS_ERR_OR_NULL(ov05c->enable_gpio)) > + return PTR_ERR(ov05c->enable_gpio); > + > + /* Initialize subdev */ > + v4l2_i2c_subdev_init(&ov05c->sd, client, &ov05c_subdev_ops); > + > + /* Initialize CCI */ > + ov05c->regmap = devm_cci_regmap_init_i2c(client, 8); > + if (IS_ERR(ov05c->regmap)) { > + dev_err(&client->dev, "Failed to initialize CCI\n"); Syntax is: return dev_err_probe > + return PTR_ERR(ov05c->regmap); > + } > + > + /* Set default mode to max resolution */ > + ov05c->cur_mode = &supported_modes[0]; > + > + /* Initialize V4L2 controls */ > + ret = ov05c_init_controls(ov05c); > + if (ret) > + return ret; > + > + /* Initialize V4L2 subdev */ > + ov05c->sd.internal_ops = &ov05c_internal_ops; > + ov05c->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE; > + ov05c->sd.entity.ops = &ov05c_subdev_entity_ops; > + ov05c->sd.entity.function = MEDIA_ENT_F_CAM_SENSOR; > + ov05c->sd.entity.name = "OV05C"; > + > + /* Initialize source pad */ > + for (i = 0; i < NUM_OF_PADS; i++) > + ov05c->pads[i].flags = MEDIA_PAD_FL_SOURCE; > + > + ret = media_entity_pads_init(&ov05c->sd.entity, NUM_OF_PADS, ov05c->pads); > + if (ret) > + goto error_handler_free; > + > + ret = v4l2_async_register_subdev_sensor(&ov05c->sd); > + if (ret) > + goto error_media_entity; > + > + /* > + * Device is already turned on by i2c-core with ACPI domain PM. > + * Enable runtime PM and turn off the device. > + */ > + pm_runtime_set_active(&client->dev); > + pm_runtime_enable(&client->dev); > + pm_runtime_idle(&client->dev); > + > + dev_info(&client->dev, "%s success", __func__); Drop, useless. Kernel has infrastructure for simple function exit debugging. For probing as well. > + > + return 0; > + > +error_media_entity: > + media_entity_cleanup(&ov05c->sd.entity); > + > +error_handler_free: > + ov05c_free_controls(ov05c); > + > + return ret; > +} > + > +static void ov05c_remove(struct i2c_client *client) > +{ > + struct v4l2_subdev *sd = i2c_get_clientdata(client); > + struct ov05c *ov05c = to_ov05c(sd); > + > + v4l2_async_unregister_subdev(sd); > + media_entity_cleanup(&sd->entity); > + ov05c_free_controls(ov05c); > + > + pm_runtime_disable(&client->dev); > + pm_runtime_set_suspended(&client->dev); > +} > + > +static const struct i2c_device_id ov05c_id[] = { > + {"ov05c", 0 }, > + { } > +}; > + > +MODULE_DEVICE_TABLE(i2c, ov05c_id); > + > +static struct i2c_driver ov05c_i2c_driver = { > + .driver = { > + .name = DRV_NAME, > + }, > + .id_table = ov05c_id, > + .probe = ov05c_probe, > + .remove = ov05c_remove, > +}; > + > +module_i2c_driver(ov05c_i2c_driver); > + > +MODULE_AUTHOR("Venkata Narendra Kumar Gutta <vengutta@xxxxxxx>"); > +MODULE_AUTHOR("Pratap Nirujogi <pratap.nirujogi@xxxxxxx>"); > +MODULE_DESCRIPTION("OmniVision OV05C sensor driver"); > +MODULE_ALIAS("ov05c"); Drop, not correct alias. > +MODULE_LICENSE("GPL and additional rights"); No, use proper license and matching tag. Your top said this is not GPL! Best regards, Krzysztof