Thread (11 messages) 11 messages, 4 authors, 2026-01-21

Re: [PATCH 3/5] gpio: aspeed-sgpio: Create llops to handle hardware access

From: Billy Tsai <hidden>
Date: 2026-01-19 02:39:16
Also in: linux-aspeed, linux-devicetree, linux-gpio, lkml

 
Thanks for the detailed review — your comments are very helpful.
 
quoted
Add low-level operations (llops) to abstract the register access for SGPIO
registers. With this abstraction layer, the driver can separate the
hardware and software logic, making it easier to extend the driver to
support different hardware register layouts.
 
With a quick look at the code, it appears the register numbers stay
the same? Is that true?
I think you have reinvented regmap.
 
Yes, the register numbers remain unchanged for ASPEED G4 in this patch.
The intent of introducing the llops abstraction is to decouple the driver logic
from the underlying register layout so that we can support SoCs with different
SGPIO register organizations in the future. The actual AST2700-specific support
will be added in a subsequent patch.
 
We did consider regmap. However, llops is intended to abstract not only register
access but also layout-specific bit mapping, which is difficult to express
cleanly with a flat regmap interface.
 
quoted
@@ -318,30 +278,25 @@ static int aspeed_sgpio_set_type(struct irq_data *d, unsigned int type)
      u32 type0 = 0;
      u32 type1 = 0;
      u32 type2 = 0;
-     u32 bit, reg;
-     const struct aspeed_sgpio_bank *bank;
      irq_flow_handler_t handler;
-     struct aspeed_sgpio *gpio;
-     void __iomem *addr;
-     int offset;
-
-     irqd_to_aspeed_sgpio_data(d, &gpio, &bank, &bit, &offset);
+     struct aspeed_sgpio *gpio = irq_data_get_irq_chip_data(d);
+     int offset = irqd_to_hwirq(d);

      switch (type & IRQ_TYPE_SENSE_MASK) {
      case IRQ_TYPE_EDGE_BOTH:
-             type2 |= bit;
+             type2 = 1;
              fallthrough;
      case IRQ_TYPE_EDGE_RISING:
-             type0 |= bit;
+             type0 = 1;
              fallthrough;
      case IRQ_TYPE_EDGE_FALLING:
              handler = handle_edge_irq;
              break;
      case IRQ_TYPE_LEVEL_HIGH:
-             type0 |= bit;
+             type0 = 1;
              fallthrough;
      case IRQ_TYPE_LEVEL_LOW:
-             type1 |= bit;
+             type1 = 1;
              handler = handle_level_irq;
              break;
 
This change is not obviously correct to me. It is not about
abstracting register accesses, what you actually write to the
registers appears to of changed. Maybe you could add a refactoring
patch first which does this change, with a commit message explaining
it, and then insert the register abstraction?
 
You’re right — viewed together, this change is not obviously correct and makes
the refactoring harder to review.
 
While the llops interface is designed to handle bit positioning internally
(changing the semantics from passing a bitmask to passing a value), combining
this semantic change with the abstraction refactoring increases review
complexity.
 
To address this, I will respin the series and split it into:
                1.            a preparatory refactoring patch that introduces the llops helpers without
changing behavior, and
                2.            a follow-up patch that switches callers to the new value-based interface,
with a commit message explicitly explaining the semantic change.
 
quoted
@@ -374,16 +318,14 @@ static void aspeed_sgpio_irq_handler(struct irq_desc *desc)
 {
      struct gpio_chip *gc = irq_desc_get_handler_data(desc);
      struct irq_chip *ic = irq_desc_get_chip(desc);
-     struct aspeed_sgpio *data = gpiochip_get_data(gc);
+     struct aspeed_sgpio *gpio = gpiochip_get_data(gc);
 
This rename does not belong in this patch. You want lots of small
patches, each doing one logical thing, with a good commit message, and
obviously correct. Changes like this make it a lot less obviously
correct.
 
Agreed. I will revert the rename from this patch and handle it separately if
needed.
 
quoted
      /* Disable IRQ and clear Interrupt status registers for all SGPIO Pins. */
-     for (i = 0; i < ARRAY_SIZE(aspeed_sgpio_banks); i++) {
-             bank =  &aspeed_sgpio_banks[i];
+     for (i = 0; i < gpio->chip.ngpio; i += 2) {
 
Why are ARRAY_SIZE() gone? There probably is a good reason, so doing
this in a patch of its own, with a commit message explaining "Why?"
would make this easier to review.
 
The change from ARRAY_SIZE(aspeed_sgpio_banks) to gpio->chip.ngpio is required
because AST2700 does not use a fixed bank-based register layout.
 
Using ngpio removes the dependency on a static bank array and allows the IRQ
handling code to work with SoCs that have different SGPIO organizations.
I agree this change deserves a dedicated patch with a commit message explaining
the rationale, and I will split it out accordingly.
 
Thanks again for the review. I’ll send a revised version with the changes above.

Billy Tsai
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help