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;
}