diff options
author | Jaiprakash Singh <b44839@freescale.com> | 2015-05-20 22:17:11 -0400 |
---|---|---|
committer | Scott Wood <scottwood@freescale.com> | 2015-08-07 23:59:34 -0400 |
commit | cf184dc2dd33847f4b211b01d8c7ec0526e6c5e4 (patch) | |
tree | fc8bfced6f839edc21c9548d81697f7de17cdf86 /drivers/memory | |
parent | 3fa647bff31fe7b8818a40742506d47d0dc7f8f5 (diff) |
fsl_ifc: Change IO accessor based on endianness
IFC IO accressor are set at run time based
on IFC IP registers endianness.IFC node in
DTS file contains information about
endianness.
Signed-off-by: Jaiprakash Singh <b44839@freescale.com>
Signed-off-by: Scott Wood <scottwood@freescale.com>
Acked-by: Brian Norris <computersforpeace@gmail.com>
Diffstat (limited to 'drivers/memory')
-rw-r--r-- | drivers/memory/fsl_ifc.c | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/drivers/memory/fsl_ifc.c b/drivers/memory/fsl_ifc.c index 410c39749872..e87459f6d686 100644 --- a/drivers/memory/fsl_ifc.c +++ b/drivers/memory/fsl_ifc.c | |||
@@ -62,7 +62,7 @@ int fsl_ifc_find(phys_addr_t addr_base) | |||
62 | return -ENODEV; | 62 | return -ENODEV; |
63 | 63 | ||
64 | for (i = 0; i < fsl_ifc_ctrl_dev->banks; i++) { | 64 | for (i = 0; i < fsl_ifc_ctrl_dev->banks; i++) { |
65 | u32 cspr = in_be32(&fsl_ifc_ctrl_dev->regs->cspr_cs[i].cspr); | 65 | u32 cspr = ifc_in32(&fsl_ifc_ctrl_dev->regs->cspr_cs[i].cspr); |
66 | if (cspr & CSPR_V && (cspr & CSPR_BA) == | 66 | if (cspr & CSPR_V && (cspr & CSPR_BA) == |
67 | convert_ifc_address(addr_base)) | 67 | convert_ifc_address(addr_base)) |
68 | return i; | 68 | return i; |
@@ -79,16 +79,16 @@ static int fsl_ifc_ctrl_init(struct fsl_ifc_ctrl *ctrl) | |||
79 | /* | 79 | /* |
80 | * Clear all the common status and event registers | 80 | * Clear all the common status and event registers |
81 | */ | 81 | */ |
82 | if (in_be32(&ifc->cm_evter_stat) & IFC_CM_EVTER_STAT_CSER) | 82 | if (ifc_in32(&ifc->cm_evter_stat) & IFC_CM_EVTER_STAT_CSER) |
83 | out_be32(&ifc->cm_evter_stat, IFC_CM_EVTER_STAT_CSER); | 83 | ifc_out32(IFC_CM_EVTER_STAT_CSER, &ifc->cm_evter_stat); |
84 | 84 | ||
85 | /* enable all error and events */ | 85 | /* enable all error and events */ |
86 | out_be32(&ifc->cm_evter_en, IFC_CM_EVTER_EN_CSEREN); | 86 | ifc_out32(IFC_CM_EVTER_EN_CSEREN, &ifc->cm_evter_en); |
87 | 87 | ||
88 | /* enable all error and event interrupts */ | 88 | /* enable all error and event interrupts */ |
89 | out_be32(&ifc->cm_evter_intr_en, IFC_CM_EVTER_INTR_EN_CSERIREN); | 89 | ifc_out32(IFC_CM_EVTER_INTR_EN_CSERIREN, &ifc->cm_evter_intr_en); |
90 | out_be32(&ifc->cm_erattr0, 0x0); | 90 | ifc_out32(0x0, &ifc->cm_erattr0); |
91 | out_be32(&ifc->cm_erattr1, 0x0); | 91 | ifc_out32(0x0, &ifc->cm_erattr1); |
92 | 92 | ||
93 | return 0; | 93 | return 0; |
94 | } | 94 | } |
@@ -127,9 +127,9 @@ static u32 check_nand_stat(struct fsl_ifc_ctrl *ctrl) | |||
127 | 127 | ||
128 | spin_lock_irqsave(&nand_irq_lock, flags); | 128 | spin_lock_irqsave(&nand_irq_lock, flags); |
129 | 129 | ||
130 | stat = in_be32(&ifc->ifc_nand.nand_evter_stat); | 130 | stat = ifc_in32(&ifc->ifc_nand.nand_evter_stat); |
131 | if (stat) { | 131 | if (stat) { |
132 | out_be32(&ifc->ifc_nand.nand_evter_stat, stat); | 132 | ifc_out32(stat, &ifc->ifc_nand.nand_evter_stat); |
133 | ctrl->nand_stat = stat; | 133 | ctrl->nand_stat = stat; |
134 | wake_up(&ctrl->nand_wait); | 134 | wake_up(&ctrl->nand_wait); |
135 | } | 135 | } |
@@ -161,16 +161,16 @@ static irqreturn_t fsl_ifc_ctrl_irq(int irqno, void *data) | |||
161 | irqreturn_t ret = IRQ_NONE; | 161 | irqreturn_t ret = IRQ_NONE; |
162 | 162 | ||
163 | /* read for chip select error */ | 163 | /* read for chip select error */ |
164 | cs_err = in_be32(&ifc->cm_evter_stat); | 164 | cs_err = ifc_in32(&ifc->cm_evter_stat); |
165 | if (cs_err) { | 165 | if (cs_err) { |
166 | dev_err(ctrl->dev, "transaction sent to IFC is not mapped to" | 166 | dev_err(ctrl->dev, "transaction sent to IFC is not mapped to" |
167 | "any memory bank 0x%08X\n", cs_err); | 167 | "any memory bank 0x%08X\n", cs_err); |
168 | /* clear the chip select error */ | 168 | /* clear the chip select error */ |
169 | out_be32(&ifc->cm_evter_stat, IFC_CM_EVTER_STAT_CSER); | 169 | ifc_out32(IFC_CM_EVTER_STAT_CSER, &ifc->cm_evter_stat); |
170 | 170 | ||
171 | /* read error attribute registers print the error information */ | 171 | /* read error attribute registers print the error information */ |
172 | status = in_be32(&ifc->cm_erattr0); | 172 | status = ifc_in32(&ifc->cm_erattr0); |
173 | err_addr = in_be32(&ifc->cm_erattr1); | 173 | err_addr = ifc_in32(&ifc->cm_erattr1); |
174 | 174 | ||
175 | if (status & IFC_CM_ERATTR0_ERTYP_READ) | 175 | if (status & IFC_CM_ERATTR0_ERTYP_READ) |
176 | dev_err(ctrl->dev, "Read transaction error" | 176 | dev_err(ctrl->dev, "Read transaction error" |
@@ -231,6 +231,23 @@ static int fsl_ifc_ctrl_probe(struct platform_device *dev) | |||
231 | goto err; | 231 | goto err; |
232 | } | 232 | } |
233 | 233 | ||
234 | version = ifc_in32(&fsl_ifc_ctrl_dev->regs->ifc_rev) & | ||
235 | FSL_IFC_VERSION_MASK; | ||
236 | banks = (version == FSL_IFC_VERSION_1_0_0) ? 4 : 8; | ||
237 | dev_info(&dev->dev, "IFC version %d.%d, %d banks\n", | ||
238 | version >> 24, (version >> 16) & 0xf, banks); | ||
239 | |||
240 | fsl_ifc_ctrl_dev->version = version; | ||
241 | fsl_ifc_ctrl_dev->banks = banks; | ||
242 | |||
243 | if (of_property_read_bool(dev->dev.of_node, "little-endian")) { | ||
244 | fsl_ifc_ctrl_dev->little_endian = true; | ||
245 | dev_dbg(&dev->dev, "IFC REGISTERS are LITTLE endian\n"); | ||
246 | } else { | ||
247 | fsl_ifc_ctrl_dev->little_endian = false; | ||
248 | dev_dbg(&dev->dev, "IFC REGISTERS are BIG endian\n"); | ||
249 | } | ||
250 | |||
234 | version = ioread32be(&fsl_ifc_ctrl_dev->regs->ifc_rev) & | 251 | version = ioread32be(&fsl_ifc_ctrl_dev->regs->ifc_rev) & |
235 | FSL_IFC_VERSION_MASK; | 252 | FSL_IFC_VERSION_MASK; |
236 | banks = (version == FSL_IFC_VERSION_1_0_0) ? 4 : 8; | 253 | banks = (version == FSL_IFC_VERSION_1_0_0) ? 4 : 8; |