Commit bced5549 authored by Inochi Amaoto's avatar Inochi Amaoto Committed by Thomas Gleixner
Browse files

irqchip/sg2042-msi: Rename functions and data structures to be SG2042 agnostic



As the driver logic can be used in both SG2042 and SG2044 SoCs, rename
functions and data structures, which are not SG2042 specific, to SG204x*.

Signed-off-by: default avatarInochi Amaoto <inochiama@gmail.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
Tested-by: Chen Wang <wangchen20@iscas.ac.cn> # SG2042
Reviewed-by: default avatarChen Wang <unicorn_wang@outlook.com>
Link: https://lore.kernel.org/all/20250413224922.69719-3-inochiama@gmail.com
parent 9fe5a079
Loading
Loading
Loading
Loading
+23 −23
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@

#define SG2042_MAX_MSI_VECTOR	32

struct sg2042_msi_chipdata {
struct sg204x_msi_chipdata {
	void __iomem	*reg_clr;	// clear reg, see TRM, 10.1.33, GP_INTR0_CLR

	phys_addr_t	doorbell_addr;	// see TRM, 10.1.32, GP_INTR0_SET
@@ -33,7 +33,7 @@ struct sg2042_msi_chipdata {
	struct mutex	msi_map_lock;	// lock for msi_map
};

static int sg2042_msi_allocate_hwirq(struct sg2042_msi_chipdata *data, int num_req)
static int sg204x_msi_allocate_hwirq(struct sg204x_msi_chipdata *data, int num_req)
{
	int first;

@@ -43,7 +43,7 @@ static int sg2042_msi_allocate_hwirq(struct sg2042_msi_chipdata *data, int num_r
	return first >= 0 ? first : -ENOSPC;
}

static void sg2042_msi_free_hwirq(struct sg2042_msi_chipdata *data, int hwirq, int num_req)
static void sg204x_msi_free_hwirq(struct sg204x_msi_chipdata *data, int hwirq, int num_req)
{
	guard(mutex)(&data->msi_map_lock);
	bitmap_release_region(data->msi_map, hwirq, get_count_order(num_req));
@@ -51,7 +51,7 @@ static void sg2042_msi_free_hwirq(struct sg2042_msi_chipdata *data, int hwirq, i

static void sg2042_msi_irq_ack(struct irq_data *d)
{
	struct sg2042_msi_chipdata *data  = irq_data_get_irq_chip_data(d);
	struct sg204x_msi_chipdata *data  = irq_data_get_irq_chip_data(d);
	int bit_off = d->hwirq;

	writel(1 << bit_off, data->reg_clr);
@@ -61,7 +61,7 @@ static void sg2042_msi_irq_ack(struct irq_data *d)

static void sg2042_msi_irq_compose_msi_msg(struct irq_data *d, struct msi_msg *msg)
{
	struct sg2042_msi_chipdata *data = irq_data_get_irq_chip_data(d);
	struct sg204x_msi_chipdata *data = irq_data_get_irq_chip_data(d);

	msg->address_hi = upper_32_bits(data->doorbell_addr);
	msg->address_lo = lower_32_bits(data->doorbell_addr);
@@ -79,9 +79,9 @@ static const struct irq_chip sg2042_msi_middle_irq_chip = {
	.irq_compose_msi_msg	= sg2042_msi_irq_compose_msi_msg,
};

static int sg2042_msi_parent_domain_alloc(struct irq_domain *domain, unsigned int virq, int hwirq)
static int sg204x_msi_parent_domain_alloc(struct irq_domain *domain, unsigned int virq, int hwirq)
{
	struct sg2042_msi_chipdata *data = domain->host_data;
	struct sg204x_msi_chipdata *data = domain->host_data;
	struct irq_fwspec fwspec;
	struct irq_data *d;
	int ret;
@@ -99,18 +99,18 @@ static int sg2042_msi_parent_domain_alloc(struct irq_domain *domain, unsigned in
	return d->chip->irq_set_type(d, IRQ_TYPE_EDGE_RISING);
}

static int sg2042_msi_middle_domain_alloc(struct irq_domain *domain, unsigned int virq,
static int sg204x_msi_middle_domain_alloc(struct irq_domain *domain, unsigned int virq,
					  unsigned int nr_irqs, void *args)
{
	struct sg2042_msi_chipdata *data = domain->host_data;
	struct sg204x_msi_chipdata *data = domain->host_data;
	int hwirq, err, i;

	hwirq = sg2042_msi_allocate_hwirq(data, nr_irqs);
	hwirq = sg204x_msi_allocate_hwirq(data, nr_irqs);
	if (hwirq < 0)
		return hwirq;

	for (i = 0; i < nr_irqs; i++) {
		err = sg2042_msi_parent_domain_alloc(domain, virq + i, hwirq + i);
		err = sg204x_msi_parent_domain_alloc(domain, virq + i, hwirq + i);
		if (err)
			goto err_hwirq;

@@ -121,25 +121,25 @@ static int sg2042_msi_middle_domain_alloc(struct irq_domain *domain, unsigned in
	return 0;

err_hwirq:
	sg2042_msi_free_hwirq(data, hwirq, nr_irqs);
	sg204x_msi_free_hwirq(data, hwirq, nr_irqs);
	irq_domain_free_irqs_parent(domain, virq, i);

	return err;
}

static void sg2042_msi_middle_domain_free(struct irq_domain *domain, unsigned int virq,
static void sg204x_msi_middle_domain_free(struct irq_domain *domain, unsigned int virq,
					  unsigned int nr_irqs)
{
	struct irq_data *d = irq_domain_get_irq_data(domain, virq);
	struct sg2042_msi_chipdata *data = irq_data_get_irq_chip_data(d);
	struct sg204x_msi_chipdata *data = irq_data_get_irq_chip_data(d);

	irq_domain_free_irqs_parent(domain, virq, nr_irqs);
	sg2042_msi_free_hwirq(data, d->hwirq, nr_irqs);
	sg204x_msi_free_hwirq(data, d->hwirq, nr_irqs);
}

static const struct irq_domain_ops sg2042_msi_middle_domain_ops = {
	.alloc	= sg2042_msi_middle_domain_alloc,
	.free	= sg2042_msi_middle_domain_free,
static const struct irq_domain_ops sg204x_msi_middle_domain_ops = {
	.alloc	= sg204x_msi_middle_domain_alloc,
	.free	= sg204x_msi_middle_domain_free,
	.select	= msi_lib_irq_domain_select,
};

@@ -157,14 +157,14 @@ static const struct msi_parent_ops sg2042_msi_parent_ops = {
	.init_dev_msi_info	= msi_lib_init_dev_msi_info,
};

static int sg2042_msi_init_domains(struct sg2042_msi_chipdata *data,
static int sg204x_msi_init_domains(struct sg204x_msi_chipdata *data,
				   struct irq_domain *plic_domain, struct device *dev)
{
	struct fwnode_handle *fwnode = dev_fwnode(dev);
	struct irq_domain *middle_domain;

	middle_domain = irq_domain_create_hierarchy(plic_domain, 0, data->num_irqs, fwnode,
						    &sg2042_msi_middle_domain_ops, data);
						    &sg204x_msi_middle_domain_ops, data);
	if (!middle_domain) {
		pr_err("Failed to create the MSI middle domain\n");
		return -ENOMEM;
@@ -181,13 +181,13 @@ static int sg2042_msi_init_domains(struct sg2042_msi_chipdata *data,
static int sg2042_msi_probe(struct platform_device *pdev)
{
	struct fwnode_reference_args args = { };
	struct sg2042_msi_chipdata *data;
	struct sg204x_msi_chipdata *data;
	struct device *dev = &pdev->dev;
	struct irq_domain *plic_domain;
	struct resource *res;
	int ret;

	data = devm_kzalloc(dev, sizeof(struct sg2042_msi_chipdata), GFP_KERNEL);
	data = devm_kzalloc(dev, sizeof(struct sg204x_msi_chipdata), GFP_KERNEL);
	if (!data)
		return -ENOMEM;

@@ -231,7 +231,7 @@ static int sg2042_msi_probe(struct platform_device *pdev)

	mutex_init(&data->msi_map_lock);

	return sg2042_msi_init_domains(data, plic_domain, dev);
	return sg204x_msi_init_domains(data, plic_domain, dev);
}

static const struct of_device_id sg2042_msi_of_match[] = {