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

1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright 2009-2011 Analog Devices Inc.
34 #define ADP8870_BLMX1 0x0A /* Backlight (Brightness Level 1-daylight) maximum current */
35 #define ADP8870_BLDM1 0x0B /* Backlight (Brightness Level 1-daylight) dim current */
36 #define ADP8870_BLMX2 0x0C /* Backlight (Brightness Level 2-bright) maximum current */
37 #define ADP8870_BLDM2 0x0D /* Backlight (Brightness Level 2-bright) dim current */
38 #define ADP8870_BLMX3 0x0E /* Backlight (Brightness Level 3-office) maximum current */
39 #define ADP8870_BLDM3 0x0F /* Backlight (Brightness Level 3-office) dim current */
40 #define ADP8870_BLMX4 0x10 /* Backlight (Brightness Level 4-indoor) maximum current */
41 #define ADP8870_BLDM4 0x11 /* Backlight (Brightness Level 4-indoor) dim current */
42 #define ADP8870_BLMX5 0x12 /* Backlight (Brightness Level 5-dark) maximum current */
43 #define ADP8870_BLDM5 0x13 /* Backlight (Brightness Level 5-dark) dim current */
55 #define ADP8870_ISC7 0x25 /* Independent Sink Current LED7 (Brightness Level 1-daylight) */
56 #define ADP8870_ISC7_L2 0x26 /* Independent Sink Current LED7 (Brightness Level 2-bright) */
57 #define ADP8870_ISC7_L3 0x27 /* Independent Sink Current LED7 (Brightness Level 3-office) */
58 #define ADP8870_ISC7_L4 0x28 /* Independent Sink Current LED7 (Brightness Level 4-indoor) */
59 #define ADP8870_ISC7_L5 0x29 /* Independent Sink Current LED7 (Brightness Level 5-dark) */
61 #define ADP8870_ALS1_EN 0x2E /* Main ALS comparator level enable */
62 #define ADP8870_ALS2_EN 0x2F /* Second ALS comparator level enable */
73 #define ADP8870_PH1LEVL 0x40 /* First phototransistor ambient light level-low byte register */
74 #define ADP8870_PH1LEVH 0x41 /* First phototransistor ambient light level-high byte register */
75 #define ADP8870_PH2LEVL 0x42 /* Second phototransistor ambient light level-low byte register */
76 #define ADP8870_PH2LEVH 0x43 /* Second phototransistor ambient light level-high byte register */
92 /* ADP8870_ALS1_EN Main ALS comparator level enable */
133 dev_err(&client->dev, "failed reading at 0x%02x\n", reg); in adp8870_read()
147 dev_err(&client->dev, "failed to write\n"); in adp8870_write()
158 mutex_lock(&data->lock); in adp8870_set_bits()
167 mutex_unlock(&data->lock); in adp8870_set_bits()
177 mutex_lock(&data->lock); in adp8870_clr_bits()
186 mutex_unlock(&data->lock); in adp8870_clr_bits()
198 adp8870_write(led->client, ADP8870_ISC1 + led->id - 1, in adp8870_led_work()
199 led->new_brightness >> 1); in adp8870_led_work()
208 led->new_brightness = value; in adp8870_led_set()
212 schedule_work(&led->work); in adp8870_led_set()
217 struct i2c_client *client = led->client; in adp8870_led_setup()
220 ret = adp8870_write(client, ADP8870_ISC1 + led->id - 1, 0); in adp8870_led_setup()
224 ret = adp8870_set_bits(client, ADP8870_ISCC, 1 << (led->id - 1)); in adp8870_led_setup()
228 if (led->id > 4) in adp8870_led_setup()
230 (led->flags & 0x3) << ((led->id - 5) * 2)); in adp8870_led_setup()
233 (led->flags & 0x3) << ((led->id - 1) * 2)); in adp8870_led_setup()
241 dev_get_platdata(&client->dev); in adp8870_led_probe()
247 led = devm_kcalloc(&client->dev, pdata->num_leds, sizeof(*led), in adp8870_led_probe()
250 return -ENOMEM; in adp8870_led_probe()
252 ret = adp8870_write(client, ADP8870_ISCLAW, pdata->led_fade_law); in adp8870_led_probe()
257 (pdata->led_on_time & 0x3) << 6); in adp8870_led_probe()
262 FADE_VAL(pdata->led_fade_in, pdata->led_fade_out)); in adp8870_led_probe()
266 for (i = 0; i < pdata->num_leds; ++i) { in adp8870_led_probe()
267 cur_led = &pdata->leds[i]; in adp8870_led_probe()
270 led_dat->id = cur_led->flags & ADP8870_FLAG_LED_MASK; in adp8870_led_probe()
272 if (led_dat->id > 7 || led_dat->id < 1) { in adp8870_led_probe()
273 dev_err(&client->dev, "Invalid LED ID %d\n", in adp8870_led_probe()
274 led_dat->id); in adp8870_led_probe()
275 ret = -EINVAL; in adp8870_led_probe()
279 if (pdata->bl_led_assign & (1 << (led_dat->id - 1))) { in adp8870_led_probe()
280 dev_err(&client->dev, "LED %d used by Backlight\n", in adp8870_led_probe()
281 led_dat->id); in adp8870_led_probe()
282 ret = -EBUSY; in adp8870_led_probe()
286 led_dat->cdev.name = cur_led->name; in adp8870_led_probe()
287 led_dat->cdev.default_trigger = cur_led->default_trigger; in adp8870_led_probe()
288 led_dat->cdev.brightness_set = adp8870_led_set; in adp8870_led_probe()
289 led_dat->cdev.brightness = LED_OFF; in adp8870_led_probe()
290 led_dat->flags = cur_led->flags >> FLAG_OFFT_SHIFT; in adp8870_led_probe()
291 led_dat->client = client; in adp8870_led_probe()
292 led_dat->new_brightness = LED_OFF; in adp8870_led_probe()
293 INIT_WORK(&led_dat->work, adp8870_led_work); in adp8870_led_probe()
295 ret = led_classdev_register(&client->dev, &led_dat->cdev); in adp8870_led_probe()
297 dev_err(&client->dev, "failed to register LED %d\n", in adp8870_led_probe()
298 led_dat->id); in adp8870_led_probe()
304 dev_err(&client->dev, "failed to write\n"); in adp8870_led_probe()
310 data->led = led; in adp8870_led_probe()
315 for (i = i - 1; i >= 0; --i) { in adp8870_led_probe()
326 dev_get_platdata(&client->dev); in adp8870_led_remove()
330 for (i = 0; i < pdata->num_leds; i++) { in adp8870_led_remove()
331 led_classdev_unregister(&data->led[i].cdev); in adp8870_led_remove()
332 cancel_work_sync(&data->led[i].work); in adp8870_led_remove()
349 static int adp8870_bl_set(struct backlight_device *bl, int brightness) in adp8870_bl_set() argument
352 struct i2c_client *client = data->client; in adp8870_bl_set()
355 if (data->pdata->en_ambl_sens) { in adp8870_bl_set()
356 if ((brightness > 0) && (brightness < ADP8870_MAX_BRIGHTNESS)) { in adp8870_bl_set()
362 ret = adp8870_write(client, ADP8870_BLMX1, brightness); in adp8870_bl_set()
367 * MAX_BRIGHTNESS -> Enable Ambient Light auto adjust in adp8870_bl_set()
368 * restore daylight l1 sysfs brightness in adp8870_bl_set()
371 data->cached_daylight_max); in adp8870_bl_set()
381 ret = adp8870_write(client, ADP8870_BLMX1, brightness); in adp8870_bl_set()
386 if (data->current_brightness && brightness == 0) in adp8870_bl_set()
389 else if (data->current_brightness == 0 && brightness) in adp8870_bl_set()
394 data->current_brightness = brightness; in adp8870_bl_set()
408 return data->current_brightness; in adp8870_bl_get_brightness()
419 struct i2c_client *client = data->client; in adp8870_bl_setup()
420 struct adp8870_backlight_platform_data *pdata = data->pdata; in adp8870_bl_setup()
423 ret = adp8870_write(client, ADP8870_BLSEL, ~pdata->bl_led_assign); in adp8870_bl_setup()
427 ret = adp8870_write(client, ADP8870_PWMLED, pdata->pwm_assign); in adp8870_bl_setup()
431 ret = adp8870_write(client, ADP8870_BLMX1, pdata->l1_daylight_max); in adp8870_bl_setup()
435 ret = adp8870_write(client, ADP8870_BLDM1, pdata->l1_daylight_dim); in adp8870_bl_setup()
439 if (pdata->en_ambl_sens) { in adp8870_bl_setup()
440 data->cached_daylight_max = pdata->l1_daylight_max; in adp8870_bl_setup()
442 pdata->l2_bright_max); in adp8870_bl_setup()
446 pdata->l2_bright_dim); in adp8870_bl_setup()
451 pdata->l3_office_max); in adp8870_bl_setup()
455 pdata->l3_office_dim); in adp8870_bl_setup()
460 pdata->l4_indoor_max); in adp8870_bl_setup()
465 pdata->l4_indor_dim); in adp8870_bl_setup()
470 pdata->l5_dark_max); in adp8870_bl_setup()
475 pdata->l5_dark_dim); in adp8870_bl_setup()
479 ret = adp8870_write(client, ADP8870_L2TRP, pdata->l2_trip); in adp8870_bl_setup()
483 ret = adp8870_write(client, ADP8870_L2HYS, pdata->l2_hyst); in adp8870_bl_setup()
487 ret = adp8870_write(client, ADP8870_L3TRP, pdata->l3_trip); in adp8870_bl_setup()
491 ret = adp8870_write(client, ADP8870_L3HYS, pdata->l3_hyst); in adp8870_bl_setup()
495 ret = adp8870_write(client, ADP8870_L4TRP, pdata->l4_trip); in adp8870_bl_setup()
499 ret = adp8870_write(client, ADP8870_L4HYS, pdata->l4_hyst); in adp8870_bl_setup()
503 ret = adp8870_write(client, ADP8870_L5TRP, pdata->l5_trip); in adp8870_bl_setup()
507 ret = adp8870_write(client, ADP8870_L5HYS, pdata->l5_hyst); in adp8870_bl_setup()
517 ALS_CMPR_CFG_VAL(pdata->abml_filt)); in adp8870_bl_setup()
523 BL_CFGR_VAL(pdata->bl_fade_law, 0)); in adp8870_bl_setup()
527 ret = adp8870_write(client, ADP8870_BLFR, FADE_VAL(pdata->bl_fade_in, in adp8870_bl_setup()
528 pdata->bl_fade_out)); in adp8870_bl_setup()
536 (data->revid == 0 ? GDWN_DIS : 0)); in adp8870_bl_setup()
547 mutex_lock(&data->lock); in adp8870_show()
548 error = adp8870_read(data->client, reg, &reg_val); in adp8870_show()
549 mutex_unlock(&data->lock); in adp8870_show()
568 mutex_lock(&data->lock); in adp8870_store()
569 adp8870_write(data->client, reg, val); in adp8870_store()
570 mutex_unlock(&data->lock); in adp8870_store()
644 int ret = kstrtoul(buf, 10, &data->cached_daylight_max); in adp8870_bl_l1_daylight_max_store()
739 mutex_lock(&data->lock); in adp8870_bl_ambient_light_level_show()
740 error = adp8870_read(data->client, ADP8870_PH1LEVL, &reg_val); in adp8870_bl_ambient_light_level_show()
742 mutex_unlock(&data->lock); in adp8870_bl_ambient_light_level_show()
746 error = adp8870_read(data->client, ADP8870_PH1LEVH, &reg_val); in adp8870_bl_ambient_light_level_show()
747 mutex_unlock(&data->lock); in adp8870_bl_ambient_light_level_show()
752 /* Return 13-bit conversion value for the first light sensor */ in adp8870_bl_ambient_light_level_show()
767 mutex_lock(&data->lock); in adp8870_bl_ambient_light_zone_show()
768 error = adp8870_read(data->client, ADP8870_CFGR, &reg_val); in adp8870_bl_ambient_light_zone_show()
769 mutex_unlock(&data->lock); in adp8870_bl_ambient_light_zone_show()
793 adp8870_set_bits(data->client, ADP8870_MDCR, CMP_AUTOEN); in adp8870_bl_ambient_light_zone_store()
796 adp8870_clr_bits(data->client, ADP8870_MDCR, CMP_AUTOEN); in adp8870_bl_ambient_light_zone_store()
799 mutex_lock(&data->lock); in adp8870_bl_ambient_light_zone_store()
800 ret = adp8870_read(data->client, ADP8870_CFGR, &reg_val); in adp8870_bl_ambient_light_zone_store()
803 reg_val |= (val - 1) << CFGR_BLV_SHIFT; in adp8870_bl_ambient_light_zone_store()
804 adp8870_write(data->client, ADP8870_CFGR, reg_val); in adp8870_bl_ambient_light_zone_store()
806 mutex_unlock(&data->lock); in adp8870_bl_ambient_light_zone_store()
845 dev_get_platdata(&client->dev); in adp8870_probe()
849 if (!i2c_check_functionality(client->adapter, in adp8870_probe()
851 dev_err(&client->dev, "SMBUS Byte Data not Supported\n"); in adp8870_probe()
852 return -EIO; in adp8870_probe()
856 dev_err(&client->dev, "no platform data?\n"); in adp8870_probe()
857 return -EINVAL; in adp8870_probe()
862 return -EIO; in adp8870_probe()
865 dev_err(&client->dev, "failed to probe\n"); in adp8870_probe()
866 return -ENODEV; in adp8870_probe()
869 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); in adp8870_probe()
871 return -ENOMEM; in adp8870_probe()
873 data->revid = ADP8870_DEVID(reg_val); in adp8870_probe()
874 data->client = client; in adp8870_probe()
875 data->pdata = pdata; in adp8870_probe()
876 data->id = id->driver_data; in adp8870_probe()
877 data->current_brightness = 0; in adp8870_probe()
880 mutex_init(&data->lock); in adp8870_probe()
884 props.max_brightness = props.brightness = ADP8870_MAX_BRIGHTNESS; in adp8870_probe()
885 bl = devm_backlight_device_register(&client->dev, in adp8870_probe()
886 dev_driver_string(&client->dev), in adp8870_probe()
887 &client->dev, data, &adp8870_bl_ops, &props); in adp8870_probe()
889 dev_err(&client->dev, "failed to register backlight\n"); in adp8870_probe()
893 data->bl = bl; in adp8870_probe()
895 if (pdata->en_ambl_sens) { in adp8870_probe()
896 ret = sysfs_create_group(&bl->dev.kobj, in adp8870_probe()
899 dev_err(&client->dev, "failed to register sysfs\n"); in adp8870_probe()
906 ret = -EIO; in adp8870_probe()
912 dev_info(&client->dev, "Rev.%d Backlight\n", data->revid); in adp8870_probe()
914 if (pdata->num_leds) in adp8870_probe()
920 if (data->pdata->en_ambl_sens) in adp8870_probe()
921 sysfs_remove_group(&data->bl->dev.kobj, in adp8870_probe()
933 if (data->led) in adp8870_remove()
936 if (data->pdata->en_ambl_sens) in adp8870_remove()
937 sysfs_remove_group(&data->bl->dev.kobj, in adp8870_remove()