diff mbox

power: supply: sbs-message: double left shift bug in sbsm_select()

Message ID 20171107124322.mm3fqkrggw3zidrx@mwanda (mailing list archive)
State Not Applicable, archived
Headers show

Commit Message

Dan Carpenter Nov. 7, 2017, 12:43 p.m. UTC
The original code does this: "1 << (1 << 11)" which is undefined in C.

Fixes: dbc4deda03fe ("power: Adds support for Smart Battery System Manager")
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
---
From static analysis.  Not tested.

Comments

Phil Reid Nov. 7, 2017, 3:18 p.m. UTC | #1
On 7/11/2017 20:43, Dan Carpenter wrote:
> The original code does this: "1 << (1 << 11)" which is undefined in C.
> 
> Fixes: dbc4deda03fe ("power: Adds support for Smart Battery System Manager")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> ---
>>From static analysis.  Not tested.
> 
> diff --git a/drivers/power/supply/sbs-manager.c b/drivers/power/supply/sbs-manager.c
> index ccb4217b9638..cb6e8f66c7a2 100644
> --- a/drivers/power/supply/sbs-manager.c
> +++ b/drivers/power/supply/sbs-manager.c
> @@ -183,7 +183,7 @@ static int sbsm_select(struct i2c_mux_core *muxc, u32 chan)
>   		return ret;
>   
>   	/* chan goes from 1 ... 4 */
> -	reg = 1 << BIT(SBSM_SMB_BAT_OFFSET + chan);
> +	reg = BIT(SBSM_SMB_BAT_OFFSET + chan);
>   	ret = sbsm_write_word(data->client, SBSM_CMD_BATSYSSTATE, reg);
>   	if (ret)
>   		dev_err(dev, "Failed to select channel %i\n", chan);
> 
> 
Oops. That's my fault.

Reviewed-by: Phil Reid <preid@electromag.com.au>
Sebastian Reichel Nov. 13, 2017, 10:55 a.m. UTC | #2
Hi,

On Tue, Nov 07, 2017 at 03:43:22PM +0300, Dan Carpenter wrote:
> The original code does this: "1 << (1 << 11)" which is undefined in C.
> 
> Fixes: dbc4deda03fe ("power: Adds support for Smart Battery System Manager")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> ---
> From static analysis.  Not tested.
> 
> diff --git a/drivers/power/supply/sbs-manager.c b/drivers/power/supply/sbs-manager.c
> index ccb4217b9638..cb6e8f66c7a2 100644
> --- a/drivers/power/supply/sbs-manager.c
> +++ b/drivers/power/supply/sbs-manager.c
> @@ -183,7 +183,7 @@ static int sbsm_select(struct i2c_mux_core *muxc, u32 chan)
>  		return ret;
>  
>  	/* chan goes from 1 ... 4 */
> -	reg = 1 << BIT(SBSM_SMB_BAT_OFFSET + chan);
> +	reg = BIT(SBSM_SMB_BAT_OFFSET + chan);
>  	ret = sbsm_write_word(data->client, SBSM_CMD_BATSYSSTATE, reg);
>  	if (ret)
>  		dev_err(dev, "Failed to select channel %i\n", chan);

Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>

sbs-manager has been added to linux-next through the i2c tree due to
dependencies, so this one also needs to go through i2c.

-- Sebastian
Wolfram Sang Nov. 13, 2017, 11:02 a.m. UTC | #3
On Mon, Nov 13, 2017 at 11:55:24AM +0100, Sebastian Reichel wrote:
> Hi,
> 
> On Tue, Nov 07, 2017 at 03:43:22PM +0300, Dan Carpenter wrote:
> > The original code does this: "1 << (1 << 11)" which is undefined in C.
> > 
> > Fixes: dbc4deda03fe ("power: Adds support for Smart Battery System Manager")
> > Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> > ---
> > From static analysis.  Not tested.
> > 
> > diff --git a/drivers/power/supply/sbs-manager.c b/drivers/power/supply/sbs-manager.c
> > index ccb4217b9638..cb6e8f66c7a2 100644
> > --- a/drivers/power/supply/sbs-manager.c
> > +++ b/drivers/power/supply/sbs-manager.c
> > @@ -183,7 +183,7 @@ static int sbsm_select(struct i2c_mux_core *muxc, u32 chan)
> >  		return ret;
> >  
> >  	/* chan goes from 1 ... 4 */
> > -	reg = 1 << BIT(SBSM_SMB_BAT_OFFSET + chan);
> > +	reg = BIT(SBSM_SMB_BAT_OFFSET + chan);
> >  	ret = sbsm_write_word(data->client, SBSM_CMD_BATSYSSTATE, reg);
> >  	if (ret)
> >  		dev_err(dev, "Failed to select channel %i\n", chan);
> 
> Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
> 
> sbs-manager has been added to linux-next through the i2c tree due to
> dependencies, so this one also needs to go through i2c.

