From f12b2d73bb6d20ad05b5d2b9f41972a4edb2264d Mon Sep 17 00:00:00 2001 From: Zhibin Huang Date: Thu, 25 Apr 2024 09:14:54 +0800 Subject: [PATCH] misc: rk628: fix 64-bit division error when compiling arm platform Type: Fix Redmine ID: N/A Associated modifications: N/A Test: N/A Signed-off-by: Zhibin Huang Change-Id: I1bf1319de734979735ff3af95bd83f12ffcd3c5c --- drivers/misc/rk628/rk628.c | 12 +++++------- drivers/misc/rk628/rk628_hdmirx.c | 18 ++++++++++++------ drivers/misc/rk628/rk628_rgb.c | 3 ++- 3 files changed, 19 insertions(+), 14 deletions(-) diff --git a/drivers/misc/rk628/rk628.c b/drivers/misc/rk628/rk628.c index 1532f47aada9..09cf8248b929 100644 --- a/drivers/misc/rk628/rk628.c +++ b/drivers/misc/rk628/rk628.c @@ -921,8 +921,7 @@ static void rk628_show_resolution(struct seq_file *s) src_vtotal = src_mode->vtotal; /* get fps */ - fps = clk_rx_read * 1000; - do_div(fps, src_htotal * src_vtotal); + fps = clk_rx_read * 1000 / (src_htotal * src_vtotal); /* print */ DEBUG_PRINT(" Display mode: %dx%dp%d,dclk[%u]\n", src_hactive, @@ -955,7 +954,8 @@ static void rk628f_show_rgbrx_resolution(struct seq_file *s) imodet_clk = rk628_cru_clk_get_rate(rk628, CGU_CLK_IMODET); - clk_rx_read = imodet_clk * rgb_rx_clkrate / (rgb_rx_eval_time + 1); + clk_rx_read = imodet_clk * rgb_rx_clkrate; + do_div(clk_rx_read, rgb_rx_eval_time + 1); do_div(clk_rx_read, 1000); /* get timing */ @@ -976,8 +976,7 @@ static void rk628f_show_rgbrx_resolution(struct seq_file *s) src_vtotal = val & 0xffff; /* get fps */ - fps = clk_rx_read * 1000; - do_div(fps, src_htotal * src_vtotal); + fps = clk_rx_read * 1000 / (src_htotal * src_vtotal); /* print */ DEBUG_PRINT(" Display mode: %dx%dp%d,dclk[%llu]\n", src_hactive, @@ -1028,8 +1027,7 @@ static void rk628_show_output_resolution(struct seq_file *s) dsp_vact_end = val & 0xfff; /* get fps */ - fps = sclk_vop * 1000; - do_div(fps, dsp_vtotal * dsp_htotal); + fps = sclk_vop * 1000 / (dsp_vtotal * dsp_htotal); /* print */ DEBUG_PRINT(" Display mode: %dx%dp%d,dclk[%llu]\n", diff --git a/drivers/misc/rk628/rk628_hdmirx.c b/drivers/misc/rk628/rk628_hdmirx.c index 473ee9bed174..3829366a65d5 100644 --- a/drivers/misc/rk628/rk628_hdmirx.c +++ b/drivers/misc/rk628/rk628_hdmirx.c @@ -247,7 +247,8 @@ static void rk628_hdmirx_audio_clk_set_rate(struct rk628_hdmirx *hdmirx, u32 rat static void rk628_hdmirx_audio_clk_ppm_inc(struct rk628_hdmirx *hdmirx, int ppm) { - int delta, rate, inc; + u64 delta; + int rate, inc; rate = hdmirx->audio_state.hdmirx_aud_clkrate; if (ppm < 0) { @@ -255,11 +256,13 @@ static void rk628_hdmirx_audio_clk_ppm_inc(struct rk628_hdmirx *hdmirx, int ppm) inc = -1; } else inc = 1; - delta = (uint64_t)((uint64_t)rate * ppm + 500000) / 1000000; + + delta = (uint64_t)((uint64_t)rate * ppm + 500000); + do_div(delta, 1000000); delta *= inc; - rate += delta; + rate += (int)delta; dev_dbg(hdmirx->rk628->dev, "%s: %u to %u(delta:%d)\n", - __func__, hdmirx->audio_state.hdmirx_aud_clkrate, rate, delta); + __func__, hdmirx->audio_state.hdmirx_aud_clkrate, rate, (int)delta); rk628_cru_clk_set_rate(hdmirx->rk628, CGU_CLK_HDMIRX_AUD, rate); hdmirx->audio_state.hdmirx_aud_clkrate = rate; } @@ -674,7 +677,7 @@ static void rk628_hdmirx_get_timing(struct rk628 *rk628) u64 tmp_data; u32 interlaced; u32 hfrontporch, hsync, hbackporch, vfrontporch, vsync, vbackporch; - unsigned long long pixelclock; + unsigned long long pixelclock, clock; unsigned long flags = 0; struct rk628_hdmirx *hdmirx = rk628->hdmirx; @@ -770,7 +773,10 @@ static void rk628_hdmirx_get_timing(struct rk628 *rk628) pixelclock /= 2; } - hdmirx->mode.clock = pixelclock / 1000; + clock = pixelclock; + do_div(clock, 1000); + + hdmirx->mode.clock = clock; hdmirx->mode.hdisplay = hact; hdmirx->mode.hstart = hdmirx->mode.hdisplay + hfrontporch; hdmirx->mode.hend = hdmirx->mode.hstart + hsync; diff --git a/drivers/misc/rk628/rk628_rgb.c b/drivers/misc/rk628/rk628_rgb.c index dee837731c9e..6c11b4b3d0b4 100644 --- a/drivers/misc/rk628/rk628_rgb.c +++ b/drivers/misc/rk628/rk628_rgb.c @@ -57,7 +57,8 @@ static int rk628_rgb_resolution_show(struct seq_file *s, void *data) rgb_rx_clkrate = val & RGB_RX_CLKRATE_MASK; ref_clk = rk628_cru_clk_get_rate(rk628, CGU_CLK_IMODET); - pixel_clk = ref_clk * rgb_rx_clkrate / (rgb_rx_eval_time + 1); + pixel_clk = ref_clk * rgb_rx_clkrate; + do_div(pixel_clk, rgb_rx_eval_time + 1); if (rk628_input_is_rgb(rk628)) { rk628_i2c_read(rk628, GRF_RGB_RX_DBG_MEAS4, &val);