2019-05-27 09:55:21 +03:00
// SPDX-License-Identifier: GPL-2.0-only
2013-03-09 14:09:18 +04:00
/*
* Copyright ( C ) 2005 - 2006 Micronas USA Inc .
*/
# include <linux/init.h>
# include <linux/module.h>
# include <linux/i2c.h>
# include <linux/videodev2.h>
# include <media/v4l2-device.h>
# include <linux/slab.h>
MODULE_DESCRIPTION ( " OmniVision ov7640 sensor driver " ) ;
MODULE_LICENSE ( " GPL v2 " ) ;
2022-03-17 17:47:14 +03:00
struct reg_val {
u8 reg ;
u8 val ;
2013-03-09 14:09:18 +04:00
} ;
2022-03-17 17:47:14 +03:00
static const struct reg_val regval_init [ ] = {
{ 0x12 , 0x80 } ,
{ 0x12 , 0x54 } ,
{ 0x14 , 0x24 } ,
{ 0x15 , 0x01 } ,
{ 0x28 , 0x20 } ,
{ 0x75 , 0x82 } ,
} ;
2013-03-09 14:09:18 +04:00
2022-03-17 17:47:14 +03:00
static int write_regs ( struct i2c_client * client ,
const struct reg_val * rv , int len )
{
while ( - - len > = 0 ) {
if ( i2c_smbus_write_byte_data ( client , rv - > reg , rv - > val ) < 0 )
2013-03-09 14:09:18 +04:00
return - 1 ;
2022-03-17 17:47:14 +03:00
rv + + ;
}
2013-03-09 14:09:18 +04:00
return 0 ;
}
/* ----------------------------------------------------------------------- */
static const struct v4l2_subdev_ops ov7640_ops ;
static int ov7640_probe ( struct i2c_client * client ,
const struct i2c_device_id * id )
{
struct i2c_adapter * adapter = client - > adapter ;
struct v4l2_subdev * sd ;
if ( ! i2c_check_functionality ( adapter , I2C_FUNC_SMBUS_BYTE_DATA ) )
return - ENODEV ;
2013-05-02 15:29:43 +04:00
sd = devm_kzalloc ( & client - > dev , sizeof ( * sd ) , GFP_KERNEL ) ;
2013-03-09 14:09:18 +04:00
if ( sd = = NULL )
return - ENOMEM ;
v4l2_i2c_subdev_init ( sd , client , & ov7640_ops ) ;
client - > flags = I2C_CLIENT_SCCB ;
v4l_info ( client , " chip found @ 0x%02x (%s) \n " ,
client - > addr < < 1 , client - > adapter - > name ) ;
2022-03-17 17:47:14 +03:00
if ( write_regs ( client , regval_init , ARRAY_SIZE ( regval_init ) ) < 0 ) {
2013-03-09 14:09:18 +04:00
v4l_err ( client , " error initializing OV7640 \n " ) ;
return - ENODEV ;
}
return 0 ;
}
static int ov7640_remove ( struct i2c_client * client )
{
struct v4l2_subdev * sd = i2c_get_clientdata ( client ) ;
v4l2_device_unregister_subdev ( sd ) ;
2013-05-02 15:29:43 +04:00
2013-03-09 14:09:18 +04:00
return 0 ;
}
static const struct i2c_device_id ov7640_id [ ] = {
{ " ov7640 " , 0 } ,
{ }
} ;
MODULE_DEVICE_TABLE ( i2c , ov7640_id ) ;
static struct i2c_driver ov7640_driver = {
. driver = {
. name = " ov7640 " ,
} ,
. probe = ov7640_probe ,
. remove = ov7640_remove ,
. id_table = ov7640_id ,
} ;
module_i2c_driver ( ov7640_driver ) ;