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

Commit 7034b978 authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drivers: pinctrl: msm: Add hierarchy domain support for RPM targets"

parents 2a9c4ed7 0e77a9e2
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
		gpio-controller;
		#gpio-cells = <2>;
		interrupt-controller;
		interrupt-parent = <&wakegpio>;
		#interrupt-cells = <2>;

		pmx-uartconsole {
+1 −1
Original line number Diff line number Diff line
@@ -231,7 +231,7 @@
	wakegpio: wake-gpio {
		compatible = "qcom,mpm-gpio-msm8953", "qcom,mpm-gpio";
		interrupt-controller;
		interrupt-parent = <&tlmm>;
		interrupt-parent = <&intc>;
		#interrupt-cells = <2>;
	};

+35 −41
Original line number Diff line number Diff line
@@ -202,19 +202,35 @@ static inline void msm_mpm_set_type(struct irq_data *d,
	}
}

static void msm_mpm_chip_mask(struct irq_data *d)
static void msm_mpm_gpio_chip_mask(struct irq_data *d)
{
	msm_mpm_enable_irq(d, false);
}

static void msm_mpm_gpio_chip_unmask(struct irq_data *d)
{
	msm_mpm_enable_irq(d, true);
}

static int msm_mpm_gpio_chip_set_type(struct irq_data *d, unsigned int type)
{
	msm_mpm_set_type(d, type);
	return 0;
}

static void msm_mpm_gic_chip_mask(struct irq_data *d)
{
	msm_mpm_enable_irq(d, false);
	irq_chip_mask_parent(d);
}

static void msm_mpm_chip_unmask(struct irq_data *d)
static void msm_mpm_gic_chip_unmask(struct irq_data *d)
{
	msm_mpm_enable_irq(d, true);
	irq_chip_unmask_parent(d);
}

