aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2012-03-20 04:51:37 -0400
committerDave Airlie <airlied@redhat.com>2012-03-20 04:51:37 -0400
commitde49442f593c414415cac9c00b2b55b6d18b27d7 (patch)
tree44ba0dacf2ee42e02dc0d683c51b7a4ad65c0721 /drivers
parent654c59cf76a220866d1f74ab169bf469940c2d70 (diff)
parentc501ae7f332cdaf42e31af30b72b4b66cbbb1604 (diff)
Merge tag 'drm-intel-next-2012-03-01' of git://people.freedesktop.org/~danvet/drm-intel into drm-next
* tag 'drm-intel-next-2012-03-01' of git://people.freedesktop.org/~danvet/drm-intel: drm/i915: Only clear the GPU domains upon a successful finish drm/i915: reenable gmbus on gen3+ again drm/i915: i2c: unconditionally set up gpio fallback drm/i915: merge gmbus and gpio i2c adpater into one drm/i915: merge struct intel_gpio into struct intel_gmbus i2c: export bit-banging algo functions drm/nouveau: do a better job at hiding the NIH i2c bit-banging algo drm/i915: add dev_priv to intel_gmbus drm/i915: Fix single msg gmbus_xfers writes drm/i915: error_buffer->ring should be signed drm/i915: Silence the error message from i915_wait_request() drm/i915: use the new hdmi_force_audio enum more drm/i915: No need to search again after retiring requests drm/i915: Only bump refcnt on objects scheduled for eviction drm/i915/bios: Downgrade the "signature missing" DRM_ERROR to debug drm/i915: Ignore LVDS on hp t5745 and hp st5747 thin client drm/i915: Fixes distorted external screen image on HP 2730p
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/drm/i915/i915_drv.h19
-rw-r--r--drivers/gpu/drm/i915/i915_gem.c12
-rw-r--r--drivers/gpu/drm/i915/i915_gem_evict.c19
-rw-r--r--drivers/gpu/drm/i915/intel_bios.c2
-rw-r--r--drivers/gpu/drm/i915/intel_display.c2
-rw-r--r--drivers/gpu/drm/i915/intel_dp.c10
-rw-r--r--drivers/gpu/drm/i915/intel_i2c.c190
-rw-r--r--drivers/gpu/drm/i915/intel_lvds.c16
-rw-r--r--drivers/gpu/drm/i915/intel_sdvo.c10
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_i2c.c8
-rw-r--r--drivers/i2c/algos/i2c-algo-bit.c3
11 files changed, 129 insertions, 162 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
index b8397282153b..c0f19f572004 100644
--- a/drivers/gpu/drm/i915/i915_drv.h
+++ b/drivers/gpu/drm/i915/i915_drv.h
@@ -35,6 +35,7 @@
35#include "intel_ringbuffer.h" 35#include "intel_ringbuffer.h"
36#include <linux/io-mapping.h> 36#include <linux/io-mapping.h>
37#include <linux/i2c.h> 37#include <linux/i2c.h>
38#include <linux/i2c-algo-bit.h>
38#include <drm/intel-gtt.h> 39#include <drm/intel-gtt.h>
39#include <linux/backlight.h> 40#include <linux/backlight.h>
40 41
@@ -199,7 +200,7 @@ struct drm_i915_error_state {
199 u32 tiling:2; 200 u32 tiling:2;
200 u32 dirty:1; 201 u32 dirty:1;
201 u32 purgeable:1; 202 u32 purgeable:1;
202 u32 ring:4; 203 s32 ring:4;
203 u32 cache_level:2; 204 u32 cache_level:2;
204 } *active_bo, *pinned_bo; 205 } *active_bo, *pinned_bo;
205 u32 active_bo_count, pinned_bo_count; 206 u32 active_bo_count, pinned_bo_count;
@@ -298,6 +299,16 @@ enum intel_pch {
298struct intel_fbdev; 299struct intel_fbdev;
299struct intel_fbc_work; 300struct intel_fbc_work;
300 301
302struct intel_gmbus {
303 struct i2c_adapter adapter;
304 bool force_bit;
305 bool has_gpio;
306 u32 reg0;
307 u32 gpio_reg;
308 struct i2c_algo_bit_data bit_algo;
309 struct drm_i915_private *dev_priv;
310};
311
301typedef struct drm_i915_private { 312typedef struct drm_i915_private {
302 struct drm_device *dev; 313 struct drm_device *dev;
303 314
@@ -315,11 +326,7 @@ typedef struct drm_i915_private {
315 /** gt_lock is also taken in irq contexts. */ 326 /** gt_lock is also taken in irq contexts. */
316 struct spinlock gt_lock; 327 struct spinlock gt_lock;
317 328
318 struct intel_gmbus { 329 struct intel_gmbus *gmbus;
319 struct i2c_adapter adapter;
320 struct i2c_adapter *force_bit;
321 u32 reg0;
322 } *gmbus;
323 330
324 /** gmbus_mutex protects against concurrent usage of the single hw gmbus 331 /** gmbus_mutex protects against concurrent usage of the single hw gmbus
325 * controller on different i2c buses. */ 332 * controller on different i2c buses. */
diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
index 19a06c280b12..1f441f5c2405 100644
--- a/drivers/gpu/drm/i915/i915_gem.c
+++ b/drivers/gpu/drm/i915/i915_gem.c
@@ -1985,11 +1985,6 @@ i915_wait_request(struct intel_ring_buffer *ring,
1985 if (atomic_read(&dev_priv->mm.wedged)) 1985 if (atomic_read(&dev_priv->mm.wedged))
1986 ret = -EAGAIN; 1986 ret = -EAGAIN;
1987 1987
1988 if (ret && ret != -ERESTARTSYS)
1989 DRM_ERROR("%s returns %d (awaiting %d at %d, next %d)\n",
1990 __func__, ret, seqno, ring->get_seqno(ring),
1991 dev_priv->next_seqno);
1992
1993 /* Directly dispatch request retiring. While we have the work queue 1988 /* Directly dispatch request retiring. While we have the work queue
1994 * to handle this, the waiter on a request often wants an associated 1989 * to handle this, the waiter on a request often wants an associated
1995 * buffer to have made it to the inactive list, and we would need 1990 * buffer to have made it to the inactive list, and we would need
@@ -3069,10 +3064,13 @@ i915_gem_object_finish_gpu(struct drm_i915_gem_object *obj)
3069 return ret; 3064 return ret;
3070 } 3065 }
3071 3066
3067 ret = i915_gem_object_wait_rendering(obj);
3068 if (ret)
3069 return ret;
3070
3072 /* Ensure that we invalidate the GPU's caches and TLBs. */ 3071 /* Ensure that we invalidate the GPU's caches and TLBs. */
3073 obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS; 3072 obj->base.read_domains &= ~I915_GEM_GPU_DOMAINS;
3074 3073 return 0;
3075 return i915_gem_object_wait_rendering(obj);
3076} 3074}
3077 3075
3078/** 3076/**
diff --git a/drivers/gpu/drm/i915/i915_gem_evict.c b/drivers/gpu/drm/i915/i915_gem_evict.c
index 097119caa36a..21a82710f4b2 100644
--- a/drivers/gpu/drm/i915/i915_gem_evict.c
+++ b/drivers/gpu/drm/i915/i915_gem_evict.c
@@ -36,7 +36,6 @@ static bool
36mark_free(struct drm_i915_gem_object *obj, struct list_head *unwind) 36mark_free(struct drm_i915_gem_object *obj, struct list_head *unwind)
37{ 37{
38 list_add(&obj->exec_list, unwind); 38 list_add(&obj->exec_list, unwind);
39 drm_gem_object_reference(&obj->base);
40 return drm_mm_scan_add_block(obj->gtt_space); 39 return drm_mm_scan_add_block(obj->gtt_space);
41} 40}
42 41
@@ -49,21 +48,6 @@ i915_gem_evict_something(struct drm_device *dev, int min_size,
49 struct drm_i915_gem_object *obj; 48 struct drm_i915_gem_object *obj;
50 int ret = 0; 49 int ret = 0;
51 50
52 i915_gem_retire_requests(dev);
53
54 /* Re-check for free space after retiring requests */
55 if (mappable) {
56 if (drm_mm_search_free_in_range(&dev_priv->mm.gtt_space,
57 min_size, alignment, 0,
58 dev_priv->mm.gtt_mappable_end,
59 0))
60 return 0;
61 } else {
62 if (drm_mm_search_free(&dev_priv->mm.gtt_space,
63 min_size, alignment, 0))
64 return 0;
65 }
66
67 trace_i915_gem_evict(dev, min_size, alignment, mappable); 51 trace_i915_gem_evict(dev, min_size, alignment, mappable);
68 52
69 /* 53 /*
@@ -139,7 +123,6 @@ i915_gem_evict_something(struct drm_device *dev, int min_size,
139 BUG_ON(ret); 123 BUG_ON(ret);
140 124
141 list_del_init(&obj->exec_list); 125 list_del_init(&obj->exec_list);
142 drm_gem_object_unreference(&obj->base);
143 } 126 }
144 127
145 /* We expect the caller to unpin, evict all and try again, or give up. 128 /* We expect the caller to unpin, evict all and try again, or give up.
@@ -158,10 +141,10 @@ found:
158 exec_list); 141 exec_list);
159 if (drm_mm_scan_remove_block(obj->gtt_space)) { 142 if (drm_mm_scan_remove_block(obj->gtt_space)) {
160 list_move(&obj->exec_list, &eviction_list); 143 list_move(&obj->exec_list, &eviction_list);
144 drm_gem_object_reference(&obj->base);
161 continue; 145 continue;
162 } 146 }
163 list_del_init(&obj->exec_list); 147 list_del_init(&obj->exec_list);
164 drm_gem_object_unreference(&obj->base);
165 } 148 }
166 149
167 /* Unbinding will emit any required flushes */ 150 /* Unbinding will emit any required flushes */
diff --git a/drivers/gpu/drm/i915/intel_bios.c b/drivers/gpu/drm/i915/intel_bios.c
index 50656339d922..8168d8f8a634 100644
--- a/drivers/gpu/drm/i915/intel_bios.c
+++ b/drivers/gpu/drm/i915/intel_bios.c
@@ -669,7 +669,7 @@ intel_parse_bios(struct drm_device *dev)
669 } 669 }
670 670
671 if (!vbt) { 671 if (!vbt) {
672 DRM_ERROR("VBT signature missing\n"); 672 DRM_DEBUG_DRIVER("VBT signature missing\n");
673 pci_unmap_rom(pdev, bios); 673 pci_unmap_rom(pdev, bios);
674 return -1; 674 return -1;
675 } 675 }
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 0da4753e9a2d..72b292ae8796 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -9049,8 +9049,6 @@ struct intel_quirk {
9049}; 9049};
9050 9050
9051struct intel_quirk intel_quirks[] = { 9051struct intel_quirk intel_quirks[] = {
9052 /* HP Compaq 2730p needs pipe A force quirk (LP: #291555) */
9053 { 0x2a42, 0x103c, 0x30eb, quirk_pipea_force },
9054 /* HP Mini needs pipe A force quirk (LP: #322104) */ 9052 /* HP Mini needs pipe A force quirk (LP: #322104) */
9055 { 0x27ae, 0x103c, 0x361a, quirk_pipea_force }, 9053 { 0x27ae, 0x103c, 0x361a, quirk_pipea_force },
9056 9054
diff --git a/drivers/gpu/drm/i915/intel_dp.c b/drivers/gpu/drm/i915/intel_dp.c
index 39eccf908a69..110552ff302c 100644
--- a/drivers/gpu/drm/i915/intel_dp.c
+++ b/drivers/gpu/drm/i915/intel_dp.c
@@ -49,7 +49,7 @@ struct intel_dp {
49 uint32_t DP; 49 uint32_t DP;
50 uint8_t link_configuration[DP_LINK_CONFIGURATION_SIZE]; 50 uint8_t link_configuration[DP_LINK_CONFIGURATION_SIZE];
51 bool has_audio; 51 bool has_audio;
52 int force_audio; 52 enum hdmi_force_audio force_audio;
53 uint32_t color_range; 53 uint32_t color_range;
54 int dpms_mode; 54 int dpms_mode;
55 uint8_t link_bw; 55 uint8_t link_bw;
@@ -2116,8 +2116,8 @@ intel_dp_detect(struct drm_connector *connector, bool force)
2116 if (status != connector_status_connected) 2116 if (status != connector_status_connected)
2117 return status; 2117 return status;
2118 2118
2119 if (intel_dp->force_audio) { 2119 if (intel_dp->force_audio != HDMI_AUDIO_AUTO) {
2120 intel_dp->has_audio = intel_dp->force_audio > 0; 2120 intel_dp->has_audio = (intel_dp->force_audio == HDMI_AUDIO_ON);
2121 } else { 2121 } else {
2122 edid = intel_dp_get_edid(connector, &intel_dp->adapter); 2122 edid = intel_dp_get_edid(connector, &intel_dp->adapter);
2123 if (edid) { 2123 if (edid) {
@@ -2217,10 +2217,10 @@ intel_dp_set_property(struct drm_connector *connector,
2217 2217
2218 intel_dp->force_audio = i; 2218 intel_dp->force_audio = i;
2219 2219
2220 if (i == 0) 2220 if (i == HDMI_AUDIO_AUTO)
2221 has_audio = intel_dp_detect_audio(connector); 2221 has_audio = intel_dp_detect_audio(connector);
2222 else 2222 else
2223 has_audio = i > 0; 2223 has_audio = (i == HDMI_AUDIO_ON);
2224 2224
2225 if (has_audio == intel_dp->has_audio) 2225 if (has_audio == intel_dp->has_audio)
2226 return 0; 2226 return 0;
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
index 068617f7256a..601c86e664af 100644
--- a/drivers/gpu/drm/i915/intel_i2c.c
+++ b/drivers/gpu/drm/i915/intel_i2c.c
@@ -45,13 +45,6 @@ to_intel_gmbus(struct i2c_adapter *i2c)
45 return container_of(i2c, struct intel_gmbus, adapter); 45 return container_of(i2c, struct intel_gmbus, adapter);
46} 46}
47 47
48struct intel_gpio {
49 struct i2c_adapter adapter;
50 struct i2c_algo_bit_data algo;
51 struct drm_i915_private *dev_priv;
52 u32 reg;
53};
54
55void 48void
56intel_i2c_reset(struct drm_device *dev) 49intel_i2c_reset(struct drm_device *dev)
57{ 50{
@@ -78,15 +71,15 @@ static void intel_i2c_quirk_set(struct drm_i915_private *dev_priv, bool enable)
78 I915_WRITE(DSPCLK_GATE_D, val); 71 I915_WRITE(DSPCLK_GATE_D, val);
79} 72}
80 73
81static u32 get_reserved(struct intel_gpio *gpio) 74static u32 get_reserved(struct intel_gmbus *bus)
82{ 75{
83 struct drm_i915_private *dev_priv = gpio->dev_priv; 76 struct drm_i915_private *dev_priv = bus->dev_priv;
84 struct drm_device *dev = dev_priv->dev; 77 struct drm_device *dev = dev_priv->dev;
85 u32 reserved = 0; 78 u32 reserved = 0;
86 79
87 /* On most chips, these bits must be preserved in software. */ 80 /* On most chips, these bits must be preserved in software. */
88 if (!IS_I830(dev) && !IS_845G(dev)) 81 if (!IS_I830(dev) && !IS_845G(dev))
89 reserved = I915_READ_NOTRACE(gpio->reg) & 82 reserved = I915_READ_NOTRACE(bus->gpio_reg) &
90 (GPIO_DATA_PULLUP_DISABLE | 83 (GPIO_DATA_PULLUP_DISABLE |
91 GPIO_CLOCK_PULLUP_DISABLE); 84 GPIO_CLOCK_PULLUP_DISABLE);
92 85
@@ -95,29 +88,29 @@ static u32 get_reserved(struct intel_gpio *gpio)
95 88
96static int get_clock(void *data) 89static int get_clock(void *data)
97{ 90{
98 struct intel_gpio *gpio = data; 91 struct intel_gmbus *bus = data;
99 struct drm_i915_private *dev_priv = gpio->dev_priv; 92 struct drm_i915_private *dev_priv = bus->dev_priv;
100 u32 reserved = get_reserved(gpio); 93 u32 reserved = get_reserved(bus);
101 I915_WRITE_NOTRACE(gpio->reg, reserved | GPIO_CLOCK_DIR_MASK); 94 I915_WRITE_NOTRACE(bus->gpio_reg, reserved | GPIO_CLOCK_DIR_MASK);
102 I915_WRITE_NOTRACE(gpio->reg, reserved); 95 I915_WRITE_NOTRACE(bus->gpio_reg, reserved);
103 return (I915_READ_NOTRACE(gpio->reg) & GPIO_CLOCK_VAL_IN) != 0; 96 return (I915_READ_NOTRACE(bus->gpio_reg) & GPIO_CLOCK_VAL_IN) != 0;
104} 97}
105 98
106static int get_data(void *data) 99static int get_data(void *data)
107{ 100{
108 struct intel_gpio *gpio = data; 101 struct intel_gmbus *bus = data;
109 struct drm_i915_private *dev_priv = gpio->dev_priv; 102 struct drm_i915_private *dev_priv = bus->dev_priv;
110 u32 reserved = get_reserved(gpio); 103 u32 reserved = get_reserved(bus);
111 I915_WRITE_NOTRACE(gpio->reg, reserved | GPIO_DATA_DIR_MASK); 104 I915_WRITE_NOTRACE(bus->gpio_reg, reserved | GPIO_DATA_DIR_MASK);
112 I915_WRITE_NOTRACE(gpio->reg, reserved); 105 I915_WRITE_NOTRACE(bus->gpio_reg, reserved);
113 return (I915_READ_NOTRACE(gpio->reg) & GPIO_DATA_VAL_IN) != 0; 106 return (I915_READ_NOTRACE(bus->gpio_reg) & GPIO_DATA_VAL_IN) != 0;
114} 107}
115 108
116static void set_clock(void *data, int state_high) 109static void set_clock(void *data, int state_high)
117{ 110{
118 struct intel_gpio *gpio = data; 111 struct intel_gmbus *bus = data;
119 struct drm_i915_private *dev_priv = gpio->dev_priv; 112 struct drm_i915_private *dev_priv = bus->dev_priv;
120 u32 reserved = get_reserved(gpio); 113 u32 reserved = get_reserved(bus);
121 u32 clock_bits; 114 u32 clock_bits;
122 115
123 if (state_high) 116 if (state_high)
@@ -126,15 +119,15 @@ static void set_clock(void *data, int state_high)
126 clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK | 119 clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK |
127 GPIO_CLOCK_VAL_MASK; 120 GPIO_CLOCK_VAL_MASK;
128 121
129 I915_WRITE_NOTRACE(gpio->reg, reserved | clock_bits); 122 I915_WRITE_NOTRACE(bus->gpio_reg, reserved | clock_bits);
130 POSTING_READ(gpio->reg); 123 POSTING_READ(bus->gpio_reg);
131} 124}
132 125
133static void set_data(void *data, int state_high) 126static void set_data(void *data, int state_high)
134{ 127{
135 struct intel_gpio *gpio = data; 128 struct intel_gmbus *bus = data;
136 struct drm_i915_private *dev_priv = gpio->dev_priv; 129 struct drm_i915_private *dev_priv = bus->dev_priv;
137 u32 reserved = get_reserved(gpio); 130 u32 reserved = get_reserved(bus);
138 u32 data_bits; 131 u32 data_bits;
139 132
140 if (state_high) 133 if (state_high)
@@ -143,13 +136,14 @@ static void set_data(void *data, int state_high)
143 data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK | 136 data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK |
144 GPIO_DATA_VAL_MASK; 137 GPIO_DATA_VAL_MASK;
145 138
146 I915_WRITE_NOTRACE(gpio->reg, reserved | data_bits); 139 I915_WRITE_NOTRACE(bus->gpio_reg, reserved | data_bits);
147 POSTING_READ(gpio->reg); 140 POSTING_READ(bus->gpio_reg);
148} 141}
149 142
150static struct i2c_adapter * 143static bool
151intel_gpio_create(struct drm_i915_private *dev_priv, u32 pin) 144intel_gpio_setup(struct intel_gmbus *bus, u32 pin)
152{ 145{
146 struct drm_i915_private *dev_priv = bus->dev_priv;
153 static const int map_pin_to_reg[] = { 147 static const int map_pin_to_reg[] = {
154 0, 148 0,
155 GPIOB, 149 GPIOB,
@@ -160,65 +154,48 @@ intel_gpio_create(struct drm_i915_private *dev_priv, u32 pin)
160 0, 154 0,
161 GPIOF, 155 GPIOF,
162 }; 156 };
163 struct intel_gpio *gpio; 157 struct i2c_algo_bit_data *algo;
164 158
165 if (pin >= ARRAY_SIZE(map_pin_to_reg) || !map_pin_to_reg[pin]) 159 if (pin >= ARRAY_SIZE(map_pin_to_reg) || !map_pin_to_reg[pin])
166 return NULL; 160 return false;
167 161
168 gpio = kzalloc(sizeof(struct intel_gpio), GFP_KERNEL); 162 algo = &bus->bit_algo;
169 if (gpio == NULL)
170 return NULL;
171 163
172 gpio->reg = map_pin_to_reg[pin]; 164 bus->gpio_reg = map_pin_to_reg[pin];
173 if (HAS_PCH_SPLIT(dev_priv->dev)) 165 if (HAS_PCH_SPLIT(dev_priv->dev))
174 gpio->reg += PCH_GPIOA - GPIOA; 166 bus->gpio_reg += PCH_GPIOA - GPIOA;
175 gpio->dev_priv = dev_priv; 167
176 168 bus->adapter.algo_data = algo;
177 snprintf(gpio->adapter.name, sizeof(gpio->adapter.name), 169 algo->setsda = set_data;
178 "i915 GPIO%c", "?BACDE?F"[pin]); 170 algo->setscl = set_clock;
179 gpio->adapter.owner = THIS_MODULE; 171 algo->getsda = get_data;
180 gpio->adapter.algo_data = &gpio->algo; 172 algo->getscl = get_clock;
181 gpio->adapter.dev.parent = &dev_priv->dev->pdev->dev; 173 algo->udelay = I2C_RISEFALL_TIME;
182 gpio->algo.setsda = set_data; 174 algo->timeout = usecs_to_jiffies(2200);
183 gpio->algo.setscl = set_clock; 175 algo->data = bus;
184 gpio->algo.getsda = get_data; 176
185 gpio->algo.getscl = get_clock; 177 return true;
186 gpio->algo.udelay = I2C_RISEFALL_TIME;
187 gpio->algo.timeout = usecs_to_jiffies(2200);
188 gpio->algo.data = gpio;
189
190 if (i2c_bit_add_bus(&gpio->adapter))
191 goto out_free;
192
193 return &gpio->adapter;
194
195out_free:
196 kfree(gpio);
197 return NULL;
198} 178}
199 179
200static int 180static int
201intel_i2c_quirk_xfer(struct drm_i915_private *dev_priv, 181intel_i2c_quirk_xfer(struct intel_gmbus *bus,
202 struct i2c_adapter *adapter,
203 struct i2c_msg *msgs, 182 struct i2c_msg *msgs,
204 int num) 183 int num)
205{ 184{
206 struct intel_gpio *gpio = container_of(adapter, 185 struct drm_i915_private *dev_priv = bus->dev_priv;
207 struct intel_gpio,
208 adapter);
209 int ret; 186 int ret;
210 187
211 intel_i2c_reset(dev_priv->dev); 188 intel_i2c_reset(dev_priv->dev);
212 189
213 intel_i2c_quirk_set(dev_priv, true); 190 intel_i2c_quirk_set(dev_priv, true);
214 set_data(gpio, 1); 191 set_data(bus, 1);
215 set_clock(gpio, 1); 192 set_clock(bus, 1);
216 udelay(I2C_RISEFALL_TIME); 193 udelay(I2C_RISEFALL_TIME);
217 194
218 ret = adapter->algo->master_xfer(adapter, msgs, num); 195 ret = i2c_bit_algo.master_xfer(&bus->adapter, msgs, num);
219 196
220 set_data(gpio, 1); 197 set_data(bus, 1);
221 set_clock(gpio, 1); 198 set_clock(bus, 1);
222 intel_i2c_quirk_set(dev_priv, false); 199 intel_i2c_quirk_set(dev_priv, false);
223 200
224 return ret; 201 return ret;
@@ -232,14 +209,13 @@ gmbus_xfer(struct i2c_adapter *adapter,
232 struct intel_gmbus *bus = container_of(adapter, 209 struct intel_gmbus *bus = container_of(adapter,
233 struct intel_gmbus, 210 struct intel_gmbus,
234 adapter); 211 adapter);
235 struct drm_i915_private *dev_priv = adapter->algo_data; 212 struct drm_i915_private *dev_priv = bus->dev_priv;
236 int i, reg_offset, ret; 213 int i, reg_offset, ret;
237 214
238 mutex_lock(&dev_priv->gmbus_mutex); 215 mutex_lock(&dev_priv->gmbus_mutex);
239 216
240 if (bus->force_bit) { 217 if (bus->force_bit) {
241 ret = intel_i2c_quirk_xfer(dev_priv, 218 ret = intel_i2c_quirk_xfer(bus, msgs, num);
242 bus->force_bit, msgs, num);
243 goto out; 219 goto out;
244 } 220 }
245 221
@@ -253,7 +229,8 @@ gmbus_xfer(struct i2c_adapter *adapter,
253 229
254 if (msgs[i].flags & I2C_M_RD) { 230 if (msgs[i].flags & I2C_M_RD) {
255 I915_WRITE(GMBUS1 + reg_offset, 231 I915_WRITE(GMBUS1 + reg_offset,
256 GMBUS_CYCLE_WAIT | (i + 1 == num ? GMBUS_CYCLE_STOP : 0) | 232 GMBUS_CYCLE_WAIT |
233 (i + 1 == num ? GMBUS_CYCLE_STOP : 0) |
257 (len << GMBUS_BYTE_COUNT_SHIFT) | 234 (len << GMBUS_BYTE_COUNT_SHIFT) |
258 (msgs[i].addr << GMBUS_SLAVE_ADDR_SHIFT) | 235 (msgs[i].addr << GMBUS_SLAVE_ADDR_SHIFT) |
259 GMBUS_SLAVE_READ | GMBUS_SW_RDY); 236 GMBUS_SLAVE_READ | GMBUS_SW_RDY);
@@ -282,7 +259,8 @@ gmbus_xfer(struct i2c_adapter *adapter,
282 259
283 I915_WRITE(GMBUS3 + reg_offset, val); 260 I915_WRITE(GMBUS3 + reg_offset, val);
284 I915_WRITE(GMBUS1 + reg_offset, 261 I915_WRITE(GMBUS1 + reg_offset,
285 (i + 1 == num ? GMBUS_CYCLE_STOP : GMBUS_CYCLE_WAIT) | 262 GMBUS_CYCLE_WAIT |
263 (i + 1 == num ? GMBUS_CYCLE_STOP : 0) |
286 (msgs[i].len << GMBUS_BYTE_COUNT_SHIFT) | 264 (msgs[i].len << GMBUS_BYTE_COUNT_SHIFT) |
287 (msgs[i].addr << GMBUS_SLAVE_ADDR_SHIFT) | 265 (msgs[i].addr << GMBUS_SLAVE_ADDR_SHIFT) |
288 GMBUS_SLAVE_WRITE | GMBUS_SW_RDY); 266 GMBUS_SLAVE_WRITE | GMBUS_SW_RDY);
@@ -321,9 +299,12 @@ clear_err:
321 I915_WRITE(GMBUS1 + reg_offset, 0); 299 I915_WRITE(GMBUS1 + reg_offset, 0);
322 300
323done: 301done:
324 /* Mark the GMBUS interface as disabled. We will re-enable it at the 302 /* Mark the GMBUS interface as disabled after waiting for idle.
325 * start of the next xfer, till then let it sleep. 303 * We will re-enable it at the start of the next xfer,
304 * till then let it sleep.
326 */ 305 */
306 if (wait_for((I915_READ(GMBUS2 + reg_offset) & GMBUS_ACTIVE) == 0, 10))
307 DRM_INFO("GMBUS timed out waiting for idle\n");
327 I915_WRITE(GMBUS0 + reg_offset, 0); 308 I915_WRITE(GMBUS0 + reg_offset, 0);
328 ret = i; 309 ret = i;
329 goto out; 310 goto out;
@@ -334,11 +315,12 @@ timeout:
334 I915_WRITE(GMBUS0 + reg_offset, 0); 315 I915_WRITE(GMBUS0 + reg_offset, 0);
335 316
336 /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */ 317 /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */
337 bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff); 318 if (!bus->has_gpio) {
338 if (!bus->force_bit) 319 ret = -EIO;
339 ret = -ENOMEM; 320 } else {
340 else 321 bus->force_bit = true;
341 ret = intel_i2c_quirk_xfer(dev_priv, bus->force_bit, msgs, num); 322 ret = intel_i2c_quirk_xfer(bus, msgs, num);
323 }
342out: 324out:
343 mutex_unlock(&dev_priv->gmbus_mutex); 325 mutex_unlock(&dev_priv->gmbus_mutex);
344 return ret; 326 return ret;
@@ -346,14 +328,8 @@ out:
346 328
347static u32 gmbus_func(struct i2c_adapter *adapter) 329static u32 gmbus_func(struct i2c_adapter *adapter)
348{ 330{
349 struct intel_gmbus *bus = container_of(adapter, 331 return i2c_bit_algo.functionality(adapter) &
350 struct intel_gmbus, 332 (I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
351 adapter);
352
353 if (bus->force_bit)
354 bus->force_bit->algo->functionality(bus->force_bit);
355
356 return (I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
357 /* I2C_FUNC_10BIT_ADDR | */ 333 /* I2C_FUNC_10BIT_ADDR | */
358 I2C_FUNC_SMBUS_READ_BLOCK_DATA | 334 I2C_FUNC_SMBUS_READ_BLOCK_DATA |
359 I2C_FUNC_SMBUS_BLOCK_PROC_CALL); 335 I2C_FUNC_SMBUS_BLOCK_PROC_CALL);
@@ -401,7 +377,7 @@ int intel_setup_gmbus(struct drm_device *dev)
401 names[i]); 377 names[i]);
402 378
403 bus->adapter.dev.parent = &dev->pdev->dev; 379 bus->adapter.dev.parent = &dev->pdev->dev;
404 bus->adapter.algo_data = dev_priv; 380 bus->dev_priv = dev_priv;
405 381
406 bus->adapter.algo = &gmbus_algorithm; 382 bus->adapter.algo = &gmbus_algorithm;
407 ret = i2c_add_adapter(&bus->adapter); 383 ret = i2c_add_adapter(&bus->adapter);
@@ -411,8 +387,11 @@ int intel_setup_gmbus(struct drm_device *dev)
411 /* By default use a conservative clock rate */ 387 /* By default use a conservative clock rate */
412 bus->reg0 = i | GMBUS_RATE_100KHZ; 388 bus->reg0 = i | GMBUS_RATE_100KHZ;
413 389
390 bus->has_gpio = intel_gpio_setup(bus, i);
391
414 /* XXX force bit banging until GMBUS is fully debugged */ 392 /* XXX force bit banging until GMBUS is fully debugged */
415 bus->force_bit = intel_gpio_create(dev_priv, i); 393 if (bus->has_gpio && IS_GEN2(dev))
394 bus->force_bit = true;
416 } 395 }
417 396
418 intel_i2c_reset(dev_priv->dev); 397 intel_i2c_reset(dev_priv->dev);
@@ -440,19 +419,8 @@ void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit)
440{ 419{
441 struct intel_gmbus *bus = to_intel_gmbus(adapter); 420 struct intel_gmbus *bus = to_intel_gmbus(adapter);
442 421
443 if (force_bit) { 422 if (bus->has_gpio)
444 if (bus->force_bit == NULL) { 423 bus->force_bit = force_bit;
445 struct drm_i915_private *dev_priv = adapter->algo_data;
446 bus->force_bit = intel_gpio_create(dev_priv,
447 bus->reg0 & 0xff);
448 }
449 } else {
450 if (bus->force_bit) {
451 i2c_del_adapter(bus->force_bit);
452 kfree(bus->force_bit);
453 bus->force_bit = NULL;
454 }
455 }
456} 424}
457 425
458void intel_teardown_gmbus(struct drm_device *dev) 426void intel_teardown_gmbus(struct drm_device *dev)
@@ -465,10 +433,6 @@ void intel_teardown_gmbus(struct drm_device *dev)
465 433
466 for (i = 0; i < GMBUS_NUM_PORTS; i++) { 434 for (i = 0; i < GMBUS_NUM_PORTS; i++) {
467 struct intel_gmbus *bus = &dev_priv->gmbus[i]; 435 struct intel_gmbus *bus = &dev_priv->gmbus[i];
468 if (bus->force_bit) {
469 i2c_del_adapter(bus->force_bit);
470 kfree(bus->force_bit);
471 }
472 i2c_del_adapter(&bus->adapter); 436 i2c_del_adapter(&bus->adapter);
473 } 437 }
474 438
diff --git a/drivers/gpu/drm/i915/intel_lvds.c b/drivers/gpu/drm/i915/intel_lvds.c
index b103c3b2bfee..c5c0973af8a1 100644
--- a/drivers/gpu/drm/i915/intel_lvds.c
+++ b/drivers/gpu/drm/i915/intel_lvds.c
@@ -739,6 +739,22 @@ static const struct dmi_system_id intel_no_lvds[] = {
739 DMI_MATCH(DMI_BOARD_NAME, "AT5NM10T-I"), 739 DMI_MATCH(DMI_BOARD_NAME, "AT5NM10T-I"),
740 }, 740 },
741 }, 741 },
742 {
743 .callback = intel_no_lvds_dmi_callback,
744 .ident = "Hewlett-Packard t5745",
745 .matches = {
746 DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
747 DMI_MATCH(DMI_BOARD_NAME, "hp t5745"),
748 },
749 },
750 {
751 .callback = intel_no_lvds_dmi_callback,
752 .ident = "Hewlett-Packard st5747",
753 .matches = {
754 DMI_MATCH(DMI_BOARD_VENDOR, "Hewlett-Packard"),
755 DMI_MATCH(DMI_BOARD_NAME, "hp st5747"),
756 },
757 },
742 758
743 { } /* terminating entry */ 759 { } /* terminating entry */
744}; 760};
diff --git a/drivers/gpu/drm/i915/intel_sdvo.c b/drivers/gpu/drm/i915/intel_sdvo.c
index 724190ec496b..e36b171c1e7d 100644
--- a/drivers/gpu/drm/i915/intel_sdvo.c
+++ b/drivers/gpu/drm/i915/intel_sdvo.c
@@ -148,7 +148,7 @@ struct intel_sdvo_connector {
148 /* Mark the type of connector */ 148 /* Mark the type of connector */
149 uint16_t output_flag; 149 uint16_t output_flag;
150 150
151 int force_audio; 151 enum hdmi_force_audio force_audio;
152 152
153 /* This contains all current supported TV format */ 153 /* This contains all current supported TV format */
154 u8 tv_format_supported[TV_FORMAT_NUM]; 154 u8 tv_format_supported[TV_FORMAT_NUM];
@@ -1309,8 +1309,8 @@ intel_sdvo_tmds_sink_detect(struct drm_connector *connector)
1309 1309
1310 if (status == connector_status_connected) { 1310 if (status == connector_status_connected) {
1311 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector); 1311 struct intel_sdvo_connector *intel_sdvo_connector = to_intel_sdvo_connector(connector);
1312 if (intel_sdvo_connector->force_audio) 1312 if (intel_sdvo_connector->force_audio != HDMI_AUDIO_AUTO)
1313 intel_sdvo->has_hdmi_audio = intel_sdvo_connector->force_audio > 0; 1313 intel_sdvo->has_hdmi_audio = (intel_sdvo_connector->force_audio == HDMI_AUDIO_ON);
1314 } 1314 }
1315 1315
1316 return status; 1316 return status;
@@ -1683,10 +1683,10 @@ intel_sdvo_set_property(struct drm_connector *connector,
1683 1683
1684 intel_sdvo_connector->force_audio = i; 1684 intel_sdvo_connector->force_audio = i;
1685 1685
1686 if (i == 0) 1686 if (i == HDMI_AUDIO_AUTO)
1687 has_audio = intel_sdvo_detect_hdmi_audio(connector); 1687 has_audio = intel_sdvo_detect_hdmi_audio(connector);
1688 else 1688 else
1689 has_audio = i > 0; 1689 has_audio = (i == HDMI_AUDIO_ON);
1690 1690
1691 if (has_audio == intel_sdvo->has_hdmi_audio) 1691 if (has_audio == intel_sdvo->has_hdmi_audio)
1692 return 0; 1692 return 0;
diff --git a/drivers/gpu/drm/nouveau/nouveau_i2c.c b/drivers/gpu/drm/nouveau/nouveau_i2c.c
index 820ae7f52044..8f4f914d9eab 100644
--- a/drivers/gpu/drm/nouveau/nouveau_i2c.c
+++ b/drivers/gpu/drm/nouveau/nouveau_i2c.c
@@ -277,7 +277,7 @@ i2c_bit_func(struct i2c_adapter *adap)
277 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL; 277 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
278} 278}
279 279
280const struct i2c_algorithm i2c_bit_algo = { 280const struct i2c_algorithm nouveau_i2c_bit_algo = {
281 .master_xfer = i2c_bit_xfer, 281 .master_xfer = i2c_bit_xfer,
282 .functionality = i2c_bit_func 282 .functionality = i2c_bit_func
283}; 283};
@@ -384,12 +384,12 @@ nouveau_i2c_init(struct drm_device *dev)
384 case 0: /* NV04:NV50 */ 384 case 0: /* NV04:NV50 */
385 port->drive = entry[0]; 385 port->drive = entry[0];
386 port->sense = entry[1]; 386 port->sense = entry[1];
387 port->adapter.algo = &i2c_bit_algo; 387 port->adapter.algo = &nouveau_i2c_bit_algo;
388 break; 388 break;
389 case 4: /* NV4E */ 389 case 4: /* NV4E */
390 port->drive = 0x600800 + entry[1]; 390 port->drive = 0x600800 + entry[1];
391 port->sense = port->drive; 391 port->sense = port->drive;
392 port->adapter.algo = &i2c_bit_algo; 392 port->adapter.algo = &nouveau_i2c_bit_algo;
393 break; 393 break;
394 case 5: /* NV50- */ 394 case 5: /* NV50- */
395 port->drive = entry[0] & 0x0f; 395 port->drive = entry[0] & 0x0f;
@@ -402,7 +402,7 @@ nouveau_i2c_init(struct drm_device *dev)
402 port->drive = 0x00d014 + (port->drive * 0x20); 402 port->drive = 0x00d014 + (port->drive * 0x20);
403 port->sense = port->drive; 403 port->sense = port->drive;
404 } 404 }
405 port->adapter.algo = &i2c_bit_algo; 405 port->adapter.algo = &nouveau_i2c_bit_algo;
406 break; 406 break;
407 case 6: /* NV50- DP AUX */ 407 case 6: /* NV50- DP AUX */
408 port->drive = entry[0]; 408 port->drive = entry[0];
diff --git a/drivers/i2c/algos/i2c-algo-bit.c b/drivers/i2c/algos/i2c-algo-bit.c
index 525c7345fa0b..ad0459c4c1cf 100644
--- a/drivers/i2c/algos/i2c-algo-bit.c
+++ b/drivers/i2c/algos/i2c-algo-bit.c
@@ -610,10 +610,11 @@ static u32 bit_func(struct i2c_adapter *adap)
610 610
611/* -----exported algorithm data: ------------------------------------- */ 611/* -----exported algorithm data: ------------------------------------- */
612 612
613static const struct i2c_algorithm i2c_bit_algo = { 613const struct i2c_algorithm i2c_bit_algo = {
614 .master_xfer = bit_xfer, 614 .master_xfer = bit_xfer,
615 .functionality = bit_func, 615 .functionality = bit_func,
616}; 616};
617EXPORT_SYMBOL(i2c_bit_algo);
617 618
618/* 619/*
619 * registering functions to load algorithms at runtime 620 * registering functions to load algorithms at runtime