Subversion Repositories Kolibri OS

Rev

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;