2013-06-25 05:02:59

by Jonghwa Lee

[permalink] [raw]
Subject: [PATCH 1/2] power: charger-manager: regulator_get() never returns NULL.

This patch fixes return value checking of regulator_get() in charger-manager
driver. The API, regulator_get(), returns ERR_PTR() when it fails to get
regulator with given name, not NULL.

Signed-off-by: Jonghwa Lee <[email protected]>
Signed-off-by: Myungjoo Ham <[email protected]>
---
drivers/power/charger-manager.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
index ba42029..7d1bcde 100644
--- a/drivers/power/charger-manager.c
+++ b/drivers/power/charger-manager.c
@@ -1239,7 +1239,7 @@ static int charger_manager_register_extcon(struct charger_manager *cm)

charger->consumer = regulator_get(cm->dev,
charger->regulator_name);
- if (charger->consumer == NULL) {
+ if (IS_ERR(charger->consumer)) {
dev_err(cm->dev, "Cannot find charger(%s)\n",
charger->regulator_name);
ret = -EINVAL;
--
1.7.9.5


2013-06-25 05:03:27

by Jonghwa Lee

[permalink] [raw]
Subject: [PATCH 2/2] power: charger-manager: Fix a bug when it unregisters notifier block of extcon.

This patch prevents NULL pointer error cauesed by unregistering unregistered
exton notifier block. At the probing time of charger manager, it tries to
remove extcon notifier block when it fails to initialize them. It has to be
applied for only registered one. Otherwise, it'd make kernel panic. To make it
work right, it checks extcon_specific_cable_nb's extcon_dev node. If extcon
cable notifier block was registered successfully, it has proper extcon_dev
pointer if not so it has NULL pointer.

Signed-off-by: Jonghwa Lee <[email protected]>
Signed-off-by: Myungjoo Ham <[email protected]>
---
drivers/power/charger-manager.c | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
index 7d1bcde..c55a7dc 100644
--- a/drivers/power/charger-manager.c
+++ b/drivers/power/charger-manager.c
@@ -1666,7 +1666,9 @@ err_reg_extcon:
charger = &desc->charger_regulators[i];
for (j = 0; j < charger->num_cables; j++) {
struct charger_cable *cable = &charger->cables[j];
- extcon_unregister_interest(&cable->extcon_dev);
+ /* Remove notifier block if only edev exists */
+ if (cable->extcon_dev.edev)
+ extcon_unregister_interest(&cable->extcon_dev);
}

regulator_put(desc->charger_regulators[i].consumer);
--
1.7.9.5

2013-06-25 05:08:05

by Sachin Kamat

[permalink] [raw]
Subject: Re: [PATCH 1/2] power: charger-manager: regulator_get() never returns NULL.

On 25 June 2013 10:32, Jonghwa Lee <[email protected]> wrote:
> This patch fixes return value checking of regulator_get() in charger-manager
> driver. The API, regulator_get(), returns ERR_PTR() when it fails to get
> regulator with given name, not NULL.
>
> Signed-off-by: Jonghwa Lee <[email protected]>
> Signed-off-by: Myungjoo Ham <[email protected]>
> ---
> drivers/power/charger-manager.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
> index ba42029..7d1bcde 100644
> --- a/drivers/power/charger-manager.c
> +++ b/drivers/power/charger-manager.c
> @@ -1239,7 +1239,7 @@ static int charger_manager_register_extcon(struct charger_manager *cm)
>
> charger->consumer = regulator_get(cm->dev,
> charger->regulator_name);
> - if (charger->consumer == NULL) {
> + if (IS_ERR(charger->consumer)) {
> dev_err(cm->dev, "Cannot find charger(%s)\n",
> charger->regulator_name);
> ret = -EINVAL;

You can as well make this ret = PTR_ERR(charger->consumer).

---
With warm regards,
Sachin

2013-06-25 05:09:31

by Jonghwa Lee

[permalink] [raw]
Subject: Re: [PATCH 1/2] power: charger-manager: regulator_get() never returns NULL.

On 2013년 06월 25일 14:07, Sachin Kamat wrote:

> On 25 June 2013 10:32, Jonghwa Lee <[email protected]> wrote:
>> This patch fixes return value checking of regulator_get() in charger-manager
>> driver. The API, regulator_get(), returns ERR_PTR() when it fails to get
>> regulator with given name, not NULL.
>>
>> Signed-off-by: Jonghwa Lee <[email protected]>
>> Signed-off-by: Myungjoo Ham <[email protected]>
>> ---
>> drivers/power/charger-manager.c | 2 +-
>> 1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
>> index ba42029..7d1bcde 100644
>> --- a/drivers/power/charger-manager.c
>> +++ b/drivers/power/charger-manager.c
>> @@ -1239,7 +1239,7 @@ static int charger_manager_register_extcon(struct charger_manager *cm)
>>
>> charger->consumer = regulator_get(cm->dev,
>> charger->regulator_name);
>> - if (charger->consumer == NULL) {
>> + if (IS_ERR(charger->consumer)) {
>> dev_err(cm->dev, "Cannot find charger(%s)\n",
>> charger->regulator_name);
>> ret = -EINVAL;
>
> You can as well make this ret = PTR_ERR(charger->consumer).


Yes, I'll fix it.

Thanks,
Jonghwa

>
> ---
> With warm regards,
> Sachin
>

2013-06-26 01:19:16

by Jonghwa Lee

[permalink] [raw]
Subject: Re: [PATCH 2/2] power: charger-manager: Fix a bug when it unregisters notifier block of extcon.

Hi,
On 2013년 06월 25일 22:34, Chanwoo Choi wrote:

> On Tue, Jun 25, 2013 at 2:02 PM, Jonghwa Lee <[email protected]
> <mailto:[email protected]>> wrote:
>
> This patch prevents NULL pointer error cauesed by unregistering unregistered
> exton notifier block. At the probing time of charger manager, it tries to
> remove extcon notifier block when it fails to initialize them. It has to be
> applied for only registered one. Otherwise, it'd make kernel panic. To make it
> work right, it checks extcon_specific_cable_nb's extcon_dev node. If extcon
> cable notifier block was registered successfully, it has proper extcon_dev
> pointer if not so it has NULL pointer.
>
> Signed-off-by: Jonghwa Lee <[email protected]
> <mailto:[email protected]>>
> Signed-off-by: Myungjoo Ham <[email protected]
> <mailto:[email protected]>>
> ---
> drivers/power/charger-manager.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
> index 7d1bcde..c55a7dc 100644
> --- a/drivers/power/charger-manager.c
> +++ b/drivers/power/charger-manager.c
> @@ -1666,7 +1666,9 @@ err_reg_extcon:
> charger = &desc->charger_regulators[i];
> for (j = 0; j < charger->num_cables; j++) {
> struct charger_cable *cable = &charger->cables[j];
> - extcon_unregister_interest(&cable->extcon_dev);
> + /* Remove notifier block if only edev exists */
> + if (cable->extcon_dev.edev)
> + extcon_unregister_interest(&cable->extcon_dev);
> }
>
> regulator_put(desc->charger_regulators[i].consumer);
> --
> 1.7.9.5
>
>
> The charger-manager.c call extcon_unregister_interest() in
> charger_manager_remove() function.
> So, you should to fix it on charger_manager_remove() to remove NULL pointer error.
>


When .remove() callback function is called, there is no unregistered cable
notifier block. Because all extcon notifier block would be registered at probing
time, and if it is failed the probing can't be achieved. So I think it doesn't
need to fix .remove() callback function as like above.

Thank you for reviewing.

Best regards,
Jonghwa.


> Acked-by: Chanwoo Choi <[email protected] <mailto:[email protected]>>
>
> Thanks,
> Chanwoo Choi
>

2013-06-26 01:22:31

by Chanwoo Choi

[permalink] [raw]
Subject: Re: [PATCH 2/2] power: charger-manager: Fix a bug when it unregisters notifier block of extcon.

On 06/26/2013 10:19 AM, [email protected] wrote:
> Hi,
> On 2013?? 06?? 25?? 22:34, Chanwoo Choi wrote:
>
>> On Tue, Jun 25, 2013 at 2:02 PM, Jonghwa Lee <[email protected]
>> <mailto:[email protected]>> wrote:
>>
>> This patch prevents NULL pointer error cauesed by unregistering unregistered
>> exton notifier block. At the probing time of charger manager, it tries to
>> remove extcon notifier block when it fails to initialize them. It has to be
>> applied for only registered one. Otherwise, it'd make kernel panic. To make it
>> work right, it checks extcon_specific_cable_nb's extcon_dev node. If extcon
>> cable notifier block was registered successfully, it has proper extcon_dev
>> pointer if not so it has NULL pointer.
>>
>> Signed-off-by: Jonghwa Lee <[email protected]
>> <mailto:[email protected]>>
>> Signed-off-by: Myungjoo Ham <[email protected]
>> <mailto:[email protected]>>
>> ---
>> drivers/power/charger-manager.c | 4 +++-
>> 1 file changed, 3 insertions(+), 1 deletion(-)
>>
>> diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
>> index 7d1bcde..c55a7dc 100644
>> --- a/drivers/power/charger-manager.c
>> +++ b/drivers/power/charger-manager.c
>> @@ -1666,7 +1666,9 @@ err_reg_extcon:
>> charger = &desc->charger_regulators[i];
>> for (j = 0; j < charger->num_cables; j++) {
>> struct charger_cable *cable = &charger->cables[j];
>> - extcon_unregister_interest(&cable->extcon_dev);
>> + /* Remove notifier block if only edev exists */
>> + if (cable->extcon_dev.edev)
>> + extcon_unregister_interest(&cable->extcon_dev);
>> }
>>
>> regulator_put(desc->charger_regulators[i].consumer);
>> --
>> 1.7.9.5
>>
>>
>> The charger-manager.c call extcon_unregister_interest() in
>> charger_manager_remove() function.
>> So, you should to fix it on charger_manager_remove() to remove NULL pointer error.
>>
>
>
> When .remove() callback function is called, there is no unregistered cable
> notifier block. Because all extcon notifier block would be registered at probing
> time, and if it is failed the probing can't be achieved. So I think it doesn't
> need to fix .remove() callback function as like above.
>
> Thank you for reviewing.
>
> Best regards,
> Jonghwa.
>
>
>> Acked-by: Chanwoo Choi <[email protected] <mailto:[email protected]>>
>>
>> Thanks,
>> Chanwoo Choi
>>
>

OK, I agree your opinion.

Acked-by: Chanwoo Choi <[email protected]>

Thanks,
Chanwoo Choi