mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 18:51:56 -04:00
Merge branch 'i2c/for-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux
Pull i2c updates from Wolfram Sang:
- Peter Rosin did some major rework on the locking of i2c muxes by
seperating parent-locked muxes and mux-locked muxes.
This avoids deadlocks/workarounds when the mux itself needs i2c
commands for muxing. And as a side-effect, other workarounds in the
media layer could be eliminated. Also, Peter stepped up as the i2c
mux maintainer and will keep an eye on these changes.
- major updates to the octeon driver
- add a helper to the core to generate the address+rw_bit octal and
make drivers use it
- quite a bunch of driver updates
* 'i2c/for-4.7' of git://git.kernel.org/pub/scm/linux/kernel/git/wsa/linux: (84 commits)
i2c: rcar: add DMA support
i2c: st: Implement bus clear
i2c: only check scl functions when using generic recovery
i2c: algo-bit: declare i2c_bit_quirk_no_clk_stretch as static
i2c: tegra: disable clock before returning error
[media] rtl2832: regmap is aware of lockdep, drop local locking hack
[media] rtl2832_sdr: get rid of empty regmap wrappers
[media] rtl2832: change the i2c gate to be mux-locked
[media] si2168: change the i2c gate to be mux-locked
iio: imu: inv_mpu6050: change the i2c gate to be mux-locked
i2c: mux: document i2c muxes and elaborate on parent-/mux-locked muxes
i2c: mux: relax locking of the top i2c adapter during mux-locked muxing
i2c: muxes always lock the parent adapter
i2c: allow adapter drivers to override the adapter locking
i2c: uniphier: add "\n" at the end of error log
i2c: mv64xxx: remove CONFIG_HAVE_CLK conditionals
i2c: mv64xxx: use clk_{prepare_enable,disable_unprepare}
i2c: mv64xxx: handle probe deferral for the clock
i2c: mv64xxx: enable the driver on ARCH_MVEBU
i2c: octeon: Add workaround for broken irqs on CN3860
...
This commit is contained in:
commit
78975f23cb
67 changed files with 2648 additions and 1445 deletions
|
|
@ -1692,13 +1692,7 @@ static struct i2c_driver unittest_i2c_dev_driver = {
|
|||
|
||||
#if IS_BUILTIN(CONFIG_I2C_MUX)
|
||||
|
||||
struct unittest_i2c_mux_data {
|
||||
int nchans;
|
||||
struct i2c_adapter *adap[];
|
||||
};
|
||||
|
||||
static int unittest_i2c_mux_select_chan(struct i2c_adapter *adap,
|
||||
void *client, u32 chan)
|
||||
static int unittest_i2c_mux_select_chan(struct i2c_mux_core *muxc, u32 chan)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
|
@ -1706,11 +1700,11 @@ static int unittest_i2c_mux_select_chan(struct i2c_adapter *adap,
|
|||
static int unittest_i2c_mux_probe(struct i2c_client *client,
|
||||
const struct i2c_device_id *id)
|
||||
{
|
||||
int ret, i, nchans, size;
|
||||
int ret, i, nchans;
|
||||
struct device *dev = &client->dev;
|
||||
struct i2c_adapter *adap = to_i2c_adapter(dev->parent);
|
||||
struct device_node *np = client->dev.of_node, *child;
|
||||
struct unittest_i2c_mux_data *stm;
|
||||
struct i2c_mux_core *muxc;
|
||||
u32 reg, max_reg;
|
||||
|
||||
dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
|
||||
|
|
@ -1734,25 +1728,20 @@ static int unittest_i2c_mux_probe(struct i2c_client *client,
|
|||
return -EINVAL;
|
||||
}
|
||||
|
||||
size = offsetof(struct unittest_i2c_mux_data, adap[nchans]);
|
||||
stm = devm_kzalloc(dev, size, GFP_KERNEL);
|
||||
if (!stm) {
|
||||
dev_err(dev, "Out of memory\n");
|
||||
muxc = i2c_mux_alloc(adap, dev, nchans, 0, 0,
|
||||
unittest_i2c_mux_select_chan, NULL);
|
||||
if (!muxc)
|
||||
return -ENOMEM;
|
||||
}
|
||||
stm->nchans = nchans;
|
||||
for (i = 0; i < nchans; i++) {
|
||||
stm->adap[i] = i2c_add_mux_adapter(adap, dev, client,
|
||||
0, i, 0, unittest_i2c_mux_select_chan, NULL);
|
||||
if (!stm->adap[i]) {
|
||||
ret = i2c_mux_add_adapter(muxc, 0, i, 0);
|
||||
if (ret) {
|
||||
dev_err(dev, "Failed to register mux #%d\n", i);
|
||||
for (i--; i >= 0; i--)
|
||||
i2c_del_mux_adapter(stm->adap[i]);
|
||||
i2c_mux_del_adapters(muxc);
|
||||
return -ENODEV;
|
||||
}
|
||||
}
|
||||
|
||||
i2c_set_clientdata(client, stm);
|
||||
i2c_set_clientdata(client, muxc);
|
||||
|
||||
return 0;
|
||||
};
|
||||
|
|
@ -1761,12 +1750,10 @@ static int unittest_i2c_mux_remove(struct i2c_client *client)
|
|||
{
|
||||
struct device *dev = &client->dev;
|
||||
struct device_node *np = client->dev.of_node;
|
||||
struct unittest_i2c_mux_data *stm = i2c_get_clientdata(client);
|
||||
int i;
|
||||
struct i2c_mux_core *muxc = i2c_get_clientdata(client);
|
||||
|
||||
dev_dbg(dev, "%s for node @%s\n", __func__, np->full_name);
|
||||
for (i = stm->nchans - 1; i >= 0; i--)
|
||||
i2c_del_mux_adapter(stm->adap[i]);
|
||||
i2c_mux_del_adapters(muxc);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue