pcmcia: CompactFlash driver for PA Semi Electra boards
Driver for the CompactFlash slot on the PA Semi Electra eval board. It's a simple device sitting on localbus, with interrupts and detect/voltage control over GPIO. The driver is implemented as an of_platform driver, and adds localbus as a bus being probed by the of_platform framework. [akpm@linux-foundation.org: cleanups] [olof@lixom.net: fix build] Signed-off-by: Olof Johansson <olof@lixom.net> Cc: Christoph Hellwig <hch@infradead.org> Cc: Milton Miller <miltonm@bga.com> Cc: Kumar Gala <galak@gate.crashing.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Dominik Brodowski <linux@dominikbrodowski.net> Signed-off-by: Olof Johansson <olof@lixom.net> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
This commit is contained in:
committed by
Linus Torvalds
parent
4975e45ff6
commit
2b571a066a
@@ -37,6 +37,10 @@
|
||||
#include <asm/time.h>
|
||||
#include <asm/of_platform.h>
|
||||
|
||||
#include <pcmcia/ss.h>
|
||||
#include <pcmcia/cistpl.h>
|
||||
#include <pcmcia/ds.h>
|
||||
|
||||
#include "pasemi.h"
|
||||
|
||||
/* SDC reset register, must be pre-mapped at reset time */
|
||||
@@ -308,7 +312,57 @@ static void __init pas_init_early(void)
|
||||
iommu_init_early_pasemi();
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PCMCIA
|
||||
static int pcmcia_notify(struct notifier_block *nb, unsigned long action,
|
||||
void *data)
|
||||
{
|
||||
struct device *dev = data;
|
||||
struct device *parent;
|
||||
struct pcmcia_device *pdev = to_pcmcia_dev(dev);
|
||||
|
||||
/* We are only intereted in device addition */
|
||||
if (action != BUS_NOTIFY_ADD_DEVICE)
|
||||
return 0;
|
||||
|
||||
parent = pdev->socket->dev.parent;
|
||||
|
||||
/* We know electra_cf devices will always have of_node set, since
|
||||
* electra_cf is an of_platform driver.
|
||||
*/
|
||||
if (!parent->archdata.of_node)
|
||||
return 0;
|
||||
|
||||
if (!of_device_is_compatible(parent->archdata.of_node, "electra-cf"))
|
||||
return 0;
|
||||
|
||||
/* We use the direct ops for localbus */
|
||||
dev->archdata.dma_ops = &dma_direct_ops;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct notifier_block pcmcia_notifier = {
|
||||
.notifier_call = pcmcia_notify,
|
||||
};
|
||||
|
||||
static inline void pasemi_pcmcia_init(void)
|
||||
{
|
||||
extern struct bus_type pcmcia_bus_type;
|
||||
|
||||
bus_register_notifier(&pcmcia_bus_type, &pcmcia_notifier);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline void pasemi_pcmcia_init(void)
|
||||
{
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
static struct of_device_id pasemi_bus_ids[] = {
|
||||
{ .type = "localbus", },
|
||||
{ .type = "sdc", },
|
||||
{},
|
||||
};
|
||||
@@ -318,6 +372,8 @@ static int __init pasemi_publish_devices(void)
|
||||
if (!machine_is(pasemi))
|
||||
return 0;
|
||||
|
||||
pasemi_pcmcia_init();
|
||||
|
||||
/* Publish OF platform devices for SDC and other non-PCI devices */
|
||||
of_platform_bus_probe(NULL, pasemi_bus_ids, NULL);
|
||||
|
||||
|
Reference in New Issue
Block a user