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