[PATCH] ep93xx: Add support for Snapper CL15 module

H Hartley Sweeten hartleys at visionengravers.com
Thu Feb 4 16:35:19 EST 2010


On Thursday, February 04, 2010 1:58 PM, Ryan Mallon wrote:
> Add support for the Bluewater Systems Snapper CL15 single board computer
> module.
> 
> Signed-off-by: Ryan Mallon <ryan at bluewatersys.com>
> Cc: Hartley Sweeten <hartleys at visionengravers.com>
> 
> ---
> 
> diff --git a/arch/arm/mach-ep93xx/Kconfig b/arch/arm/mach-ep93xx/Kconfig
> index 9167c3d..71eabca 100644
> --- a/arch/arm/mach-ep93xx/Kconfig
> +++ b/arch/arm/mach-ep93xx/Kconfig
> @@ -168,6 +168,13 @@ config MACH_TS72XX
>  	  Say 'Y' here if you want your kernel to support the
>  	  Technologic Systems TS-72xx board.
>  
> +config MACH_SNAPPER_CL15
> +	bool "Support Bluewater Systems Snapper CL15 Module"
> +	depends on EP93XX_SDCE0_PHYS_OFFSET
> +	help
> +	  Say 'Y' here if you want your kernel to support the Bluewater
> +	  Systems Snapper CL15 Module.
> +

Your will need to base this patch on Russell's -devel tree.  The Sim.One
board is now in that.

Also, please move this so that they stay alphabetized:

config MACH_SIM_ONE
...
+config MACH_SNAPPER_CL15
+...
config MACH_TS72XX
...

>  choice
>  	prompt "Select a UART for early kernel messages"
> diff --git a/arch/arm/mach-ep93xx/Makefile b/arch/arm/mach-ep93xx/Makefile
> index eae6199..41e5d85 100644
> --- a/arch/arm/mach-ep93xx/Makefile
> +++ b/arch/arm/mach-ep93xx/Makefile
> @@ -11,3 +11,4 @@ obj-$(CONFIG_MACH_EDB93XX)	+= edb93xx.o
>  obj-$(CONFIG_MACH_GESBC9312)	+= gesbc9312.o
>  obj-$(CONFIG_MACH_MICRO9)	+= micro9.o
>  obj-$(CONFIG_MACH_TS72XX)	+= ts72xx.o
> +obj-$(CONFIG_MACH_SNAPPER_CL15)	+= snappercl15.o

Ditto.

> diff --git a/arch/arm/mach-ep93xx/snappercl15.c b/arch/arm/mach-ep93xx/snappercl15.c
> new file mode 100644
> index 0000000..2805f4d
> --- /dev/null
> +++ b/arch/arm/mach-ep93xx/snappercl15.c
> @@ -0,0 +1,185 @@
> +/*
> + * arch/arm/mach-ep93xx/snappercl15.c
> + * Bluewater Systems Snapper CL15 system module
> + *
> + * Copyright (C) 2009 Bluewater Systems Ltd
> + * Author: Ryan Mallon <ryan at bluewatersys.com>
> + *
> + * NAND code adapted from driver by:
> + *   Andre Renaud <andre at bluewatersys.com>
> + *   James R. McKaskill
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or (at
> + * your option) any later version.
> + *
> + */
> +
> +#include <linux/platform_device.h>
> +#include <linux/kernel.h>
> +#include <linux/init.h>

#include <linux/io.h>

Should be here since you are using __raw_{read/write}w

> +#include <linux/gpio.h>
> +#include <linux/i2c.h>
> +#include <linux/i2c-gpio.h>
> +#include <linux/fb.h>
> +
> +#include <linux/mtd/partitions.h>
> +#include <linux/mtd/nand.h>
> +
> +#include <mach/hardware.h>
> +#include <mach/fb.h>
> +
> +#include <asm/mach-types.h>
> +#include <asm/mach/arch.h>
> +
> +#define SNAPPERCL15_NAND_BASE	(EP93XX_CS7_PHYS_BASE + 0x01000000)

Maybe use SZ_16M?  Your call.

> +
> +#define SNAPPERCL15_NAND_CTRL	(1 << 6)
> +#define SNAPPERCL15_NAND_WPN	(1 << 8)
> +#define SNAPPERCL15_NAND_ALE	(1 << 9)
> +#define SNAPPERCL15_NAND_CLE	(1 << 10)
> +#define SNAPPERCL15_NAND_CEN	(1 << 11)
> +#define SNAPPERCL15_NAND_RDY	(1 << 14)
> +
> +#define NAND_CTRL_ADDR(chip)						\
> +	((void __iomem *)((unsigned long)chip->IO_ADDR_W + 0x40))

The cast is probably not needed. IO_ADDR_W is already a void __iomem * and
adding to it should not require the cast.

> +
> +static unsigned long nand_state;
> +
> +static void snappercl15_nand_cmd_ctrl(struct mtd_info *mtd, int cmd,
> +				      unsigned int ctrl)
> +{
> +	struct nand_chip *chip = mtd->priv;
> +	static int first = 1;
> +	unsigned set;
> +
> +	if (first) {
> +		nand_state = SNAPPERCL15_NAND_CEN | SNAPPERCL15_NAND_WPN;
> +		__raw_writew(nand_state, NAND_CTRL_ADDR(chip));
> +		first = 0;
> +	}
> +
> +	if (ctrl & NAND_CTRL_CHANGE) {
> +		set = SNAPPERCL15_NAND_CEN;
> +
> +		if (ctrl & NAND_NCE)
> +			set &= ~SNAPPERCL15_NAND_CEN;
> +		if (ctrl & NAND_CLE)
> +			set |= SNAPPERCL15_NAND_CLE;
> +		if (ctrl & NAND_ALE)
> +			set |= SNAPPERCL15_NAND_ALE;
> +
> +		nand_state &= ~(SNAPPERCL15_NAND_CEN |
> +				SNAPPERCL15_NAND_CLE |
> +				SNAPPERCL15_NAND_ALE);
> +		nand_state |= set;
> +		__raw_writew(nand_state, NAND_CTRL_ADDR(chip));
> +	}
> +
> +	if (cmd != NAND_CMD_NONE)
> +		__raw_writew((cmd & 0xff) | nand_state, chip->IO_ADDR_W);
> +}
> +

