Skip to content

Commit

Permalink
[ARM] 5128/1: tc6393xb: tmio-nand support
Browse files Browse the repository at this point in the history
Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
  • Loading branch information
Dmitry Baryshkov authored and Russell King committed Jul 7, 2008
1 parent aa613de commit f024ff1
Show file tree
Hide file tree
Showing 4 changed files with 83 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/mfd/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ config HTC_PASIC3
config MFD_TC6393XB
bool "Support Toshiba TC6393XB"
depends on HAVE_GPIO_LIB
select MFD_CORE
help
Support for Toshiba Mobile IO Controller TC6393XB

Expand Down
63 changes: 63 additions & 0 deletions drivers/mfd/tc6393xb.c
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,8 @@
#include <linux/platform_device.h>
#include <linux/fb.h>
#include <linux/clk.h>
#include <linux/mfd/core.h>
#include <linux/mfd/tmio.h>
#include <linux/mfd/tc6393xb.h>
#include <linux/gpio.h>

Expand Down Expand Up @@ -108,6 +110,59 @@ struct tc6393xb {
int irq_base;
};

enum {
TC6393XB_CELL_NAND,
};

/*--------------------------------------------------------------------------*/

static int tc6393xb_nand_enable(struct platform_device *nand)
{
struct platform_device *dev = to_platform_device(nand->dev.parent);
struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
unsigned long flags;

spin_lock_irqsave(&tc6393xb->lock, flags);

/* SMD buffer on */
dev_dbg(&dev->dev, "SMD buffer on\n");
iowrite8(0xff, tc6393xb->scr + SCR_GPI_BCR(1));

spin_unlock_irqrestore(&tc6393xb->lock, flags);

return 0;
}

static struct resource __devinitdata tc6393xb_nand_resources[] = {
{
.name = TMIO_NAND_CONFIG,
.start = 0x0100,
.end = 0x01ff,
.flags = IORESOURCE_MEM,
},
{
.name = TMIO_NAND_CONTROL,
.start = 0x1000,
.end = 0x1007,
.flags = IORESOURCE_MEM,
},
{
.name = TMIO_NAND_IRQ,
.start = IRQ_TC6393_NAND,
.end = IRQ_TC6393_NAND,
.flags = IORESOURCE_IRQ,
},
};

static struct mfd_cell __devinitdata tc6393xb_cells[] = {
[TC6393XB_CELL_NAND] = {
.name = "tmio-nand",
.enable = tc6393xb_nand_enable,
.num_resources = ARRAY_SIZE(tc6393xb_nand_resources),
.resources = tc6393xb_nand_resources,
},
};

/*--------------------------------------------------------------------------*/

static int tc6393xb_gpio_get(struct gpio_chip *chip,
Expand Down Expand Up @@ -410,6 +465,12 @@ static int __devinit tc6393xb_probe(struct platform_device *dev)
if (tc6393xb->irq)
tc6393xb_attach_irq(dev);

tc6393xb_cells[TC6393XB_CELL_NAND].driver_data = tcpd->nand_data;

retval = mfd_add_devices(dev,
tc6393xb_cells, ARRAY_SIZE(tc6393xb_cells),
iomem, tcpd->irq_base);

return 0;

if (tc6393xb->irq)
Expand Down Expand Up @@ -440,6 +501,8 @@ static int __devexit tc6393xb_remove(struct platform_device *dev)
struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
int ret;

mfd_remove_devices(dev);

if (tc6393xb->irq)
tc6393xb_detach_irq(dev);

Expand Down
2 changes: 2 additions & 0 deletions include/linux/mfd/tc6393xb.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@ struct tc6393xb_platform_data {

int irq_base; /* a base for cascaded irq */
int gpio_base;

struct tmio_nand_data *nand_data;
};

/*
Expand Down
17 changes: 17 additions & 0 deletions include/linux/mfd/tmio.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#ifndef MFD_TMIO_H
#define MFD_TMIO_H

/*
* data for the NAND controller
*/
struct tmio_nand_data {
struct nand_bbt_descr *badblock_pattern;
struct mtd_partition *partition;
unsigned int num_partitions;
};

#define TMIO_NAND_CONFIG "tmio-nand-config"
#define TMIO_NAND_CONTROL "tmio-nand-control"
#define TMIO_NAND_IRQ "tmio-nand"

#endif

0 comments on commit f024ff1

Please sign in to comment.