![Benjamin Herrenschmidt](/assets/img/avatar_default.png)
The SMU is the "system controller" chip used by Apple recent G5 machines including the iMac G5. It drives things like fans, i2c busses, real time clock, etc... The current kernel contains a very crude driver that doesn't do much more than reading the real time clock synchronously. This is a completely rewritten driver that provides interrupt based command queuing, a userland interface, and an i2c/smbus driver for accessing the devices hanging off the SMU i2c busses like temperature sensors. This driver is a basic block for upcoming work on thermal control for those machines, among others. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Jean Delvare <khali@linux-fr.org> Cc: Greg KH <greg@kroah.com> Signed-off-by: Andrew Morton <akpm@osdl.org> Signed-off-by: Linus Torvalds <torvalds@osdl.org>
66 lines
2 KiB
C
66 lines
2 KiB
C
#ifndef __OF_DEVICE_H__
|
|
#define __OF_DEVICE_H__
|
|
|
|
#include <linux/device.h>
|
|
#include <linux/mod_devicetable.h>
|
|
#include <asm/prom.h>
|
|
|
|
/*
|
|
* The of_platform_bus_type is a bus type used by drivers that do not
|
|
* attach to a macio or similar bus but still use OF probing
|
|
* mecanism
|
|
*/
|
|
extern struct bus_type of_platform_bus_type;
|
|
|
|
/*
|
|
* The of_device is a kind of "base class" that is a superset of
|
|
* struct device for use by devices attached to an OF node and
|
|
* probed using OF properties
|
|
*/
|
|
struct of_device
|
|
{
|
|
struct device_node *node; /* OF device node */
|
|
u64 dma_mask; /* DMA mask */
|
|
struct device dev; /* Generic device interface */
|
|
};
|
|
#define to_of_device(d) container_of(d, struct of_device, dev)
|
|
|
|
extern const struct of_device_id *of_match_device(
|
|
const struct of_device_id *matches, const struct of_device *dev);
|
|
|
|
extern struct of_device *of_dev_get(struct of_device *dev);
|
|
extern void of_dev_put(struct of_device *dev);
|
|
|
|
/*
|
|
* An of_platform_driver driver is attached to a basic of_device on
|
|
* the "platform bus" (of_platform_bus_type)
|
|
*/
|
|
struct of_platform_driver
|
|
{
|
|
char *name;
|
|
struct of_device_id *match_table;
|
|
struct module *owner;
|
|
|
|
int (*probe)(struct of_device* dev, const struct of_device_id *match);
|
|
int (*remove)(struct of_device* dev);
|
|
|
|
int (*suspend)(struct of_device* dev, pm_message_t state);
|
|
int (*resume)(struct of_device* dev);
|
|
int (*shutdown)(struct of_device* dev);
|
|
|
|
struct device_driver driver;
|
|
};
|
|
#define to_of_platform_driver(drv) container_of(drv,struct of_platform_driver, driver)
|
|
|
|
extern int of_register_driver(struct of_platform_driver *drv);
|
|
extern void of_unregister_driver(struct of_platform_driver *drv);
|
|
extern int of_device_register(struct of_device *ofdev);
|
|
extern void of_device_unregister(struct of_device *ofdev);
|
|
extern struct of_device *of_platform_device_create(struct device_node *np,
|
|
const char *bus_id,
|
|
struct device *parent);
|
|
extern void of_release_dev(struct device *dev);
|
|
|
|
#endif /* __OF_DEVICE_H__ */
|
|
|