update hdmi dirver: unregister err and update i2c driver:support direct mode
authorkfx <kfx@rock-chips.com>
Sat, 14 May 2011 08:58:22 +0000 (16:58 +0800)
committerkfx <kfx@rock-chips.com>
Sat, 14 May 2011 08:58:22 +0000 (16:58 +0800)
drivers/i2c/busses/i2c-rk29.c
drivers/i2c/i2c-core.c
drivers/video/hdmi/hdmi-new/chips/anx7150.c
drivers/video/hdmi/hdmi-new/hdmi-core.c
drivers/video/hdmi/hdmi-old/hdmi-core.c
include/linux/i2c.h

index 1b8e6c73c1b8c2328e31a473cba4645de182b19e..a2b5b30d3d51662041d0f0a595e1cd6ac9530cbb 100755 (executable)
@@ -484,8 +484,25 @@ static int rk29_xfer_msg(struct i2c_adapter *adap,
                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;
index 48862c7c776a215576c175bd1dc2553d9f2dba98..4b728449fa6c6dae147eec21e5865aeec5386343 100755 (executable)
@@ -1315,6 +1315,33 @@ int i2c_master_reg8_recv(struct i2c_client *client, const char reg, char *buf, i
 
 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;
index a87bc0dc7560288d61bbf4d0c3b27a89520fc335..bc086604263959d059cc14bb32377b6b84398c64 100755 (executable)
@@ -258,7 +258,7 @@ static int anx7150_i2c_probe(struct i2c_client *client,const struct i2c_device_i
     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
@@ -272,7 +272,7 @@ static int __devexit anx7150_i2c_remove(struct i2c_client *client)
        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
index b134ae422129609aa57f8023d2b8449364ce54cd..34132c1692c11bd4ac4379ddc61b0280863ce26a 100755 (executable)
@@ -117,14 +117,19 @@ success:
 }\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
index 5375f6c209162843cac8280b074361fd9f1bcbfd..6b03ab29562e413e46677d58ce8104aba7c5c35d 100755 (executable)
@@ -97,11 +97,16 @@ success:
 }\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
index 82828c02105b8f0fbd4586b5ab8437439d54cf43..8d3d0315ef62ff8db25b0966ee9521ddf04fe90e 100755 (executable)
@@ -522,7 +522,8 @@ struct i2c_msg {
 #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