diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-02-14 16:37:22 -0500 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2012-02-29 14:49:39 -0500 |
commit | 36c785f051b21728775c9c4f2621d37d586553d0 (patch) | |
tree | b188b3922945b0e0d28d15931489c779758e3901 /drivers | |
parent | b0209b39951868069710c1e39ca14add9fa77ada (diff) |
drm/i915: merge struct intel_gpio into struct intel_gmbus
When we set up the gpio fallback, we always have a 1:1 relationship
with an intel_gmbus. Exploit that to store all gpio related data in
there, too. This is a preparation step to merge the tw i2c adapters
controlling the same bus into one.
Just mundane code-munging in this patch.
Reviewed-by: Eugeni Dodonov <eugeni.dodonov@intel.com>
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gpu/drm/i915/i915_drv.h | 1 | ||||
-rw-r--r-- | drivers/gpu/drm/i915/intel_i2c.c | 144 |
2 files changed, 72 insertions, 73 deletions
diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h index 3cc2694a2b93..63cea5082229 100644 --- a/drivers/gpu/drm/i915/i915_drv.h +++ b/drivers/gpu/drm/i915/i915_drv.h | |||
@@ -302,6 +302,7 @@ struct intel_gmbus { | |||
302 | struct i2c_adapter adapter; | 302 | struct i2c_adapter adapter; |
303 | struct i2c_adapter *force_bit; | 303 | struct i2c_adapter *force_bit; |
304 | u32 reg0; | 304 | u32 reg0; |
305 | u32 gpio_reg; | ||
305 | struct drm_i915_private *dev_priv; | 306 | struct drm_i915_private *dev_priv; |
306 | }; | 307 | }; |
307 | 308 | ||
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c index 89346cc0bc4b..9dfedb0e00d4 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 struct i2c_adapter * |
151 | intel_gpio_create(struct drm_i915_private *dev_priv, u32 pin) | 144 | intel_gpio_create(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,69 @@ 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_adapter *adapter; |
158 | struct i2c_algo_bit_data *algo; | ||
164 | 159 | ||
165 | if (pin >= ARRAY_SIZE(map_pin_to_reg) || !map_pin_to_reg[pin]) | 160 | if (pin >= ARRAY_SIZE(map_pin_to_reg) || !map_pin_to_reg[pin]) |
166 | return NULL; | 161 | return NULL; |
167 | 162 | ||
168 | gpio = kzalloc(sizeof(struct intel_gpio), GFP_KERNEL); | 163 | adapter = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL); |
169 | if (gpio == NULL) | 164 | if (adapter == NULL) |
170 | return NULL; | 165 | return NULL; |
171 | 166 | ||
172 | gpio->reg = map_pin_to_reg[pin]; | 167 | algo = kzalloc(sizeof(struct i2c_algo_bit_data), GFP_KERNEL); |
168 | if (algo == NULL) | ||
169 | goto out_adap; | ||
170 | |||
171 | bus->gpio_reg = map_pin_to_reg[pin]; | ||
173 | if (HAS_PCH_SPLIT(dev_priv->dev)) | 172 | if (HAS_PCH_SPLIT(dev_priv->dev)) |
174 | gpio->reg += PCH_GPIOA - GPIOA; | 173 | bus->gpio_reg += PCH_GPIOA - GPIOA; |
175 | gpio->dev_priv = dev_priv; | ||
176 | 174 | ||
177 | snprintf(gpio->adapter.name, sizeof(gpio->adapter.name), | 175 | snprintf(adapter->name, sizeof(adapter->name), |
178 | "i915 GPIO%c", "?BACDE?F"[pin]); | 176 | "i915 GPIO%c", "?BACDE?F"[pin]); |
179 | gpio->adapter.owner = THIS_MODULE; | 177 | adapter->owner = THIS_MODULE; |
180 | gpio->adapter.algo_data = &gpio->algo; | 178 | adapter->algo_data = algo; |
181 | gpio->adapter.dev.parent = &dev_priv->dev->pdev->dev; | 179 | adapter->dev.parent = &dev_priv->dev->pdev->dev; |
182 | gpio->algo.setsda = set_data; | 180 | algo->setsda = set_data; |
183 | gpio->algo.setscl = set_clock; | 181 | algo->setscl = set_clock; |
184 | gpio->algo.getsda = get_data; | 182 | algo->getsda = get_data; |
185 | gpio->algo.getscl = get_clock; | 183 | algo->getscl = get_clock; |
186 | gpio->algo.udelay = I2C_RISEFALL_TIME; | 184 | algo->udelay = I2C_RISEFALL_TIME; |
187 | gpio->algo.timeout = usecs_to_jiffies(2200); | 185 | algo->timeout = usecs_to_jiffies(2200); |
188 | gpio->algo.data = gpio; | 186 | algo->data = bus; |
189 | 187 | ||
190 | if (i2c_bit_add_bus(&gpio->adapter)) | 188 | if (i2c_bit_add_bus(adapter)) |
191 | goto out_free; | 189 | goto out_algo; |
192 | 190 | ||
193 | return &gpio->adapter; | 191 | return adapter; |
194 | 192 | ||
195 | out_free: | 193 | out_algo: |
196 | kfree(gpio); | 194 | kfree(algo); |
195 | out_adap: | ||
196 | kfree(adapter); | ||
197 | return NULL; | 197 | return NULL; |
198 | } | 198 | } |
199 | 199 | ||
200 | static int | 200 | static int |
201 | intel_i2c_quirk_xfer(struct drm_i915_private *dev_priv, | 201 | intel_i2c_quirk_xfer(struct intel_gmbus *bus, |
202 | struct i2c_adapter *adapter, | 202 | struct i2c_adapter *adapter, |
203 | struct i2c_msg *msgs, | 203 | struct i2c_msg *msgs, |
204 | int num) | 204 | int num) |
205 | { | 205 | { |
206 | struct intel_gpio *gpio = container_of(adapter, | 206 | struct drm_i915_private *dev_priv = bus->dev_priv; |
207 | struct intel_gpio, | ||
208 | adapter); | ||
209 | int ret; | 207 | int ret; |
210 | 208 | ||
211 | intel_i2c_reset(dev_priv->dev); | 209 | intel_i2c_reset(dev_priv->dev); |
212 | 210 | ||
213 | intel_i2c_quirk_set(dev_priv, true); | 211 | intel_i2c_quirk_set(dev_priv, true); |
214 | set_data(gpio, 1); | 212 | set_data(bus, 1); |
215 | set_clock(gpio, 1); | 213 | set_clock(bus, 1); |
216 | udelay(I2C_RISEFALL_TIME); | 214 | udelay(I2C_RISEFALL_TIME); |
217 | 215 | ||
218 | ret = adapter->algo->master_xfer(adapter, msgs, num); | 216 | ret = adapter->algo->master_xfer(adapter, msgs, num); |
219 | 217 | ||
220 | set_data(gpio, 1); | 218 | set_data(bus, 1); |
221 | set_clock(gpio, 1); | 219 | set_clock(bus, 1); |
222 | intel_i2c_quirk_set(dev_priv, false); | 220 | intel_i2c_quirk_set(dev_priv, false); |
223 | 221 | ||
224 | return ret; | 222 | return ret; |
@@ -238,8 +236,7 @@ gmbus_xfer(struct i2c_adapter *adapter, | |||
238 | mutex_lock(&dev_priv->gmbus_mutex); | 236 | mutex_lock(&dev_priv->gmbus_mutex); |
239 | 237 | ||
240 | if (bus->force_bit) { | 238 | if (bus->force_bit) { |
241 | ret = intel_i2c_quirk_xfer(dev_priv, | 239 | ret = intel_i2c_quirk_xfer(bus, bus->force_bit, msgs, num); |
242 | bus->force_bit, msgs, num); | ||
243 | goto out; | 240 | goto out; |
244 | } | 241 | } |
245 | 242 | ||
@@ -339,11 +336,11 @@ timeout: | |||
339 | I915_WRITE(GMBUS0 + reg_offset, 0); | 336 | I915_WRITE(GMBUS0 + reg_offset, 0); |
340 | 337 | ||
341 | /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */ | 338 | /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */ |
342 | bus->force_bit = intel_gpio_create(dev_priv, bus->reg0 & 0xff); | 339 | bus->force_bit = intel_gpio_create(bus, bus->reg0 & 0xff); |
343 | if (!bus->force_bit) | 340 | if (!bus->force_bit) |
344 | ret = -ENOMEM; | 341 | ret = -ENOMEM; |
345 | else | 342 | else |
346 | ret = intel_i2c_quirk_xfer(dev_priv, bus->force_bit, msgs, num); | 343 | ret = intel_i2c_quirk_xfer(bus, bus->force_bit, msgs, num); |
347 | out: | 344 | out: |
348 | mutex_unlock(&dev_priv->gmbus_mutex); | 345 | mutex_unlock(&dev_priv->gmbus_mutex); |
349 | return ret; | 346 | return ret; |
@@ -417,7 +414,7 @@ int intel_setup_gmbus(struct drm_device *dev) | |||
417 | bus->reg0 = i | GMBUS_RATE_100KHZ; | 414 | bus->reg0 = i | GMBUS_RATE_100KHZ; |
418 | 415 | ||
419 | /* XXX force bit banging until GMBUS is fully debugged */ | 416 | /* XXX force bit banging until GMBUS is fully debugged */ |
420 | bus->force_bit = intel_gpio_create(dev_priv, i); | 417 | bus->force_bit = intel_gpio_create(bus, i); |
421 | } | 418 | } |
422 | 419 | ||
423 | intel_i2c_reset(dev_priv->dev); | 420 | intel_i2c_reset(dev_priv->dev); |
@@ -447,13 +444,13 @@ void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit) | |||
447 | 444 | ||
448 | if (force_bit) { | 445 | if (force_bit) { |
449 | if (bus->force_bit == NULL) { | 446 | if (bus->force_bit == NULL) { |
450 | struct drm_i915_private *dev_priv = bus->dev_priv; | 447 | bus->force_bit = intel_gpio_create(bus, |
451 | bus->force_bit = intel_gpio_create(dev_priv, | ||
452 | bus->reg0 & 0xff); | 448 | bus->reg0 & 0xff); |
453 | } | 449 | } |
454 | } else { | 450 | } else { |
455 | if (bus->force_bit) { | 451 | if (bus->force_bit) { |
456 | i2c_del_adapter(bus->force_bit); | 452 | i2c_del_adapter(bus->force_bit); |
453 | kfree(bus->force_bit->algo); | ||
457 | kfree(bus->force_bit); | 454 | kfree(bus->force_bit); |
458 | bus->force_bit = NULL; | 455 | bus->force_bit = NULL; |
459 | } | 456 | } |
@@ -472,6 +469,7 @@ void intel_teardown_gmbus(struct drm_device *dev) | |||
472 | struct intel_gmbus *bus = &dev_priv->gmbus[i]; | 469 | struct intel_gmbus *bus = &dev_priv->gmbus[i]; |
473 | if (bus->force_bit) { | 470 | if (bus->force_bit) { |
474 | i2c_del_adapter(bus->force_bit); | 471 | i2c_del_adapter(bus->force_bit); |
472 | kfree(bus->force_bit->algo); | ||
475 | kfree(bus->force_bit); | 473 | kfree(bus->force_bit); |
476 | } | 474 | } |
477 | i2c_del_adapter(&bus->adapter); | 475 | i2c_del_adapter(&bus->adapter); |