All of lore.kernel.org
 help / color / mirror / Atom feed
From: Christian Zigotzky <chzigotzky@xenosoft.de>
To: Michael Ellerman <mpe@ellerman.id.au>,
	Darren Stevens <darren@stevens-zone.net>,
	linuxppc-dev@lists.ozlabs.org, Olof Johansson <olof@lixom.net>
Subject: [PATCH NEXT 2/4] powerpc/pasemi: Add Nemo board IRQ init routine
Date: Wed, 8 Aug 2018 11:22:37 +0200	[thread overview]
Message-ID: <572a3a5a-e771-c962-3f65-6a2a0b5508cd@xenosoft.de> (raw)
In-Reply-To: <87h8noanxo.fsf@concordia.ellerman.id.au>

Hello Michael,

I haven't reached Darren yet but I try to help a little bit.

On 03 May 2018 at 3:06PM, Michael Ellerman wrote:
> Darren Stevens <darren@stevens-zone.net> writes:
>
>> diff --git a/arch/powerpc/platforms/pasemi/setup.c b/arch/powerpc/platforms/pasemi/setup.c
>> index c4a3e93..c583c17 100644
>> --- a/arch/powerpc/platforms/pasemi/setup.c
>> +++ b/arch/powerpc/platforms/pasemi/setup.c
>> @@ -183,6 +184,99 @@ static int __init pas_setup_mce_regs(void)
>>   }
>>   machine_device_initcall(pasemi, pas_setup_mce_regs);
>>   
>> +#ifdef CONFIG_PPC_PASEMI_NEMO
>> +static void sb600_8259_cascade(struct irq_desc *desc)
>> +{
>> +	struct irq_chip *chip = irq_desc_get_chip(desc);
>> +	unsigned int cascade_irq = i8259_irq();
>> +
>> +	if (cascade_irq)
>> +               generic_handle_irq(cascade_irq);
>> +
>> +	chip->irq_eoi(&desc->irq_data);
>> +}
>> +
>> +static __init void nemo_init_IRQ(void)
>> +{
>> +	struct device_node *np;
>> +	struct device_node *root, *mpic_node, *i8259_node;
>> +	unsigned long openpic_addr;
>> +	const unsigned int *opprop;
>> +	int naddr, opplen;
>> +	int mpic_flags;
>> +	const unsigned int *nmiprop;
>> +	struct mpic *mpic;
>> +	int gpio_virq;
>> +
>> +	mpic_node = NULL;
> This is basically a copy of the existing routine.
Yes, at the begin of 'nemo_init_IRQ' it is a copy of the existing 
routine. But the code before is new code. A similar code is in the file 
"arch/powerpc/platforms/pseries/setup.c" but for the pSeries.
>
>> +	for_each_node_by_type(np, "interrupt-controller")
>> +		if (of_device_is_compatible(np, "open-pic")) {
>> +			mpic_node = np;
>> +			break;
>> +		}
>> +	if (!mpic_node)
>> +		for_each_node_by_type(np, "open-pic") {
>> +			mpic_node = np;
>> +			break;
>> +		}
>> +	if (!mpic_node) {
>> +		printk(KERN_ERR
>> +			"Failed to locate the MPIC interrupt controller\n");
>> +		return;
>> +	}
>> +
>> +	/* Find address list in /platform-open-pic */
>> +	root = of_find_node_by_path("/");
>> +	naddr = of_n_addr_cells(root);
>> +	opprop = of_get_property(root, "platform-open-pic", &opplen);
>> +	if (!opprop) {
>> +		printk(KERN_ERR "No platform-open-pic property.\n");
>> +		of_node_put(root);
>> +		return;
>> +	}
>> +	openpic_addr = of_read_number(opprop, naddr);
>> +	printk(KERN_DEBUG "OpenPIC addr: %lx\n", openpic_addr);
>> +
>> +	mpic_flags = MPIC_LARGE_VECTORS | MPIC_NO_BIAS | MPIC_NO_RESET;
>> +
>> +	nmiprop = of_get_property(mpic_node, "nmi-source", NULL);
>> +	if (nmiprop)
>> +		mpic_flags |= MPIC_ENABLE_MCK;
>> +
>> +	mpic = mpic_alloc(mpic_node, openpic_addr,
>> +			  mpic_flags, 0, 0, "PASEMI-OPIC");
>> +	BUG_ON(!mpic);
>> +
>> +	mpic_assign_isu(mpic, 0, mpic->paddr + 0x10000);
>> +	mpic_init(mpic);
>> +	/* The NMI/MCK source needs to be prio 15 */
>> +	if (nmiprop) {
>> +		nmi_virq = irq_create_mapping(NULL, *nmiprop);
>> +		mpic_irq_set_priority(nmi_virq, 15);
>> +		irq_set_irq_type(nmi_virq, IRQ_TYPE_EDGE_RISING);
>> +		mpic_unmask_irq(irq_get_irq_data(nmi_virq));
>> +	}
> Except for this bit:
>
>> +	/* Connect the SB600's legacy i8259 controller */
>> +	i8259_node = of_find_node_by_path("/pxp@0,e0000000");
>> +	i8259_init(i8259_node, 0);
>> +	of_node_put(i8259_node);
>> +
>> +	gpio_virq = irq_create_mapping(NULL, 3);
>> +	irq_set_irq_type(gpio_virq, IRQ_TYPE_LEVEL_HIGH);
>> +	irq_set_chained_handler(gpio_virq, sb600_8259_cascade);
>> +	mpic_unmask_irq(irq_get_irq_data(gpio_virq));
>> +
>> +	irq_set_default_host(mpic->irqhost);
> So that should just go in a separate routine that is empty when NEMO=n.
>
> cheers
>
What do you think about the following code. This uses 'pas_init_IRQ':

static __init void pas_init_IRQ(void)
  {
      struct device_node *np;
-    struct device_node *root, *mpic_node;
+    struct device_node *root, *mpic_node, *i8259_node;
      unsigned long openpic_addr;
      const unsigned int *opprop;
      int naddr, opplen;
      int mpic_flags;
      const unsigned int *nmiprop;
      struct mpic *mpic;
+    int gpio_virq;

      mpic_node = NULL;

@@ -244,6 +270,22 @@ static __init void pas_init_IRQ(void)
          mpic_unmask_irq(irq_get_irq_data(nmi_virq));
      }

+
+#ifdef CONFIG_PPC_PASEMI_NEMO
+    /* Connect the SB600's legacy i8259 controller */
+    i8259_node = of_find_node_by_path("/pxp@0,e0000000");
+    i8259_init(i8259_node, 0);
+    of_node_put(i8259_node);
+
+    gpio_virq = irq_create_mapping(NULL, 3);
+    irq_set_irq_type(gpio_virq, IRQ_TYPE_LEVEL_HIGH);
+    irq_set_chained_handler(gpio_virq, sb600_8259_cascade);
+    mpic_unmask_irq(irq_get_irq_data(gpio_virq));
+
+    irq_set_default_host(mpic->irqhost);
+
+#endif
      of_node_put(mpic_node);
      of_node_put(root);
  }

----

Shall I add 'ifdef CONFIG_PPC_PASEMI_NEMO' for 'struct device_node 
*root, *mpic_node, *i8259_node;' and 'int gpio_virq;'?

Note: I am not a programmer. I work for the Linux first level support 
for A-EON but sometimes I try to help. This is only a suggestion.

Thanks,
Christian

      reply	other threads:[~2018-08-08  9:22 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-31 22:04 [PATCH NEXT 2/4] powerpc/pasemi: Add Nemo board IRQ init routine Darren Stevens
2018-05-03 13:06 ` Michael Ellerman
2018-08-08  9:22   ` Christian Zigotzky [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=572a3a5a-e771-c962-3f65-6a2a0b5508cd@xenosoft.de \
    --to=chzigotzky@xenosoft.de \
    --cc=darren@stevens-zone.net \
    --cc=linuxppc-dev@lists.ozlabs.org \
    --cc=mpe@ellerman.id.au \
    --cc=olof@lixom.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.