aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/memory
diff options
context:
space:
mode:
authorJaiprakash Singh <b44839@freescale.com>2015-05-20 22:17:11 -0400
committerScott Wood <scottwood@freescale.com>2015-08-07 23:59:34 -0400
commitcf184dc2dd33847f4b211b01d8c7ec0526e6c5e4 (patch)
treefc8bfced6f839edc21c9548d81697f7de17cdf86 /drivers/memory
parent3fa647bff31fe7b8818a40742506d47d0dc7f8f5 (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.c43
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;