[ARM] 5128/1: tc6393xb: tmio-nand support
Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com> Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
This commit is contained in:
Родитель
aa613de676
Коммит
f024ff10b1
|
@ -45,6 +45,7 @@ config HTC_PASIC3
|
||||||
config MFD_TC6393XB
|
config MFD_TC6393XB
|
||||||
bool "Support Toshiba TC6393XB"
|
bool "Support Toshiba TC6393XB"
|
||||||
depends on HAVE_GPIO_LIB
|
depends on HAVE_GPIO_LIB
|
||||||
|
select MFD_CORE
|
||||||
help
|
help
|
||||||
Support for Toshiba Mobile IO Controller TC6393XB
|
Support for Toshiba Mobile IO Controller TC6393XB
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,8 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/fb.h>
|
#include <linux/fb.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
#include <linux/mfd/core.h>
|
||||||
|
#include <linux/mfd/tmio.h>
|
||||||
#include <linux/mfd/tc6393xb.h>
|
#include <linux/mfd/tc6393xb.h>
|
||||||
#include <linux/gpio.h>
|
#include <linux/gpio.h>
|
||||||
|
|
||||||
|
@ -108,6 +110,59 @@ struct tc6393xb {
|
||||||
int irq_base;
|
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,
|
static int tc6393xb_gpio_get(struct gpio_chip *chip,
|
||||||
|
@ -410,6 +465,12 @@ static int __devinit tc6393xb_probe(struct platform_device *dev)
|
||||||
if (tc6393xb->irq)
|
if (tc6393xb->irq)
|
||||||
tc6393xb_attach_irq(dev);
|
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;
|
return 0;
|
||||||
|
|
||||||
if (tc6393xb->irq)
|
if (tc6393xb->irq)
|
||||||
|
@ -440,6 +501,8 @@ static int __devexit tc6393xb_remove(struct platform_device *dev)
|
||||||
struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
|
struct tc6393xb *tc6393xb = platform_get_drvdata(dev);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
mfd_remove_devices(dev);
|
||||||
|
|
||||||
if (tc6393xb->irq)
|
if (tc6393xb->irq)
|
||||||
tc6393xb_detach_irq(dev);
|
tc6393xb_detach_irq(dev);
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,8 @@ struct tc6393xb_platform_data {
|
||||||
|
|
||||||
int irq_base; /* a base for cascaded irq */
|
int irq_base; /* a base for cascaded irq */
|
||||||
int gpio_base;
|
int gpio_base;
|
||||||
|
|
||||||
|
struct tmio_nand_data *nand_data;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -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
|
Загрузка…
Ссылка в новой задаче