Commit d617f9e9 authored by David Daney's avatar David Daney Committed by Ralf Baechle

MIPS: OCTEON: Supply OCTEON+ USB nodes in internal device trees.

This will be needed by the next patch to use said nodes for probing
via the device tree.
Signed-off-by: default avatarDavid Daney <david.daney@cavium.com>
Tested-by: default avatarAaro Koskinen <aaro.koskinen@iki.fi>
Signed-off-by: default avatarJohn Crispin <blogic@openwrt.org>
Patchwork: http://patchwork.linux-mips.org/patch/6185/
parent 23a91de4
...@@ -722,3 +722,30 @@ int __cvmx_helper_board_hardware_enable(int interface) ...@@ -722,3 +722,30 @@ int __cvmx_helper_board_hardware_enable(int interface)
} }
return 0; return 0;
} }
/**
* Get the clock type used for the USB block based on board type.
* Used by the USB code for auto configuration of clock type.
*
* Return USB clock type enumeration
*/
enum cvmx_helper_board_usb_clock_types __cvmx_helper_board_usb_get_clock_type(void)
{
switch (cvmx_sysinfo_get()->board_type) {
case CVMX_BOARD_TYPE_BBGW_REF:
case CVMX_BOARD_TYPE_LANAI2_A:
case CVMX_BOARD_TYPE_LANAI2_U:
case CVMX_BOARD_TYPE_LANAI2_G:
case CVMX_BOARD_TYPE_NIC10E_66:
case CVMX_BOARD_TYPE_UBNT_E100:
return USB_CLOCK_TYPE_CRYSTAL_12;
case CVMX_BOARD_TYPE_NIC10E:
return USB_CLOCK_TYPE_REF_12;
default:
break;
}
/* Most boards except NIC10e use a 12MHz crystal */
if (OCTEON_IS_MODEL(OCTEON_FAM_2))
return USB_CLOCK_TYPE_CRYSTAL_12;
return USB_CLOCK_TYPE_REF_48;
}
...@@ -171,6 +171,7 @@ device_initcall(octeon_ohci_device_init); ...@@ -171,6 +171,7 @@ device_initcall(octeon_ohci_device_init);
static struct of_device_id __initdata octeon_ids[] = { static struct of_device_id __initdata octeon_ids[] = {
{ .compatible = "simple-bus", }, { .compatible = "simple-bus", },
{ .compatible = "cavium,octeon-6335-uctl", }, { .compatible = "cavium,octeon-6335-uctl", },
{ .compatible = "cavium,octeon-5750-usbn", },
{ .compatible = "cavium,octeon-3860-bootbus", }, { .compatible = "cavium,octeon-3860-bootbus", },
{ .compatible = "cavium,mdio-mux", }, { .compatible = "cavium,mdio-mux", },
{ .compatible = "gpio-leds", }, { .compatible = "gpio-leds", },
...@@ -682,6 +683,37 @@ int __init octeon_prune_device_tree(void) ...@@ -682,6 +683,37 @@ int __init octeon_prune_device_tree(void)
} }
} }
/* DWC2 USB */
alias_prop = fdt_getprop(initial_boot_params, aliases,
"usbn", NULL);
if (alias_prop) {
int usbn = fdt_path_offset(initial_boot_params, alias_prop);
if (usbn >= 0 && (current_cpu_type() == CPU_CAVIUM_OCTEON2 ||
!octeon_has_feature(OCTEON_FEATURE_USB))) {
pr_debug("Deleting usbn\n");
fdt_nop_node(initial_boot_params, usbn);
fdt_nop_property(initial_boot_params, aliases, "usbn");
} else {
__be32 new_f[1];
enum cvmx_helper_board_usb_clock_types c;
c = __cvmx_helper_board_usb_get_clock_type();
switch (c) {
case USB_CLOCK_TYPE_REF_48:
new_f[0] = cpu_to_be32(48000000);
fdt_setprop_inplace(initial_boot_params, usbn,
"refclk-frequency", new_f, sizeof(new_f));
/* Fall through ...*/
case USB_CLOCK_TYPE_REF_12:
/* Missing "refclk-type" defaults to external. */
fdt_nop_property(initial_boot_params, usbn, "refclk-type");
break;
default:
break;
}
}
}
return 0; return 0;
} }
......
...@@ -550,6 +550,24 @@ ohci@16f0000000400 { ...@@ -550,6 +550,24 @@ ohci@16f0000000400 {
big-endian-regs; big-endian-regs;
}; };
}; };
usbn: usbn@1180068000000 {
compatible = "cavium,octeon-5750-usbn";
reg = <0x11800 0x68000000 0x0 0x1000>;
ranges; /* Direct mapping */
#address-cells = <2>;
#size-cells = <2>;
/* 12MHz, 24MHz and 48MHz allowed */
refclk-frequency = <12000000>;
/* Either "crystal" or "external" */
refclk-type = "crystal";
usbc@16f0010000000 {
compatible = "cavium,octeon-5750-usbc";
reg = <0x16f00 0x10000000 0x0 0x80000>;
interrupts = <0 56>;
};
};
}; };
aliases { aliases {
...@@ -566,6 +584,7 @@ aliases { ...@@ -566,6 +584,7 @@ aliases {
flash0 = &flash0; flash0 = &flash0;
cf0 = &cf0; cf0 = &cf0;
uctl = &uctl; uctl = &uctl;
usbn = &usbn;
led0 = &led0; led0 = &led0;
}; };
}; };
...@@ -36,6 +36,13 @@ ...@@ -36,6 +36,13 @@
#include <asm/octeon/cvmx-helper.h> #include <asm/octeon/cvmx-helper.h>
enum cvmx_helper_board_usb_clock_types {
USB_CLOCK_TYPE_REF_12,
USB_CLOCK_TYPE_REF_24,
USB_CLOCK_TYPE_REF_48,
USB_CLOCK_TYPE_CRYSTAL_12,
};
typedef enum { typedef enum {
set_phy_link_flags_autoneg = 0x1, set_phy_link_flags_autoneg = 0x1,
set_phy_link_flags_flow_control_dont_touch = 0x0 << 1, set_phy_link_flags_flow_control_dont_touch = 0x0 << 1,
...@@ -154,4 +161,6 @@ extern int __cvmx_helper_board_interface_probe(int interface, ...@@ -154,4 +161,6 @@ extern int __cvmx_helper_board_interface_probe(int interface,
*/ */
extern int __cvmx_helper_board_hardware_enable(int interface); extern int __cvmx_helper_board_hardware_enable(int interface);
enum cvmx_helper_board_usb_clock_types __cvmx_helper_board_usb_get_clock_type(void);
#endif /* __CVMX_HELPER_BOARD_H__ */ #endif /* __CVMX_HELPER_BOARD_H__ */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment