OMAP: HWMOD: Add support for early device register into omap device layer

This patch adds support in omap device layer to register devices
as early platform devices. Certain devices needed during system boot up
like timers, gpio etc can be registered as early devices. This will
allow for them to be probed very early on during system boot up.
This patch adds a parameter is_early_device in omap_device_build.
Depending on this parameter a call to early_platform_add_devices
or platform_register_device is made.

Signed-off-by: Thara Gopinath <thara@ti.com>
Signed-off-by: Paul Walmsley <paul@pwsan.com>
This commit is contained in:
Thara Gopinath 2010-02-24 12:05:58 -07:00 committed by Paul Walmsley
parent 358f0e630d
commit c23a97d377
2 changed files with 32 additions and 6 deletions

View File

@ -90,15 +90,16 @@ struct omap_device *omap_device_build(const char *pdev_name, int pdev_id,
struct omap_hwmod *oh, void *pdata, struct omap_hwmod *oh, void *pdata,
int pdata_len, int pdata_len,
struct omap_device_pm_latency *pm_lats, struct omap_device_pm_latency *pm_lats,
int pm_lats_cnt); int pm_lats_cnt, int is_early_device);
struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id, struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
struct omap_hwmod **oh, int oh_cnt, struct omap_hwmod **oh, int oh_cnt,
void *pdata, int pdata_len, void *pdata, int pdata_len,
struct omap_device_pm_latency *pm_lats, struct omap_device_pm_latency *pm_lats,
int pm_lats_cnt); int pm_lats_cnt, int is_early_device);
int omap_device_register(struct omap_device *od); int omap_device_register(struct omap_device *od);
int omap_early_device_register(struct omap_device *od);
/* OMAP PM interface */ /* OMAP PM interface */
int omap_device_align_pm_lat(struct platform_device *pdev, int omap_device_align_pm_lat(struct platform_device *pdev,

View File

@ -307,6 +307,7 @@ int omap_device_fill_resources(struct omap_device *od, struct resource *res)
* @pdata_len: amount of memory pointed to by @pdata * @pdata_len: amount of memory pointed to by @pdata
* @pm_lats: pointer to a omap_device_pm_latency array for this device * @pm_lats: pointer to a omap_device_pm_latency array for this device
* @pm_lats_cnt: ARRAY_SIZE() of @pm_lats * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats
* @is_early_device: should the device be registered as an early device or not
* *
* Convenience function for building and registering a single * Convenience function for building and registering a single
* omap_device record, which in turn builds and registers a * omap_device record, which in turn builds and registers a
@ -318,7 +319,7 @@ struct omap_device *omap_device_build(const char *pdev_name, int pdev_id,
struct omap_hwmod *oh, void *pdata, struct omap_hwmod *oh, void *pdata,
int pdata_len, int pdata_len,
struct omap_device_pm_latency *pm_lats, struct omap_device_pm_latency *pm_lats,
int pm_lats_cnt) int pm_lats_cnt, int is_early_device)
{ {
struct omap_hwmod *ohs[] = { oh }; struct omap_hwmod *ohs[] = { oh };
@ -326,7 +327,8 @@ struct omap_device *omap_device_build(const char *pdev_name, int pdev_id,
return ERR_PTR(-EINVAL); return ERR_PTR(-EINVAL);
return omap_device_build_ss(pdev_name, pdev_id, ohs, 1, pdata, return omap_device_build_ss(pdev_name, pdev_id, ohs, 1, pdata,
pdata_len, pm_lats, pm_lats_cnt); pdata_len, pm_lats, pm_lats_cnt,
is_early_device);
} }
/** /**
@ -338,6 +340,7 @@ struct omap_device *omap_device_build(const char *pdev_name, int pdev_id,
* @pdata_len: amount of memory pointed to by @pdata * @pdata_len: amount of memory pointed to by @pdata
* @pm_lats: pointer to a omap_device_pm_latency array for this device * @pm_lats: pointer to a omap_device_pm_latency array for this device
* @pm_lats_cnt: ARRAY_SIZE() of @pm_lats * @pm_lats_cnt: ARRAY_SIZE() of @pm_lats
* @is_early_device: should the device be registered as an early device or not
* *
* Convenience function for building and registering an omap_device * Convenience function for building and registering an omap_device
* subsystem record. Subsystem records consist of multiple * subsystem record. Subsystem records consist of multiple
@ -349,7 +352,7 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
struct omap_hwmod **ohs, int oh_cnt, struct omap_hwmod **ohs, int oh_cnt,
void *pdata, int pdata_len, void *pdata, int pdata_len,
struct omap_device_pm_latency *pm_lats, struct omap_device_pm_latency *pm_lats,
int pm_lats_cnt) int pm_lats_cnt, int is_early_device)
{ {
int ret = -ENOMEM; int ret = -ENOMEM;
struct omap_device *od; struct omap_device *od;
@ -407,7 +410,11 @@ struct omap_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
od->magic = OMAP_DEVICE_MAGIC; od->magic = OMAP_DEVICE_MAGIC;
ret = omap_device_register(od); if (is_early_device)
ret = omap_early_device_register(od);
else
ret = omap_device_register(od);
if (ret) if (ret)
goto odbs_exit4; goto odbs_exit4;
@ -427,6 +434,24 @@ odbs_exit1:
return ERR_PTR(ret); return ERR_PTR(ret);
} }
/**
* omap_early_device_register - register an omap_device as an early platform
* device.
* @od: struct omap_device * to register
*
* Register the omap_device structure. This currently just calls
* platform_early_add_device() on the underlying platform_device.
* Returns 0 by default.
*/
int omap_early_device_register(struct omap_device *od)
{
struct platform_device *devices[1];
devices[0] = &(od->pdev);
early_platform_add_devices(devices, 1);
return 0;
}
/** /**
* omap_device_register - register an omap_device with one omap_hwmod * omap_device_register - register an omap_device with one omap_hwmod
* @od: struct omap_device * to register * @od: struct omap_device * to register