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);
143 mutex_lock(&data->lock);
152 mutex_unlock(&data->lock);
162 mutex_lock(&data->lock);
171 mutex_unlock(&data->lock);
183 adp8860_write(led->client, ADP8860_ISC1 - led->id + 1,
184 led->new_brightness >> 1);
193 led->new_brightness = value;
194 schedule_work(&led->work);
199 struct i2c_client *client = led->client;
202 ret = adp8860_write(client, ADP8860_ISC1 - led->id + 1, 0);
203 ret |= adp8860_set_bits(client, ADP8860_ISCC, 1 << (led->id - 1));
205 if (led->id > 4)
207 (led->flags & 0x3) << ((led->id - 5) * 2));
210 (led->flags & 0x3) << ((led->id - 1) * 2));
218 dev_get_platdata(&client->dev);
224 led = devm_kcalloc(&client->dev, pdata->num_leds, sizeof(*led),
227 return -ENOMEM;
229 ret = adp8860_write(client, ADP8860_ISCFR, pdata->led_fade_law);
231 (pdata->led_on_time & 0x3) << 6);
233 FADE_VAL(pdata->led_fade_in, pdata->led_fade_out));
236 dev_err(&client->dev, "failed to write\n");
240 for (i = 0; i < pdata->num_leds; ++i) {
241 cur_led = &pdata->leds[i];
244 led_dat->id = cur_led->flags & ADP8860_FLAG_LED_MASK;
246 if (led_dat->id > 7 || led_dat->id < 1) {
247 dev_err(&client->dev, "Invalid LED ID %d\n",
248 led_dat->id);
249 ret = -EINVAL;
253 if (pdata->bl_led_assign & (1 << (led_dat->id - 1))) {
254 dev_err(&client->dev, "LED %d used by Backlight\n",
255 led_dat->id);
256 ret = -EBUSY;
260 led_dat->cdev.name = cur_led->name;
261 led_dat->cdev.default_trigger = cur_led->default_trigger;
262 led_dat->cdev.brightness_set = adp8860_led_set;
263 led_dat->cdev.brightness = LED_OFF;
264 led_dat->flags = cur_led->flags >> FLAG_OFFT_SHIFT;
265 led_dat->client = client;
266 led_dat->new_brightness = LED_OFF;
267 INIT_WORK(&led_dat->work, adp8860_led_work);
269 ret = led_classdev_register(&client->dev, &led_dat->cdev);
271 dev_err(&client->dev, "failed to register LED %d\n",
272 led_dat->id);
278 dev_err(&client->dev, "failed to write\n");
284 data->led = led;
289 for (i = i - 1; i >= 0; --i) {
300 dev_get_platdata(&client->dev);
304 for (i = 0; i < pdata->num_leds; i++) {
305 led_classdev_unregister(&data->led[i].cdev);
306 cancel_work_sync(&data->led[i].work);
323 static int adp8860_bl_set(struct backlight_device *bl, int brightness)
326 struct i2c_client *client = data->client;
329 if (data->en_ambl_sens) {
330 if ((brightness > 0) && (brightness < ADP8860_MAX_BRIGHTNESS)) {
334 ret |= adp8860_write(client, ADP8860_BLMX1, brightness);
337 * MAX_BRIGHTNESS -> Enable Ambient Light auto adjust
338 * restore daylight l1 sysfs brightness
341 data->cached_daylight_max);
346 ret |= adp8860_write(client, ADP8860_BLMX1, brightness);
348 if (data->current_brightness && brightness == 0)
351 else if (data->current_brightness == 0 && brightness)
356 data->current_brightness = brightness;
370 return data->current_brightness;
381 struct i2c_client *client = data->client;
382 struct adp8860_backlight_platform_data *pdata = data->pdata;
385 ret |= adp8860_write(client, ADP8860_BLSEN, ~pdata->bl_led_assign);
386 ret |= adp8860_write(client, ADP8860_BLMX1, pdata->l1_daylight_max);
387 ret |= adp8860_write(client, ADP8860_BLDM1, pdata->l1_daylight_dim);
389 if (data->en_ambl_sens) {
390 data->cached_daylight_max = pdata->l1_daylight_max;
392 pdata->l2_office_max);
394 pdata->l2_office_dim);
396 pdata->l3_dark_max);
398 pdata->l3_dark_dim);
400 ret |= adp8860_write(client, ADP8860_L2_TRP, pdata->l2_trip);
401 ret |= adp8860_write(client, ADP8860_L2_HYS, pdata->l2_hyst);
402 ret |= adp8860_write(client, ADP8860_L3_TRP, pdata->l3_trip);
403 ret |= adp8860_write(client, ADP8860_L3_HYS, pdata->l3_hyst);
405 ALS_CCFG_VAL(pdata->abml_filt));
409 BL_CFGR_VAL(pdata->bl_fade_law, 0));
411 ret |= adp8860_write(client, ADP8860_BLFR, FADE_VAL(pdata->bl_fade_in,
412 pdata->bl_fade_out));
415 (data->gdwn_dis ? GDWN_DIS : 0));
426 mutex_lock(&data->lock);
427 error = adp8860_read(data->client, reg, ®_val);
428 mutex_unlock(&data->lock);
447 mutex_lock(&data->lock);
448 adp8860_write(data->client, reg, val);
449 mutex_unlock(&data->lock);
493 int ret = kstrtoul(buf, 10, &data->cached_daylight_max);
557 mutex_lock(&data->lock);
558 error = adp8860_read(data->client, ADP8860_PH1LEVL, ®_val);
561 error = adp8860_read(data->client, ADP8860_PH1LEVH, ®_val);
563 mutex_unlock(&data->lock);
568 /* Return 13-bit conversion value for the first light sensor */
583 mutex_lock(&data->lock);
584 error = adp8860_read(data->client, ADP8860_CFGR, ®_val);
585 mutex_unlock(&data->lock);
609 adp8860_set_bits(data->client, ADP8860_MDCR, CMP_AUTOEN);
612 adp8860_clr_bits(data->client, ADP8860_MDCR, CMP_AUTOEN);
615 mutex_lock(&data->lock);
616 ret = adp8860_read(data->client, ADP8860_CFGR, ®_val);
619 reg_val |= (val - 1) << CFGR_BLV_SHIFT;
620 adp8860_write(data->client, ADP8860_CFGR, reg_val);
622 mutex_unlock(&data->lock);
656 dev_get_platdata(&client->dev);
661 if (!i2c_check_functionality(client->adapter,
663 dev_err(&client->dev, "SMBUS Byte Data not Supported\n");
664 return -EIO;
668 dev_err(&client->dev, "no platform data?\n");
669 return -EINVAL;
672 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL);
674 return -ENOMEM;
682 data->gdwn_dis = !!pdata->gdwn_dis;
685 data->en_ambl_sens = !!pdata->en_ambl_sens;
688 data->gdwn_dis = !!pdata->gdwn_dis;
691 dev_err(&client->dev, "failed to probe\n");
692 return -ENODEV;
697 data->revid = ADP8860_DEVID(reg_val);
698 data->client = client;
699 data->pdata = pdata;
700 data->id = id->driver_data;
701 data->current_brightness = 0;
708 mutex_init(&data->lock);
710 bl = devm_backlight_device_register(&client->dev,
711 dev_driver_string(&client->dev),
712 &client->dev, data, &adp8860_bl_ops, &props);
714 dev_err(&client->dev, "failed to register backlight\n");
718 bl->props.brightness = ADP8860_MAX_BRIGHTNESS;
720 data->bl = bl;
722 if (data->en_ambl_sens)
723 ret = sysfs_create_group(&bl->dev.kobj,
727 dev_err(&client->dev, "failed to register sysfs\n");
733 ret = -EIO;
739 dev_info(&client->dev, "%s Rev.%d Backlight\n",
740 client->name, data->revid);
742 if (pdata->num_leds)
748 if (data->en_ambl_sens)
749 sysfs_remove_group(&data->bl->dev.kobj,
761 if (data->led)
764 if (data->en_ambl_sens)
765 sysfs_remove_group(&data->bl->dev.kobj,