#define HISI_SFC_V3XX_VERSION (0x1f8)
 
 #define HISI_SFC_V3XX_CMD_CFG (0x300)
+#define HISI_SFC_V3XX_CMD_CFG_DUAL_IN_DUAL_OUT (1 << 17)
+#define HISI_SFC_V3XX_CMD_CFG_DUAL_IO (2 << 17)
+#define HISI_SFC_V3XX_CMD_CFG_FULL_DIO (3 << 17)
+#define HISI_SFC_V3XX_CMD_CFG_QUAD_IN_QUAD_OUT (5 << 17)
+#define HISI_SFC_V3XX_CMD_CFG_QUAD_IO (6 << 17)
+#define HISI_SFC_V3XX_CMD_CFG_FULL_QIO (7 << 17)
 #define HISI_SFC_V3XX_CMD_CFG_DATA_CNT_OFF 9
 #define HISI_SFC_V3XX_CMD_CFG_RW_MSK BIT(8)
 #define HISI_SFC_V3XX_CMD_CFG_DATA_EN_MSK BIT(7)
        if (op->addr.nbytes)
                config |= HISI_SFC_V3XX_CMD_CFG_ADDR_EN_MSK;
 
+       switch (op->data.buswidth) {
+       case 0 ... 1:
+               break;
+       case 2:
+               if (op->addr.buswidth <= 1) {
+                       config |= HISI_SFC_V3XX_CMD_CFG_DUAL_IN_DUAL_OUT;
+               } else if (op->addr.buswidth == 2) {
+                       if (op->cmd.buswidth <= 1) {
+                               config |= HISI_SFC_V3XX_CMD_CFG_DUAL_IO;
+                       } else if (op->cmd.buswidth == 2) {
+                               config |= HISI_SFC_V3XX_CMD_CFG_FULL_DIO;
+                       } else {
+                               return -EIO;
+                       }
+               } else {
+                       return -EIO;
+               }
+               break;
+       case 4:
+               if (op->addr.buswidth <= 1) {
+                       config |= HISI_SFC_V3XX_CMD_CFG_QUAD_IN_QUAD_OUT;
+               } else if (op->addr.buswidth == 4) {
+                       if (op->cmd.buswidth <= 1) {
+                               config |= HISI_SFC_V3XX_CMD_CFG_QUAD_IO;
+                       } else if (op->cmd.buswidth == 4) {
+                               config |= HISI_SFC_V3XX_CMD_CFG_FULL_QIO;
+                       } else {
+                               return -EIO;
+                       }
+               } else {
+                       return -EIO;
+               }
+               break;
+       default:
+               return -EOPNOTSUPP;
+       }
+
        if (op->data.dir != SPI_MEM_NO_DATA) {
                config |= (len - 1) << HISI_SFC_V3XX_CMD_CFG_DATA_CNT_OFF;
                config |= HISI_SFC_V3XX_CMD_CFG_DATA_EN_MSK;