Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1755612AbbKRSZv (ORCPT ); Wed, 18 Nov 2015 13:25:51 -0500 Received: from gabe.freedesktop.org ([131.252.210.177]:60278 "EHLO gabe.freedesktop.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750719AbbKRSZt (ORCPT ); Wed, 18 Nov 2015 13:25:49 -0500 From: Eric Anholt To: Remi Pommarel , Stephen Warren , Lee Jones , Michael Turquette , Stephen Boyd , linux-rpi-kernel@lists.infradead.org, linux-clk@vger.kernel.org, linux-kernel@vger.kernel.org Cc: Remi Pommarel Subject: Re: [PATCH v2 1/3] clk: bcm2835: Always round up clock divisor In-Reply-To: <1447251765-16297-2-git-send-email-repk@triplefau.lt> References: <1447251765-16297-1-git-send-email-repk@triplefau.lt> <1447251765-16297-2-git-send-email-repk@triplefau.lt> User-Agent: Notmuch/0.21 (http://notmuchmail.org) Emacs/24.5.1 (x86_64-pc-linux-gnu) Date: Wed, 18 Nov 2015 10:25:45 -0800 Message-ID: <87h9kj2mhi.fsf@eliezer.anholt.net> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 3091 Lines: 80 --=-=-= Content-Type: text/plain Content-Transfer-Encoding: quoted-printable Remi Pommarel writes: > Make bcm2835_clock_choose_div always round up the chosen MASH divisor so = that > the resulting average rate will not be higher than the requested one. > > Signed-off-by: Remi Pommarel > --- > drivers/clk/bcm/clk-bcm2835.c | 15 ++++++++------- > 1 file changed, 8 insertions(+), 7 deletions(-) > > diff --git a/drivers/clk/bcm/clk-bcm2835.c b/drivers/clk/bcm/clk-bcm2835.c > index 39bf582..1237716 100644 > --- a/drivers/clk/bcm/clk-bcm2835.c > +++ b/drivers/clk/bcm/clk-bcm2835.c > @@ -1152,18 +1152,19 @@ static u32 bcm2835_clock_choose_div(struct clk_hw= *hw, > { > struct bcm2835_clock *clock =3D bcm2835_clock_from_hw(hw); > const struct bcm2835_clock_data *data =3D clock->data; > - u32 unused_frac_mask =3D GENMASK(CM_DIV_FRAC_BITS - data->frac_bits, 0); > + u32 unused_frac_mask =3D > + GENMASK(CM_DIV_FRAC_BITS - data->frac_bits, 0) >> 1; > u64 temp =3D (u64)parent_rate << CM_DIV_FRAC_BITS; > + u64 rem; > u32 div; >=20=20 > - do_div(temp, rate); > + rem =3D do_div(temp, rate); > div =3D temp; >=20=20 > - /* Round and mask off the unused bits */ > - if (unused_frac_mask !=3D 0) { > - div +=3D unused_frac_mask >> 1; > - div &=3D ~unused_frac_mask; > - } > + /* Round up and mask off the unused bits */ > + if ((div & unused_frac_mask) !=3D 0 || rem !=3D 0) > + div +=3D unused_frac_mask + 1; > + div &=3D ~unused_frac_mask; Suppose we've got 8 of our 12 frac bits populated. You've added a ">> 1" to the unused_frac_mask, so it's only 0x7 instead of 0xf. When you say "round up", you add 0x8 (the high bit of the unused mask") then and with ~0x7. If you started with 0x1 in the low bits of div, you'd end up with 0x8, so you've set an unused bit instead of actually rounding up. Did my logic work, here? I think you just want to drop the ">>1" in unused_frac_mask. --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAEBCgAGBQJWTMKqAAoJELXWKTbR/J7oFbAP/RRzh/WofbiKoFE2W34d1ZBd N3X8jmM0PyyXuCOmp1TqmYovOobqL8bDzNSWqEcvsvUUZNmC5hhETTGs4msP2xpb m9eu/KqdXZpgLni3W62r/2QImZqbui76gBmJsXPOlsZFMuxEvEAv5BT5BZOn0OGk hQ9yzCPRThinA8P4DRf608e3fyNFOgOOMiMKDqbgPsDpUG7m6mOVqkgJeV/mkuJ6 mIYEJP3BP5WBefxXS6nkVDda7CmaT2Oj+DP2OejX+UI9srNMPDXggJLZIqhdJgph afFTuWx4yScP4B2Mo2v3Bs8Cd3HB4FJWL+Ozl3JrX7xCWQsWTKBj+v60N4x5HzkF imDSQf3qUv9J1jcsXQLsvTIa0zo88MT1Eqce0ZaH1fekMlJHVZ7Vh13TkoQ9/HCq YyAi5Z5ZX/EB//gqPT4dHOr3QhBWSrSjOvLOlEiLcH+z4xX8+hBEYEX1J9vvvZiv KDuDSTneHqAGBJBl6eBLVZ0p0by3yJEFsDYREPCMqe8zS/VpqliZnBMhpB8MXa5T 1I8+hUXO3mnMlUJB3JSlHPdsT3Rhf1oCx+jq32hXNcdfuKz8LDR7/I7qzadRHZF9 yoiZaJ8UOhIX8Atz9yPtgavkrXXlafUl2vcT4oB5X/F3YjT1Sfxx44wI6SLWysZa rh/3rUsmcE3fjYS/UCPU =rpD/ -----END PGP SIGNATURE----- --=-=-=-- -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/