aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_i2c.c
diff options
context:
space:
mode:
authorJani Nikula <jani.nikula@intel.com>2015-04-01 03:55:04 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2015-04-01 08:11:49 -0400
commit5ea6e5e36ee54a83dfef9739f006a6a91d00e7fe (patch)
treeaa78280adc83da23560f516caebcd2c597b059ad /drivers/gpu/drm/i915/intel_i2c.c
parent0184df465efc3b0a09e6999437ca4925567acf28 (diff)
drm/i915: index gmbus tables using the pin pair number
Index the gmbus tables directly using the pin instead of having a confusing "port = i + 1" mapping. This finishes off removing the "gmbus port" as a notion, and leaves us with just the "gmbus pin". As pin 0 is invalid by definition and the gmbus tables will have a gap at that index, add pin validity check to all the loops. This will be benefitial for supporting platforms that have different numbers of pins, or gaps. v2: s/GMBUS_PIN_MAX/GMBUS_NUM_PINS/ (Ville, Daniel) Reviewed-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Signed-off-by: Jani Nikula <jani.nikula@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_i2c.c')
-rw-r--r--drivers/gpu/drm/i915/intel_i2c.c65
1 files changed, 38 insertions, 27 deletions
diff --git a/drivers/gpu/drm/i915/intel_i2c.c b/drivers/gpu/drm/i915/intel_i2c.c
index b0003a2bd854..ff47a8fdcb6d 100644
--- a/drivers/gpu/drm/i915/intel_i2c.c
+++ b/drivers/gpu/drm/i915/intel_i2c.c
@@ -34,18 +34,19 @@
34#include <drm/i915_drm.h> 34#include <drm/i915_drm.h>
35#include "i915_drv.h" 35#include "i915_drv.h"
36 36
37struct gmbus_port { 37struct gmbus_pin {
38 const char *name; 38 const char *name;
39 int reg; 39 int reg;
40}; 40};
41 41
42static const struct gmbus_port gmbus_ports[] = { 42/* Map gmbus pin pairs to names and registers. */
43 { "ssc", GPIOB }, 43static const struct gmbus_pin gmbus_pins[] = {
44 { "vga", GPIOA }, 44 [GMBUS_PIN_SSC] = { "ssc", GPIOB },
45 { "panel", GPIOC }, 45 [GMBUS_PIN_VGADDC] = { "vga", GPIOA },
46 { "dpc", GPIOD }, 46 [GMBUS_PIN_PANEL] = { "panel", GPIOC },
47 { "dpb", GPIOE }, 47 [GMBUS_PIN_DPC] = { "dpc", GPIOD },
48 { "dpd", GPIOF }, 48 [GMBUS_PIN_DPB] = { "dpb", GPIOE },
49 [GMBUS_PIN_DPD] = { "dpd", GPIOF },
49}; 50};
50 51
51/* Intel GPIO access functions */ 52/* Intel GPIO access functions */
@@ -182,15 +183,14 @@ intel_gpio_post_xfer(struct i2c_adapter *adapter)
182} 183}
183 184
184static void 185static void
185intel_gpio_setup(struct intel_gmbus *bus, u32 pin) 186intel_gpio_setup(struct intel_gmbus *bus, unsigned int pin)
186{ 187{
187 struct drm_i915_private *dev_priv = bus->dev_priv; 188 struct drm_i915_private *dev_priv = bus->dev_priv;
188 struct i2c_algo_bit_data *algo; 189 struct i2c_algo_bit_data *algo;
189 190
190 algo = &bus->bit_algo; 191 algo = &bus->bit_algo;
191 192
192 /* -1 to map pin pair to gmbus index */ 193 bus->gpio_reg = dev_priv->gpio_mmio_base + gmbus_pins[pin].reg;
193 bus->gpio_reg = dev_priv->gpio_mmio_base + gmbus_ports[pin - 1].reg;
194 194
195 bus->adapter.algo_data = algo; 195 bus->adapter.algo_data = algo;
196 algo->setsda = set_data; 196 algo->setsda = set_data;
@@ -517,7 +517,9 @@ static const struct i2c_algorithm gmbus_algorithm = {
517int intel_setup_gmbus(struct drm_device *dev) 517int intel_setup_gmbus(struct drm_device *dev)
518{ 518{
519 struct drm_i915_private *dev_priv = dev->dev_private; 519 struct drm_i915_private *dev_priv = dev->dev_private;
520 int ret, i; 520 struct intel_gmbus *bus;
521 unsigned int pin;
522 int ret;
521 523
522 if (HAS_PCH_NOP(dev)) 524 if (HAS_PCH_NOP(dev))
523 return 0; 525 return 0;
@@ -531,16 +533,18 @@ int intel_setup_gmbus(struct drm_device *dev)
531 mutex_init(&dev_priv->gmbus_mutex); 533 mutex_init(&dev_priv->gmbus_mutex);
532 init_waitqueue_head(&dev_priv->gmbus_wait_queue); 534 init_waitqueue_head(&dev_priv->gmbus_wait_queue);
533 535
534 for (i = 0; i < GMBUS_NUM_PORTS; i++) { 536 for (pin = 0; pin < ARRAY_SIZE(dev_priv->gmbus); pin++) {
535 struct intel_gmbus *bus = &dev_priv->gmbus[i]; 537 if (!intel_gmbus_is_valid_pin(pin))
536 u32 port = i + 1; /* +1 to map gmbus index to pin pair */ 538 continue;
539
540 bus = &dev_priv->gmbus[pin];
537 541
538 bus->adapter.owner = THIS_MODULE; 542 bus->adapter.owner = THIS_MODULE;
539 bus->adapter.class = I2C_CLASS_DDC; 543 bus->adapter.class = I2C_CLASS_DDC;
540 snprintf(bus->adapter.name, 544 snprintf(bus->adapter.name,
541 sizeof(bus->adapter.name), 545 sizeof(bus->adapter.name),
542 "i915 gmbus %s", 546 "i915 gmbus %s",
543 gmbus_ports[i].name); 547 gmbus_pins[pin].name);
544 548
545 bus->adapter.dev.parent = &dev->pdev->dev; 549 bus->adapter.dev.parent = &dev->pdev->dev;
546 bus->dev_priv = dev_priv; 550 bus->dev_priv = dev_priv;
@@ -548,13 +552,13 @@ int intel_setup_gmbus(struct drm_device *dev)
548 bus->adapter.algo = &gmbus_algorithm; 552 bus->adapter.algo = &gmbus_algorithm;
549 553
550 /* By default use a conservative clock rate */ 554 /* By default use a conservative clock rate */
551 bus->reg0 = port | GMBUS_RATE_100KHZ; 555 bus->reg0 = pin | GMBUS_RATE_100KHZ;
552 556
553 /* gmbus seems to be broken on i830 */ 557 /* gmbus seems to be broken on i830 */
554 if (IS_I830(dev)) 558 if (IS_I830(dev))
555 bus->force_bit = 1; 559 bus->force_bit = 1;
556 560
557 intel_gpio_setup(bus, port); 561 intel_gpio_setup(bus, pin);
558 562
559 ret = i2c_add_adapter(&bus->adapter); 563 ret = i2c_add_adapter(&bus->adapter);
560 if (ret) 564 if (ret)
@@ -566,8 +570,11 @@ int intel_setup_gmbus(struct drm_device *dev)
566 return 0; 570 return 0;
567 571
568err: 572err:
569 while (--i) { 573 while (--pin) {
570 struct intel_gmbus *bus = &dev_priv->gmbus[i]; 574 if (!intel_gmbus_is_valid_pin(pin))
575 continue;
576
577 bus = &dev_priv->gmbus[pin];
571 i2c_del_adapter(&bus->adapter); 578 i2c_del_adapter(&bus->adapter);
572 } 579 }
573 return ret; 580 return ret;
@@ -576,10 +583,10 @@ err:
576struct i2c_adapter *intel_gmbus_get_adapter(struct drm_i915_private *dev_priv, 583struct i2c_adapter *intel_gmbus_get_adapter(struct drm_i915_private *dev_priv,
577 unsigned int pin) 584 unsigned int pin)
578{ 585{
579 WARN_ON(!intel_gmbus_is_valid_pin(pin)); 586 if (WARN_ON(!intel_gmbus_is_valid_pin(pin)))
580 /* -1 to map pin pair to gmbus index */ 587 return NULL;
581 return (intel_gmbus_is_valid_pin(pin)) ? 588
582 &dev_priv->gmbus[pin - 1].adapter : NULL; 589 return &dev_priv->gmbus[pin].adapter;
583} 590}
584 591
585void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed) 592void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed)
@@ -602,10 +609,14 @@ void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit)
602void intel_teardown_gmbus(struct drm_device *dev) 609void intel_teardown_gmbus(struct drm_device *dev)
603{ 610{
604 struct drm_i915_private *dev_priv = dev->dev_private; 611 struct drm_i915_private *dev_priv = dev->dev_private;
605 int i; 612 struct intel_gmbus *bus;
613 unsigned int pin;
614
615 for (pin = 0; pin < ARRAY_SIZE(dev_priv->gmbus); pin++) {
616 if (!intel_gmbus_is_valid_pin(pin))
617 continue;
606 618
607 for (i = 0; i < GMBUS_NUM_PORTS; i++) { 619 bus = &dev_priv->gmbus[pin];
608 struct intel_gmbus *bus = &dev_priv->gmbus[i];
609 i2c_del_adapter(&bus->adapter); 620 i2c_del_adapter(&bus->adapter);
610 } 621 }
611} 622}