of_platform.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #ifndef _LINUX_OF_PLATFORM_H
  2. #define _LINUX_OF_PLATFORM_H
  3. /*
  4. * Copyright (C) 2006 Benjamin Herrenschmidt, IBM Corp.
  5. * <benh@kernel.crashing.org>
  6. *
  7. * This program is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU General Public License
  9. * as published by the Free Software Foundation; either version
  10. * 2 of the License, or (at your option) any later version.
  11. *
  12. */
  13. #include <linux/device.h>
  14. #include <linux/mod_devicetable.h>
  15. #include <linux/pm.h>
  16. #include <linux/of_device.h>
  17. #include <linux/platform_device.h>
  18. /**
  19. * struct of_dev_auxdata - lookup table entry for device names & platform_data
  20. * @compatible: compatible value of node to match against node
  21. * @phys_addr: Start address of registers to match against node
  22. * @name: Name to assign for matching nodes
  23. * @platform_data: platform_data to assign for matching nodes
  24. *
  25. * This lookup table allows the caller of of_platform_populate() to override
  26. * the names of devices when creating devices from the device tree. The table
  27. * should be terminated with an empty entry. It also allows the platform_data
  28. * pointer to be set.
  29. *
  30. * The reason for this functionality is that some Linux infrastructure uses
  31. * the device name to look up a specific device, but the Linux-specific names
  32. * are not encoded into the device tree, so the kernel needs to provide specific
  33. * values.
  34. *
  35. * Note: Using an auxdata lookup table should be considered a last resort when
  36. * converting a platform to use the DT. Normally the automatically generated
  37. * device name will not matter, and drivers should obtain data from the device
  38. * node instead of from an anonymouns platform_data pointer.
  39. */
  40. struct of_dev_auxdata {
  41. char *compatible;
  42. resource_size_t phys_addr;
  43. char *name;
  44. void *platform_data;
  45. };
  46. /* Macro to simplify populating a lookup table */
  47. #define OF_DEV_AUXDATA(_compat,_phys,_name,_pdata) \
  48. { .compatible = _compat, .phys_addr = _phys, .name = _name, \
  49. .platform_data = _pdata }
  50. /**
  51. * of_platform_driver - Legacy of-aware driver for platform devices.
  52. *
  53. * An of_platform_driver driver is attached to a basic platform_device on
  54. * the ibm ebus (ibmebus_bus_type).
  55. */
  56. struct of_platform_driver
  57. {
  58. int (*probe)(struct platform_device* dev,
  59. const struct of_device_id *match);
  60. int (*remove)(struct platform_device* dev);
  61. int (*suspend)(struct platform_device* dev, pm_message_t state);
  62. int (*resume)(struct platform_device* dev);
  63. int (*shutdown)(struct platform_device* dev);
  64. struct device_driver driver;
  65. };
  66. #define to_of_platform_driver(drv) \
  67. container_of(drv,struct of_platform_driver, driver)
  68. extern const struct of_device_id of_default_bus_match_table[];
  69. /* Platform drivers register/unregister */
  70. extern struct platform_device *of_device_alloc(struct device_node *np,
  71. const char *bus_id,
  72. struct device *parent);
  73. extern struct platform_device *of_find_device_by_node(struct device_node *np);
  74. /* Platform devices and busses creation */
  75. extern struct platform_device *of_platform_device_create(struct device_node *np,
  76. const char *bus_id,
  77. struct device *parent);
  78. extern int of_platform_bus_probe(struct device_node *root,
  79. const struct of_device_id *matches,
  80. struct device *parent);
  81. #ifdef CONFIG_OF_ADDRESS
  82. extern int of_platform_populate(struct device_node *root,
  83. const struct of_device_id *matches,
  84. const struct of_dev_auxdata *lookup,
  85. struct device *parent);
  86. #else
  87. static inline int of_platform_populate(struct device_node *root,
  88. const struct of_device_id *matches,
  89. const struct of_dev_auxdata *lookup,
  90. struct device *parent)
  91. {
  92. return -ENODEV;
  93. }
  94. #endif
  95. #endif /* _LINUX_OF_PLATFORM_H */