static int marimba_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct marimba_platform_data *pdata = client->dev.platform_data; struct i2c_adapter *ssbi_adap; struct marimba *marimba; int i, status; if (!pdata) { dev_dbg(&client->dev, "no platform data?\n"); return -EINVAL; } if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) { dev_dbg(&client->dev, "can't talk I2C?\n"); return -EIO; } if (inuse) { dev_dbg(&client->dev, "driver already in use\n"); return -EBUSY; } for (i = 0; i <= NUM_ADD; i++) { marimba = &marimba_modules[i]; if (i == 0) marimba->client = client; else { if (i != MARIMBA_ID_TSADC) marimba->client = i2c_new_dummy(client->adapter, pdata->slave_id[i]); else { ssbi_adap = i2c_get_adapter(MARIMBA_SSBI_ADAP); marimba->client = i2c_new_dummy(ssbi_adap, pdata->slave_id[i]); } if (!marimba->client) { dev_err(&marimba->client->dev, "can't attach client %d\n", i); status = -ENOMEM; goto fail; } strlcpy(marimba->client->name, id->name, sizeof(marimba->client->name)); } mutex_init(&marimba->xfer_lock); } inuse = true; if (pdata->marimba_setup != NULL) pdata->marimba_setup(); marimba_init_reg(client); status = marimba_add_child(pdata); return 0; fail: return status; }
static int marimba_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct marimba_platform_data *pdata = client->dev.platform_data; struct i2c_adapter *ssbi_adap; struct marimba *marimba; int i, status, rc, client_loop, adie_slave_idx_offset; int rc_bahama = 0, rc_marimba = 0; if (!pdata) { dev_dbg(&client->dev, "no platform data?\n"); return -EINVAL; } if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) { dev_dbg(&client->dev, "can't talk I2C?\n"); return -EIO; } /* First, identify the codec type */ if (pdata->marimba_setup != NULL) { rc_marimba = pdata->marimba_setup(); if (rc_marimba) pdata->marimba_shutdown(); } if (pdata->bahama_setup != NULL && cur_connv_type != BAHAMA_ID) { rc_bahama = pdata->bahama_setup(); if (rc_bahama) pdata->bahama_shutdown(cur_connv_type); } if (rc_marimba & rc_bahama) return -EAGAIN; marimba = &marimba_modules[ADIE_ARRY_SIZE - 1]; marimba->client = client; mutex_init(&marimba->xfer_lock); rc = get_adie_type(); mutex_destroy(&marimba->xfer_lock); if (rc < 0) { if (pdata->bahama_setup != NULL) pdata->bahama_shutdown(cur_adie_type); if (pdata->marimba_shutdown != NULL) pdata->marimba_shutdown(); return 0; } if (rc < 2) { adie_arry_idx = 0; adie_slave_idx_offset = 0; client_loop = 0; cur_codec_type = rc; if (cur_connv_type < 0) cur_connv_type = rc; if (pdata->bahama_shutdown != NULL) pdata->bahama_shutdown(cur_connv_type); } else { adie_arry_idx = 5; adie_slave_idx_offset = 5; client_loop = 1; cur_connv_type = rc; } marimba = &marimba_modules[adie_arry_idx]; marimba->client = client; mutex_init(&marimba->xfer_lock); for (i = 1; i <= (NUM_ADD - client_loop); i++) { /* Skip adding BT/FM for Timpani */ if (i == 1 && rc >= 1) i++; marimba = &marimba_modules[i + adie_arry_idx]; if (i != MARIMBA_ID_TSADC) marimba->client = i2c_new_dummy(client->adapter, pdata->slave_id[i + adie_slave_idx_offset]); else { ssbi_adap = i2c_get_adapter(MARIMBA_SSBI_ADAP); marimba->client = i2c_new_dummy(ssbi_adap, 0x55); } if (!marimba->client) { dev_err(&marimba->client->dev, "can't attach client %d\n", i); status = -ENOMEM; goto fail; } strlcpy(marimba->client->name, id->name, sizeof(marimba->client->name)); mutex_init(&marimba->xfer_lock); } marimba_init_reg(client, id->driver_data); status = marimba_add_child(pdata, id->driver_data); marimba_pdata = pdata; return 0; fail: return status; }
static int __devinit marimba_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct marimba_platform_data *pdata = client->dev.platform_data; struct i2c_adapter *ssbi_adap; struct marimba *marimba; int i, status, rc, client_loop, adie_slave_idx_offset; int rc_bahama = 0, rc_marimba = 0; if (!pdata) { dev_dbg(&client->dev, "no platform data?\n"); status = -EINVAL; goto fail; } if (i2c_check_functionality(client->adapter, I2C_FUNC_I2C) == 0) { dev_dbg(&client->dev, "can't talk I2C?\n"); status = -EIO; goto fail; } if (!mutex_initialized) { for (i = 0; i < ADIE_ARRY_SIZE; ++i) { marimba = &marimba_modules[i]; mutex_init(&marimba->xfer_lock); } mutex_initialized = 1; } /* */ if (pdata->marimba_setup != NULL) { rc_marimba = pdata->marimba_setup(); if (rc_marimba) pdata->marimba_shutdown(); } if (pdata->bahama_setup != NULL && cur_connv_type != BAHAMA_ID) { rc_bahama = pdata->bahama_setup(); if (rc_bahama) pdata->bahama_shutdown(cur_connv_type); } if (rc_marimba & rc_bahama) { status = -EAGAIN; goto fail; } marimba = &marimba_modules[ADIE_ARRY_SIZE - 1]; marimba->client = client; rc = get_adie_type(); if (rc < 0) { if (pdata->bahama_setup != NULL) pdata->bahama_shutdown(cur_adie_type); if (pdata->marimba_shutdown != NULL) pdata->marimba_shutdown(); status = -ENODEV; goto fail; } if (rc < 2) { adie_arry_idx = 0; adie_slave_idx_offset = 0; client_loop = 0; cur_codec_type = rc; if (cur_connv_type < 0) cur_connv_type = rc; if (pdata->bahama_shutdown != NULL) pdata->bahama_shutdown(cur_connv_type); } else { adie_arry_idx = 5; adie_slave_idx_offset = 5; client_loop = 1; cur_connv_type = rc; } marimba = &marimba_modules[adie_arry_idx]; marimba->client = client; for (i = 1; i <= (NUM_ADD - client_loop); i++) { /* */ if (i == 1 && rc >= 1) i++; marimba = &marimba_modules[i + adie_arry_idx]; if (i != MARIMBA_ID_TSADC) marimba->client = i2c_new_dummy(client->adapter, pdata->slave_id[i + adie_slave_idx_offset]); else if (pdata->tsadc_ssbi_adap) { ssbi_adap = i2c_get_adapter(pdata->tsadc_ssbi_adap); marimba->client = i2c_new_dummy(ssbi_adap, 0x55); } else ssbi_adap = NULL; if (!marimba->client) { pr_err("can't attach client %d\n", i); status = -ENOMEM; goto fail; } strlcpy(marimba->client->name, id->name, sizeof(marimba->client->name)); } if (marimba_dbg_init(rc) != 0) pr_debug("%s: marimba debugfs init failed\n", __func__); marimba_init_reg(client, id->driver_data); status = marimba_add_child(pdata, id->driver_data); marimba_pdata = pdata; return 0; fail: return status; }