linux/arch/mips/bcm63xx/boards/board_bcm963xx.c
<<
>>
Prefs
   1/*
   2 * This file is subject to the terms and conditions of the GNU General Public
   3 * License.  See the file "COPYING" in the main directory of this archive
   4 * for more details.
   5 *
   6 * Copyright (C) 2008 Maxime Bizon <mbizon@freebox.fr>
   7 * Copyright (C) 2008 Florian Fainelli <florian@openwrt.org>
   8 */
   9
  10#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  11
  12#include <linux/init.h>
  13#include <linux/kernel.h>
  14#include <linux/string.h>
  15#include <linux/platform_device.h>
  16#include <linux/ssb/ssb.h>
  17#include <asm/addrspace.h>
  18#include <bcm63xx_board.h>
  19#include <bcm63xx_cpu.h>
  20#include <bcm63xx_dev_uart.h>
  21#include <bcm63xx_regs.h>
  22#include <bcm63xx_io.h>
  23#include <bcm63xx_nvram.h>
  24#include <bcm63xx_dev_pci.h>
  25#include <bcm63xx_dev_enet.h>
  26#include <bcm63xx_dev_flash.h>
  27#include <bcm63xx_dev_hsspi.h>
  28#include <bcm63xx_dev_pcmcia.h>
  29#include <bcm63xx_dev_spi.h>
  30#include <bcm63xx_dev_usb_usbd.h>
  31#include <board_bcm963xx.h>
  32
  33#include <uapi/linux/bcm933xx_hcs.h>
  34
  35
  36#define HCS_OFFSET_128K                 0x20000
  37
  38static struct board_info board;
  39
  40/*
  41 * known 3368 boards
  42 */
  43#ifdef CONFIG_BCM63XX_CPU_3368
  44static struct board_info __initdata board_cvg834g = {
  45        .name                           = "CVG834G_E15R3921",
  46        .expected_cpu_id                = 0x3368,
  47
  48        .has_uart0                      = 1,
  49        .has_uart1                      = 1,
  50
  51        .has_enet0                      = 1,
  52        .has_pci                        = 1,
  53
  54        .enet0 = {
  55                .has_phy                = 1,
  56                .use_internal_phy       = 1,
  57        },
  58
  59        .leds = {
  60                {
  61                        .name           = "CVG834G:green:power",
  62                        .gpio           = 37,
  63                        .default_trigger= "default-on",
  64                },
  65        },
  66
  67        .ephy_reset_gpio                = 36,
  68        .ephy_reset_gpio_flags          = GPIOF_INIT_HIGH,
  69};
  70#endif
  71
  72/*
  73 * known 6328 boards
  74 */
  75#ifdef CONFIG_BCM63XX_CPU_6328
  76static struct board_info __initdata board_96328avng = {
  77        .name                           = "96328avng",
  78        .expected_cpu_id                = 0x6328,
  79
  80        .has_uart0                      = 1,
  81        .has_pci                        = 1,
  82        .has_usbd                       = 0,
  83
  84        .usbd = {
  85                .use_fullspeed          = 0,
  86                .port_no                = 0,
  87        },
  88
  89        .leds = {
  90                {
  91                        .name           = "96328avng::ppp-fail",
  92                        .gpio           = 2,
  93                        .active_low     = 1,
  94                },
  95                {
  96                        .name           = "96328avng::power",
  97                        .gpio           = 4,
  98                        .active_low     = 1,
  99                        .default_trigger = "default-on",
 100                },
 101                {
 102                        .name           = "96328avng::power-fail",
 103                        .gpio           = 8,
 104                        .active_low     = 1,
 105                },
 106                {
 107                        .name           = "96328avng::wps",
 108                        .gpio           = 9,
 109                        .active_low     = 1,
 110                },
 111                {
 112                        .name           = "96328avng::ppp",
 113                        .gpio           = 11,
 114                        .active_low     = 1,
 115                },
 116        },
 117};
 118#endif
 119
 120/*
 121 * known 6338 boards
 122 */
 123#ifdef CONFIG_BCM63XX_CPU_6338
 124static struct board_info __initdata board_96338gw = {
 125        .name                           = "96338GW",
 126        .expected_cpu_id                = 0x6338,
 127
 128        .has_uart0                      = 1,
 129        .has_enet0                      = 1,
 130        .enet0 = {
 131                .force_speed_100        = 1,
 132                .force_duplex_full      = 1,
 133        },
 134
 135        .has_ohci0                      = 1,
 136
 137        .leds = {
 138                {
 139                        .name           = "adsl",
 140                        .gpio           = 3,
 141                        .active_low     = 1,
 142                },
 143                {
 144                        .name           = "ses",
 145                        .gpio           = 5,
 146                        .active_low     = 1,
 147                },
 148                {
 149                        .name           = "ppp-fail",
 150                        .gpio           = 4,
 151                        .active_low     = 1,
 152                },
 153                {
 154                        .name           = "power",
 155                        .gpio           = 0,
 156                        .active_low     = 1,
 157                        .default_trigger = "default-on",
 158                },
 159                {
 160                        .name           = "stop",
 161                        .gpio           = 1,
 162                        .active_low     = 1,
 163                }
 164        },
 165};
 166
 167static struct board_info __initdata board_96338w = {
 168        .name                           = "96338W",
 169        .expected_cpu_id                = 0x6338,
 170
 171        .has_uart0                      = 1,
 172        .has_enet0                      = 1,
 173        .enet0 = {
 174                .force_speed_100        = 1,
 175                .force_duplex_full      = 1,
 176        },
 177
 178        .leds = {
 179                {
 180                        .name           = "adsl",
 181                        .gpio           = 3,
 182                        .active_low     = 1,
 183                },
 184                {
 185                        .name           = "ses",
 186                        .gpio           = 5,
 187                        .active_low     = 1,
 188                },
 189                {
 190                        .name           = "ppp-fail",
 191                        .gpio           = 4,
 192                        .active_low     = 1,
 193                },
 194                {
 195                        .name           = "power",
 196                        .gpio           = 0,
 197                        .active_low     = 1,
 198                        .default_trigger = "default-on",
 199                },
 200                {
 201                        .name           = "stop",
 202                        .gpio           = 1,
 203                        .active_low     = 1,
 204                },
 205        },
 206};
 207#endif
 208
 209/*
 210 * known 6345 boards
 211 */
 212#ifdef CONFIG_BCM63XX_CPU_6345
 213static struct board_info __initdata board_96345gw2 = {
 214        .name                           = "96345GW2",
 215        .expected_cpu_id                = 0x6345,
 216
 217        .has_uart0                      = 1,
 218};
 219#endif
 220
 221/*
 222 * known 6348 boards
 223 */
 224#ifdef CONFIG_BCM63XX_CPU_6348
 225static struct board_info __initdata board_96348r = {
 226        .name                           = "96348R",
 227        .expected_cpu_id                = 0x6348,
 228
 229        .has_uart0                      = 1,
 230        .has_enet0                      = 1,
 231        .has_pci                        = 1,
 232
 233        .enet0 = {
 234                .has_phy                = 1,
 235                .use_internal_phy       = 1,
 236        },
 237
 238        .leds = {
 239                {
 240                        .name           = "adsl-fail",
 241                        .gpio           = 2,
 242                        .active_low     = 1,
 243                },
 244                {
 245                        .name           = "ppp",
 246                        .gpio           = 3,
 247                        .active_low     = 1,
 248                },
 249                {
 250                        .name           = "ppp-fail",
 251                        .gpio           = 4,
 252                        .active_low     = 1,
 253                },
 254                {
 255                        .name           = "power",
 256                        .gpio           = 0,
 257                        .active_low     = 1,
 258                        .default_trigger = "default-on",
 259
 260                },
 261                {
 262                        .name           = "stop",
 263                        .gpio           = 1,
 264                        .active_low     = 1,
 265                },
 266        },
 267};
 268
 269static struct board_info __initdata board_96348gw_10 = {
 270        .name                           = "96348GW-10",
 271        .expected_cpu_id                = 0x6348,
 272
 273        .has_uart0                      = 1,
 274        .has_enet0                      = 1,
 275        .has_enet1                      = 1,
 276        .has_pci                        = 1,
 277
 278        .enet0 = {
 279                .has_phy                = 1,
 280                .use_internal_phy       = 1,
 281        },
 282        .enet1 = {
 283                .force_speed_100        = 1,
 284                .force_duplex_full      = 1,
 285        },
 286
 287        .has_ohci0                      = 1,
 288        .has_pccard                     = 1,
 289        .has_ehci0                      = 1,
 290
 291        .leds = {
 292                {
 293                        .name           = "adsl-fail",
 294                        .gpio           = 2,
 295                        .active_low     = 1,
 296                },
 297                {
 298                        .name           = "ppp",
 299                        .gpio           = 3,
 300                        .active_low     = 1,
 301                },
 302                {
 303                        .name           = "ppp-fail",
 304                        .gpio           = 4,
 305                        .active_low     = 1,
 306                },
 307                {
 308                        .name           = "power",
 309                        .gpio           = 0,
 310                        .active_low     = 1,
 311                        .default_trigger = "default-on",
 312                },
 313                {
 314                        .name           = "stop",
 315                        .gpio           = 1,
 316                        .active_low     = 1,
 317                },
 318        },
 319};
 320
 321static struct board_info __initdata board_96348gw_11 = {
 322        .name                           = "96348GW-11",
 323        .expected_cpu_id                = 0x6348,
 324
 325        .has_uart0                      = 1,
 326        .has_enet0                      = 1,
 327        .has_enet1                      = 1,
 328        .has_pci                        = 1,
 329
 330        .enet0 = {
 331                .has_phy                = 1,
 332                .use_internal_phy       = 1,
 333        },
 334
 335        .enet1 = {
 336                .force_speed_100        = 1,
 337                .force_duplex_full      = 1,
 338        },
 339
 340
 341        .has_ohci0 = 1,
 342        .has_pccard = 1,
 343        .has_ehci0 = 1,
 344
 345        .leds = {
 346                {
 347                        .name           = "adsl-fail",
 348                        .gpio           = 2,
 349                        .active_low     = 1,
 350                },
 351                {
 352                        .name           = "ppp",
 353                        .gpio           = 3,
 354                        .active_low     = 1,
 355                },
 356                {
 357                        .name           = "ppp-fail",
 358                        .gpio           = 4,
 359                        .active_low     = 1,
 360                },
 361                {
 362                        .name           = "power",
 363                        .gpio           = 0,
 364                        .active_low     = 1,
 365                        .default_trigger = "default-on",
 366                },
 367                {
 368                        .name           = "stop",
 369                        .gpio           = 1,
 370                        .active_low     = 1,
 371                },
 372        },
 373};
 374
 375static struct board_info __initdata board_96348gw = {
 376        .name                           = "96348GW",
 377        .expected_cpu_id                = 0x6348,
 378
 379        .has_uart0                      = 1,
 380        .has_enet0                      = 1,
 381        .has_enet1                      = 1,
 382        .has_pci                        = 1,
 383
 384        .enet0 = {
 385                .has_phy                = 1,
 386                .use_internal_phy       = 1,
 387        },
 388        .enet1 = {
 389                .force_speed_100        = 1,
 390                .force_duplex_full      = 1,
 391        },
 392
 393        .has_ohci0 = 1,
 394
 395        .leds = {
 396                {
 397                        .name           = "adsl-fail",
 398                        .gpio           = 2,
 399                        .active_low     = 1,
 400                },
 401                {
 402                        .name           = "ppp",
 403                        .gpio           = 3,
 404                        .active_low     = 1,
 405                },
 406                {
 407                        .name           = "ppp-fail",
 408                        .gpio           = 4,
 409                        .active_low     = 1,
 410                },
 411                {
 412                        .name           = "power",
 413                        .gpio           = 0,
 414                        .active_low     = 1,
 415                        .default_trigger = "default-on",
 416                },
 417                {
 418                        .name           = "stop",
 419                        .gpio           = 1,
 420                        .active_low     = 1,
 421                },
 422        },
 423};
 424
 425static struct board_info __initdata board_FAST2404 = {
 426        .name                           = "F@ST2404",
 427        .expected_cpu_id                = 0x6348,
 428
 429        .has_uart0                      = 1,
 430        .has_enet0                      = 1,
 431        .has_enet1                      = 1,
 432        .has_pci                        = 1,
 433
 434        .enet0 = {
 435                .has_phy                = 1,
 436                .use_internal_phy       = 1,
 437        },
 438
 439        .enet1 = {
 440                .force_speed_100        = 1,
 441                .force_duplex_full      = 1,
 442        },
 443
 444        .has_ohci0                      = 1,
 445        .has_pccard                     = 1,
 446        .has_ehci0                      = 1,
 447};
 448
 449static struct board_info __initdata board_rta1025w_16 = {
 450        .name                           = "RTA1025W_16",
 451        .expected_cpu_id                = 0x6348,
 452
 453        .has_enet0                      = 1,
 454        .has_enet1                      = 1,
 455        .has_pci                        = 1,
 456
 457        .enet0 = {
 458                .has_phy                = 1,
 459                .use_internal_phy       = 1,
 460        },
 461        .enet1 = {
 462                .force_speed_100        = 1,
 463                .force_duplex_full      = 1,
 464        },
 465};
 466
 467
 468static struct board_info __initdata board_DV201AMR = {
 469        .name                           = "DV201AMR",
 470        .expected_cpu_id                = 0x6348,
 471
 472        .has_uart0                      = 1,
 473        .has_pci                        = 1,
 474        .has_ohci0                      = 1,
 475
 476        .has_enet0                      = 1,
 477        .has_enet1                      = 1,
 478        .enet0 = {
 479                .has_phy                = 1,
 480                .use_internal_phy       = 1,
 481        },
 482        .enet1 = {
 483                .force_speed_100        = 1,
 484                .force_duplex_full      = 1,
 485        },
 486};
 487
 488static struct board_info __initdata board_96348gw_a = {
 489        .name                           = "96348GW-A",
 490        .expected_cpu_id                = 0x6348,
 491
 492        .has_uart0                      = 1,
 493        .has_enet0                      = 1,
 494        .has_enet1                      = 1,
 495        .has_pci                        = 1,
 496
 497        .enet0 = {
 498                .has_phy                = 1,
 499                .use_internal_phy       = 1,
 500        },
 501        .enet1 = {
 502                .force_speed_100        = 1,
 503                .force_duplex_full      = 1,
 504        },
 505
 506        .has_ohci0 = 1,
 507};
 508#endif
 509
 510/*
 511 * known 6358 boards
 512 */
 513#ifdef CONFIG_BCM63XX_CPU_6358
 514static struct board_info __initdata board_96358vw = {
 515        .name                           = "96358VW",
 516        .expected_cpu_id                = 0x6358,
 517
 518        .has_uart0                      = 1,
 519        .has_enet0                      = 1,
 520        .has_enet1                      = 1,
 521        .has_pci                        = 1,
 522
 523        .enet0 = {
 524                .has_phy                = 1,
 525                .use_internal_phy       = 1,
 526        },
 527
 528        .enet1 = {
 529                .force_speed_100        = 1,
 530                .force_duplex_full      = 1,
 531        },
 532
 533
 534        .has_ohci0 = 1,
 535        .has_pccard = 1,
 536        .has_ehci0 = 1,
 537
 538        .leds = {
 539                {
 540                        .name           = "adsl-fail",
 541                        .gpio           = 15,
 542                        .active_low     = 1,
 543                },
 544                {
 545                        .name           = "ppp",
 546                        .gpio           = 22,
 547                        .active_low     = 1,
 548                },
 549                {
 550                        .name           = "ppp-fail",
 551                        .gpio           = 23,
 552                        .active_low     = 1,
 553                },
 554                {
 555                        .name           = "power",
 556                        .gpio           = 4,
 557                        .default_trigger = "default-on",
 558                },
 559                {
 560                        .name           = "stop",
 561                        .gpio           = 5,
 562                },
 563        },
 564};
 565
 566static struct board_info __initdata board_96358vw2 = {
 567        .name                           = "96358VW2",
 568        .expected_cpu_id                = 0x6358,
 569
 570        .has_uart0                      = 1,
 571        .has_enet0                      = 1,
 572        .has_enet1                      = 1,
 573        .has_pci                        = 1,
 574
 575        .enet0 = {
 576                .has_phy                = 1,
 577                .use_internal_phy       = 1,
 578        },
 579
 580        .enet1 = {
 581                .force_speed_100        = 1,
 582                .force_duplex_full      = 1,
 583        },
 584
 585
 586        .has_ohci0 = 1,
 587        .has_pccard = 1,
 588        .has_ehci0 = 1,
 589
 590        .leds = {
 591                {
 592                        .name           = "adsl",
 593                        .gpio           = 22,
 594                        .active_low     = 1,
 595                },
 596                {
 597                        .name           = "ppp-fail",
 598                        .gpio           = 23,
 599                },
 600                {
 601                        .name           = "power",
 602                        .gpio           = 5,
 603                        .active_low     = 1,
 604                        .default_trigger = "default-on",
 605                },
 606                {
 607                        .name           = "stop",
 608                        .gpio           = 4,
 609                        .active_low     = 1,
 610                },
 611        },
 612};
 613
 614static struct board_info __initdata board_AGPFS0 = {
 615        .name                           = "AGPF-S0",
 616        .expected_cpu_id                = 0x6358,
 617
 618        .has_uart0                      = 1,
 619        .has_enet0                      = 1,
 620        .has_enet1                      = 1,
 621        .has_pci                        = 1,
 622
 623        .enet0 = {
 624                .has_phy                = 1,
 625                .use_internal_phy       = 1,
 626        },
 627
 628        .enet1 = {
 629                .force_speed_100        = 1,
 630                .force_duplex_full      = 1,
 631        },
 632
 633        .has_ohci0 = 1,
 634        .has_ehci0 = 1,
 635};
 636
 637static struct board_info __initdata board_DWVS0 = {
 638        .name                           = "DWV-S0",
 639        .expected_cpu_id                = 0x6358,
 640
 641        .has_enet0                      = 1,
 642        .has_enet1                      = 1,
 643        .has_pci                        = 1,
 644
 645        .enet0 = {
 646                .has_phy                = 1,
 647                .use_internal_phy       = 1,
 648        },
 649
 650        .enet1 = {
 651                .force_speed_100        = 1,
 652                .force_duplex_full      = 1,
 653        },
 654
 655        .has_ohci0                      = 1,
 656};
 657#endif
 658
 659/*
 660 * all boards
 661 */
 662static const struct board_info __initconst *bcm963xx_boards[] = {
 663#ifdef CONFIG_BCM63XX_CPU_3368
 664        &board_cvg834g,
 665#endif
 666#ifdef CONFIG_BCM63XX_CPU_6328
 667        &board_96328avng,
 668#endif
 669#ifdef CONFIG_BCM63XX_CPU_6338
 670        &board_96338gw,
 671        &board_96338w,
 672#endif
 673#ifdef CONFIG_BCM63XX_CPU_6345
 674        &board_96345gw2,
 675#endif
 676#ifdef CONFIG_BCM63XX_CPU_6348
 677        &board_96348r,
 678        &board_96348gw,
 679        &board_96348gw_10,
 680        &board_96348gw_11,
 681        &board_FAST2404,
 682        &board_DV201AMR,
 683        &board_96348gw_a,
 684        &board_rta1025w_16,
 685#endif
 686
 687#ifdef CONFIG_BCM63XX_CPU_6358
 688        &board_96358vw,
 689        &board_96358vw2,
 690        &board_AGPFS0,
 691        &board_DWVS0,
 692#endif
 693};
 694
 695/*
 696 * Register a sane SPROMv2 to make the on-board
 697 * bcm4318 WLAN work
 698 */
 699#ifdef CONFIG_SSB_PCIHOST
 700static struct ssb_sprom bcm63xx_sprom = {
 701        .revision               = 0x02,
 702        .board_rev              = 0x17,
 703        .country_code           = 0x0,
 704        .ant_available_bg       = 0x3,
 705        .pa0b0                  = 0x15ae,
 706        .pa0b1                  = 0xfa85,
 707        .pa0b2                  = 0xfe8d,
 708        .pa1b0                  = 0xffff,
 709        .pa1b1                  = 0xffff,
 710        .pa1b2                  = 0xffff,
 711        .gpio0                  = 0xff,
 712        .gpio1                  = 0xff,
 713        .gpio2                  = 0xff,
 714        .gpio3                  = 0xff,
 715        .maxpwr_bg              = 0x004c,
 716        .itssi_bg               = 0x00,
 717        .boardflags_lo          = 0x2848,
 718        .boardflags_hi          = 0x0000,
 719};
 720
 721int bcm63xx_get_fallback_sprom(struct ssb_bus *bus, struct ssb_sprom *out)
 722{
 723        if (bus->bustype == SSB_BUSTYPE_PCI) {
 724                memcpy(out, &bcm63xx_sprom, sizeof(struct ssb_sprom));
 725                return 0;
 726        } else {
 727                pr_err("unable to fill SPROM for given bustype\n");
 728                return -EINVAL;
 729        }
 730}
 731#endif
 732
 733/*
 734 * return board name for /proc/cpuinfo
 735 */
 736const char *board_get_name(void)
 737{
 738        return board.name;
 739}
 740
 741/*
 742 * early init callback, read nvram data from flash and checksum it
 743 */
 744void __init board_prom_init(void)
 745{
 746        unsigned int i;
 747        u8 *boot_addr, *cfe;
 748        char cfe_version[32];
 749        char *board_name = NULL;
 750        u32 val;
 751        struct bcm_hcs *hcs;
 752
 753        /* read base address of boot chip select (0)
 754         * 6328/6362 do not have MPI but boot from a fixed address
 755         */
 756        if (BCMCPU_IS_6328() || BCMCPU_IS_6362()) {
 757                val = 0x18000000;
 758        } else {
 759                val = bcm_mpi_readl(MPI_CSBASE_REG(0));
 760                val &= MPI_CSBASE_BASE_MASK;
 761        }
 762        boot_addr = (u8 *)KSEG1ADDR(val);
 763
 764        /* dump cfe version */
 765        cfe = boot_addr + BCM963XX_CFE_VERSION_OFFSET;
 766        if (!memcmp(cfe, "cfe-v", 5))
 767                snprintf(cfe_version, sizeof(cfe_version), "%u.%u.%u-%u.%u",
 768                         cfe[5], cfe[6], cfe[7], cfe[8], cfe[9]);
 769        else
 770                strcpy(cfe_version, "unknown");
 771        pr_info("CFE version: %s\n", cfe_version);
 772
 773        bcm63xx_nvram_init(boot_addr + BCM963XX_NVRAM_OFFSET);
 774
 775        if (BCMCPU_IS_3368()) {
 776                hcs = (struct bcm_hcs *)boot_addr;
 777                board_name = hcs->filename;
 778        } else {
 779                board_name = bcm63xx_nvram_get_name();
 780        }
 781        /* find board by name */
 782        for (i = 0; i < ARRAY_SIZE(bcm963xx_boards); i++) {
 783                if (strncmp(board_name, bcm963xx_boards[i]->name, 16))
 784                        continue;
 785                /* copy, board desc array is marked initdata */
 786                memcpy(&board, bcm963xx_boards[i], sizeof(board));
 787                break;
 788        }
 789
 790        /* bail out if board is not found, will complain later */
 791        if (!board.name[0]) {
 792                char name[17];
 793                memcpy(name, board_name, 16);
 794                name[16] = 0;
 795                pr_err("unknown bcm963xx board: %s\n", name);
 796                return;
 797        }
 798
 799        /* setup pin multiplexing depending on board enabled device,
 800         * this has to be done this early since PCI init is done
 801         * inside arch_initcall */
 802        val = 0;
 803
 804#ifdef CONFIG_PCI
 805        if (board.has_pci) {
 806                bcm63xx_pci_enabled = 1;
 807                if (BCMCPU_IS_6348())
 808                        val |= GPIO_MODE_6348_G2_PCI;
 809        }
 810#endif
 811
 812        if (board.has_pccard) {
 813                if (BCMCPU_IS_6348())
 814                        val |= GPIO_MODE_6348_G1_MII_PCCARD;
 815        }
 816
 817        if (board.has_enet0 && !board.enet0.use_internal_phy) {
 818                if (BCMCPU_IS_6348())
 819                        val |= GPIO_MODE_6348_G3_EXT_MII |
 820                                GPIO_MODE_6348_G0_EXT_MII;
 821        }
 822
 823        if (board.has_enet1 && !board.enet1.use_internal_phy) {
 824                if (BCMCPU_IS_6348())
 825                        val |= GPIO_MODE_6348_G3_EXT_MII |
 826                                GPIO_MODE_6348_G0_EXT_MII;
 827        }
 828
 829        bcm_gpio_writel(val, GPIO_MODE_REG);
 830}
 831
 832/*
 833 * second stage init callback, good time to panic if we couldn't
 834 * identify on which board we're running since early printk is working
 835 */
 836void __init board_setup(void)
 837{
 838        if (!board.name[0])
 839                panic("unable to detect bcm963xx board");
 840        pr_info("board name: %s\n", board.name);
 841
 842        /* make sure we're running on expected cpu */
 843        if (bcm63xx_get_cpu_id() != board.expected_cpu_id)
 844                panic("unexpected CPU for bcm963xx board");
 845}
 846
 847static struct gpio_led_platform_data bcm63xx_led_data;
 848
 849static struct platform_device bcm63xx_gpio_leds = {
 850        .name                   = "leds-gpio",
 851        .id                     = 0,
 852        .dev.platform_data      = &bcm63xx_led_data,
 853};
 854
 855/*
 856 * third stage init callback, register all board devices.
 857 */
 858int __init board_register_devices(void)
 859{
 860        if (board.has_uart0)
 861                bcm63xx_uart_register(0);
 862
 863        if (board.has_uart1)
 864                bcm63xx_uart_register(1);
 865
 866        if (board.has_pccard)
 867                bcm63xx_pcmcia_register();
 868
 869        if (board.has_enet0 &&
 870            !bcm63xx_nvram_get_mac_address(board.enet0.mac_addr))
 871                bcm63xx_enet_register(0, &board.enet0);
 872
 873        if (board.has_enet1 &&
 874            !bcm63xx_nvram_get_mac_address(board.enet1.mac_addr))
 875                bcm63xx_enet_register(1, &board.enet1);
 876
 877        if (board.has_enetsw &&
 878            !bcm63xx_nvram_get_mac_address(board.enetsw.mac_addr))
 879                bcm63xx_enetsw_register(&board.enetsw);
 880
 881        if (board.has_usbd)
 882                bcm63xx_usbd_register(&board.usbd);
 883
 884        /* Generate MAC address for WLAN and register our SPROM,
 885         * do this after registering enet devices
 886         */
 887#ifdef CONFIG_SSB_PCIHOST
 888        if (!bcm63xx_nvram_get_mac_address(bcm63xx_sprom.il0mac)) {
 889                memcpy(bcm63xx_sprom.et0mac, bcm63xx_sprom.il0mac, ETH_ALEN);
 890                memcpy(bcm63xx_sprom.et1mac, bcm63xx_sprom.il0mac, ETH_ALEN);
 891                if (ssb_arch_register_fallback_sprom(
 892                                &bcm63xx_get_fallback_sprom) < 0)
 893                        pr_err("failed to register fallback SPROM\n");
 894        }
 895#endif
 896
 897        bcm63xx_spi_register();
 898
 899        bcm63xx_hsspi_register();
 900
 901        bcm63xx_flash_register();
 902
 903        bcm63xx_led_data.num_leds = ARRAY_SIZE(board.leds);
 904        bcm63xx_led_data.leds = board.leds;
 905
 906        platform_device_register(&bcm63xx_gpio_leds);
 907
 908        if (board.ephy_reset_gpio && board.ephy_reset_gpio_flags)
 909                gpio_request_one(board.ephy_reset_gpio,
 910                                board.ephy_reset_gpio_flags, "ephy-reset");
 911
 912        return 0;
 913}
 914