diff options
author | Jani Nikula <jani.nikula@intel.com> | 2015-04-01 03:55:04 -0400 |
---|---|---|
committer | Daniel Vetter <daniel.vetter@ffwll.ch> | 2015-04-01 08:11:49 -0400 |
commit | 5ea6e5e36ee54a83dfef9739f006a6a91d00e7fe (patch) | |
tree | aa78280adc83da23560f516caebcd2c597b059ad /drivers/gpu/drm/i915/intel_i2c.c | |
parent | 0184df465efc3b0a09e6999437ca4925567acf28 (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.c | 65 |
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 | ||
37 | struct gmbus_port { | 37 | struct gmbus_pin { |
38 | const char *name; | 38 | const char *name; |
39 | int reg; | 39 | int reg; |
40 | }; | 40 | }; |
41 | 41 | ||
42 | static const struct gmbus_port gmbus_ports[] = { | 42 | /* Map gmbus pin pairs to names and registers. */ |
43 | { "ssc", GPIOB }, | 43 | static 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 | ||
184 | static void | 185 | static void |
185 | intel_gpio_setup(struct intel_gmbus *bus, u32 pin) | 186 | intel_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 = { | |||
517 | int intel_setup_gmbus(struct drm_device *dev) | 517 | int 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 | ||
568 | err: | 572 | err: |
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: | |||
576 | struct i2c_adapter *intel_gmbus_get_adapter(struct drm_i915_private *dev_priv, | 583 | struct 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 | ||
585 | void intel_gmbus_set_speed(struct i2c_adapter *adapter, int speed) | 592 | void 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) | |||
602 | void intel_teardown_gmbus(struct drm_device *dev) | 609 | void 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 | } |