Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a57eaa1f authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge tag 'backlight-for-linus-4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight

Pull backlight updates from Lee Jones:
 "Core Frameworks:
   - Add Daniel Thompson as co-maintainer

  Fix-ups:
   - Improve error handling; adp5520_bl
   - Split initial power checks into dedicated function; pwm_bl
   - Check current PWM status; pwm_bl

  Bug Fixes:
   - Fix potential race; lcd
   - Fix module auto-loading; da9052"

* tag 'backlight-for-linus-4.11' of git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight:
  MAINTAINERS: Rework entry for Backlight
  backlight: da9052: Fix module autoload
  backlight: pwm_bl: Check the PWM state for initial backlight power state
  backlight: pwm_bl: Move the checks for initial power state to a separate function
  backlight: adp5520: Fix error handling in adp5520_bl_probe()
  backlight: lcd: Fix race condition during register
parents df9cdc17 80e5d455
Loading
Loading
Loading
Loading
+4 −1
Original line number Diff line number Diff line
@@ -2380,12 +2380,15 @@ S: Maintained
F:	drivers/net/wireless/broadcom/b43legacy/

BACKLIGHT CLASS/SUBSYSTEM
M:	Jingoo Han <jingoohan1@gmail.com>
M:	Lee Jones <lee.jones@linaro.org>
M:	Daniel Thompson <daniel.thompson@linaro.org>
M:	Jingoo Han <jingoohan1@gmail.com>
T:	git git://git.kernel.org/pub/scm/linux/kernel/git/lee/backlight.git
S:	Maintained
F:	drivers/video/backlight/
F:	include/linux/backlight.h
F:	include/linux/pwm_backlight.h
F:	Documentation/devicetree/bindings/leds/backlight

BATMAN ADVANCED
M:	Marek Lindner <mareklindner@neomailbox.ch>
+10 −2
Original line number Diff line number Diff line
@@ -332,10 +332,18 @@ static int adp5520_bl_probe(struct platform_device *pdev)
	}

	platform_set_drvdata(pdev, bl);
	ret |= adp5520_bl_setup(bl);
	ret = adp5520_bl_setup(bl);
	if (ret) {
		dev_err(&pdev->dev, "failed to setup\n");
		if (data->pdata->en_ambl_sens)
			sysfs_remove_group(&bl->dev.kobj,
					&adp5520_bl_attr_group);
		return ret;
	}

	backlight_update_status(bl);

	return ret;
	return 0;
}

static int adp5520_bl_remove(struct platform_device *pdev)
+1 −1
Original line number Diff line number Diff line
@@ -167,6 +167,7 @@ static const struct platform_device_id da9052_wled_ids[] = {
	},
	{ },
};
MODULE_DEVICE_TABLE(platform, da9052_wled_ids);

