| From foo@baz Fri Aug 8 09:26:33 PDT 2014 |
| From: Christopher Alexander Tobias Schulze <cat.schulze@alice-dsl.net> |
| Date: Sun, 3 Aug 2014 15:44:52 +0200 |
| Subject: bbc-i2c: Fix BBC I2C envctrl on SunBlade 2000 |
| |
| From: Christopher Alexander Tobias Schulze <cat.schulze@alice-dsl.net> |
| |
| [ Upstream commit 5cdceab3d5e02eb69ea0f5d8fa9181800baf6f77 ] |
| |
| Fix regression in bbc i2c temperature and fan control on some Sun systems |
| that causes the driver to refuse to load due to the bbc_i2c_bussel resource not |
| being present on the (second) i2c bus where the temperature sensors and fan |
| control are located. (The check for the number of resources was removed when |
| the driver was ported to a pure OF driver in mid 2008.) |
| |
| Signed-off-by: Christopher Alexander Tobias Schulze <cat.schulze@alice-dsl.net> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/sbus/char/bbc_envctrl.c | 6 ++++++ |
| drivers/sbus/char/bbc_i2c.c | 11 ++++++++--- |
| 2 files changed, 14 insertions(+), 3 deletions(-) |
| |
| --- a/drivers/sbus/char/bbc_envctrl.c |
| +++ b/drivers/sbus/char/bbc_envctrl.c |
| @@ -452,6 +452,9 @@ static void attach_one_temp(struct bbc_i |
| if (!tp) |
| return; |
| |
| + INIT_LIST_HEAD(&tp->bp_list); |
| + INIT_LIST_HEAD(&tp->glob_list); |
| + |
| tp->client = bbc_i2c_attach(bp, op); |
| if (!tp->client) { |
| kfree(tp); |
| @@ -497,6 +500,9 @@ static void attach_one_fan(struct bbc_i2 |
| if (!fp) |
| return; |
| |
| + INIT_LIST_HEAD(&fp->bp_list); |
| + INIT_LIST_HEAD(&fp->glob_list); |
| + |
| fp->client = bbc_i2c_attach(bp, op); |
| if (!fp->client) { |
| kfree(fp); |
| --- a/drivers/sbus/char/bbc_i2c.c |
| +++ b/drivers/sbus/char/bbc_i2c.c |
| @@ -300,13 +300,18 @@ static struct bbc_i2c_bus * attach_one_i |
| if (!bp) |
| return NULL; |
| |
| + INIT_LIST_HEAD(&bp->temps); |
| + INIT_LIST_HEAD(&bp->fans); |
| + |
| bp->i2c_control_regs = of_ioremap(&op->resource[0], 0, 0x2, "bbc_i2c_regs"); |
| if (!bp->i2c_control_regs) |
| goto fail; |
| |
| - bp->i2c_bussel_reg = of_ioremap(&op->resource[1], 0, 0x1, "bbc_i2c_bussel"); |
| - if (!bp->i2c_bussel_reg) |
| - goto fail; |
| + if (op->num_resources == 2) { |
| + bp->i2c_bussel_reg = of_ioremap(&op->resource[1], 0, 0x1, "bbc_i2c_bussel"); |
| + if (!bp->i2c_bussel_reg) |
| + goto fail; |
| + } |
| |
| bp->waiting = 0; |
| init_waitqueue_head(&bp->wq); |