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

Commit 85812fe0 authored by Bar Weiner's avatar Bar Weiner
Browse files

usb: bam: Fix IPA resource manager registration



Only a single USB BAM can be registered with IPA RM at
any given moment, where USB BAM driver currently support both
SSBAM and HSBUM.
With this fix, only the BAMs which are actually used are
registered with IPA RM. In addition, HSBAM was removed
from krypton dtsi since it is not used by this target.

Change-Id: I2e8e2835160978a65616d11ab8fb6cc0dc58fa10
Signed-off-by: default avatarBar Weiner <bweiner@codeaurora.org>
parent 9b7a320d
Loading
Loading
Loading
Loading
+4 −5
Original line number Diff line number Diff line
@@ -525,11 +525,10 @@

	qti,usbbam@f9304000 {
		compatible = "qti,usb-bam-msm";
		reg = <0xf9304000 0x8814>,
		      <0xf9a44000 0x11000>;
		reg-names = "ssusb", "hsusb";
		interrupts = <0 132 0>,<0 135 0>;
		interrupt-names = "ssusb", "hsusb";
		reg = <0xf9304000 0x8814>;
		reg-names = "ssusb";
		interrupts = <0 132 0>;
		interrupt-names = "ssusb";
		qti,usb-bam-num-pipes = <16>;
		qti,ignore-core-reset-ack;
		qti,disable-clk-gating;
+48 −13
Original line number Diff line number Diff line
@@ -105,8 +105,31 @@ static char *bam_enable_strings[MAX_BAMS] = {
	[HSIC_BAM]  = "hsic",
};

static enum usb_bam ipa_rm_bams[] = {HSUSB_BAM, HSIC_BAM, SSUSB_BAM};
struct ipa_rm_bam {
	enum usb_bam bam;
	char *str;
	bool initialized;
};

static struct ipa_rm_bam ipa_rm_bams[] = {
	{
		.bam = SSUSB_BAM,
		.initialized = false
	},
	{
		.bam = HSUSB_BAM,
		.initialized = false
	},
	{
		.bam = HSIC_BAM,
		.initialized = false
	}
};

/*
 * HSUSB_BAM & SSUSB_BAM shouldn't be used simultaneously
 * since both share the same prod & cons rm resourses
 */
static enum ipa_client_type ipa_rm_resource_prod[MAX_BAMS] = {
	[HSUSB_BAM] = IPA_RM_RESOURCE_USB_PROD,
	[HSIC_BAM]  = IPA_RM_RESOURCE_HSIC_PROD,
@@ -1283,15 +1306,20 @@ static void usb_bam_ipa_create_resources(void)
	int ret, i;

	for (i = 0; i < ARRAY_SIZE(ipa_rm_bams); i++) {
		/* Only initialized bams should be regitsterd with RM */
		if (!ipa_rm_bams[i].initialized)
			continue;

		/* Create USB/HSIC_PROD entity */
		cur_bam = ipa_rm_bams[i];
		cur_bam = ipa_rm_bams[i].bam;

		memset(&usb_prod_create_params, 0,
					sizeof(usb_prod_create_params));
		usb_prod_create_params.name = ipa_rm_resource_prod[cur_bam];
		usb_prod_create_params.reg_params.notify_cb =
							usb_prod_notify_cb;
		usb_prod_create_params.reg_params.user_data = &ipa_rm_bams[i];
		usb_prod_create_params.reg_params.user_data =
							&ipa_rm_bams[i].bam;
		ret = ipa_rm_create_resource(&usb_prod_create_params);
		if (ret) {
			pr_err("%s: Failed to create USB_PROD resource\n",
@@ -2755,9 +2783,9 @@ err:
	return NULL;
}

static int usb_bam_init(int bam_idx)
static int usb_bam_init(int bam_type)
{
	int ret, irq;
	int ret, irq, i;
	void *usb_virt_addr;
	struct msm_usb_bam_platform_data *pdata =
		ctx.usb_bam_pdev->dev.platform_data;
@@ -2765,16 +2793,16 @@ static int usb_bam_init(int bam_idx)
	struct sps_bam_props *props = &ctx.usb_bam_sps.usb_props;

	pr_debug("%s: usb_bam_init - %s\n", __func__,
		bam_enable_strings[bam_idx]);
		bam_enable_strings[bam_type]);
	res = platform_get_resource_byname(ctx.usb_bam_pdev, IORESOURCE_MEM,
		bam_enable_strings[bam_idx]);
		bam_enable_strings[bam_type]);
	if (!res) {
		dev_dbg(&ctx.usb_bam_pdev->dev, "bam not initialized\n");
		return 0;
	}

	irq = platform_get_irq_byname(ctx.usb_bam_pdev,
		bam_enable_strings[bam_idx]);
		bam_enable_strings[bam_type]);
	if (irq < 0) {
		dev_err(&ctx.usb_bam_pdev->dev, "Unable to get IRQ resource\n");
		return irq;
@@ -2788,9 +2816,9 @@ static int usb_bam_init(int bam_idx)
	}

	/* Check if USB3 pipe memory needs to be enabled */
	if (bam_idx == SSUSB_BAM && bam_use_private_mem(bam_idx)) {
	if (bam_type == SSUSB_BAM && bam_use_private_mem(bam_type)) {
		pr_debug("%s: Enabling USB private memory for: %s\n", __func__,
			bam_enable_strings[bam_idx]);
			bam_enable_strings[bam_type]);

		ram_resource = platform_get_resource_byname(ctx.usb_bam_pdev,
			IORESOURCE_MEM, "qscratch_ram1_reg");
@@ -2818,26 +2846,33 @@ static int usb_bam_init(int bam_idx)
	props->event_threshold = pdata->override_threshold;
	props->num_pipes = pdata->usb_bam_num_pipes;
	props->callback = usb_bam_sps_events;
	props->user = bam_enable_strings[bam_idx];
	props->user = bam_enable_strings[bam_type];
	props->options = SPS_BAM_OPT_IRQ_WAKEUP;

	/*
	* HSUSB and HSIC Cores don't support RESET ACK signal to BAMs
	* Hence, let BAM to ignore acknowledge from USB while resetting PIPE
	*/
	if (pdata->ignore_core_reset_ack && bam_idx != SSUSB_BAM)
	if (pdata->ignore_core_reset_ack && bam_type != SSUSB_BAM)
		props->options = SPS_BAM_NO_EXT_P_RST;

	if (pdata->disable_clk_gating)
		props->options |= SPS_BAM_NO_LOCAL_CLK_GATING;

	ret = sps_register_bam_device(props, &(ctx.h_bam[bam_idx]));
	ret = sps_register_bam_device(props, &(ctx.h_bam[bam_type]));
	if (ret < 0) {
		pr_err("%s: register bam error %d\n", __func__, ret);
		ret = -EFAULT;
		goto free_qscratch_reg;
	}

	/* Mark this bam as initilaized */
	for (i = 0; i < ARRAY_SIZE(ipa_rm_bams); i++)
		if (ipa_rm_bams[i].bam == bam_type) {
			ipa_rm_bams[i].initialized = true;
			break;
		}

	return 0;

free_qscratch_reg: