Commit 0ff1db48 authored by Paolo Abeni's avatar Paolo Abeni
Browse files

Merge branch 'net-ipa-eight-simple-cleanups'

Alex Elder says:

====================
net: ipa: eight simple cleanups

This series contains a mix of cleanups, some dating back to
December, 2022.  Version 1 was based on an older version of
net-next/main; this version has simply been rebased.

The first two make it so the IPA SUSPEND interrupt only gets enabled
when necessary.  That make it possible in the third patch to call
device_init_wakeup() during an earlier phase of initialization, and
remove two functions.

The next patch removes IPA register definitions that are never used.
The fifth patch makes ipa_table_hash_support() a real function, so
the IPA structure only needs to be declared rather than defined when
that file is parsed.

The sixth patch fixes improper argument names in two function
declarations.  The seventh removes the declaration for a function
that does not exist, and makes ipa_cmd_init() actually get called.
And the last one eliminates ipa_version_supported(), in favor of
just deciding that if a device is probed because its compatible
matches, that device is assumed to be supported.
====================

Link: https://lore.kernel.org/r/20240419151800.2168903-1-elder@linaro.org


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parents 57f15912 dfdd70e2
Loading
Loading
Loading
Loading
+0 −8
Original line number Diff line number Diff line
@@ -53,14 +53,6 @@ enum ipa_cmd_opcode {
bool ipa_cmd_table_init_valid(struct ipa *ipa, const struct ipa_mem *mem,
			      bool route);

/**
 * ipa_cmd_data_valid() - Validate command-realted configuration is valid
 * @ipa:	- IPA pointer
 *
 * Return:	true if assumptions required for command are valid
 */
bool ipa_cmd_data_valid(struct ipa *ipa);

/**
 * ipa_cmd_pool_init() - initialize command channel pools
 * @channel:	AP->IPA command TX GSI channel pointer
+3 −3
Original line number Diff line number Diff line
/* SPDX-License-Identifier: GPL-2.0 */

/* Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
 * Copyright (C) 2019-2023 Linaro Ltd.
 * Copyright (C) 2019-2024 Linaro Ltd.
 */
#ifndef _IPA_ENDPOINT_H_
#define _IPA_ENDPOINT_H_
@@ -199,9 +199,9 @@ int ipa_endpoint_init(struct ipa *ipa, u32 count,
		      const struct ipa_gsi_endpoint_data *data);
void ipa_endpoint_exit(struct ipa *ipa);

void ipa_endpoint_trans_complete(struct ipa_endpoint *ipa,
void ipa_endpoint_trans_complete(struct ipa_endpoint *endpoint,
				 struct gsi_trans *trans);
void ipa_endpoint_trans_release(struct ipa_endpoint *ipa,
void ipa_endpoint_trans_release(struct ipa_endpoint *endpoint,
				struct gsi_trans *trans);

#endif /* _IPA_ENDPOINT_H_ */
+35 −3
Original line number Diff line number Diff line
@@ -37,11 +37,13 @@
 * @ipa:		IPA pointer
 * @irq:		Linux IRQ number used for IPA interrupts
 * @enabled:		Mask indicating which interrupts are enabled
 * @suspend_enabled:	Bitmap of endpoints with the SUSPEND interrupt enabled
 */
struct ipa_interrupt {
	struct ipa *ipa;
	u32 irq;
	u32 enabled;
	unsigned long *suspend_enabled;
};

/* Clear the suspend interrupt for all endpoints that signaled it */
@@ -194,6 +196,7 @@ static void ipa_interrupt_suspend_control(struct ipa_interrupt *interrupt,
	u32 mask = BIT(endpoint_id % 32);
	u32 unit = endpoint_id / 32;
	const struct reg *reg;
	unsigned long weight;
	u32 offset;
	u32 val;

@@ -203,6 +206,10 @@ static void ipa_interrupt_suspend_control(struct ipa_interrupt *interrupt,
	if (ipa->version == IPA_VERSION_3_0)
		return;

	weight = bitmap_weight(interrupt->suspend_enabled, ipa->endpoint_count);
	if (weight == 1 && !enable)
		ipa_interrupt_disable(ipa, IPA_IRQ_TX_SUSPEND);

	reg = ipa_reg(ipa, IRQ_SUSPEND_EN);
	offset = reg_n_offset(reg, unit);
	val = ioread32(ipa->reg_virt + offset);
@@ -211,8 +218,12 @@ static void ipa_interrupt_suspend_control(struct ipa_interrupt *interrupt,
		val |= mask;
	else
		val &= ~mask;
	__change_bit(endpoint_id, interrupt->suspend_enabled);

	iowrite32(val, ipa->reg_virt + offset);

	if (!weight && enable)
		ipa_interrupt_enable(ipa, IPA_IRQ_TX_SUSPEND);
}

/* Enable TX_SUSPEND for an endpoint */
@@ -246,7 +257,16 @@ int ipa_interrupt_config(struct ipa *ipa)

	interrupt->ipa = ipa;

	/* Disable all IPA interrupt types */
	/* Initially all IPA interrupt types are disabled */
	interrupt->enabled = 0;
	interrupt->suspend_enabled = bitmap_zalloc(ipa->endpoint_count,
						   GFP_KERNEL);
	if (!interrupt->suspend_enabled) {
		ret = -ENOMEM;
		goto err_kfree;
	}

	/* Disable IPA interrupt types */
	reg = ipa_reg(ipa, IPA_IRQ_EN);
	iowrite32(0, ipa->reg_virt + reg_offset(reg));

@@ -254,22 +274,32 @@ int ipa_interrupt_config(struct ipa *ipa)
				   "ipa", interrupt);
	if (ret) {
		dev_err(dev, "error %d requesting \"ipa\" IRQ\n", ret);
		goto err_kfree;
		goto err_free_bitmap;
	}

	ret = device_init_wakeup(dev, true);
	if (ret) {
		dev_err(dev, "error %d enabling wakeup\n", ret);
		goto err_free_irq;
	}

	ret = dev_pm_set_wake_irq(dev, irq);
	if (ret) {
		dev_err(dev, "error %d registering \"ipa\" IRQ as wakeirq\n",
			ret);
		goto err_free_irq;
		goto err_disable_wakeup;
	}

	ipa->interrupt = interrupt;

	return 0;

err_disable_wakeup:
	(void)device_init_wakeup(dev, false);
err_free_irq:
	free_irq(interrupt->irq, interrupt);
err_free_bitmap:
	bitmap_free(interrupt->suspend_enabled);
err_kfree:
	kfree(interrupt);

@@ -285,7 +315,9 @@ void ipa_interrupt_deconfig(struct ipa *ipa)
	ipa->interrupt = NULL;

	dev_pm_clear_wake_irq(dev);
	(void)device_init_wakeup(dev, false);
	free_irq(interrupt->irq, interrupt);
	bitmap_free(interrupt->suspend_enabled);
}

/* Initialize the IPA interrupt structure */
+4 −12
Original line number Diff line number Diff line
@@ -119,10 +119,6 @@ int ipa_setup(struct ipa *ipa)
	if (ret)
		return ret;

	ret = ipa_power_setup(ipa);
	if (ret)
		goto err_gsi_teardown;

	ipa_endpoint_setup(ipa);

	/* We need to use the AP command TX endpoint to perform other
@@ -169,8 +165,6 @@ int ipa_setup(struct ipa *ipa)
	ipa_endpoint_disable_one(command_endpoint);
err_endpoint_teardown:
	ipa_endpoint_teardown(ipa);
	ipa_power_teardown(ipa);
err_gsi_teardown:
	gsi_teardown(&ipa->gsi);

	return ret;
@@ -195,7 +189,6 @@ static void ipa_teardown(struct ipa *ipa)
	command_endpoint = ipa->name_map[IPA_ENDPOINT_AP_COMMAND_TX];
	ipa_endpoint_disable_one(command_endpoint);
	ipa_endpoint_teardown(ipa);
	ipa_power_teardown(ipa);
	gsi_teardown(&ipa->gsi);
}

@@ -817,11 +810,6 @@ static int ipa_probe(struct platform_device *pdev)
		return -ENODEV;
	}

	if (!ipa_version_supported(data->version)) {
		dev_err(dev, "unsupported IPA version %u\n", data->version);
		return -EINVAL;
	}

	if (!data->modem_route_count) {
		dev_err(dev, "modem_route_count cannot be zero\n");
		return -EINVAL;
@@ -872,6 +860,10 @@ static int ipa_probe(struct platform_device *pdev)
	if (ret)
		goto err_reg_exit;

	ret = ipa_cmd_init(ipa);
	if (ret)
		goto err_mem_exit;

	ret = gsi_init(&ipa->gsi, pdev, ipa->version, data->endpoint_count,
		       data->endpoint_data);
	if (ret)
+0 −19
Original line number Diff line number Diff line
@@ -232,25 +232,6 @@ void ipa_power_retention(struct ipa *ipa, bool enable)
			ret, enable ? "en" : "dis");
}

int ipa_power_setup(struct ipa *ipa)
{
	int ret;

	ipa_interrupt_enable(ipa, IPA_IRQ_TX_SUSPEND);

	ret = device_init_wakeup(ipa->dev, true);
	if (ret)
		ipa_interrupt_disable(ipa, IPA_IRQ_TX_SUSPEND);

	return ret;
}

void ipa_power_teardown(struct ipa *ipa)
{
	(void)device_init_wakeup(ipa->dev, false);
	ipa_interrupt_disable(ipa, IPA_IRQ_TX_SUSPEND);
}

/* Initialize IPA power management */
struct ipa_power *
ipa_power_init(struct device *dev, const struct ipa_power_data *data)
Loading