diff options
author | Dave Airlie <airlied@redhat.com> | 2012-03-20 04:51:37 -0400 |
---|---|---|
committer | Dave Airlie <airlied@redhat.com> | 2012-03-20 04:51:37 -0400 |
commit | de49442f593c414415cac9c00b2b55b6d18b27d7 (patch) | |
tree | 44ba0dacf2ee42e02dc0d683c51b7a4ad65c0721 /drivers | |
parent | 654c59cf76a220866d1f74ab169bf469940c2d70 (diff) | |
parent | c501ae7f332cdaf42e31af30b72b4b66cbbb1604 (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.h | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem.c | 12 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/i915_gem_evict.c | 19 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_bios.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_display.c | 2 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_dp.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 190 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_lvds.c | 16 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_sdvo.c | 10 | ||||
-rw-r--r-- | drivers/gpu/drm/nouveau/nouveau_i2c.c | 8 | ||||
-rw-r--r-- | drivers/i2c/algos/i2c-algo-bit.c | 3 |
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 { | |||
298 | struct intel_fbdev; | 299 | struct intel_fbdev; |
299 | struct intel_fbc_work; | 300 | struct intel_fbc_work; |
300 | 301 | ||
302 | struct 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 | |||
301 | typedef struct drm_i915_private { | 312 | typedef 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 | |||
36 | mark_free(struct drm_i915_gem_object *obj, struct list_head *unwind) | 36 | mark_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 | ||
9051 | struct intel_quirk intel_quirks[] = { | 9051 | struct 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 | ||
48 | struct 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 | |||
55 | void | 48 | void |
56 | intel_i2c_reset(struct drm_device *dev) | 49 | intel_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 | ||
81 | static u32 get_reserved(struct intel_gpio *gpio) | 74 | static 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 | ||
96 | static int get_clock(void *data) | 89 | static 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 | ||
106 | static int get_data(void *data) | 99 | static 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 | ||
116 | static void set_clock(void *data, int state_high) | 109 | static 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 | ||
133 | static void set_data(void *data, int state_high) | 126 | static 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 | ||
150 | static struct i2c_adapter * | 143 | static bool |
151 | intel_gpio_create(struct drm_i915_private *dev_priv, u32 pin) | 144 | intel_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 | |||
195 | out_free: | ||
196 | kfree(gpio); | ||
197 | return NULL; | ||
198 | } | 178 | } |
199 | 179 | ||
200 | static int | 180 | static int |
201 | intel_i2c_quirk_xfer(struct drm_i915_private *dev_priv, | 181 | intel_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 | ||
323 | done: | 301 | done: |
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 | } | ||
342 | out: | 324 | out: |
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 | ||
347 | static u32 gmbus_func(struct i2c_adapter *adapter) | 329 | static 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 | ||
458 | void intel_teardown_gmbus(struct drm_device *dev) | 426 | void 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 | ||
280 | const struct i2c_algorithm i2c_bit_algo = { | 280 | const 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 | ||
613 | static const struct i2c_algorithm i2c_bit_algo = { | 613 | const 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 | }; |
617 | EXPORT_SYMBOL(i2c_bit_algo); | ||
617 | 618 | ||
618 | /* | 619 | /* |
619 | * registering functions to load algorithms at runtime | 620 | * registering functions to load algorithms at runtime |