1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #ifndef __LINUX_MTD_QINFO_H 3*4882a593Smuzhiyun #define __LINUX_MTD_QINFO_H 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #include <linux/mtd/map.h> 6*4882a593Smuzhiyun #include <linux/wait.h> 7*4882a593Smuzhiyun #include <linux/spinlock.h> 8*4882a593Smuzhiyun #include <linux/delay.h> 9*4882a593Smuzhiyun #include <linux/mtd/mtd.h> 10*4882a593Smuzhiyun #include <linux/mtd/flashchip.h> 11*4882a593Smuzhiyun #include <linux/mtd/partitions.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun /* lpddr_private describes lpddr flash chip in memory map 14*4882a593Smuzhiyun * @ManufactId - Chip Manufacture ID 15*4882a593Smuzhiyun * @DevId - Chip Device ID 16*4882a593Smuzhiyun * @qinfo - pointer to qinfo records describing the chip 17*4882a593Smuzhiyun * @numchips - number of chips including virual RWW partitions 18*4882a593Smuzhiyun * @chipshift - Chip/partition size 2^chipshift 19*4882a593Smuzhiyun * @chips - per-chip data structure 20*4882a593Smuzhiyun */ 21*4882a593Smuzhiyun struct lpddr_private { 22*4882a593Smuzhiyun uint16_t ManufactId; 23*4882a593Smuzhiyun uint16_t DevId; 24*4882a593Smuzhiyun struct qinfo_chip *qinfo; 25*4882a593Smuzhiyun int numchips; 26*4882a593Smuzhiyun unsigned long chipshift; 27*4882a593Smuzhiyun struct flchip chips[]; 28*4882a593Smuzhiyun }; 29*4882a593Smuzhiyun 30*4882a593Smuzhiyun /* qinfo_query_info structure contains request information for 31*4882a593Smuzhiyun * each qinfo record 32*4882a593Smuzhiyun * @major - major number of qinfo record 33*4882a593Smuzhiyun * @major - minor number of qinfo record 34*4882a593Smuzhiyun * @id_str - descriptive string to access the record 35*4882a593Smuzhiyun * @desc - detailed description for the qinfo record 36*4882a593Smuzhiyun */ 37*4882a593Smuzhiyun struct qinfo_query_info { 38*4882a593Smuzhiyun uint8_t major; 39*4882a593Smuzhiyun uint8_t minor; 40*4882a593Smuzhiyun char *id_str; 41*4882a593Smuzhiyun char *desc; 42*4882a593Smuzhiyun }; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* 45*4882a593Smuzhiyun * qinfo_chip structure contains necessary qinfo records data 46*4882a593Smuzhiyun * @DevSizeShift - Device size 2^n bytes 47*4882a593Smuzhiyun * @BufSizeShift - Program buffer size 2^n bytes 48*4882a593Smuzhiyun * @TotalBlocksNum - Total number of blocks 49*4882a593Smuzhiyun * @UniformBlockSizeShift - Uniform block size 2^UniformBlockSizeShift bytes 50*4882a593Smuzhiyun * @HWPartsNum - Number of hardware partitions 51*4882a593Smuzhiyun * @SuspEraseSupp - Suspend erase supported 52*4882a593Smuzhiyun * @SingleWordProgTime - Single word program 2^SingleWordProgTime u-sec 53*4882a593Smuzhiyun * @ProgBufferTime - Program buffer write 2^ProgBufferTime u-sec 54*4882a593Smuzhiyun * @BlockEraseTime - Block erase 2^BlockEraseTime m-sec 55*4882a593Smuzhiyun */ 56*4882a593Smuzhiyun struct qinfo_chip { 57*4882a593Smuzhiyun /* General device info */ 58*4882a593Smuzhiyun uint16_t DevSizeShift; 59*4882a593Smuzhiyun uint16_t BufSizeShift; 60*4882a593Smuzhiyun /* Erase block information */ 61*4882a593Smuzhiyun uint16_t TotalBlocksNum; 62*4882a593Smuzhiyun uint16_t UniformBlockSizeShift; 63*4882a593Smuzhiyun /* Partition information */ 64*4882a593Smuzhiyun uint16_t HWPartsNum; 65*4882a593Smuzhiyun /* Optional features */ 66*4882a593Smuzhiyun uint16_t SuspEraseSupp; 67*4882a593Smuzhiyun /* Operation typical time */ 68*4882a593Smuzhiyun uint16_t SingleWordProgTime; 69*4882a593Smuzhiyun uint16_t ProgBufferTime; 70*4882a593Smuzhiyun uint16_t BlockEraseTime; 71*4882a593Smuzhiyun }; 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun /* defines for fixup usage */ 74*4882a593Smuzhiyun #define LPDDR_MFR_ANY 0xffff 75*4882a593Smuzhiyun #define LPDDR_ID_ANY 0xffff 76*4882a593Smuzhiyun #define NUMONYX_MFGR_ID 0x0089 77*4882a593Smuzhiyun #define R18_DEVICE_ID_1G 0x893c 78*4882a593Smuzhiyun lpddr_build_cmd(u_long cmd,struct map_info * map)79*4882a593Smuzhiyunstatic inline map_word lpddr_build_cmd(u_long cmd, struct map_info *map) 80*4882a593Smuzhiyun { 81*4882a593Smuzhiyun map_word val = { {0} }; 82*4882a593Smuzhiyun val.x[0] = cmd; 83*4882a593Smuzhiyun return val; 84*4882a593Smuzhiyun } 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #define CMD(x) lpddr_build_cmd(x, map) 87*4882a593Smuzhiyun #define CMDVAL(cmd) cmd.x[0] 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct mtd_info *lpddr_cmdset(struct map_info *); 90*4882a593Smuzhiyun 91*4882a593Smuzhiyun #endif 92*4882a593Smuzhiyun 93