diff options
author | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2011-12-29 18:37:07 -0500 |
---|---|---|
committer | Florian Tobias Schandinat <FlorianSchandinat@gmx.de> | 2012-02-12 17:15:16 -0500 |
commit | 2c4c8a8a73b64a8ea86ad85d8a59a5914d2f81ea (patch) | |
tree | 5bd6026c0b94b208b7ff632651c3587fae5ff776 | |
parent | e75892715db800ee96fe4ac0407b73b57d866a68 (diff) |
viafb: fix I2C emulation on GPIO ports
This patch fixes the I2C emulation on GPIO ports by enabling it
(software controlled) and disabling the output on a GPIO line before
reading it.
Signed-off-by: Florian Tobias Schandinat <FlorianSchandinat@gmx.de>
-rw-r--r-- | drivers/video/via/via_i2c.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/drivers/video/via/via_i2c.c b/drivers/video/via/via_i2c.c index 78f1405dbab7..dd53058bbbb7 100644 --- a/drivers/video/via/via_i2c.c +++ b/drivers/video/via/via_i2c.c | |||
@@ -51,7 +51,7 @@ static void via_i2c_setscl(void *data, int state) | |||
51 | val |= 0x01; | 51 | val |= 0x01; |
52 | break; | 52 | break; |
53 | case VIA_PORT_GPIO: | 53 | case VIA_PORT_GPIO: |
54 | val |= 0x80; | 54 | val |= 0x82; |
55 | break; | 55 | break; |
56 | default: | 56 | default: |
57 | printk(KERN_ERR "viafb_i2c: specify wrong i2c type.\n"); | 57 | printk(KERN_ERR "viafb_i2c: specify wrong i2c type.\n"); |
@@ -67,6 +67,9 @@ static int via_i2c_getscl(void *data) | |||
67 | int ret = 0; | 67 | int ret = 0; |
68 | 68 | ||
69 | spin_lock_irqsave(&i2c_vdev->reg_lock, flags); | 69 | spin_lock_irqsave(&i2c_vdev->reg_lock, flags); |
70 | if (adap_data->type == VIA_PORT_GPIO) | ||
71 | via_write_reg_mask(adap_data->io_port, adap_data->ioport_index, | ||
72 | 0, 0x80); | ||
70 | if (via_read_reg(adap_data->io_port, adap_data->ioport_index) & 0x08) | 73 | if (via_read_reg(adap_data->io_port, adap_data->ioport_index) & 0x08) |
71 | ret = 1; | 74 | ret = 1; |
72 | spin_unlock_irqrestore(&i2c_vdev->reg_lock, flags); | 75 | spin_unlock_irqrestore(&i2c_vdev->reg_lock, flags); |
@@ -80,6 +83,9 @@ static int via_i2c_getsda(void *data) | |||
80 | int ret = 0; | 83 | int ret = 0; |
81 | 84 | ||
82 | spin_lock_irqsave(&i2c_vdev->reg_lock, flags); | 85 | spin_lock_irqsave(&i2c_vdev->reg_lock, flags); |
86 | if (adap_data->type == VIA_PORT_GPIO) | ||
87 | via_write_reg_mask(adap_data->io_port, adap_data->ioport_index, | ||
88 | 0, 0x40); | ||
83 | if (via_read_reg(adap_data->io_port, adap_data->ioport_index) & 0x04) | 89 | if (via_read_reg(adap_data->io_port, adap_data->ioport_index) & 0x04) |
84 | ret = 1; | 90 | ret = 1; |
85 | spin_unlock_irqrestore(&i2c_vdev->reg_lock, flags); | 91 | spin_unlock_irqrestore(&i2c_vdev->reg_lock, flags); |
@@ -103,7 +109,7 @@ static void via_i2c_setsda(void *data, int state) | |||
103 | val |= 0x01; | 109 | val |= 0x01; |
104 | break; | 110 | break; |
105 | case VIA_PORT_GPIO: | 111 | case VIA_PORT_GPIO: |
106 | val |= 0x40; | 112 | val |= 0x42; |
107 | break; | 113 | break; |
108 | default: | 114 | default: |
109 | printk(KERN_ERR "viafb_i2c: specify wrong i2c type.\n"); | 115 | printk(KERN_ERR "viafb_i2c: specify wrong i2c type.\n"); |