FAILED: patch "[PATCH] pinctrl: ingenic: Fix JZ4760 support" failed to apply to 5.4-stable tree
Subsystems (4)
[email protected]
maintainerThe patch below does not apply to the 5.4-stable tree.
If someone wants it applied there, or to any other stable or longterm tree, then please email the backport, including the original git commit id to <[email protected]>.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 9a85c09a3f507b925d75cb0c7c8f364467038052 Mon Sep 17 00:00:00 2001
From: Paul Cercueil <[email protected]>
Date: Fri, 11 Dec 2020 23:28:09 +0000
Subject: [PATCH] pinctrl: ingenic: Fix JZ4760 support
- JZ4760 and JZ4760B have a similar register layout as the JZ4740, and don't use the new register layout, which was introduced with the JZ4770 SoC and not the JZ4760 or JZ4760B SoCs.
- The JZ4740 code path only expected two function modes to be configurable for each pin, and wouldn't work with more than two. Fix it for the JZ4760, which has four configurable function modes.
drivers/pinctrl/pinctrl-ingenic.c +13 -13
@@ -1688,7 +1688,7 @@ static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc,static void ingenic_gpio_set_value (struct ingenic_gpio_chip *jzgc,u8 offset,int value) { -if (jzgc->jzpc->info->version >=ID_JZ4760 ) +if (jzgc->jzpc->info->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_PAT0 , offset, !!value);else ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_DATA , offset, !!value);
@@ -1718,7 +1718,7 @@ static void irq_set_type(struct ingenic_gpio_chip *jzgc,break ; } -if (jzgc->jzpc->info->version >=ID_JZ4760 ) { +if (jzgc->jzpc->info->version >=ID_JZ4770 ) { reg1 =JZ4760_GPIO_PAT1 ; reg2 =JZ4760_GPIO_PAT0 ; }else {
@@ -1758,7 +1758,7 @@ static void ingenic_gpio_irq_enable(struct irq_data *irqd)struct ingenic_gpio_chip *jzgc =gpiochip_get_data (gc);int irq = irqd->hwirq; -if (jzgc->jzpc->info->version >=ID_JZ4760 ) +if (jzgc->jzpc->info->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_INT , irq, true);else ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_SELECT , irq, true);
@@ -1774,7 +1774,7 @@ static void ingenic_gpio_irq_disable(struct irq_data *irqd)ingenic_gpio_irq_mask (irqd); -if (jzgc->jzpc->info->version >=ID_JZ4760 ) +if (jzgc->jzpc->info->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_INT , irq, false);else ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_SELECT , irq, false);
@@ -1799,7 +1799,7 @@ static void ingenic_gpio_irq_ack(struct irq_data *irqd)irq_set_type (jzgc, irq,IRQ_TYPE_LEVEL_HIGH ); } -if (jzgc->jzpc->info->version >=ID_JZ4760 ) +if (jzgc->jzpc->info->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_FLAG , irq, false);else ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_DATA , irq, true);
@@ -1856,7 +1856,7 @@ static void ingenic_gpio_irq_handler(struct irq_desc *desc)chained_irq_enter (irq_chip, desc); -if (jzgc->jzpc->info->version >=ID_JZ4760 ) +if (jzgc->jzpc->info->version >=ID_JZ4770 ) flag =ingenic_gpio_read_reg (jzgc,JZ4760_GPIO_FLAG );else flag =ingenic_gpio_read_reg (jzgc,JZ4740_GPIO_FLAG );
@@ -1938,7 +1938,7 @@ static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)struct ingenic_pinctrl *jzpc = jzgc->jzpc;unsigned int pin = gc->base + offset; -if (jzpc->info->version >=ID_JZ4760 ) { +if (jzpc->info->version >=ID_JZ4770 ) {if (ingenic_get_pin_config (jzpc, pin,JZ4760_GPIO_INT ) ||ingenic_get_pin_config (jzpc, pin,JZ4760_GPIO_PAT1 ))return GPIO_LINE_DIRECTION_IN ;
@@ -1996,7 +1996,7 @@ static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,ingenic_shadow_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , func &0x2 );ingenic_shadow_config_pin (jzpc, pin,JZ4760_GPIO_PAT0 , func &0x1 );ingenic_shadow_config_pin_load (jzpc, pin); - }else if (jzpc->info->version >=ID_JZ4760 ) { + }else if (jzpc->info->version >=ID_JZ4770 ) {ingenic_config_pin (jzpc, pin,JZ4760_GPIO_INT , false);ingenic_config_pin (jzpc, pin,GPIO_MSK , false);ingenic_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , func &0x2 );
@@ -2004,7 +2004,7 @@ static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc, }else {ingenic_config_pin (jzpc, pin,JZ4740_GPIO_FUNC , true);ingenic_config_pin (jzpc, pin,JZ4740_GPIO_TRIG , func &0x2 ); -ingenic_config_pin (jzpc, pin,JZ4740_GPIO_SELECT , func >0 ); +ingenic_config_pin (jzpc, pin,JZ4740_GPIO_SELECT , func &0x1 ); }return 0 ;
@@ -2061,7 +2061,7 @@ static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,ingenic_shadow_config_pin (jzpc, pin,GPIO_MSK , true);ingenic_shadow_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , input);ingenic_shadow_config_pin_load (jzpc, pin); - }else if (jzpc->info->version >=ID_JZ4760 ) { + }else if (jzpc->info->version >=ID_JZ4770 ) {ingenic_config_pin (jzpc, pin,JZ4760_GPIO_INT , false);ingenic_config_pin (jzpc, pin,GPIO_MSK , true);ingenic_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , input);
@@ -2091,7 +2091,7 @@ static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,unsigned int offt = pin /PINS_PER_GPIO_CHIP ;bool pull; -if (jzpc->info->version >=ID_JZ4760 ) +if (jzpc->info->version >=ID_JZ4770 ) pull = !ingenic_get_pin_config (jzpc, pin,JZ4760_GPIO_PEN );else pull = !ingenic_get_pin_config (jzpc, pin,JZ4740_GPIO_PULL_DIS );
@@ -2141,7 +2141,7 @@ static void ingenic_set_bias(struct ingenic_pinctrl *jzpc, REG_SET(X1830_GPIO_PEH), bias << idxh); } - }else if (jzpc->info->version >=ID_JZ4760 ) { + }else if (jzpc->info->version >=ID_JZ4770 ) {ingenic_config_pin (jzpc, pin,JZ4760_GPIO_PEN , !bias); }else {ingenic_config_pin (jzpc, pin,JZ4740_GPIO_PULL_DIS , !bias);
@@ -2151,7 +2151,7 @@ static void ingenic_set_bias(struct ingenic_pinctrl *jzpc,static void ingenic_set_output_level (struct ingenic_pinctrl *jzpc,unsigned int pin,bool high) { -if (jzpc->info->version >=ID_JZ4760 ) +if (jzpc->info->version >=ID_JZ4770 )ingenic_config_pin (jzpc, pin,JZ4760_GPIO_PAT0 , high);else ingenic_config_pin (jzpc, pin,JZ4740_GPIO_DATA , high);
Paul Cercueil
maintainerPATCH 1/1 pinctrl: ingenic: Fix JZ4760 support
- JZ4760 and JZ4760B have a similar register layout as the JZ4740, and don't use the new register layout, which was introduced with the JZ4770 SoC and not the JZ4760 or JZ4760B SoCs.
- The JZ4740 code path only expected two function modes to be configurable for each pin, and wouldn't work with more than two. Fix it for the JZ4760, which has four configurable function modes.
--- drivers/pinctrl/pinctrl-ingenic.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)
drivers/pinctrl/pinctrl-ingenic.c +12 -12
@@ -1378,7 +1378,7 @@ static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc,static void ingenic_gpio_set_value (struct ingenic_gpio_chip *jzgc,u8 offset,int value) { -if (jzgc->jzpc->version >=ID_JZ4760 ) +if (jzgc->jzpc->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_PAT0 , offset, !!value);else ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_DATA , offset, !!value);
@@ -1389,7 +1389,7 @@ static void irq_set_type(struct ingenic_gpio_chip *jzgc, {u8 reg1, reg2; -if (jzgc->jzpc->version >=ID_JZ4760 ) { +if (jzgc->jzpc->version >=ID_JZ4770 ) { reg1 =JZ4760_GPIO_PAT1 ; reg2 =JZ4760_GPIO_PAT0 ; }else {
@@ -1464,7 +1464,7 @@ static void ingenic_gpio_irq_enable(struct irq_data *irqd)struct ingenic_gpio_chip *jzgc =gpiochip_get_data (gc);int irq = irqd->hwirq; -if (jzgc->jzpc->version >=ID_JZ4760 ) +if (jzgc->jzpc->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_INT , irq, true);else ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_SELECT , irq, true);
@@ -1480,7 +1480,7 @@ static void ingenic_gpio_irq_disable(struct irq_data *irqd)ingenic_gpio_irq_mask (irqd); -if (jzgc->jzpc->version >=ID_JZ4760 ) +if (jzgc->jzpc->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_INT , irq, false);else ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_SELECT , irq, false);
@@ -1505,7 +1505,7 @@ static void ingenic_gpio_irq_ack(struct irq_data *irqd)irq_set_type (jzgc, irq,IRQ_TYPE_LEVEL_HIGH ); } -if (jzgc->jzpc->version >=ID_JZ4760 ) +if (jzgc->jzpc->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_FLAG , irq, false);else ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_DATA , irq, true);
@@ -1562,7 +1562,7 @@ static void ingenic_gpio_irq_handler(struct irq_desc *desc)chained_irq_enter (irq_chip, desc); -if (jzgc->jzpc->version >=ID_JZ4760 ) +if (jzgc->jzpc->version >=ID_JZ4770 ) flag =ingenic_gpio_read_reg (jzgc,JZ4760_GPIO_FLAG );else flag =ingenic_gpio_read_reg (jzgc,JZ4740_GPIO_FLAG );
@@ -1643,7 +1643,7 @@ static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)struct ingenic_pinctrl *jzpc = jzgc->jzpc;unsigned int pin = gc->base + offset; -if (jzpc->version >=ID_JZ4760 ) +if (jzpc->version >=ID_JZ4770 )return ingenic_get_pin_config (jzpc, pin,JZ4760_GPIO_INT ) ||ingenic_get_pin_config (jzpc, pin,JZ4760_GPIO_PAT1 );
@@ -1676,7 +1676,7 @@ static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,ingenic_shadow_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , func &0x2 );ingenic_shadow_config_pin (jzpc, pin,JZ4760_GPIO_PAT0 , func &0x1 );ingenic_shadow_config_pin_load (jzpc, pin); - }else if (jzpc->version >=ID_JZ4760 ) { + }else if (jzpc->version >=ID_JZ4770 ) {ingenic_config_pin (jzpc, pin,JZ4760_GPIO_INT , false);ingenic_config_pin (jzpc, pin,GPIO_MSK , false);ingenic_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , func &0x2 );
@@ -1684,7 +1684,7 @@ static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc, }else {ingenic_config_pin (jzpc, pin,JZ4740_GPIO_FUNC , true);ingenic_config_pin (jzpc, pin,JZ4740_GPIO_TRIG , func &0x2 ); -ingenic_config_pin (jzpc, pin,JZ4740_GPIO_SELECT , func >0 ); +ingenic_config_pin (jzpc, pin,JZ4740_GPIO_SELECT , func &0x1 ); }return 0 ;
@@ -1734,7 +1734,7 @@ static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,ingenic_shadow_config_pin (jzpc, pin,GPIO_MSK , true);ingenic_shadow_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , input);ingenic_shadow_config_pin_load (jzpc, pin); - }else if (jzpc->version >=ID_JZ4760 ) { + }else if (jzpc->version >=ID_JZ4770 ) {ingenic_config_pin (jzpc, pin,JZ4760_GPIO_INT , false);ingenic_config_pin (jzpc, pin,GPIO_MSK , true);ingenic_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , input);
@@ -1764,7 +1764,7 @@ static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,unsigned int offt = pin /PINS_PER_GPIO_CHIP ;bool pull; -if (jzpc->version >=ID_JZ4760 ) +if (jzpc->version >=ID_JZ4770 ) pull = !ingenic_get_pin_config (jzpc, pin,JZ4760_GPIO_PEN );else pull = !ingenic_get_pin_config (jzpc, pin,JZ4740_GPIO_PULL_DIS );
@@ -1796,7 +1796,7 @@ static int ingenic_pinconf_get(struct pinctrl_dev *pctldev,static void ingenic_set_bias (struct ingenic_pinctrl *jzpc,unsigned int pin,bool enabled) { -if (jzpc->version >=ID_JZ4760 ) +if (jzpc->version >=ID_JZ4770 )ingenic_config_pin (jzpc, pin,JZ4760_GPIO_PEN , !enabled);else ingenic_config_pin (jzpc, pin,JZ4740_GPIO_PULL_DIS , !enabled);
Signature · 1 line
2.29.2
Paul Cercueil
maintainerRe: [BACKPORT 5.4 PATCH] pinctrl: ingenic: Fix JZ4760 support
Quoted 7 lines · Paul Cercueil
- JZ4760 and JZ4760B have a similar register layout as the JZ4740, and don't use the new register layout, which was introduced with the JZ4770 SoC and not the JZ4760 or JZ4760B SoCs.
- The JZ4740 code path only expected two function modes to be configurable for each pin, and wouldn't work with more than two. Fix it for the JZ4760, which has four configurable function modes.
Forgot to add the original commit ID: 9a85c09a3f507b925d75cb0c7c8f364467038052
Cheers,
-Paul
Quoted 134 lines
Fixes 0257595a5cf4 ("pinctrl: Ingenic: Add pinctrl driver for JZ4760 and JZ4760B.")Cc <[email protected]> # 5.3Signed-off-by Paul Cercueil <[email protected]>--- drivers/pinctrl/pinctrl-ingenic.c | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-)drivers/pinctrl/pinctrl-ingenic.c +1
-1@@ -1378,7 +1378,7 @@ static inline bool ingenic_gpio_get_value(struct ingenic_gpio_chip *jzgc, static void ingenic_gpio_set_value(struct ingenic_gpio_chip *jzgc, u8 offset, int value) { - if (jzgc->jzpc->version >= ID_JZ4760) + if (jzgc->jzpc->version >= ID_JZ4770) ingenic_gpio_set_bit(jzgc, JZ4760_GPIO_PAT0, offset, !!value); elsedrivers/pinctrl/pinctrl-ingenic.c +1
-1ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_DATA , offset, !!value);@@ -1389,7 +1389,7 @@ static void irq_set_type(struct ingenic_gpio_chip *jzgc, {u8 reg1, reg2; -if (jzgc->jzpc->version >=ID_JZ4760 ) { +if (jzgc->jzpc->version >=ID_JZ4770 ) { reg1 =JZ4760_GPIO_PAT1 ; reg2 =JZ4760_GPIO_PAT0 ;drivers/pinctrl/pinctrl-ingenic.c +1
-1}else {@@ -1464,7 +1464,7 @@ static void ingenic_gpio_irq_enable(struct irq_data *irqd)struct ingenic_gpio_chip *jzgc =gpiochip_get_data (gc);int irq = irqd->hwirq; -if (jzgc->jzpc->version >=ID_JZ4760 ) +if (jzgc->jzpc->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_INT , irq, true);else drivers/pinctrl/pinctrl-ingenic.c +1
-1ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_SELECT , irq, true);@@ -1480,7 +1480,7 @@ static void ingenic_gpio_irq_disable(struct irq_data *irqd)ingenic_gpio_irq_mask (irqd ); -if (jzgc->jzpc->version >=ID_JZ4760 ) +if (jzgc->jzpc->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_INT , irq, false);else drivers/pinctrl/pinctrl-ingenic.c +1
-1ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_SELECT , irq, false);@@ -1505,7 +1505,7 @@ static void ingenic_gpio_irq_ack(struct irq_data *irqd)irq_set_type (jzgc ,irq ,IRQ_TYPE_LEVEL_HIGH ); } -if (jzgc->jzpc->version >=ID_JZ4760 ) +if (jzgc->jzpc->version >=ID_JZ4770 )ingenic_gpio_set_bit (jzgc,JZ4760_GPIO_FLAG , irq, false);else drivers/pinctrl/pinctrl-ingenic.c +1
-1ingenic_gpio_set_bit (jzgc,JZ4740_GPIO_DATA , irq, true);@@ -1562,7 +1562,7 @@ static void ingenic_gpio_irq_handler(struct irq_desc *desc)chained_irq_enter (irq_chip ,desc ); -if (jzgc->jzpc->version >=ID_JZ4760 ) +if (jzgc->jzpc->version >=ID_JZ4770 ) flag =ingenic_gpio_read_reg (jzgc,JZ4760_GPIO_FLAG );else drivers/pinctrl/pinctrl-ingenic.c +2
-2flag =ingenic_gpio_read_reg (jzgc,JZ4740_GPIO_FLAG );@@ -1643,7 +1643,7 @@ static int ingenic_gpio_get_direction(struct gpio_chip *gc, unsigned int offset)struct ingenic_pinctrl *jzpc = jzgc->jzpc;unsigned int pin = gc->base + offset; -if (jzpc->version >=ID_JZ4760 ) +if (jzpc->version >=ID_JZ4770 )return ingenic_get_pin_config (jzpc, pin,JZ4760_GPIO_INT ) ||ingenic_get_pin_config (jzpc, pin,JZ4760_GPIO_PAT1 );@@ -1676,7 +1676,7 @@ static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc,ingenic_shadow_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , func &0x2 );ingenic_shadow_config_pin (jzpc, pin,JZ4760_GPIO_PAT0 , func &0x1 );ingenic_shadow_config_pin_load (jzpc, pin); - }else if (jzpc->version >=ID_JZ4760 ) { + }else if (jzpc->version >=ID_JZ4770 ) {ingenic_config_pin (jzpc, pin,JZ4760_GPIO_INT , false);ingenic_config_pin (jzpc, pin,GPIO_MSK , false);drivers/pinctrl/pinctrl-ingenic.c +1
-1ingenic_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , func &0x2 );@@ -1684,7 +1684,7 @@ static int ingenic_pinmux_set_pin_fn(structingenic_pinctrl *jzpc, } else {ingenic_config_pin (jzpc ,pin ,JZ4740_GPIO_FUNC ,true );ingenic_config_pin (jzpc, pin,JZ4740_GPIO_TRIG , func &0x2 ); -ingenic_config_pin (jzpc, pin,JZ4740_GPIO_SELECT , func >0 ); +ingenic_config_pin (jzpc, pin,JZ4740_GPIO_SELECT , func &0x1 ); }drivers/pinctrl/pinctrl-ingenic.c +1
-1return 0 ;@@ -1734,7 +1734,7 @@ static int ingenic_pinmux_gpio_set_direction(struct pinctrl_dev *pctldev,ingenic_shadow_config_pin (jzpc, pin, GPIO_MSK, true);ingenic_shadow_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , input);ingenic_shadow_config_pin_load (jzpc, pin); - }else if (jzpc->version >=ID_JZ4760 ) { + }else if (jzpc->version >=ID_JZ4770 ) {ingenic_config_pin (jzpc, pin,JZ4760_GPIO_INT , false);ingenic_config_pin (jzpc, pin,GPIO_MSK , true);drivers/pinctrl/pinctrl-ingenic.c +1
-1ingenic_config_pin (jzpc, pin,JZ4760_GPIO_PAT1 , input);@@ -1764,7 +1764,7 @@ static int ingenic_pinconf_get(structpinctrl_dev *pctldev, unsigned int offt = pin / PINS_PER_GPIO_CHIP;bool pull; -if (jzpc->version >=ID_JZ4760 ) +if (jzpc->version >=ID_JZ4770 ) pull = !ingenic_get_pin_config (jzpc, pin,JZ4760_GPIO_PEN );else drivers/pinctrl/pinctrl-ingenic.c +1
-1pull = !ingenic_get_pin_config (jzpc, pin,JZ4740_GPIO_PULL_DIS );@@ -1796,7 +1796,7 @@ static int ingenic_pinconf_get(struct pinctrl_dev *pctldev, static void ingenic_set_bias(struct ingenic_pinctrl *jzpc, unsigned int pin, bool enabled) { - if (jzpc->version >= ID_JZ4760) + if (jzpc->version >= ID_JZ4770) ingenic_config_pin(jzpc, pin, JZ4760_GPIO_PEN, !enabled); else
ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !enabled);
--
2.29.2
gregkh
maintainerRe: [BACKPORT 5.4 PATCH] pinctrl: ingenic: Fix JZ4760 support
Quoted 8 lines · Paul Cercueil
Le dim. 24 janv. 2021 à 13:47, Paul Cercueil <[email protected]> a écrit :
Quoted 4 lines
- JZ4760 and JZ4760B have a similar register layout as the JZ4740, and don't use the new register layout, which was introduced with the JZ4770 SoC and not the JZ4760 or JZ4760B SoCs.
Quoted 6 lines
Quoted 3 lines
- The JZ4740 code path only expected two function modes to be configurable for each pin, and wouldn't work with more than two. Fix it for the JZ4760, which has four configurable function modes.
Forgot to add the original commit ID:
9a85c09a3f507b925d75cb0c7c8f364467038052
Thanks, now queued up.
greg k-h