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

Commit ce037275 authored by Javier Martinez Canillas's avatar Javier Martinez Canillas Committed by Ulf Hansson
Browse files

mmc: pwrseq_simple: use GPIO descriptors array API



The simple power sequence provider sets a value for multiple GPIOs in one
go so it is better to use the API already provided by the GPIO descriptor
API instead of open coding the same logic.

Signed-off-by: default avatarJavier Martinez Canillas <javier@osg.samsung.com>
Signed-off-by: default avatarUlf Hansson <ulf.hansson@linaro.org>
parent 8131e815
Loading
Loading
Loading
Loading
+15 −30
Original line number Original line Diff line number Diff line
@@ -23,18 +23,21 @@ struct mmc_pwrseq_simple {
	struct mmc_pwrseq pwrseq;
	struct mmc_pwrseq pwrseq;
	bool clk_enabled;
	bool clk_enabled;
	struct clk *ext_clk;
	struct clk *ext_clk;
	int nr_gpios;
	struct gpio_descs *reset_gpios;
	struct gpio_desc *reset_gpios[0];
};
};


static void mmc_pwrseq_simple_set_gpios_value(struct mmc_pwrseq_simple *pwrseq,
static void mmc_pwrseq_simple_set_gpios_value(struct mmc_pwrseq_simple *pwrseq,
					      int value)
					      int value)
{
{
	int i;
	int i;
	struct gpio_descs *reset_gpios = pwrseq->reset_gpios;
	int values[reset_gpios->ndescs];


	for (i = 0; i < pwrseq->nr_gpios; i++)
	for (i = 0; i < reset_gpios->ndescs; i++)
		if (!IS_ERR(pwrseq->reset_gpios[i]))
		values[i] = value;
			gpiod_set_value_cansleep(pwrseq->reset_gpios[i], value);

	gpiod_set_array_value_cansleep(reset_gpios->ndescs, reset_gpios->desc,
				       values);
}
}


static void mmc_pwrseq_simple_pre_power_on(struct mmc_host *host)
static void mmc_pwrseq_simple_pre_power_on(struct mmc_host *host)
@@ -75,11 +78,8 @@ static void mmc_pwrseq_simple_free(struct mmc_host *host)
{
{
	struct mmc_pwrseq_simple *pwrseq = container_of(host->pwrseq,
	struct mmc_pwrseq_simple *pwrseq = container_of(host->pwrseq,
					struct mmc_pwrseq_simple, pwrseq);
					struct mmc_pwrseq_simple, pwrseq);
	int i;


	for (i = 0; i < pwrseq->nr_gpios; i++)
	gpiod_put_array(pwrseq->reset_gpios);
		if (!IS_ERR(pwrseq->reset_gpios[i]))
			gpiod_put(pwrseq->reset_gpios[i]);


	if (!IS_ERR(pwrseq->ext_clk))
	if (!IS_ERR(pwrseq->ext_clk))
		clk_put(pwrseq->ext_clk);
		clk_put(pwrseq->ext_clk);
@@ -98,14 +98,9 @@ struct mmc_pwrseq *mmc_pwrseq_simple_alloc(struct mmc_host *host,
					   struct device *dev)
					   struct device *dev)
{
{
	struct mmc_pwrseq_simple *pwrseq;
	struct mmc_pwrseq_simple *pwrseq;
	int i, nr_gpios, ret = 0;
	int ret = 0;

	nr_gpios = of_gpio_named_count(dev->of_node, "reset-gpios");
	if (nr_gpios < 0)
		nr_gpios = 0;


	pwrseq = kzalloc(sizeof(struct mmc_pwrseq_simple) + nr_gpios *
	pwrseq = kzalloc(sizeof(*pwrseq), GFP_KERNEL);
			 sizeof(struct gpio_desc *), GFP_KERNEL);
	if (!pwrseq)
	if (!pwrseq)
		return ERR_PTR(-ENOMEM);
		return ERR_PTR(-ENOMEM);


@@ -116,22 +111,12 @@ struct mmc_pwrseq *mmc_pwrseq_simple_alloc(struct mmc_host *host,
		goto free;
		goto free;
	}
	}


	for (i = 0; i < nr_gpios; i++) {
	pwrseq->reset_gpios = gpiod_get_array(dev, "reset", GPIOD_OUT_HIGH);
		pwrseq->reset_gpios[i] = gpiod_get_index(dev, "reset", i,
	if (IS_ERR(pwrseq->reset_gpios)) {
							 GPIOD_OUT_HIGH);
		ret = PTR_ERR(pwrseq->reset_gpios);
		if (IS_ERR(pwrseq->reset_gpios[i]) &&
		    PTR_ERR(pwrseq->reset_gpios[i]) != -ENOENT &&
		    PTR_ERR(pwrseq->reset_gpios[i]) != -ENOSYS) {
			ret = PTR_ERR(pwrseq->reset_gpios[i]);

			while (i--)
				gpiod_put(pwrseq->reset_gpios[i]);

		goto clk_put;
		goto clk_put;
	}
	}
	}


	pwrseq->nr_gpios = nr_gpios;
	pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops;
	pwrseq->pwrseq.ops = &mmc_pwrseq_simple_ops;


	return &pwrseq->pwrseq;
	return &pwrseq->pwrseq;