From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jason Cooper Subject: [PATCH 1/5 v2] ARM: kirkwood: covert orion-spi to fdt. Date: Fri, 2 Mar 2012 17:50:18 +0000 Message-ID: References: Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Return-path: In-Reply-To: In-Reply-To: References: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: devicetree-discuss-bounces+gldd-devicetree-discuss=m.gmane.org-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org Sender: devicetree-discuss-bounces+gldd-devicetree-discuss=m.gmane.org-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org To: arnd-r2nGTMty4D4@public.gmane.org, grant.likely-s3s/WqlpOiPyB63q8FvJNQ@public.gmane.org Cc: devicetree-discuss-uLR06cmDAlY/bJ5BZ2RsiQ@public.gmane.org, Jason Cooper , linux-arm-kernel-IAPFreCvJWM7uuMidbF8XUB+6BGkLq7r@public.gmane.org List-Id: devicetree@vger.kernel.org On the Globalscale Dreamplug (Marvell Kirkwood Development Platform), 2MB of NOR flash are used to hold the bootloader, bootloader environment, and devicetree blob. It is connected via spi. Signed-off-by: Jason Cooper --- Changes from v1: - used of_match_ptr() as suggested by Grant Likely arch/arm/boot/dts/kirkwood-dreamplug.dts | 34 +++++++++++++++++++++++++ arch/arm/mach-kirkwood/board-dt.c | 40 ------------------------------ arch/arm/mach-kirkwood/common.c | 11 ++++++++ drivers/spi/spi-orion.c | 37 ++++++++++++++++++++++++--- 4 files changed, 78 insertions(+), 44 deletions(-) diff --git a/arch/arm/boot/dts/kirkwood-dreamplug.dts b/arch/arm/boot/dts/kirkwood-dreamplug.dts index 8a5dff8..bdf2ddc 100644 --- a/arch/arm/boot/dts/kirkwood-dreamplug.dts +++ b/arch/arm/boot/dts/kirkwood-dreamplug.dts @@ -22,4 +22,38 @@ interrupts = <33>; clock-frequency = <200000000>; }; + + spi@f1010600 { + #address-cells = <1>; + #size-cells = <0>; + + compatible = "marvell,orion-spi"; + reg = <0xf1010600 0x1ff>; + clock-frequency = <200000000>; + + flash@0 { + #address-cells = <1>; + #size-cells = <1>; + + compatible = "macronix,mx25l1606e", "jedec-flash"; + + spi-max-frequency = <50000000>; + reg = <0>; + + partition@0 { + label = "U-Boot"; + reg = <0x0 0x100000>; + }; + + partition@100000 { + label = "U-Boot Environment"; + reg = <0x100000 0x080000>; + }; + + partition@180000 { + label = "Flattened Device Tree"; + reg = <0x180000 0x080000>; + }; + }; + }; }; diff --git a/arch/arm/mach-kirkwood/board-dt.c b/arch/arm/mach-kirkwood/board-dt.c index fbe6405..4960e63 100644 --- a/arch/arm/mach-kirkwood/board-dt.c +++ b/arch/arm/mach-kirkwood/board-dt.c @@ -39,42 +39,6 @@ static struct of_device_id kirkwood_dt_match_table[] __initdata = { { } }; -struct mtd_partition dreamplug_partitions[] = { - { - .name = "u-boot", - .size = SZ_512K, - .offset = 0, - }, - { - .name = "u-boot env", - .size = SZ_64K, - .offset = SZ_512K + SZ_512K, - }, - { - .name = "dtb", - .size = SZ_64K, - .offset = SZ_512K + SZ_512K + SZ_512K, - }, -}; - -static const struct flash_platform_data dreamplug_spi_slave_data = { - .type = "mx25l1606e", - .name = "spi_flash", - .parts = dreamplug_partitions, - .nr_parts = ARRAY_SIZE(dreamplug_partitions), -}; - -static struct spi_board_info __initdata dreamplug_spi_slave_info[] = { - { - .modalias = "m25p80", - .platform_data = &dreamplug_spi_slave_data, - .irq = -1, - .max_speed_hz = 50000000, - .bus_num = 0, - .chip_select = 0, - }, -}; - static struct mv643xx_eth_platform_data dreamplug_ge00_data = { .phy_addr = MV643XX_ETH_PHY_ADDR(0), }; @@ -140,10 +104,6 @@ static void __init dreamplug_init(void) */ kirkwood_mpp_conf(dreamplug_mpp_config); - spi_register_board_info(dreamplug_spi_slave_info, - ARRAY_SIZE(dreamplug_spi_slave_info)); - kirkwood_spi_init(); - kirkwood_ehci_init(); kirkwood_ge00_init(&dreamplug_ge00_data); kirkwood_ge01_init(&dreamplug_ge01_data); diff --git a/arch/arm/mach-kirkwood/common.c b/arch/arm/mach-kirkwood/common.c index cc15426..357fcde 100644 --- a/arch/arm/mach-kirkwood/common.c +++ b/arch/arm/mach-kirkwood/common.c @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include @@ -481,6 +482,9 @@ static int __init kirkwood_clock_gate(void) { unsigned int curr = readl(CLOCK_GATING_CTRL); u32 dev, rev; +#ifdef CONFIG_OF + struct device_node *dp; +#endif kirkwood_pcie_id(&dev, &rev); printk(KERN_DEBUG "Gating clock of unused units\n"); @@ -524,6 +528,13 @@ static int __init kirkwood_clock_gate(void) } else /* keep this bit set for devices that don't have PCIe1 */ kirkwood_clk_ctrl |= CGC_PEX1; +#ifdef CONFIG_OF + dp = of_find_node_by_path("/"); + if (dp && of_device_is_available(of_find_compatible_node(dp, NULL, + "marvell,orion-spi"))) + kirkwood_clk_ctrl |= CGC_RUNIT; +#endif + /* Now gate clock the required units */ writel(kirkwood_clk_ctrl, CLOCK_GATING_CTRL); printk(KERN_DEBUG " after: 0x%08x\n", readl(CLOCK_GATING_CTRL)); diff --git a/drivers/spi/spi-orion.c b/drivers/spi/spi-orion.c index 13448c8..acfb240 100644 --- a/drivers/spi/spi-orion.c +++ b/drivers/spi/spi-orion.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #define DRIVER_NAME "orion_spi" @@ -45,6 +46,8 @@ struct orion_spi { void __iomem *base; unsigned int max_speed; unsigned int min_speed; + unsigned int tclk; + unsigned int clock_fix; struct orion_spi_info *spi_info; }; @@ -104,7 +107,7 @@ static int orion_spi_baudrate_set(struct spi_device *spi, unsigned int speed) orion_spi = spi_master_get_devdata(spi->master); - tclk_hz = orion_spi->spi_info->tclk; + tclk_hz = orion_spi->tclk; /* * the supported rates are: 4,6,8...30 @@ -360,7 +363,7 @@ static int orion_spi_setup(struct spi_device *spi) orion_spi = spi_master_get_devdata(spi->master); /* Fix ac timing if required. */ - if (orion_spi->spi_info->enable_clock_fix) + if (orion_spi->clock_fix) orion_spi_setbits(orion_spi, ORION_SPI_IF_CONFIG_REG, (1 << 14)); @@ -474,6 +477,7 @@ static int __init orion_spi_probe(struct platform_device *pdev) master->setup = orion_spi_setup; master->transfer = orion_spi_transfer; master->num_chipselect = ORION_NUM_CHIPSELECTS; + master->dev.of_node = pdev->dev.of_node; dev_set_drvdata(&pdev->dev, master); @@ -481,8 +485,26 @@ static int __init orion_spi_probe(struct platform_device *pdev) spi->master = master; spi->spi_info = spi_info; - spi->max_speed = DIV_ROUND_UP(spi_info->tclk, 4); - spi->min_speed = DIV_ROUND_UP(spi_info->tclk, 30); + if (spi_info) + spi->tclk = spi_info->tclk; + + of_property_read_u32(master->dev.of_node, + "clock-frequency", &spi->tclk); + + if (!spi->tclk) { + dev_err(&pdev->dev, "cannot set clock rate\n"); + status = -EINVAL; + goto out; + } + + spi->max_speed = DIV_ROUND_UP(spi->tclk, 4); + spi->min_speed = DIV_ROUND_UP(spi->tclk, 30); + + if (spi_info) + spi->clock_fix = spi_info->enable_clock_fix; + + if (of_find_property(master->dev.of_node, "spi-clock-fix", NULL)) + spi->clock_fix = 1; r = platform_get_resource(pdev, IORESOURCE_MEM, 0); if (r == NULL) { @@ -541,10 +563,17 @@ static int __exit orion_spi_remove(struct platform_device *pdev) MODULE_ALIAS("platform:" DRIVER_NAME); +static struct of_device_id spi_orion_of_match_table[] __devinitdata = { + { .compatible = "marvell,orion-spi", }, + {} +}; +MODULE_DEVICE_TABLE(of, spi_orion_of_match_table); + static struct platform_driver orion_spi_driver = { .driver = { .name = DRIVER_NAME, .owner = THIS_MODULE, + .of_match_table = of_match_ptr(spi_orion_of_match_table), }, .remove = __exit_p(orion_spi_remove), }; -- 1.7.3.4