// Buffered page program can do one 128-byte transfer
 #define MTK_NOR_PP_SIZE                        128
 
-#define CLK_TO_US(sp, clkcnt)          ((clkcnt) * 1000000 / sp->spi_freq)
+#define CLK_TO_US(sp, clkcnt)          DIV_ROUND_UP(clkcnt, sp->spi_freq / 1000000)
 
 struct mtk_nor {
        struct spi_controller *ctlr;
        if ((op->addr.nbytes == 3) || (op->addr.nbytes == 4)) {
                if ((op->data.dir == SPI_MEM_DATA_IN) &&
                    mtk_nor_match_read(op)) {
+                       // limit size to prevent timeout calculation overflow
+                       if (op->data.nbytes > 0x400000)
+                               op->data.nbytes = 0x400000;
+
                        if ((op->addr.val & MTK_NOR_DMA_ALIGN_MASK) ||
                            (op->data.nbytes < MTK_NOR_DMA_ALIGN))
                                op->data.nbytes = 1;