aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorDaniel Vetter <daniel.vetter@ffwll.ch>2012-02-14 16:37:22 -0500
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-02-29 14:49:39 -0500
commit36c785f051b21728775c9c4f2621d37d586553d0 (patch)
treeb188b3922945b0e0d28d15931489c779758e3901 /drivers
parentb0209b39951868069710c1e39ca14add9fa77ada (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.h1
-rw-r--r--drivers/gpu/drm/i915/intel_i2c.c144
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
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 struct i2c_adapter *
151intel_gpio_create(struct drm_i915_private *dev_priv, u32 pin) 144intel_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
195out_free: 193out_algo:
196 kfree(gpio); 194 kfree(algo);
195out_adap:
196 kfree(adapter);
197 return NULL; 197 return NULL;
198} 198}
199 199
200static int 200static int
201intel_i2c_quirk_xfer(struct drm_i915_private *dev_priv, 201intel_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);
347out: 344out:
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);