主要逻辑函数就是max92xx_i2c_read/write
/*!
* @file max92xx.c
*
* @brief max92xx GMSL1 DSI Serializer/DESerializer driver
*
* @ingroup LCD
*/
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/device.h>
#include <linux/i2c.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of_device.h>
#include <linux/of_gpio.h>
#include <linux/pinctrl/consumer.h>
#include <linux/regulator/consumer.h>
static int max92xx_probe(struct i2c_client *adapter,
const struct i2c_device_id *id);
static int max92xx_remove(struct i2c_client *client);
static const struct i2c_device_id max92xx_id[] = {
{"max9283", 0},
{},
};
MODULE_DEVICE_TABLE(i2c, max92xx_id);
static int init_max92xx(void);
static struct i2c_driver max92xx_i2c_driver = {
.driver = {
.owner = THIS_MODULE,
.name = "max9283",
},
.probe = max92xx_probe,
.remove = max92xx_remove,
.id_table = max92xx_id,
};
static struct sensor {
struct i2c_client *i2c_client;
} max92xx_data;
/***********************************************************************
* I2C transfert.
***********************************************************************/
/*******************************************************
Function:
Read data from the i2c slave device.
Input:
Output:
*********************************************************/
unsigned long max92xx_i2c_read(struct i2c_client *client, int address)
{
unsigned long rxdata;
u8 i2c_buf[8];
u8 i2c_addr[8];
struct i2c_adapter *adapter;
adapter = to_i2c_adapter(client->dev.parent);
i2c_addr[0] = (address & 0xff00)>>8;
i2c_addr[1] = (address & 0xff);
struct i2c_msg msgs[2] = {
{
.flags = !I2C_M_RD,
.addr = client->addr,
.len = 2,
.buf = i2c_addr,
},
{
.flags = I2C_M_RD,
.addr = client->addr,
.len = 2,
.buf = i2c_buf