152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth/*
252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth * Platform device setup for Marvell mv64360/mv64460 host bridges (Discovery)
352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth *
452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth * Author: Dale Farnsworth <dale@farnsworth.org>
552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth *
652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth * 2007 (c) MontaVista, Software, Inc.  This file is licensed under
752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth * the terms of the GNU General Public License version 2.  This program
852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth * is licensed "as is" without any warranty of any kind, whether express
952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth * or implied.
1052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth */
1152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
1252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth#include <linux/stddef.h>
1352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth#include <linux/kernel.h>
1452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth#include <linux/init.h>
15542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer#include <linux/console.h>
1652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth#include <linux/mv643xx.h>
1752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth#include <linux/platform_device.h>
18683307da07afd3a7ee55269ee8cb70c8053b0923Remi Machet#include <linux/of_platform.h>
194b6ba8aacbb3185703b797286547d0f8f3859b02David Daney#include <linux/of_net.h>
20e0508b1516ad4423499d4118a9037ae0aa4e9c2fCorey Minyard#include <linux/dma-mapping.h>
2152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
2252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth#include <asm/prom.h>
2352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
24eca3930163ba8884060ce9d9ff5ef0d9b7c7b00fGrant Likely/* These functions provide the necessary setup for the mv64x60 drivers. */
2552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
26ce6d73c94d7cfbdc3dc31860fe14af2f37d1b4feUwe Kleine-Königstatic const struct of_device_id of_mv64x60_devices[] __initconst = {
27683307da07afd3a7ee55269ee8cb70c8053b0923Remi Machet	{ .compatible = "marvell,mv64306-devctrl", },
28683307da07afd3a7ee55269ee8cb70c8053b0923Remi Machet	{}
29683307da07afd3a7ee55269ee8cb70c8053b0923Remi Machet};
30683307da07afd3a7ee55269ee8cb70c8053b0923Remi Machet
3152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth/*
3252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth * Create MPSC platform devices
3352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth */
3452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworthstatic int __init mv64x60_mpsc_register_shared_pdev(struct device_node *np)
3552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth{
3652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	struct platform_device *pdev;
3752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	struct resource r[2];
3852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	struct mpsc_shared_pdata pdata;
3952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	const phandle *ph;
4052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	struct device_node *mpscrouting, *mpscintr;
4152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	int err;
4252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
4352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	ph = of_get_property(np, "mpscrouting", NULL);
4452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	mpscrouting = of_find_node_by_phandle(*ph);
4552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (!mpscrouting)
4652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return -ENODEV;
4752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
4852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = of_address_to_resource(mpscrouting, 0, &r[0]);
4952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	of_node_put(mpscrouting);
5052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
5152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return err;
5252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
5352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	ph = of_get_property(np, "mpscintr", NULL);
5452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	mpscintr = of_find_node_by_phandle(*ph);
5552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (!mpscintr)
5652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return -ENODEV;
5752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
5852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = of_address_to_resource(mpscintr, 0, &r[1]);
5952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	of_node_put(mpscintr);
6052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
6152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return err;
6252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
6352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	memset(&pdata, 0, sizeof(pdata));
6452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
6552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	pdev = platform_device_alloc(MPSC_SHARED_NAME, 0);
6652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (!pdev)
6752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return -ENOMEM;
6852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
6952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = platform_device_add_resources(pdev, r, 2);
7052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
7152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		goto error;
7252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
7352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
7452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
7552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		goto error;
7652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
7752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = platform_device_add(pdev);
7852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
7952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		goto error;
8052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
8152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	return 0;
8252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
8352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnswortherror:
8452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	platform_device_put(pdev);
8552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	return err;
8652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth}
8752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
8852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
8952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworthstatic int __init mv64x60_mpsc_device_setup(struct device_node *np, int id)
9052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth{
9152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	struct resource r[5];
9252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	struct mpsc_pdata pdata;
9352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	struct platform_device *pdev;
9452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	const unsigned int *prop;
9552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	const phandle *ph;
9652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	struct device_node *sdma, *brg;
9752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	int err;
9852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	int port_number;
9952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
10052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	/* only register the shared platform device the first time through */
10152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (id == 0 && (err = mv64x60_mpsc_register_shared_pdev(np)))
10252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return err;
10352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
10452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	memset(r, 0, sizeof(r));
10552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
10652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = of_address_to_resource(np, 0, &r[0]);
10752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
10852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return err;
10952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
11052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	of_irq_to_resource(np, 0, &r[4]);
11152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
11252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	ph = of_get_property(np, "sdma", NULL);
11352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	sdma = of_find_node_by_phandle(*ph);
11452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (!sdma)
11552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return -ENODEV;
11652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
11752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	of_irq_to_resource(sdma, 0, &r[3]);
11852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = of_address_to_resource(sdma, 0, &r[1]);
11952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	of_node_put(sdma);
12052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
12152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return err;
12252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
12352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	ph = of_get_property(np, "brg", NULL);
12452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	brg = of_find_node_by_phandle(*ph);
12552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (!brg)
12652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return -ENODEV;
12752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
12852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = of_address_to_resource(brg, 0, &r[2]);
12952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	of_node_put(brg);
13052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
13152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return err;
13252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
1331791f91bc794b7efc90719268146f582b9f29eadMark A. Greer	prop = of_get_property(np, "cell-index", NULL);
13452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (!prop)
13552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return -ENODEV;
13652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	port_number = *(int *)prop;
13752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
13852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	memset(&pdata, 0, sizeof(pdata));
13952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
14052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	pdata.cache_mgmt = 1; /* All current revs need this set */
14152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
1421791f91bc794b7efc90719268146f582b9f29eadMark A. Greer	pdata.max_idle = 40; /* default */
14352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	prop = of_get_property(np, "max_idle", NULL);
14452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (prop)
14552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		pdata.max_idle = *prop;
14652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
14752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	prop = of_get_property(brg, "current-speed", NULL);
14852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (prop)
14952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		pdata.default_baud = *prop;
15052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
15152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	/* Default is 8 bits, no parity, no flow control */
15252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	pdata.default_bits = 8;
15352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	pdata.default_parity = 'n';
15452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	pdata.default_flow = 'n';
15552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
15652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	prop = of_get_property(np, "chr_1", NULL);
15752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (prop)
15852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		pdata.chr_1_val = *prop;
15952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
16052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	prop = of_get_property(np, "chr_2", NULL);
16152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (prop)
16252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		pdata.chr_2_val = *prop;
16352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
16452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	prop = of_get_property(np, "chr_10", NULL);
16552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (prop)
16652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		pdata.chr_10_val = *prop;
16752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
16852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	prop = of_get_property(np, "mpcr", NULL);
16952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (prop)
17052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		pdata.mpcr_val = *prop;
17152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
17252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	prop = of_get_property(brg, "bcr", NULL);
17352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (prop)
17452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		pdata.bcr_val = *prop;
17552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
17652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	pdata.brg_can_tune = 1; /* All current revs need this set */
17752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
17852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	prop = of_get_property(brg, "clock-src", NULL);
17952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (prop)
18052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		pdata.brg_clk_src = *prop;
18152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
18252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	prop = of_get_property(brg, "clock-frequency", NULL);
18352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (prop)
18452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		pdata.brg_clk_freq = *prop;
18552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
18652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	pdev = platform_device_alloc(MPSC_CTLR_NAME, port_number);
18752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (!pdev)
18852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		return -ENOMEM;
189e0508b1516ad4423499d4118a9037ae0aa4e9c2fCorey Minyard	pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
19052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
19152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = platform_device_add_resources(pdev, r, 5);
19252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
19352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		goto error;
19452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
19552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
19652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
19752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		goto error;
19852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
19952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	err = platform_device_add(pdev);
20052d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	if (err)
20152d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth		goto error;
20252d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
20352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	return 0;
20452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
20552d3aff903171af13b56c5a4d6fb828461406c65Dale Farnswortherror:
20652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	platform_device_put(pdev);
20752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	return err;
20852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth}
20952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
210649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth/*
211649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth * Create mv64x60_eth platform devices
212649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth */
213a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworthstatic struct platform_device * __init mv64x60_eth_register_shared_pdev(
214a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth						struct device_node *np, int id)
215649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth{
216649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	struct platform_device *pdev;
217c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli	struct resource r[2];
218649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	int err;
219649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
220649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	err = of_address_to_resource(np, 0, &r[0]);
221649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (err)
222a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth		return ERR_PTR(err);
223649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
224c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli	/* register an orion mdio bus driver */
225c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli	r[1].start = r[0].start + 0x4;
226c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli	r[1].end = r[0].start + 0x84 - 1;
227c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli	r[1].flags = IORESOURCE_MEM;
228c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli
229c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli	if (id == 0) {
230c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli		pdev = platform_device_register_simple("orion-mdio", -1, &r[1], 1);
231dde8e3ee6b37fa33690604302bebfe7b576c3802Wei Yongjun		if (IS_ERR(pdev))
232c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli			return pdev;
233c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli	}
234c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli
235a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	pdev = platform_device_register_simple(MV643XX_ETH_SHARED_NAME, id,
236c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli					       &r[0], 1);
237c3a07134e6aa5b93a37f72ffa3d11fadf72bf757Florian Fainelli
238a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	return pdev;
239649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth}
240649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
241a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworthstatic int __init mv64x60_eth_device_setup(struct device_node *np, int id,
242a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth					   struct platform_device *shared_pdev)
243649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth{
244649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	struct resource r[1];
245649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	struct mv643xx_eth_platform_data pdata;
246649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	struct platform_device *pdev;
247649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	struct device_node *phy;
248649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	const u8 *mac_addr;
249649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	const int *prop;
250649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	const phandle *ph;
251649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	int err;
252649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
253649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	memset(r, 0, sizeof(r));
254649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	of_irq_to_resource(np, 0, &r[0]);
255649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
256649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	memset(&pdata, 0, sizeof(pdata));
257649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
258fa3959f457109cc7d082b86ea6daae927982815bLennert Buytenhek	pdata.shared = shared_pdev;
259fa3959f457109cc7d082b86ea6daae927982815bLennert Buytenhek
260a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	prop = of_get_property(np, "reg", NULL);
261649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (!prop)
262649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		return -ENODEV;
263649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	pdata.port_number = *prop;
264649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
265649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	mac_addr = of_get_mac_address(np);
266649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (mac_addr)
267649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		memcpy(pdata.mac_addr, mac_addr, 6);
268649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
269649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	prop = of_get_property(np, "speed", NULL);
270649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (prop)
271649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		pdata.speed = *prop;
272649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
273649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	prop = of_get_property(np, "tx_queue_size", NULL);
274649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (prop)
275649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		pdata.tx_queue_size = *prop;
276649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
277649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	prop = of_get_property(np, "rx_queue_size", NULL);
278649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (prop)
279649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		pdata.rx_queue_size = *prop;
280649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
281649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	prop = of_get_property(np, "tx_sram_addr", NULL);
282649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (prop)
283649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		pdata.tx_sram_addr = *prop;
284649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
285649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	prop = of_get_property(np, "tx_sram_size", NULL);
286649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (prop)
287649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		pdata.tx_sram_size = *prop;
288649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
289649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	prop = of_get_property(np, "rx_sram_addr", NULL);
290649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (prop)
291649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		pdata.rx_sram_addr = *prop;
292649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
293649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	prop = of_get_property(np, "rx_sram_size", NULL);
294649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (prop)
295649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		pdata.rx_sram_size = *prop;
296649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
297649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	ph = of_get_property(np, "phy", NULL);
298649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (!ph)
299649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		return -ENODEV;
300649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
301649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	phy = of_find_node_by_phandle(*ph);
302649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (phy == NULL)
303649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		return -ENODEV;
304649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
305649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	prop = of_get_property(phy, "reg", NULL);
306ac840605f3b1d9b99e1e6629a54994f8e003ff91Lennert Buytenhek	if (prop)
307ac840605f3b1d9b99e1e6629a54994f8e003ff91Lennert Buytenhek		pdata.phy_addr = MV643XX_ETH_PHY_ADDR(*prop);
308649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
309649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	of_node_put(phy);
310649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
311a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	pdev = platform_device_alloc(MV643XX_ETH_NAME, id);
312649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (!pdev)
313649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		return -ENOMEM;
314649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
315e0508b1516ad4423499d4118a9037ae0aa4e9c2fCorey Minyard	pdev->dev.coherent_dma_mask = DMA_BIT_MASK(32);
316649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	err = platform_device_add_resources(pdev, r, 1);
317649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (err)
318649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		goto error;
319649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
320649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
321649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (err)
322649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		goto error;
323649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
324649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	err = platform_device_add(pdev);
325649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	if (err)
326649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth		goto error;
327649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
328649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	return 0;
329649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
330649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnswortherror:
331649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	platform_device_put(pdev);
332649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth	return err;
333649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth}
334649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
33501f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth/*
33601f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth * Create mv64x60_i2c platform devices
33701f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth */
33801f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworthstatic int __init mv64x60_i2c_device_setup(struct device_node *np, int id)
33901f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth{
34001f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	struct resource r[2];
34101f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	struct platform_device *pdev;
34201f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	struct mv64xxx_i2c_pdata pdata;
34301f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	const unsigned int *prop;
34401f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	int err;
34501f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
34601f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	memset(r, 0, sizeof(r));
34701f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
34801f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	err = of_address_to_resource(np, 0, &r[0]);
34901f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	if (err)
35001f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth		return err;
35101f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
35201f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	of_irq_to_resource(np, 0, &r[1]);
35301f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
35401f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	memset(&pdata, 0, sizeof(pdata));
35501f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
3561791f91bc794b7efc90719268146f582b9f29eadMark A. Greer	pdata.freq_m = 8;	/* default */
35701f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	prop = of_get_property(np, "freq_m", NULL);
35821dbfd291fe704986fab63a129f89ed2de471329Remi Machet	if (prop)
35921dbfd291fe704986fab63a129f89ed2de471329Remi Machet		pdata.freq_m = *prop;
36001f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
361ae39573a19e35122bd431a4f5c889823209168c7Nicolas Kaiser	pdata.freq_n = 3;	/* default */
36201f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	prop = of_get_property(np, "freq_n", NULL);
36321dbfd291fe704986fab63a129f89ed2de471329Remi Machet	if (prop)
36421dbfd291fe704986fab63a129f89ed2de471329Remi Machet		pdata.freq_n = *prop;
36501f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
3661791f91bc794b7efc90719268146f582b9f29eadMark A. Greer	pdata.timeout = 1000;				/* default: 1 second */
36701f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
36801f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	pdev = platform_device_alloc(MV64XXX_I2C_CTLR_NAME, id);
36901f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	if (!pdev)
37001f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth		return -ENOMEM;
37101f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
37201f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	err = platform_device_add_resources(pdev, r, 2);
37301f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	if (err)
37401f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth		goto error;
37501f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
37601f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
37701f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	if (err)
37801f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth		goto error;
37901f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
38001f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	err = platform_device_add(pdev);
38101f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	if (err)
38201f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth		goto error;
38301f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
38401f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	return 0;
38501f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
38601f0e78e15c52af480c867af5bd406afec80d9ccDale Farnswortherror:
38701f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	platform_device_put(pdev);
38801f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth	return err;
38901f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth}
39001f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
3917e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth/*
3927e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth * Create mv64x60_wdt platform devices
3937e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth */
3947e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworthstatic int __init mv64x60_wdt_device_setup(struct device_node *np, int id)
3957e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth{
3967e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	struct resource r;
3977e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	struct platform_device *pdev;
3987e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	struct mv64x60_wdt_pdata pdata;
3997e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	const unsigned int *prop;
4007e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	int err;
4017e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4027e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	err = of_address_to_resource(np, 0, &r);
4037e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	if (err)
4047e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth		return err;
4057e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4067e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	memset(&pdata, 0, sizeof(pdata));
4077e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4081791f91bc794b7efc90719268146f582b9f29eadMark A. Greer	pdata.timeout = 10;			/* Default: 10 seconds */
4097e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4107e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	np = of_get_parent(np);
4117e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	if (!np)
4127e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth		return -ENODEV;
4137e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4147e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	prop = of_get_property(np, "clock-frequency", NULL);
4157e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	of_node_put(np);
4167e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	if (!prop)
4177e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth		return -ENODEV;
4187e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	pdata.bus_clk = *prop / 1000000; /* wdt driver wants freq in MHz */
4197e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4207e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	pdev = platform_device_alloc(MV64x60_WDT_NAME, id);
4217e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	if (!pdev)
4227e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth		return -ENOMEM;
4237e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4247e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	err = platform_device_add_resources(pdev, &r, 1);
4257e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	if (err)
4267e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth		goto error;
4277e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4287e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	err = platform_device_add_data(pdev, &pdata, sizeof(pdata));
4297e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	if (err)
4307e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth		goto error;
4317e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4327e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	err = platform_device_add(pdev);
4337e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	if (err)
4347e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth		goto error;
4357e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4367e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	return 0;
4377e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
4387e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnswortherror:
4397e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	platform_device_put(pdev);
4407e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	return err;
4417e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth}
4427e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
44352d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworthstatic int __init mv64x60_device_setup(void)
44452d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth{
445a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	struct device_node *np, *np2;
446a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	struct platform_device *pdev;
447a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	int id, id2;
44852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	int err;
44952d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
45026cb7d8bbddc8338904b8810b860ccf052c761faCyrill Gorcunov	id = 0;
451482c43419fc204b4b658fa4acb80cd502e5fcbacGrant Likely	for_each_compatible_node(np, NULL, "marvell,mv64360-mpsc") {
452ff114b669b45480688198f28d6aad1a61223335dRemi Machet		err = mv64x60_mpsc_device_setup(np, id++);
453ff114b669b45480688198f28d6aad1a61223335dRemi Machet		if (err)
454ff114b669b45480688198f28d6aad1a61223335dRemi Machet			printk(KERN_ERR "Failed to initialize MV64x60 "
455ff114b669b45480688198f28d6aad1a61223335dRemi Machet					"serial device %s: error %d.\n",
456ff114b669b45480688198f28d6aad1a61223335dRemi Machet					np->full_name, err);
457ff114b669b45480688198f28d6aad1a61223335dRemi Machet	}
45852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth
45926cb7d8bbddc8338904b8810b860ccf052c761faCyrill Gorcunov	id = 0;
460a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	id2 = 0;
461a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	for_each_compatible_node(np, NULL, "marvell,mv64360-eth-group") {
462a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth		pdev = mv64x60_eth_register_shared_pdev(np, id++);
463a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth		if (IS_ERR(pdev)) {
464a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth			err = PTR_ERR(pdev);
465ff114b669b45480688198f28d6aad1a61223335dRemi Machet			printk(KERN_ERR "Failed to initialize MV64x60 "
466ff114b669b45480688198f28d6aad1a61223335dRemi Machet					"network block %s: error %d.\n",
467ff114b669b45480688198f28d6aad1a61223335dRemi Machet					np->full_name, err);
468ff114b669b45480688198f28d6aad1a61223335dRemi Machet			continue;
469a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth		}
470a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth		for_each_child_of_node(np, np2) {
471a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth			if (!of_device_is_compatible(np2,
472a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth					"marvell,mv64360-eth"))
473a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth				continue;
474a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth			err = mv64x60_eth_device_setup(np2, id2++, pdev);
475ff114b669b45480688198f28d6aad1a61223335dRemi Machet			if (err)
476ff114b669b45480688198f28d6aad1a61223335dRemi Machet				printk(KERN_ERR "Failed to initialize "
477ff114b669b45480688198f28d6aad1a61223335dRemi Machet						"MV64x60 network device %s: "
478ff114b669b45480688198f28d6aad1a61223335dRemi Machet						"error %d.\n",
479ff114b669b45480688198f28d6aad1a61223335dRemi Machet						np2->full_name, err);
480a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth		}
481a0916bd64a0e6636f0161480e04057c89e90c5daDale Farnsworth	}
482649c8e0289eeee2ab3d4c6c6e062df24dd602233Dale Farnsworth
48326cb7d8bbddc8338904b8810b860ccf052c761faCyrill Gorcunov	id = 0;
484ff114b669b45480688198f28d6aad1a61223335dRemi Machet	for_each_compatible_node(np, "i2c", "marvell,mv64360-i2c") {
485ff114b669b45480688198f28d6aad1a61223335dRemi Machet		err = mv64x60_i2c_device_setup(np, id++);
486ff114b669b45480688198f28d6aad1a61223335dRemi Machet		if (err)
487ff114b669b45480688198f28d6aad1a61223335dRemi Machet			printk(KERN_ERR "Failed to initialize MV64x60 I2C "
488ff114b669b45480688198f28d6aad1a61223335dRemi Machet					"bus %s: error %d.\n",
489ff114b669b45480688198f28d6aad1a61223335dRemi Machet					np->full_name, err);
490ff114b669b45480688198f28d6aad1a61223335dRemi Machet	}
49101f0e78e15c52af480c867af5bd406afec80d9ccDale Farnsworth
4927e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	/* support up to one watchdog timer */
493a1810b44c2d52392cd63e17fc208783cf6be6215Mark A. Greer	np = of_find_compatible_node(np, NULL, "marvell,mv64360-wdt");
4947e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	if (np) {
4957e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth		if ((err = mv64x60_wdt_device_setup(np, id)))
496ff114b669b45480688198f28d6aad1a61223335dRemi Machet			printk(KERN_ERR "Failed to initialize MV64x60 "
497ff114b669b45480688198f28d6aad1a61223335dRemi Machet					"Watchdog %s: error %d.\n",
498ff114b669b45480688198f28d6aad1a61223335dRemi Machet					np->full_name, err);
4997e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth		of_node_put(np);
5007e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth	}
5017e07a15913e2e1fd99fb77c4c848437bd99a8d5fDale Farnsworth
502683307da07afd3a7ee55269ee8cb70c8053b0923Remi Machet	/* Now add every node that is on the device bus */
503683307da07afd3a7ee55269ee8cb70c8053b0923Remi Machet	for_each_compatible_node(np, NULL, "marvell,mv64360")
504683307da07afd3a7ee55269ee8cb70c8053b0923Remi Machet		of_platform_bus_probe(np, of_mv64x60_devices, NULL);
505683307da07afd3a7ee55269ee8cb70c8053b0923Remi Machet
50652d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth	return 0;
50752d3aff903171af13b56c5a4d6fb828461406c65Dale Farnsworth}
50852d3aff903171af13b56c5a4d6fb828461406c65Dale Farnswortharch_initcall(mv64x60_device_setup);
509542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer
510542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greerstatic int __init mv64x60_add_mpsc_console(void)
511542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer{
512542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer	struct device_node *np = NULL;
513542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer	const char *prop;
514542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer
515542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer	prop = of_get_property(of_chosen, "linux,stdout-path", NULL);
516542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer	if (prop == NULL)
517542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer		goto not_mpsc;
518542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer
519542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer	np = of_find_node_by_path(prop);
520542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer	if (!np)
521542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer		goto not_mpsc;
522542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer
523a1810b44c2d52392cd63e17fc208783cf6be6215Mark A. Greer	if (!of_device_is_compatible(np, "marvell,mv64360-mpsc"))
524542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer		goto not_mpsc;
525542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer
5261791f91bc794b7efc90719268146f582b9f29eadMark A. Greer	prop = of_get_property(np, "cell-index", NULL);
527542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer	if (!prop)
528542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer		goto not_mpsc;
529542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer
530542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer	add_preferred_console("ttyMM", *(int *)prop, NULL);
531542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer
532542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greernot_mpsc:
533542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer	return 0;
534542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greer}
535542c98c06712fdbbbfe6b9e92a8d0023cf45102aMark A. Greerconsole_initcall(mv64x60_add_mpsc_console);
536