static struct platform_driver da9052_wled_driver = {
	.probe		= da9052_backlight_probe,
@@ -182,4 +183,3 @@ module_platform_driver(da9052_wled_driver);
MODULE_AUTHOR("David Dajun Chen <dchen@diasemi.com>");
MODULE_DESCRIPTION("Backlight driver for DA9052 PMIC");
MODULE_LICENSE("GPL");
MODULE_ALIAS("platform:da9052-backlight");
+2 −2
Original line number Diff line number Diff line
@@ -226,6 +226,8 @@ struct lcd_device *lcd_device_register(const char *name, struct device *parent,
	dev_set_name(&new_ld->dev, "%s", name);
	dev_set_drvdata(&new_ld->dev, devdata);

	new_ld->ops = ops;

	rc = device_register(&new_ld->dev);
	if (rc) {
		put_device(&new_ld->dev);
@@ -238,8 +240,6 @@ struct lcd_device *lcd_device_register(const char *name, struct device *parent,
		return ERR_PTR(rc);
	}

	new_ld->ops = ops;

	return new_ld;
}
EXPORT_SYMBOL(lcd_device_register);
+41 −19
Original line number Diff line number Diff line
@@ -192,6 +192,36 @@ static int pwm_backlight_parse_dt(struct device *dev,
}
#endif

static int pwm_backlight_initial_power_state(const struct pwm_bl_data *pb)
{
	struct device_node *node = pb->dev->of_node;

	/* Not booted with device tree or no phandle link to the node */
	if (!node || !node->phandle)
		return FB_BLANK_UNBLANK;

	/*
	 * If the driver is probed from the device tree and there is a
	 * phandle link pointing to the backlight node, it is safe to
	 * assume that another driver will enable the backlight at the
	 * appropriate time. Therefore, if it is disabled, keep it so.
	 */

	/* if the enable GPIO is disabled, do not enable the backlight */
	if (pb->enable_gpio && gpiod_get_value(pb->enable_gpio) == 0)
		return FB_BLANK_POWERDOWN;

	/* The regulator is disabled, do not enable the backlight */
	if (!regulator_is_enabled(pb->power_supply))
		return FB_BLANK_POWERDOWN;

	/* The PWM is disabled, keep it like this */
	if (!pwm_is_enabled(pb->pwm))
		return FB_BLANK_POWERDOWN;

	return FB_BLANK_UNBLANK;
}

static int pwm_backlight_probe(struct platform_device *pdev)
{
	struct platform_pwm_backlight_data *data = dev_get_platdata(&pdev->dev);
@@ -200,7 +230,6 @@ static int pwm_backlight_probe(struct platform_device *pdev)
	struct backlight_device *bl;
	struct device_node *node = pdev->dev.of_node;
	struct pwm_bl_data *pb;
	int initial_blank = FB_BLANK_UNBLANK;
	struct pwm_args pargs;
	int ret;

@@ -267,20 +296,16 @@ static int pwm_backlight_probe(struct platform_device *pdev)
		pb->enable_gpio = gpio_to_desc(data->enable_gpio);
	}

	if (pb->enable_gpio) {
	/*
		 * If the driver is probed from the device tree and there is a
		 * phandle link pointing to the backlight node, it is safe to
		 * assume that another driver will enable the backlight at the
		 * appropriate time. Therefore, if it is disabled, keep it so.
	 * If the GPIO is configured as input, change the direction to output
	 * and set the GPIO as active.
	 * Do not force the GPIO to active when it was already output as it
	 * could cause backlight flickering or we would enable the backlight too
	 * early. Leave the decision of the initial backlight state for later.
	 */
		if (node && node->phandle &&
		    gpiod_get_direction(pb->enable_gpio) == GPIOF_DIR_OUT &&
		    gpiod_get_value(pb->enable_gpio) == 0)
			initial_blank = FB_BLANK_POWERDOWN;
		else
	if (pb->enable_gpio &&
	    gpiod_get_direction(pb->enable_gpio) == GPIOF_DIR_IN)
		gpiod_direction_output(pb->enable_gpio, 1);
	}

	pb->power_supply = devm_regulator_get(&pdev->dev, "power");
	if (IS_ERR(pb->power_supply)) {
@@ -288,9 +313,6 @@ static int pwm_backlight_probe(struct platform_device *pdev)
		goto err_alloc;
	}

	if (node && node->phandle && !regulator_is_enabled(pb->power_supply))
		initial_blank = FB_BLANK_POWERDOWN;

	pb->pwm = devm_pwm_get(&pdev->dev, NULL);
	if (IS_ERR(pb->pwm) && PTR_ERR(pb->pwm) != -EPROBE_DEFER && !node) {
		dev_err(&pdev->dev, "unable to request PWM, trying legacy API\n");
@@ -347,7 +369,7 @@ static int pwm_backlight_probe(struct platform_device *pdev)
	}

	bl->props.brightness = data->dft_brightness;
	bl->props.power = initial_blank;
	bl->props.power = pwm_backlight_initial_power_state(pb);
	backlight_update_status(bl);

	platform_set_drvdata(pdev, bl);