Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

fsl_ifc: Support all 8 IFC chip selects

Freescale's QorIQ T Series processors support 8 IFC chip selects
within a memory map backward compatible with previous P Series
processors which supported only 4 chip selects.

Signed-off-by: Aaron Sierra <asierra@xes-inc.com>
Signed-off-by: Brian Norris <computersforpeace@gmail.com>

authored by

Aaron Sierra and committed by
Brian Norris
09691661 abb1cd00

+31 -13
+11 -2
drivers/memory/fsl_ifc.c
··· 61 61 if (!fsl_ifc_ctrl_dev || !fsl_ifc_ctrl_dev->regs) 62 62 return -ENODEV; 63 63 64 - for (i = 0; i < ARRAY_SIZE(fsl_ifc_ctrl_dev->regs->cspr_cs); i++) { 64 + for (i = 0; i < fsl_ifc_ctrl_dev->banks; i++) { 65 65 u32 cspr = in_be32(&fsl_ifc_ctrl_dev->regs->cspr_cs[i].cspr); 66 66 if (cspr & CSPR_V && (cspr & CSPR_BA) == 67 67 convert_ifc_address(addr_base)) ··· 213 213 static int fsl_ifc_ctrl_probe(struct platform_device *dev) 214 214 { 215 215 int ret = 0; 216 - 216 + int version, banks; 217 217 218 218 dev_info(&dev->dev, "Freescale Integrated Flash Controller\n"); 219 219 ··· 230 230 ret = -ENODEV; 231 231 goto err; 232 232 } 233 + 234 + version = ioread32be(&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; 233 242 234 243 /* get the Controller level irq */ 235 244 fsl_ifc_ctrl_dev->irq = irq_of_parse_and_map(dev->dev.of_node, 0);
+4 -6
drivers/mtd/nand/fsl_ifc_nand.c
··· 31 31 #include <linux/mtd/nand_ecc.h> 32 32 #include <linux/fsl_ifc.h> 33 33 34 - #define FSL_IFC_V1_1_0 0x01010000 35 34 #define ERR_BYTE 0xFF /* Value returned for read 36 35 bytes when read failed */ 37 36 #define IFC_TIMEOUT_MSECS 500 /* Maximum number of mSecs to wait ··· 876 877 struct fsl_ifc_regs __iomem *ifc = ctrl->regs; 877 878 struct nand_chip *chip = &priv->chip; 878 879 struct nand_ecclayout *layout; 879 - u32 csor, ver; 880 + u32 csor; 880 881 881 882 /* Fill in fsl_ifc_mtd structure */ 882 883 priv->mtd.priv = chip; ··· 983 984 chip->ecc.mode = NAND_ECC_SOFT; 984 985 } 985 986 986 - ver = ioread32be(&ifc->ifc_rev); 987 - if (ver == FSL_IFC_V1_1_0) 987 + if (ctrl->version == FSL_IFC_VERSION_1_1_0) 988 988 fsl_ifc_sram_init(priv); 989 989 990 990 return 0; ··· 1043 1045 } 1044 1046 1045 1047 /* find which chip select it is connected to */ 1046 - for (bank = 0; bank < FSL_IFC_BANK_COUNT; bank++) { 1048 + for (bank = 0; bank < fsl_ifc_ctrl_dev->banks; bank++) { 1047 1049 if (match_bank(ifc, bank, res.start)) 1048 1050 break; 1049 1051 } 1050 1052 1051 - if (bank >= FSL_IFC_BANK_COUNT) { 1053 + if (bank >= fsl_ifc_ctrl_dev->banks) { 1052 1054 dev_err(&dev->dev, "%s: address did not match any chip selects\n", 1053 1055 __func__); 1054 1056 return -ENODEV;
+16 -5
include/linux/fsl_ifc.h
··· 29 29 #include <linux/of_platform.h> 30 30 #include <linux/interrupt.h> 31 31 32 - #define FSL_IFC_BANK_COUNT 4 32 + /* 33 + * The actual number of banks implemented depends on the IFC version 34 + * - IFC version 1.0 implements 4 banks. 35 + * - IFC version 1.1 onward implements 8 banks. 36 + */ 37 + #define FSL_IFC_BANK_COUNT 8 38 + 39 + #define FSL_IFC_VERSION_MASK 0x0F0F0000 40 + #define FSL_IFC_VERSION_1_0_0 0x01000000 41 + #define FSL_IFC_VERSION_1_1_0 0x01010000 33 42 34 43 /* 35 44 * CSPR - Chip Select Property Register ··· 785 776 __be32 cspr; 786 777 u32 res2; 787 778 } cspr_cs[FSL_IFC_BANK_COUNT]; 788 - u32 res3[0x19]; 779 + u32 res3[0xd]; 789 780 struct { 790 781 __be32 amask; 791 782 u32 res4[0x2]; 792 783 } amask_cs[FSL_IFC_BANK_COUNT]; 793 - u32 res5[0x18]; 784 + u32 res5[0xc]; 794 785 struct { 795 786 __be32 csor; 796 787 __be32 csor_ext; 797 788 u32 res6; 798 789 } csor_cs[FSL_IFC_BANK_COUNT]; 799 - u32 res7[0x18]; 790 + u32 res7[0xc]; 800 791 struct { 801 792 __be32 ftim[4]; 802 793 u32 res8[0x8]; 803 794 } ftim_cs[FSL_IFC_BANK_COUNT]; 804 - u32 res9[0x60]; 795 + u32 res9[0x30]; 805 796 __be32 rb_stat; 806 797 u32 res10[0x2]; 807 798 __be32 ifc_gcr; ··· 836 827 int nand_irq; 837 828 spinlock_t lock; 838 829 void *nand; 830 + int version; 831 + int banks; 839 832 840 833 u32 nand_stat; 841 834 wait_queue_head_t nand_wait;