Пример #1
0
static int ncp6335b_dcdc_probe(struct i2c_client *client,
				  const struct i2c_device_id *id)
{
	struct ncp6335b_platform_data *pdata;
	int ret;

	pr_err("[syscamera][%s::%d]\n", __func__, __LINE__);
	comp_dcdc_type = NCP6335B;

	pdata = devm_kzalloc(&client->dev,
			sizeof(struct ncp6335b_platform_data),
			GFP_KERNEL);
	if (!pdata) {
		dev_err(&client->dev, "Failed to allocate memory\n");
		return -ENOMEM;
	}

	ret = ncp6335b_parse_dt(&client->dev, pdata);
	if (ret) {
		pr_err("[%s] mc5587 parse dt failed\n", __func__);
		return ret;
	}

	if (pdata == NULL) {
		pr_err("[syscamera][%s::%d]missing platform data\n", __func__, __LINE__);
		return -ENODEV;
	}

	ncp_dev = kzalloc(sizeof(*ncp_dev), GFP_KERNEL);
	if (ncp_dev == NULL) {
		pr_err("[syscamera][%s::%d]failed to alloc memory\n", __func__, __LINE__);
		return -ENOMEM;
	}

	ncp_dev->client = client;

	mutex_init(&ncp_dev->lock);

	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
		pr_err("[syscamera][%s::%d]SMBUS Byte Data not Supported\n", __func__, __LINE__);
		kfree(ncp_dev);
		ncp_dev = NULL;
		return -EIO;
	}

#if 0 //delete init setting
	ret = ncp6335b_read(ncp_dev->client);
	pr_err("[syscamera][%s::%d][PID::%d]",__FUNCTION__, __LINE__, ret);

	ncp6335b_write(ncp_dev->client, 0xC0);//default 1.0V
#endif

	i2c_set_clientdata(client, ncp_dev);

	return 0;
}
Пример #2
0
static int __devinit ncp6335b_probe(struct i2c_client *client,
				  const struct i2c_device_id *id)
{
	struct ncp6335b_platform_data *pdata;
	struct ncp6335b_dev *dev = NULL;
#ifdef CONFIG_SOC_EXYNOS5422
	struct regulator *regulator = NULL;
	const char power_name[] = "CAM_IO_1.8V_AP";
#endif
	int ret = 0;

	if (client->dev.of_node) {
		pdata = devm_kzalloc(&client->dev,
			sizeof(struct ncp6335b_platform_data), GFP_KERNEL);
		if (!pdata) {
			dev_err(&client->dev, "Failed to allocate memory\n");
			return -ENOMEM;
		}

		ret = ncp6335b_parse_dt(&client->dev, pdata);
		if (ret) {
			pr_err("%s: ncp6335b parse dt failed\n", __func__);
			return ret;
		}
	} else
		pdata = client->dev.platform_data;

	if (!pdata) {
		pr_err("%s: missing platform data\n", __func__);
		ret =  -ENODEV;
		goto pdata_err;
	}

	if (!i2c_check_functionality(client->adapter, I2C_FUNC_SMBUS_BYTE_DATA)) {
		pr_err("%s: SMBUS Byte Data not Supported\n", __func__);
		ret =  -EIO;
		goto pdata_err;
	}

	dev = (struct ncp6335b_dev *)kzalloc(sizeof(*dev), GFP_KERNEL);
	if (unlikely(!dev)) {
		pr_err("%s: failed to alloc memory\n", __func__);
		ret =  -ENOMEM;
		goto pdata_err;
	}

	dev->client = client;

	mutex_init(&dev->lock);

#ifdef CONFIG_SOC_EXYNOS5422
	regulator = regulator_get(NULL, power_name);
	if (IS_ERR(regulator)) {
		pr_err("%s : regulator_get(%s) fail\n", __func__, power_name);
		goto err;
	}

	if (regulator_is_enabled(regulator)) {
		pr_info("%s regulator is already enabled\n", power_name);
	} else {
		ret = regulator_enable(regulator);
		if (unlikely(ret)) {
			pr_err("%s : regulator_enable(%s) fail\n", __func__, power_name);
			goto err;
		}
	}
	usleep_range(1000, 1000);
#endif

	/*ret = ncp6335b_read_voltage(dev->client);
	if (ret < 0) {
		pr_err("%s: error, first read\n", __func__);
		goto err;
	}*/

	ret = ncp6335b_set_voltage(dev->client);
	if (ret < 0) {
		pr_err("%s: error, fail to set voltage\n", __func__);
		goto err;
	}

	ret = ncp6335b_read_voltage(dev->client);
	if (ret < 0) {
		pr_err("%s: error, fail to read voltage\n", __func__);
		goto err;
	}

#ifdef CONFIG_SOC_EXYNOS5422
	ret = regulator_disable(regulator);
	if (unlikely(ret)) {
		pr_err("%s: regulator_disable(%s) fail\n", __func__, power_name);
		goto err;
	}
	regulator_put(regulator);
#endif

	i2c_set_clientdata(client, dev);

	pr_info("%s %s: ncp6335b probed\n",
		dev_driver_string(&client->dev), dev_name(&client->dev));

	return 0;

err:
	mutex_destroy(&dev->lock);
	kfree((void *)dev);
pdata_err:
	devm_kfree(&client->dev, (void *)pdata);
#ifdef CONFIG_SOC_EXYNOS5422
	if (!IS_ERR_OR_NULL(regulator)) {
		ret = regulator_disable(regulator);
		if (unlikely(ret)) {
			pr_err("%s: regulator_disable(%s) fail\n", __func__, power_name);
		}
		regulator_put(regulator);
	}
#endif
	return ret;
}