static int __init fsa9285_i2c_init(void) { fsa9285_i2c_device.platform_data = fsa9285_platform_data(); return i2c_register_board_info(3, &fsa9285_i2c_device, 1); }
static int fsa9285_probe(struct i2c_client *client, const struct i2c_device_id *id) { struct i2c_adapter *adapter = to_i2c_adapter(client->dev.parent); struct device *dev = &client->dev; struct fsa9285_chip *chip; int ret = 0; if (!i2c_check_functionality(adapter, I2C_FUNC_SMBUS_BYTE_DATA)) return -EIO; ret = fsa9285_read_reg(client, FSA9285_REG_DEVID); if (ret < 0 || ret != DEVID_VALUE) { dev_err(&client->dev, "fsa chip ID check failed:%d\n", ret); return -ENODEV; } chip = kzalloc(sizeof(struct fsa9285_chip), GFP_KERNEL); if (!chip) { dev_err(&client->dev, "failed to allocate driver data\n"); return -ENOMEM; } chip->client = client; chip->pdata = dev->platform_data; chip->pdata = fsa9285_platform_data(); i2c_set_clientdata(client, chip); chip_ptr = chip; /* register with extcon */ chip->edev = kzalloc(sizeof(struct extcon_dev), GFP_KERNEL); if (!chip->edev) { dev_err(&client->dev, "mem alloc failed\n"); ret = -ENOMEM; goto extcon_mem_failed; } chip->edev->name = "fsa9285"; chip->edev->supported_cable = fsa9285_extcon_cable; ret = extcon_dev_register(chip->edev, &client->dev); if (ret) { dev_err(&client->dev, "extcon registration failed!!\n"); goto extcon_reg_failed; } /* OTG notification */ chip->otg = usb_get_phy(USB_PHY_TYPE_USB2); if (!chip->otg) { dev_warn(&client->dev, "Failed to get otg transceiver!!\n"); goto otg_reg_failed; } chip->otg->a_bus_drop = fsa9285_vbus_cntl_state; ret = fsa9285_irq_init(chip); if (ret) goto intr_reg_failed; wake_lock_init(&chip->wakelock, WAKE_LOCK_SUSPEND, "fsa_charger_wakelock"); /* device detection */ ret = fsa9285_detect_dev(chip); if (ret < 0) dev_warn(&client->dev, "probe: detection failed\n"); /* Init Runtime PM State */ pm_runtime_put_noidle(&chip->client->dev); pm_schedule_suspend(&chip->client->dev, MSEC_PER_SEC); return 0; intr_reg_failed: if (client->irq) free_irq(client->irq, chip); /* WA for FFRD8 */ if (chip->pdata->mux_gpio != -1) gpio_free(chip->pdata->mux_gpio); /* gpio_req_failed: */ usb_put_phy(chip->otg); otg_reg_failed: extcon_dev_unregister(chip->edev); extcon_reg_failed: kfree(chip->edev); extcon_mem_failed: kfree(chip); return ret; }