Unverified Commit a7a7c00c authored by Arnd Bergmann's avatar Arnd Bergmann
Browse files

Merge tag 'ti-driver-soc-for-v6.2-v2' of...

Merge tag 'ti-driver-soc-for-v6.2-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/ti/linux into soc/drivers

TI SoC driver updates for v6.2 v2

* Minor bugfixes for knav_qmss_queue, smartreflex drivers
* API optimizations including using devm, bitmap apis to
  ti-sci, soc-info drivers
* k3-ringacc can now be built as modules for certain
  distros that mandate such usage.
* k3-socinfo can now detect AM62A SoCs.

* tag 'ti-driver-soc-for-v6.2-v2' of git://git.kernel.org/pub/scm/linux/kernel/git/ti/linux:
  soc: ti: k3-socinfo: Add AM62Ax JTAG ID
  soc: ti: smartreflex: Fix PM disable depth imbalance in omap_sr_probe
  soc: ti: knav_qmss_queue: Fix PM disable depth imbalance in knav_queue_probe
  firmware: ti_sci: Use devm_bitmap_zalloc when applicable
  soc: ti: k3-ringacc: Allow the driver to be built as module
  firmware: ti_sci: Fix polled mode during system suspend
  firmware: ti_sci: Use the non-atomic bitmap API when applicable
  firmware: ti_sci: Use the bitmap API to allocate bitmaps
  drivers: soc: ti: knav_qmss_queue: Mark knav_acc_firmwares as static

