]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - arch/ppc/platforms/mpc8272ads_setup.c
fix file specification in comments
[net-next-2.6.git] / arch / ppc / platforms / mpc8272ads_setup.c
index bc9b94f77e394f693d10868bbc17fff0aec5753d..d7b3a6afa78f86dc4209f562f9ebdedb75da34b5 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * arch/ppc/platforms/82xx/pq2ads_pd.c
+ * arch/ppc/platforms/mpc8272ads_setup.c
  *
  * MPC82xx Board-specific PlatformDevice descriptions
  *
 #include <asm/irq.h>
 #include <asm/ppc_sys.h>
 #include <asm/ppcboot.h>
+#include <linux/fs_uart_pd.h>
 
 #include "pq2ads_pd.h"
 
 static void init_fcc1_ioports(void);
 static void init_fcc2_ioports(void);
-
-static struct fs_mii_bus_info mii_bus_info = {
-       .method                 = fsmii_bitbang,
-       .id                     = 0,
-       .i.bitbang = {
-               .mdio_port      = fsiop_portc,
-               .mdio_bit       = 18,
-               .mdc_port       = fsiop_portc,
-               .mdc_bit        = 19,
-               .delay          = 1,
+static void init_scc1_uart_ioports(void);
+static void init_scc4_uart_ioports(void);
+
+static struct fs_uart_platform_info mpc8272_uart_pdata[] = {
+       [fsid_scc1_uart] = {
+               .init_ioports   = init_scc1_uart_ioports,
+               .fs_no          = fsid_scc1_uart,
+               .brg            = 1,
+               .tx_num_fifo    = 4,
+               .tx_buf_size    = 32,
+               .rx_num_fifo    = 4,
+               .rx_buf_size    = 32,
+       },
+       [fsid_scc4_uart] = {
+               .init_ioports   = init_scc4_uart_ioports,
+               .fs_no          = fsid_scc4_uart,
+               .brg            = 4,
+               .tx_num_fifo    = 4,
+               .tx_buf_size    = 32,
+               .rx_num_fifo    = 4,
+               .rx_buf_size    = 32,
        },
 };
 
-static struct fs_platform_info mpc82xx_fcc1_pdata = {
-       .fs_no          = fsid_fcc1,
-       .cp_page        = CPM_CR_FCC1_PAGE,
-       .cp_block       = CPM_CR_FCC1_SBLOCK,
-       .clk_trx        = (PC_F1RXCLK | PC_F1TXCLK),
-       .clk_route      = CMX1_CLK_ROUTE,
-       .clk_mask       = CMX1_CLK_MASK,
-       .init_ioports   = init_fcc1_ioports,
-
-       .phy_addr       = 0,
-#ifdef PHY_INTERRUPT
-       .phy_irq        = PHY_INTERRUPT,
-#else
-       .phy_irq        = -1;
-#endif
-       .mem_offset     = FCC1_MEM_OFFSET,
-       .bus_info       = &mii_bus_info,
-       .rx_ring        = 32,
-       .tx_ring        = 32,
-       .rx_copybreak   = 240,
-       .use_napi       = 0,
-       .napi_weight    = 17,
+static struct fs_mii_bb_platform_info m82xx_mii_bb_pdata = {
+       .mdio_dat.bit   = 18,
+       .mdio_dir.bit   = 18,
+       .mdc_dat.bit    = 19,
+       .delay          = 1,
 };
 
-static struct fs_platform_info mpc82xx_fcc2_pdata = {
-       .fs_no          = fsid_fcc2,
-       .cp_page        = CPM_CR_FCC2_PAGE,
-       .cp_block       = CPM_CR_FCC2_SBLOCK,
-       .clk_trx        = (PC_F2RXCLK | PC_F2TXCLK),
-       .clk_route      = CMX2_CLK_ROUTE,
-       .clk_mask       = CMX2_CLK_MASK,
-       .init_ioports   = init_fcc2_ioports,
-
-       .phy_addr       = 3,
-#ifdef PHY_INTERRUPT
-       .phy_irq        = PHY_INTERRUPT,
-#else
-       .phy_irq        = -1;
-#endif
-       .mem_offset     = FCC2_MEM_OFFSET,
-       .bus_info       = &mii_bus_info,
-       .rx_ring        = 32,
-       .tx_ring        = 32,
-       .rx_copybreak   = 240,
-       .use_napi       = 0,
-       .napi_weight    = 17,
+static struct fs_platform_info mpc82xx_enet_pdata[] = {
+       [fsid_fcc1] = {
+               .fs_no          = fsid_fcc1,
+               .cp_page        = CPM_CR_FCC1_PAGE,
+               .cp_block       = CPM_CR_FCC1_SBLOCK,
+
+               .clk_trx        = (PC_F1RXCLK | PC_F1TXCLK),
+               .clk_route      = CMX1_CLK_ROUTE,
+               .clk_mask       = CMX1_CLK_MASK,
+               .init_ioports   = init_fcc1_ioports,
+
+               .mem_offset     = FCC1_MEM_OFFSET,
+
+               .rx_ring        = 32,
+               .tx_ring        = 32,
+               .rx_copybreak   = 240,
+               .use_napi       = 0,
+               .napi_weight    = 17,
+               .bus_id         = "0:00",
+       },
+       [fsid_fcc2] = {
+               .fs_no          = fsid_fcc2,
+               .cp_page        = CPM_CR_FCC2_PAGE,
+               .cp_block       = CPM_CR_FCC2_SBLOCK,
+               .clk_trx        = (PC_F2RXCLK | PC_F2TXCLK),
+               .clk_route      = CMX2_CLK_ROUTE,
+               .clk_mask       = CMX2_CLK_MASK,
+               .init_ioports   = init_fcc2_ioports,
+
+               .mem_offset     = FCC2_MEM_OFFSET,
+
+               .rx_ring        = 32,
+               .tx_ring        = 32,
+               .rx_copybreak   = 240,
+               .use_napi       = 0,
+               .napi_weight    = 17,
+               .bus_id         = "0:03",
+       },
 };
 
-static void init_fcc1_ioports(void)
+static void init_fcc1_ioports(struct fs_platform_info*)
 {
        struct io_port *io;
        u32 tempval;
@@ -133,7 +144,7 @@ static void init_fcc1_ioports(void)
        iounmap(immap);
 }
 
-static void init_fcc2_ioports(void)
+static void init_fcc2_ioports(struct fs_platform_info*)
 {
        cpm2_map_t* immap = ioremap(CPM_MAP_ADDR, sizeof(cpm2_map_t));
        u32 *bcsr = ioremap(BCSR_ADDR+12, sizeof(u32));
@@ -185,20 +196,93 @@ static void __init mpc8272ads_fixup_enet_pdata(struct platform_device *pdev,
        bd_t* bi = (void*)__res;
        int fs_no = fsid_fcc1+pdev->id-1;
 
-       mpc82xx_fcc1_pdata.dpram_offset = mpc82xx_fcc2_pdata.dpram_offset = (u32)cpm2_immr->im_dprambase;
-       mpc82xx_fcc1_pdata.fcc_regs_c = mpc82xx_fcc2_pdata.fcc_regs_c = (u32)cpm2_immr->im_fcc_c;
-
-       switch(fs_no) {
-               case fsid_fcc1:
-                       memcpy(&mpc82xx_fcc1_pdata.macaddr,bi->bi_enetaddr,6);
-                       pdev->dev.platform_data = &mpc82xx_fcc1_pdata;
-               break;
-               case fsid_fcc2:
-                       memcpy(&mpc82xx_fcc2_pdata.macaddr,bi->bi_enetaddr,6);
-                       mpc82xx_fcc2_pdata.macaddr[5] ^= 1;
-                       pdev->dev.platform_data = &mpc82xx_fcc2_pdata;
-               break;
+       if(fs_no > ARRAY_SIZE(mpc82xx_enet_pdata)) {
+               return;
        }
+
+       mpc82xx_enet_pdata[fs_no].dpram_offset=
+                       (u32)cpm2_immr->im_dprambase;
+       mpc82xx_enet_pdata[fs_no].fcc_regs_c =
+                       (u32)cpm2_immr->im_fcc_c;
+       memcpy(&mpc82xx_enet_pdata[fs_no].macaddr,bi->bi_enetaddr,6);
+
+       /* prevent dup mac */
+       if(fs_no == fsid_fcc2)
+               mpc82xx_enet_pdata[fs_no].macaddr[5] ^= 1;
+
+       pdev->dev.platform_data = &mpc82xx_enet_pdata[fs_no];
+}
+
+static void mpc8272ads_fixup_uart_pdata(struct platform_device *pdev,
+                                             int idx)
+{
+       bd_t *bd = (bd_t *) __res;
+       struct fs_uart_platform_info *pinfo;
+       int num = ARRAY_SIZE(mpc8272_uart_pdata);
+       int id = fs_uart_id_scc2fsid(idx);
+
+       /* no need to alter anything if console */
+       if ((id <= num) && (!pdev->dev.platform_data)) {
+               pinfo = &mpc8272_uart_pdata[id];
+               pinfo->uart_clk = bd->bi_intfreq;
+               pdev->dev.platform_data = pinfo;
+       }
+}
+
+static void init_scc1_uart_ioports(struct fs_uart_platform_info*)
+{
+       cpm2_map_t* immap = ioremap(CPM_MAP_ADDR, sizeof(cpm2_map_t));
+
+        /* SCC1 is only on port D */
+       setbits32(&immap->im_ioport.iop_ppard,0x00000003);
+       clrbits32(&immap->im_ioport.iop_psord,0x00000001);
+       setbits32(&immap->im_ioport.iop_psord,0x00000002);
+       clrbits32(&immap->im_ioport.iop_pdird,0x00000001);
+       setbits32(&immap->im_ioport.iop_pdird,0x00000002);
+
+        /* Wire BRG1 to SCC1 */
+       clrbits32(&immap->im_cpmux.cmx_scr,0x00ffffff);
+
+       iounmap(immap);
+}
+
+static void init_scc4_uart_ioports(struct fs_uart_platform_info*)
+{
+       cpm2_map_t* immap = ioremap(CPM_MAP_ADDR, sizeof(cpm2_map_t));
+
+       setbits32(&immap->im_ioport.iop_ppard,0x00000600);
+       clrbits32(&immap->im_ioport.iop_psord,0x00000600);
+       clrbits32(&immap->im_ioport.iop_pdird,0x00000200);
+       setbits32(&immap->im_ioport.iop_pdird,0x00000400);
+
+        /* Wire BRG4 to SCC4 */
+       clrbits32(&immap->im_cpmux.cmx_scr,0x000000ff);
+       setbits32(&immap->im_cpmux.cmx_scr,0x0000001b);
+
+       iounmap(immap);
+}
+
+static void __init mpc8272ads_fixup_mdio_pdata(struct platform_device *pdev,
+                                             int idx)
+{
+       m82xx_mii_bb_pdata.irq[0] = PHY_INTERRUPT;
+       m82xx_mii_bb_pdata.irq[1] = -1;
+       m82xx_mii_bb_pdata.irq[2] = -1;
+       m82xx_mii_bb_pdata.irq[3] = PHY_INTERRUPT;
+       m82xx_mii_bb_pdata.irq[31] = -1;
+
+
+       m82xx_mii_bb_pdata.mdio_dat.offset =
+                               (u32)&cpm2_immr->im_ioport.iop_pdatc;
+
+       m82xx_mii_bb_pdata.mdio_dir.offset =
+                               (u32)&cpm2_immr->im_ioport.iop_pdirc;
+
+       m82xx_mii_bb_pdata.mdc_dat.offset =
+                               (u32)&cpm2_immr->im_ioport.iop_pdatc;
+
+
+       pdev->dev.platform_data = &m82xx_mii_bb_pdata;
 }
 
 static int mpc8272ads_platform_notify(struct device *dev)
@@ -206,7 +290,15 @@ static int mpc8272ads_platform_notify(struct device *dev)
        static const struct platform_notify_dev_map dev_map[] = {
                {
                        .bus_id = "fsl-cpm-fcc",
-                       .rtn = mpc8272ads_fixup_enet_pdata
+                       .rtn = mpc8272ads_fixup_enet_pdata,
+               },
+               {
+                       .bus_id = "fsl-cpm-scc:uart",
+                       .rtn = mpc8272ads_fixup_uart_pdata,
+               },
+               {
+                       .bus_id = "fsl-bb-mdio",
+                       .rtn = mpc8272ads_fixup_mdio_pdata,
                },
                {
                        .bus_id = NULL
@@ -230,7 +322,45 @@ int __init mpc8272ads_init(void)
        ppc_sys_device_enable(MPC82xx_CPM_FCC1);
        ppc_sys_device_enable(MPC82xx_CPM_FCC2);
 
+       /* to be ready for console, let's attach pdata here */
+#ifdef CONFIG_SERIAL_CPM_SCC1
+       ppc_sys_device_setfunc(MPC82xx_CPM_SCC1, PPC_SYS_FUNC_UART);
+       ppc_sys_device_enable(MPC82xx_CPM_SCC1);
+
+#endif
+
+#ifdef CONFIG_SERIAL_CPM_SCC4
+       ppc_sys_device_setfunc(MPC82xx_CPM_SCC4, PPC_SYS_FUNC_UART);
+       ppc_sys_device_enable(MPC82xx_CPM_SCC4);
+#endif
+
+       ppc_sys_device_enable(MPC82xx_MDIO_BB);
+
        return 0;
 }
 
+/*
+   To prevent confusion, console selection is gross:
+   by 0 assumed SCC1 and by 1 assumed SCC4
+ */
+struct platform_device* early_uart_get_pdev(int index)
+{
+       bd_t *bd = (bd_t *) __res;
+       struct fs_uart_platform_info *pinfo;
+
+       struct platform_device* pdev = NULL;
+       if(index) { /*assume SCC4 here*/
+               pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC4];
+               pinfo = &mpc8272_uart_pdata[fsid_scc4_uart];
+       } else { /*over SCC1*/
+               pdev = &ppc_sys_platform_devices[MPC82xx_CPM_SCC1];
+               pinfo = &mpc8272_uart_pdata[fsid_scc1_uart];
+       }
+
+       pinfo->uart_clk = bd->bi_intfreq;
+       pdev->dev.platform_data = pinfo;
+       ppc_sys_fixup_mem_resource(pdev, CPM_MAP_ADDR);
+       return NULL;
+}
+
 arch_initcall(mpc8272ads_init);