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

Commit 0f86815a authored by Peter Ujfalusi's avatar Peter Ujfalusi Committed by Bryan Wu
Browse files

leds: leds-pwm: Preparing the driver for device tree support



In order to be able to add device tree support for leds-pwm driver we need
to rearrange the data structures used by the drivers.

Signed-off-by: default avatarPeter Ujfalusi <peter.ujfalusi@ti.com>
Signed-off-by: default avatarBryan Wu <cooloney@gmail.com>
parent 9ea6cdac
Loading
Loading
Loading
Loading
+23 −16
Original line number Original line Diff line number Diff line
@@ -30,6 +30,11 @@ struct led_pwm_data {
	unsigned int		period;
	unsigned int		period;
};
};


struct led_pwm_priv {
	int num_leds;
	struct led_pwm_data leds[0];
};

static void led_pwm_set(struct led_classdev *led_cdev,
static void led_pwm_set(struct led_classdev *led_cdev,
	enum led_brightness brightness)
	enum led_brightness brightness)
{
{
@@ -47,25 +52,29 @@ static void led_pwm_set(struct led_classdev *led_cdev,
	}
	}
}
}


static inline size_t sizeof_pwm_leds_priv(int num_leds)
{
	return sizeof(struct led_pwm_priv) +
		      (sizeof(struct led_pwm_data) * num_leds);
}

static int led_pwm_probe(struct platform_device *pdev)
static int led_pwm_probe(struct platform_device *pdev)
{
{
	struct led_pwm_platform_data *pdata = pdev->dev.platform_data;
	struct led_pwm_platform_data *pdata = pdev->dev.platform_data;
	struct led_pwm *cur_led;
	struct led_pwm_priv *priv;
	struct led_pwm_data *leds_data, *led_dat;
	int i, ret = 0;
	int i, ret = 0;


	if (!pdata)
	if (!pdata)
		return -EBUSY;
		return -EBUSY;


	leds_data = devm_kzalloc(&pdev->dev,
	priv = devm_kzalloc(&pdev->dev, sizeof_pwm_leds_priv(pdata->num_leds),
			sizeof(struct led_pwm_data) * pdata->num_leds,
			    GFP_KERNEL);
			    GFP_KERNEL);
	if (!leds_data)
	if (!priv)
		return -ENOMEM;
		return -ENOMEM;


	for (i = 0; i < pdata->num_leds; i++) {
	for (i = 0; i < pdata->num_leds; i++) {
		cur_led = &pdata->leds[i];
		struct led_pwm *cur_led = &pdata->leds[i];
		led_dat = &leds_data[i];
		struct led_pwm_data *led_dat = &priv->leds[i];


		led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
		led_dat->pwm = devm_pwm_get(&pdev->dev, cur_led->name);
		if (IS_ERR(led_dat->pwm)) {
		if (IS_ERR(led_dat->pwm)) {
@@ -88,15 +97,16 @@ static int led_pwm_probe(struct platform_device *pdev)
		if (ret < 0)
		if (ret < 0)
			goto err;
			goto err;
	}
	}
	priv->num_leds = pdata->num_leds;


	platform_set_drvdata(pdev, leds_data);
	platform_set_drvdata(pdev, priv);


	return 0;
	return 0;


err:
err:
	if (i > 0) {
	if (i > 0) {
		for (i = i - 1; i >= 0; i--)
		for (i = i - 1; i >= 0; i--)
			led_classdev_unregister(&leds_data[i].cdev);
			led_classdev_unregister(&priv->leds[i].cdev);
	}
	}


	return ret;
	return ret;
@@ -104,14 +114,11 @@ static int led_pwm_probe(struct platform_device *pdev)


static int led_pwm_remove(struct platform_device *pdev)
static int led_pwm_remove(struct platform_device *pdev)
{
{
	struct led_pwm_priv *priv = platform_get_drvdata(pdev);
	int i;
	int i;
	struct led_pwm_platform_data *pdata = pdev->dev.platform_data;
	struct led_pwm_data *leds_data;

	leds_data = platform_get_drvdata(pdev);


	for (i = 0; i < pdata->num_leds; i++)
	for (i = 0; i < priv->num_leds; i++)
		led_classdev_unregister(&leds_data[i].cdev);
		led_classdev_unregister(&priv->leds[i].cdev);


	return 0;
	return 0;
}
}