I want to send Linus my pull request early this time (like today or
tomorrow). So, you either apply this patch then yourself afterwards on
top of linus' tree. Or I send it to him, but then I'd need the original
patch bounced or resent. Both fine with me.
Wolfram Sang Nov. 15, 2017, 7:45 a.m. UTC | #4
> > >  	/* chan goes from 1 ... 4 */
> > > -	reg = 1 << BIT(SBSM_SMB_BAT_OFFSET + chan);
> > > +	reg = BIT(SBSM_SMB_BAT_OFFSET + chan);
> > >  	ret = sbsm_write_word(data->client, SBSM_CMD_BATSYSSTATE, reg);
> > >  	if (ret)
> > >  		dev_err(dev, "Failed to select channel %i\n", chan);
> > 
> > Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
> > 
> > sbs-manager has been added to linux-next through the i2c tree due to
> > dependencies, so this one also needs to go through i2c.
> 
> I want to send Linus my pull request early this time (like today or
> tomorrow). So, you either apply this patch then yourself afterwards on
> top of linus' tree. Or I send it to him, but then I'd need the original
> patch bounced or resent. Both fine with me.

The sbs-manager code is in linus' tree now. How would you like to
proceed?
Sebastian Reichel Nov. 15, 2017, 10:05 a.m. UTC | #5
Hi,

On Wed, Nov 15, 2017 at 08:45:44AM +0100, Wolfram Sang wrote:
> > > >  	/* chan goes from 1 ... 4 */
> > > > -	reg = 1 << BIT(SBSM_SMB_BAT_OFFSET + chan);
> > > > +	reg = BIT(SBSM_SMB_BAT_OFFSET + chan);
> > > >  	ret = sbsm_write_word(data->client, SBSM_CMD_BATSYSSTATE, reg);
> > > >  	if (ret)
> > > >  		dev_err(dev, "Failed to select channel %i\n", chan);
> > > 
> > > Reviewed-by: Sebastian Reichel <sebastian.reichel@collabora.co.uk>
> > > 
> > > sbs-manager has been added to linux-next through the i2c tree due to
> > > dependencies, so this one also needs to go through i2c.
> > 
> > I want to send Linus my pull request early this time (like today or
> > tomorrow). So, you either apply this patch then yourself afterwards on
> > top of linus' tree. Or I send it to him, but then I'd need the original
> > patch bounced or resent. Both fine with me.
> 
> The sbs-manager code is in linus' tree now. How would you like to
> proceed?

I plan to send my pull request today and will take it during the -rc phase
through the power-supply tree. Thanks,

-- Sebastian
Sebastian Reichel Dec. 1, 2017, 3:27 p.m. UTC | #6
Hi,

On Tue, Nov 07, 2017 at 03:43:22PM +0300, Dan Carpenter wrote:
> The original code does this: "1 << (1 << 11)" which is undefined in C.
> 
> Fixes: dbc4deda03fe ("power: Adds support for Smart Battery System Manager")
> Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
> ---

Thanks, queued.

-- Sebastian

> From static analysis.  Not tested.
> 
> diff --git a/drivers/power/supply/sbs-manager.c b/drivers/power/supply/sbs-manager.c
> index ccb4217b9638..cb6e8f66c7a2 100644
> --- a/drivers/power/supply/sbs-manager.c
> +++ b/drivers/power/supply/sbs-manager.c
> @@ -183,7 +183,7 @@ static int sbsm_select(struct i2c_mux_core *muxc, u32 chan)
>  		return ret;
>  
>  	/* chan goes from 1 ... 4 */
> -	reg = 1 << BIT(SBSM_SMB_BAT_OFFSET + chan);
> +	reg = BIT(SBSM_SMB_BAT_OFFSET + chan);
>  	ret = sbsm_write_word(data->client, SBSM_CMD_BATSYSSTATE, reg);
>  	if (ret)
>  		dev_err(dev, "Failed to select channel %i\n", chan);
diff mbox

Patch

diff --git a/drivers/power/supply/sbs-manager.c b/drivers/power/supply/sbs-manager.c
index ccb4217b9638..cb6e8f66c7a2 100644
--- a/drivers/power/supply/sbs-manager.c
+++ b/drivers/power/supply/sbs-manager.c
@@ -183,7 +183,7 @@  static int sbsm_select(struct i2c_mux_core *muxc, u32 chan)
 		return ret;
 
 	/* chan goes from 1 ... 4 */
-	reg = 1 << BIT(SBSM_SMB_BAT_OFFSET + chan);
+	reg = BIT(SBSM_SMB_BAT_OFFSET + chan);
 	ret = sbsm_write_word(data->client, SBSM_CMD_BATSYSSTATE, reg);
 	if (ret)
 		dev_err(dev, "Failed to select channel %i\n", chan);