Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1379389 > unrolled thread
| Started by | Chanwoo Choi <cw00.choi@samsung.com> |
|---|---|
| First post | 2016-04-15 02:50 +0200 |
| Last post | 2016-04-18 07:40 +0200 |
| Articles | 9 — 3 participants |
Back to article view | Back to linux.kernel
[RESEND PATCH 0/3] power: Remove the deprecated extcon functions Chanwoo Choi <cw00.choi@samsung.com> - 2016-04-15 02:50 +0200
[RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon Chanwoo Choi <cw00.choi@samsung.com> - 2016-04-15 02:50 +0200
Re: [RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon Sebastian Reichel <sre@kernel.org> - 2016-04-15 16:20 +0200
Re: [RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon Chanwoo Choi <cw00.choi@samsung.com> - 2016-04-18 07:50 +0200
Re: [RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon Rob Herring <robh@kernel.org> - 2016-04-18 19:30 +0200
Re: [RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon Chanwoo Choi <cw00.choi@samsung.com> - 2016-04-19 01:40 +0200
[RESEND PATCH 2/3] power: axp288_charger: Replace deprecatd API of extcon Chanwoo Choi <cw00.choi@samsung.com> - 2016-04-15 02:50 +0200
Re: [RESEND PATCH 2/3] power: axp288_charger: Replace deprecatd API of extcon Sebastian Reichel <sre@kernel.org> - 2016-04-15 16:30 +0200
Re: [RESEND PATCH 2/3] power: axp288_charger: Replace deprecatd API of extcon Chanwoo Choi <cw00.choi@samsung.com> - 2016-04-18 07:40 +0200
| From | Chanwoo Choi <cw00.choi@samsung.com> |
|---|---|
| Date | 2016-04-15 02:50 +0200 |
| Subject | [RESEND PATCH 0/3] power: Remove the deprecated extcon functions |
| Message-ID | <ro07n-2xu-3@gated-at.bofh.it> |
This patch-set removes the deprecated notifier API of extcon framework and
then use the new extcon API[2] with the unique id[1] to indicate the each
external connector. Alter deprecated API as following:
- extcon_register_interest() -> extcon_register_notifier()
- extcon_unregister_interest() -> extcon_unregister_notifier()
- extcon_set_cable_state() -> extcon_set_cable_state_()
- extcon_get_cable_state() -> extcon_get_cable_state_()
And, extcon alters the name of USB charger connector in patch[3] as following:
- EXTCON_CHG_USB_SDP /* Standard Downstream Port */
- EXTCON_CHG_USB_DCP /* Dedicated Charging Port */
- EXTCON_CHG_USB_CDP /* Charging Downstream Port */
- EXTCON_CHG_USB_ACA /* Accessory Charger Adapter */
[1] Commit 2a9de9c0f08d61
- ("extcon: Use the unique id for external connector instead of string)
[2] Commit 046050f6e623e4
- ("extcon: Update the prototype of extcon_register_notifier() with enum extcon
[3] Commit 11eecf910bd81d
- ("extcon: Modify the id and name of external connector")
Chanwoo Choi (3):
power: charger-manager: Replace deprecatd API of extcon
power: axp288_charger: Replace deprecatd API of extcon
extcon: Remove the deprecated extcon functions
.../bindings/power_supply/charger-manager.txt | 4 +-
drivers/extcon/extcon.c | 201 +++------------------
drivers/power/axp288_charger.c | 77 +++++---
drivers/power/charger-manager.c | 31 ++--
include/linux/extcon.h | 59 ------
include/linux/power/charger-manager.h | 4 +-
6 files changed, 101 insertions(+), 275 deletions(-)
--
1.9.1
[toc] | [next] | [standalone]
| From | Chanwoo Choi <cw00.choi@samsung.com> |
|---|---|
| Date | 2016-04-15 02:50 +0200 |
| Subject | [RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon |
| Message-ID | <ro07o-2xu-9@gated-at.bofh.it> |
| In reply to | #1379389 |
This patch removes the deprecated notifier API of extcon framework and then use
the new extcon API[2] with the unique id[1] to indicate the each external
connector. Alter deprecated API as following:
- extcon_register_interest() -> extcon_register_notifier()
- extcon_unregister_interest() -> extcon_unregister_notifier()
And, extcon alters the name of USB charger connector in patch[3] as following:
- EXTCON_CHG_USB_SDP /* Standard Downstream Port */
- EXTCON_CHG_USB_DCP /* Dedicated Charging Port */
- EXTCON_CHG_USB_CDP /* Charging Downstream Port */
- EXTCON_CHG_USB_ACA /* Accessory Charger Adapter */
So, the name of external charger connector are changed as following:
- "USB" -> "SDP"
- "TA" -> "DCP"
[1] Commit 2a9de9c0f08d61
- ("extcon: Use the unique id for external connector instead of string)
[2] Commit 046050f6e623e4
- ("extcon: Update the prototype of extcon_register_notifier() with enum extcon
[3] Commit 11eecf910bd81d
- ("extcon: Modify the id and name of external connector")
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
.../bindings/power_supply/charger-manager.txt | 4 +--
drivers/power/charger-manager.c | 31 ++++++++++++++--------
include/linux/power/charger-manager.h | 4 +--
3 files changed, 24 insertions(+), 15 deletions(-)
diff --git a/Documentation/devicetree/bindings/power_supply/charger-manager.txt b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
index ec4fe9de3137..73193e380dc2 100644
--- a/Documentation/devicetree/bindings/power_supply/charger-manager.txt
+++ b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
@@ -65,13 +65,13 @@ Example :
regulator@0 {
cm-regulator-name = "chg-reg";
cable@0 {
- cm-cable-name = "USB";
+ cm-cable-id = 5; /* EXTCON_CHG_USB_SDP */
cm-cable-extcon = "extcon-dev.0";
cm-cable-min = <475000>;
cm-cable-max = <500000>;
};
cable@1 {
- cm-cable-name = "TA";
+ cm-cable-id = 6; /* EXTCON_CHG_USB_DCP */
cm-cable-extcon = "extcon-dev.0";
cm-cable-min = <650000>;
cm-cable-max = <675000>;
diff --git a/drivers/power/charger-manager.c b/drivers/power/charger-manager.c
index e664ca7c0afd..ed63dc086eb6 100644
--- a/drivers/power/charger-manager.c
+++ b/drivers/power/charger-manager.c
@@ -1137,8 +1137,8 @@ static void charger_extcon_work(struct work_struct *work)
ret = regulator_set_current_limit(cable->charger->consumer,
cable->min_uA, cable->max_uA);
if (ret < 0) {
- pr_err("Cannot set current limit of %s (%s)\n",
- cable->charger->regulator_name, cable->name);
+ pr_err("Cannot set current limit of %s (%d)\n",
+ cable->charger->regulator_name, cable->id);
return;
}
@@ -1207,11 +1207,18 @@ static int charger_extcon_init(struct charger_manager *cm,
*/
INIT_WORK(&cable->wq, charger_extcon_work);
cable->nb.notifier_call = charger_extcon_notifier;
- ret = extcon_register_interest(&cable->extcon_dev,
- cable->extcon_name, cable->name, &cable->nb);
+
+ cable->extcon_dev = extcon_get_extcon_dev(cable->extcon_name);
+ if (IS_ERR(cable->extcon_dev)) {
+ pr_err("Cannot get extcon_dev for %s\n", cable->extcon_name);
+ return PTR_ERR(cable->extcon_dev);
+ }
+
+ ret = extcon_register_notifier(cable->extcon_dev, cable->id,
+ &cable->nb);
if (ret < 0) {
- pr_info("Cannot register extcon_dev for %s(cable: %s)\n",
- cable->extcon_name, cable->name);
+ pr_info("Cannot register extcon_dev for %s(cable: %d)\n",
+ cable->extcon_name, cable->id);
ret = -EINVAL;
}
@@ -1589,8 +1596,8 @@ static struct charger_desc *of_cm_parse_desc(struct device *dev)
chg_regs->cables = cables;
for_each_child_of_node(child, _child) {
- of_property_read_string(_child,
- "cm-cable-name", &cables->name);
+ of_property_read_u32(_child,
+ "cm-cable-id", &cables->id);
of_property_read_string(_child,
"cm-cable-extcon",
&cables->extcon_name);
@@ -1833,8 +1840,9 @@ err_reg_extcon:
for (j = 0; j < charger->num_cables; j++) {
struct charger_cable *cable = &charger->cables[j];
/* Remove notifier block if only edev exists */
- if (cable->extcon_dev.edev)
- extcon_unregister_interest(&cable->extcon_dev);
+ if (cable->extcon_dev)
+ extcon_unregister_notifier(cable->extcon_dev,
+ cable->id, &cable->nb);
}
regulator_put(desc->charger_regulators[i].consumer);
@@ -1865,7 +1873,8 @@ static int charger_manager_remove(struct platform_device *pdev)
= &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);
+ extcon_unregister_notifier(cable->extcon_dev,
+ cable->id, &cable->nb);
}
}
diff --git a/include/linux/power/charger-manager.h b/include/linux/power/charger-manager.h
index c4fa907c8f14..b3404bb825d6 100644
--- a/include/linux/power/charger-manager.h
+++ b/include/linux/power/charger-manager.h
@@ -63,10 +63,10 @@ enum cm_event_types {
*/
struct charger_cable {
const char *extcon_name;
- const char *name;
+ unsigned int id;
/* The charger-manager use Extcon framework */
- struct extcon_specific_cable_nb extcon_dev;
+ struct extcon_dev *extcon_dev;
struct work_struct wq;
struct notifier_block nb;
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Sebastian Reichel <sre@kernel.org> |
|---|---|
| Date | 2016-04-15 16:20 +0200 |
| Subject | Re: [RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon |
| Message-ID | <rocLg-4gd-9@gated-at.bofh.it> |
| In reply to | #1379390 |
[Multipart message — attachments visible in raw view] — view raw
Hi,
On Fri, Apr 15, 2016 at 09:43:34AM +0900, Chanwoo Choi wrote:
> This patch removes the deprecated notifier API of extcon framework and then use
> the new extcon API[2] with the unique id[1] to indicate the each external
> connector. Alter deprecated API as following:
> - extcon_register_interest() -> extcon_register_notifier()
> - extcon_unregister_interest() -> extcon_unregister_notifier()
>
> And, extcon alters the name of USB charger connector in patch[3] as following:
> - EXTCON_CHG_USB_SDP /* Standard Downstream Port */
> - EXTCON_CHG_USB_DCP /* Dedicated Charging Port */
> - EXTCON_CHG_USB_CDP /* Charging Downstream Port */
> - EXTCON_CHG_USB_ACA /* Accessory Charger Adapter */
>
> So, the name of external charger connector are changed as following:
> - "USB" -> "SDP"
> - "TA" -> "DCP"
>
> [1] Commit 2a9de9c0f08d61
> - ("extcon: Use the unique id for external connector instead of string)
> [2] Commit 046050f6e623e4
> - ("extcon: Update the prototype of extcon_register_notifier() with enum extcon
> [3] Commit 11eecf910bd81d
> - ("extcon: Modify the id and name of external connector")
>
> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
> ---
> .../bindings/power_supply/charger-manager.txt | 4 +--
> drivers/power/charger-manager.c | 31 ++++++++++++++--------
> include/linux/power/charger-manager.h | 4 +--
> 3 files changed, 24 insertions(+), 15 deletions(-)
>
> diff --git a/Documentation/devicetree/bindings/power_supply/charger-manager.txt b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
> index ec4fe9de3137..73193e380dc2 100644
> --- a/Documentation/devicetree/bindings/power_supply/charger-manager.txt
> +++ b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
> @@ -65,13 +65,13 @@ Example :
> regulator@0 {
> cm-regulator-name = "chg-reg";
> cable@0 {
> - cm-cable-name = "USB";
> + cm-cable-id = 5; /* EXTCON_CHG_USB_SDP */
> cm-cable-extcon = "extcon-dev.0";
> cm-cable-min = <475000>;
> cm-cable-max = <500000>;
> };
> cable@1 {
> - cm-cable-name = "TA";
> + cm-cable-id = 6; /* EXTCON_CHG_USB_DCP */
> cm-cable-extcon = "extcon-dev.0";
> cm-cable-min = <650000>;
> cm-cable-max = <675000>;
This breaks DT ABI. Looks like charger-manager is not used in
mainline, but I guess ther should be an explicit Acked-By from
a DT binding maintainer. Also I think the defines should be in
some header includable from DTS, so that something like this
can be done:
cm-cable-id = <CHARGER_USB_DCP>;
Apart from that:
Acked-By: Sebastian Reichel <sre@kernel.org>
-- Sebastian
[toc] | [prev] | [next] | [standalone]
| From | Chanwoo Choi <cw00.choi@samsung.com> |
|---|---|
| Date | 2016-04-18 07:50 +0200 |
| Subject | Re: [RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon |
| Message-ID | <rpaem-jl-15@gated-at.bofh.it> |
| In reply to | #1379845 |
Hi Sebastian,
On 2016년 04월 15일 23:13, Sebastian Reichel wrote:
> Hi,
>
> On Fri, Apr 15, 2016 at 09:43:34AM +0900, Chanwoo Choi wrote:
>> This patch removes the deprecated notifier API of extcon framework and then use
>> the new extcon API[2] with the unique id[1] to indicate the each external
>> connector. Alter deprecated API as following:
>> - extcon_register_interest() -> extcon_register_notifier()
>> - extcon_unregister_interest() -> extcon_unregister_notifier()
>>
>> And, extcon alters the name of USB charger connector in patch[3] as following:
>> - EXTCON_CHG_USB_SDP /* Standard Downstream Port */
>> - EXTCON_CHG_USB_DCP /* Dedicated Charging Port */
>> - EXTCON_CHG_USB_CDP /* Charging Downstream Port */
>> - EXTCON_CHG_USB_ACA /* Accessory Charger Adapter */
>>
>> So, the name of external charger connector are changed as following:
>> - "USB" -> "SDP"
>> - "TA" -> "DCP"
>>
>> [1] Commit 2a9de9c0f08d61
>> - ("extcon: Use the unique id for external connector instead of string)
>> [2] Commit 046050f6e623e4
>> - ("extcon: Update the prototype of extcon_register_notifier() with enum extcon
>> [3] Commit 11eecf910bd81d
>> - ("extcon: Modify the id and name of external connector")
>>
>> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
>> ---
>> .../bindings/power_supply/charger-manager.txt | 4 +--
>> drivers/power/charger-manager.c | 31 ++++++++++++++--------
>> include/linux/power/charger-manager.h | 4 +--
>> 3 files changed, 24 insertions(+), 15 deletions(-)
>>
>> diff --git a/Documentation/devicetree/bindings/power_supply/charger-manager.txt b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
>> index ec4fe9de3137..73193e380dc2 100644
>> --- a/Documentation/devicetree/bindings/power_supply/charger-manager.txt
>> +++ b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
>> @@ -65,13 +65,13 @@ Example :
>> regulator@0 {
>> cm-regulator-name = "chg-reg";
>> cable@0 {
>> - cm-cable-name = "USB";
>> + cm-cable-id = 5; /* EXTCON_CHG_USB_SDP */
>> cm-cable-extcon = "extcon-dev.0";
>> cm-cable-min = <475000>;
>> cm-cable-max = <500000>;
>> };
>> cable@1 {
>> - cm-cable-name = "TA";
>> + cm-cable-id = 6; /* EXTCON_CHG_USB_DCP */
>> cm-cable-extcon = "extcon-dev.0";
>> cm-cable-min = <650000>;
>> cm-cable-max = <675000>;
>
> This breaks DT ABI. Looks like charger-manager is not used in
> mainline,but I guess ther should be an explicit Acked-By from
> a DT binding maintainer.
As I mentioned on other mail to Rob, the purpose of this patch
removes the deprecated the EXTCON APIs. So, I touched the DT binding.
About DT ABI about charger-manager, we should handle it on separate patches.
Also I think the defines should be in
> some header includable from DTS, so that something like this
> can be done:
>
> cm-cable-id = <CHARGER_USB_DCP>;
I agree to use some definition for the kind of charger cable.
But, Not yet. I'm preparing the EXTCON update to use the definitions
on Device Tree file. I'll send some separate patches in the near future.
>
> Apart from that:
>
> Acked-By: Sebastian Reichel <sre@kernel.org>
Thanks for review.
Best Regards,
Chanwoo Choi
[toc] | [prev] | [next] | [standalone]
| From | Rob Herring <robh@kernel.org> |
|---|---|
| Date | 2016-04-18 19:30 +0200 |
| Subject | Re: [RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon |
| Message-ID | <rpl9L-Ut-5@gated-at.bofh.it> |
| In reply to | #1379845 |
On Fri, Apr 15, 2016 at 04:13:18PM +0200, Sebastian Reichel wrote:
> Hi,
>
> On Fri, Apr 15, 2016 at 09:43:34AM +0900, Chanwoo Choi wrote:
> > This patch removes the deprecated notifier API of extcon framework and then use
> > the new extcon API[2] with the unique id[1] to indicate the each external
> > connector. Alter deprecated API as following:
> > - extcon_register_interest() -> extcon_register_notifier()
> > - extcon_unregister_interest() -> extcon_unregister_notifier()
> >
> > And, extcon alters the name of USB charger connector in patch[3] as following:
> > - EXTCON_CHG_USB_SDP /* Standard Downstream Port */
> > - EXTCON_CHG_USB_DCP /* Dedicated Charging Port */
> > - EXTCON_CHG_USB_CDP /* Charging Downstream Port */
> > - EXTCON_CHG_USB_ACA /* Accessory Charger Adapter */
> >
> > So, the name of external charger connector are changed as following:
> > - "USB" -> "SDP"
> > - "TA" -> "DCP"
> >
> > [1] Commit 2a9de9c0f08d61
> > - ("extcon: Use the unique id for external connector instead of string)
> > [2] Commit 046050f6e623e4
> > - ("extcon: Update the prototype of extcon_register_notifier() with enum extcon
> > [3] Commit 11eecf910bd81d
> > - ("extcon: Modify the id and name of external connector")
> >
> > Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
> > ---
> > .../bindings/power_supply/charger-manager.txt | 4 +--
> > drivers/power/charger-manager.c | 31 ++++++++++++++--------
> > include/linux/power/charger-manager.h | 4 +--
> > 3 files changed, 24 insertions(+), 15 deletions(-)
> >
> > diff --git a/Documentation/devicetree/bindings/power_supply/charger-manager.txt b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
> > index ec4fe9de3137..73193e380dc2 100644
> > --- a/Documentation/devicetree/bindings/power_supply/charger-manager.txt
> > +++ b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
> > @@ -65,13 +65,13 @@ Example :
> > regulator@0 {
> > cm-regulator-name = "chg-reg";
> > cable@0 {
> > - cm-cable-name = "USB";
> > + cm-cable-id = 5; /* EXTCON_CHG_USB_SDP */
> > cm-cable-extcon = "extcon-dev.0";
> > cm-cable-min = <475000>;
> > cm-cable-max = <500000>;
> > };
> > cable@1 {
> > - cm-cable-name = "TA";
> > + cm-cable-id = 6; /* EXTCON_CHG_USB_DCP */
> > cm-cable-extcon = "extcon-dev.0";
> > cm-cable-min = <650000>;
> > cm-cable-max = <675000>;
>
> This breaks DT ABI. Looks like charger-manager is not used in
> mainline, but I guess ther should be an explicit Acked-By from
> a DT binding maintainer. Also I think the defines should be in
> some header includable from DTS, so that something like this
> can be done:
I already commented that the binding to start with looks like crap
(For starters, "extcon-dev.0" is a Linux device name?) and this does not
appear to be an improvement.
Rob
[toc] | [prev] | [next] | [standalone]
| From | Chanwoo Choi <cw00.choi@samsung.com> |
|---|---|
| Date | 2016-04-19 01:40 +0200 |
| Subject | Re: [RESEND PATCH 1/3] power: charger-manager: Replace deprecatd API of extcon |
| Message-ID | <rpqVP-5JO-9@gated-at.bofh.it> |
| In reply to | #1381934 |
Hi Rob,
On 2016년 04월 19일 02:24, Rob Herring wrote:
> On Fri, Apr 15, 2016 at 04:13:18PM +0200, Sebastian Reichel wrote:
>> Hi,
>>
>> On Fri, Apr 15, 2016 at 09:43:34AM +0900, Chanwoo Choi wrote:
>>> This patch removes the deprecated notifier API of extcon framework and then use
>>> the new extcon API[2] with the unique id[1] to indicate the each external
>>> connector. Alter deprecated API as following:
>>> - extcon_register_interest() -> extcon_register_notifier()
>>> - extcon_unregister_interest() -> extcon_unregister_notifier()
>>>
>>> And, extcon alters the name of USB charger connector in patch[3] as following:
>>> - EXTCON_CHG_USB_SDP /* Standard Downstream Port */
>>> - EXTCON_CHG_USB_DCP /* Dedicated Charging Port */
>>> - EXTCON_CHG_USB_CDP /* Charging Downstream Port */
>>> - EXTCON_CHG_USB_ACA /* Accessory Charger Adapter */
>>>
>>> So, the name of external charger connector are changed as following:
>>> - "USB" -> "SDP"
>>> - "TA" -> "DCP"
>>>
>>> [1] Commit 2a9de9c0f08d61
>>> - ("extcon: Use the unique id for external connector instead of string)
>>> [2] Commit 046050f6e623e4
>>> - ("extcon: Update the prototype of extcon_register_notifier() with enum extcon
>>> [3] Commit 11eecf910bd81d
>>> - ("extcon: Modify the id and name of external connector")
>>>
>>> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
>>> ---
>>> .../bindings/power_supply/charger-manager.txt | 4 +--
>>> drivers/power/charger-manager.c | 31 ++++++++++++++--------
>>> include/linux/power/charger-manager.h | 4 +--
>>> 3 files changed, 24 insertions(+), 15 deletions(-)
>>>
>>> diff --git a/Documentation/devicetree/bindings/power_supply/charger-manager.txt b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
>>> index ec4fe9de3137..73193e380dc2 100644
>>> --- a/Documentation/devicetree/bindings/power_supply/charger-manager.txt
>>> +++ b/Documentation/devicetree/bindings/power_supply/charger-manager.txt
>>> @@ -65,13 +65,13 @@ Example :
>>> regulator@0 {
>>> cm-regulator-name = "chg-reg";
>>> cable@0 {
>>> - cm-cable-name = "USB";
>>> + cm-cable-id = 5; /* EXTCON_CHG_USB_SDP */
>>> cm-cable-extcon = "extcon-dev.0";
>>> cm-cable-min = <475000>;
>>> cm-cable-max = <500000>;
>>> };
>>> cable@1 {
>>> - cm-cable-name = "TA";
>>> + cm-cable-id = 6; /* EXTCON_CHG_USB_DCP */
>>> cm-cable-extcon = "extcon-dev.0";
>>> cm-cable-min = <650000>;
>>> cm-cable-max = <675000>;
>>
>> This breaks DT ABI. Looks like charger-manager is not used in
>> mainline, but I guess ther should be an explicit Acked-By from
>> a DT binding maintainer. Also I think the defines should be in
>> some header includable from DTS, so that something like this
>> can be done:
>
> I already commented that the binding to start with looks like crap
> (For starters, "extcon-dev.0" is a Linux device name?) and this does not
> appear to be an improvement.
I already replied for your comment on other mail[1].
[1] https://lkml.org/lkml/2016/3/31/199
This patch never update the charger-manager.
Just remove the deprecated EXTCON API to prevent build error.
Thanks,
Chanwoo Choi
[toc] | [prev] | [next] | [standalone]
| From | Chanwoo Choi <cw00.choi@samsung.com> |
|---|---|
| Date | 2016-04-15 02:50 +0200 |
| Subject | [RESEND PATCH 2/3] power: axp288_charger: Replace deprecatd API of extcon |
| Message-ID | <ro07o-2xu-7@gated-at.bofh.it> |
| In reply to | #1379389 |
This patch removes the deprecated notifier API of extcon framework and then use
the new extcon API[2] with the unique id[1] to indicate the each external
connector. Alter deprecated API as following:
- extcon_register_interest() -> extcon_register_notifier()
- extcon_unregister_interest() -> extcon_unregister_notifier()
- extcon_get_cable_state() -> extcon_get_cable_state_()
And, extcon alters the name of USB charger connector in patch[3] as following:
- EXTCON_CHG_USB_SDP /* Standard Downstream Port */
- EXTCON_CHG_USB_DCP /* Dedicated Charging Port */
- EXTCON_CHG_USB_CDP /* Charging Downstream Port */
- EXTCON_CHG_USB_ACA /* Accessory Charger Adapter */
[1] Commit 2a9de9c0f08d61
- ("extcon: Use the unique id for external connector instead of string)
[2] Commit 046050f6e623e4
- ("extcon: Update the prototype of extcon_register_notifier() with enum extcon
[3] Commit 11eecf910bd81d
- ("extcon: Modify the id and name of external connector")
Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
---
drivers/power/axp288_charger.c | 77 +++++++++++++++++++++++++++++-------------
1 file changed, 53 insertions(+), 24 deletions(-)
diff --git a/drivers/power/axp288_charger.c b/drivers/power/axp288_charger.c
index e4d569f57acc..e5c2569befa6 100644
--- a/drivers/power/axp288_charger.c
+++ b/drivers/power/axp288_charger.c
@@ -129,10 +129,6 @@
#define AXP288_EXTCON_DEV_NAME "axp288_extcon"
-#define AXP288_EXTCON_SLOW_CHARGER "SLOW-CHARGER"
-#define AXP288_EXTCON_DOWNSTREAM_CHARGER "CHARGE-DOWNSTREAM"
-#define AXP288_EXTCON_FAST_CHARGER "FAST-CHARGER"
-
enum {
VBUS_OV_IRQ = 0,
CHARGE_DONE_IRQ,
@@ -158,7 +154,7 @@ struct axp288_chrg_info {
/* OTG/Host mode */
struct {
struct work_struct work;
- struct extcon_specific_cable_nb cable;
+ struct extcon_dev *cable;
struct notifier_block id_nb;
bool id_short;
} otg;
@@ -586,17 +582,15 @@ static void axp288_charger_extcon_evt_worker(struct work_struct *work)
bool old_connected = info->cable.connected;
/* Determine cable/charger type */
- if (extcon_get_cable_state(edev, AXP288_EXTCON_SLOW_CHARGER) > 0) {
+ if (extcon_get_cable_state_(edev, EXTCON_CHG_USB_SDP) > 0) {
dev_dbg(&info->pdev->dev, "USB SDP charger is connected");
info->cable.connected = true;
info->cable.chg_type = POWER_SUPPLY_TYPE_USB;
- } else if (extcon_get_cable_state(edev,
- AXP288_EXTCON_DOWNSTREAM_CHARGER) > 0) {
+ } else if (extcon_get_cable_state_(edev, EXTCON_CHG_USB_CDP) > 0) {
dev_dbg(&info->pdev->dev, "USB CDP charger is connected");
info->cable.connected = true;
info->cable.chg_type = POWER_SUPPLY_TYPE_USB_CDP;
- } else if (extcon_get_cable_state(edev,
- AXP288_EXTCON_FAST_CHARGER) > 0) {
+ } else if (extcon_get_cable_state_(edev, EXTCON_CHG_USB_DCP) > 0) {
dev_dbg(&info->pdev->dev, "USB DCP charger is connected");
info->cable.connected = true;
info->cable.chg_type = POWER_SUPPLY_TYPE_USB_DCP;
@@ -692,8 +686,8 @@ static int axp288_charger_handle_otg_evt(struct notifier_block *nb,
{
struct axp288_chrg_info *info =
container_of(nb, struct axp288_chrg_info, otg.id_nb);
- struct extcon_dev *edev = param;
- int usb_host = extcon_get_cable_state(edev, "USB-Host");
+ struct extcon_dev *edev = info->otg.cable;
+ int usb_host = extcon_get_cable_state_(edev, EXTCON_USB_HOST);
dev_dbg(&info->pdev->dev, "external connector USB-Host is %s\n",
usb_host ? "attached" : "detached");
@@ -848,10 +842,33 @@ static int axp288_charger_probe(struct platform_device *pdev)
/* Register for extcon notification */
INIT_WORK(&info->cable.work, axp288_charger_extcon_evt_worker);
info->cable.nb.notifier_call = axp288_charger_handle_cable_evt;
- ret = extcon_register_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb);
+ ret = extcon_register_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
+ &info->cable.nb);
+ if (ret) {
+ dev_err(&info->pdev->dev,
+ "failed to register extcon notifier for SDP %d\n", ret);
+ return ret;
+ }
+
+ ret = extcon_register_notifier(info->cable.edev, EXTCON_CHG_USB_CDP,
+ &info->cable.nb);
+ if (ret) {
+ dev_err(&info->pdev->dev,
+ "failed to register extcon notifier for CDP %d\n", ret);
+ extcon_unregister_notifier(info->cable.edev,
+ EXTCON_CHG_USB_SDP, &info->cable.nb);
+ return ret;
+ }
+
+ ret = extcon_register_notifier(info->cable.edev, EXTCON_CHG_USB_DCP,
+ &info->cable.nb);
if (ret) {
dev_err(&info->pdev->dev,
- "failed to register extcon notifier %d\n", ret);
+ "failed to register extcon notifier for DCP %d\n", ret);
+ extcon_unregister_notifier(info->cable.edev,
+ EXTCON_CHG_USB_SDP, &info->cable.nb);
+ extcon_unregister_notifier(info->cable.edev,
+ EXTCON_CHG_USB_CDP, &info->cable.nb);
return ret;
}
@@ -871,14 +888,14 @@ static int axp288_charger_probe(struct platform_device *pdev)
/* Register for OTG notification */
INIT_WORK(&info->otg.work, axp288_charger_otg_evt_worker);
info->otg.id_nb.notifier_call = axp288_charger_handle_otg_evt;
- ret = extcon_register_interest(&info->otg.cable, NULL, "USB-Host",
+ ret = extcon_register_notifier(info->otg.cable, EXTCON_USB_HOST,
&info->otg.id_nb);
if (ret)
dev_warn(&pdev->dev, "failed to register otg notifier\n");
- if (info->otg.cable.edev)
- info->otg.id_short = extcon_get_cable_state(
- info->otg.cable.edev, "USB-Host");
+ if (info->otg.cable)
+ info->otg.id_short = extcon_get_cable_state_(
+ info->otg.cable, EXTCON_USB_HOST);
/* Register charger interrupts */
for (i = 0; i < CHRG_INTR_END; i++) {
@@ -905,11 +922,17 @@ static int axp288_charger_probe(struct platform_device *pdev)
return 0;
intr_reg_failed:
- if (info->otg.cable.edev)
- extcon_unregister_interest(&info->otg.cable);
+ if (info->otg.cable)
+ extcon_unregister_notifier(info->otg.cable, EXTCON_USB_HOST,
+ &info->otg.id_nb);
power_supply_unregister(info->psy_usb);
psy_reg_failed:
- extcon_unregister_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb);
+ extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
+ &info->cable.nb);
+ extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
+ &info->cable.nb);
+ extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_DCP,
+ &info->cable.nb);
return ret;
}
@@ -917,10 +940,16 @@ static int axp288_charger_remove(struct platform_device *pdev)
{
struct axp288_chrg_info *info = dev_get_drvdata(&pdev->dev);
- if (info->otg.cable.edev)
- extcon_unregister_interest(&info->otg.cable);
+ if (info->otg.cable)
+ extcon_unregister_notifier(info->otg.cable, EXTCON_USB_HOST,
+ &info->otg.id_nb);
- extcon_unregister_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb);
+ extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
+ &info->cable.nb);
+ extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
+ &info->cable.nb);
+ extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_DCP,
+ &info->cable.nb);
power_supply_unregister(info->psy_usb);
return 0;
--
1.9.1
[toc] | [prev] | [next] | [standalone]
| From | Sebastian Reichel <sre@kernel.org> |
|---|---|
| Date | 2016-04-15 16:30 +0200 |
| Subject | Re: [RESEND PATCH 2/3] power: axp288_charger: Replace deprecatd API of extcon |
| Message-ID | <rocUX-4mc-39@gated-at.bofh.it> |
| In reply to | #1379391 |
[Multipart message — attachments visible in raw view] — view raw
Hi,
On Fri, Apr 15, 2016 at 09:43:35AM +0900, Chanwoo Choi wrote:
> This patch removes the deprecated notifier API of extcon framework and then use
> the new extcon API[2] with the unique id[1] to indicate the each external
> connector. Alter deprecated API as following:
> - extcon_register_interest() -> extcon_register_notifier()
> - extcon_unregister_interest() -> extcon_unregister_notifier()
> - extcon_get_cable_state() -> extcon_get_cable_state_()
>
> And, extcon alters the name of USB charger connector in patch[3] as following:
> - EXTCON_CHG_USB_SDP /* Standard Downstream Port */
> - EXTCON_CHG_USB_DCP /* Dedicated Charging Port */
> - EXTCON_CHG_USB_CDP /* Charging Downstream Port */
> - EXTCON_CHG_USB_ACA /* Accessory Charger Adapter */
>
> [1] Commit 2a9de9c0f08d61
> - ("extcon: Use the unique id for external connector instead of string)
> [2] Commit 046050f6e623e4
> - ("extcon: Update the prototype of extcon_register_notifier() with enum extcon
> [3] Commit 11eecf910bd81d
> - ("extcon: Modify the id and name of external connector")
>
> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
> ---
> drivers/power/axp288_charger.c | 77 +++++++++++++++++++++++++++++-------------
> 1 file changed, 53 insertions(+), 24 deletions(-)
>
> diff --git a/drivers/power/axp288_charger.c b/drivers/power/axp288_charger.c
> index e4d569f57acc..e5c2569befa6 100644
> --- a/drivers/power/axp288_charger.c
> +++ b/drivers/power/axp288_charger.c
> @@ -129,10 +129,6 @@
>
> #define AXP288_EXTCON_DEV_NAME "axp288_extcon"
>
> -#define AXP288_EXTCON_SLOW_CHARGER "SLOW-CHARGER"
> -#define AXP288_EXTCON_DOWNSTREAM_CHARGER "CHARGE-DOWNSTREAM"
> -#define AXP288_EXTCON_FAST_CHARGER "FAST-CHARGER"
> -
> enum {
> VBUS_OV_IRQ = 0,
> CHARGE_DONE_IRQ,
> @@ -158,7 +154,7 @@ struct axp288_chrg_info {
> /* OTG/Host mode */
> struct {
> struct work_struct work;
> - struct extcon_specific_cable_nb cable;
> + struct extcon_dev *cable;
> struct notifier_block id_nb;
> bool id_short;
> } otg;
> @@ -586,17 +582,15 @@ static void axp288_charger_extcon_evt_worker(struct work_struct *work)
> bool old_connected = info->cable.connected;
>
> /* Determine cable/charger type */
> - if (extcon_get_cable_state(edev, AXP288_EXTCON_SLOW_CHARGER) > 0) {
> + if (extcon_get_cable_state_(edev, EXTCON_CHG_USB_SDP) > 0) {
> dev_dbg(&info->pdev->dev, "USB SDP charger is connected");
> info->cable.connected = true;
> info->cable.chg_type = POWER_SUPPLY_TYPE_USB;
> - } else if (extcon_get_cable_state(edev,
> - AXP288_EXTCON_DOWNSTREAM_CHARGER) > 0) {
> + } else if (extcon_get_cable_state_(edev, EXTCON_CHG_USB_CDP) > 0) {
> dev_dbg(&info->pdev->dev, "USB CDP charger is connected");
> info->cable.connected = true;
> info->cable.chg_type = POWER_SUPPLY_TYPE_USB_CDP;
> - } else if (extcon_get_cable_state(edev,
> - AXP288_EXTCON_FAST_CHARGER) > 0) {
> + } else if (extcon_get_cable_state_(edev, EXTCON_CHG_USB_DCP) > 0) {
> dev_dbg(&info->pdev->dev, "USB DCP charger is connected");
> info->cable.connected = true;
> info->cable.chg_type = POWER_SUPPLY_TYPE_USB_DCP;
> @@ -692,8 +686,8 @@ static int axp288_charger_handle_otg_evt(struct notifier_block *nb,
> {
> struct axp288_chrg_info *info =
> container_of(nb, struct axp288_chrg_info, otg.id_nb);
> - struct extcon_dev *edev = param;
> - int usb_host = extcon_get_cable_state(edev, "USB-Host");
> + struct extcon_dev *edev = info->otg.cable;
> + int usb_host = extcon_get_cable_state_(edev, EXTCON_USB_HOST);
>
> dev_dbg(&info->pdev->dev, "external connector USB-Host is %s\n",
> usb_host ? "attached" : "detached");
> @@ -848,10 +842,33 @@ static int axp288_charger_probe(struct platform_device *pdev)
> /* Register for extcon notification */
> INIT_WORK(&info->cable.work, axp288_charger_extcon_evt_worker);
> info->cable.nb.notifier_call = axp288_charger_handle_cable_evt;
> - ret = extcon_register_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb);
> + ret = extcon_register_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
> + &info->cable.nb);
> + if (ret) {
> + dev_err(&info->pdev->dev,
> + "failed to register extcon notifier for SDP %d\n", ret);
> + return ret;
> + }
> +
> + ret = extcon_register_notifier(info->cable.edev, EXTCON_CHG_USB_CDP,
> + &info->cable.nb);
> + if (ret) {
> + dev_err(&info->pdev->dev,
> + "failed to register extcon notifier for CDP %d\n", ret);
> + extcon_unregister_notifier(info->cable.edev,
> + EXTCON_CHG_USB_SDP, &info->cable.nb);
> + return ret;
> + }
> +
> + ret = extcon_register_notifier(info->cable.edev, EXTCON_CHG_USB_DCP,
> + &info->cable.nb);
> if (ret) {
> dev_err(&info->pdev->dev,
> - "failed to register extcon notifier %d\n", ret);
> + "failed to register extcon notifier for DCP %d\n", ret);
> + extcon_unregister_notifier(info->cable.edev,
> + EXTCON_CHG_USB_SDP, &info->cable.nb);
> + extcon_unregister_notifier(info->cable.edev,
> + EXTCON_CHG_USB_CDP, &info->cable.nb);
> return ret;
> }
>
> @@ -871,14 +888,14 @@ static int axp288_charger_probe(struct platform_device *pdev)
> /* Register for OTG notification */
> INIT_WORK(&info->otg.work, axp288_charger_otg_evt_worker);
> info->otg.id_nb.notifier_call = axp288_charger_handle_otg_evt;
> - ret = extcon_register_interest(&info->otg.cable, NULL, "USB-Host",
> + ret = extcon_register_notifier(info->otg.cable, EXTCON_USB_HOST,
> &info->otg.id_nb);
> if (ret)
> dev_warn(&pdev->dev, "failed to register otg notifier\n");
>
> - if (info->otg.cable.edev)
> - info->otg.id_short = extcon_get_cable_state(
> - info->otg.cable.edev, "USB-Host");
> + if (info->otg.cable)
> + info->otg.id_short = extcon_get_cable_state_(
> + info->otg.cable, EXTCON_USB_HOST);
>
> /* Register charger interrupts */
> for (i = 0; i < CHRG_INTR_END; i++) {
> @@ -905,11 +922,17 @@ static int axp288_charger_probe(struct platform_device *pdev)
> return 0;
>
> intr_reg_failed:
> - if (info->otg.cable.edev)
> - extcon_unregister_interest(&info->otg.cable);
> + if (info->otg.cable)
> + extcon_unregister_notifier(info->otg.cable, EXTCON_USB_HOST,
> + &info->otg.id_nb);
> power_supply_unregister(info->psy_usb);
> psy_reg_failed:
> - extcon_unregister_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb);
> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
> + &info->cable.nb);
> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
> + &info->cable.nb);
EXTCON_CHG_USB_SDP -> EXTCON_CHG_USB_CDP?
> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_DCP,
> + &info->cable.nb);
> return ret;
> }
>
> @@ -917,10 +940,16 @@ static int axp288_charger_remove(struct platform_device *pdev)
> {
> struct axp288_chrg_info *info = dev_get_drvdata(&pdev->dev);
>
> - if (info->otg.cable.edev)
> - extcon_unregister_interest(&info->otg.cable);
> + if (info->otg.cable)
> + extcon_unregister_notifier(info->otg.cable, EXTCON_USB_HOST,
> + &info->otg.id_nb);
>
> - extcon_unregister_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb);
> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
> + &info->cable.nb);
> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
> + &info->cable.nb);
EXTCON_CHG_USB_SDP -> EXTCON_CHG_USB_CDP?
> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_DCP,
> + &info->cable.nb);
> power_supply_unregister(info->psy_usb);
>
> return 0;
Has this dependencies to your tree or are all dependencies already
in torvalds tree?
-- Sebastian
[toc] | [prev] | [next] | [standalone]
| From | Chanwoo Choi <cw00.choi@samsung.com> |
|---|---|
| Date | 2016-04-18 07:40 +0200 |
| Subject | Re: [RESEND PATCH 2/3] power: axp288_charger: Replace deprecatd API of extcon |
| Message-ID | <rpa4G-f9-7@gated-at.bofh.it> |
| In reply to | #1379868 |
Hi Sebastian,
On 2016년 04월 15일 23:20, Sebastian Reichel wrote:
> Hi,
>
> On Fri, Apr 15, 2016 at 09:43:35AM +0900, Chanwoo Choi wrote:
>> This patch removes the deprecated notifier API of extcon framework and then use
>> the new extcon API[2] with the unique id[1] to indicate the each external
>> connector. Alter deprecated API as following:
>> - extcon_register_interest() -> extcon_register_notifier()
>> - extcon_unregister_interest() -> extcon_unregister_notifier()
>> - extcon_get_cable_state() -> extcon_get_cable_state_()
>>
>> And, extcon alters the name of USB charger connector in patch[3] as following:
>> - EXTCON_CHG_USB_SDP /* Standard Downstream Port */
>> - EXTCON_CHG_USB_DCP /* Dedicated Charging Port */
>> - EXTCON_CHG_USB_CDP /* Charging Downstream Port */
>> - EXTCON_CHG_USB_ACA /* Accessory Charger Adapter */
>>
>> [1] Commit 2a9de9c0f08d61
>> - ("extcon: Use the unique id for external connector instead of string)
>> [2] Commit 046050f6e623e4
>> - ("extcon: Update the prototype of extcon_register_notifier() with enum extcon
>> [3] Commit 11eecf910bd81d
>> - ("extcon: Modify the id and name of external connector")
>>
>> Signed-off-by: Chanwoo Choi <cw00.choi@samsung.com>
>> ---
>> drivers/power/axp288_charger.c | 77 +++++++++++++++++++++++++++++-------------
>> 1 file changed, 53 insertions(+), 24 deletions(-)
>>
>> diff --git a/drivers/power/axp288_charger.c b/drivers/power/axp288_charger.c
>> index e4d569f57acc..e5c2569befa6 100644
>> --- a/drivers/power/axp288_charger.c
>> +++ b/drivers/power/axp288_charger.c
>> @@ -129,10 +129,6 @@
>>
[snip]
>> /* Register charger interrupts */
>> for (i = 0; i < CHRG_INTR_END; i++) {
>> @@ -905,11 +922,17 @@ static int axp288_charger_probe(struct platform_device *pdev)
>> return 0;
>>
>> intr_reg_failed:
>> - if (info->otg.cable.edev)
>> - extcon_unregister_interest(&info->otg.cable);
>> + if (info->otg.cable)
>> + extcon_unregister_notifier(info->otg.cable, EXTCON_USB_HOST,
>> + &info->otg.id_nb);
>> power_supply_unregister(info->psy_usb);
>> psy_reg_failed:
>> - extcon_unregister_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb);
>> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
>> + &info->cable.nb);
>> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
>> + &info->cable.nb);
>
> EXTCON_CHG_USB_SDP -> EXTCON_CHG_USB_CDP?
I was mistaken. I'll fix it.
>
>> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_DCP,
>> + &info->cable.nb);
>> return ret;
>> }
>>
>> @@ -917,10 +940,16 @@ static int axp288_charger_remove(struct platform_device *pdev)
>> {
>> struct axp288_chrg_info *info = dev_get_drvdata(&pdev->dev);
>>
>> - if (info->otg.cable.edev)
>> - extcon_unregister_interest(&info->otg.cable);
>> + if (info->otg.cable)
>> + extcon_unregister_notifier(info->otg.cable, EXTCON_USB_HOST,
>> + &info->otg.id_nb);
>>
>> - extcon_unregister_notifier(info->cable.edev, EXTCON_NONE, &info->cable.nb);
>> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
>> + &info->cable.nb);
>> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_SDP,
>> + &info->cable.nb);
>
> EXTCON_CHG_USB_SDP -> EXTCON_CHG_USB_CDP?
ditto.
>
>> + extcon_unregister_notifier(info->cable.edev, EXTCON_CHG_USB_DCP,
>> + &info->cable.nb);
>> power_supply_unregister(info->psy_usb);
>>
>> return 0;
>
> Has this dependencies to your tree or are all dependencies already
> in torvalds tree?
This patch-set have the dependency on Linus torvalds tree[1].
[1] https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/
So, when picking this patch-set, someone make the immutable branch for this patchset
to prevent the merge conflict between power_supply and extcon tree.
Thanks,
Chanwoo Choi
[toc] | [prev] | [standalone]
Back to top | Article view | linux.kernel
csiph-web