From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Subject: Re: [PATCH v5 05/14] usb: typec: add API to get typec basic port power and data config References: <1525307094-27402-1-git-send-email-jun.li@nxp.com> <1525307094-27402-6-git-send-email-jun.li@nxp.com> <74e1c164-1652-75f4-409c-bd1c214bda4d@gmail.com> <20180516122527.GC11469@kuha.fi.intel.com> From: Mats Karrman Message-ID: <33d02e76-bdf2-be50-68ec-9d520acdbe82@gmail.com> Date: Wed, 16 May 2018 22:55:36 +0200 MIME-Version: 1.0 In-Reply-To: <20180516122527.GC11469@kuha.fi.intel.com> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Content-Language: en-US To: Heikki Krogerus , Jun Li Cc: "robh+dt@kernel.org" , "gregkh@linuxfoundation.org" , "linux@roeck-us.net" , "a.hajda@samsung.com" , "cw00.choi@samsung.com" , "shufan_lee@richtek.com" , Peter Chen , "gsomlo@gmail.com" , "devicetree@vger.kernel.org" , "linux-usb@vger.kernel.org" , dl-linux-imx List-ID: Hi, On 05/16/2018 02:25 PM, Heikki Krogerus wrote: > Hi guys, > > On Tue, May 15, 2018 at 10:52:57PM +0200, Mats Karrman wrote: >> Hi, >> >> On 05/14/2018 11:36 AM, Jun Li wrote: >> >>> Hi >>>> -----Original Message----- >>>> From: Mats Karrman [mailto:mats.dev.list@gmail.com] >>>> Sent: 2018???5???12??? 3:56 >>>> To: Jun Li ; robh+dt@kernel.org; gregkh@linuxfoundation.org; >>>> heikki.krogerus@linux.intel.com; linux@roeck-us.net >>>> Cc: a.hajda@samsung.com; cw00.choi@samsung.com; >>>> shufan_lee@richtek.com; Peter Chen ; >>>> gsomlo@gmail.com; devicetree@vger.kernel.org; linux-usb@vger.kernel.org; >>>> dl-linux-imx >>>> Subject: Re: [PATCH v5 05/14] usb: typec: add API to get typec basic port power >>>> and data config >>>> >>>> Hi Li Jun, >>>> >>>> On 2018-05-03 02:24, Li Jun wrote: >>>> >>>>> This patch adds 3 APIs to get the typec port power and data type, and >>>>> preferred power role by its name string. >>>>> >>>>> Signed-off-by: Li Jun >>>>> --- >>>>> drivers/usb/typec/class.c | 52 >>>> +++++++++++++++++++++++++++++++++++++++++++++++ >>>>> include/linux/usb/typec.h | 3 +++ >>>>> 2 files changed, 55 insertions(+) >>>>> >>>>> diff --git a/drivers/usb/typec/class.c b/drivers/usb/typec/class.c >>>>> index 53df10d..5981e18 100644 >>>>> --- a/drivers/usb/typec/class.c >>>>> +++ b/drivers/usb/typec/class.c >>>>> @@ -9,6 +9,7 @@ >>>>> #include >>>>> #include >>>>> #include >>>>> +#include > I don't think you need that anymore. > >>>>> #include >>>>> #include >>>>> #include >>>>> @@ -802,6 +803,12 @@ static const char * const typec_port_types[] = { >>>>> [TYPEC_PORT_DRP] = "dual", >>>>> }; >>>>> >>>>> +static const char * const typec_data_types[] = { >>>>> + [TYPEC_PORT_DFP] = "host", >>>>> + [TYPEC_PORT_UFP] = "device", >>>>> + [TYPEC_PORT_DRD] = "dual", >>>>> +}; >>>>> + >>>>> static const char * const typec_port_types_drp[] = { >>>>> [TYPEC_PORT_SRC] = "dual [source] sink", >>>>> [TYPEC_PORT_SNK] = "dual source [sink]", @@ -1252,6 +1259,51 >>>> @@ >>>>> void typec_set_pwr_opmode(struct typec_port *port, >>>>> } >>>>> EXPORT_SYMBOL_GPL(typec_set_pwr_opmode); >>>>> >>>>> +/** >>>>> + * typec_find_power_type - Get the typec port power type >>>> Why is this function called typec_find_power_type() and not >>>> typec_find_port_type()? >>>> It's called port_type in sysfs, having different names just adds confusion. >>>> (Otherwise I agree power_type is a better name but...) >>> We have "port type" before the power and data role separation, >>> this API name's intention is to reflect the power cap, anyway I >>> leave this to be decided by Heikki then. > I really hate the "*_type" naming. It was understandable when there > was no separate power and data roles defined in the specification, but > now that there are, it's just confusing. IMO we should not use it > anywhere. > > So to me typec_find_type() is just as bad as typec_find_power_type() > because it has the "type" in it. I wonder if this function is > necessary at all? If it is, then perhaps we can think of some better > name for it, name that gives a better hint what it is used for. I reread this patch and tried to see it more in the context of the other patches and the existing code. The naming of the existing string tables doesn't help in getting this right, however I have a proposal: typec_find_port_power_role() to get to TYPEC_PORT_SRC/SNK/DRP typec_find_port_data_role() to get to TYPEC_PORT_DFP/UFP/DRD typec_find_power_role() to get to TYPEC_SINK/SOURCE and sometime, if the use should arise typec_find_data_role() to get to TYPEC_DEVICE/HOST I think it is fairly comprehensible, *_port_* concerns a capability and without *_port_* it is an actual state. Plus it matches the names of the constants. BR // Mats >>>>> + * @name: port type string >>>>> + * >>>>> + * This routine is used to find the typec_port_type by its string name. >>>>> + * >>>>> + * Returns typec_port_type if success, otherwise negative error code. >>>>> + */ >>>>> +int typec_find_power_type(const char *name) { >>>>> + return match_string(typec_port_types, ARRAY_SIZE(typec_port_types), >>>>> + name); >>>>> +} >>>>> +EXPORT_SYMBOL_GPL(typec_find_power_type); >>>>> + >>>>> +/** >>>>> + * typec_find_preferred_role - Find the typec drp port preferred >>>>> +power role >>>> Why typec_find_preferred_role()? Could be used for any power_role so why not >>>> typec_find_power_role()? >>> I am not sure if I catch your point of this comment. >>> For preferred role(if support try.sink or try.src) the only allowed power roles are >>> "sink" >>> "source" >>> But for power role, the allowed type are >>> "sink" >>> "source" >>> "dual" >> Uhm, typing too fast again, I am. A better name would be just typec_find_role(). >> What I mean is that the function could be used for any situation when >> someone wants to map a string to a TYPEC_{SOURCE,SINK} constant so it >> is unnecessary to limit its usage to just preferred role. > That sounds reasonable to me. > > > Thanks, > From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: [v5,05/14] usb: typec: add API to get typec basic port power and data config From: Mats Karrman Message-Id: <33d02e76-bdf2-be50-68ec-9d520acdbe82@gmail.com> Date: Wed, 16 May 2018 22:55:36 +0200 To: Heikki Krogerus , Jun Li Cc: "robh+dt@kernel.org" , "gregkh@linuxfoundation.org" , "linux@roeck-us.net" , "a.hajda@samsung.com" , "cw00.choi@samsung.com" , "shufan_lee@richtek.com" , Peter Chen , "gsomlo@gmail.com" , "devicetree@vger.kernel.org" , "linux-usb@vger.kernel.org" , dl-linux-imx List-ID: SGksCgpPbiAwNS8xNi8yMDE4IDAyOjI1IFBNLCBIZWlra2kgS3JvZ2VydXMgd3JvdGU6Cgo+IEhp IGd1eXMsCj4KPiBPbiBUdWUsIE1heSAxNSwgMjAxOCBhdCAxMDo1Mjo1N1BNICswMjAwLCBNYXRz IEthcnJtYW4gd3JvdGU6Cj4+IEhpLAo+Pgo+PiBPbiAwNS8xNC8yMDE4IDExOjM2IEFNLCBKdW4g TGkgd3JvdGU6Cj4+Cj4+PiBIaQo+Pj4+IC0tLS0tT3JpZ2luYWwgTWVzc2FnZS0tLS0tCj4+Pj4g RnJvbTogTWF0cyBLYXJybWFuIFttYWlsdG86bWF0cy5kZXYubGlzdEBnbWFpbC5jb21dCj4+Pj4g U2VudDogMjAxOD8/PzU/Pz8xMj8/PyAzOjU2Cj4+Pj4gVG86IEp1biBMaSA8anVuLmxpQG54cC5j b20+OyByb2JoK2R0QGtlcm5lbC5vcmc7IGdyZWdraEBsaW51eGZvdW5kYXRpb24ub3JnOwo+Pj4+ IGhlaWtraS5rcm9nZXJ1c0BsaW51eC5pbnRlbC5jb207IGxpbnV4QHJvZWNrLXVzLm5ldAo+Pj4+ IENjOiBhLmhhamRhQHNhbXN1bmcuY29tOyBjdzAwLmNob2lAc2Ftc3VuZy5jb207Cj4+Pj4gc2h1 ZmFuX2xlZUByaWNodGVrLmNvbTsgUGV0ZXIgQ2hlbiA8cGV0ZXIuY2hlbkBueHAuY29tPjsKPj4+ PiBnc29tbG9AZ21haWwuY29tOyBkZXZpY2V0cmVlQHZnZXIua2VybmVsLm9yZzsgbGludXgtdXNi QHZnZXIua2VybmVsLm9yZzsKPj4+PiBkbC1saW51eC1pbXggPGxpbnV4LWlteEBueHAuY29tPgo+ Pj4+IFN1YmplY3Q6IFJlOiBbUEFUQ0ggdjUgMDUvMTRdIHVzYjogdHlwZWM6IGFkZCBBUEkgdG8g Z2V0IHR5cGVjIGJhc2ljIHBvcnQgcG93ZXIKPj4+PiBhbmQgZGF0YSBjb25maWcKPj4+Pgo+Pj4+ IEhpIExpIEp1biwKPj4+Pgo+Pj4+IE9uIDIwMTgtMDUtMDMgMDI6MjQsIExpIEp1biB3cm90ZToK Pj4+Pgo+Pj4+PiBUaGlzIHBhdGNoIGFkZHMgMyBBUElzIHRvIGdldCB0aGUgdHlwZWMgcG9ydCBw b3dlciBhbmQgZGF0YSB0eXBlLCBhbmQKPj4+Pj4gcHJlZmVycmVkIHBvd2VyIHJvbGUgYnkgaXRz IG5hbWUgc3RyaW5nLgo+Pj4+Pgo+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBMaSBKdW4gPGp1bi5saUBu eHAuY29tPgo+Pj4+PiAtLS0KPj4+Pj4gICBkcml2ZXJzL3VzYi90eXBlYy9jbGFzcy5jIHwgNTIK Pj4+PiArKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKwo+Pj4+ PiAgIGluY2x1ZGUvbGludXgvdXNiL3R5cGVjLmggfCAgMyArKysKPj4+Pj4gICAyIGZpbGVzIGNo YW5nZWQsIDU1IGluc2VydGlvbnMoKykKPj4+Pj4KPj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMv dXNiL3R5cGVjL2NsYXNzLmMgYi9kcml2ZXJzL3VzYi90eXBlYy9jbGFzcy5jCj4+Pj4+IGluZGV4 IDUzZGYxMGQuLjU5ODFlMTggMTAwNjQ0Cj4+Pj4+IC0tLSBhL2RyaXZlcnMvdXNiL3R5cGVjL2Ns YXNzLmMKPj4+Pj4gKysrIGIvZHJpdmVycy91c2IvdHlwZWMvY2xhc3MuYwo+Pj4+PiBAQCAtOSw2 ICs5LDcgQEAKPj4+Pj4gICAjaW5jbHVkZSA8bGludXgvZGV2aWNlLmg+Cj4+Pj4+ICAgI2luY2x1 ZGUgPGxpbnV4L21vZHVsZS5oPgo+Pj4+PiAgICNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgo+Pj4+ PiArI2luY2x1ZGUgPGxpbnV4L3Byb3BlcnR5Lmg+Cj4gSSBkb24ndCB0aGluayB5b3UgbmVlZCB0 aGF0IGFueW1vcmUuCj4KPj4+Pj4gICAjaW5jbHVkZSA8bGludXgvc2xhYi5oPgo+Pj4+PiAgICNp bmNsdWRlIDxsaW51eC91c2IvdHlwZWMuaD4KPj4+Pj4gICAjaW5jbHVkZSA8bGludXgvdXNiL3R5 cGVjX211eC5oPgo+Pj4+PiBAQCAtODAyLDYgKzgwMywxMiBAQCBzdGF0aWMgY29uc3QgY2hhciAq IGNvbnN0IHR5cGVjX3BvcnRfdHlwZXNbXSA9IHsKPj4+Pj4gICAJW1RZUEVDX1BPUlRfRFJQXSA9 ICJkdWFsIiwKPj4+Pj4gICB9Owo+Pj4+Pgo+Pj4+PiArc3RhdGljIGNvbnN0IGNoYXIgKiBjb25z dCB0eXBlY19kYXRhX3R5cGVzW10gPSB7Cj4+Pj4+ICsJW1RZUEVDX1BPUlRfREZQXSA9ICJob3N0 IiwKPj4+Pj4gKwlbVFlQRUNfUE9SVF9VRlBdID0gImRldmljZSIsCj4+Pj4+ICsJW1RZUEVDX1BP UlRfRFJEXSA9ICJkdWFsIiwKPj4+Pj4gK307Cj4+Pj4+ICsKPj4+Pj4gICBzdGF0aWMgY29uc3Qg Y2hhciAqIGNvbnN0IHR5cGVjX3BvcnRfdHlwZXNfZHJwW10gPSB7Cj4+Pj4+ICAgCVtUWVBFQ19Q T1JUX1NSQ10gPSAiZHVhbCBbc291cmNlXSBzaW5rIiwKPj4+Pj4gICAJW1RZUEVDX1BPUlRfU05L XSA9ICJkdWFsIHNvdXJjZSBbc2lua10iLCBAQCAtMTI1Miw2ICsxMjU5LDUxCj4+Pj4gQEAKPj4+ Pj4gdm9pZCB0eXBlY19zZXRfcHdyX29wbW9kZShzdHJ1Y3QgdHlwZWNfcG9ydCAqcG9ydCwKPj4+ Pj4gICB9Cj4+Pj4+ICAgRVhQT1JUX1NZTUJPTF9HUEwodHlwZWNfc2V0X3B3cl9vcG1vZGUpOwo+ Pj4+Pgo+Pj4+PiArLyoqCj4+Pj4+ICsgKiB0eXBlY19maW5kX3Bvd2VyX3R5cGUgLSBHZXQgdGhl IHR5cGVjIHBvcnQgcG93ZXIgdHlwZQo+Pj4+IFdoeSBpcyB0aGlzIGZ1bmN0aW9uIGNhbGxlZCB0 eXBlY19maW5kX3Bvd2VyX3R5cGUoKSBhbmQgbm90Cj4+Pj4gdHlwZWNfZmluZF9wb3J0X3R5cGUo KT8KPj4+PiBJdCdzIGNhbGxlZCBwb3J0X3R5cGUgaW4gc3lzZnMsIGhhdmluZyBkaWZmZXJlbnQg bmFtZXMganVzdCBhZGRzIGNvbmZ1c2lvbi4KPj4+PiAoT3RoZXJ3aXNlIEkgYWdyZWUgcG93ZXJf dHlwZSBpcyBhIGJldHRlciBuYW1lIGJ1dC4uLikKPj4+IFdlIGhhdmUgInBvcnQgdHlwZSIgYmVm b3JlIHRoZSBwb3dlciBhbmQgZGF0YSByb2xlIHNlcGFyYXRpb24sCj4+PiB0aGlzIEFQSSBuYW1l J3MgaW50ZW50aW9uIGlzIHRvIHJlZmxlY3QgdGhlIHBvd2VyIGNhcCwgYW55d2F5IEkKPj4+IGxl YXZlIHRoaXMgdG8gYmUgZGVjaWRlZCBieSBIZWlra2kgdGhlbi4KPiBJIHJlYWxseSBoYXRlIHRo ZSAiKl90eXBlIiBuYW1pbmcuIEl0IHdhcyB1bmRlcnN0YW5kYWJsZSB3aGVuIHRoZXJlCj4gd2Fz IG5vIHNlcGFyYXRlIHBvd2VyIGFuZCBkYXRhIHJvbGVzIGRlZmluZWQgaW4gdGhlIHNwZWNpZmlj YXRpb24sIGJ1dAo+IG5vdyB0aGF0IHRoZXJlIGFyZSwgaXQncyBqdXN0IGNvbmZ1c2luZy4gSU1P IHdlIHNob3VsZCBub3QgdXNlIGl0Cj4gYW55d2hlcmUuCj4KPiBTbyB0byBtZSB0eXBlY19maW5k X3R5cGUoKSBpcyBqdXN0IGFzIGJhZCBhcyB0eXBlY19maW5kX3Bvd2VyX3R5cGUoKQo+IGJlY2F1 c2UgaXQgaGFzIHRoZSAidHlwZSIgaW4gaXQuIEkgd29uZGVyIGlmIHRoaXMgZnVuY3Rpb24gaXMK PiBuZWNlc3NhcnkgYXQgYWxsPyBJZiBpdCBpcywgdGhlbiBwZXJoYXBzIHdlIGNhbiB0aGluayBv ZiBzb21lIGJldHRlcgo+IG5hbWUgZm9yIGl0LCBuYW1lIHRoYXQgZ2l2ZXMgYSBiZXR0ZXIgaGlu dCB3aGF0IGl0IGlzIHVzZWQgZm9yLgoKSSByZXJlYWQgdGhpcyBwYXRjaCBhbmQgdHJpZWQgdG8g c2VlIGl0IG1vcmUgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG90aGVyCnBhdGNoZXMgYW5kIHRoZSBl eGlzdGluZyBjb2RlLiBUaGUgbmFtaW5nIG9mIHRoZSBleGlzdGluZyBzdHJpbmcgdGFibGVzCmRv ZXNuJ3QgaGVscCBpbiBnZXR0aW5nIHRoaXMgcmlnaHQsIGhvd2V2ZXIgSSBoYXZlIGEgcHJvcG9z YWw6Cgp0eXBlY19maW5kX3BvcnRfcG93ZXJfcm9sZSgpIHRvIGdldCB0byBUWVBFQ19QT1JUX1NS Qy9TTksvRFJQCnR5cGVjX2ZpbmRfcG9ydF9kYXRhX3JvbGUoKSB0byBnZXQgdG8gVFlQRUNfUE9S VF9ERlAvVUZQL0RSRAp0eXBlY19maW5kX3Bvd2VyX3JvbGUoKSB0byBnZXQgdG8gVFlQRUNfU0lO Sy9TT1VSQ0UKCmFuZCBzb21ldGltZSwgaWYgdGhlIHVzZSBzaG91bGQgYXJpc2UgCgp0eXBlY19m aW5kX2RhdGFfcm9sZSgpIHRvIGdldCB0byBUWVBFQ19ERVZJQ0UvSE9TVAoKSSB0aGluayBpdCBp cyBmYWlybHkgY29tcHJlaGVuc2libGUsICpfcG9ydF8qIGNvbmNlcm5zIGEgY2FwYWJpbGl0eSBh bmQKd2l0aG91dCAqX3BvcnRfKiBpdCBpcyBhbiBhY3R1YWwgc3RhdGUuIFBsdXMgaXQgbWF0Y2hl cyB0aGUgbmFtZXMgb2YgdGhlCmNvbnN0YW50cy4KCkJSIC8vIE1hdHMKCj4+Pj4+ICsgKiBAbmFt ZTogcG9ydCB0eXBlIHN0cmluZwo+Pj4+PiArICoKPj4+Pj4gKyAqIFRoaXMgcm91dGluZSBpcyB1 c2VkIHRvIGZpbmQgdGhlIHR5cGVjX3BvcnRfdHlwZSBieSBpdHMgc3RyaW5nIG5hbWUuCj4+Pj4+ ICsgKgo+Pj4+PiArICogUmV0dXJucyB0eXBlY19wb3J0X3R5cGUgaWYgc3VjY2Vzcywgb3RoZXJ3 aXNlIG5lZ2F0aXZlIGVycm9yIGNvZGUuCj4+Pj4+ICsgKi8KPj4+Pj4gK2ludCB0eXBlY19maW5k X3Bvd2VyX3R5cGUoY29uc3QgY2hhciAqbmFtZSkgewo+Pj4+PiArCXJldHVybiBtYXRjaF9zdHJp bmcodHlwZWNfcG9ydF90eXBlcywgQVJSQVlfU0laRSh0eXBlY19wb3J0X3R5cGVzKSwKPj4+Pj4g KwkJCSAgICBuYW1lKTsKPj4+Pj4gK30KPj4+Pj4gK0VYUE9SVF9TWU1CT0xfR1BMKHR5cGVjX2Zp bmRfcG93ZXJfdHlwZSk7Cj4+Pj4+ICsKPj4+Pj4gKy8qKgo+Pj4+PiArICogdHlwZWNfZmluZF9w cmVmZXJyZWRfcm9sZSAtIEZpbmQgdGhlIHR5cGVjIGRycCBwb3J0IHByZWZlcnJlZAo+Pj4+PiAr cG93ZXIgcm9sZQo+Pj4+IFdoeSB0eXBlY19maW5kX3ByZWZlcnJlZF9yb2xlKCk/IENvdWxkIGJl IHVzZWQgZm9yIGFueSBwb3dlcl9yb2xlIHNvIHdoeSBub3QKPj4+PiB0eXBlY19maW5kX3Bvd2Vy X3JvbGUoKT8KPj4+IEkgYW0gbm90IHN1cmUgaWYgSSBjYXRjaCB5b3VyIHBvaW50IG9mIHRoaXMg Y29tbWVudC4KPj4+IEZvciBwcmVmZXJyZWQgcm9sZShpZiBzdXBwb3J0IHRyeS5zaW5rIG9yIHRy eS5zcmMpIHRoZSBvbmx5IGFsbG93ZWQgcG93ZXIgcm9sZXMgYXJlIAo+Pj4gInNpbmsiCj4+PiAi c291cmNlIgo+Pj4gQnV0IGZvciBwb3dlciByb2xlLCB0aGUgYWxsb3dlZCB0eXBlIGFyZSAKPj4+ ICJzaW5rIgo+Pj4gInNvdXJjZSIKPj4+ICJkdWFsIgo+PiBVaG0sIHR5cGluZyB0b28gZmFzdCBh Z2FpbiwgSSBhbS4gQSBiZXR0ZXIgbmFtZSB3b3VsZCBiZSBqdXN0IHR5cGVjX2ZpbmRfcm9sZSgp Lgo+PiBXaGF0IEkgbWVhbiBpcyB0aGF0IHRoZSBmdW5jdGlvbiBjb3VsZCBiZSB1c2VkIGZvciBh bnkgc2l0dWF0aW9uIHdoZW4KPj4gc29tZW9uZSB3YW50cyB0byBtYXAgYSBzdHJpbmcgdG8gYSBU WVBFQ197U09VUkNFLFNJTkt9IGNvbnN0YW50IHNvIGl0Cj4+IGlzIHVubmVjZXNzYXJ5IHRvIGxp bWl0IGl0cyB1c2FnZSB0byBqdXN0IHByZWZlcnJlZCByb2xlLgo+IFRoYXQgc291bmRzIHJlYXNv bmFibGUgdG8gbWUuCj4KPgo+IFRoYW5rcywKPgotLS0KVG8gdW5zdWJzY3JpYmUgZnJvbSB0aGlz IGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGxpbnV4LXVzYiIgaW4KdGhlIGJvZHkg b2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5lbC5vcmcKTW9yZSBtYWpvcmRvbW8g aW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpvcmRvbW8taW5mby5odG1sCg==