@@ -15,8 +15,6 @@
#include <linux/platform_device.h>
#include <linux/slab.h>
-#define CPLD_MUX_MAX_NCHANS 8
-
/* mlxcpld_mux - mux control structure:
* @last_chan - last register value
* @client - I2C device client
@@ -24,7 +22,7 @@
* @sel_buf: I2C message buffer for mux select 16 bits transactions
*/
struct mlxcpld_mux {
- u8 last_chan;
+ int last_chan;
struct i2c_client *client;
struct mlxcpld_mux_plat_data pdata;
u8 sel_buf[3];
@@ -94,7 +92,6 @@ static int mlxcpld_mux_select_chan(struct i2c_mux_core *muxc, u32 chan)
int err = 0;
/* Only select the channel if its different from the last channel */
- chan++;
if (mux->last_chan != chan) {
err = mlxcpld_mux_reg_write(muxc->parent, mux, chan);
mux->last_chan = err < 0 ? 0 : chan;
@@ -143,7 +140,7 @@ static int mlxcpld_mux_probe(struct platform_device *pdev)
if (!i2c_check_functionality(client->adapter, func))
return -ENODEV;
- muxc = i2c_mux_alloc(client->adapter, &pdev->dev, CPLD_MUX_MAX_NCHANS,
+ muxc = i2c_mux_alloc(client->adapter, &pdev->dev, pdata->num_adaps,
sizeof(*data), 0, mlxcpld_mux_select_chan,
mlxcpld_mux_deselect);
if (!muxc)
@@ -158,13 +155,9 @@ static int mlxcpld_mux_probe(struct platform_device *pdev)
data->last_chan = 0; /* force the first selection */
/* Create an adapter for each channel. */
- for (num = 0; num < CPLD_MUX_MAX_NCHANS; num++) {
- if (num >= pdata->num_adaps)
- /* discard unconfigured channels */
- break;
-
- force = pdata->adap_ids[num];
-
+ for (num = 0; num < pdata->num_adaps; num++) {
+ force = pdata->base_nr ? (pdata->base_nr +
+ pdata->adap_ids[num]) : pdata->adap_ids[num];
err = i2c_mux_add_adapter(muxc, force, num, 0);
if (err)
goto virt_reg_failed;
@@ -11,12 +11,15 @@
/* Platform data for the CPLD I2C multiplexers */
/* mlxcpld_mux_plat_data - per mux data, used with i2c_register_board_info
+ * @base_nr: base I2C bus number to number adapters from or zero for setting
+ * to adap_ids vector
* @adap_ids - adapter array
* @num_adaps - number of adapters
* @sel_reg_addr - mux select register offset in CPLD space
* @reg_size: register size in bytes (default 0 - 1 byte data, 1 - 2 bytes data
*/
struct mlxcpld_mux_plat_data {
+ int base_nr;
int *adap_ids;
int num_adaps;
int sel_reg_addr;