Minor optimizations for Intel pinctrl
Subsystems (3)
cover Minor optimizations for Intel pinctrl
This series implements minor optimizations for Intel pinctrl driver.
The numbers are as tested with gcc 7.5.0 and may vary with newer versions.
Raag Jadav (4):
pinctrl: intel: optimize set_mux hook
pinctrl: intel: optimize irq_set_type hook
pinctrl: intel: simplify exit path of set_mux hook
pinctrl: intel: simplify exit path of gpio_request_enable hook
drivers/pinctrl/intel/pinctrl-intel.c | 63 +++++++++++++++------------ 1 file changed, 35 insertions(+), 28 deletions(-)
Signature · 1 line
2.17.1
PATCH 1/4 pinctrl: intel: optimize set_mux hook
Utilize a temporary variable for common shift operation inside ->set_mux() hook and save a few bytes.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-3 (-3)
Function old new delta intel_pinmux_set_mux 245 242 -3
Total: Before=10472, After=10469, chg -0.03%
--- drivers/pinctrl/intel/pinctrl-intel.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)
drivers/pinctrl/intel/pinctrl-intel.c +5 -4
@@ -411,18 +411,19 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev,/* Now enable the mux setting for each pin in the group */ for (i =0 ; i < grp->grp.npins; i++) {void __iomem *padcfg0; -u32 value; +u32 value, pmode; padcfg0 =intel_get_padcfg (pctrl, grp->grp.pins[i],PADCFG0 ); - value =readl (padcfg0); + value =readl (padcfg0); value &= ~PADCFG0_PMODE_MASK ;if (grp->modes) - value |= grp->modes[i] <<PADCFG0_PMODE_SHIFT ; + pmode = grp->modes[i];else - value |= grp->mode <<PADCFG0_PMODE_SHIFT ; + pmode = grp->mode; + value |= pmode <<PADCFG0_PMODE_SHIFT ;writel (value, padcfg0); }
Signature · 1 line
2.17.1
Mika Westerberg
maintainerRe: [PATCH v1 1/4] pinctrl: intel: optimize set_mux hook
Quoted 7 lines · Raag Jadav
Utilize a temporary variable for common shift operation inside ->set_mux() hook and save a few bytes.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-3 (-3)
Function old new delta intel_pinmux_set_mux 245 242 -3Total: Before=10472, After=10469, chg -0.03%
Shouldn't the compiler be able to optimize this if you ask with the -Ox options?
I don't really see much benefit for "optimizations" like this. That said using temporary variable here improves readability so this one is acceptable by me. As long as you change the commit message accordingly.
Quoted 35 lines
Signed-off-by Raag Jadav <[email protected]>--- drivers/pinctrl/intel/pinctrl-intel.c | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-)drivers/pinctrl/intel/pinctrl-intel.c +5
-4@@ -411,18 +411,19 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev,/* Now enable the mux setting for each pin in the group */ for (i =0 ; i < grp->grp.npins; i++) {void __iomem *padcfg0; -u32 value; +u32 value, pmode; padcfg0 =intel_get_padcfg (pctrl, grp->grp.pins[i],PADCFG0 ); - value =readl (padcfg0); + value =readl (padcfg0); value &= ~PADCFG0_PMODE_MASK ;if (grp->modes) - value |= grp->modes[i] <<PADCFG0_PMODE_SHIFT ; + pmode = grp->modes[i];else - value |= grp->mode <<PADCFG0_PMODE_SHIFT ; + pmode = grp->mode; + value |= pmode <<PADCFG0_PMODE_SHIFT ;writel (value, padcfg0); }Signature · 1 line
2.17.1
RE: [PATCH v1 1/4] pinctrl: intel: optimize set_mux hook
Quoted 11 lines · Raag Jadav
Quoted 7 lines
Utilize a temporary variable for common shift operation inside ->set_mux() hook and save a few bytes.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-3 (-3)
Function old new delta intel_pinmux_set_mux 245 242 -3Total: Before=10472, After=10469, chg -0.03%
Shouldn't the compiler be able to optimize this if you ask with the -Ox options?
Forgot to add. This is with default -O2.
Is it a good idea to mention it?
Quoted 3 lines
I don't really see much benefit for "optimizations" like this. That said using temporary variable here improves readability so this one is acceptable by me. As long as you change the commit message accordingly.
Mika Westerberg
maintainerRe: [PATCH v1 1/4] pinctrl: intel: optimize set_mux hook
Quoted 9 lines · Raag
Quoted 9 lines · Raag Jadav
Quoted 7 lines
Utilize a temporary variable for common shift operation inside ->set_mux() hook and save a few bytes.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-3 (-3)
Function old new delta intel_pinmux_set_mux 245 242 -3Total: Before=10472, After=10469, chg -0.03%
Quoted 5 lines
Quoted 2 lines
Shouldn't the compiler be able to optimize this if you ask with the -Ox options?
Forgot to add. This is with default -O2.
Is it a good idea to mention it?
Yes, I think it is.
PATCH 2/4 pinctrl: intel: optimize irq_set_type hook
In reply to Raag JadavUtilize a temporary variable for common shift operation inside ->irq_set_type() hook and save a few bytes. While at it, simplify if-else-if chain.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-16 (-16)
Function old new delta intel_gpio_irq_type 317 301 -16
Total: Before=10469, After=10453, chg -0.15%
--- drivers/pinctrl/intel/pinctrl-intel.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-)
drivers/pinctrl/intel/pinctrl-intel.c +10 -9
@@ -1128,8 +1128,8 @@ static int intel_gpio_irq_type(struct irq_data *d, unsigned int type)struct intel_pinctrl *pctrl =gpiochip_get_data (gc);unsigned int pin =intel_gpio_to_pin (pctrl,irqd_to_hwirq (d),NULL ,NULL );unsigned long flags; +u32 value, rxevcfg;void __iomem *reg; -u32 value; reg =intel_get_padcfg (pctrl, pin,PADCFG0 );if (!reg)
@@ -1150,23 +1150,24 @@ static int intel_gpio_irq_type(struct irq_data *d, unsigned int type)intel_gpio_set_gpio_mode (reg); value =readl (reg); - value &= ~(PADCFG0_RXEVCFG_MASK |PADCFG0_RXINV );if ((type &IRQ_TYPE_EDGE_BOTH ) ==IRQ_TYPE_EDGE_BOTH ) { - value |=PADCFG0_RXEVCFG_EDGE_BOTH <<PADCFG0_RXEVCFG_SHIFT ; + rxevcfg =PADCFG0_RXEVCFG_EDGE_BOTH ; }else if (type &IRQ_TYPE_EDGE_FALLING ) { - value |=PADCFG0_RXEVCFG_EDGE <<PADCFG0_RXEVCFG_SHIFT ; - value |=PADCFG0_RXINV ; + rxevcfg =PADCFG0_RXEVCFG_EDGE ; }else if (type &IRQ_TYPE_EDGE_RISING ) { - value |=PADCFG0_RXEVCFG_EDGE <<PADCFG0_RXEVCFG_SHIFT ; + rxevcfg =PADCFG0_RXEVCFG_EDGE ; }else if (type &IRQ_TYPE_LEVEL_MASK ) { -if (type &IRQ_TYPE_LEVEL_LOW ) - value |=PADCFG0_RXINV ; + rxevcfg =PADCFG0_RXEVCFG_LEVEL ; }else { - value |=PADCFG0_RXEVCFG_DISABLED <<PADCFG0_RXEVCFG_SHIFT ; + rxevcfg =PADCFG0_RXEVCFG_DISABLED ; } +if (type ==IRQ_TYPE_EDGE_FALLING || type ==IRQ_TYPE_LEVEL_LOW ) + value |=PADCFG0_RXINV ; + + value |= rxevcfg <<PADCFG0_RXEVCFG_SHIFT ;writel (value, reg);if (type &IRQ_TYPE_EDGE_BOTH )
Signature · 1 line
2.17.1
PATCH 3/4 pinctrl: intel: simplify exit path of set_mux hook
In reply to Raag JadavSimplify exit path of ->set_mux() hook and save a few bytes.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-22 (-22)
Function old new delta intel_pinmux_set_mux 242 220 -22
Total: Before=10453, After=10431, chg -0.21%
--- drivers/pinctrl/intel/pinctrl-intel.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)
drivers/pinctrl/intel/pinctrl-intel.c +8 -4
@@ -393,7 +393,10 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev,struct intel_pinctrl *pctrl =pinctrl_dev_get_drvdata (pctldev);const struct intel_pingroup *grp = &pctrl->soc->groups[group];unsigned long flags; -int i; +int i, ret; + +/* In case we never really enter any of the below loops */ + ret =0 ;raw_spin_lock_irqsave (&pctrl->lock, flags);
@@ -403,8 +406,8 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev,*/ for (i =0 ; i < grp->grp.npins; i++) {if (!intel_pad_usable (pctrl, grp->grp.pins[i])) { -raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return -EBUSY ; + ret = -EBUSY ; + goto out_unlock; } }
@@ -427,9 +430,10 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev,writel (value, padcfg0); } +out_unlock:raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return 0 ; +return ret; }static void __intel_gpio_set_direction (void __iomem *padcfg0,bool input)
Signature · 1 line
2.17.1
Mika Westerberg
maintainerRe: [PATCH v1 3/4] pinctrl: intel: simplify exit path of set_mux hook
Quoted 17 lines · Raag Jadav
Simplify exit path of ->set_mux() hook and save a few bytes.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-22 (-22)
Function old new delta intel_pinmux_set_mux 242 220 -22Total: Before=10453, After=10431, chg -0.21%
Signed-off-by Raag Jadav <[email protected]>--- drivers/pinctrl/intel/pinctrl-intel.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-)drivers/pinctrl/intel/pinctrl-intel.c +0
-0
drivers/pinctrl/intel/pinctrl-intel.c static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev, · line 399
Quoted 8 lines
drivers/pinctrl/intel/pinctrl-intel.c +4
-1@@ -393,7 +393,10 @@ static int intel_pinmux_set_mux(struct pinctrl_dev *pctldev,struct intel_pinctrl *pctrl =pinctrl_dev_get_drvdata (pctldev);const struct intel_pingroup *grp = &pctrl->soc->groups[group];unsigned long flags; -int i; +int i, ret; + +/* In case we never really enter any of the below loops */ + ret =0 ;
How can that happen?
PATCH 4/4 pinctrl: intel: simplify exit path of gpio_request_enable hook
In reply to Raag JadavSimplify exit path of ->gpio_request_enable() hook and save a few bytes.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-36 (-36)
Function old new delta intel_gpio_request_enable 186 150 -36
Total: Before=10431, After=10395, chg -0.35%
--- drivers/pinctrl/intel/pinctrl-intel.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)
drivers/pinctrl/intel/pinctrl-intel.c +12 -11
@@ -489,20 +489,22 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,struct intel_pinctrl *pctrl =pinctrl_dev_get_drvdata (pctldev);void __iomem *padcfg0;unsigned long flags; +int ret; padcfg0 =intel_get_padcfg (pctrl, pin,PADCFG0 ); +/* For positive cases */ + ret =0 ; +raw_spin_lock_irqsave (&pctrl->lock, flags);if (!intel_pad_owned_by_host (pctrl, pin)) { -raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return -EBUSY ; + ret = -EBUSY ; + goto out_unlock; } -if (!intel_pad_is_unlocked (pctrl, pin)) { -raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return 0 ; - } +if (!intel_pad_is_unlocked (pctrl, pin)) + goto out_unlock;/* * If pin is already configured in GPIO mode, we assume that
@@ -510,16 +512,15 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,* potential glitches on the pin. Otherwise, for the pin in * alternative mode, consumer has to supply respective flags. */ -if (intel_gpio_get_gpio_mode (padcfg0) ==PADCFG0_PMODE_GPIO ) { -raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return 0 ; - } +if (intel_gpio_get_gpio_mode (padcfg0) ==PADCFG0_PMODE_GPIO ) + goto out_unlock;intel_gpio_set_gpio_mode (padcfg0); +out_unlock:raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return 0 ; +return ret; } static int intel_gpio_set_direction(struct pinctrl_dev *pctldev,
Signature · 1 line
2.17.1
Mika Westerberg
maintainerRe: [PATCH v1 4/4] pinctrl: intel: simplify exit path of gpio_request_enable hook
Quoted 18 lines · Raag Jadav
Simplify exit path of ->gpio_request_enable() hook and save a few bytes.
add/remove: 0/0 grow/shrink: 0/1 up/down: 0/-36 (-36)
Function old new delta intel_gpio_request_enable 186 150 -36Total: Before=10431, After=10395, chg -0.35%
Signed-off-by Raag Jadav <[email protected]>--- drivers/pinctrl/intel/pinctrl-intel.c | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-)drivers/pinctrl/intel/pinctrl-intel.c +0
-0
drivers/pinctrl/intel/pinctrl-intel.c static int intel_gpio_request_enable(struct pinctrl_dev *pctldev, · line 497
Quoted 9 lines
drivers/pinctrl/intel/pinctrl-intel.c +3
-0@@ -489,20 +489,22 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,struct intel_pinctrl *pctrl =pinctrl_dev_get_drvdata (pctldev);void __iomem *padcfg0;unsigned long flags; +int ret; padcfg0 =intel_get_padcfg (pctrl, pin,PADCFG0 ); +/* For positive cases */ + ret =0 ;
You can set it
int ret = 0;
and drop the useless comment.
Quoted 42 lines
drivers/pinctrl/intel/pinctrl-intel.c +9
-11+raw_spin_lock_irqsave (&pctrl->lock, flags);if (!intel_pad_owned_by_host (pctrl, pin)) { -raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return -EBUSY ; + ret = -EBUSY ; + goto out_unlock; } -if (!intel_pad_is_unlocked (pctrl, pin)) { -raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return 0 ; - } +if (!intel_pad_is_unlocked (pctrl, pin)) + goto out_unlock;/* * If pin is already configured in GPIO mode, we assume that @@ -510,16 +512,15 @@ static int intel_gpio_request_enable(struct pinctrl_dev *pctldev,* potential glitches on the pin. Otherwise, for the pin in * alternative mode, consumer has to supply respective flags. */ -if (intel_gpio_get_gpio_mode (padcfg0) ==PADCFG0_PMODE_GPIO ) { -raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return 0 ; - } +if (intel_gpio_get_gpio_mode (padcfg0) ==PADCFG0_PMODE_GPIO ) + goto out_unlock;intel_gpio_set_gpio_mode (padcfg0); +out_unlock:raw_spin_unlock_irqrestore (&pctrl->lock, flags); -return 0 ; +return ret; } static int intel_gpio_set_direction(struct pinctrl_dev *pctldev,Signature · 1 line
2.17.1
Quoted 3 lines · Raag Jadav
This series implements minor optimizations for Intel pinctrl driver.
The numbers are as tested with gcc 7.5.0 and may vary with newer versions.
Please, follow what Mika commented on on both series and issue v2 of each of them.
Signature · 2 lines
With Best Regards, Andy Shevchenko