Index: drivers/media/video/samsung/tv20/ddc.c |
diff --git a/drivers/media/video/samsung/tv20/ddc.c b/drivers/media/video/samsung/tv20/ddc.c |
new file mode 100644 |
index 0000000000000000000000000000000000000000..6fb861865b0c6575f29910aec5c766ffc626efb0 |
--- /dev/null |
+++ b/drivers/media/video/samsung/tv20/ddc.c |
@@ -0,0 +1,141 @@ |
+/* linux/drivers/media/video/samsung/tv20/ddc.c |
+* |
+* Copyright (c) 2010 Samsung Electronics Co., Ltd. |
+* http://www.samsung.com/ |
+* |
+* S5PV210 - ddc interface file for Samsung TVOut driver |
+* |
+* This program is free software; you can redistribute it and/or modify |
+* it under the terms of the GNU General Public License version 2 as |
+* published by the Free Software Foundation. |
+*/ |
+#include <linux/module.h> |
+#include <linux/kernel.h> |
+#include <linux/i2c.h> |
+ |
+#define I2C_DRIVERID_S5P_HDCP 510 |
+#define S5P_HDCP_I2C_ADDR 0x74 |
+ |
+const static u16 ignore[] = { I2C_CLIENT_END }; |
+const static u16 normal_addr[] = { |
+ (S5P_HDCP_I2C_ADDR >> 1), |
+ I2C_CLIENT_END |
+}; |
+ |
+const static u16 *forces[] = { NULL }; |
+ |
+static struct i2c_client_address_data ddc_addr = { |
+ .normal_i2c = normal_addr, |
+ .probe = ignore, |
+ .ignore = ignore, |
+ .forces = forces, |
+}; |
+ |
+struct i2c_client *ddc_port; |
+ |
+int ddc_read(u8 subaddr, u8 *data, u16 len) |
+{ |
+ u8 addr = subaddr; |
+ int ret = 0; |
+ |
+ struct i2c_msg msg[] = { |
+ [0] = { |
+ .addr = ddc_port->addr, |
+ .flags = 0, |
+ .len = 1, |
+ .buf = &addr |
+ }, |
+ [1] = { |
+ .addr = ddc_port->addr, |
+ .flags = I2C_M_RD, |
+ .len = len, |
+ .buf = data |
+ } |
+ }; |
+ |
+ if (i2c_transfer(ddc_port->adapter, msg, 2) != 2) |
+ ret = -EIO; |
+ |
+ return ret; |
+} |
+ |
+ |
+int ddc_write(u8 *data, u16 len) |
+{ |
+ int ret = 0; |
+ |
+ if (i2c_master_send(ddc_port, (const char *) data, len) != len) |
+ ret = -EIO; |
+ |
+ return ret; |
+} |
+ |
+static int __devinit ddc_probe(struct i2c_client *client, |
+ const struct i2c_device_id *dev_id) |
+{ |
+ int ret = 0; |
+ |
+ ddc_port = client; |
+ |
+ dev_info(&client->adapter->dev, "attached s5p_ddc " |
+ "into i2c adapter successfully\n"); |
+ |
+ return ret; |
+} |
+ |
+static int ddc_remove(struct i2c_client *client) |
+{ |
+ dev_info(&client->adapter->dev, "detached s5p_ddc " |
+ "from i2c adapter successfully\n"); |
+ |
+ return 0; |
+} |
+ |
+static int ddc_suspend(struct i2c_client *cl, pm_message_t mesg) |
+{ |
+ return 0; |
+}; |
+ |
+static int ddc_resume(struct i2c_client *cl) |
+{ |
+ return 0; |
+}; |
+ |
+static struct i2c_device_id ddc_idtable[] = { |
+ {"s5p_ddc", 0}, |
+}; |
+ |
+MODULE_DEVICE_TABLE(i2c, ddc_idtable); |
+ |
+static struct i2c_driver ddc_driver = { |
+ .driver = { |
+ .name = "s5p_ddc", |
+ }, |
+/* Removed id member due to the change of i2c_driver structure of i2c.h */ |
+/* .id = I2C_DRIVERID_S5P_HDCP,*/ |
+ .id_table = ddc_idtable, |
+ .probe = ddc_probe, |
+ .remove = __devexit_p(ddc_remove), |
+ .address_data = &ddc_addr, |
+ |
+ .suspend = ddc_suspend, |
+ .resume = ddc_resume, |
+}; |
+ |
+static int __init ddc_init(void) |
+{ |
+ return i2c_add_driver(&ddc_driver); |
+} |
+ |
+static void __exit ddc_exit(void) |
+{ |
+ i2c_del_driver(&ddc_driver); |
+} |
+ |
+MODULE_AUTHOR("SangPil Moon <sangpil.moon@samsung.com>"); |
+MODULE_DESCRIPTION("Driver for SMDKV210 I2C DDC devices"); |
+ |
+MODULE_LICENSE("GPL"); |
+ |
+module_init(ddc_init); |
+module_exit(ddc_exit); |