#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/io.h>
#include <linux/iopoll.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/platform_device.h>
#include <linux/reset.h>
#define REG_SM0CFG2_REG …
#define REG_SM0CTL0_REG …
#define REG_SM0CTL1_REG …
#define REG_SM0D0_REG …
#define REG_SM0D1_REG …
#define REG_PINTEN_REG …
#define REG_PINTST_REG …
#define REG_PINTCL_REG …
#define SM0CFG2_IS_AUTOMODE …
#define SM0CTL0_ODRAIN …
#define SM0CTL0_CLK_DIV_MASK …
#define SM0CTL0_CLK_DIV_MAX …
#define SM0CTL0_CS_STATUS …
#define SM0CTL0_SCL_STATE …
#define SM0CTL0_SDA_STATE …
#define SM0CTL0_EN …
#define SM0CTL0_SCL_STRETCH …
#define SM0CTL1_ACK_MASK …
#define SM0CTL1_PGLEN_MASK …
#define SM0CTL1_PGLEN(x) …
#define SM0CTL1_READ …
#define SM0CTL1_READ_LAST …
#define SM0CTL1_STOP …
#define SM0CTL1_WRITE …
#define SM0CTL1_START …
#define SM0CTL1_MODE_MASK …
#define SM0CTL1_TRI …
#define TIMEOUT_MS …
struct mtk_i2c { … };
static int mtk_i2c_wait_idle(struct mtk_i2c *i2c)
{ … }
static void mtk_i2c_reset(struct mtk_i2c *i2c)
{ … }
static void mtk_i2c_dump_reg(struct mtk_i2c *i2c)
{ … }
static int mtk_i2c_check_ack(struct mtk_i2c *i2c, u32 expected)
{ … }
static int mtk_i2c_start(struct mtk_i2c *i2c)
{ … }
static int mtk_i2c_stop(struct mtk_i2c *i2c)
{ … }
static int mtk_i2c_cmd(struct mtk_i2c *i2c, u32 cmd, int page_len)
{ … }
static int mtk_i2c_xfer(struct i2c_adapter *adap, struct i2c_msg *msgs,
int num)
{ … }
static u32 mtk_i2c_func(struct i2c_adapter *a)
{ … }
static const struct i2c_algorithm mtk_i2c_algo = …;
static const struct of_device_id i2c_mtk_dt_ids[] = …;
MODULE_DEVICE_TABLE(of, i2c_mtk_dt_ids);
static void mtk_i2c_init(struct mtk_i2c *i2c)
{ … }
static int mtk_i2c_probe(struct platform_device *pdev)
{ … }
static void mtk_i2c_remove(struct platform_device *pdev)
{ … }
static struct platform_driver mtk_i2c_driver = …;
module_platform_driver(…) …;
MODULE_AUTHOR(…) …;
MODULE_DESCRIPTION(…) …;
MODULE_LICENSE(…) …;
MODULE_ALIAS(…) …;