Path: blob/master/arch/powerpc/platforms/8xx/mpc885ads_setup.c
10819 views
/*1* Platform setup for the Freescale mpc885ads board2*3* Vitaly Bordug <[email protected]>4*5* Copyright 2005 MontaVista Software Inc.6*7* Heavily modified by Scott Wood <[email protected]>8* Copyright 2007 Freescale Semiconductor, Inc.9*10* This file is licensed under the terms of the GNU General Public License11* version 2. This program is licensed "as is" without any warranty of any12* kind, whether express or implied.13*/1415#include <linux/init.h>16#include <linux/module.h>17#include <linux/param.h>18#include <linux/string.h>19#include <linux/ioport.h>20#include <linux/device.h>21#include <linux/delay.h>2223#include <linux/fs_enet_pd.h>24#include <linux/fs_uart_pd.h>25#include <linux/fsl_devices.h>26#include <linux/mii.h>27#include <linux/of_platform.h>2829#include <asm/delay.h>30#include <asm/io.h>31#include <asm/machdep.h>32#include <asm/page.h>33#include <asm/processor.h>34#include <asm/system.h>35#include <asm/time.h>36#include <asm/mpc8xx.h>37#include <asm/8xx_immap.h>38#include <asm/cpm1.h>39#include <asm/fs_pd.h>40#include <asm/udbg.h>4142#include "mpc885ads.h"43#include "mpc8xx.h"4445static u32 __iomem *bcsr, *bcsr5;4647#ifdef CONFIG_PCMCIA_M8XX48static void pcmcia_hw_setup(int slot, int enable)49{50if (enable)51clrbits32(&bcsr[1], BCSR1_PCCEN);52else53setbits32(&bcsr[1], BCSR1_PCCEN);54}5556static int pcmcia_set_voltage(int slot, int vcc, int vpp)57{58u32 reg = 0;5960switch (vcc) {61case 0:62break;63case 33:64reg |= BCSR1_PCCVCC0;65break;66case 50:67reg |= BCSR1_PCCVCC1;68break;69default:70return 1;71}7273switch (vpp) {74case 0:75break;76case 33:77case 50:78if (vcc == vpp)79reg |= BCSR1_PCCVPP1;80else81return 1;82break;83case 120:84if ((vcc == 33) || (vcc == 50))85reg |= BCSR1_PCCVPP0;86else87return 1;88default:89return 1;90}9192/* first, turn off all power */93clrbits32(&bcsr[1], 0x00610000);9495/* enable new powersettings */96setbits32(&bcsr[1], reg);9798return 0;99}100#endif101102struct cpm_pin {103int port, pin, flags;104};105106static struct cpm_pin mpc885ads_pins[] = {107/* SMC1 */108{CPM_PORTB, 24, CPM_PIN_INPUT}, /* RX */109{CPM_PORTB, 25, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */110111/* SMC2 */112#ifndef CONFIG_MPC8xx_SECOND_ETH_FEC2113{CPM_PORTE, 21, CPM_PIN_INPUT}, /* RX */114{CPM_PORTE, 20, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TX */115#endif116117/* SCC3 */118{CPM_PORTA, 9, CPM_PIN_INPUT}, /* RX */119{CPM_PORTA, 8, CPM_PIN_INPUT}, /* TX */120{CPM_PORTC, 4, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* RENA */121{CPM_PORTC, 5, CPM_PIN_INPUT | CPM_PIN_SECONDARY | CPM_PIN_GPIO}, /* CLSN */122{CPM_PORTE, 27, CPM_PIN_INPUT | CPM_PIN_SECONDARY}, /* TENA */123{CPM_PORTE, 17, CPM_PIN_INPUT}, /* CLK5 */124{CPM_PORTE, 16, CPM_PIN_INPUT}, /* CLK6 */125126/* MII1 */127{CPM_PORTA, 0, CPM_PIN_INPUT},128{CPM_PORTA, 1, CPM_PIN_INPUT},129{CPM_PORTA, 2, CPM_PIN_INPUT},130{CPM_PORTA, 3, CPM_PIN_INPUT},131{CPM_PORTA, 4, CPM_PIN_OUTPUT},132{CPM_PORTA, 10, CPM_PIN_OUTPUT},133{CPM_PORTA, 11, CPM_PIN_OUTPUT},134{CPM_PORTB, 19, CPM_PIN_INPUT},135{CPM_PORTB, 31, CPM_PIN_INPUT},136{CPM_PORTC, 12, CPM_PIN_INPUT},137{CPM_PORTC, 13, CPM_PIN_INPUT},138{CPM_PORTE, 30, CPM_PIN_OUTPUT},139{CPM_PORTE, 31, CPM_PIN_OUTPUT},140141/* MII2 */142#ifdef CONFIG_MPC8xx_SECOND_ETH_FEC2143{CPM_PORTE, 14, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},144{CPM_PORTE, 15, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},145{CPM_PORTE, 16, CPM_PIN_OUTPUT},146{CPM_PORTE, 17, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},147{CPM_PORTE, 18, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},148{CPM_PORTE, 19, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},149{CPM_PORTE, 20, CPM_PIN_OUTPUT | CPM_PIN_SECONDARY},150{CPM_PORTE, 21, CPM_PIN_OUTPUT},151{CPM_PORTE, 22, CPM_PIN_OUTPUT},152{CPM_PORTE, 23, CPM_PIN_OUTPUT},153{CPM_PORTE, 24, CPM_PIN_OUTPUT},154{CPM_PORTE, 25, CPM_PIN_OUTPUT},155{CPM_PORTE, 26, CPM_PIN_OUTPUT},156{CPM_PORTE, 27, CPM_PIN_OUTPUT},157{CPM_PORTE, 28, CPM_PIN_OUTPUT},158{CPM_PORTE, 29, CPM_PIN_OUTPUT},159#endif160/* I2C */161{CPM_PORTB, 26, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN},162{CPM_PORTB, 27, CPM_PIN_INPUT | CPM_PIN_OPENDRAIN},163};164165static void __init init_ioports(void)166{167int i;168169for (i = 0; i < ARRAY_SIZE(mpc885ads_pins); i++) {170struct cpm_pin *pin = &mpc885ads_pins[i];171cpm1_set_pin(pin->port, pin->pin, pin->flags);172}173174cpm1_clk_setup(CPM_CLK_SMC1, CPM_BRG1, CPM_CLK_RTX);175cpm1_clk_setup(CPM_CLK_SMC2, CPM_BRG2, CPM_CLK_RTX);176cpm1_clk_setup(CPM_CLK_SCC3, CPM_CLK5, CPM_CLK_TX);177cpm1_clk_setup(CPM_CLK_SCC3, CPM_CLK6, CPM_CLK_RX);178179/* Set FEC1 and FEC2 to MII mode */180clrbits32(&mpc8xx_immr->im_cpm.cp_cptr, 0x00000180);181}182183static void __init mpc885ads_setup_arch(void)184{185struct device_node *np;186187cpm_reset();188init_ioports();189190np = of_find_compatible_node(NULL, NULL, "fsl,mpc885ads-bcsr");191if (!np) {192printk(KERN_CRIT "Could not find fsl,mpc885ads-bcsr node\n");193return;194}195196bcsr = of_iomap(np, 0);197bcsr5 = of_iomap(np, 1);198of_node_put(np);199200if (!bcsr || !bcsr5) {201printk(KERN_CRIT "Could not remap BCSR\n");202return;203}204205clrbits32(&bcsr[1], BCSR1_RS232EN_1);206#ifdef CONFIG_MPC8xx_SECOND_ETH_FEC2207setbits32(&bcsr[1], BCSR1_RS232EN_2);208#else209clrbits32(&bcsr[1], BCSR1_RS232EN_2);210#endif211212clrbits32(bcsr5, BCSR5_MII1_EN);213setbits32(bcsr5, BCSR5_MII1_RST);214udelay(1000);215clrbits32(bcsr5, BCSR5_MII1_RST);216217#ifdef CONFIG_MPC8xx_SECOND_ETH_FEC2218clrbits32(bcsr5, BCSR5_MII2_EN);219setbits32(bcsr5, BCSR5_MII2_RST);220udelay(1000);221clrbits32(bcsr5, BCSR5_MII2_RST);222#else223setbits32(bcsr5, BCSR5_MII2_EN);224#endif225226#ifdef CONFIG_MPC8xx_SECOND_ETH_SCC3227clrbits32(&bcsr[4], BCSR4_ETH10_RST);228udelay(1000);229setbits32(&bcsr[4], BCSR4_ETH10_RST);230231setbits32(&bcsr[1], BCSR1_ETHEN);232233np = of_find_node_by_path("/soc@ff000000/cpm@9c0/serial@a80");234#else235np = of_find_node_by_path("/soc@ff000000/cpm@9c0/ethernet@a40");236#endif237238/* The SCC3 enet registers overlap the SMC1 registers, so239* one of the two must be removed from the device tree.240*/241242if (np) {243of_detach_node(np);244of_node_put(np);245}246247#ifdef CONFIG_PCMCIA_M8XX248/* Set up board specific hook-ups.*/249m8xx_pcmcia_ops.hw_ctrl = pcmcia_hw_setup;250m8xx_pcmcia_ops.voltage_set = pcmcia_set_voltage;251#endif252}253254static int __init mpc885ads_probe(void)255{256unsigned long root = of_get_flat_dt_root();257return of_flat_dt_is_compatible(root, "fsl,mpc885ads");258}259260static struct of_device_id __initdata of_bus_ids[] = {261{ .name = "soc", },262{ .name = "cpm", },263{ .name = "localbus", },264{},265};266267static int __init declare_of_platform_devices(void)268{269/* Publish the QE devices */270of_platform_bus_probe(NULL, of_bus_ids, NULL);271272return 0;273}274machine_device_initcall(mpc885_ads, declare_of_platform_devices);275276define_machine(mpc885_ads) {277.name = "Freescale MPC885 ADS",278.probe = mpc885ads_probe,279.setup_arch = mpc885ads_setup_arch,280.init_IRQ = mpc8xx_pics_init,281.get_irq = mpc8xx_get_irq,282.restart = mpc8xx_restart,283.calibrate_decr = mpc8xx_calibrate_decr,284.set_rtc_time = mpc8xx_set_rtc_time,285.get_rtc_time = mpc8xx_get_rtc_time,286.progress = udbg_progress,287};288289290