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

Commit 158da626 authored by Yan He's avatar Yan He
Browse files

msm: pcie: add bus bandwidth voting in PCIe driver



Add the bus bandwidth voting in PCIe driver when PCIe link is
enabled and remove the voting when the link is disabled.

Change-Id: Ie2af0454bba279b4fba7b9c10c3ac196d61a4a73
Signed-off-by: default avatarYan He <yanhe@codeaurora.org>
parent bc89b16c
Loading
Loading
Loading
Loading
+40 −0
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@
#include <mach/gpiomux.h>
#include <mach/hardware.h>
#include <mach/msm_iomap.h>
#include <linux/msm-bus.h>
#include <linux/msm-bus-board.h>

#include "pcie.h"

@@ -480,6 +482,16 @@ static int msm_pcie_clk_init(struct msm_pcie_dev_t *dev)
		return rc;
	}

	if (dev->bus_client) {
		rc = msm_bus_scale_client_update_request(dev->bus_client, 1);
		if (rc) {
			pr_err(
				"PCIe:%s:fail to set bus bandwidth for RC %d:%d\n",
				__func__, dev->rc_idx, rc);
			return rc;
		}
	}

	for (i = 0; i < MSM_PCIE_MAX_CLK; i++) {
		info = &dev->clk[i];

@@ -520,11 +532,20 @@ static int msm_pcie_clk_init(struct msm_pcie_dev_t *dev)
static void msm_pcie_clk_deinit(struct msm_pcie_dev_t *dev)
{
	int i;
	int rc;

	for (i = 0; i < MSM_PCIE_MAX_CLK; i++)
		if (dev->clk[i].hdl)
			clk_disable_unprepare(dev->clk[i].hdl);

	if (dev->bus_client) {
		rc = msm_bus_scale_client_update_request(dev->bus_client, 0);
		if (rc)
			pr_err(
				"PCIe:%s:fail to set bus bandwidth for RC %d:%d\n",
				__func__, dev->rc_idx, rc);
	}

	regulator_disable(dev->gdsc);
}

@@ -841,6 +862,25 @@ static int msm_pcie_get_resources(struct msm_pcie_dev_t *dev,
		}
	}


	dev->bus_scale_table = msm_bus_cl_get_pdata(pdev);
	if (!dev->bus_scale_table) {
		PCIE_DBG("PCIe: No bus scale table for RC %d (%s)\n",
			dev->rc_idx, dev->pdev->name);
		dev->bus_client = 0;
	} else {
		dev->bus_client =
			msm_bus_scale_register_client(dev->bus_scale_table);
		if (!dev->bus_client) {
			pr_err(
				"PCIe: Failed to register bus client for RC %d (%s)\n",
				dev->rc_idx, dev->pdev->name);
			msm_bus_cl_clear_pdata(dev->bus_scale_table);
			ret = -ENODEV;
			goto out;
		}
	}

	for (i = 0; i < MSM_PCIE_MAX_RES; i++) {
		res_info = &dev->res[i];

+2 −0
Original line number Diff line number Diff line
@@ -171,6 +171,8 @@ struct msm_pcie_dev_t {
	struct pci_saved_state	     *saved_state;

	struct wakeup_source	     ws;
	struct msm_bus_scale_pdata   *bus_scale_table;
	uint32_t                     bus_client;

	bool                         l1ss_supported;
	bool                         aux_clk_sync;