コード例 #1
0
static int s2mu003_led_setup(struct s2mu003_led_data *led_data)
{
	int ret = 0;
	int mask, value;

	ret = s2mu003_assign_bits(led_data->i2c, 0x89, 0x08, 0x08);
	if (ret < 0)
		goto out;

	ret = s2mu003_assign_bits(led_data->i2c, S2MU003_FLED_CTRL2,
			S2MU003_EN_CHANNEL_SHARE_MASK, 0x80);
	if (ret < 0)
		goto out;

	ret = s2mu003_assign_bits(led_data->i2c,
			S2MU003_FLED_CH1_CTRL3, 0x80, 0x80);
	if (ret < 0)
		goto out;

	ret = s2mu003_assign_bits(led_data->i2c, S2MU003_FLED_CH1_CTRL3,
			S2MU003_TIMEOUT_MAX, S2MU003_FLASH_TIMEOUT_992MS);
	if (ret < 0)
		goto out;

	ret = s2mu003_assign_bits(led_data->i2c, S2MU003_FLED_CH1_CTRL2,
			S2MU003_TIMEOUT_MAX, S2MU003_TORCH_TIMEOUT_15728MS);
	if (ret < 0)
		goto out;

#ifdef CONFIG_S2MU003_LED_GPIO
	value =	S2MU003_FLASH_ON_GPIO | S2MU003_TORCH_ON_GPIO;
#else
	value =	S2MU003_FLASH_TORCH_OFF;
#endif
	mask = S2MU003_TORCH_ENABLE_MASK | S2MU003_FLASH_ENABLE_MASK;
	ret = s2mu003_assign_bits(led_data->i2c, S2MU003_FLED_CH1_CTRL4,
		mask, value);

	if (ret < 0)
		goto out;

	pr_info("%s : led setup complete\n", __func__);
	return ret;

out:
	pr_err("%s : led setup fail\n", __func__);
	return ret;
}
int s2mu003_clr_bits(struct i2c_client *i2c, int reg,
		u8 mask)
{
	return s2mu003_assign_bits(i2c, reg, mask, 0);
}
コード例 #3
0
static int ta_notification(struct notifier_block *nb,
		unsigned long action, void *data)
{
	muic_attached_dev_t attached_dev = *(muic_attached_dev_t *)data;
	u8 temp;
	int ret;
	struct s2mu003_led_data *led_data =
		container_of(nb, struct s2mu003_led_data, batt_nb);

	switch (action) {
	case MUIC_NOTIFY_CMD_DETACH:
	case MUIC_NOTIFY_CMD_LOGICALLY_DETACH:
		pr_info("%s : DETACH\n", __func__);
		if (!led_data->attach_ta)
			goto err;

		pr_info("%s : TA DETACH\n", __func__);
		ret = s2mu003_assign_bits(led_data->i2c,
			S2MU003_FLED_CTRL1, 0x80, 0x00);
		if (ret < 0)
			goto err;

		temp = s2mu003_reg_read(led_data->i2c,
				S2MU003_FLED_CH1_CTRL4);
		if ((temp & 0x0C) == 0x0C) {
			ret = s2mu003_assign_bits(led_data->i2c,
				S2MU003_FLED_CH1_CTRL4,
				S2MU003_TORCH_ENABLE_MASK,
				S2MU003_FLASH_TORCH_OFF);

			pr_info("%s : LED OFF\n", __func__);
			if (ret < 0)
				goto err;
			ret = s2mu003_assign_bits(led_data->i2c,
				S2MU003_FLED_CH1_CTRL4,
				S2MU003_TORCH_ENABLE_MASK,
				S2MU003_TORCH_ON_I2C);

			pr_info("%s : LED ON\n", __func__);
			if (ret < 0)
				goto err;
		}
		break;

	case MUIC_NOTIFY_CMD_ATTACH:
	case MUIC_NOTIFY_CMD_LOGICALLY_ATTACH:
		pr_info("%s : ATTACH", __func__);
		led_data->attach_ta = 0;
		attach_cable_check(attached_dev, &led_data->attach_ta);
		if (led_data->attach_ta) {
			ret = s2mu003_assign_bits(led_data->i2c,
				S2MU003_FLED_CTRL1, 0x80, 0x80);

			pr_info("%s : TA ATTACH\n", __func__);
			if (ret < 0)
				goto err;
		}
		return 0;
	default:
		goto err;
		break;
	}

	pr_info("%s : complete TA detached\n", __func__);
	return 0;
err:
	pr_err("%s : abandond access %d\n", __func__, led_data->attach_ta);
	return 0;
}
コード例 #4
0
static void led_set(struct s2mu003_led_data *led_data)
{
	int ret, boost_mode;
	struct s2mu003_led *data = led_data->data;
	int id = data->id;
	u8 mask = 0, reg = 0;

#ifdef CONFIG_S2MU003_LED_GPIO
	int gpio_pin;
#else
	u8 enable_mask, value;
#endif
	if (id == S2MU003_FLASH_LED) {
		pr_info("%s led mode is flash\n", __func__);
		reg = S2MU003_FLED_CH1_CTRL0;
		mask = S2MU003_FLASH_IOUT_MASK;
		boost_mode = 0x0;
#ifdef CONFIG_S2MU003_LED_GPIO
		pr_info("%s gpio_flash mode\n", __func__);
		gpio_pin = led_data->flash_pin;
#endif
	} else {
		pr_info("%s led mode is torch\n", __func__);
		reg = S2MU003_FLED_CH1_CTRL1;
		mask = S2MU003_TORCH_IOUT_MASK;
		boost_mode = 0x4;
#ifdef CONFIG_S2MU003_LED_GPIO
		pr_info("%s gpio_torch mode\n", __func__);
		gpio_pin = led_data->torch_pin;
#endif
	}


#ifdef CONFIG_S2MU003_LED_GPIO
	if (gpio_is_valid(gpio_pin)) {
		ret = devm_gpio_request(led_data->cdev.dev, gpio_pin,
				"s2mu003_gpio");
		if (ret) {
			pr_err("%s : fail to assignment gpio\n", __func__);
			goto gpio_free_data;
		}
	}
#endif
	pr_info("%s start led_set\n", __func__);

	if (led_data->test_brightness == LED_OFF) {
		ret = s2mu003_assign_bits(led_data->i2c, reg,
				mask, led_data->data->brightness);
		if (ret < 0)
			goto error_set_bits;

#ifdef CONFIG_S2MU003_LED_GPIO
		gpio_direction_output(gpio_pin, 0);
		goto gpio_free_data;
#else
		value = S2MU003_FLASH_TORCH_OFF;
#endif
	} else {
		pr_info("%s led on\n", __func__);

		ret = s2mu003_assign_bits(led_data->i2c,
			S2MU003_FLED_CTRL1,
			S2MU003_BOOST_FLASH_MODE_MASK, boost_mode);
		if (ret < 0)
			goto error_set_bits;

		ret = s2mu003_assign_bits(led_data->i2c,
				reg, mask, led_data->test_brightness);
		if (ret < 0)
			goto error_set_bits;

#ifdef CONFIG_S2MU003_LED_GPIO
		gpio_direction_output(gpio_pin, 1);
		goto gpio_free_data;
#else
		value = id ? S2MU003_TORCH_ON_I2C : S2MU003_FLASH_ON_I2C;
#endif
	}
#ifndef CONFIG_S2MU003_LED_GPIO
	enable_mask = id ? S2MU003_TORCH_ENABLE_MASK :
		S2MU003_FLASH_ENABLE_MASK;

	ret = s2mu003_assign_bits(led_data->i2c,
		S2MU003_FLED_CH1_CTRL4,
		enable_mask, value);

	if (ret < 0)
		goto error_set_bits;
#endif
	return;

#ifdef CONFIG_S2MU003_LED_GPIO
gpio_free_data:
	gpio_free(gpio_pin);
	pr_info("%s : gpio free\n", __func__);
	return;
#endif
error_set_bits:
	pr_err("%s: can't set led level %d\n", __func__, ret);
	return;
}