static int msm_mpm_chip_set_type(struct irq_data *d, unsigned int type)
static int msm_mpm_gic_chip_set_type(struct irq_data *d, unsigned int type)
{
	msm_mpm_set_type(d, type);
	return irq_chip_set_type_parent(d, type);
@@ -223,21 +239,21 @@ static int msm_mpm_chip_set_type(struct irq_data *d, unsigned int type)
static struct irq_chip msm_mpm_gic_chip = {
	.name		= "mpm-gic",
	.irq_eoi	= irq_chip_eoi_parent,
	.irq_mask	= msm_mpm_chip_mask,
	.irq_disable	= msm_mpm_chip_mask,
	.irq_unmask	= msm_mpm_chip_unmask,
	.irq_mask	= msm_mpm_gic_chip_mask,
	.irq_disable	= msm_mpm_gic_chip_mask,
	.irq_unmask	= msm_mpm_gic_chip_unmask,
	.irq_retrigger	= irq_chip_retrigger_hierarchy,
	.irq_set_type	= msm_mpm_chip_set_type,
	.irq_set_type	= msm_mpm_gic_chip_set_type,
	.flags		= IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE,
	.irq_set_affinity	= irq_chip_set_affinity_parent,
};

static struct irq_chip msm_mpm_gpio_chip = {
	.name		= "mpm-gpio",
	.irq_mask	= msm_mpm_chip_mask,
	.irq_disable	= msm_mpm_chip_mask,
	.irq_unmask	= msm_mpm_chip_unmask,
	.irq_set_type	= msm_mpm_chip_set_type,
	.irq_mask	= msm_mpm_gpio_chip_mask,
	.irq_disable	= msm_mpm_gpio_chip_mask,
	.irq_unmask	= msm_mpm_gpio_chip_unmask,
	.irq_set_type	= msm_mpm_gpio_chip_set_type,
	.flags		= IRQCHIP_MASK_ON_SUSPEND | IRQCHIP_SKIP_SET_WAKE,
	.irq_retrigger          = irq_chip_retrigger_hierarchy,
	.irq_set_vcpu_affinity  = irq_chip_set_vcpu_affinity_parent,
@@ -267,7 +283,6 @@ static int msm_mpm_gpio_chip_alloc(struct irq_domain *domain,
{
	int ret = 0;
	struct irq_fwspec *fwspec = data;
	struct irq_fwspec parent_fwspec;
	irq_hw_number_t hwirq;
	unsigned int type = IRQ_TYPE_NONE;

@@ -277,10 +292,8 @@ static int msm_mpm_gpio_chip_alloc(struct irq_domain *domain,

	irq_domain_set_hwirq_and_chip(domain, virq, hwirq,
				&msm_mpm_gpio_chip, NULL);
	parent_fwspec = *fwspec;
	parent_fwspec.fwnode = domain->parent->fwnode;
	return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs,
					    &parent_fwspec);

	return 0;
}

static const struct irq_domain_ops msm_mpm_gpio_chip_domain_ops = {
@@ -643,22 +656,21 @@ static int __init mpm_gic_chip_init(struct device_node *node,

IRQCHIP_DECLARE(mpm_gic_chip, "qcom,mpm-gic", mpm_gic_chip_init);

static int mpm_gpio_chip_probe(struct platform_device *pdev)
static int __init mpm_gpio_chip_init(struct device_node *node,
					struct device_node *parent)
{
	struct device_node *node, *parent;
	struct irq_domain *parent_domain;
	const struct of_device_id *id;

	node = pdev->dev.of_node;
	parent = of_irq_find_parent(node);
	if (!parent) {
		pr_err("%s(): no parent for mpm-gpio\n", node->full_name);
		pr_err("%s(): no parent for mpm-gic\n", node->full_name);
		return -ENXIO;
	}

	parent_domain = irq_find_host(parent);
	if (!parent_domain) {
		pr_err("unable to obtain gpio parent domain defer probe\n");
		return -EPROBE_DEFER;
		return -ENXIO;
	}
	id = of_match_node(mpm_gpio_chip_data_table, node);
	if (!id) {
@@ -678,22 +690,4 @@ static int mpm_gpio_chip_probe(struct platform_device *pdev)
	return 0;
}

static const struct of_device_id msm_mpm_dt_match[] = {
	{ .compatible = "qcom,mpm-gpio"},
	{ },
};

static struct platform_driver msm_mpm_driver = {
	.probe = mpm_gpio_chip_probe,
	.driver = {
		.name = "qcom,mpm-gpio",
		.of_match_table = msm_mpm_dt_match,
	},
};

static int __init msm_mpm_gpio_init(void)
{
	return platform_driver_register(&msm_mpm_driver);
}

arch_initcall(msm_mpm_gpio_init)
IRQCHIP_DECLARE(mpm_gpio_chip, "qcom,mpm-gpio", mpm_gpio_chip_init);
+63 −30
Original line number Diff line number Diff line
@@ -584,6 +584,9 @@ static void msm_gpio_irq_mask(struct irq_data *d)
	clear_bit(d->hwirq, pctrl->enabled_irqs);

	spin_unlock_irqrestore(&pctrl->lock, flags);

	if (d->parent_data)
		irq_chip_mask_parent(d);
}

static void msm_gpio_irq_enable(struct irq_data *d)
@@ -612,6 +615,9 @@ static void msm_gpio_irq_enable(struct irq_data *d)
	set_bit(d->hwirq, pctrl->enabled_irqs);

	spin_unlock_irqrestore(&pctrl->lock, flags);

	if (d->parent_data)
		irq_chip_enable_parent(d);
}

static void msm_gpio_irq_unmask(struct irq_data *d)
@@ -633,6 +639,9 @@ static void msm_gpio_irq_unmask(struct irq_data *d)
	set_bit(d->hwirq, pctrl->enabled_irqs);

	spin_unlock_irqrestore(&pctrl->lock, flags);

	if (d->parent_data)
		irq_chip_unmask_parent(d);
}

static void msm_gpio_irq_ack(struct irq_data *d)
@@ -746,6 +755,9 @@ static int msm_gpio_irq_set_type(struct irq_data *d, unsigned int type)

	spin_unlock_irqrestore(&pctrl->lock, flags);

	if (d->parent_data)
		irq_chip_set_type_parent(d, type);

	if (type & (IRQ_TYPE_LEVEL_LOW | IRQ_TYPE_LEVEL_HIGH))
		irq_set_handler_locked(d, handle_level_irq);
	else if (type & (IRQ_TYPE_EDGE_FALLING | IRQ_TYPE_EDGE_RISING))
@@ -766,6 +778,9 @@ static int msm_gpio_irq_set_wake(struct irq_data *d, unsigned int on)

	spin_unlock_irqrestore(&pctrl->lock, flags);

	if (d->parent_data)
		irq_chip_set_wake_parent(d, on);

	return 0;
}

@@ -839,16 +854,20 @@ static int msm_gpio_domain_translate(struct irq_domain *d,
static int msm_gpio_domain_alloc(struct irq_domain *domain, unsigned int virq,
					unsigned int nr_irqs, void *arg)
{
	int ret;
	int ret = 0;
	irq_hw_number_t hwirq;
	struct irq_fwspec *fwspec = arg;
	struct irq_fwspec *fwspec = arg, parent_fwspec;

	ret = msm_gpio_domain_translate(domain, fwspec, &hwirq, NULL);
	if (ret)
		return ret;

	msm_gpio_domain_set_info(domain, virq, hwirq);
	return ret;

	parent_fwspec = *fwspec;
	parent_fwspec.fwnode = domain->parent->fwnode;
	return irq_domain_alloc_irqs_parent(domain, virq, nr_irqs,
						&parent_fwspec);
}

static const struct irq_domain_ops msm_gpio_domain_ops = {
@@ -873,16 +892,9 @@ static void setup_pdc_gpio(struct irq_domain *domain,
			unsigned int parent_irq, unsigned int gpio)
{
	int irq;
	struct irq_fwspec fwspec;

	fwspec.fwnode = domain->fwnode;
	fwspec.param[0] = gpio;
	fwspec.param[1] = IRQ_TYPE_NONE;
	fwspec.param_count = 2;


	if (gpio != 0) {
		irq = irq_create_fwspec_mapping(&fwspec);
		irq = irq_find_mapping(domain, gpio);
		irq_set_parent(irq, parent_irq);
		irq_set_chip(irq, &msm_dirconn_irq_chip);
		irq_set_handler_data(parent_irq, irq_get_irq_data(irq));
@@ -1387,7 +1399,14 @@ static void msm_gpio_setup_dir_connects(struct msm_pinctrl *pctrl)

static int msm_gpiochip_to_irq(struct gpio_chip *chip, unsigned int offset)
{
	return irq_find_mapping(chip->irqdomain, offset);
	struct irq_fwspec fwspec;

	fwspec.fwnode = of_node_to_fwnode(chip->of_node);
	fwspec.param[0] = offset;
	fwspec.param[1] = IRQ_TYPE_NONE;
	fwspec.param_count = 2;

	return irq_create_fwspec_mapping(&fwspec);
}

static int msm_gpio_init(struct msm_pinctrl *pctrl)
@@ -1395,6 +1414,7 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
	struct gpio_chip *chip;
	int ret;
	unsigned ngpio = pctrl->soc->ngpios;
	struct device_node *irq_parent = NULL;
	struct irq_domain *domain_parent;

	if (WARN_ON(ngpio > MAX_NR_GPIO))
@@ -1407,11 +1427,6 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
	chip->parent = pctrl->dev;
	chip->owner = THIS_MODULE;
	chip->of_node = pctrl->dev->of_node;
	chip->irqchip = &msm_gpio_irq_chip;
	chip->irq_handler = handle_fasteoi_irq;
	chip->irq_default_type = IRQ_TYPE_NONE;
	chip->to_irq = msm_gpiochip_to_irq;
	chip->lock_key = NULL;

	ret = gpiochip_add_data(&pctrl->chip, pctrl);
	if (ret) {
@@ -1426,7 +1441,14 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
		return ret;
	}

	domain_parent = irq_find_host(of_irq_find_parent(chip->of_node));
	irq_parent = of_irq_find_parent(chip->of_node);
	if (of_device_is_compatible(irq_parent, "qcom,mpm-gpio")) {
		chip->irqchip = &msm_gpio_irq_chip;
		chip->irq_handler = handle_fasteoi_irq;
		chip->irq_default_type = IRQ_TYPE_NONE;
		chip->to_irq = msm_gpiochip_to_irq;
		chip->lock_key = NULL;
		domain_parent = irq_find_host(irq_parent);
		if (!domain_parent) {
			pr_err("unable to find parent domain\n");
			gpiochip_remove(&pctrl->chip);
@@ -1442,9 +1464,20 @@ static int msm_gpio_init(struct msm_pinctrl *pctrl)
			dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n");
			chip->irqchip = NULL;
			gpiochip_remove(&pctrl->chip);
		return -ENOSYS;
			return -ENXIO;
		}
	} else {
		ret = gpiochip_irqchip_add(chip,
					&msm_gpio_irq_chip,
					0,
					handle_fasteoi_irq,
					IRQ_TYPE_NONE);
		if (ret) {
			dev_err(pctrl->dev, "Failed to add irqchip to gpiochip\n");
			gpiochip_remove(&pctrl->chip);
			return ret;
		}
	}

	gpiochip_set_chained_irqchip(chip, &msm_gpio_irq_chip,
				pctrl->irq, msm_gpio_irq_handler);