iommu: arm-smmu: Fix (void *) typecast error
In qsmmuv500_tbu_register(), archdata was being converted into a list
instead of the proper structure. Add a macro in an attempt to prevent
future misuse.
Change-Id: I0703fc341bf55e2174188c5dbb91c314c498f3f9
Signed-off-by: Patrick Daly <pdaly@codeaurora.org>
diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index 34df44c..86ef468 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -3977,6 +3977,8 @@
void __iomem *tcu_base;
u32 version;
};
+#define get_qsmmuv500_archdata(smmu) \
+ ((struct qsmmuv500_archdata *)(smmu->archdata))
struct qsmmuv500_tbu_device {
struct list_head list;
@@ -3997,7 +3999,7 @@
static int qsmmuv500_tbu_power_on_all(struct arm_smmu_device *smmu)
{
struct qsmmuv500_tbu_device *tbu;
- struct qsmmuv500_archdata *data = smmu->archdata;
+ struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu);
int ret = 0;
list_for_each_entry(tbu, &data->tbus, list) {
@@ -4017,7 +4019,7 @@
static void qsmmuv500_tbu_power_off_all(struct arm_smmu_device *smmu)
{
struct qsmmuv500_tbu_device *tbu;
- struct qsmmuv500_archdata *data = smmu->archdata;
+ struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu);
list_for_each_entry_reverse(tbu, &data->tbus, list) {
arm_smmu_power_off(tbu->pwr);
@@ -4085,7 +4087,7 @@
static int qsmmuv500_halt_all(struct arm_smmu_device *smmu)
{
struct qsmmuv500_tbu_device *tbu;
- struct qsmmuv500_archdata *data = smmu->archdata;
+ struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu);
int ret = 0;
list_for_each_entry(tbu, &data->tbus, list) {
@@ -4106,7 +4108,7 @@
static void qsmmuv500_resume_all(struct arm_smmu_device *smmu)
{
struct qsmmuv500_tbu_device *tbu;
- struct qsmmuv500_archdata *data = smmu->archdata;
+ struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu);
list_for_each_entry(tbu, &data->tbus, list) {
qsmmuv500_tbu_resume(tbu);
@@ -4117,7 +4119,7 @@
struct arm_smmu_device *smmu, u32 sid)
{
struct qsmmuv500_tbu_device *tbu = NULL;
- struct qsmmuv500_archdata *data = smmu->archdata;
+ struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu);
list_for_each_entry(tbu, &data->tbus, list) {
if (tbu->sid_start <= sid &&
@@ -4150,7 +4152,7 @@
unsigned long *flags)
{
struct arm_smmu_device *smmu = tbu->smmu;
- struct qsmmuv500_archdata *data = smmu->archdata;
+ struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu);
u32 val;
spin_lock_irqsave(&smmu->atos_lock, *flags);
@@ -4174,7 +4176,7 @@
unsigned long *flags)
{
struct arm_smmu_device *smmu = tbu->smmu;
- struct qsmmuv500_archdata *data = smmu->archdata;
+ struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu);
/* The status register is not accessible on version 1.0 */
if (data->version != 0x01000000)
@@ -4326,11 +4328,11 @@
return qsmmuv500_iova_to_phys(domain, iova, sid);
}
-static int qsmmuv500_tbu_register(struct device *dev, void *data)
+static int qsmmuv500_tbu_register(struct device *dev, void *cookie)
{
- struct arm_smmu_device *smmu = data;
+ struct arm_smmu_device *smmu = cookie;
struct qsmmuv500_tbu_device *tbu;
- struct list_head *list = smmu->archdata;
+ struct qsmmuv500_archdata *data = get_qsmmuv500_archdata(smmu);
if (!dev->driver) {
dev_err(dev, "TBU failed probe, QSMMUV500 cannot continue!\n");
@@ -4341,7 +4343,7 @@
INIT_LIST_HEAD(&tbu->list);
tbu->smmu = smmu;
- list_add(&tbu->list, list);
+ list_add(&tbu->list, &data->tbus);
return 0;
}