Skip to content

Commit

Permalink
drm/i915: merge gmbus and gpio i2c adpater into one
Browse files Browse the repository at this point in the history
... and directly call the newly exported i2c bit-banging functions.

The code is still pretty convoluted because we only set up the gpio
i2c stuff when actually falling back, resulting in more complexity
than necessary. This will be fixed up in the next patch.

v2: Use exported i2c_bit_algo vtable instead of exported functions.

Reviewed-by: Eugeni Dodonov <eugeni.dodonov@intel.com>
Signed-Off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
  • Loading branch information
Daniel Vetter committed Feb 29, 2012
1 parent 36c785f commit c167a6f
Show file tree
Hide file tree
Showing 2 changed files with 7 additions and 33 deletions.
2 changes: 2 additions & 0 deletions drivers/gpu/drm/i915/i915_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,7 @@
#include "intel_ringbuffer.h"
#include <linux/io-mapping.h>
#include <linux/i2c.h>
#include <linux/i2c-algo-bit.h>
#include <drm/intel-gtt.h>
#include <linux/backlight.h>

Expand Down Expand Up @@ -303,6 +304,7 @@ struct intel_gmbus {
struct i2c_adapter *force_bit;
u32 reg0;
u32 gpio_reg;
struct i2c_algo_bit_data bit_algo;
struct drm_i915_private *dev_priv;
};

Expand Down
38 changes: 5 additions & 33 deletions drivers/gpu/drm/i915/intel_i2c.c
Original file line number Diff line number Diff line change
Expand Up @@ -154,29 +154,18 @@ intel_gpio_create(struct intel_gmbus *bus, u32 pin)
0,
GPIOF,
};
struct i2c_adapter *adapter;
struct i2c_algo_bit_data *algo;

if (pin >= ARRAY_SIZE(map_pin_to_reg) || !map_pin_to_reg[pin])
return NULL;

adapter = kzalloc(sizeof(struct i2c_adapter), GFP_KERNEL);
if (adapter == NULL)
return NULL;

algo = kzalloc(sizeof(struct i2c_algo_bit_data), GFP_KERNEL);
if (algo == NULL)
goto out_adap;
algo = &bus->bit_algo;

bus->gpio_reg = map_pin_to_reg[pin];
if (HAS_PCH_SPLIT(dev_priv->dev))
bus->gpio_reg += PCH_GPIOA - GPIOA;

snprintf(adapter->name, sizeof(adapter->name),
"i915 GPIO%c", "?BACDE?F"[pin]);
adapter->owner = THIS_MODULE;
adapter->algo_data = algo;
adapter->dev.parent = &dev_priv->dev->pdev->dev;
bus->adapter.algo_data = algo;
algo->setsda = set_data;
algo->setscl = set_clock;
algo->getsda = get_data;
Expand All @@ -185,16 +174,7 @@ intel_gpio_create(struct intel_gmbus *bus, u32 pin)
algo->timeout = usecs_to_jiffies(2200);
algo->data = bus;

if (i2c_bit_add_bus(adapter))
goto out_algo;

return adapter;

out_algo:
kfree(algo);
out_adap:
kfree(adapter);
return NULL;
return &bus->adapter;
}

static int
Expand All @@ -213,7 +193,7 @@ intel_i2c_quirk_xfer(struct intel_gmbus *bus,
set_clock(bus, 1);
udelay(I2C_RISEFALL_TIME);

ret = adapter->algo->master_xfer(adapter, msgs, num);
ret = i2c_bit_algo.master_xfer(adapter, msgs, num);

set_data(bus, 1);
set_clock(bus, 1);
Expand Down Expand Up @@ -353,7 +333,7 @@ static u32 gmbus_func(struct i2c_adapter *adapter)
adapter);

if (bus->force_bit)
bus->force_bit->algo->functionality(bus->force_bit);
i2c_bit_algo.functionality(bus->force_bit);

return (I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL |
/* I2C_FUNC_10BIT_ADDR | */
Expand Down Expand Up @@ -449,9 +429,6 @@ void intel_gmbus_force_bit(struct i2c_adapter *adapter, bool force_bit)
}
} else {
if (bus->force_bit) {
i2c_del_adapter(bus->force_bit);
kfree(bus->force_bit->algo);
kfree(bus->force_bit);
bus->force_bit = NULL;
}
}
Expand All @@ -467,11 +444,6 @@ void intel_teardown_gmbus(struct drm_device *dev)

for (i = 0; i < GMBUS_NUM_PORTS; i++) {
struct intel_gmbus *bus = &dev_priv->gmbus[i];
if (bus->force_bit) {
i2c_del_adapter(bus->force_bit);
kfree(bus->force_bit->algo);
kfree(bus->force_bit);
}
i2c_del_adapter(&bus->adapter);
}

Expand Down

0 comments on commit c167a6f

Please sign in to comment.