xref: /openbsd-src/sys/dev/pci/drm/i915/display/intel_gmbus.c (revision f005ef32267c16bdb134f0e9fa4477dbe07c263a)
1c349dbc7Sjsg /*
2c349dbc7Sjsg  * Copyright (c) 2006 Dave Airlie <airlied@linux.ie>
3c349dbc7Sjsg  * Copyright © 2006-2008,2010 Intel Corporation
4c349dbc7Sjsg  *   Jesse Barnes <jesse.barnes@intel.com>
5c349dbc7Sjsg  *
6c349dbc7Sjsg  * Permission is hereby granted, free of charge, to any person obtaining a
7c349dbc7Sjsg  * copy of this software and associated documentation files (the "Software"),
8c349dbc7Sjsg  * to deal in the Software without restriction, including without limitation
9c349dbc7Sjsg  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10c349dbc7Sjsg  * and/or sell copies of the Software, and to permit persons to whom the
11c349dbc7Sjsg  * Software is furnished to do so, subject to the following conditions:
12c349dbc7Sjsg  *
13c349dbc7Sjsg  * The above copyright notice and this permission notice (including the next
14c349dbc7Sjsg  * paragraph) shall be included in all copies or substantial portions of the
15c349dbc7Sjsg  * Software.
16c349dbc7Sjsg  *
17c349dbc7Sjsg  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18c349dbc7Sjsg  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19c349dbc7Sjsg  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20c349dbc7Sjsg  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21c349dbc7Sjsg  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
22c349dbc7Sjsg  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
23c349dbc7Sjsg  * DEALINGS IN THE SOFTWARE.
24c349dbc7Sjsg  *
25c349dbc7Sjsg  * Authors:
26c349dbc7Sjsg  *	Eric Anholt <eric@anholt.net>
27c349dbc7Sjsg  *	Chris Wilson <chris@chris-wilson.co.uk>
28c349dbc7Sjsg  */
29c349dbc7Sjsg 
30c349dbc7Sjsg #include <linux/export.h>
31c349dbc7Sjsg #include <linux/i2c-algo-bit.h>
32c349dbc7Sjsg #include <linux/i2c.h>
33c349dbc7Sjsg 
341bb76ff1Sjsg #include <drm/display/drm_hdcp_helper.h>
35c349dbc7Sjsg 
36c349dbc7Sjsg #include "i915_drv.h"
37*f005ef32Sjsg #include "i915_irq.h"
38*f005ef32Sjsg #include "i915_reg.h"
395ca02815Sjsg #include "intel_de.h"
40c349dbc7Sjsg #include "intel_display_types.h"
41c349dbc7Sjsg #include "intel_gmbus.h"
421bb76ff1Sjsg #include "intel_gmbus_regs.h"
431bb76ff1Sjsg 
441bb76ff1Sjsg struct intel_gmbus {
451bb76ff1Sjsg 	struct i2c_adapter adapter;
461bb76ff1Sjsg #define GMBUS_FORCE_BIT_RETRY (1U << 31)
471bb76ff1Sjsg 	u32 force_bit;
481bb76ff1Sjsg 	u32 reg0;
491bb76ff1Sjsg 	i915_reg_t gpio_reg;
501bb76ff1Sjsg 	struct i2c_algo_bit_data bit_algo;
511bb76ff1Sjsg 	struct drm_i915_private *i915;
521bb76ff1Sjsg };
53c349dbc7Sjsg 
54*f005ef32Sjsg enum gmbus_gpio {
55*f005ef32Sjsg 	GPIOA,
56*f005ef32Sjsg 	GPIOB,
57*f005ef32Sjsg 	GPIOC,
58*f005ef32Sjsg 	GPIOD,
59*f005ef32Sjsg 	GPIOE,
60*f005ef32Sjsg 	GPIOF,
61*f005ef32Sjsg 	GPIOG,
62*f005ef32Sjsg 	GPIOH,
63*f005ef32Sjsg 	__GPIOI_UNUSED,
64*f005ef32Sjsg 	GPIOJ,
65*f005ef32Sjsg 	GPIOK,
66*f005ef32Sjsg 	GPIOL,
67*f005ef32Sjsg 	GPIOM,
68*f005ef32Sjsg 	GPION,
69*f005ef32Sjsg 	GPIOO,
70*f005ef32Sjsg };
71*f005ef32Sjsg 
72c349dbc7Sjsg #include <dev/i2c/i2cvar.h>
73c349dbc7Sjsg #include <dev/i2c/i2c_bitbang.h>
74c349dbc7Sjsg 
75c349dbc7Sjsg struct gmbus_pin {
76c349dbc7Sjsg 	const char *name;
77*f005ef32Sjsg 	enum gmbus_gpio gpio;
78c349dbc7Sjsg };
79c349dbc7Sjsg 
80c349dbc7Sjsg /* Map gmbus pin pairs to names and registers. */
81c349dbc7Sjsg static const struct gmbus_pin gmbus_pins[] = {
82c349dbc7Sjsg 	[GMBUS_PIN_SSC] = { "ssc", GPIOB },
83c349dbc7Sjsg 	[GMBUS_PIN_VGADDC] = { "vga", GPIOA },
84c349dbc7Sjsg 	[GMBUS_PIN_PANEL] = { "panel", GPIOC },
85c349dbc7Sjsg 	[GMBUS_PIN_DPC] = { "dpc", GPIOD },
86c349dbc7Sjsg 	[GMBUS_PIN_DPB] = { "dpb", GPIOE },
87c349dbc7Sjsg 	[GMBUS_PIN_DPD] = { "dpd", GPIOF },
88c349dbc7Sjsg };
89c349dbc7Sjsg 
90c349dbc7Sjsg static const struct gmbus_pin gmbus_pins_bdw[] = {
91c349dbc7Sjsg 	[GMBUS_PIN_VGADDC] = { "vga", GPIOA },
92c349dbc7Sjsg 	[GMBUS_PIN_DPC] = { "dpc", GPIOD },
93c349dbc7Sjsg 	[GMBUS_PIN_DPB] = { "dpb", GPIOE },
94c349dbc7Sjsg 	[GMBUS_PIN_DPD] = { "dpd", GPIOF },
95c349dbc7Sjsg };
96c349dbc7Sjsg 
97c349dbc7Sjsg static const struct gmbus_pin gmbus_pins_skl[] = {
98c349dbc7Sjsg 	[GMBUS_PIN_DPC] = { "dpc", GPIOD },
99c349dbc7Sjsg 	[GMBUS_PIN_DPB] = { "dpb", GPIOE },
100c349dbc7Sjsg 	[GMBUS_PIN_DPD] = { "dpd", GPIOF },
101c349dbc7Sjsg };
102c349dbc7Sjsg 
103c349dbc7Sjsg static const struct gmbus_pin gmbus_pins_bxt[] = {
104c349dbc7Sjsg 	[GMBUS_PIN_1_BXT] = { "dpb", GPIOB },
105c349dbc7Sjsg 	[GMBUS_PIN_2_BXT] = { "dpc", GPIOC },
106c349dbc7Sjsg 	[GMBUS_PIN_3_BXT] = { "misc", GPIOD },
107c349dbc7Sjsg };
108c349dbc7Sjsg 
109c349dbc7Sjsg static const struct gmbus_pin gmbus_pins_cnp[] = {
110c349dbc7Sjsg 	[GMBUS_PIN_1_BXT] = { "dpb", GPIOB },
111c349dbc7Sjsg 	[GMBUS_PIN_2_BXT] = { "dpc", GPIOC },
112c349dbc7Sjsg 	[GMBUS_PIN_3_BXT] = { "misc", GPIOD },
113c349dbc7Sjsg 	[GMBUS_PIN_4_CNP] = { "dpd", GPIOE },
114c349dbc7Sjsg };
115c349dbc7Sjsg 
116c349dbc7Sjsg static const struct gmbus_pin gmbus_pins_icp[] = {
117c349dbc7Sjsg 	[GMBUS_PIN_1_BXT] = { "dpa", GPIOB },
118c349dbc7Sjsg 	[GMBUS_PIN_2_BXT] = { "dpb", GPIOC },
119c349dbc7Sjsg 	[GMBUS_PIN_3_BXT] = { "dpc", GPIOD },
120c349dbc7Sjsg 	[GMBUS_PIN_9_TC1_ICP] = { "tc1", GPIOJ },
121c349dbc7Sjsg 	[GMBUS_PIN_10_TC2_ICP] = { "tc2", GPIOK },
122c349dbc7Sjsg 	[GMBUS_PIN_11_TC3_ICP] = { "tc3", GPIOL },
123c349dbc7Sjsg 	[GMBUS_PIN_12_TC4_ICP] = { "tc4", GPIOM },
124c349dbc7Sjsg 	[GMBUS_PIN_13_TC5_TGP] = { "tc5", GPION },
125c349dbc7Sjsg 	[GMBUS_PIN_14_TC6_TGP] = { "tc6", GPIOO },
126c349dbc7Sjsg };
127c349dbc7Sjsg 
1285ca02815Sjsg static const struct gmbus_pin gmbus_pins_dg1[] = {
1295ca02815Sjsg 	[GMBUS_PIN_1_BXT] = { "dpa", GPIOB },
1305ca02815Sjsg 	[GMBUS_PIN_2_BXT] = { "dpb", GPIOC },
1315ca02815Sjsg 	[GMBUS_PIN_3_BXT] = { "dpc", GPIOD },
1325ca02815Sjsg 	[GMBUS_PIN_4_CNP] = { "dpd", GPIOE },
1335ca02815Sjsg };
1345ca02815Sjsg 
1351bb76ff1Sjsg static const struct gmbus_pin gmbus_pins_dg2[] = {
1361bb76ff1Sjsg 	[GMBUS_PIN_1_BXT] = { "dpa", GPIOB },
1371bb76ff1Sjsg 	[GMBUS_PIN_2_BXT] = { "dpb", GPIOC },
1381bb76ff1Sjsg 	[GMBUS_PIN_3_BXT] = { "dpc", GPIOD },
1391bb76ff1Sjsg 	[GMBUS_PIN_4_CNP] = { "dpd", GPIOE },
1401bb76ff1Sjsg 	[GMBUS_PIN_9_TC1_ICP] = { "tc1", GPIOJ },
1411bb76ff1Sjsg };
1421bb76ff1Sjsg 
1431bb76ff1Sjsg static const struct gmbus_pin gmbus_pins_mtp[] = {
1441bb76ff1Sjsg 	[GMBUS_PIN_1_BXT] = { "dpa", GPIOB },
1451bb76ff1Sjsg 	[GMBUS_PIN_2_BXT] = { "dpb", GPIOC },
1461bb76ff1Sjsg 	[GMBUS_PIN_3_BXT] = { "dpc", GPIOD },
1471bb76ff1Sjsg 	[GMBUS_PIN_4_CNP] = { "dpd", GPIOE },
1481bb76ff1Sjsg 	[GMBUS_PIN_5_MTP] = { "dpe", GPIOF },
1491bb76ff1Sjsg 	[GMBUS_PIN_9_TC1_ICP] = { "tc1", GPIOJ },
1501bb76ff1Sjsg 	[GMBUS_PIN_10_TC2_ICP] = { "tc2", GPIOK },
1511bb76ff1Sjsg 	[GMBUS_PIN_11_TC3_ICP] = { "tc3", GPIOL },
1521bb76ff1Sjsg 	[GMBUS_PIN_12_TC4_ICP] = { "tc4", GPIOM },
1531bb76ff1Sjsg };
1541bb76ff1Sjsg 
get_gmbus_pin(struct drm_i915_private * i915,unsigned int pin)1551bb76ff1Sjsg static const struct gmbus_pin *get_gmbus_pin(struct drm_i915_private *i915,
156c349dbc7Sjsg 					     unsigned int pin)
157c349dbc7Sjsg {
1581bb76ff1Sjsg 	const struct gmbus_pin *pins;
1591bb76ff1Sjsg 	size_t size;
1601bb76ff1Sjsg 
1611bb76ff1Sjsg 	if (INTEL_PCH_TYPE(i915) >= PCH_DG2) {
1621bb76ff1Sjsg 		pins = gmbus_pins_dg2;
1631bb76ff1Sjsg 		size = ARRAY_SIZE(gmbus_pins_dg2);
1641bb76ff1Sjsg 	} else if (INTEL_PCH_TYPE(i915) >= PCH_DG1) {
1651bb76ff1Sjsg 		pins = gmbus_pins_dg1;
1661bb76ff1Sjsg 		size = ARRAY_SIZE(gmbus_pins_dg1);
1671bb76ff1Sjsg 	} else if (INTEL_PCH_TYPE(i915) >= PCH_MTP) {
1681bb76ff1Sjsg 		pins = gmbus_pins_mtp;
1691bb76ff1Sjsg 		size = ARRAY_SIZE(gmbus_pins_mtp);
1701bb76ff1Sjsg 	} else if (INTEL_PCH_TYPE(i915) >= PCH_ICP) {
1711bb76ff1Sjsg 		pins = gmbus_pins_icp;
1721bb76ff1Sjsg 		size = ARRAY_SIZE(gmbus_pins_icp);
1731bb76ff1Sjsg 	} else if (HAS_PCH_CNP(i915)) {
1741bb76ff1Sjsg 		pins = gmbus_pins_cnp;
1751bb76ff1Sjsg 		size = ARRAY_SIZE(gmbus_pins_cnp);
1761bb76ff1Sjsg 	} else if (IS_GEMINILAKE(i915) || IS_BROXTON(i915)) {
1771bb76ff1Sjsg 		pins = gmbus_pins_bxt;
1781bb76ff1Sjsg 		size = ARRAY_SIZE(gmbus_pins_bxt);
1791bb76ff1Sjsg 	} else if (DISPLAY_VER(i915) == 9) {
1801bb76ff1Sjsg 		pins = gmbus_pins_skl;
1811bb76ff1Sjsg 		size = ARRAY_SIZE(gmbus_pins_skl);
1821bb76ff1Sjsg 	} else if (IS_BROADWELL(i915)) {
1831bb76ff1Sjsg 		pins = gmbus_pins_bdw;
1841bb76ff1Sjsg 		size = ARRAY_SIZE(gmbus_pins_bdw);
1851bb76ff1Sjsg 	} else {
1861bb76ff1Sjsg 		pins = gmbus_pins;
1871bb76ff1Sjsg 		size = ARRAY_SIZE(gmbus_pins);
188c349dbc7Sjsg 	}
189c349dbc7Sjsg 
1901bb76ff1Sjsg 	if (pin >= size || !pins[pin].name)
1911bb76ff1Sjsg 		return NULL;
1921bb76ff1Sjsg 
1931bb76ff1Sjsg 	return &pins[pin];
1941bb76ff1Sjsg }
1951bb76ff1Sjsg 
intel_gmbus_is_valid_pin(struct drm_i915_private * i915,unsigned int pin)1961bb76ff1Sjsg bool intel_gmbus_is_valid_pin(struct drm_i915_private *i915, unsigned int pin)
197c349dbc7Sjsg {
1981bb76ff1Sjsg 	return get_gmbus_pin(i915, pin);
199c349dbc7Sjsg }
200c349dbc7Sjsg 
201c349dbc7Sjsg /* Intel GPIO access functions */
202c349dbc7Sjsg 
203c349dbc7Sjsg #define I2C_RISEFALL_TIME 10
204c349dbc7Sjsg 
205c349dbc7Sjsg static inline struct intel_gmbus *
to_intel_gmbus(struct i2c_adapter * i2c)206c349dbc7Sjsg to_intel_gmbus(struct i2c_adapter *i2c)
207c349dbc7Sjsg {
208c349dbc7Sjsg 	return container_of(i2c, struct intel_gmbus, adapter);
209c349dbc7Sjsg }
210c349dbc7Sjsg 
211c349dbc7Sjsg void
intel_gmbus_reset(struct drm_i915_private * i915)2121bb76ff1Sjsg intel_gmbus_reset(struct drm_i915_private *i915)
213c349dbc7Sjsg {
2141bb76ff1Sjsg 	intel_de_write(i915, GMBUS0(i915), 0);
2151bb76ff1Sjsg 	intel_de_write(i915, GMBUS4(i915), 0);
216c349dbc7Sjsg }
217c349dbc7Sjsg 
pnv_gmbus_clock_gating(struct drm_i915_private * i915,bool enable)2181bb76ff1Sjsg static void pnv_gmbus_clock_gating(struct drm_i915_private *i915,
219c349dbc7Sjsg 				   bool enable)
220c349dbc7Sjsg {
221c349dbc7Sjsg 	/* When using bit bashing for I2C, this bit needs to be set to 1 */
222*f005ef32Sjsg 	intel_de_rmw(i915, DSPCLK_GATE_D(i915), PNV_GMBUSUNIT_CLOCK_GATE_DISABLE,
223*f005ef32Sjsg 		     !enable ? PNV_GMBUSUNIT_CLOCK_GATE_DISABLE : 0);
224c349dbc7Sjsg }
225c349dbc7Sjsg 
pch_gmbus_clock_gating(struct drm_i915_private * i915,bool enable)2261bb76ff1Sjsg static void pch_gmbus_clock_gating(struct drm_i915_private *i915,
227c349dbc7Sjsg 				   bool enable)
228c349dbc7Sjsg {
229*f005ef32Sjsg 	intel_de_rmw(i915, SOUTH_DSPCLK_GATE_D, PCH_GMBUSUNIT_CLOCK_GATE_DISABLE,
230*f005ef32Sjsg 		     !enable ? PCH_GMBUSUNIT_CLOCK_GATE_DISABLE : 0);
231c349dbc7Sjsg }
232c349dbc7Sjsg 
bxt_gmbus_clock_gating(struct drm_i915_private * i915,bool enable)2331bb76ff1Sjsg static void bxt_gmbus_clock_gating(struct drm_i915_private *i915,
234c349dbc7Sjsg 				   bool enable)
235c349dbc7Sjsg {
236*f005ef32Sjsg 	intel_de_rmw(i915, GEN9_CLKGATE_DIS_4, BXT_GMBUS_GATING_DIS,
237*f005ef32Sjsg 		     !enable ? BXT_GMBUS_GATING_DIS : 0);
238c349dbc7Sjsg }
239c349dbc7Sjsg 
get_reserved(struct intel_gmbus * bus)240c349dbc7Sjsg static u32 get_reserved(struct intel_gmbus *bus)
241c349dbc7Sjsg {
2421bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
243c349dbc7Sjsg 	u32 reserved = 0;
244c349dbc7Sjsg 
245c349dbc7Sjsg 	/* On most chips, these bits must be preserved in software. */
246c349dbc7Sjsg 	if (!IS_I830(i915) && !IS_I845G(i915))
247*f005ef32Sjsg 		reserved = intel_de_read_notrace(i915, bus->gpio_reg) &
248*f005ef32Sjsg 			(GPIO_DATA_PULLUP_DISABLE | GPIO_CLOCK_PULLUP_DISABLE);
249c349dbc7Sjsg 
250c349dbc7Sjsg 	return reserved;
251c349dbc7Sjsg }
252c349dbc7Sjsg 
get_clock(void * data)253c349dbc7Sjsg static int get_clock(void *data)
254c349dbc7Sjsg {
255c349dbc7Sjsg 	struct intel_gmbus *bus = data;
256*f005ef32Sjsg 	struct drm_i915_private *i915 = bus->i915;
257c349dbc7Sjsg 	u32 reserved = get_reserved(bus);
258c349dbc7Sjsg 
259*f005ef32Sjsg 	intel_de_write_notrace(i915, bus->gpio_reg, reserved | GPIO_CLOCK_DIR_MASK);
260*f005ef32Sjsg 	intel_de_write_notrace(i915, bus->gpio_reg, reserved);
261c349dbc7Sjsg 
262*f005ef32Sjsg 	return (intel_de_read_notrace(i915, bus->gpio_reg) & GPIO_CLOCK_VAL_IN) != 0;
263c349dbc7Sjsg }
264c349dbc7Sjsg 
get_data(void * data)265c349dbc7Sjsg static int get_data(void *data)
266c349dbc7Sjsg {
267c349dbc7Sjsg 	struct intel_gmbus *bus = data;
268*f005ef32Sjsg 	struct drm_i915_private *i915 = bus->i915;
269c349dbc7Sjsg 	u32 reserved = get_reserved(bus);
270c349dbc7Sjsg 
271*f005ef32Sjsg 	intel_de_write_notrace(i915, bus->gpio_reg, reserved | GPIO_DATA_DIR_MASK);
272*f005ef32Sjsg 	intel_de_write_notrace(i915, bus->gpio_reg, reserved);
273c349dbc7Sjsg 
274*f005ef32Sjsg 	return (intel_de_read_notrace(i915, bus->gpio_reg) & GPIO_DATA_VAL_IN) != 0;
275c349dbc7Sjsg }
276c349dbc7Sjsg 
set_clock(void * data,int state_high)277c349dbc7Sjsg static void set_clock(void *data, int state_high)
278c349dbc7Sjsg {
279c349dbc7Sjsg 	struct intel_gmbus *bus = data;
280*f005ef32Sjsg 	struct drm_i915_private *i915 = bus->i915;
281c349dbc7Sjsg 	u32 reserved = get_reserved(bus);
282c349dbc7Sjsg 	u32 clock_bits;
283c349dbc7Sjsg 
284c349dbc7Sjsg 	if (state_high)
285c349dbc7Sjsg 		clock_bits = GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK;
286c349dbc7Sjsg 	else
287c349dbc7Sjsg 		clock_bits = GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK |
288c349dbc7Sjsg 			     GPIO_CLOCK_VAL_MASK;
289c349dbc7Sjsg 
290*f005ef32Sjsg 	intel_de_write_notrace(i915, bus->gpio_reg, reserved | clock_bits);
291*f005ef32Sjsg 	intel_de_posting_read(i915, bus->gpio_reg);
292c349dbc7Sjsg }
293c349dbc7Sjsg 
set_data(void * data,int state_high)294c349dbc7Sjsg static void set_data(void *data, int state_high)
295c349dbc7Sjsg {
296c349dbc7Sjsg 	struct intel_gmbus *bus = data;
297*f005ef32Sjsg 	struct drm_i915_private *i915 = bus->i915;
298c349dbc7Sjsg 	u32 reserved = get_reserved(bus);
299c349dbc7Sjsg 	u32 data_bits;
300c349dbc7Sjsg 
301c349dbc7Sjsg 	if (state_high)
302c349dbc7Sjsg 		data_bits = GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK;
303c349dbc7Sjsg 	else
304c349dbc7Sjsg 		data_bits = GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK |
305c349dbc7Sjsg 			GPIO_DATA_VAL_MASK;
306c349dbc7Sjsg 
307*f005ef32Sjsg 	intel_de_write_notrace(i915, bus->gpio_reg, reserved | data_bits);
308*f005ef32Sjsg 	intel_de_posting_read(i915, bus->gpio_reg);
309c349dbc7Sjsg }
310c349dbc7Sjsg 
311c349dbc7Sjsg static int
intel_gpio_pre_xfer(struct i2c_adapter * adapter)312c349dbc7Sjsg intel_gpio_pre_xfer(struct i2c_adapter *adapter)
313c349dbc7Sjsg {
3141bb76ff1Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
3151bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
316c349dbc7Sjsg 
3171bb76ff1Sjsg 	intel_gmbus_reset(i915);
318c349dbc7Sjsg 
3191bb76ff1Sjsg 	if (IS_PINEVIEW(i915))
3201bb76ff1Sjsg 		pnv_gmbus_clock_gating(i915, false);
321c349dbc7Sjsg 
322c349dbc7Sjsg 	set_data(bus, 1);
323c349dbc7Sjsg 	set_clock(bus, 1);
324c349dbc7Sjsg 	udelay(I2C_RISEFALL_TIME);
325c349dbc7Sjsg 	return 0;
326c349dbc7Sjsg }
327c349dbc7Sjsg 
328c349dbc7Sjsg static void
intel_gpio_post_xfer(struct i2c_adapter * adapter)329c349dbc7Sjsg intel_gpio_post_xfer(struct i2c_adapter *adapter)
330c349dbc7Sjsg {
3311bb76ff1Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
3321bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
333c349dbc7Sjsg 
334c349dbc7Sjsg 	set_data(bus, 1);
335c349dbc7Sjsg 	set_clock(bus, 1);
336c349dbc7Sjsg 
3371bb76ff1Sjsg 	if (IS_PINEVIEW(i915))
3381bb76ff1Sjsg 		pnv_gmbus_clock_gating(i915, true);
339c349dbc7Sjsg }
340c349dbc7Sjsg 
341c349dbc7Sjsg void	intel_bb_set_bits(void *, uint32_t);
342c349dbc7Sjsg void	intel_bb_set_dir(void *, uint32_t);
343c349dbc7Sjsg uint32_t intel_bb_read_bits(void *);
344c349dbc7Sjsg 
345c349dbc7Sjsg int	intel_acquire_bus(void *, int);
346c349dbc7Sjsg void	intel_release_bus(void *, int);
347c349dbc7Sjsg int	intel_send_start(void *, int);
348c349dbc7Sjsg int	intel_send_stop(void *, int);
349c349dbc7Sjsg int	intel_initiate_xfer(void *, i2c_addr_t, int);
350c349dbc7Sjsg int	intel_read_byte(void *, u_int8_t *, int);
351c349dbc7Sjsg int	intel_write_byte(void *, u_int8_t, int);
352c349dbc7Sjsg 
353c349dbc7Sjsg #define INTEL_BB_SDA		(1 << I2C_BIT_SDA)
354c349dbc7Sjsg #define INTEL_BB_SCL		(1 << I2C_BIT_SCL)
355c349dbc7Sjsg 
356c349dbc7Sjsg struct i2c_bitbang_ops intel_bbops = {
357c349dbc7Sjsg 	intel_bb_set_bits,
358c349dbc7Sjsg 	intel_bb_set_dir,
359c349dbc7Sjsg 	intel_bb_read_bits,
360c349dbc7Sjsg 	{ INTEL_BB_SDA, INTEL_BB_SCL, 0, 0 }
361c349dbc7Sjsg };
362c349dbc7Sjsg 
363c349dbc7Sjsg void
intel_bb_set_bits(void * cookie,uint32_t bits)364c349dbc7Sjsg intel_bb_set_bits(void *cookie, uint32_t bits)
365c349dbc7Sjsg {
366c349dbc7Sjsg 	set_clock(cookie, bits & INTEL_BB_SCL);
367c349dbc7Sjsg 	set_data(cookie, bits & INTEL_BB_SDA);
368c349dbc7Sjsg }
369c349dbc7Sjsg 
370c349dbc7Sjsg void
intel_bb_set_dir(void * cookie,uint32_t bits)371c349dbc7Sjsg intel_bb_set_dir(void *cookie, uint32_t bits)
372c349dbc7Sjsg {
373c349dbc7Sjsg }
374c349dbc7Sjsg 
375c349dbc7Sjsg uint32_t
intel_bb_read_bits(void * cookie)376c349dbc7Sjsg intel_bb_read_bits(void *cookie)
377c349dbc7Sjsg {
378c349dbc7Sjsg 	uint32_t bits = 0;
379c349dbc7Sjsg 
380c349dbc7Sjsg 	if (get_clock(cookie))
381c349dbc7Sjsg 		bits |= INTEL_BB_SCL;
382c349dbc7Sjsg 	if (get_data(cookie))
383c349dbc7Sjsg 		bits |= INTEL_BB_SDA;
384c349dbc7Sjsg 
385c349dbc7Sjsg 	return bits;
386c349dbc7Sjsg }
387c349dbc7Sjsg 
388c349dbc7Sjsg int
intel_acquire_bus(void * cookie,int flags)389c349dbc7Sjsg intel_acquire_bus(void *cookie, int flags)
390c349dbc7Sjsg {
391c349dbc7Sjsg 	struct intel_gmbus *bus = cookie;
392c349dbc7Sjsg 
393c349dbc7Sjsg 	intel_gpio_pre_xfer(&bus->adapter);
394c349dbc7Sjsg 	return (0);
395c349dbc7Sjsg }
396c349dbc7Sjsg 
397c349dbc7Sjsg void
intel_release_bus(void * cookie,int flags)398c349dbc7Sjsg intel_release_bus(void *cookie, int flags)
399c349dbc7Sjsg {
400c349dbc7Sjsg 	struct intel_gmbus *bus = cookie;
401c349dbc7Sjsg 
402c349dbc7Sjsg 	intel_gpio_post_xfer(&bus->adapter);
403c349dbc7Sjsg }
404c349dbc7Sjsg 
405c349dbc7Sjsg int
intel_send_start(void * cookie,int flags)406c349dbc7Sjsg intel_send_start(void *cookie, int flags)
407c349dbc7Sjsg {
408c349dbc7Sjsg 	return (i2c_bitbang_send_start(cookie, flags, &intel_bbops));
409c349dbc7Sjsg }
410c349dbc7Sjsg 
411c349dbc7Sjsg int
intel_send_stop(void * cookie,int flags)412c349dbc7Sjsg intel_send_stop(void *cookie, int flags)
413c349dbc7Sjsg {
414c349dbc7Sjsg 	return (i2c_bitbang_send_stop(cookie, flags, &intel_bbops));
415c349dbc7Sjsg }
416c349dbc7Sjsg 
417c349dbc7Sjsg int
intel_initiate_xfer(void * cookie,i2c_addr_t addr,int flags)418c349dbc7Sjsg intel_initiate_xfer(void *cookie, i2c_addr_t addr, int flags)
419c349dbc7Sjsg {
420c349dbc7Sjsg 	return (i2c_bitbang_initiate_xfer(cookie, addr, flags, &intel_bbops));
421c349dbc7Sjsg }
422c349dbc7Sjsg 
423c349dbc7Sjsg int
intel_read_byte(void * cookie,u_int8_t * bytep,int flags)424c349dbc7Sjsg intel_read_byte(void *cookie, u_int8_t *bytep, int flags)
425c349dbc7Sjsg {
426c349dbc7Sjsg 	return (i2c_bitbang_read_byte(cookie, bytep, flags, &intel_bbops));
427c349dbc7Sjsg }
428c349dbc7Sjsg 
429c349dbc7Sjsg int
intel_write_byte(void * cookie,u_int8_t byte,int flags)430c349dbc7Sjsg intel_write_byte(void *cookie, u_int8_t byte, int flags)
431c349dbc7Sjsg {
432c349dbc7Sjsg 	return (i2c_bitbang_write_byte(cookie, byte, flags, &intel_bbops));
433c349dbc7Sjsg }
434c349dbc7Sjsg 
435c349dbc7Sjsg static void
intel_gpio_setup(struct intel_gmbus * bus,i915_reg_t gpio_reg)4361bb76ff1Sjsg intel_gpio_setup(struct intel_gmbus *bus, i915_reg_t gpio_reg)
437c349dbc7Sjsg {
438c349dbc7Sjsg 	struct i2c_algo_bit_data *algo;
439c349dbc7Sjsg 
440c349dbc7Sjsg 	algo = &bus->bit_algo;
441c349dbc7Sjsg 
4421bb76ff1Sjsg 	bus->gpio_reg = gpio_reg;
443c349dbc7Sjsg 	bus->adapter.algo_data = algo;
444c349dbc7Sjsg #ifdef __linux__
445c349dbc7Sjsg 	algo->setsda = set_data;
446c349dbc7Sjsg 	algo->setscl = set_clock;
447c349dbc7Sjsg 	algo->getsda = get_data;
448c349dbc7Sjsg 	algo->getscl = get_clock;
449c349dbc7Sjsg 	algo->pre_xfer = intel_gpio_pre_xfer;
450c349dbc7Sjsg 	algo->post_xfer = intel_gpio_post_xfer;
451c349dbc7Sjsg 	algo->udelay = I2C_RISEFALL_TIME;
452c349dbc7Sjsg 	algo->timeout = usecs_to_jiffies(2200);
453c349dbc7Sjsg 	algo->data = bus;
454c349dbc7Sjsg #else
455c349dbc7Sjsg 	algo->ic.ic_cookie = bus;
456c349dbc7Sjsg 	algo->ic.ic_acquire_bus = intel_acquire_bus;
457c349dbc7Sjsg 	algo->ic.ic_release_bus = intel_release_bus;
458c349dbc7Sjsg 	algo->ic.ic_send_start = intel_send_start;
459c349dbc7Sjsg 	algo->ic.ic_send_stop = intel_send_stop;
460c349dbc7Sjsg 	algo->ic.ic_initiate_xfer = intel_initiate_xfer;
461c349dbc7Sjsg 	algo->ic.ic_read_byte = intel_read_byte;
462c349dbc7Sjsg 	algo->ic.ic_write_byte = intel_write_byte;
463c349dbc7Sjsg #endif
464c349dbc7Sjsg }
465c349dbc7Sjsg 
has_gmbus_irq(struct drm_i915_private * i915)4661bb76ff1Sjsg static bool has_gmbus_irq(struct drm_i915_private *i915)
4671bb76ff1Sjsg {
4681bb76ff1Sjsg 	/*
4691bb76ff1Sjsg 	 * encoder->shutdown() may want to use GMBUS
4701bb76ff1Sjsg 	 * after irqs have already been disabled.
4711bb76ff1Sjsg 	 */
4721bb76ff1Sjsg 	return HAS_GMBUS_IRQ(i915) && intel_irqs_enabled(i915);
4731bb76ff1Sjsg }
4741bb76ff1Sjsg 
gmbus_wait(struct drm_i915_private * i915,u32 status,u32 irq_en)4751bb76ff1Sjsg static int gmbus_wait(struct drm_i915_private *i915, u32 status, u32 irq_en)
476c349dbc7Sjsg {
477c349dbc7Sjsg 	DEFINE_WAIT(wait);
478c349dbc7Sjsg 	u32 gmbus2;
479c349dbc7Sjsg 	int ret;
480c349dbc7Sjsg 
481c349dbc7Sjsg 	/* Important: The hw handles only the first bit, so set only one! Since
482c349dbc7Sjsg 	 * we also need to check for NAKs besides the hw ready/idle signal, we
483c349dbc7Sjsg 	 * need to wake up periodically and check that ourselves.
484c349dbc7Sjsg 	 */
4851bb76ff1Sjsg 	if (!has_gmbus_irq(i915) || cold)
486c349dbc7Sjsg 		irq_en = 0;
487c349dbc7Sjsg 
4881bb76ff1Sjsg 	add_wait_queue(&i915->display.gmbus.wait_queue, &wait);
4891bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS4(i915), irq_en);
490c349dbc7Sjsg 
491c349dbc7Sjsg 	status |= GMBUS_SATOER;
4921bb76ff1Sjsg 	ret = wait_for_us((gmbus2 = intel_de_read_fw(i915, GMBUS2(i915))) & status,
493c349dbc7Sjsg 			  2);
494c349dbc7Sjsg 	if (ret)
4951bb76ff1Sjsg 		ret = wait_for((gmbus2 = intel_de_read_fw(i915, GMBUS2(i915))) & status,
496c349dbc7Sjsg 			       50);
497c349dbc7Sjsg 
4981bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS4(i915), 0);
4991bb76ff1Sjsg 	remove_wait_queue(&i915->display.gmbus.wait_queue, &wait);
500c349dbc7Sjsg 
501c349dbc7Sjsg 	if (gmbus2 & GMBUS_SATOER)
502c349dbc7Sjsg 		return -ENXIO;
503c349dbc7Sjsg 
504c349dbc7Sjsg 	return ret;
505c349dbc7Sjsg }
506c349dbc7Sjsg 
507c349dbc7Sjsg static int
gmbus_wait_idle(struct drm_i915_private * i915)5081bb76ff1Sjsg gmbus_wait_idle(struct drm_i915_private *i915)
509c349dbc7Sjsg {
510c349dbc7Sjsg 	DEFINE_WAIT(wait);
511c349dbc7Sjsg 	u32 irq_enable;
512c349dbc7Sjsg 	int ret;
513c349dbc7Sjsg 
514c349dbc7Sjsg 	/* Important: The hw handles only the first bit, so set only one! */
515c349dbc7Sjsg 	irq_enable = 0;
5161bb76ff1Sjsg 	if (has_gmbus_irq(i915) && !cold)
517c349dbc7Sjsg 		irq_enable = GMBUS_IDLE_EN;
518c349dbc7Sjsg 
5191bb76ff1Sjsg 	add_wait_queue(&i915->display.gmbus.wait_queue, &wait);
5201bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS4(i915), irq_enable);
521c349dbc7Sjsg 
522*f005ef32Sjsg 	ret = intel_de_wait_for_register_fw(i915, GMBUS2(i915), GMBUS_ACTIVE, 0, 10);
523c349dbc7Sjsg 
5241bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS4(i915), 0);
5251bb76ff1Sjsg 	remove_wait_queue(&i915->display.gmbus.wait_queue, &wait);
526c349dbc7Sjsg 
527c349dbc7Sjsg 	return ret;
528c349dbc7Sjsg }
529c349dbc7Sjsg 
gmbus_max_xfer_size(struct drm_i915_private * i915)5301bb76ff1Sjsg static unsigned int gmbus_max_xfer_size(struct drm_i915_private *i915)
531c349dbc7Sjsg {
5321bb76ff1Sjsg 	return DISPLAY_VER(i915) >= 9 ? GEN9_GMBUS_BYTE_COUNT_MAX :
533c349dbc7Sjsg 	       GMBUS_BYTE_COUNT_MAX;
534c349dbc7Sjsg }
535c349dbc7Sjsg 
536c349dbc7Sjsg static int
gmbus_xfer_read_chunk(struct drm_i915_private * i915,unsigned short addr,u8 * buf,unsigned int len,u32 gmbus0_reg,u32 gmbus1_index)5371bb76ff1Sjsg gmbus_xfer_read_chunk(struct drm_i915_private *i915,
538c349dbc7Sjsg 		      unsigned short addr, u8 *buf, unsigned int len,
539c349dbc7Sjsg 		      u32 gmbus0_reg, u32 gmbus1_index)
540c349dbc7Sjsg {
541c349dbc7Sjsg 	unsigned int size = len;
5421bb76ff1Sjsg 	bool burst_read = len > gmbus_max_xfer_size(i915);
543c349dbc7Sjsg 	bool extra_byte_added = false;
544c349dbc7Sjsg 
545c349dbc7Sjsg 	if (burst_read) {
546c349dbc7Sjsg 		/*
547c349dbc7Sjsg 		 * As per HW Spec, for 512Bytes need to read extra Byte and
548c349dbc7Sjsg 		 * Ignore the extra byte read.
549c349dbc7Sjsg 		 */
550c349dbc7Sjsg 		if (len == 512) {
551c349dbc7Sjsg 			extra_byte_added = true;
552c349dbc7Sjsg 			len++;
553c349dbc7Sjsg 		}
554c349dbc7Sjsg 		size = len % 256 + 256;
5551bb76ff1Sjsg 		intel_de_write_fw(i915, GMBUS0(i915),
556c349dbc7Sjsg 				  gmbus0_reg | GMBUS_BYTE_CNT_OVERRIDE);
557c349dbc7Sjsg 	}
558c349dbc7Sjsg 
5591bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS1(i915),
560c349dbc7Sjsg 			  gmbus1_index | GMBUS_CYCLE_WAIT | (size << GMBUS_BYTE_COUNT_SHIFT) | (addr << GMBUS_SLAVE_ADDR_SHIFT) | GMBUS_SLAVE_READ | GMBUS_SW_RDY);
561c349dbc7Sjsg 	while (len) {
562c349dbc7Sjsg 		int ret;
563c349dbc7Sjsg 		u32 val, loop = 0;
564c349dbc7Sjsg 
5651bb76ff1Sjsg 		ret = gmbus_wait(i915, GMBUS_HW_RDY, GMBUS_HW_RDY_EN);
566c349dbc7Sjsg 		if (ret)
567c349dbc7Sjsg 			return ret;
568c349dbc7Sjsg 
5691bb76ff1Sjsg 		val = intel_de_read_fw(i915, GMBUS3(i915));
570c349dbc7Sjsg 		do {
571c349dbc7Sjsg 			if (extra_byte_added && len == 1)
572c349dbc7Sjsg 				break;
573c349dbc7Sjsg 
574c349dbc7Sjsg 			*buf++ = val & 0xff;
575c349dbc7Sjsg 			val >>= 8;
576c349dbc7Sjsg 		} while (--len && ++loop < 4);
577c349dbc7Sjsg 
578c349dbc7Sjsg 		if (burst_read && len == size - 4)
579c349dbc7Sjsg 			/* Reset the override bit */
5801bb76ff1Sjsg 			intel_de_write_fw(i915, GMBUS0(i915), gmbus0_reg);
581c349dbc7Sjsg 	}
582c349dbc7Sjsg 
583c349dbc7Sjsg 	return 0;
584c349dbc7Sjsg }
585c349dbc7Sjsg 
586c349dbc7Sjsg /*
587c349dbc7Sjsg  * HW spec says that 512Bytes in Burst read need special treatment.
588c349dbc7Sjsg  * But it doesn't talk about other multiple of 256Bytes. And couldn't locate
589c349dbc7Sjsg  * an I2C slave, which supports such a lengthy burst read too for experiments.
590c349dbc7Sjsg  *
591c349dbc7Sjsg  * So until things get clarified on HW support, to avoid the burst read length
592c349dbc7Sjsg  * in fold of 256Bytes except 512, max burst read length is fixed at 767Bytes.
593c349dbc7Sjsg  */
594c349dbc7Sjsg #define INTEL_GMBUS_BURST_READ_MAX_LEN		767U
595c349dbc7Sjsg 
596c349dbc7Sjsg static int
gmbus_xfer_read(struct drm_i915_private * i915,struct i2c_msg * msg,u32 gmbus0_reg,u32 gmbus1_index)5971bb76ff1Sjsg gmbus_xfer_read(struct drm_i915_private *i915, struct i2c_msg *msg,
598c349dbc7Sjsg 		u32 gmbus0_reg, u32 gmbus1_index)
599c349dbc7Sjsg {
600c349dbc7Sjsg 	u8 *buf = msg->buf;
601c349dbc7Sjsg 	unsigned int rx_size = msg->len;
602c349dbc7Sjsg 	unsigned int len;
603c349dbc7Sjsg 	int ret;
604c349dbc7Sjsg 
605c349dbc7Sjsg 	do {
6061bb76ff1Sjsg 		if (HAS_GMBUS_BURST_READ(i915))
607c349dbc7Sjsg 			len = min(rx_size, INTEL_GMBUS_BURST_READ_MAX_LEN);
608c349dbc7Sjsg 		else
6091bb76ff1Sjsg 			len = min(rx_size, gmbus_max_xfer_size(i915));
610c349dbc7Sjsg 
6111bb76ff1Sjsg 		ret = gmbus_xfer_read_chunk(i915, msg->addr, buf, len,
612c349dbc7Sjsg 					    gmbus0_reg, gmbus1_index);
613c349dbc7Sjsg 		if (ret)
614c349dbc7Sjsg 			return ret;
615c349dbc7Sjsg 
616c349dbc7Sjsg 		rx_size -= len;
617c349dbc7Sjsg 		buf += len;
618c349dbc7Sjsg 	} while (rx_size != 0);
619c349dbc7Sjsg 
620c349dbc7Sjsg 	return 0;
621c349dbc7Sjsg }
622c349dbc7Sjsg 
623c349dbc7Sjsg static int
gmbus_xfer_write_chunk(struct drm_i915_private * i915,unsigned short addr,u8 * buf,unsigned int len,u32 gmbus1_index)6241bb76ff1Sjsg gmbus_xfer_write_chunk(struct drm_i915_private *i915,
625c349dbc7Sjsg 		       unsigned short addr, u8 *buf, unsigned int len,
626c349dbc7Sjsg 		       u32 gmbus1_index)
627c349dbc7Sjsg {
628c349dbc7Sjsg 	unsigned int chunk_size = len;
629c349dbc7Sjsg 	u32 val, loop;
630c349dbc7Sjsg 
631c349dbc7Sjsg 	val = loop = 0;
632c349dbc7Sjsg 	while (len && loop < 4) {
633c349dbc7Sjsg 		val |= *buf++ << (8 * loop++);
634c349dbc7Sjsg 		len -= 1;
635c349dbc7Sjsg 	}
636c349dbc7Sjsg 
6371bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS3(i915), val);
6381bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS1(i915),
639c349dbc7Sjsg 			  gmbus1_index | GMBUS_CYCLE_WAIT | (chunk_size << GMBUS_BYTE_COUNT_SHIFT) | (addr << GMBUS_SLAVE_ADDR_SHIFT) | GMBUS_SLAVE_WRITE | GMBUS_SW_RDY);
640c349dbc7Sjsg 	while (len) {
641c349dbc7Sjsg 		int ret;
642c349dbc7Sjsg 
643c349dbc7Sjsg 		val = loop = 0;
644c349dbc7Sjsg 		do {
645c349dbc7Sjsg 			val |= *buf++ << (8 * loop);
646c349dbc7Sjsg 		} while (--len && ++loop < 4);
647c349dbc7Sjsg 
6481bb76ff1Sjsg 		intel_de_write_fw(i915, GMBUS3(i915), val);
649c349dbc7Sjsg 
6501bb76ff1Sjsg 		ret = gmbus_wait(i915, GMBUS_HW_RDY, GMBUS_HW_RDY_EN);
651c349dbc7Sjsg 		if (ret)
652c349dbc7Sjsg 			return ret;
653c349dbc7Sjsg 	}
654c349dbc7Sjsg 
655c349dbc7Sjsg 	return 0;
656c349dbc7Sjsg }
657c349dbc7Sjsg 
658c349dbc7Sjsg static int
gmbus_xfer_write(struct drm_i915_private * i915,struct i2c_msg * msg,u32 gmbus1_index)6591bb76ff1Sjsg gmbus_xfer_write(struct drm_i915_private *i915, struct i2c_msg *msg,
660c349dbc7Sjsg 		 u32 gmbus1_index)
661c349dbc7Sjsg {
662c349dbc7Sjsg 	u8 *buf = msg->buf;
663c349dbc7Sjsg 	unsigned int tx_size = msg->len;
664c349dbc7Sjsg 	unsigned int len;
665c349dbc7Sjsg 	int ret;
666c349dbc7Sjsg 
667c349dbc7Sjsg 	do {
6681bb76ff1Sjsg 		len = min(tx_size, gmbus_max_xfer_size(i915));
669c349dbc7Sjsg 
6701bb76ff1Sjsg 		ret = gmbus_xfer_write_chunk(i915, msg->addr, buf, len,
671c349dbc7Sjsg 					     gmbus1_index);
672c349dbc7Sjsg 		if (ret)
673c349dbc7Sjsg 			return ret;
674c349dbc7Sjsg 
675c349dbc7Sjsg 		buf += len;
676c349dbc7Sjsg 		tx_size -= len;
677c349dbc7Sjsg 	} while (tx_size != 0);
678c349dbc7Sjsg 
679c349dbc7Sjsg 	return 0;
680c349dbc7Sjsg }
681c349dbc7Sjsg 
682c349dbc7Sjsg /*
683c349dbc7Sjsg  * The gmbus controller can combine a 1 or 2 byte write with another read/write
684c349dbc7Sjsg  * that immediately follows it by using an "INDEX" cycle.
685c349dbc7Sjsg  */
686c349dbc7Sjsg static bool
gmbus_is_index_xfer(struct i2c_msg * msgs,int i,int num)687c349dbc7Sjsg gmbus_is_index_xfer(struct i2c_msg *msgs, int i, int num)
688c349dbc7Sjsg {
689c349dbc7Sjsg 	return (i + 1 < num &&
690c349dbc7Sjsg 		msgs[i].addr == msgs[i + 1].addr &&
691c349dbc7Sjsg 		!(msgs[i].flags & I2C_M_RD) &&
692c349dbc7Sjsg 		(msgs[i].len == 1 || msgs[i].len == 2) &&
693c349dbc7Sjsg 		msgs[i + 1].len > 0);
694c349dbc7Sjsg }
695c349dbc7Sjsg 
696c349dbc7Sjsg static int
gmbus_index_xfer(struct drm_i915_private * i915,struct i2c_msg * msgs,u32 gmbus0_reg)6971bb76ff1Sjsg gmbus_index_xfer(struct drm_i915_private *i915, struct i2c_msg *msgs,
698c349dbc7Sjsg 		 u32 gmbus0_reg)
699c349dbc7Sjsg {
700c349dbc7Sjsg 	u32 gmbus1_index = 0;
701c349dbc7Sjsg 	u32 gmbus5 = 0;
702c349dbc7Sjsg 	int ret;
703c349dbc7Sjsg 
704c349dbc7Sjsg 	if (msgs[0].len == 2)
705c349dbc7Sjsg 		gmbus5 = GMBUS_2BYTE_INDEX_EN |
706c349dbc7Sjsg 			 msgs[0].buf[1] | (msgs[0].buf[0] << 8);
707c349dbc7Sjsg 	if (msgs[0].len == 1)
708c349dbc7Sjsg 		gmbus1_index = GMBUS_CYCLE_INDEX |
709c349dbc7Sjsg 			       (msgs[0].buf[0] << GMBUS_SLAVE_INDEX_SHIFT);
710c349dbc7Sjsg 
711c349dbc7Sjsg 	/* GMBUS5 holds 16-bit index */
712c349dbc7Sjsg 	if (gmbus5)
7131bb76ff1Sjsg 		intel_de_write_fw(i915, GMBUS5(i915), gmbus5);
714c349dbc7Sjsg 
715c349dbc7Sjsg 	if (msgs[1].flags & I2C_M_RD)
7161bb76ff1Sjsg 		ret = gmbus_xfer_read(i915, &msgs[1], gmbus0_reg,
717c349dbc7Sjsg 				      gmbus1_index);
718c349dbc7Sjsg 	else
7191bb76ff1Sjsg 		ret = gmbus_xfer_write(i915, &msgs[1], gmbus1_index);
720c349dbc7Sjsg 
721c349dbc7Sjsg 	/* Clear GMBUS5 after each index transfer */
722c349dbc7Sjsg 	if (gmbus5)
7231bb76ff1Sjsg 		intel_de_write_fw(i915, GMBUS5(i915), 0);
724c349dbc7Sjsg 
725c349dbc7Sjsg 	return ret;
726c349dbc7Sjsg }
727c349dbc7Sjsg 
728c349dbc7Sjsg static int
do_gmbus_xfer(struct i2c_adapter * adapter,struct i2c_msg * msgs,int num,u32 gmbus0_source)729c349dbc7Sjsg do_gmbus_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num,
730c349dbc7Sjsg 	      u32 gmbus0_source)
731c349dbc7Sjsg {
7321bb76ff1Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
7331bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
734c349dbc7Sjsg 	int i = 0, inc, try = 0;
735c349dbc7Sjsg 	int ret = 0;
736c349dbc7Sjsg 
7375ca02815Sjsg 	/* Display WA #0868: skl,bxt,kbl,cfl,glk */
7381bb76ff1Sjsg 	if (IS_GEMINILAKE(i915) || IS_BROXTON(i915))
7391bb76ff1Sjsg 		bxt_gmbus_clock_gating(i915, false);
7401bb76ff1Sjsg 	else if (HAS_PCH_SPT(i915) || HAS_PCH_CNP(i915))
7411bb76ff1Sjsg 		pch_gmbus_clock_gating(i915, false);
742c349dbc7Sjsg 
743c349dbc7Sjsg retry:
7441bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS0(i915), gmbus0_source | bus->reg0);
745c349dbc7Sjsg 
746c349dbc7Sjsg 	for (; i < num; i += inc) {
747c349dbc7Sjsg 		inc = 1;
748c349dbc7Sjsg 		if (gmbus_is_index_xfer(msgs, i, num)) {
7491bb76ff1Sjsg 			ret = gmbus_index_xfer(i915, &msgs[i],
750c349dbc7Sjsg 					       gmbus0_source | bus->reg0);
751c349dbc7Sjsg 			inc = 2; /* an index transmission is two msgs */
752c349dbc7Sjsg 		} else if (msgs[i].flags & I2C_M_RD) {
7531bb76ff1Sjsg 			ret = gmbus_xfer_read(i915, &msgs[i],
754c349dbc7Sjsg 					      gmbus0_source | bus->reg0, 0);
755c349dbc7Sjsg 		} else {
7561bb76ff1Sjsg 			ret = gmbus_xfer_write(i915, &msgs[i], 0);
757c349dbc7Sjsg 		}
758c349dbc7Sjsg 
759c349dbc7Sjsg 		if (!ret)
7601bb76ff1Sjsg 			ret = gmbus_wait(i915,
761c349dbc7Sjsg 					 GMBUS_HW_WAIT_PHASE, GMBUS_HW_WAIT_EN);
762c349dbc7Sjsg 		if (ret == -ETIMEDOUT)
763c349dbc7Sjsg 			goto timeout;
764c349dbc7Sjsg 		else if (ret)
765c349dbc7Sjsg 			goto clear_err;
766c349dbc7Sjsg 	}
767c349dbc7Sjsg 
768c349dbc7Sjsg 	/* Generate a STOP condition on the bus. Note that gmbus can't generata
769c349dbc7Sjsg 	 * a STOP on the very first cycle. To simplify the code we
770c349dbc7Sjsg 	 * unconditionally generate the STOP condition with an additional gmbus
771c349dbc7Sjsg 	 * cycle. */
7721bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS1(i915), GMBUS_CYCLE_STOP | GMBUS_SW_RDY);
773c349dbc7Sjsg 
774c349dbc7Sjsg 	/* Mark the GMBUS interface as disabled after waiting for idle.
775c349dbc7Sjsg 	 * We will re-enable it at the start of the next xfer,
776c349dbc7Sjsg 	 * till then let it sleep.
777c349dbc7Sjsg 	 */
7781bb76ff1Sjsg 	if (gmbus_wait_idle(i915)) {
7791bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
780c349dbc7Sjsg 			    "GMBUS [%s] timed out waiting for idle\n",
781c349dbc7Sjsg 			    adapter->name);
782c349dbc7Sjsg 		ret = -ETIMEDOUT;
783c349dbc7Sjsg 	}
7841bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS0(i915), 0);
785c349dbc7Sjsg 	ret = ret ?: i;
786c349dbc7Sjsg 	goto out;
787c349dbc7Sjsg 
788c349dbc7Sjsg clear_err:
789c349dbc7Sjsg 	/*
790c349dbc7Sjsg 	 * Wait for bus to IDLE before clearing NAK.
791c349dbc7Sjsg 	 * If we clear the NAK while bus is still active, then it will stay
792c349dbc7Sjsg 	 * active and the next transaction may fail.
793c349dbc7Sjsg 	 *
794c349dbc7Sjsg 	 * If no ACK is received during the address phase of a transaction, the
795c349dbc7Sjsg 	 * adapter must report -ENXIO. It is not clear what to return if no ACK
796c349dbc7Sjsg 	 * is received at other times. But we have to be careful to not return
797c349dbc7Sjsg 	 * spurious -ENXIO because that will prevent i2c and drm edid functions
798c349dbc7Sjsg 	 * from retrying. So return -ENXIO only when gmbus properly quiescents -
799c349dbc7Sjsg 	 * timing out seems to happen when there _is_ a ddc chip present, but
800c349dbc7Sjsg 	 * it's slow responding and only answers on the 2nd retry.
801c349dbc7Sjsg 	 */
802c349dbc7Sjsg 	ret = -ENXIO;
8031bb76ff1Sjsg 	if (gmbus_wait_idle(i915)) {
8041bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
805c349dbc7Sjsg 			    "GMBUS [%s] timed out after NAK\n",
806c349dbc7Sjsg 			    adapter->name);
807c349dbc7Sjsg 		ret = -ETIMEDOUT;
808c349dbc7Sjsg 	}
809c349dbc7Sjsg 
810c349dbc7Sjsg 	/* Toggle the Software Clear Interrupt bit. This has the effect
811c349dbc7Sjsg 	 * of resetting the GMBUS controller and so clearing the
812c349dbc7Sjsg 	 * BUS_ERROR raised by the slave's NAK.
813c349dbc7Sjsg 	 */
8141bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS1(i915), GMBUS_SW_CLR_INT);
8151bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS1(i915), 0);
8161bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS0(i915), 0);
817c349dbc7Sjsg 
8181bb76ff1Sjsg 	drm_dbg_kms(&i915->drm, "GMBUS [%s] NAK for addr: %04x %c(%d)\n",
819c349dbc7Sjsg 		    adapter->name, msgs[i].addr,
820c349dbc7Sjsg 		    (msgs[i].flags & I2C_M_RD) ? 'r' : 'w', msgs[i].len);
821c349dbc7Sjsg 
822c349dbc7Sjsg 	/*
823c349dbc7Sjsg 	 * Passive adapters sometimes NAK the first probe. Retry the first
824c349dbc7Sjsg 	 * message once on -ENXIO for GMBUS transfers; the bit banging algorithm
825c349dbc7Sjsg 	 * has retries internally. See also the retry loop in
826c349dbc7Sjsg 	 * drm_do_probe_ddc_edid, which bails out on the first -ENXIO.
827c349dbc7Sjsg 	 */
828c349dbc7Sjsg 	if (ret == -ENXIO && i == 0 && try++ == 0) {
8291bb76ff1Sjsg 		drm_dbg_kms(&i915->drm,
830c349dbc7Sjsg 			    "GMBUS [%s] NAK on first message, retry\n",
831c349dbc7Sjsg 			    adapter->name);
832c349dbc7Sjsg 		goto retry;
833c349dbc7Sjsg 	}
834c349dbc7Sjsg 
835c349dbc7Sjsg 	goto out;
836c349dbc7Sjsg 
837c349dbc7Sjsg timeout:
8381bb76ff1Sjsg 	drm_dbg_kms(&i915->drm,
839c349dbc7Sjsg 		    "GMBUS [%s] timed out, falling back to bit banging on pin %d\n",
840c349dbc7Sjsg 		    bus->adapter.name, bus->reg0 & 0xff);
8411bb76ff1Sjsg 	intel_de_write_fw(i915, GMBUS0(i915), 0);
842c349dbc7Sjsg 
843c349dbc7Sjsg 	/*
844c349dbc7Sjsg 	 * Hardware may not support GMBUS over these pins? Try GPIO bitbanging
845c349dbc7Sjsg 	 * instead. Use EAGAIN to have i2c core retry.
846c349dbc7Sjsg 	 */
847c349dbc7Sjsg 	ret = -EAGAIN;
848c349dbc7Sjsg 
849c349dbc7Sjsg out:
8505ca02815Sjsg 	/* Display WA #0868: skl,bxt,kbl,cfl,glk */
8511bb76ff1Sjsg 	if (IS_GEMINILAKE(i915) || IS_BROXTON(i915))
8521bb76ff1Sjsg 		bxt_gmbus_clock_gating(i915, true);
8531bb76ff1Sjsg 	else if (HAS_PCH_SPT(i915) || HAS_PCH_CNP(i915))
8541bb76ff1Sjsg 		pch_gmbus_clock_gating(i915, true);
855c349dbc7Sjsg 
856c349dbc7Sjsg 	return ret;
857c349dbc7Sjsg }
858c349dbc7Sjsg 
859c349dbc7Sjsg static int
gmbus_xfer(struct i2c_adapter * adapter,struct i2c_msg * msgs,int num)860c349dbc7Sjsg gmbus_xfer(struct i2c_adapter *adapter, struct i2c_msg *msgs, int num)
861c349dbc7Sjsg {
8621bb76ff1Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
8631bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
864c349dbc7Sjsg 	intel_wakeref_t wakeref;
865c349dbc7Sjsg 	int ret;
866c349dbc7Sjsg 
8671bb76ff1Sjsg 	wakeref = intel_display_power_get(i915, POWER_DOMAIN_GMBUS);
868c349dbc7Sjsg 
869c349dbc7Sjsg 	if (bus->force_bit) {
870c349dbc7Sjsg 		ret = i2c_bit_algo.master_xfer(adapter, msgs, num);
871c349dbc7Sjsg 		if (ret < 0)
872c349dbc7Sjsg 			bus->force_bit &= ~GMBUS_FORCE_BIT_RETRY;
873c349dbc7Sjsg 	} else {
874c349dbc7Sjsg 		ret = do_gmbus_xfer(adapter, msgs, num, 0);
875c349dbc7Sjsg 		if (ret == -EAGAIN)
876c349dbc7Sjsg 			bus->force_bit |= GMBUS_FORCE_BIT_RETRY;
877c349dbc7Sjsg 	}
878c349dbc7Sjsg 
8791bb76ff1Sjsg 	intel_display_power_put(i915, POWER_DOMAIN_GMBUS, wakeref);
880c349dbc7Sjsg 
881c349dbc7Sjsg 	return ret;
882c349dbc7Sjsg }
883c349dbc7Sjsg 
intel_gmbus_output_aksv(struct i2c_adapter * adapter)884c349dbc7Sjsg int intel_gmbus_output_aksv(struct i2c_adapter *adapter)
885c349dbc7Sjsg {
8861bb76ff1Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
8871bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
888c349dbc7Sjsg 	u8 cmd = DRM_HDCP_DDC_AKSV;
889c349dbc7Sjsg 	u8 buf[DRM_HDCP_KSV_LEN] = { 0 };
890c349dbc7Sjsg 	struct i2c_msg msgs[] = {
891c349dbc7Sjsg 		{
892c349dbc7Sjsg 			.addr = DRM_HDCP_DDC_ADDR,
893c349dbc7Sjsg 			.flags = 0,
894c349dbc7Sjsg 			.len = sizeof(cmd),
895c349dbc7Sjsg 			.buf = &cmd,
896c349dbc7Sjsg 		},
897c349dbc7Sjsg 		{
898c349dbc7Sjsg 			.addr = DRM_HDCP_DDC_ADDR,
899c349dbc7Sjsg 			.flags = 0,
900c349dbc7Sjsg 			.len = sizeof(buf),
901c349dbc7Sjsg 			.buf = buf,
902c349dbc7Sjsg 		}
903c349dbc7Sjsg 	};
904c349dbc7Sjsg 	intel_wakeref_t wakeref;
905c349dbc7Sjsg 	int ret;
906c349dbc7Sjsg 
9071bb76ff1Sjsg 	wakeref = intel_display_power_get(i915, POWER_DOMAIN_GMBUS);
9081bb76ff1Sjsg 	mutex_lock(&i915->display.gmbus.mutex);
909c349dbc7Sjsg 
910c349dbc7Sjsg 	/*
911c349dbc7Sjsg 	 * In order to output Aksv to the receiver, use an indexed write to
912c349dbc7Sjsg 	 * pass the i2c command, and tell GMBUS to use the HW-provided value
913c349dbc7Sjsg 	 * instead of sourcing GMBUS3 for the data.
914c349dbc7Sjsg 	 */
915c349dbc7Sjsg 	ret = do_gmbus_xfer(adapter, msgs, ARRAY_SIZE(msgs), GMBUS_AKSV_SELECT);
916c349dbc7Sjsg 
9171bb76ff1Sjsg 	mutex_unlock(&i915->display.gmbus.mutex);
9181bb76ff1Sjsg 	intel_display_power_put(i915, POWER_DOMAIN_GMBUS, wakeref);
919c349dbc7Sjsg 
920c349dbc7Sjsg 	return ret;
921c349dbc7Sjsg }
922c349dbc7Sjsg 
gmbus_func(struct i2c_adapter * adapter)923c349dbc7Sjsg static u32 gmbus_func(struct i2c_adapter *adapter)
924c349dbc7Sjsg {
925c349dbc7Sjsg 	return i2c_bit_algo.functionality(adapter) &
926c349dbc7Sjsg 		(I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
927c349dbc7Sjsg 		/* I2C_FUNC_10BIT_ADDR | */
928c349dbc7Sjsg 		I2C_FUNC_SMBUS_READ_BLOCK_DATA |
929c349dbc7Sjsg 		I2C_FUNC_SMBUS_BLOCK_PROC_CALL);
930c349dbc7Sjsg }
931c349dbc7Sjsg 
932c349dbc7Sjsg static const struct i2c_algorithm gmbus_algorithm = {
933c349dbc7Sjsg 	.master_xfer	= gmbus_xfer,
934c349dbc7Sjsg 	.functionality	= gmbus_func
935c349dbc7Sjsg };
936c349dbc7Sjsg 
gmbus_lock_bus(struct i2c_adapter * adapter,unsigned int flags)937c349dbc7Sjsg static void gmbus_lock_bus(struct i2c_adapter *adapter,
938c349dbc7Sjsg 			   unsigned int flags)
939c349dbc7Sjsg {
940c349dbc7Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
9411bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
942c349dbc7Sjsg 
9431bb76ff1Sjsg 	mutex_lock(&i915->display.gmbus.mutex);
944c349dbc7Sjsg }
945c349dbc7Sjsg 
gmbus_trylock_bus(struct i2c_adapter * adapter,unsigned int flags)946c349dbc7Sjsg static int gmbus_trylock_bus(struct i2c_adapter *adapter,
947c349dbc7Sjsg 			     unsigned int flags)
948c349dbc7Sjsg {
949c349dbc7Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
9501bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
951c349dbc7Sjsg 
9521bb76ff1Sjsg 	return mutex_trylock(&i915->display.gmbus.mutex);
953c349dbc7Sjsg }
954c349dbc7Sjsg 
gmbus_unlock_bus(struct i2c_adapter * adapter,unsigned int flags)955c349dbc7Sjsg static void gmbus_unlock_bus(struct i2c_adapter *adapter,
956c349dbc7Sjsg 			     unsigned int flags)
957c349dbc7Sjsg {
958c349dbc7Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
9591bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
960c349dbc7Sjsg 
9611bb76ff1Sjsg 	mutex_unlock(&i915->display.gmbus.mutex);
962c349dbc7Sjsg }
963c349dbc7Sjsg 
964c349dbc7Sjsg static const struct i2c_lock_operations gmbus_lock_ops = {
965c349dbc7Sjsg 	.lock_bus =    gmbus_lock_bus,
966c349dbc7Sjsg 	.trylock_bus = gmbus_trylock_bus,
967c349dbc7Sjsg 	.unlock_bus =  gmbus_unlock_bus,
968c349dbc7Sjsg };
969c349dbc7Sjsg 
970c349dbc7Sjsg /**
971c349dbc7Sjsg  * intel_gmbus_setup - instantiate all Intel i2c GMBuses
9721bb76ff1Sjsg  * @i915: i915 device private
973c349dbc7Sjsg  */
intel_gmbus_setup(struct drm_i915_private * i915)9741bb76ff1Sjsg int intel_gmbus_setup(struct drm_i915_private *i915)
975c349dbc7Sjsg {
976c349dbc7Sjsg #ifdef notyet
9771bb76ff1Sjsg 	struct pci_dev *pdev = to_pci_dev(i915->drm.dev);
978c349dbc7Sjsg #endif
979c349dbc7Sjsg 	unsigned int pin;
980c349dbc7Sjsg 	int ret;
981c349dbc7Sjsg 
9821bb76ff1Sjsg 	if (IS_VALLEYVIEW(i915) || IS_CHERRYVIEW(i915))
9831bb76ff1Sjsg 		i915->display.gmbus.mmio_base = VLV_DISPLAY_BASE;
9841bb76ff1Sjsg 	else if (!HAS_GMCH(i915))
985c349dbc7Sjsg 		/*
986c349dbc7Sjsg 		 * Broxton uses the same PCH offsets for South Display Engine,
987c349dbc7Sjsg 		 * even though it doesn't have a PCH.
988c349dbc7Sjsg 		 */
9891bb76ff1Sjsg 		i915->display.gmbus.mmio_base = PCH_DISPLAY_BASE;
990c349dbc7Sjsg 
9911bb76ff1Sjsg 	rw_init(&i915->display.gmbus.mutex, "gmbus");
9921bb76ff1Sjsg 	init_waitqueue_head(&i915->display.gmbus.wait_queue);
993c349dbc7Sjsg 
9941bb76ff1Sjsg 	for (pin = 0; pin < ARRAY_SIZE(i915->display.gmbus.bus); pin++) {
9951bb76ff1Sjsg 		const struct gmbus_pin *gmbus_pin;
9961bb76ff1Sjsg 		struct intel_gmbus *bus;
9971bb76ff1Sjsg 
9981bb76ff1Sjsg 		gmbus_pin = get_gmbus_pin(i915, pin);
9991bb76ff1Sjsg 		if (!gmbus_pin)
1000c349dbc7Sjsg 			continue;
1001c349dbc7Sjsg 
10021bb76ff1Sjsg 		bus = kzalloc(sizeof(*bus), GFP_KERNEL);
10031bb76ff1Sjsg 		if (!bus) {
10041bb76ff1Sjsg 			ret = -ENOMEM;
10051bb76ff1Sjsg 			goto err;
10061bb76ff1Sjsg 		}
1007c349dbc7Sjsg 
1008c349dbc7Sjsg #ifdef notyet
1009c349dbc7Sjsg 		bus->adapter.owner = THIS_MODULE;
1010c349dbc7Sjsg 		bus->adapter.class = I2C_CLASS_DDC;
1011c349dbc7Sjsg #endif
1012c349dbc7Sjsg 		snprintf(bus->adapter.name,
1013c349dbc7Sjsg 			 sizeof(bus->adapter.name),
10141bb76ff1Sjsg 			 "i915 gmbus %s", gmbus_pin->name);
1015c349dbc7Sjsg 
1016c349dbc7Sjsg #ifdef notyet
1017c349dbc7Sjsg 		bus->adapter.dev.parent = &pdev->dev;
1018c349dbc7Sjsg #endif
10191bb76ff1Sjsg 		bus->i915 = i915;
1020c349dbc7Sjsg 
1021c349dbc7Sjsg 		bus->adapter.algo = &gmbus_algorithm;
1022c349dbc7Sjsg 		bus->adapter.lock_ops = &gmbus_lock_ops;
1023c349dbc7Sjsg 
1024c349dbc7Sjsg 		/*
1025c349dbc7Sjsg 		 * We wish to retry with bit banging
1026c349dbc7Sjsg 		 * after a timed out GMBUS attempt.
1027c349dbc7Sjsg 		 */
1028c349dbc7Sjsg 		bus->adapter.retries = 1;
1029c349dbc7Sjsg 
1030c349dbc7Sjsg 		/* By default use a conservative clock rate */
1031c349dbc7Sjsg 		bus->reg0 = pin | GMBUS_RATE_100KHZ;
1032c349dbc7Sjsg 
1033c349dbc7Sjsg 		/* gmbus seems to be broken on i830 */
10341bb76ff1Sjsg 		if (IS_I830(i915))
1035c349dbc7Sjsg 			bus->force_bit = 1;
1036c349dbc7Sjsg 
10371bb76ff1Sjsg 		intel_gpio_setup(bus, GPIO(i915, gmbus_pin->gpio));
1038c349dbc7Sjsg 
1039c349dbc7Sjsg 		ret = i2c_add_adapter(&bus->adapter);
10401bb76ff1Sjsg 		if (ret) {
10411bb76ff1Sjsg 			kfree(bus);
1042c349dbc7Sjsg 			goto err;
1043c349dbc7Sjsg 		}
1044c349dbc7Sjsg 
10451bb76ff1Sjsg 		i915->display.gmbus.bus[pin] = bus;
10461bb76ff1Sjsg 	}
10471bb76ff1Sjsg 
10481bb76ff1Sjsg 	intel_gmbus_reset(i915);
1049c349dbc7Sjsg 
1050c349dbc7Sjsg 	return 0;
1051c349dbc7Sjsg 
1052c349dbc7Sjsg err:
10531bb76ff1Sjsg 	intel_gmbus_teardown(i915);
1054c349dbc7Sjsg 
1055c349dbc7Sjsg 	return ret;
1056c349dbc7Sjsg }
1057c349dbc7Sjsg 
intel_gmbus_get_adapter(struct drm_i915_private * i915,unsigned int pin)10581bb76ff1Sjsg struct i2c_adapter *intel_gmbus_get_adapter(struct drm_i915_private *i915,
1059c349dbc7Sjsg 					    unsigned int pin)
1060c349dbc7Sjsg {
10611bb76ff1Sjsg 	if (drm_WARN_ON(&i915->drm, pin >= ARRAY_SIZE(i915->display.gmbus.bus) ||
10621bb76ff1Sjsg 			!i915->display.gmbus.bus[pin]))
1063c349dbc7Sjsg 		return NULL;
1064c349dbc7Sjsg 
10651bb76ff1Sjsg 	return &i915->display.gmbus.bus[pin]->adapter;
1066c349dbc7Sjsg }
1067c349dbc7Sjsg 
intel_gmbus_force_bit(struct i2c_adapter * adapter,bool force_bit)1068c349dbc7Sjsg void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit)
1069c349dbc7Sjsg {
1070c349dbc7Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
10711bb76ff1Sjsg 	struct drm_i915_private *i915 = bus->i915;
1072c349dbc7Sjsg 
10731bb76ff1Sjsg 	mutex_lock(&i915->display.gmbus.mutex);
1074c349dbc7Sjsg 
1075c349dbc7Sjsg 	bus->force_bit += force_bit ? 1 : -1;
10761bb76ff1Sjsg 	drm_dbg_kms(&i915->drm,
1077c349dbc7Sjsg 		    "%sabling bit-banging on %s. force bit now %d\n",
1078c349dbc7Sjsg 		    force_bit ? "en" : "dis", adapter->name,
1079c349dbc7Sjsg 		    bus->force_bit);
1080c349dbc7Sjsg 
10811bb76ff1Sjsg 	mutex_unlock(&i915->display.gmbus.mutex);
1082c349dbc7Sjsg }
1083c349dbc7Sjsg 
intel_gmbus_is_forced_bit(struct i2c_adapter * adapter)1084c349dbc7Sjsg bool intel_gmbus_is_forced_bit(struct i2c_adapter *adapter)
1085c349dbc7Sjsg {
1086c349dbc7Sjsg 	struct intel_gmbus *bus = to_intel_gmbus(adapter);
1087c349dbc7Sjsg 
1088c349dbc7Sjsg 	return bus->force_bit;
1089c349dbc7Sjsg }
1090c349dbc7Sjsg 
intel_gmbus_teardown(struct drm_i915_private * i915)10911bb76ff1Sjsg void intel_gmbus_teardown(struct drm_i915_private *i915)
1092c349dbc7Sjsg {
1093c349dbc7Sjsg 	unsigned int pin;
1094c349dbc7Sjsg 
10951bb76ff1Sjsg 	for (pin = 0; pin < ARRAY_SIZE(i915->display.gmbus.bus); pin++) {
10961bb76ff1Sjsg 		struct intel_gmbus *bus;
10971bb76ff1Sjsg 
10981bb76ff1Sjsg 		bus = i915->display.gmbus.bus[pin];
10991bb76ff1Sjsg 		if (!bus)
1100c349dbc7Sjsg 			continue;
1101c349dbc7Sjsg 
1102c349dbc7Sjsg 		i2c_del_adapter(&bus->adapter);
11031bb76ff1Sjsg 
11041bb76ff1Sjsg 		kfree(bus);
11051bb76ff1Sjsg 		i915->display.gmbus.bus[pin] = NULL;
1106c349dbc7Sjsg 	}
1107c349dbc7Sjsg }
1108*f005ef32Sjsg 
intel_gmbus_irq_handler(struct drm_i915_private * i915)1109*f005ef32Sjsg void intel_gmbus_irq_handler(struct drm_i915_private *i915)
1110*f005ef32Sjsg {
1111*f005ef32Sjsg 	wake_up_all(&i915->display.gmbus.wait_queue);
1112*f005ef32Sjsg }
1113