2009-09-04 01:14:05 +08:00
|
|
|
/*
|
|
|
|
* omap_device headers
|
|
|
|
*
|
|
|
|
* Copyright (C) 2009 Nokia Corporation
|
|
|
|
* Paul Walmsley
|
|
|
|
*
|
|
|
|
* Developed in collaboration with (alphabetical order): Benoit
|
|
|
|
* Cousson, Kevin Hilman, Tony Lindgren, Rajendra Nayak, Vikram
|
|
|
|
* Pandita, Sakari Poussa, Anand Sawant, Santosh Shilimkar, Richard
|
|
|
|
* Woodruff
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License version 2 as
|
|
|
|
* published by the Free Software Foundation.
|
|
|
|
*
|
2013-01-26 15:48:53 +08:00
|
|
|
* This type of functionality should be implemented as a proper
|
|
|
|
* omap_bus/omap_device in Linux.
|
2009-09-04 01:14:05 +08:00
|
|
|
*
|
|
|
|
* omap_device differs from omap_hwmod in that it includes external
|
|
|
|
* (e.g., board- and system-level) integration details. omap_hwmod
|
|
|
|
* stores hardware data that is invariant for a given OMAP chip.
|
|
|
|
*/
|
|
|
|
#ifndef __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H
|
|
|
|
#define __ARCH_ARM_PLAT_OMAP_INCLUDE_MACH_OMAP_DEVICE_H
|
|
|
|
|
|
|
|
#include <linux/kernel.h>
|
|
|
|
#include <linux/platform_device.h>
|
|
|
|
|
2012-10-03 08:41:35 +08:00
|
|
|
#include "omap_hwmod.h"
|
2009-09-04 01:14:05 +08:00
|
|
|
|
2012-02-16 03:47:45 +08:00
|
|
|
extern struct dev_pm_domain omap_device_pm_domain;
|
ARM: OMAP2+: omap_device: add fail hook for runtime_pm when bad data is detected
Due to the cross dependencies between hwmod for automanaged device
information for OMAP and dts node definitions, we can run into scenarios
where the dts node is defined, however it's hwmod entry is yet to be
added. In these cases:
a) omap_device does not register a pm_domain (since it cannot find
hwmod entry).
b) driver does not know about (a), does a pm_runtime_get_sync which
never fails
c) It then tries to do some operation on the device (such as read the
revision register (as part of probe) without clock or adequate OMAP
generic PM operation performed for enabling the module.
This causes a crash such as that reported in:
https://bugzilla.kernel.org/show_bug.cgi?id=66441
When 'ti,hwmod' is provided in dt node, it is expected that the device
will not function without the OMAP's power automanagement. Hence, when
we hit a fail condition (due to hwmod entries not present or other
similar scenario), fail at pm_domain level due to lack of data, provide
enough information for it to be fixed, however, it allows for the driver
to take appropriate measures to prevent crash.
Reported-by: Tobias Jakobi <tjakobi@math.uni-bielefeld.de>
Signed-off-by: Nishanth Menon <nm@ti.com>
Acked-by: Kevin Hilman <khilman@linaro.org>
Acked-by: Tony Lindgren <tony@atomide.com>
Signed-off-by: Kevin Hilman <khilman@linaro.org>
2013-12-04 09:39:13 +08:00
|
|
|
extern struct dev_pm_domain omap_device_fail_pm_domain;
|
2010-08-23 23:10:55 +08:00
|
|
|
|
2009-09-04 01:14:05 +08:00
|
|
|
/* omap_device._state values */
|
|
|
|
#define OMAP_DEVICE_STATE_UNKNOWN 0
|
|
|
|
#define OMAP_DEVICE_STATE_ENABLED 1
|
|
|
|
#define OMAP_DEVICE_STATE_IDLE 2
|
|
|
|
#define OMAP_DEVICE_STATE_SHUTDOWN 3
|
|
|
|
|
2011-07-13 04:48:19 +08:00
|
|
|
/* omap_device.flags values */
|
2013-01-26 15:48:53 +08:00
|
|
|
#define OMAP_DEVICE_SUSPENDED BIT(0)
|
2011-07-13 04:48:19 +08:00
|
|
|
|
2009-09-04 01:14:05 +08:00
|
|
|
/**
|
|
|
|
* struct omap_device - omap_device wrapper for platform_devices
|
|
|
|
* @pdev: platform_device
|
|
|
|
* @hwmods: (one .. many per omap_device)
|
|
|
|
* @hwmods_cnt: ARRAY_SIZE() of @hwmods
|
|
|
|
* @_state: one of OMAP_DEVICE_STATE_* (see above)
|
|
|
|
* @flags: device flags
|
2012-07-11 02:13:16 +08:00
|
|
|
* @_driver_status: one of BUS_NOTIFY_*_DRIVER from <linux/device.h>
|
2009-09-04 01:14:05 +08:00
|
|
|
*
|
|
|
|
* Integrates omap_hwmod data into Linux platform_device.
|
|
|
|
*
|
|
|
|
* Field names beginning with underscores are for the internal use of
|
|
|
|
* the omap_device code.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
struct omap_device {
|
2011-07-22 04:58:51 +08:00
|
|
|
struct platform_device *pdev;
|
2009-09-04 01:14:05 +08:00
|
|
|
struct omap_hwmod **hwmods;
|
2012-07-11 02:13:16 +08:00
|
|
|
unsigned long _driver_status;
|
2009-09-04 01:14:05 +08:00
|
|
|
u8 hwmods_cnt;
|
|
|
|
u8 _state;
|
2011-07-13 04:48:19 +08:00
|
|
|
u8 flags;
|
2009-09-04 01:14:05 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
/* Device driver interface (call via platform_data fn ptrs) */
|
|
|
|
|
|
|
|
int omap_device_enable(struct platform_device *pdev);
|
|
|
|
int omap_device_idle(struct platform_device *pdev);
|
|
|
|
|
|
|
|
/* Core code interface */
|
|
|
|
|
2011-07-22 04:48:45 +08:00
|
|
|
struct platform_device *omap_device_build(const char *pdev_name, int pdev_id,
|
2013-01-26 15:48:53 +08:00
|
|
|
struct omap_hwmod *oh, void *pdata,
|
|
|
|
int pdata_len);
|
2009-09-04 01:14:05 +08:00
|
|
|
|
2011-07-22 04:48:45 +08:00
|
|
|
struct platform_device *omap_device_build_ss(const char *pdev_name, int pdev_id,
|
2009-09-04 01:14:05 +08:00
|
|
|
struct omap_hwmod **oh, int oh_cnt,
|
2013-01-26 15:48:53 +08:00
|
|
|
void *pdata, int pdata_len);
|
2009-09-04 01:14:05 +08:00
|
|
|
|
ARM: OMAP: omap_device: Expose omap_device_{alloc, delete, register}
Expose omap_device_{alloc, delete, register} so we can use them outside
of omap_device.c.
This approach allows users, which need to manipulate an archdata member
of a device before it is registered, to do so. This is also useful
for users who have their devices created very early so they can be used
at ->reserve() time to reserve CMA memory.
The immediate use case for this is to set the private iommu archdata
member, which binds a device to its associated iommu controller.
This way, generic code will be able to attach omap devices to their
iommus, without calling any omap-specific API.
With this in hand, we can further clean the existing mainline OMAP iommu
driver and its mainline users, and focus on generic IOMMU approaches
for future users (rpmsg/remoteproc and the upcoming generic DMA API).
This patch is still considered an interim solution until DT fully materializes
for omap; at that point, this functionality will be removed as DT will
take care of creating the devices and configuring them correctly.
Tested on OMAP4 with a generic rpmsg/remoteproc that doesn't use any
omap-specific IOMMU API anymore.
Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2012-02-21 01:43:29 +08:00
|
|
|
struct omap_device *omap_device_alloc(struct platform_device *pdev,
|
2013-01-26 15:48:53 +08:00
|
|
|
struct omap_hwmod **ohs, int oh_cnt);
|
ARM: OMAP: omap_device: Expose omap_device_{alloc, delete, register}
Expose omap_device_{alloc, delete, register} so we can use them outside
of omap_device.c.
This approach allows users, which need to manipulate an archdata member
of a device before it is registered, to do so. This is also useful
for users who have their devices created very early so they can be used
at ->reserve() time to reserve CMA memory.
The immediate use case for this is to set the private iommu archdata
member, which binds a device to its associated iommu controller.
This way, generic code will be able to attach omap devices to their
iommus, without calling any omap-specific API.
With this in hand, we can further clean the existing mainline OMAP iommu
driver and its mainline users, and focus on generic IOMMU approaches
for future users (rpmsg/remoteproc and the upcoming generic DMA API).
This patch is still considered an interim solution until DT fully materializes
for omap; at that point, this functionality will be removed as DT will
take care of creating the devices and configuring them correctly.
Tested on OMAP4 with a generic rpmsg/remoteproc that doesn't use any
omap-specific IOMMU API anymore.
Signed-off-by: Ohad Ben-Cohen <ohad@wizery.com>
Signed-off-by: Kevin Hilman <khilman@ti.com>
Signed-off-by: Tony Lindgren <tony@atomide.com>
2012-02-21 01:43:29 +08:00
|
|
|
void omap_device_delete(struct omap_device *od);
|
|
|
|
int omap_device_register(struct platform_device *pdev);
|
|
|
|
|
2011-07-28 04:02:32 +08:00
|
|
|
struct device *omap_device_get_by_hwmod_name(const char *oh_name);
|
2010-07-27 06:34:33 +08:00
|
|
|
|
2009-09-04 01:14:05 +08:00
|
|
|
/* OMAP PM interface */
|
2011-06-09 21:56:23 +08:00
|
|
|
int omap_device_get_context_loss_count(struct platform_device *pdev);
|
2009-09-04 01:14:05 +08:00
|
|
|
|
|
|
|
/* Other */
|
|
|
|
|
2012-09-24 07:28:18 +08:00
|
|
|
int omap_device_assert_hardreset(struct platform_device *pdev,
|
|
|
|
const char *name);
|
|
|
|
int omap_device_deassert_hardreset(struct platform_device *pdev,
|
|
|
|
const char *name);
|
2009-09-04 01:14:05 +08:00
|
|
|
|
2009-12-09 07:34:17 +08:00
|
|
|
/* Get omap_device pointer from platform_device pointer */
|
2011-07-22 04:58:51 +08:00
|
|
|
static inline struct omap_device *to_omap_device(struct platform_device *pdev)
|
|
|
|
{
|
|
|
|
return pdev ? pdev->archdata.od : NULL;
|
|
|
|
}
|
2009-12-09 07:34:17 +08:00
|
|
|
#endif
|