Rev 6320 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6320 | Rev 6937 | ||
---|---|---|---|
Line 34... | Line 34... | ||
34 | #include |
34 | #include |
35 | #include "i915_drv.h" |
35 | #include "i915_drv.h" |
Line 36... | Line 36... | ||
36 | 36 | ||
37 | struct gmbus_pin { |
37 | struct gmbus_pin { |
38 | const char *name; |
38 | const char *name; |
39 | int reg; |
39 | i915_reg_t reg; |
Line 40... | Line 40... | ||
40 | }; |
40 | }; |
41 | 41 | ||
42 | /* Map gmbus pin pairs to names and registers. */ |
42 | /* Map gmbus pin pairs to names and registers. */ |
Line 61... | Line 61... | ||
61 | [GMBUS_PIN_DPB] = { "dpb", GPIOE }, |
61 | [GMBUS_PIN_DPB] = { "dpb", GPIOE }, |
62 | [GMBUS_PIN_DPD] = { "dpd", GPIOF }, |
62 | [GMBUS_PIN_DPD] = { "dpd", GPIOF }, |
63 | }; |
63 | }; |
Line 64... | Line 64... | ||
64 | 64 | ||
65 | static const struct gmbus_pin gmbus_pins_bxt[] = { |
65 | static const struct gmbus_pin gmbus_pins_bxt[] = { |
66 | [GMBUS_PIN_1_BXT] = { "dpb", PCH_GPIOB }, |
66 | [GMBUS_PIN_1_BXT] = { "dpb", GPIOB }, |
67 | [GMBUS_PIN_2_BXT] = { "dpc", PCH_GPIOC }, |
67 | [GMBUS_PIN_2_BXT] = { "dpc", GPIOC }, |
68 | [GMBUS_PIN_3_BXT] = { "misc", PCH_GPIOD }, |
68 | [GMBUS_PIN_3_BXT] = { "misc", GPIOD }, |
Line 69... | Line 69... | ||
69 | }; |
69 | }; |
70 | 70 | ||
71 | /* pin is expected to be valid */ |
71 | /* pin is expected to be valid */ |
72 | static const struct gmbus_pin *get_gmbus_pin(struct drm_i915_private *dev_priv, |
72 | static const struct gmbus_pin *get_gmbus_pin(struct drm_i915_private *dev_priv, |
73 | unsigned int pin) |
73 | unsigned int pin) |
74 | { |
74 | { |
75 | if (IS_BROXTON(dev_priv)) |
75 | if (IS_BROXTON(dev_priv)) |
76 | return &gmbus_pins_bxt[pin]; |
76 | return &gmbus_pins_bxt[pin]; |
77 | else if (IS_SKYLAKE(dev_priv)) |
77 | else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) |
78 | return &gmbus_pins_skl[pin]; |
78 | return &gmbus_pins_skl[pin]; |
79 | else if (IS_BROADWELL(dev_priv)) |
79 | else if (IS_BROADWELL(dev_priv)) |
80 | return &gmbus_pins_bdw[pin]; |
80 | return &gmbus_pins_bdw[pin]; |
Line 87... | Line 87... | ||
87 | { |
87 | { |
88 | unsigned int size; |
88 | unsigned int size; |
Line 89... | Line 89... | ||
89 | 89 | ||
90 | if (IS_BROXTON(dev_priv)) |
90 | if (IS_BROXTON(dev_priv)) |
91 | size = ARRAY_SIZE(gmbus_pins_bxt); |
91 | size = ARRAY_SIZE(gmbus_pins_bxt); |
92 | else if (IS_SKYLAKE(dev_priv)) |
92 | else if (IS_SKYLAKE(dev_priv) || IS_KABYLAKE(dev_priv)) |
93 | size = ARRAY_SIZE(gmbus_pins_skl); |
93 | size = ARRAY_SIZE(gmbus_pins_skl); |
94 | else if (IS_BROADWELL(dev_priv)) |
94 | else if (IS_BROADWELL(dev_priv)) |
95 | size = ARRAY_SIZE(gmbus_pins_bdw); |
95 | size = ARRAY_SIZE(gmbus_pins_bdw); |
96 | else |
96 | else |
Line -... | Line 97... | ||
- | 97 | size = ARRAY_SIZE(gmbus_pins); |
|
97 | size = ARRAY_SIZE(gmbus_pins); |
98 | |
98 | 99 | return pin < size && |
|
Line 99... | Line 100... | ||
99 | return pin < size && get_gmbus_pin(dev_priv, pin)->reg; |
100 | i915_mmio_reg_valid(get_gmbus_pin(dev_priv, pin)->reg); |
Line 100... | Line 101... | ||
100 | } |
101 | } |
Line 238... | Line 239... | ||
238 | struct drm_i915_private *dev_priv = bus->dev_priv; |
239 | struct drm_i915_private *dev_priv = bus->dev_priv; |
239 | struct i2c_algo_bit_data *algo; |
240 | struct i2c_algo_bit_data *algo; |
Line 240... | Line 241... | ||
240 | 241 | ||
Line 241... | Line 242... | ||
241 | algo = &bus->bit_algo; |
242 | algo = &bus->bit_algo; |
242 | 243 | ||
243 | bus->gpio_reg = dev_priv->gpio_mmio_base + |
- | |
244 | get_gmbus_pin(dev_priv, pin)->reg; |
244 | bus->gpio_reg = _MMIO(dev_priv->gpio_mmio_base + |
245 | 245 | i915_mmio_reg_offset(get_gmbus_pin(dev_priv, pin)->reg)); |
|
246 | bus->adapter.algo_data = algo; |
246 | bus->adapter.algo_data = algo; |
247 | algo->setsda = set_data; |
247 | algo->setsda = set_data; |
248 | algo->setscl = set_clock; |
248 | algo->setscl = set_clock; |
Line 470... | Line 470... | ||
470 | 470 | ||
471 | return ret; |
471 | return ret; |
Line 472... | Line 472... | ||
472 | } |
472 | } |
473 | 473 | ||
474 | static int |
- | |
475 | gmbus_xfer(struct i2c_adapter *adapter, |
- | |
476 | struct i2c_msg *msgs, |
474 | static int |
477 | int num) |
475 | do_gmbus_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num) |
478 | { |
476 | { |
479 | struct intel_gmbus *bus = container_of(adapter, |
477 | struct intel_gmbus *bus = container_of(adapter, |
480 | struct intel_gmbus, |
478 | struct intel_gmbus, |
481 | adapter); |
479 | adapter); |
482 | struct drm_i915_private *dev_priv = bus->dev_priv; |
480 | struct drm_i915_private *dev_priv = bus->dev_priv; |
Line 483... | Line -... | ||
483 | int i = 0, inc, try = 0; |
- | |
484 | int ret = 0; |
- | |
485 | - | ||
486 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
- | |
487 | mutex_lock(&dev_priv->gmbus_mutex); |
- | |
488 | - | ||
489 | if (bus->force_bit) { |
- | |
490 | ret = i2c_bit_algo.master_xfer(adapter, msgs, num); |
- | |
491 | goto out; |
481 | int i = 0, inc, try = 0; |
492 | } |
482 | int ret = 0; |
Line 493... | Line 483... | ||
493 | 483 | ||
494 | retry: |
484 | retry: |
Line 503... | Line 493... | ||
503 | ret = gmbus_xfer_read(dev_priv, &msgs[i], 0); |
493 | ret = gmbus_xfer_read(dev_priv, &msgs[i], 0); |
504 | } else { |
494 | } else { |
505 | ret = gmbus_xfer_write(dev_priv, &msgs[i]); |
495 | ret = gmbus_xfer_write(dev_priv, &msgs[i]); |
506 | } |
496 | } |
Line 507... | Line -... | ||
507 | - | ||
508 | if (ret == -ETIMEDOUT) |
- | |
509 | goto timeout; |
497 | |
510 | if (ret == -ENXIO) |
- | |
511 | goto clear_err; |
- | |
512 | 498 | if (!ret) |
|
513 | ret = gmbus_wait_hw_status(dev_priv, GMBUS_HW_WAIT_PHASE, |
499 | ret = gmbus_wait_hw_status(dev_priv, GMBUS_HW_WAIT_PHASE, |
514 | GMBUS_HW_WAIT_EN); |
500 | GMBUS_HW_WAIT_EN); |
515 | if (ret == -ENXIO) |
- | |
516 | goto clear_err; |
- | |
517 | if (ret) |
501 | if (ret == -ETIMEDOUT) |
- | 502 | goto timeout; |
|
- | 503 | else if (ret) |
|
518 | goto timeout; |
504 | goto clear_err; |
Line 519... | Line 505... | ||
519 | } |
505 | } |
520 | 506 | ||
521 | /* Generate a STOP condition on the bus. Note that gmbus can't generata |
507 | /* Generate a STOP condition on the bus. Note that gmbus can't generata |
Line 587... | Line 573... | ||
587 | timeout: |
573 | timeout: |
588 | DRM_INFO("GMBUS [%s] timed out, falling back to bit banging on pin %d\n", |
574 | DRM_INFO("GMBUS [%s] timed out, falling back to bit banging on pin %d\n", |
589 | bus->adapter.name, bus->reg0 & 0xff); |
575 | bus->adapter.name, bus->reg0 & 0xff); |
590 | I915_WRITE(GMBUS0, 0); |
576 | I915_WRITE(GMBUS0, 0); |
Line -... | Line 577... | ||
- | 577 | ||
591 | 578 | /* |
|
- | 579 | * Hardware may not support GMBUS over these pins? Try GPIO bitbanging |
|
- | 580 | * instead. Use EAGAIN to have i2c core retry. |
|
592 | /* Hardware may not support GMBUS over these pins? Try GPIO bitbanging instead. */ |
581 | */ |
593 | bus->force_bit = 1; |
582 | bus->force_bit = 1; |
Line 594... | Line 583... | ||
594 | ret = i2c_bit_algo.master_xfer(adapter, msgs, num); |
583 | ret = -EAGAIN; |
- | 584 | ||
- | 585 | out: |
|
- | 586 | return ret; |
|
- | 587 | } |
|
- | 588 | ||
- | 589 | static int |
|
- | 590 | gmbus_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num) |
|
- | 591 | { |
|
- | 592 | struct intel_gmbus *bus = container_of(adapter, struct intel_gmbus, |
|
- | 593 | adapter); |
|
- | 594 | struct drm_i915_private *dev_priv = bus->dev_priv; |
|
- | 595 | int ret; |
|
595 | 596 | ||
Line -... | Line 597... | ||
- | 597 | intel_display_power_get(dev_priv, POWER_DOMAIN_GMBUS); |
|
- | 598 | mutex_lock(&dev_priv->gmbus_mutex); |
|
- | 599 | ||
- | 600 | if (bus->force_bit) |
|
- | 601 | ret = i2c_bit_algo.master_xfer(adapter, msgs, num); |
|
- | 602 | else |
|
596 | out: |
603 | ret = do_gmbus_xfer(adapter, msgs, num); |
Line 597... | Line 604... | ||
597 | mutex_unlock(&dev_priv->gmbus_mutex); |
604 | |
598 | 605 | mutex_unlock(&dev_priv->gmbus_mutex); |
|
Line 626... | Line 633... | ||
626 | unsigned int pin; |
633 | unsigned int pin; |
627 | int ret; |
634 | int ret; |
Line 628... | Line 635... | ||
628 | 635 | ||
629 | if (HAS_PCH_NOP(dev)) |
636 | if (HAS_PCH_NOP(dev)) |
630 | return 0; |
- | |
631 | else if (HAS_PCH_SPLIT(dev)) |
- | |
- | 637 | return 0; |
|
632 | dev_priv->gpio_mmio_base = PCH_GPIOA - GPIOA; |
638 | |
633 | else if (IS_VALLEYVIEW(dev)) |
639 | if (IS_VALLEYVIEW(dev) || IS_CHERRYVIEW(dev)) |
634 | dev_priv->gpio_mmio_base = VLV_DISPLAY_BASE; |
640 | dev_priv->gpio_mmio_base = VLV_DISPLAY_BASE; |
635 | else |
641 | else if (!HAS_GMCH_DISPLAY(dev_priv)) |
- | 642 | dev_priv->gpio_mmio_base = |
|
- | 643 | i915_mmio_reg_offset(PCH_GPIOA) - |
|
Line 636... | Line 644... | ||
636 | dev_priv->gpio_mmio_base = 0; |
644 | i915_mmio_reg_offset(GPIOA); |
637 | 645 | ||
Line 638... | Line 646... | ||
638 | mutex_init(&dev_priv->gmbus_mutex); |
646 | mutex_init(&dev_priv->gmbus_mutex); |
Line 654... | Line 662... | ||
654 | bus->adapter.dev.parent = &dev->pdev->dev; |
662 | bus->adapter.dev.parent = &dev->pdev->dev; |
655 | bus->dev_priv = dev_priv; |
663 | bus->dev_priv = dev_priv; |
Line 656... | Line 664... | ||
656 | 664 | ||
Line -... | Line 665... | ||
- | 665 | bus->adapter.algo = &gmbus_algorithm; |
|
- | 666 | ||
- | 667 | /* |
|
- | 668 | * We wish to retry with bit banging |
|
- | 669 | * after a timed out GMBUS attempt. |
|
- | 670 | */ |
|
657 | bus->adapter.algo = &gmbus_algorithm; |
671 | bus->adapter.retries = 1; |
658 | 672 | ||
Line 659... | Line 673... | ||
659 | /* By default use a conservative clock rate */ |
673 | /* By default use a conservative clock rate */ |
660 | bus->reg0 = pin | GMBUS_RATE_100KHZ; |
674 | bus->reg0 = pin | GMBUS_RATE_100KHZ; |