#include <linux/spinlock.h>
 #include <dt-bindings/clock/r9a06g032-sysctrl.h>
 
+#define R9A06G032_SYSCTRL_USB    0x00
+#define R9A06G032_SYSCTRL_USB_H2MODE  (1<<1)
 #define R9A06G032_SYSCTRL_DMAMUX 0xA0
 
 struct r9a06g032_gate {
        of_clk_del_provider(data);
 }
 
+static void __init r9a06g032_init_h2mode(struct r9a06g032_priv *clocks)
+{
+       struct device_node *usbf_np = NULL;
+       u32 usb;
+
+       while ((usbf_np = of_find_compatible_node(usbf_np, NULL,
+                                                 "renesas,rzn1-usbf"))) {
+               if (of_device_is_available(usbf_np))
+                       break;
+       }
+
+       usb = readl(clocks->reg + R9A06G032_SYSCTRL_USB);
+       if (usbf_np) {
+               /* 1 host and 1 device mode */
+               usb &= ~R9A06G032_SYSCTRL_USB_H2MODE;
+               of_node_put(usbf_np);
+       } else {
+               /* 2 hosts mode */
+               usb |= R9A06G032_SYSCTRL_USB_H2MODE;
+       }
+       writel(usb, clocks->reg + R9A06G032_SYSCTRL_USB);
+}
+
 static int __init r9a06g032_clocks_probe(struct platform_device *pdev)
 {
        struct device *dev = &pdev->dev;
        clocks->reg = of_iomap(np, 0);
        if (WARN_ON(!clocks->reg))
                return -ENOMEM;
+
+       r9a06g032_init_h2mode(clocks);
+
        for (i = 0; i < ARRAY_SIZE(r9a06g032_clocks); ++i) {
                const struct r9a06g032_clkdesc *d = &r9a06g032_clocks[i];
                const char *parent_name = d->source ?