Link: https://lore.kernel.org/r/20221122223856.fwackjg7fbd5jcz7@wannabe


Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
parents 66b55cae c11b537e
Loading
Loading
Loading
Loading
+10 −14
Original line number Diff line number Diff line
@@ -429,15 +429,14 @@ static inline int ti_sci_do_xfer(struct ti_sci_info *info,
		 * during noirq phase, so we must manually poll the completion.
		 */
		ret = read_poll_timeout_atomic(try_wait_for_completion, done_state,
					       true, 1,
					       done_state, 1,
					       info->desc->max_rx_timeout_ms * 1000,
					       false, &xfer->done);
	}

	if (ret == -ETIMEDOUT || !done_state) {
	if (ret == -ETIMEDOUT)
		dev_err(dev, "Mbox timedout in resp(caller: %pS)\n",
			(void *)_RET_IP_);
	}

	/*
	 * NOTE: we might prefer not to need the mailbox ticker to manage the
@@ -3096,7 +3095,7 @@ u16 ti_sci_get_free_resource(struct ti_sci_resource *res)

		free_bit = find_first_zero_bit(desc->res_map, res_count);
		if (free_bit != res_count) {
			set_bit(free_bit, desc->res_map);
			__set_bit(free_bit, desc->res_map);
			raw_spin_unlock_irqrestore(&res->lock, flags);

			if (desc->num && free_bit < desc->num)
@@ -3127,10 +3126,10 @@ void ti_sci_release_resource(struct ti_sci_resource *res, u16 id)

		if (desc->num && desc->start <= id &&
		    (desc->start + desc->num) > id)
			clear_bit(id - desc->start, desc->res_map);
			__clear_bit(id - desc->start, desc->res_map);
		else if (desc->num_sec && desc->start_sec <= id &&
			 (desc->start_sec + desc->num_sec) > id)
			clear_bit(id - desc->start_sec, desc->res_map);
			__clear_bit(id - desc->start_sec, desc->res_map);
	}
	raw_spin_unlock_irqrestore(&res->lock, flags);
}
@@ -3201,9 +3200,8 @@ devm_ti_sci_get_resource_sets(const struct ti_sci_handle *handle,

		valid_set = true;
		res_count = res->desc[i].num + res->desc[i].num_sec;
		res->desc[i].res_map =
			devm_kzalloc(dev, BITS_TO_LONGS(res_count) *
				     sizeof(*res->desc[i].res_map), GFP_KERNEL);
		res->desc[i].res_map = devm_bitmap_zalloc(dev, res_count,
							  GFP_KERNEL);
		if (!res->desc[i].res_map)
			return ERR_PTR(-ENOMEM);
	}
@@ -3400,13 +3398,11 @@ static int ti_sci_probe(struct platform_device *pdev)
	if (!minfo->xfer_block)
		return -ENOMEM;

	minfo->xfer_alloc_table = devm_kcalloc(dev,
					       BITS_TO_LONGS(desc->max_msgs),
					       sizeof(unsigned long),
	minfo->xfer_alloc_table = devm_bitmap_zalloc(dev,
						     desc->max_msgs,
						     GFP_KERNEL);
	if (!minfo->xfer_alloc_table)
		return -ENOMEM;
	bitmap_zero(minfo->xfer_alloc_table, desc->max_msgs);

	/* Pre-initialize the buffer pointer to pre-allocated buffers */
	for (i = 0, xfer = minfo->xfer_block; i < desc->max_msgs; i++, xfer++) {
+1 −1
Original line number Diff line number Diff line
@@ -63,7 +63,7 @@ config TI_SCI_PM_DOMAINS
	  rootfs may be available.

config TI_K3_RINGACC
	bool "K3 Ring accelerator Sub System"
	tristate "K3 Ring accelerator Sub System"
	depends on ARCH_K3 || COMPILE_TEST
	depends on TI_SCI_INTA_IRQCHIP
	help
+26 −2
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@

#include <linux/dma-mapping.h>
#include <linux/io.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h>
@@ -336,6 +336,9 @@ struct k3_ring *k3_ringacc_request_ring(struct k3_ringacc *ringacc,

	mutex_lock(&ringacc->req_lock);

	if (!try_module_get(ringacc->dev->driver->owner))
		goto err_module_get;

	if (id == K3_RINGACC_RING_ID_ANY) {
		/* Request for any general purpose ring */
		struct ti_sci_resource_desc *gp_rings =
@@ -380,6 +383,9 @@ struct k3_ring *k3_ringacc_request_ring(struct k3_ringacc *ringacc,
	return &ringacc->rings[id];

error:
	module_put(ringacc->dev->driver->owner);

err_module_get:
	mutex_unlock(&ringacc->req_lock);
	return NULL;
}
@@ -616,6 +622,8 @@ int k3_ringacc_ring_free(struct k3_ring *ring)
no_init:
	clear_bit(ring->ring_id, ringacc->rings_inuse);

	module_put(ringacc->dev->driver->owner);

out:
	mutex_unlock(&ringacc->req_lock);
	return 0;
@@ -1450,6 +1458,7 @@ static const struct of_device_id k3_ringacc_of_match[] = {
	{ .compatible = "ti,am654-navss-ringacc", .data = &k3_ringacc_data, },
	{},
};
MODULE_DEVICE_TABLE(of, k3_ringacc_of_match);

struct k3_ringacc *k3_ringacc_dmarings_init(struct platform_device *pdev,
					    struct k3_ringacc_init_data *data)
@@ -1544,12 +1553,27 @@ static int k3_ringacc_probe(struct platform_device *pdev)
	return 0;
}

static int k3_ringacc_remove(struct platform_device *pdev)
{
	struct k3_ringacc *ringacc = dev_get_drvdata(&pdev->dev);

	mutex_lock(&k3_ringacc_list_lock);
	list_del(&ringacc->list);
	mutex_unlock(&k3_ringacc_list_lock);
	return 0;
}

static struct platform_driver k3_ringacc_driver = {
	.probe		= k3_ringacc_probe,
	.remove		= k3_ringacc_remove,
	.driver		= {
		.name	= "k3-ringacc",
		.of_match_table = k3_ringacc_of_match,
		.suppress_bind_attrs = true,
	},
};
builtin_platform_driver(k3_ringacc_driver);
module_platform_driver(k3_ringacc_driver);

MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("TI Ringacc driver for K3 SOCs");
MODULE_AUTHOR("Grygorii Strashko <grygorii.strashko@ti.com>");
+1 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ static const struct k3_soc_id {
	{ 0xBB38, "AM64X" },
	{ 0xBB75, "J721S2"},
	{ 0xBB7E, "AM62X" },
	{ 0xBB8D, "AM62AX" },
};

static int
+2 −1
Original line number Diff line number Diff line
@@ -67,7 +67,7 @@ static DEFINE_MUTEX(knav_dev_lock);
 * Newest followed by older ones. Search is done from start of the array
 * until a firmware file is found.
 */
const char *knav_acc_firmwares[] = {"ks2_qmss_pdsp_acc48.bin"};
static const char * const knav_acc_firmwares[] = {"ks2_qmss_pdsp_acc48.bin"};

static bool device_ready;
bool knav_qmss_device_ready(void)
@@ -1785,6 +1785,7 @@ static int knav_queue_probe(struct platform_device *pdev)
	pm_runtime_enable(&pdev->dev);
	ret = pm_runtime_resume_and_get(&pdev->dev);
	if (ret < 0) {
		pm_runtime_disable(&pdev->dev);
		dev_err(dev, "Failed to enable QMSS\n");
		return ret;
	}
Loading