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