#define PIN_CFG_FILCLKSEL              BIT(12)
 #define PIN_CFG_IOLH_C                 BIT(13)
 #define PIN_CFG_SOFT_PS                        BIT(14)
+#define PIN_CFG_OEN                    BIT(15)
 
 #define RZG2L_MPXED_COMMON_PIN_FUNCS(group) \
                                        (PIN_CFG_IOLH_##group | \
 #define SD_CH(off, ch)         ((off) + (ch) * 4)
 #define ETH_POC(off, ch)       ((off) + (ch) * 4)
 #define QSPI                   (0x3008)
+#define ETH_MODE               (0x3018)
 
 #define PVDD_2500              2       /* I/O domain voltage 2.5V */
 #define PVDD_1800              1       /* I/O domain voltage <= 1.8V */
  * @iolh_groupb_oi: IOLH group B output impedance specific values
  * @drive_strength_ua: drive strength in uA is supported (otherwise mA is supported)
  * @func_base: base number for port function (see register PFC)
+ * @oen_max_pin: the maximum pin number supporting output enable
+ * @oen_max_port: the maximum port number supporting output enable
  */
 struct rzg2l_hwcfg {
        const struct rzg2l_register_offsets regs;
        u16 iolh_groupb_oi[4];
        bool drive_strength_ua;
        u8 func_base;
+       u8 oen_max_pin;
+       u8 oen_max_port;
 };
 
 struct rzg2l_dedicated_configs {
        return false;
 }
 
+static bool rzg2l_oen_is_supported(u32 caps, u8 pin, u8 max_pin)
+{
+       if (!(caps & PIN_CFG_OEN))
+               return false;
+
+       if (pin > max_pin)
+               return false;
+
+       return true;
+}
+
+static u8 rzg2l_pin_to_oen_bit(u32 offset, u8 pin, u8 max_port)
+{
+       if (pin)
+               pin *= 2;
+
+       if (offset / RZG2L_PINS_PER_PORT == max_port)
+               pin += 1;
+
+       return pin;
+}
+
+static u32 rzg2l_read_oen(struct rzg2l_pinctrl *pctrl, u32 caps, u32 offset, u8 pin)
+{
+       u8 max_port = pctrl->data->hwcfg->oen_max_port;
+       u8 max_pin = pctrl->data->hwcfg->oen_max_pin;
+       u8 bit;
+
+       if (!rzg2l_oen_is_supported(caps, pin, max_pin))
+               return 0;
+
+       bit = rzg2l_pin_to_oen_bit(offset, pin, max_port);
+
+       return !(readb(pctrl->base + ETH_MODE) & BIT(bit));
+}
+
+static int rzg2l_write_oen(struct rzg2l_pinctrl *pctrl, u32 caps, u32 offset, u8 pin, u8 oen)
+{
+       u8 max_port = pctrl->data->hwcfg->oen_max_port;
+       u8 max_pin = pctrl->data->hwcfg->oen_max_pin;
+       unsigned long flags;
+       u8 val, bit;
+
+       if (!rzg2l_oen_is_supported(caps, pin, max_pin))
+               return -EINVAL;
+
+       bit = rzg2l_pin_to_oen_bit(offset, pin, max_port);
+
+       spin_lock_irqsave(&pctrl->lock, flags);
+       val = readb(pctrl->base + ETH_MODE);
+       if (oen)
+               val &= ~BIT(bit);
+       else
+               val |= BIT(bit);
+       writeb(val, pctrl->base + ETH_MODE);
+       spin_unlock_irqrestore(&pctrl->lock, flags);
+
+       return 0;
+}
+
 static int rzg2l_pinctrl_pinconf_get(struct pinctrl_dev *pctldev,
                                     unsigned int _pin,
                                     unsigned long *config)
                        return -EINVAL;
                break;
 
+       case PIN_CONFIG_OUTPUT_ENABLE:
+               arg = rzg2l_read_oen(pctrl, cfg, _pin, bit);
+               if (!arg)
+                       return -EINVAL;
+               break;
+
        case PIN_CONFIG_POWER_SOURCE:
                ret = rzg2l_get_power_source(pctrl, _pin, cfg);
                if (ret < 0)
                        rzg2l_rmw_pin_config(pctrl, IEN(off), bit, IEN_MASK, !!arg);
                        break;
 
+               case PIN_CONFIG_OUTPUT_ENABLE:
+                       arg = pinconf_to_config_argument(_configs[i]);
+                       ret = rzg2l_write_oen(pctrl, cfg, _pin, bit, !!arg);
+                       if (ret)
+                               return ret;
+                       break;
+
                case PIN_CONFIG_POWER_SOURCE:
                        settings.power_source = pinconf_to_config_argument(_configs[i]);
                        break;
 static const u32 r9a08g045_gpio_configs[] = {
        RZG2L_GPIO_PORT_PACK(4, 0x20, RZG3S_MPXED_PIN_FUNCS(A)),                        /* P0  */
        RZG2L_GPIO_PORT_PACK(5, 0x30, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
-                                                               PIN_CFG_IO_VMC_ETH0)),  /* P1 */
+                                                               PIN_CFG_IO_VMC_ETH0)) |
+                                     PIN_CFG_OEN,                                      /* P1 */
        RZG2L_GPIO_PORT_PACK(4, 0x31, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
                                                                PIN_CFG_IO_VMC_ETH0)),  /* P2 */
        RZG2L_GPIO_PORT_PACK(4, 0x32, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
        RZG2L_GPIO_PORT_PACK(5, 0x21, RZG3S_MPXED_PIN_FUNCS(A)),                        /* P5  */
        RZG2L_GPIO_PORT_PACK(5, 0x22, RZG3S_MPXED_PIN_FUNCS(A)),                        /* P6  */
        RZG2L_GPIO_PORT_PACK(5, 0x34, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
-                                                               PIN_CFG_IO_VMC_ETH1)),  /* P7 */
+                                                               PIN_CFG_IO_VMC_ETH1)) |
+                                     PIN_CFG_OEN,                                      /* P7 */
        RZG2L_GPIO_PORT_PACK(5, 0x35, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
                                                                PIN_CFG_IO_VMC_ETH1)),  /* P8 */
        RZG2L_GPIO_PORT_PACK(4, 0x36, RZG2L_MPXED_ETH_PIN_FUNCS(PIN_CFG_IOLH_C |
        },
        .drive_strength_ua = true,
        .func_base = 1,
+       .oen_max_pin = 1, /* Pin 1 of P0 and P7 is the maximum OEN pin. */
+       .oen_max_port = 7, /* P7_1 is the maximum OEN port. */
 };
 
 static struct rzg2l_pinctrl_data r9a07g043_data = {