Commit d4638642 authored by Herve Codina's avatar Herve Codina Committed by Geert Uytterhoeven
Browse files

clk: renesas: r9a06g032: Handle h2mode setting based on USBF presence



The CFG_USB[H2MODE] allows to switch the USB configuration. The
configuration supported are:
  - One host and one device
or
  - Two hosts

Set CFG_USB[H2MODE] based on the USBF controller (USB device)
availability.

Signed-off-by: default avatarHerve Codina <herve.codina@bootlin.com>
Reviewed-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
Link: https://lore.kernel.org/r/20230105152257.310642-3-herve.codina@bootlin.com


Signed-off-by: default avatarGeert Uytterhoeven <geert+renesas@glider.be>
parent fbfd614a
Loading
Loading
Loading
Loading
+28 −0
Original line number Diff line number Diff line
@@ -25,6 +25,8 @@
#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 {
@@ -918,6 +920,29 @@ static void r9a06g032_clocks_del_clk_provider(void *data)
	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;
@@ -947,6 +972,9 @@ static int __init r9a06g032_clocks_probe(struct platform_device *pdev)
	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 ?