Re: [DO NOT MERGE v5 16/37] irqchip: Add SH7751 INTC driver
From: Thomas Gleixner <hidden>
Date: 2023-12-08 15:49:35
Also in:
dri-devel, linux-clk, linux-devicetree, linux-ide, linux-pci, linux-renesas-soc, linux-serial, linux-sh, lkml
On Tue, Dec 05 2023 at 18:45, Yoshinori Sato wrote:
+static void endisable_irq(struct irq_data *data, int enable)
bool enable?
+{
+ struct sh7751_intc_priv *priv;
+ unsigned int irq;
+
+ priv = irq_data_to_priv(data);
+
+ irq = irqd_to_hwirq(data);
+ if (!is_valid_irq(irq)) {
+ /* IRQ out of range */
+ pr_warn_once("%s: IRQ %u is out of range\n", __FILE__, irq);
+ return;
+ }
+
+ if (irq <= MAX_IRL && !priv->irlm)
+ /* IRL encoded external interrupt */
+ /* disable for SR.IMASK */
+ update_sr_imask(irq - IRQ_START, enable);
+ else
+ /* Internal peripheral interrupt */
+ /* mask for IPR priority 0 */
+ update_ipr(priv, irq, enable);Lacks curly brackets on the if/else
+static int irq_sh7751_map(struct irq_domain *h, unsigned int virq,
+ irq_hw_number_t hw_irq_num)
+{
+ irq_set_chip_and_handler(virq, &sh7751_irq_chip, handle_level_irq);
+ irq_get_irq_data(virq)->chip_data = h->host_data;
+ irq_modify_status(virq, IRQ_NOREQUEST, IRQ_NOPROBE);
+ return 0;
+}
+static const struct irq_domain_ops irq_ops = {Newline before 'static ...'
+ .map = irq_sh7751_map,
+ .xlate = irq_domain_xlate_onecell,
+};
+
+static int __init load_ipr_map(struct device_node *intc,
+ struct sh7751_intc_priv *priv)
+{
+ struct property *ipr_map;
+ unsigned int num_ipr, i;
+ struct ipr *ipr;
+ const __be32 *p;
+ u32 irq;
+
+ ipr_map = of_find_property(intc, "renesas,ipr-map", &num_ipr);
+ if (IS_ERR(ipr_map))
+ return PTR_ERR(ipr_map);
+ num_ipr /= sizeof(u32);
+ /* 3words per entry. */
+ if (num_ipr % 3)
Three words per ... But you can spare the comment by doing:
if (num_ipr % WORDS_PER_ENTRY)
+ goto error1;
+ num_ipr /= 3;
+static int __init sh7751_intc_of_init(struct device_node *intc,
+ struct device_node *parent)
+{
+ struct sh7751_intc_priv *priv;
+ void __iomem *base, *base2;
+ struct irq_domain *domain;
+ u16 icr;
+ int ret;
+
+ base = of_iomap(intc, 0);
+ base2 = of_iomap(intc, 1);
+ if (!base || !base2) {
+ pr_err("%pOFP: Invalid register definition\n", intc);What unmaps 'base' if 'base' is valid and base2 == NULL?
+ return -EINVAL; + } + + priv = kzalloc(sizeof(struct sh7751_intc_priv), GFP_KERNEL); + if (priv == NULL) + return -ENOMEM;
Leaks base[2] maps, no?
+ ret = load_ipr_map(intc, priv);
+ if (ret < 0) {
+ kfree(priv);
+ return ret;
+ }
+
+ priv->base = base;
+ priv->intpri00 = base2;
+
+ if (of_property_read_bool(intc, "renesas,irlm")) {
+ priv->irlm = true;
+ icr = __raw_readw(priv->base + R_ICR);
+ icr |= ICR_IRLM;
+ __raw_writew(icr, priv->base + R_ICR);
+ }
+
+ domain = irq_domain_add_linear(intc, NR_IRQS, &irq_ops, priv);
+ if (domain == NULL) {
+ pr_err("%pOFP: cannot initialize irq domain\n", intc);
+ kfree(priv);
+ return -ENOMEM;
+ }
+
+ irq_set_default_host(domain);
+ pr_info("%pOFP: SH7751 Interrupt controller (%s external IRQ)",
+ intc, priv->irlm ? "4 lines" : "15 level");
+ return 0;
+}
+
+IRQCHIP_DECLARE(sh_7751_intc,
+ "renesas,sh7751-intc", sh7751_intc_of_init);
One line please.
Thanks,
tglx