Lines Matching +full:brightness +full:- +full:level

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright 2009-2010 Analog Devices Inc.
32 #define ADP8860_BLMX1 0x09 /* Backlight (Brightness Level 1-daylight) maximum current */
33 #define ADP8860_BLDM1 0x0A /* Backlight (Brightness Level 1-daylight) dim current */
34 #define ADP8860_BLMX2 0x0B /* Backlight (Brightness Level 2-office) maximum current */
35 #define ADP8860_BLDM2 0x0C /* Backlight (Brightness Level 2-office) dim current */
36 #define ADP8860_BLMX3 0x0D /* Backlight (Brightness Level 3-dark) maximum current */
37 #define ADP8860_BLDM3 0x0E /* Backlight (Brightness Level 3-dark) dim current */
56 #define ADP8860_PH1LEVL 0x21 /* First phototransistor ambient light level-low byte register */
57 #define ADP8860_PH1LEVH 0x22 /* First phototransistor ambient light level-high byte register */
58 #define ADP8860_PH2LEVL 0x23 /* Second phototransistor ambient light level-low byte register */
59 #define ADP8860_PH2LEVH 0x24 /* Second phototransistor ambient light level-high byte register */
77 /* ADP8860_CCFG Main ALS comparator level enable */
124 dev_err(&client->dev, "failed reading at 0x%02x\n", reg); in adp8860_read()
143 mutex_lock(&data->lock); in adp8860_set_bits()
152 mutex_unlock(&data->lock); in adp8860_set_bits()
162 mutex_lock(&data->lock); in adp8860_clr_bits()
171 mutex_unlock(&data->lock); in adp8860_clr_bits()
183 adp8860_write(led->client, ADP8860_ISC1 - led->id + 1, in adp8860_led_work()
184 led->new_brightness >> 1); in adp8860_led_work()
193 led->new_brightness = value; in adp8860_led_set()
194 schedule_work(&led->work); in adp8860_led_set()
199 struct i2c_client *client = led->client; in adp8860_led_setup()
202 ret = adp8860_write(client, ADP8860_ISC1 - led->id + 1, 0); in adp8860_led_setup()
203 ret |= adp8860_set_bits(client, ADP8860_ISCC, 1 << (led->id - 1)); in adp8860_led_setup()
205 if (led->id > 4) in adp8860_led_setup()
207 (led->flags & 0x3) << ((led->id - 5) * 2)); in adp8860_led_setup()
210 (led->flags & 0x3) << ((led->id - 1) * 2)); in adp8860_led_setup()
218 dev_get_platdata(&client->dev); in adp8860_led_probe()
224 led = devm_kcalloc(&client->dev, pdata->num_leds, sizeof(*led), in adp8860_led_probe()
227 return -ENOMEM; in adp8860_led_probe()
229 ret = adp8860_write(client, ADP8860_ISCFR, pdata->led_fade_law); in adp8860_led_probe()
231 (pdata->led_on_time & 0x3) << 6); in adp8860_led_probe()
233 FADE_VAL(pdata->led_fade_in, pdata->led_fade_out)); in adp8860_led_probe()
236 dev_err(&client->dev, "failed to write\n"); in adp8860_led_probe()
240 for (i = 0; i < pdata->num_leds; ++i) { in adp8860_led_probe()
241 cur_led = &pdata->leds[i]; in adp8860_led_probe()
244 led_dat->id = cur_led->flags & ADP8860_FLAG_LED_MASK; in adp8860_led_probe()
246 if (led_dat->id > 7 || led_dat->id < 1) { in adp8860_led_probe()
247 dev_err(&client->dev, "Invalid LED ID %d\n", in adp8860_led_probe()
248 led_dat->id); in adp8860_led_probe()
249 ret = -EINVAL; in adp8860_led_probe()
253 if (pdata->bl_led_assign & (1 << (led_dat->id - 1))) { in adp8860_led_probe()
254 dev_err(&client->dev, "LED %d used by Backlight\n", in adp8860_led_probe()
255 led_dat->id); in adp8860_led_probe()
256 ret = -EBUSY; in adp8860_led_probe()
260 led_dat->cdev.name = cur_led->name; in adp8860_led_probe()
261 led_dat->cdev.default_trigger = cur_led->default_trigger; in adp8860_led_probe()
262 led_dat->cdev.brightness_set = adp8860_led_set; in adp8860_led_probe()
263 led_dat->cdev.brightness = LED_OFF; in adp8860_led_probe()
264 led_dat->flags = cur_led->flags >> FLAG_OFFT_SHIFT; in adp8860_led_probe()
265 led_dat->client = client; in adp8860_led_probe()
266 led_dat->new_brightness = LED_OFF; in adp8860_led_probe()
267 INIT_WORK(&led_dat->work, adp8860_led_work); in adp8860_led_probe()
269 ret = led_classdev_register(&client->dev, &led_dat->cdev); in adp8860_led_probe()
271 dev_err(&client->dev, "failed to register LED %d\n", in adp8860_led_probe()
272 led_dat->id); in adp8860_led_probe()
278 dev_err(&client->dev, "failed to write\n"); in adp8860_led_probe()
284 data->led = led; in adp8860_led_probe()
289 for (i = i - 1; i >= 0; --i) { in adp8860_led_probe()
300 dev_get_platdata(&client->dev); in adp8860_led_remove()
304 for (i = 0; i < pdata->num_leds; i++) { in adp8860_led_remove()
305 led_classdev_unregister(&data->led[i].cdev); in adp8860_led_remove()
306 cancel_work_sync(&data->led[i].work); in adp8860_led_remove()
323 static int adp8860_bl_set(struct backlight_device *bl, int brightness) in adp8860_bl_set() argument
326 struct i2c_client *client = data->client; in adp8860_bl_set()
329 if (data->en_ambl_sens) { in adp8860_bl_set()
330 if ((brightness > 0) && (brightness < ADP8860_MAX_BRIGHTNESS)) { in adp8860_bl_set()
334 ret |= adp8860_write(client, ADP8860_BLMX1, brightness); in adp8860_bl_set()
337 * MAX_BRIGHTNESS -> Enable Ambient Light auto adjust in adp8860_bl_set()
338 * restore daylight l1 sysfs brightness in adp8860_bl_set()
341 data->cached_daylight_max); in adp8860_bl_set()
346 ret |= adp8860_write(client, ADP8860_BLMX1, brightness); in adp8860_bl_set()
348 if (data->current_brightness && brightness == 0) in adp8860_bl_set()
351 else if (data->current_brightness == 0 && brightness) in adp8860_bl_set()
356 data->current_brightness = brightness; in adp8860_bl_set()
370 return data->current_brightness; in adp8860_bl_get_brightness()
381 struct i2c_client *client = data->client; in adp8860_bl_setup()
382 struct adp8860_backlight_platform_data *pdata = data->pdata; in adp8860_bl_setup()
385 ret |= adp8860_write(client, ADP8860_BLSEN, ~pdata->bl_led_assign); in adp8860_bl_setup()
386 ret |= adp8860_write(client, ADP8860_BLMX1, pdata->l1_daylight_max); in adp8860_bl_setup()
387 ret |= adp8860_write(client, ADP8860_BLDM1, pdata->l1_daylight_dim); in adp8860_bl_setup()
389 if (data->en_ambl_sens) { in adp8860_bl_setup()
390 data->cached_daylight_max = pdata->l1_daylight_max; in adp8860_bl_setup()
392 pdata->l2_office_max); in adp8860_bl_setup()
394 pdata->l2_office_dim); in adp8860_bl_setup()
396 pdata->l3_dark_max); in adp8860_bl_setup()
398 pdata->l3_dark_dim); in adp8860_bl_setup()
400 ret |= adp8860_write(client, ADP8860_L2_TRP, pdata->l2_trip); in adp8860_bl_setup()
401 ret |= adp8860_write(client, ADP8860_L2_HYS, pdata->l2_hyst); in adp8860_bl_setup()
402 ret |= adp8860_write(client, ADP8860_L3_TRP, pdata->l3_trip); in adp8860_bl_setup()
403 ret |= adp8860_write(client, ADP8860_L3_HYS, pdata->l3_hyst); in adp8860_bl_setup()
405 ALS_CCFG_VAL(pdata->abml_filt)); in adp8860_bl_setup()
409 BL_CFGR_VAL(pdata->bl_fade_law, 0)); in adp8860_bl_setup()
411 ret |= adp8860_write(client, ADP8860_BLFR, FADE_VAL(pdata->bl_fade_in, in adp8860_bl_setup()
412 pdata->bl_fade_out)); in adp8860_bl_setup()
415 (data->gdwn_dis ? GDWN_DIS : 0)); in adp8860_bl_setup()
426 mutex_lock(&data->lock); in adp8860_show()
427 error = adp8860_read(data->client, reg, &reg_val); in adp8860_show()
428 mutex_unlock(&data->lock); in adp8860_show()
447 mutex_lock(&data->lock); in adp8860_store()
448 adp8860_write(data->client, reg, val); in adp8860_store()
449 mutex_unlock(&data->lock); in adp8860_store()
493 int ret = kstrtoul(buf, 10, &data->cached_daylight_max); in adp8860_bl_l1_daylight_max_store()
557 mutex_lock(&data->lock); in adp8860_bl_ambient_light_level_show()
558 error = adp8860_read(data->client, ADP8860_PH1LEVL, &reg_val); in adp8860_bl_ambient_light_level_show()
561 error = adp8860_read(data->client, ADP8860_PH1LEVH, &reg_val); in adp8860_bl_ambient_light_level_show()
563 mutex_unlock(&data->lock); in adp8860_bl_ambient_light_level_show()
568 /* Return 13-bit conversion value for the first light sensor */ in adp8860_bl_ambient_light_level_show()
583 mutex_lock(&data->lock); in adp8860_bl_ambient_light_zone_show()
584 error = adp8860_read(data->client, ADP8860_CFGR, &reg_val); in adp8860_bl_ambient_light_zone_show()
585 mutex_unlock(&data->lock); in adp8860_bl_ambient_light_zone_show()
609 adp8860_set_bits(data->client, ADP8860_MDCR, CMP_AUTOEN); in adp8860_bl_ambient_light_zone_store()
612 adp8860_clr_bits(data->client, ADP8860_MDCR, CMP_AUTOEN); in adp8860_bl_ambient_light_zone_store()
615 mutex_lock(&data->lock); in adp8860_bl_ambient_light_zone_store()
616 ret = adp8860_read(data->client, ADP8860_CFGR, &reg_val); in adp8860_bl_ambient_light_zone_store()
619 reg_val |= (val - 1) << CFGR_BLV_SHIFT; in adp8860_bl_ambient_light_zone_store()
620 adp8860_write(data->client, ADP8860_CFGR, reg_val); in adp8860_bl_ambient_light_zone_store()
622 mutex_unlock(&data->lock); in adp8860_bl_ambient_light_zone_store()
656 dev_get_platdata(&client->dev); in adp8860_probe()
661 if (!i2c_check_functionality(client->adapter, in adp8860_probe()
663 dev_err(&client->dev, "SMBUS Byte Data not Supported\n"); in adp8860_probe()
664 return -EIO; in adp8860_probe()
668 dev_err(&client->dev, "no platform data?\n"); in adp8860_probe()
669 return -EINVAL; in adp8860_probe()
672 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); in adp8860_probe()
674 return -ENOMEM; in adp8860_probe()
682 data->gdwn_dis = !!pdata->gdwn_dis; in adp8860_probe()
685 data->en_ambl_sens = !!pdata->en_ambl_sens; in adp8860_probe()
688 data->gdwn_dis = !!pdata->gdwn_dis; in adp8860_probe()
691 dev_err(&client->dev, "failed to probe\n"); in adp8860_probe()
692 return -ENODEV; in adp8860_probe()
697 data->revid = ADP8860_DEVID(reg_val); in adp8860_probe()
698 data->client = client; in adp8860_probe()
699 data->pdata = pdata; in adp8860_probe()
700 data->id = id->driver_data; in adp8860_probe()
701 data->current_brightness = 0; in adp8860_probe()
708 mutex_init(&data->lock); in adp8860_probe()
710 bl = devm_backlight_device_register(&client->dev, in adp8860_probe()
711 dev_driver_string(&client->dev), in adp8860_probe()
712 &client->dev, data, &adp8860_bl_ops, &props); in adp8860_probe()
714 dev_err(&client->dev, "failed to register backlight\n"); in adp8860_probe()
718 bl->props.brightness = ADP8860_MAX_BRIGHTNESS; in adp8860_probe()
720 data->bl = bl; in adp8860_probe()
722 if (data->en_ambl_sens) in adp8860_probe()
723 ret = sysfs_create_group(&bl->dev.kobj, in adp8860_probe()
727 dev_err(&client->dev, "failed to register sysfs\n"); in adp8860_probe()
733 ret = -EIO; in adp8860_probe()
739 dev_info(&client->dev, "%s Rev.%d Backlight\n", in adp8860_probe()
740 client->name, data->revid); in adp8860_probe()
742 if (pdata->num_leds) in adp8860_probe()
748 if (data->en_ambl_sens) in adp8860_probe()
749 sysfs_remove_group(&data->bl->dev.kobj, in adp8860_probe()
761 if (data->led) in adp8860_remove()
764 if (data->en_ambl_sens) in adp8860_remove()
765 sysfs_remove_group(&data->bl->dev.kobj, in adp8860_remove()