platform_device.h 4.2 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/*
 * platform_device.h - generic, centralized driver model
 *
 * Copyright (c) 2001-2003 Patrick Mochel <mochel@osdl.org>
 *
 * This file is released under the GPLv2
 *
 * See Documentation/driver-model/ for more information.
 */

#ifndef _PLATFORM_DEVICE_H_
#define _PLATFORM_DEVICE_H_

#include <linux/device.h>
15
#include <linux/mod_devicetable.h>
16 17 18

struct platform_device {
	const char	* name;
19
	int		id;
20 21 22
	struct device	dev;
	u32		num_resources;
	struct resource	* resource;
23 24

	struct platform_device_id	*id_entry;
25 26
};

27 28
#define platform_get_device_id(pdev)	((pdev)->id_entry)

29 30 31 32 33 34 35 36 37 38
#define to_platform_device(x) container_of((x), struct platform_device, dev)

extern int platform_device_register(struct platform_device *);
extern void platform_device_unregister(struct platform_device *);

extern struct bus_type platform_bus_type;
extern struct device platform_bus;

extern struct resource *platform_get_resource(struct platform_device *, unsigned int, unsigned int);
extern int platform_get_irq(struct platform_device *, unsigned int);
39 40
extern struct resource *platform_get_resource_byname(struct platform_device *, unsigned int, const char *);
extern int platform_get_irq_byname(struct platform_device *, const char *);
41 42
extern int platform_add_devices(struct platform_device **, int);

43
extern struct platform_device *platform_device_register_simple(const char *, int id,
44
					struct resource *, unsigned int);
45 46
extern struct platform_device *platform_device_register_data(struct device *,
		const char *, int, const void *, size_t);
47

48
extern struct platform_device *platform_device_alloc(const char *name, int id);
49
extern int platform_device_add_resources(struct platform_device *pdev, struct resource *res, unsigned int num);
50
extern int platform_device_add_data(struct platform_device *pdev, const void *data, size_t size);
51
extern int platform_device_add(struct platform_device *pdev);
52
extern void platform_device_del(struct platform_device *pdev);
53 54
extern void platform_device_put(struct platform_device *pdev);

R
Russell King 已提交
55 56 57 58 59
struct platform_driver {
	int (*probe)(struct platform_device *);
	int (*remove)(struct platform_device *);
	void (*shutdown)(struct platform_device *);
	int (*suspend)(struct platform_device *, pm_message_t state);
60 61
	int (*suspend_late)(struct platform_device *, pm_message_t state);
	int (*resume_early)(struct platform_device *);
R
Russell King 已提交
62 63
	int (*resume)(struct platform_device *);
	struct device_driver driver;
64
	struct platform_device_id *id_table;
R
Russell King 已提交
65 66 67 68 69
};

extern int platform_driver_register(struct platform_driver *);
extern void platform_driver_unregister(struct platform_driver *);

70 71 72 73 74 75
/* non-hotpluggable platform devices may use this so that probe() and
 * its support may live in __init sections, conserving runtime memory.
 */
extern int platform_driver_probe(struct platform_driver *driver,
		int (*probe)(struct platform_device *));

R
Russell King 已提交
76 77 78
#define platform_get_drvdata(_dev)	dev_get_drvdata(&(_dev)->dev)
#define platform_set_drvdata(_dev,data)	dev_set_drvdata(&(_dev)->dev, (data))

M
Magnus Damm 已提交
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
/* early platform driver interface */
struct early_platform_driver {
	const char *class_str;
	struct platform_driver *pdrv;
	struct list_head list;
	int requested_id;
};

#define EARLY_PLATFORM_ID_UNSET -2
#define EARLY_PLATFORM_ID_ERROR -3

extern int early_platform_driver_register(struct early_platform_driver *epdrv,
					  char *buf);
extern void early_platform_add_devices(struct platform_device **devs, int num);

static inline int is_early_platform_device(struct platform_device *pdev)
{
	return !pdev->dev.driver;
}

extern void early_platform_driver_register_all(char *class_str);
extern int early_platform_driver_probe(char *class_str,
				       int nr_probe, int user_only);
extern void early_platform_cleanup(void);


#ifndef MODULE
#define early_platform_init(class_string, platform_driver)		\
static __initdata struct early_platform_driver early_driver = {		\
	.class_str = class_string,					\
	.pdrv = platform_driver,					\
	.requested_id = EARLY_PLATFORM_ID_UNSET,			\
};									\
static int __init early_platform_driver_setup_func(char *buf)		\
{									\
	return early_platform_driver_register(&early_driver, buf);	\
}									\
early_param(class_string, early_platform_driver_setup_func)
#else /* MODULE */
#define early_platform_init(class_string, platform_driver)
#endif /* MODULE */

121
#endif /* _PLATFORM_DEVICE_H_ */