|
25 | 25 | #include <linux/spinlock.h>
|
26 | 26 | #include <dt-bindings/clock/r9a06g032-sysctrl.h>
|
27 | 27 |
|
| 28 | +#define R9A06G032_SYSCTRL_USB 0x00 |
| 29 | +#define R9A06G032_SYSCTRL_USB_H2MODE (1<<1) |
28 | 30 | #define R9A06G032_SYSCTRL_DMAMUX 0xA0
|
29 | 31 |
|
30 | 32 | struct r9a06g032_gate {
|
@@ -918,6 +920,29 @@ static void r9a06g032_clocks_del_clk_provider(void *data)
|
918 | 920 | of_clk_del_provider(data);
|
919 | 921 | }
|
920 | 922 |
|
| 923 | +static void __init r9a06g032_init_h2mode(struct r9a06g032_priv *clocks) |
| 924 | +{ |
| 925 | + struct device_node *usbf_np = NULL; |
| 926 | + u32 usb; |
| 927 | + |
| 928 | + while ((usbf_np = of_find_compatible_node(usbf_np, NULL, |
| 929 | + "renesas,rzn1-usbf"))) { |
| 930 | + if (of_device_is_available(usbf_np)) |
| 931 | + break; |
| 932 | + } |
| 933 | + |
| 934 | + usb = readl(clocks->reg + R9A06G032_SYSCTRL_USB); |
| 935 | + if (usbf_np) { |
| 936 | + /* 1 host and 1 device mode */ |
| 937 | + usb &= ~R9A06G032_SYSCTRL_USB_H2MODE; |
| 938 | + of_node_put(usbf_np); |
| 939 | + } else { |
| 940 | + /* 2 hosts mode */ |
| 941 | + usb |= R9A06G032_SYSCTRL_USB_H2MODE; |
| 942 | + } |
| 943 | + writel(usb, clocks->reg + R9A06G032_SYSCTRL_USB); |
| 944 | +} |
| 945 | + |
921 | 946 | static int __init r9a06g032_clocks_probe(struct platform_device *pdev)
|
922 | 947 | {
|
923 | 948 | struct device *dev = &pdev->dev;
|
@@ -947,6 +972,9 @@ static int __init r9a06g032_clocks_probe(struct platform_device *pdev)
|
947 | 972 | clocks->reg = of_iomap(np, 0);
|
948 | 973 | if (WARN_ON(!clocks->reg))
|
949 | 974 | return -ENOMEM;
|
| 975 | + |
| 976 | + r9a06g032_init_h2mode(clocks); |
| 977 | + |
950 | 978 | for (i = 0; i < ARRAY_SIZE(r9a06g032_clocks); ++i) {
|
951 | 979 | const struct r9a06g032_clkdesc *d = &r9a06g032_clocks[i];
|
952 | 980 | const char *parent_name = d->source ?
|
|
0 commit comments