drm/i915/cnp: add CNP gmbus support
authorRodrigo Vivi <rodrigo.vivi@intel.com>
Fri, 2 Jun 2017 20:06:43 +0000 (13:06 -0700)
committerRodrigo Vivi <rodrigo.vivi@intel.com>
Fri, 2 Jun 2017 20:59:32 +0000 (13:59 -0700)
On CNP PCH based platforms the gmbus is on the south display that
is on PCH. The existing implementation for previous platforms
already covers the need for CNP expect for the pin pair configuration
that follows similar definitions that we had on BXT.

v2: Don't drop "_BXT" as the indicator of the first platform
    supporting this pin numbers. Suggested by Daniel.
v3: Add missing else and fix register table since CNP GPIO_CTL
    starts on 0xC5014.
v4: Fix pin number and map according to the current available VBT.
    Re-add pin 4 for port D. Lost during some rebase.
v5: Use table as spec. If VBT is wrong it should be ignored.

Cc: Daniel Vetter <daniel.vetter@intel.com>
Cc: Jani Nikula <jani.nikula@intel.com>
Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Reviewed-by: Anusha Srivatsa <anusha.srivatsa@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1496434004-29812-5-git-send-email-rodrigo.vivi@intel.com
drivers/gpu/drm/i915/i915_reg.h
drivers/gpu/drm/i915/intel_hdmi.c
drivers/gpu/drm/i915/intel_i2c.c

index cb83fb7a8e0077c3f7d9da63d475fa272b26e8ab..1329420f4a1e984970c93f906c02b951f4177810 100644 (file)
@@ -2626,9 +2626,10 @@ enum skl_disp_power_wells {
 #define   GMBUS_PIN_DPB                5 /* SDVO, HDMIB */
 #define   GMBUS_PIN_DPD                6 /* HDMID */
 #define   GMBUS_PIN_RESERVED   7 /* 7 reserved */
-#define   GMBUS_PIN_1_BXT      1
+#define   GMBUS_PIN_1_BXT      1 /* BXT+ (atom) and CNP+ (big core) */
 #define   GMBUS_PIN_2_BXT      2
 #define   GMBUS_PIN_3_BXT      3
+#define   GMBUS_PIN_4_CNP      4
 #define   GMBUS_NUM_PINS       7 /* including 0 */
 #define GMBUS1                 _MMIO(dev_priv->gpio_mmio_base + 0x5104) /* command/status */
 #define   GMBUS_SW_CLR_INT     (1<<31)
index 41267ffb36248d13b9d7a7a300fc6ab6aac7185f..ec0779a52d5354a0d0f40aec373ec5e37661c622 100644 (file)
@@ -1802,19 +1802,21 @@ static u8 intel_hdmi_ddc_pin(struct drm_i915_private *dev_priv,
 
        switch (port) {
        case PORT_B:
-               if (IS_GEN9_LP(dev_priv))
+               if (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv))
                        ddc_pin = GMBUS_PIN_1_BXT;
                else
                        ddc_pin = GMBUS_PIN_DPB;
                break;
        case PORT_C:
-               if (IS_GEN9_LP(dev_priv))
+               if (IS_GEN9_LP(dev_priv) || HAS_PCH_CNP(dev_priv))
                        ddc_pin = GMBUS_PIN_2_BXT;
                else
                        ddc_pin = GMBUS_PIN_DPC;
                break;
        case PORT_D:
-               if (IS_CHERRYVIEW(dev_priv))
+               if (HAS_PCH_CNP(dev_priv))
+                       ddc_pin = GMBUS_PIN_4_CNP;
+               else if (IS_CHERRYVIEW(dev_priv))
                        ddc_pin = GMBUS_PIN_DPD_CHV;
                else
                        ddc_pin = GMBUS_PIN_DPD;
index b6401e8f1bd63ca5bb8d603174a585f1479db57d..3c9e00d4ba5a5bcb176a23ff12621368ba83f38c 100644 (file)
@@ -68,11 +68,20 @@ static const struct gmbus_pin gmbus_pins_bxt[] = {
        [GMBUS_PIN_3_BXT] = { "misc", GPIOD },
 };
 
+static const struct gmbus_pin gmbus_pins_cnp[] = {
+       [GMBUS_PIN_1_BXT] = { "dpb", GPIOB },
+       [GMBUS_PIN_2_BXT] = { "dpc", GPIOC },
+       [GMBUS_PIN_3_BXT] = { "misc", GPIOD },
+       [GMBUS_PIN_4_CNP] = { "dpd", GPIOE },
+};
+
 /* pin is expected to be valid */
 static const struct gmbus_pin *get_gmbus_pin(struct drm_i915_private *dev_priv,
                                             unsigned int pin)
 {
-       if (IS_GEN9_LP(dev_priv))
+       if (HAS_PCH_CNP(dev_priv))
+               return &gmbus_pins_cnp[pin];
+       else if (IS_GEN9_LP(dev_priv))
                return &gmbus_pins_bxt[pin];
        else if (IS_GEN9_BC(dev_priv))
                return &gmbus_pins_skl[pin];
@@ -87,7 +96,9 @@ bool intel_gmbus_is_valid_pin(struct drm_i915_private *dev_priv,
 {
        unsigned int size;
 
-       if (IS_GEN9_LP(dev_priv))
+       if (HAS_PCH_CNP(dev_priv))
+               size = ARRAY_SIZE(gmbus_pins_cnp);
+       else if (IS_GEN9_LP(dev_priv))
                size = ARRAY_SIZE(gmbus_pins_bxt);
        else if (IS_GEN9_BC(dev_priv))
                size = ARRAY_SIZE(gmbus_pins_skl);