Interesting... Is your nand connected thru a fpga or something?

> +static int snappercl15_nand_dev_ready(struct mtd_info *mtd)
> +{
> +	struct nand_chip *chip = mtd->priv;
> +
> +	return !!(__raw_readw(NAND_CTRL_ADDR(chip)) & SNAPPERCL15_NAND_RDY);
> +}
> +
> +static struct mtd_partition snappercl15_nand_partitions[] = {
> +	{
> +		.name		= "Kernel",
> +		.offset		= 0,
> +		.size		= SZ_2M,
> +	},
> +	{
> +		.name		= "Filesystem",
> +		.offset		= MTDPART_OFS_APPEND,
> +		.size		= MTDPART_SIZ_FULL,
> +	},
> +};
> +
> +static void snappercl15_nand_set_parts(uint64_t size,
> +				       struct platform_nand_chip *chip)
> +{
> +	pr_info("Snapper CL15: %llu bytes NAND\n", size);

You only have one pr_<level> right now but you might consider defining a
pr_fmt to prefix the "Snapper CL15: ".  Then you don't have to worry about
adding it to any pr_<level> output later.  Just put this before the #include's:

#define pr_fmt(fmt) "Snapper CL15: " fmt

Your could also use the following but the prefix will be "snappercl15: "

#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt

> +	chip->partitions = snappercl15_nand_partitions;
> +	chip->nr_partitions = ARRAY_SIZE(snappercl15_nand_partitions);
> +}
> +
> +static struct platform_nand_data snappercl15_nand_data = {
> +	.chip = {
> +		.nr_chips	= 1,
> +		.set_parts	= snappercl15_nand_set_parts,
> +		.options	= NAND_NO_AUTOINCR,
> +		.chip_delay	= 25,
> +	},
> +	.ctrl = {
> +		.dev_ready	= snappercl15_nand_dev_ready,
> +		.cmd_ctrl	= snappercl15_nand_cmd_ctrl,
> +	},
> +};
> +
> +static struct resource snappercl15_nand_resource[] = {
> +	{
> +		.start		= SNAPPERCL15_NAND_BASE,
> +		.end		= SNAPPERCL15_NAND_BASE + SZ_4K - 1,
> +		.flags		= IORESOURCE_MEM,
> +	},
> +};
> +
> +static struct platform_device snappercl15_nand_device = {
> +	.name			= "gen_nand",
> +	.id			= -1,
> +	.dev.platform_data	= &snappercl15_nand_data,
> +	.resource		= snappercl15_nand_resource,
> +	.num_resources		= ARRAY_SIZE(snappercl15_nand_resource),
> +};
> +
> +static struct ep93xx_eth_data snappercl15_eth_data = {
> +	.phy_id			= 1,
> +};
> +
> +static struct i2c_gpio_platform_data snappercl15_i2c_gpio_data = {
> +	.sda_pin		= EP93XX_GPIO_LINE_EEDAT,
> +	.sda_is_open_drain	= 0,
> +	.scl_pin		= EP93XX_GPIO_LINE_EECLK,
> +	.scl_is_open_drain	= 0,
> +	.udelay			= 0,
> +	.timeout		= 0,
> +};
> +
> +static struct i2c_board_info __initdata snappercl15_i2c_data[] = {
> +	{
> +		/* Audio codec */
> +		I2C_BOARD_INFO("tlv320aic23", 0x1a),
> +	},
> +};

Are you going to add the audio support later?

> +
> +static struct ep93xxfb_mach_info snappercl15_fb_info = {
> +	.num_modes		= EP93XXFB_USE_MODEDB,
> +	.bpp			= 16,
> +};
> +
> +static void __init snappercl15_init_machine(void)
> +{
> +	ep93xx_init_devices();
> +	ep93xx_register_eth(&snappercl15_eth_data, 1);
> +	ep93xx_register_i2c(&snappercl15_i2c_gpio_data, snappercl15_i2c_data,
> +			    ARRAY_SIZE(snappercl15_i2c_data));
> +	ep93xx_register_fb(&snappercl15_fb_info);
> +	platform_device_register(&snappercl15_nand_device);
> +}
> +
> +MACHINE_START(SNAPPER_CL15, "Bluewater Systems Snapper CL15")
> +	/* Maintainer: Ryan Mallon <ryan at bluewatersys.com> */
> +	.phys_io	= EP93XX_APB_PHYS_BASE,
> +	.io_pg_offst	= ((EP93XX_APB_VIRT_BASE) >> 18) & 0xfffc,
> +	.boot_params	= EP93XX_SDCE0_PHYS_BASE + 0x100,
> +	.map_io		= ep93xx_map_io,
> +	.init_irq	= ep93xx_init_irq,
> +	.timer 		= &ep93xx_timer,
> +	.init_machine	= snappercl15_init_machine,
> +MACHINE_END

Looks good other than that.

Regards,
Hartley



More information about the linux-arm-kernel mailing list