94 lines · c
1// SPDX-License-Identifier: GPL-2.0-only2/*3 * Copyright (C) 2005-2006 Micronas USA Inc.4 */5 6#include <linux/init.h>7#include <linux/module.h>8#include <linux/i2c.h>9#include <linux/videodev2.h>10#include <media/v4l2-device.h>11#include <linux/slab.h>12 13MODULE_DESCRIPTION("OmniVision ov7640 sensor driver");14MODULE_LICENSE("GPL v2");15 16struct reg_val {17 u8 reg;18 u8 val;19};20 21static const struct reg_val regval_init[] = {22 {0x12, 0x80},23 {0x12, 0x54},24 {0x14, 0x24},25 {0x15, 0x01},26 {0x28, 0x20},27 {0x75, 0x82},28};29 30static int write_regs(struct i2c_client *client,31 const struct reg_val *rv, int len)32{33 while (--len >= 0) {34 if (i2c_smbus_write_byte_data(client, rv->reg, rv->val) < 0)35 return -1;36 rv++;37 }38 return 0;39}40 41/* ----------------------------------------------------------------------- */42 43static const struct v4l2_subdev_ops ov7640_ops;44 45static int ov7640_probe(struct i2c_client *client)46{47 struct i2c_adapter *adapter = client->adapter;48 struct v4l2_subdev *sd;49 50 if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA))51 return -ENODEV;52 53 sd = devm_kzalloc(&client->dev, sizeof(*sd), GFP_KERNEL);54 if (sd == NULL)55 return -ENOMEM;56 v4l2_i2c_subdev_init(sd, client, &ov7640_ops);57 58 client->flags = I2C_CLIENT_SCCB;59 60 v4l_info(client, "chip found @ 0x%02x (%s)\n",61 client->addr << 1, client->adapter->name);62 63 if (write_regs(client, regval_init, ARRAY_SIZE(regval_init)) < 0) {64 v4l_err(client, "error initializing OV7640\n");65 return -ENODEV;66 }67 68 return 0;69}70 71 72static void ov7640_remove(struct i2c_client *client)73{74 struct v4l2_subdev *sd = i2c_get_clientdata(client);75 76 v4l2_device_unregister_subdev(sd);77}78 79static const struct i2c_device_id ov7640_id[] = {80 { "ov7640" },81 { }82};83MODULE_DEVICE_TABLE(i2c, ov7640_id);84 85static struct i2c_driver ov7640_driver = {86 .driver = {87 .name = "ov7640",88 },89 .probe = ov7640_probe,90 .remove = ov7640_remove,91 .id_table = ov7640_id,92};93module_i2c_driver(ov7640_driver);94