goto exit;
}
if(msg->flags & I2C_M_RD)
- {
- if((ret = rk29_i2c_recv_msg(i2c, msg)) != 0)
+ {
+ if(msg->flags & I2C_M_REG8_DIRECT)
+ {
+ struct i2c_msg msg1 = *msg;
+ struct i2c_msg msg2 = *msg;
+ msg1.len = 1;
+ msg2.len = msg->len - 1;
+ msg2.buf = msg->buf + 1;
+
+ if((ret = rk29_i2c_send_msg(i2c, &msg1)) != 0)
+ i2c_err(i2c->dev, "<error>rk29_i2c_send_msg timeout\n");
+ if((ret = rk29_i2c_recv_msg(i2c, &msg2)) != 0)
+ {
+ i2c_err(i2c->dev, "<error>rk29_i2c_recv_msg timeout\n");
+ goto exit;
+ }
+
+ }
+ else if((ret = rk29_i2c_recv_msg(i2c, msg)) != 0)
{
i2c_err(i2c->dev, "<error>rk29_i2c_recv_msg timeout\n");
goto exit;
EXPORT_SYMBOL(i2c_master_reg8_recv);
+int i2c_master_reg8_direct_send(struct i2c_client *client, const char reg, const char *buf, int count, int scl_rate)
+{
+ return i2c_master_reg8_send(client, reg, buf, count, scl_rate);
+}
+EXPORT_SYMBOL(i2c_master_reg8_direct_send);
+
+int i2c_master_reg8_direct_recv(struct i2c_client *client, const char reg, char *buf, int count, int scl_rate)
+{
+ struct i2c_adapter *adap=client->adapter;
+ struct i2c_msg msg;
+ int ret;
+ char tx_buf[count+1];
+
+ tx_buf[0] = reg;
+ msg.addr = client->addr;
+ msg.flags = client->flags | I2C_M_REG8_DIRECT | I2C_M_RD;
+ msg.len = count + 1;
+ msg.buf = tx_buf;
+ msg.scl_rate = scl_rate;
+ msg.udelay = client->udelay;
+
+ ret = i2c_transfer(adap, &msg, 1);
+ memcpy(buf, tx_buf + 1, count);
+ return (ret == 1) ? count : ret;
+}
+EXPORT_SYMBOL(i2c_master_reg8_direct_recv);
+
int i2c_master_reg16_send(struct i2c_client *client, const short regs, const short *buf, int count, int scl_rate)
{
struct i2c_adapter *adap=client->adapter;
dev_info(&client->dev, "anx7150 i2c probe ok\n");\r
return 0;\r
err_free_irq:\r
- free_irq(anx->irq, hdmi);\r
+ free_irq(anx->irq, NULL);\r
err_gpio_free:\r
gpio_free(client->irq);\r
err_hdmi_unregister:\r
struct anx7150_pdata *anx = (struct anx7150_pdata *)i2c_get_clientdata(client);\r
struct hdmi *hdmi = anx->hdmi;\r
\r
- free_irq(anx->irq, anx);\r
+ free_irq(anx->irq, NULL);\r
gpio_free(client->irq);\r
hdmi_unregister(hdmi);\r
anx = NULL;\r
}\r
void hdmi_unregister(struct hdmi *hdmi)\r
{\r
+ int id;\r
+\r
+ if(!hdmi)\r
+ return;\r
+ id = hdmi->id;\r
flush_scheduled_work();\r
hdmi_remove_attrs(hdmi);\r
device_unregister(hdmi->dev);\r
\r
kfree(hdmi);\r
hdmi = NULL;\r
- ref_info[hdmi->id].ref = 0;\r
- ref_info[hdmi->id].hdmi = NULL;\r
+ ref_info[id].ref = 0;\r
+ ref_info[id].hdmi = NULL;\r
}\r
struct hdmi *get_hdmi_struct(int nr)\r
{\r
}\r
void hdmi_unregister(struct hdmi *hdmi)\r
{\r
+ int id;\r
+\r
+ if(!hdmi)\r
+ return;\r
+ id = hdmi->id;\r
flush_scheduled_work();\r
hdmi_remove_attrs(hdmi);\r
device_unregister(hdmi->dev);\r
- ref_info[hdmi->id].ref = 0;\r
- ref_info[hdmi->id].hdmi = NULL;\r
+ ref_info[id].ref = 0;\r
+ ref_info[id].hdmi = NULL;\r
}\r
struct hdmi *get_hdmi_struct(int nr)\r
{\r
#define I2C_M_IGNORE_NAK 0x1000 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_NO_RD_ACK 0x0800 /* if I2C_FUNC_PROTOCOL_MANGLING */
#define I2C_M_RECV_LEN 0x0400 /* length will be first received byte */
-#define I2C_M_NEED_DELAY 0x8000 // add by kfx
+#define I2C_M_NEED_DELAY 0x0020 // add by kfx
+#define I2C_M_REG8_DIRECT 0x0040 // add by kfx
__u16 len; /* msg length */
__u8 *buf; /* pointer to msg data */
__u32 scl_rate; // add by kfx