On 17.09.2015 04:23, Andreas Dannenberg wrote:
> On Wed, Sep 16, 2015 at 09:41:49AM +0900, Krzysztof Kozlowski wrote:
>>> -           reset_iilimit = true;
>>> -   } else if (old_state.fault == FAULT_NO_BAT) {    /* battery connected */
>>> -           config_iilimit = true;
>>> -   } else if (new_state->fault == FAULT_TIMER) { /* safety timer expired */
>>> +                   reset_iilimit = true;
>>> +           }
>>> +   } else if (!old_state.power_good) {
>>> +           dev_dbg(bq->dev, "Power inserted\n");
>>> +           config_iilimit = !bq->in_ilimit_autoset_disable;
>>> +   } else if (new_state->fault == FAULT_NO_BAT) {
>>> +           dev_warn(bq->dev, "Battery removed\n");
>>
>> dev_warn? This wasn't here before... It's a bit too serious. Is removing
>> a battery an error condition? Maybe user just unplugged it?
>> dev_dbg or dev_info should be sufficient.
>>
>> BTW, it is useful to quickly find boot regressions with "dmesg -l
>> warn,err". Removing a battery probably is not an error?
> 
> I would argue that most devices that use a Li-Ion battery have the
> battery built-in and it's not user removable. Therefore, if the battery
> would ever go disconnected I figured it'll most likely be something
> serious such as a contact breaking loose or something else dramatic,
> warranting at least a warning. Plus, many devices with built in Li-Ion
> batteries are actually designed in a way that they don't really function
> properly with the battery taken out as the HW is often designed to draw
> supplemental current from the battery during times of load in addition
> to the A/C supply (key feature of many charger chips).

Okay, I guess if there ever will be an user annoyed by dmesg's after
removing the battery we can always revisit this. :)

> 
>>
>>> +           if (!bq->in_ilimit_autoset_disable) {
>>> +                   cancel_delayed_work_sync(&bq->iilimit_setup_work);
>>> +                   reset_iilimit = true;
>>> +           }
>>> +   } else if (old_state.fault == FAULT_NO_BAT) {
>>> +           dev_warn(bq->dev, "Battery connected\n");
>>
>> Definitely not a warn. Inserting a battery is not an error condition.
> 
> Same as above.

OK

> 
>>> +           config_iilimit = !bq->in_ilimit_autoset_disable;
>>> +   } else if (new_state->fault == FAULT_TIMER) {
>>>             dev_err(bq->dev, "Safety timer expired! Battery dead?\n");
>>>     }
>>
>> Don't you have a schedule_delayed_work() call here which now will be
>> executed always? Even when work was not INIT and nothing will cancel it?
> 
> It'll be more obvious when looking at the merged code but the schedule_
> delayed_work() call only happens if config_iilimit==true which only
> happens when the input limit current autoset functionality is not
> disabled. If that's the case (autoset functionality is enabled) the INIT
> for that work is executed during probe.
>  

OK

>>>  
>>> @@ -581,7 +601,16 @@ static int bq24257_hw_init(struct bq24257_device *bq)
>>>     bq->state = state;
>>>     mutex_unlock(&bq->lock);
>>>  
>>> -   if (!state.power_good)
>>> +   if (bq->in_ilimit_autoset_disable) {
>>> +           dev_dbg(bq->dev, "manually setting iilimit = %d\n",
>>> +                   bq->init_data.in_ilimit);
>>
>> Nit, no actual difference but makes more sense to me because field is
>> u8: "%u".
> 
> Yes that should be changed.
> 
>>> +
>>> +           /* program fixed input current limit */
>>> +           ret = bq24257_field_write(bq, F_IILIMIT,
>>> +                                     bq->init_data.in_ilimit);
>>> +           if (ret < 0)
>>> +                   return ret;
>>> +   } else if (!state.power_good)
>>>             /* activate D+/D- detection algorithm */
>>>             ret = bq24257_field_write(bq, F_DPDM_EN, 1);
>>>     else if (state.fault != FAULT_NO_BAT)
>>> @@ -659,6 +688,7 @@ static int bq24257_fw_probe(struct bq24257_device *bq)
>>>     int ret;
>>>     u32 property;
>>>  
>>> +   /* Required properties */
>>>     ret = device_property_read_u32(bq->dev, "ti,charge-current", &property);
>>>     if (ret < 0)
>>>             return ret;
>>> @@ -682,6 +712,24 @@ static int bq24257_fw_probe(struct bq24257_device *bq)
>>>     bq->init_data.iterm = bq24257_find_idx(property, bq24257_iterm_map,
>>>                                            BQ24257_ITERM_MAP_SIZE);
>>>  
>>> +   /* Optional properties. If not provided use reasonable default. */
>>> +   ret = device_property_read_u32(bq->dev, "ti,current-limit",
>>> +                                  &property);
>>> +   if (ret < 0)
>>> +           /*
>>> +            * Explicitly set a default value which will be needed for
>>> +            * devices that don't support the automatic setting of the input
>>> +            * current limit through the charger type detection mechanism.
>>> +            */
>>> +           bq->init_data.in_ilimit = IILIMIT_500;
>>> +   else {
>>> +           bq->in_ilimit_autoset_disable = true;
>>> +           bq->init_data.in_ilimit =
>>> +                           bq24257_find_idx(property,
>>> +                                            bq24257_iilimit_map,
>>> +                                            BQ24257_IILIMIT_MAP_SIZE);
>>> +   }
>>> +
>>>     return 0;
>>>  }
>>>  
>>> @@ -740,8 +788,6 @@ static int bq24257_probe(struct i2c_client *client,
>>>  
>>>     i2c_set_clientdata(client, bq);
>>>  
>>> -   INIT_DELAYED_WORK(&bq->iilimit_setup_work, bq24257_iilimit_setup_work);
>>> -
>>>     if (!dev->platform_data) {
>>>             ret = bq24257_fw_probe(bq);
>>>             if (ret < 0) {
>>> @@ -752,6 +798,18 @@ static int bq24257_probe(struct i2c_client *client,
>>>             return -ENODEV;
>>>     }
>>>  
>>> +   /*
>>> +    * The BQ24250 doesn't support the D+/D- based charger type detection
>>> +    * used for the automatic setting of the input current limit setting so
>>> +    * explicitly disable that feature.
>>> +    */
>>> +   if (bq->chip == BQ24250)
>>> +           bq->in_ilimit_autoset_disable = true;
>>> +
>>> +   if (!bq->in_ilimit_autoset_disable)
>>
>> In most places you have quite obfuscated negation of
>> "autoset_disable"... So maybe just "bq->in_ilimit_autoset" or
>> "bq->in_ilimit_autoset_enable" and the negation won't be needed? It
>> could be more readable.
> 
> This stems from the fact that this was initially tied to a boolean DT
> property with the same name which is no longer there. The other reason
> was setting this property to non-zero changes the default behavior of
> the driver (that used to have autoset always enabled) so I wanted to
> reflect this behavior in the logic. The driver was tested pretty well so
> unless you feel strongly about this I would rather leave it as-is.

IMHO the code would be more readable but I don't insist.

Best regards,
Krzysztof

--
To unsubscribe from this list: send the line "unsubscribe devicetree" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to