of_platform.h 3.6 KB
Newer Older
S
Stephen Rothwell 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13
#ifndef _LINUX_OF_PLATFORM_H
#define _LINUX_OF_PLATFORM_H
/*
 *    Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
 *			 <benh@kernel.crashing.org>
 *
 *  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.
 *
 */

14
#ifdef CONFIG_OF_DEVICE
S
Stephen Rothwell 已提交
15 16 17 18 19
#include <linux/module.h>
#include <linux/device.h>
#include <linux/mod_devicetable.h>
#include <linux/pm.h>
#include <linux/of_device.h>
20
#include <linux/platform_device.h>
S
Stephen Rothwell 已提交
21

22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
/**
 * struct of_dev_auxdata - lookup table entry for device names & platform_data
 * @compatible: compatible value of node to match against node
 * @phys_addr: Start address of registers to match against node
 * @name: Name to assign for matching nodes
 * @platform_data: platform_data to assign for matching nodes
 *
 * This lookup table allows the caller of of_platform_populate() to override
 * the names of devices when creating devices from the device tree.  The table
 * should be terminated with an empty entry.  It also allows the platform_data
 * pointer to be set.
 *
 * The reason for this functionality is that some Linux infrastructure uses
 * the device name to look up a specific device, but the Linux-specific names
 * are not encoded into the device tree, so the kernel needs to provide specific
 * values.
 *
 * Note: Using an auxdata lookup table should be considered a last resort when
 * converting a platform to use the DT.  Normally the automatically generated
 * device name will not matter, and drivers should obtain data from the device
 * node instead of from an anonymouns platform_data pointer.
 */
struct of_dev_auxdata {
	char *compatible;
	resource_size_t phys_addr;
	char *name;
	void *platform_data;
};

/* Macro to simplify populating a lookup table */
#define OF_DEV_AUXDATA(_compat,_phys,_name,_pdata) \
	{ .compatible = _compat, .phys_addr = _phys, .name = _name, \
	  .platform_data = _pdata }

56 57 58 59
/**
 * of_platform_driver - Legacy of-aware driver for platform devices.
 *
 * An of_platform_driver driver is attached to a basic platform_device on
60
 * the ibm ebus (ibmebus_bus_type).
S
Stephen Rothwell 已提交
61 62 63
 */
struct of_platform_driver
{
64
	int	(*probe)(struct platform_device* dev,
S
Stephen Rothwell 已提交
65
			 const struct of_device_id *match);
66
	int	(*remove)(struct platform_device* dev);
S
Stephen Rothwell 已提交
67

68 69 70
	int	(*suspend)(struct platform_device* dev, pm_message_t state);
	int	(*resume)(struct platform_device* dev);
	int	(*shutdown)(struct platform_device* dev);
S
Stephen Rothwell 已提交
71 72 73 74 75 76

	struct device_driver	driver;
};
#define	to_of_platform_driver(drv) \
	container_of(drv,struct of_platform_driver, driver)

77 78
extern const struct of_device_id of_default_bus_match_table[];

79
/* Platform drivers register/unregister */
80
extern struct platform_device *of_device_alloc(struct device_node *np,
81 82
					 const char *bus_id,
					 struct device *parent);
83
extern struct platform_device *of_find_device_by_node(struct device_node *np);
S
Stephen Rothwell 已提交
84

85 86
#if !defined(CONFIG_SPARC) /* SPARC has its own device registration method */
/* Platform devices and busses creation */
87
extern struct platform_device *of_platform_device_create(struct device_node *np,
88 89 90 91 92 93
						   const char *bus_id,
						   struct device *parent);

extern int of_platform_bus_probe(struct device_node *root,
				 const struct of_device_id *matches,
				 struct device *parent);
94 95
extern int of_platform_populate(struct device_node *root,
				const struct of_device_id *matches,
96
				const struct of_dev_auxdata *lookup,
97
				struct device *parent);
98 99
#endif /* !CONFIG_SPARC */

100
#endif /* CONFIG_OF_DEVICE */
S
Stephen Rothwell 已提交
101

S
Stephen Rothwell 已提交
102
#endif	/* _LINUX_OF_PLATFORM_H */