12 #include <linux/i2c.h>
15 #include <linux/module.h>
16 #include <linux/slab.h>
29 static int __init octeon_cf_device_init(
void)
32 unsigned long base_ptr, region_base, region_size;
47 base_ptr = 0x1d000800;
54 for (i = 0; i < 8; i++) {
56 region_base = mio_boot_reg_cfg.s.base << 16;
57 region_size = (mio_boot_reg_cfg.s.size + 1) << 16;
58 if (mio_boot_reg_cfg.s.en && base_ptr >= region_base
59 && base_ptr < region_base + region_size)
69 memset(cf_resources, 0,
sizeof(cf_resources));
73 cf_resources[
num_resources].end = region_base + region_size - 1;
77 if (!(base_ptr & 0xfffful)) {
85 mio_boot_reg_cfg.u64 =
87 region_base = mio_boot_reg_cfg.s.base << 16;
88 region_size = (mio_boot_reg_cfg.s.size + 1) << 16;
89 if (!mio_boot_reg_cfg.s.en)
94 cf_resources[
num_resources].end = region_base + region_size - 1;
130 static int __init octeon_rng_device_init(
void)
142 .start = cvmx_build_io_address(8, 0),
143 .end = cvmx_build_io_address(8, 0) + 0x7
173 static int __init octeon_ehci_device_init(
void)
199 usb_resources[0].
start = 0x00016F0000000000ULL;
200 usb_resources[0].
end = usb_resources[0].
start + 0x100;
222 static int __init octeon_ohci_device_init(
void)
248 usb_resources[0].
start = 0x00016F0000000400ULL;
249 usb_resources[0].
end = usb_resources[0].
start + 0x100;
274 { .compatible =
"simple-bus", },
275 { .compatible =
"cavium,octeon-6335-uctl", },
276 { .compatible =
"cavium,octeon-3860-bootbus", },
277 { .compatible =
"cavium,mdio-mux", },
278 { .compatible =
"gpio-leds", },
282 static bool __init octeon_has_88e1145(
void)
289 static void __init octeon_fdt_set_phy(
int eth,
int phy_addr)
292 const __be32 *alt_phy_handle;
309 if (alt_phy_handle) {
316 if (phy_addr < 0 || phy < 0) {
328 if (phy_addr >= 256 && alt_phy > 0) {
335 phy_handle_name = phy_prop->
nameoff;
339 alt_prop->
nameoff = phy_handle_name;
345 if (octeon_has_88e1145()) {
347 memset(new_name, 0,
sizeof(new_name));
348 strcpy(new_name,
"marvell,88e1145");
351 if (p && current_len >=
strlen(new_name))
353 "compatible", new_name, current_len);
362 snprintf(new_name,
sizeof(new_name),
"ethernet-phy@%x", phy_addr);
365 if (p && current_len ==
strlen(new_name))
368 pr_err(
"Error: could not rename ethernet phy: <%s>", p);
371 static void __init octeon_fdt_set_mac_addr(
int n,
u64 *pmac)
377 new_mac[0] = (mac >> 40) & 0xff;
378 new_mac[1] = (mac >> 32) & 0xff;
379 new_mac[2] = (mac >> 24) & 0xff;
380 new_mac[3] = (mac >> 16) & 0xff;
381 new_mac[4] = (mac >> 8) & 0xff;
382 new_mac[5] = mac & 0xff;
385 new_mac,
sizeof(new_mac));
388 pr_err(
"Setting \"local-mac-address\" failed %d", r);
394 static void __init octeon_fdt_rm_ethernet(
int node)
408 static void __init octeon_fdt_pip_port(
int iface,
int i,
int p,
int max,
u64 *pmac)
410 char name_buffer[20];
415 snprintf(name_buffer,
sizeof(name_buffer),
"ethernet@%x", p);
420 pr_debug(
"Deleting port %x:%x\n", i, p);
421 octeon_fdt_rm_ethernet(eth);
425 ipd_port = (0x100 *
i) + (0x10 * p) + 0x800;
427 ipd_port = 16 * i +
p;
430 octeon_fdt_set_phy(eth, phy_addr);
431 octeon_fdt_set_mac_addr(eth, pmac);
434 static void __init octeon_fdt_pip_iface(
int pip,
int idx,
u64 *pmac)
436 char name_buffer[20];
443 snprintf(name_buffer,
sizeof(name_buffer),
"interface@%d", idx);
448 for (p = 0; p < 16; p++)
449 octeon_fdt_pip_port(iface, idx, p, count - 1, pmac);
454 int i, max_port, uart_mask;
455 const char *pip_path;
457 char name_buffer[20];
462 panic(
"Corrupt Device Tree.");
466 pr_err(
"Error: No /aliases node in device tree.");
489 for (i = 0; i < 2; i++) {
491 snprintf(name_buffer,
sizeof(name_buffer),
501 octeon_fdt_rm_ethernet(mgmt);
506 octeon_fdt_set_phy(mgmt, phy_addr);
507 octeon_fdt_set_mac_addr(mgmt, &mac_addr_base);
516 for (i = 0; i <= 4; i++)
517 octeon_fdt_pip_iface(pip, i, &mac_addr_base);
529 for (i = 0; i < 2; i++) {
531 snprintf(name_buffer,
sizeof(name_buffer),
559 for (i = 0; i < 2; i++) {
561 snprintf(name_buffer,
sizeof(name_buffer),
586 for (i = 0; i < 3; i++) {
588 snprintf(name_buffer,
sizeof(name_buffer),
595 if (uart_mask & (1 << i))
609 unsigned long base_ptr, region_base, region_size;
610 unsigned long region1_base = 0;
611 unsigned long region1_size = 0;
613 bool is_16bit =
false;
614 bool is_true_ide =
false;
626 base_ptr = 0x1d000800;
633 for (cs = 0; cs < 8; cs++) {
635 region_base = mio_boot_reg_cfg.
s.base << 16;
636 region_size = (mio_boot_reg_cfg.
s.size + 1) << 16;
637 if (mio_boot_reg_cfg.
s.en && base_ptr >= region_base
638 && base_ptr < region_base + region_size) {
639 is_16bit = mio_boot_reg_cfg.
s.width;
648 if (!(base_ptr & 0xfffful)) {
656 mio_boot_reg_cfg.
u64 =
658 region1_base = mio_boot_reg_cfg.
s.base << 16;
659 region1_size = (mio_boot_reg_cfg.
s.size + 1) << 16;
660 if (!mio_boot_reg_cfg.
s.en)
670 "cavium,bus-width", &width,
sizeof(width));
680 "reg", new_reg,
sizeof(new_reg));
686 if (!ranges || len < (5 * 8 *
sizeof(
__be32)))
689 ranges[(cs * 5) + 2] =
cpu_to_be32(region_base >> 32);
690 ranges[(cs * 5) + 3] =
cpu_to_be32(region_base & 0xffffffff);
694 ranges[(cs * 5) + 2] =
cpu_to_be32(region1_base >> 32);
695 ranges[(cs * 5) + 3] =
cpu_to_be32(region1_base & 0xffffffff);
711 unsigned long base_ptr, region_base, region_size;
722 for (cs = 0; cs < 8; cs++) {
724 region_base = mio_boot_reg_cfg.
s.base << 16;
725 region_size = (mio_boot_reg_cfg.
s.size + 1) << 16;
726 if (mio_boot_reg_cfg.
s.en && base_ptr >= region_base
727 && base_ptr < region_base + region_size)
741 "reg", new_reg,
sizeof(new_reg));
747 if (!ranges || len < (5 * 8 *
sizeof(
__be32)))
750 ranges[(cs * 5) + 2] =
cpu_to_be32(region_base >> 32);
751 ranges[(cs * 5) + 3] =
cpu_to_be32(region_base & 0xffffffff);
782 static int __init octeon_publish_devices(
void)
784 return of_platform_bus_probe(
NULL, octeon_ids,
NULL);