162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Renesas USB driver RZ/A initialization and power control 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2018 Chris Brandt 662306a36Sopenharmony_ci * Copyright (C) 2018-2019 Renesas Electronics Corporation 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include <linux/delay.h> 1062306a36Sopenharmony_ci#include <linux/io.h> 1162306a36Sopenharmony_ci#include <linux/of.h> 1262306a36Sopenharmony_ci#include "common.h" 1362306a36Sopenharmony_ci#include "rza.h" 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic int usbhs_rza1_hardware_init(struct platform_device *pdev) 1662306a36Sopenharmony_ci{ 1762306a36Sopenharmony_ci struct usbhs_priv *priv = usbhs_pdev_to_priv(pdev); 1862306a36Sopenharmony_ci struct device_node *usb_x1_clk, *extal_clk; 1962306a36Sopenharmony_ci u32 freq_usb = 0, freq_extal = 0; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci /* Input Clock Selection (NOTE: ch0 controls both ch0 and ch1) */ 2262306a36Sopenharmony_ci usb_x1_clk = of_find_node_by_name(NULL, "usb_x1"); 2362306a36Sopenharmony_ci extal_clk = of_find_node_by_name(NULL, "extal"); 2462306a36Sopenharmony_ci of_property_read_u32(usb_x1_clk, "clock-frequency", &freq_usb); 2562306a36Sopenharmony_ci of_property_read_u32(extal_clk, "clock-frequency", &freq_extal); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci of_node_put(usb_x1_clk); 2862306a36Sopenharmony_ci of_node_put(extal_clk); 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci if (freq_usb == 0) { 3162306a36Sopenharmony_ci if (freq_extal == 12000000) { 3262306a36Sopenharmony_ci /* Select 12MHz XTAL */ 3362306a36Sopenharmony_ci usbhs_bset(priv, SYSCFG, UCKSEL, UCKSEL); 3462306a36Sopenharmony_ci } else { 3562306a36Sopenharmony_ci dev_err(usbhs_priv_to_dev(priv), "A 48MHz USB clock or 12MHz main clock is required.\n"); 3662306a36Sopenharmony_ci return -EIO; 3762306a36Sopenharmony_ci } 3862306a36Sopenharmony_ci } 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci /* Enable USB PLL (NOTE: ch0 controls both ch0 and ch1) */ 4162306a36Sopenharmony_ci usbhs_bset(priv, SYSCFG, UPLLE, UPLLE); 4262306a36Sopenharmony_ci usleep_range(1000, 2000); 4362306a36Sopenharmony_ci usbhs_bset(priv, SUSPMODE, SUSPM, SUSPM); 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci return 0; 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ciconst struct renesas_usbhs_platform_info usbhs_rza1_plat_info = { 4962306a36Sopenharmony_ci .platform_callback = { 5062306a36Sopenharmony_ci .hardware_init = usbhs_rza1_hardware_init, 5162306a36Sopenharmony_ci .get_id = usbhs_get_id_as_gadget, 5262306a36Sopenharmony_ci }, 5362306a36Sopenharmony_ci .driver_param = { 5462306a36Sopenharmony_ci .has_new_pipe_configs = 1, 5562306a36Sopenharmony_ci }, 5662306a36Sopenharmony_ci}; 57