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

Commit b2e75698 authored by Kalle Valo's avatar Kalle Valo
Browse files

ath6kl: move power control from sdio to core



In preparation for cutting down power from the chip on the fly.

Signed-off-by: default avatarKalle Valo <kvalo@qca.qualcomm.com>
parent c89c591d
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -96,4 +96,19 @@ static inline int ath6kl_hif_resume(struct ath6kl *ar)

	return ar->hif_ops->resume(ar);
}

static inline int ath6kl_hif_power_on(struct ath6kl *ar)
{
	ath6kl_dbg(ATH6KL_DBG_HIF, "hif power on\n");

	return ar->hif_ops->power_on(ar);
}

static inline int ath6kl_hif_power_off(struct ath6kl *ar)
{
	ath6kl_dbg(ATH6KL_DBG_HIF, "hif power off\n");

	return ar->hif_ops->power_off(ar);
}

#endif
+2 −0
Original line number Diff line number Diff line
@@ -242,6 +242,8 @@ struct ath6kl_hif_ops {
	void (*cleanup_scatter)(struct ath6kl *ar);
	int (*suspend)(struct ath6kl *ar);
	int (*resume)(struct ath6kl *ar);
	int (*power_on)(struct ath6kl *ar);
	int (*power_off)(struct ath6kl *ar);
};

int ath6kl_hif_setup(struct ath6kl_device *dev);
+12 −4
Original line number Diff line number Diff line
@@ -554,6 +554,8 @@ void ath6kl_core_free(struct ath6kl *ar)

void ath6kl_core_cleanup(struct ath6kl *ar)
{
	ath6kl_hif_power_off(ar);

	destroy_workqueue(ar->ath6kl_wq);

	if (ar->htc_target)
@@ -1602,27 +1604,31 @@ int ath6kl_core_init(struct ath6kl *ar)
	if (ret)
		goto err_wq;

	ret = ath6kl_bmi_get_target_info(ar, &targ_info);
	ret = ath6kl_hif_power_on(ar);
	if (ret)
		goto err_bmi_cleanup;

	ret = ath6kl_bmi_get_target_info(ar, &targ_info);
	if (ret)
		goto err_power_off;

	ar->version.target_ver = le32_to_cpu(targ_info.version);
	ar->target_type = le32_to_cpu(targ_info.type);
	ar->wiphy->hw_version = le32_to_cpu(targ_info.version);

	ret = ath6kl_init_hw_params(ar);
	if (ret)
		goto err_bmi_cleanup;
		goto err_power_off;

	ret = ath6kl_configure_target(ar);
	if (ret)
		goto err_bmi_cleanup;
		goto err_power_off;

	ar->htc_target = ath6kl_htc_create(ar);

	if (!ar->htc_target) {
		ret = -ENOMEM;
		goto err_bmi_cleanup;
		goto err_power_off;
	}

	ret = ath6kl_fetch_firmwares(ar);
@@ -1641,6 +1647,8 @@ int ath6kl_core_init(struct ath6kl *ar)

err_htc_cleanup:
	ath6kl_htc_cleanup(ar->htc_target);
err_power_off:
	ath6kl_hif_power_off(ar);
err_bmi_cleanup:
	ath6kl_bmi_cleanup(ar);
err_wq:
+8 −12
Original line number Diff line number Diff line
@@ -463,8 +463,9 @@ static void ath6kl_sdio_irq_handler(struct sdio_func *func)
	WARN_ON(status && status != -ECANCELED);
}

static int ath6kl_sdio_power_on(struct ath6kl_sdio *ar_sdio)
static int ath6kl_sdio_power_on(struct ath6kl *ar)
{
	struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
	struct sdio_func *func = ar_sdio->func;
	int ret = 0;

@@ -495,8 +496,9 @@ static int ath6kl_sdio_power_on(struct ath6kl_sdio *ar_sdio)
	return ret;
}

static int ath6kl_sdio_power_off(struct ath6kl_sdio *ar_sdio)
static int ath6kl_sdio_power_off(struct ath6kl *ar)
{
	struct ath6kl_sdio *ar_sdio = ath6kl_sdio_priv(ar);
	int ret;

	if (ar_sdio->is_disabled)
@@ -772,6 +774,8 @@ static const struct ath6kl_hif_ops ath6kl_sdio_ops = {
	.cleanup_scatter = ath6kl_sdio_cleanup_scatter,
	.suspend = ath6kl_sdio_suspend,
	.resume = ath6kl_sdio_resume,
	.power_on = ath6kl_sdio_power_on,
	.power_off = ath6kl_sdio_power_off,
};

static int ath6kl_sdio_probe(struct sdio_func *func,
@@ -852,10 +856,6 @@ static int ath6kl_sdio_probe(struct sdio_func *func,

	sdio_release_host(func);

	ret = ath6kl_sdio_power_on(ar_sdio);
	if (ret)
		goto err_core_alloc;

	sdio_claim_host(func);

	ret = sdio_set_block_size(func, HIF_MBOX_BLOCK_SIZE);
@@ -863,7 +863,7 @@ static int ath6kl_sdio_probe(struct sdio_func *func,
		ath6kl_err("Set sdio block size %d failed: %d)\n",
			   HIF_MBOX_BLOCK_SIZE, ret);
		sdio_release_host(func);
		goto err_off;
		goto err_hif;
	}

	sdio_release_host(func);
@@ -871,13 +871,11 @@ static int ath6kl_sdio_probe(struct sdio_func *func,
	ret = ath6kl_core_init(ar);
	if (ret) {
		ath6kl_err("Failed to init ath6kl core\n");
		goto err_off;
		goto err_hif;
	}

	return ret;

err_off:
	ath6kl_sdio_power_off(ar_sdio);
err_core_alloc:
	ath6kl_core_free(ar_sdio->ar);
err_dma:
@@ -903,8 +901,6 @@ static void ath6kl_sdio_remove(struct sdio_func *func)

	ath6kl_core_cleanup(ar_sdio->ar);

	ath6kl_sdio_power_off(ar_sdio);

	kfree(ar_sdio->dma_buffer);
	kfree(ar_sdio);
}