162306a36Sopenharmony_ci/*arch/powerpc/platforms/8xx/mpc86xads_setup.c 262306a36Sopenharmony_ci * 362306a36Sopenharmony_ci * Platform setup for the Freescale mpc86xads board 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Vitaly Bordug <vbordug@ru.mvista.com> 662306a36Sopenharmony_ci * 762306a36Sopenharmony_ci * Copyright 2005 MontaVista Software Inc. 862306a36Sopenharmony_ci * 962306a36Sopenharmony_ci * Heavily modified by Scott Wood <scottwood@freescale.com> 1062306a36Sopenharmony_ci * Copyright 2007 Freescale Semiconductor, Inc. 1162306a36Sopenharmony_ci * 1262306a36Sopenharmony_ci * This file is licensed under the terms of the GNU General Public License 1362306a36Sopenharmony_ci * version 2. This program is licensed "as is" without any warranty of any 1462306a36Sopenharmony_ci * kind, whether express or implied. 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci#include <linux/init.h> 1862306a36Sopenharmony_ci#include <linux/of_address.h> 1962306a36Sopenharmony_ci#include <linux/of_fdt.h> 2062306a36Sopenharmony_ci#include <linux/of_platform.h> 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ci#include <asm/io.h> 2362306a36Sopenharmony_ci#include <asm/machdep.h> 2462306a36Sopenharmony_ci#include <asm/time.h> 2562306a36Sopenharmony_ci#include <asm/8xx_immap.h> 2662306a36Sopenharmony_ci#include <asm/cpm1.h> 2762306a36Sopenharmony_ci#include <asm/udbg.h> 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci#include "mpc86xads.h" 3062306a36Sopenharmony_ci#include "mpc8xx.h" 3162306a36Sopenharmony_ci#include "pic.h" 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistruct cpm_pin { 3462306a36Sopenharmony_ci int port, pin, flags; 3562306a36Sopenharmony_ci}; 3662306a36Sopenharmony_ci 3762306a36Sopenharmony_cistatic struct cpm_pin mpc866ads_pins[] = { 3862306a36Sopenharmony_ci /* SMC1 */ 3962306a36Sopenharmony_ci {CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */ 4062306a36Sopenharmony_ci {CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */ 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ci /* SMC2 */ 4362306a36Sopenharmony_ci {CPM_PORTB, 21, CPM_PIN_INPUT}, /* RX */ 4462306a36Sopenharmony_ci {CPM_PORTB, 20, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */ 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ci /* SCC1 */ 4762306a36Sopenharmony_ci {CPM_PORTA, 6, CPM_PIN_INPUT}, /* CLK1 */ 4862306a36Sopenharmony_ci {CPM_PORTA, 7, CPM_PIN_INPUT}, /* CLK2 */ 4962306a36Sopenharmony_ci {CPM_PORTA, 14, CPM_PIN_INPUT}, /* TX */ 5062306a36Sopenharmony_ci {CPM_PORTA, 15, CPM_PIN_INPUT}, /* RX */ 5162306a36Sopenharmony_ci {CPM_PORTB, 19, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TENA */ 5262306a36Sopenharmony_ci {CPM_PORTC, 10, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* RENA */ 5362306a36Sopenharmony_ci {CPM_PORTC, 11, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CLSN */ 5462306a36Sopenharmony_ci 5562306a36Sopenharmony_ci /* MII */ 5662306a36Sopenharmony_ci {CPM_PORTD, 3, CPM_PIN_OUTPUT}, 5762306a36Sopenharmony_ci {CPM_PORTD, 4, CPM_PIN_OUTPUT}, 5862306a36Sopenharmony_ci {CPM_PORTD, 5, CPM_PIN_OUTPUT}, 5962306a36Sopenharmony_ci {CPM_PORTD, 6, CPM_PIN_OUTPUT}, 6062306a36Sopenharmony_ci {CPM_PORTD, 7, CPM_PIN_OUTPUT}, 6162306a36Sopenharmony_ci {CPM_PORTD, 8, CPM_PIN_OUTPUT}, 6262306a36Sopenharmony_ci {CPM_PORTD, 9, CPM_PIN_OUTPUT}, 6362306a36Sopenharmony_ci {CPM_PORTD, 10, CPM_PIN_OUTPUT}, 6462306a36Sopenharmony_ci {CPM_PORTD, 11, CPM_PIN_OUTPUT}, 6562306a36Sopenharmony_ci {CPM_PORTD, 12, CPM_PIN_OUTPUT}, 6662306a36Sopenharmony_ci {CPM_PORTD, 13, CPM_PIN_OUTPUT}, 6762306a36Sopenharmony_ci {CPM_PORTD, 14, CPM_PIN_OUTPUT}, 6862306a36Sopenharmony_ci {CPM_PORTD, 15, CPM_PIN_OUTPUT}, 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci /* I2C */ 7162306a36Sopenharmony_ci {CPM_PORTB, 26, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN}, 7262306a36Sopenharmony_ci {CPM_PORTB, 27, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN}, 7362306a36Sopenharmony_ci}; 7462306a36Sopenharmony_ci 7562306a36Sopenharmony_cistatic void __init init_ioports(void) 7662306a36Sopenharmony_ci{ 7762306a36Sopenharmony_ci int i; 7862306a36Sopenharmony_ci 7962306a36Sopenharmony_ci for (i = 0; i < ARRAY_SIZE(mpc866ads_pins); i++) { 8062306a36Sopenharmony_ci struct cpm_pin *pin = &mpc866ads_pins[i]; 8162306a36Sopenharmony_ci cpm1_set_pin(pin->port, pin->pin, pin->flags); 8262306a36Sopenharmony_ci } 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX); 8562306a36Sopenharmony_ci cpm1_clk_setup(CPM_CLK_SMC2, CPM_BRG2, CPM_CLK_RTX); 8662306a36Sopenharmony_ci cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK1, CPM_CLK_TX); 8762306a36Sopenharmony_ci cpm1_clk_setup(CPM_CLK_SCC1, CPM_CLK2, CPM_CLK_RX); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci /* Set FEC1 and FEC2 to MII mode */ 9062306a36Sopenharmony_ci clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180); 9162306a36Sopenharmony_ci} 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_cistatic void __init mpc86xads_setup_arch(void) 9462306a36Sopenharmony_ci{ 9562306a36Sopenharmony_ci struct device_node *np; 9662306a36Sopenharmony_ci u32 __iomem *bcsr_io; 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci cpm_reset(); 9962306a36Sopenharmony_ci init_ioports(); 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci np = of_find_compatible_node(NULL, NULL, "fsl,mpc866ads-bcsr"); 10262306a36Sopenharmony_ci if (!np) { 10362306a36Sopenharmony_ci printk(KERN_CRIT "Could not find fsl,mpc866ads-bcsr node\n"); 10462306a36Sopenharmony_ci return; 10562306a36Sopenharmony_ci } 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci bcsr_io = of_iomap(np, 0); 10862306a36Sopenharmony_ci of_node_put(np); 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ci if (bcsr_io == NULL) { 11162306a36Sopenharmony_ci printk(KERN_CRIT "Could not remap BCSR\n"); 11262306a36Sopenharmony_ci return; 11362306a36Sopenharmony_ci } 11462306a36Sopenharmony_ci 11562306a36Sopenharmony_ci clrbits32(bcsr_io, BCSR1_RS232EN_1 | BCSR1_RS232EN_2 | BCSR1_ETHEN); 11662306a36Sopenharmony_ci iounmap(bcsr_io); 11762306a36Sopenharmony_ci} 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_cistatic const struct of_device_id of_bus_ids[] __initconst = { 12062306a36Sopenharmony_ci { .name = "soc", }, 12162306a36Sopenharmony_ci { .name = "cpm", }, 12262306a36Sopenharmony_ci { .name = "localbus", }, 12362306a36Sopenharmony_ci {}, 12462306a36Sopenharmony_ci}; 12562306a36Sopenharmony_ci 12662306a36Sopenharmony_cistatic int __init declare_of_platform_devices(void) 12762306a36Sopenharmony_ci{ 12862306a36Sopenharmony_ci of_platform_bus_probe(NULL, of_bus_ids, NULL); 12962306a36Sopenharmony_ci 13062306a36Sopenharmony_ci return 0; 13162306a36Sopenharmony_ci} 13262306a36Sopenharmony_cimachine_device_initcall(mpc86x_ads, declare_of_platform_devices); 13362306a36Sopenharmony_ci 13462306a36Sopenharmony_cidefine_machine(mpc86x_ads) { 13562306a36Sopenharmony_ci .name = "MPC86x ADS", 13662306a36Sopenharmony_ci .compatible = "fsl,mpc866ads", 13762306a36Sopenharmony_ci .setup_arch = mpc86xads_setup_arch, 13862306a36Sopenharmony_ci .init_IRQ = mpc8xx_pic_init, 13962306a36Sopenharmony_ci .get_irq = mpc8xx_get_irq, 14062306a36Sopenharmony_ci .restart = mpc8xx_restart, 14162306a36Sopenharmony_ci .calibrate_decr = mpc8xx_calibrate_decr, 14262306a36Sopenharmony_ci .set_rtc_time = mpc8xx_set_rtc_time, 14362306a36Sopenharmony_ci .get_rtc_time = mpc8xx_get_rtc_time, 14462306a36Sopenharmony_ci .progress = udbg_progress, 14562306a36Sopenharmony_ci}; 146