1/* 2 * arch/powerpc/platforms/83xx/mpc837x_mds.c 3 * 4 * Copyright (C) 2007 Freescale Semiconductor, Inc. All rights reserved. 5 * 6 * MPC837x MDS board specific routines 7 * 8 * This program is free software; you can redistribute it and/or modify it 9 * under the terms of the GNU General Public License as published by the 10 * Free Software Foundation; either version 2 of the License, or (at your 11 * option) any later version. 12 */ 13 14#include <linux/pci.h> 15#include <linux/of.h> 16#include <linux/of_platform.h> 17 18#include <asm/time.h> 19#include <asm/ipic.h> 20#include <asm/udbg.h> 21#include <asm/prom.h> 22#include <sysdev/fsl_pci.h> 23 24#include "mpc83xx.h" 25 26#define BCSR12_USB_SER_MASK 0x8a 27#define BCSR12_USB_SER_PIN 0x80 28#define BCSR12_USB_SER_DEVICE 0x02 29 30static int mpc837xmds_usb_cfg(void) 31{ 32 struct device_node *np; 33 const void *phy_type, *mode; 34 void __iomem *bcsr_regs = NULL; 35 u8 bcsr12; 36 int ret; 37 38 ret = mpc837x_usb_cfg(); 39 if (ret) 40 return ret; 41 /* Map BCSR area */ 42 np = of_find_compatible_node(NULL, NULL, "fsl,mpc837xmds-bcsr"); 43 if (np) { 44 bcsr_regs = of_iomap(np, 0); 45 of_node_put(np); 46 } 47 if (!bcsr_regs) 48 return -1; 49 50 np = of_find_node_by_name(NULL, "usb"); 51 if (!np) { 52 ret = -ENODEV; 53 goto out; 54 } 55 phy_type = of_get_property(np, "phy_type", NULL); 56 if (phy_type && !strcmp(phy_type, "ulpi")) { 57 clrbits8(bcsr_regs + 12, BCSR12_USB_SER_PIN); 58 } else if (phy_type && !strcmp(phy_type, "serial")) { 59 mode = of_get_property(np, "dr_mode", NULL); 60 bcsr12 = in_8(bcsr_regs + 12) & ~BCSR12_USB_SER_MASK; 61 bcsr12 |= BCSR12_USB_SER_PIN; 62 if (mode && !strcmp(mode, "peripheral")) 63 bcsr12 |= BCSR12_USB_SER_DEVICE; 64 out_8(bcsr_regs + 12, bcsr12); 65 } else { 66 printk(KERN_ERR "USB DR: unsupported PHY\n"); 67 } 68 69 of_node_put(np); 70out: 71 iounmap(bcsr_regs); 72 return ret; 73} 74 75/* ************************************************************************ 76 * 77 * Setup the architecture 78 * 79 */ 80static void __init mpc837x_mds_setup_arch(void) 81{ 82 if (ppc_md.progress) 83 ppc_md.progress("mpc837x_mds_setup_arch()", 0); 84 85 mpc83xx_setup_pci(); 86 mpc837xmds_usb_cfg(); 87} 88 89machine_device_initcall(mpc837x_mds, mpc83xx_declare_of_platform_devices); 90 91/* 92 * Called very early, MMU is off, device-tree isn't unflattened 93 */ 94static int __init mpc837x_mds_probe(void) 95{ 96 unsigned long root = of_get_flat_dt_root(); 97 98 return of_flat_dt_is_compatible(root, "fsl,mpc837xmds"); 99} 100 101define_machine(mpc837x_mds) { 102 .name = "MPC837x MDS", 103 .probe = mpc837x_mds_probe, 104 .setup_arch = mpc837x_mds_setup_arch, 105 .init_IRQ = mpc83xx_ipic_init_IRQ, 106 .get_irq = ipic_get_irq, 107 .restart = mpc83xx_restart, 108 .time_init = mpc83xx_time_init, 109 .calibrate_decr = generic_calibrate_decr, 110 .progress = udbg_progress, 111}; 112