From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Google-Smtp-Source: AG47ELs81C5FXf2o/PoIYiP/LD+tmyxzwhorCzj9z3BSOfvDxX7EsizscKhHagYH00EbBNb7Fmfi ARC-Seal: i=1; a=rsa-sha256; t=1519830486; cv=none; d=google.com; s=arc-20160816; b=J2Ke0K+qvMjkVr3pRFiIICJC90kInKxLWIO4Su0QAUMFVIkVBKGkb5J/Y92Jbv6DwG XJKc0HTrR1w0G1oebQHQxbLEW37XbAUdwreIdeIoxU3KKzA3hm6WADVcv+KsotVbe3iO 20IHUkxSi0jiyWoQnDEfSraKGJ86m22c3eJpKy4dNQiMLDNnJRRApI9QYxtvEiPUh7Mx rIAVXCvR4FVz8b9Jo2TkRWz0MkZiNYzkvIh4eX9jDsXQYkYZ3LYO1rCG4ehgus+8IHxe ZcGrpdjqc8jG0j7x8yyTk1jelU54wahn2qBf57yrJTy/iWRpfGvISXaYs4XvkcKagpZk rkCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :arc-authentication-results; bh=7euodGnnm469zz+riw4NyRfFuhFW/4o6YTtDK4y9Tw0=; b=otXLKvOMRLh9TU2BO3qeMgVREnN5AepT93JI63dYxz/NbzZkObl0WZkdrsHpjc22JK eDwXEW4divqcAwpRU9U1oaZ8E2mcHn10z44nhaUzLlCpWoXLQ25BopJ6HyN21G9/XNCf EyK6ExyEEIYNiTnszfiwiN78Ts3PmL34DTTO1PwVE5SyIYqq/EYcT44NT3nDsLcpHDqF PLh/eMM8anmuTiFJh/1QS94yv8wf4frm6BSdU8z7Xbs9+7IUTsnJn88no77jKi5FTen1 Po1giL2azMgojZ+FPpCf6gAIFwjvXk21UiarEgS9b3ZQv02u8pp4jXZ6A6ZH9knqBt06 H2LQ== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of hdegoede@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=hdegoede@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Authentication-Results: mx.google.com; spf=pass (google.com: domain of hdegoede@redhat.com designates 66.187.233.73 as permitted sender) smtp.mailfrom=hdegoede@redhat.com; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com From: Hans de Goede To: Darren Hart , Andy Shevchenko , MyungJoo Ham , Chanwoo Choi , Mathias Nyman , Heikki Krogerus , Greg Kroah-Hartman , Guenter Roeck Cc: Hans de Goede , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org Subject: [PATCH v5 05/12] usb: typec: tcpm: Set USB role switch to device mode when configured as such Date: Wed, 28 Feb 2018 16:07:42 +0100 Message-Id: <20180228150749.26831-6-hdegoede@redhat.com> In-Reply-To: <20180228150749.26831-1-hdegoede@redhat.com> References: <20180228150749.26831-1-hdegoede@redhat.com> X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: =?utf-8?q?1593657772092008114?= X-GMAIL-MSGID: =?utf-8?q?1593657772092008114?= X-Mailing-List: linux-kernel@vger.kernel.org List-ID: Setting the mux to MUX_NONE and the switch to USB_SWITCH_DISCONNECT when the data-role is device is not correct. Plenty of devices support operating as USB device through a (separate) USB device controller. We really need 2 different versions of USB_SWITCH_CONNECT, USB_SWITCH_CONNECT_HOST and USB_SWITCH_DEVICE. Rather then modifying the tcpc_usb_switch enum for this, simply remove it and switch to the usb_role enum which provides exactly this, this will save use needing to convert betweent the 2 enums when calling an usb-role-switch driver later. Besides switching to the usb_role type, this commit also actually sets the mux to TYPEC_MUX_USB and the switch to USB_ROLE_DEVICE instead of setting both to none when the data-role is device. This commit also makes tcpm_reset_port() call tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE) so that the mux and switch do _not_ stay in their last mode after a detach. Reviewed-by: Heikki Krogerus Reviewed-by: Guenter Roeck Reviewed-by: Andy Shevchenko Signed-off-by: Hans de Goede --- Changes in v4: -Add Andy's Reviewed-by Changes in v3: -Add Guenter's Reviewed-by Changes in v2: -Added Heikki's Reviewed-by --- drivers/usb/typec/tcpm.c | 22 +++++++++++----------- include/linux/usb/tcpm.h | 8 ++------ 2 files changed, 13 insertions(+), 17 deletions(-) diff --git a/drivers/usb/typec/tcpm.c b/drivers/usb/typec/tcpm.c index 7cd28b700a7f..00ca2822432f 100644 --- a/drivers/usb/typec/tcpm.c +++ b/drivers/usb/typec/tcpm.c @@ -618,15 +618,15 @@ void tcpm_pd_transmit_complete(struct tcpm_port *port, EXPORT_SYMBOL_GPL(tcpm_pd_transmit_complete); static int tcpm_mux_set(struct tcpm_port *port, enum tcpc_mux_mode mode, - enum tcpc_usb_switch config) + enum usb_role usb_role) { int ret = 0; - tcpm_log(port, "Requesting mux mode %d, config %d, polarity %d", - mode, config, port->polarity); + tcpm_log(port, "Requesting mux mode %d, usb-role %d, polarity %d", + mode, usb_role, port->polarity); if (port->tcpc->mux) - ret = port->tcpc->mux->set(port->tcpc->mux, mode, config, + ret = port->tcpc->mux->set(port->tcpc->mux, mode, usb_role, port->polarity); return ret; @@ -742,14 +742,15 @@ static int tcpm_set_attached_state(struct tcpm_port *port, bool attached) static int tcpm_set_roles(struct tcpm_port *port, bool attached, enum typec_role role, enum typec_data_role data) { + enum usb_role usb_role; int ret; if (data == TYPEC_HOST) - ret = tcpm_mux_set(port, TYPEC_MUX_USB, - TCPC_USB_SWITCH_CONNECT); + usb_role = USB_ROLE_HOST; else - ret = tcpm_mux_set(port, TYPEC_MUX_NONE, - TCPC_USB_SWITCH_DISCONNECT); + usb_role = USB_ROLE_DEVICE; + + ret = tcpm_mux_set(port, TYPEC_MUX_USB, usb_role); if (ret < 0) return ret; @@ -2096,7 +2097,7 @@ static int tcpm_src_attach(struct tcpm_port *port) out_disable_pd: port->tcpc->set_pd_rx(port->tcpc, false); out_disable_mux: - tcpm_mux_set(port, TYPEC_MUX_NONE, TCPC_USB_SWITCH_DISCONNECT); + tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE); return ret; } @@ -2140,6 +2141,7 @@ static void tcpm_reset_port(struct tcpm_port *port) tcpm_init_vconn(port); tcpm_set_current_limit(port, 0, 0); tcpm_set_polarity(port, TYPEC_POLARITY_CC1); + tcpm_mux_set(port, TYPEC_MUX_NONE, USB_ROLE_NONE); tcpm_set_attached_state(port, false); port->try_src_count = 0; port->try_snk_count = 0; @@ -2190,8 +2192,6 @@ static int tcpm_snk_attach(struct tcpm_port *port) static void tcpm_snk_detach(struct tcpm_port *port) { tcpm_detach(port); - - /* XXX: (Dis)connect SuperSpeed mux? */ } static int tcpm_acc_attach(struct tcpm_port *port) diff --git a/include/linux/usb/tcpm.h b/include/linux/usb/tcpm.h index ca1c0b57f03f..268721bff2c1 100644 --- a/include/linux/usb/tcpm.h +++ b/include/linux/usb/tcpm.h @@ -16,6 +16,7 @@ #define __LINUX_USB_TCPM_H #include +#include #include #include "pd.h" @@ -97,11 +98,6 @@ struct tcpc_config { const struct typec_altmode_desc *alt_modes; }; -enum tcpc_usb_switch { - TCPC_USB_SWITCH_CONNECT, - TCPC_USB_SWITCH_DISCONNECT, -}; - /* Mux state attributes */ #define TCPC_MUX_USB_ENABLED BIT(0) /* USB enabled */ #define TCPC_MUX_DP_ENABLED BIT(1) /* DP enabled */ @@ -118,7 +114,7 @@ enum tcpc_mux_mode { struct tcpc_mux_dev { int (*set)(struct tcpc_mux_dev *dev, enum tcpc_mux_mode mux_mode, - enum tcpc_usb_switch usb_config, + enum usb_role usb_role, enum typec_cc_polarity polarity); bool dfp_only; void *priv_data; -- 2.14.3 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/12] usb: typec: tcpm: Set USB role switch to device mode when configured as such From: Hans de Goede Message-Id: <20180228150749.26831-6-hdegoede@redhat.com> Date: Wed, 28 Feb 2018 16:07:42 +0100 To: Darren Hart , Andy Shevchenko , MyungJoo Ham , Chanwoo Choi , Mathias Nyman , Heikki Krogerus , Greg Kroah-Hartman , Guenter Roeck Cc: Hans de Goede , platform-driver-x86@vger.kernel.org, linux-kernel@vger.kernel.org, linux-usb@vger.kernel.org List-ID: U2V0dGluZyB0aGUgbXV4IHRvIE1VWF9OT05FIGFuZCB0aGUgc3dpdGNoIHRvIFVTQl9TV0lUQ0hf RElTQ09OTkVDVCB3aGVuCnRoZSBkYXRhLXJvbGUgaXMgZGV2aWNlIGlzIG5vdCBjb3JyZWN0LiBQ bGVudHkgb2YgZGV2aWNlcyBzdXBwb3J0Cm9wZXJhdGluZyBhcyBVU0IgZGV2aWNlIHRocm91Z2gg YSAoc2VwYXJhdGUpIFVTQiBkZXZpY2UgY29udHJvbGxlci4KCldlIHJlYWxseSBuZWVkIDIgZGlm ZmVyZW50IHZlcnNpb25zIG9mIFVTQl9TV0lUQ0hfQ09OTkVDVCwKVVNCX1NXSVRDSF9DT05ORUNU X0hPU1QgYW5kIFVTQl9TV0lUQ0hfREVWSUNFLiBSYXRoZXIgdGhlbiBtb2RpZnlpbmcgdGhlCnRj cGNfdXNiX3N3aXRjaCBlbnVtIGZvciB0aGlzLCBzaW1wbHkgcmVtb3ZlIGl0IGFuZCBzd2l0Y2gg dG8gdGhlCnVzYl9yb2xlIGVudW0gd2hpY2ggcHJvdmlkZXMgZXhhY3RseSB0aGlzLCB0aGlzIHdp bGwgc2F2ZSB1c2UgbmVlZGluZyB0bwpjb252ZXJ0IGJldHdlZW50IHRoZSAyIGVudW1zIHdoZW4g Y2FsbGluZyBhbiB1c2Itcm9sZS1zd2l0Y2ggZHJpdmVyIGxhdGVyLgoKQmVzaWRlcyBzd2l0Y2hp bmcgdG8gdGhlIHVzYl9yb2xlIHR5cGUsIHRoaXMgY29tbWl0IGFsc28gYWN0dWFsbHkgc2V0cyB0 aGUKbXV4IHRvIFRZUEVDX01VWF9VU0IgYW5kIHRoZSBzd2l0Y2ggdG8gVVNCX1JPTEVfREVWSUNF IGluc3RlYWQgb2Ygc2V0dGluZwpib3RoIHRvIG5vbmUgd2hlbiB0aGUgZGF0YS1yb2xlIGlzIGRl dmljZS4KClRoaXMgY29tbWl0IGFsc28gbWFrZXMgdGNwbV9yZXNldF9wb3J0KCkgY2FsbCB0Y3Bt X211eF9zZXQocG9ydCwKVFlQRUNfTVVYX05PTkUsIFVTQl9ST0xFX05PTkUpIHNvIHRoYXQgdGhl IG11eCBhbmQgc3dpdGNoCmRvIF9ub3RfIHN0YXkgaW4gdGhlaXIgbGFzdCBtb2RlIGFmdGVyIGEg ZGV0YWNoLgoKUmV2aWV3ZWQtYnk6IEhlaWtraSBLcm9nZXJ1cyA8aGVpa2tpLmtyb2dlcnVzQGxp bnV4LmludGVsLmNvbT4KUmV2aWV3ZWQtYnk6IEd1ZW50ZXIgUm9lY2sgPGxpbnV4QHJvZWNrLXVz Lm5ldD4KUmV2aWV3ZWQtYnk6IEFuZHkgU2hldmNoZW5rbyA8YW5keS5zaGV2Y2hlbmtvQGdtYWls LmNvbT4KU2lnbmVkLW9mZi1ieTogSGFucyBkZSBHb2VkZSA8aGRlZ29lZGVAcmVkaGF0LmNvbT4K LS0tCkNoYW5nZXMgaW4gdjQ6Ci1BZGQgQW5keSdzIFJldmlld2VkLWJ5CgpDaGFuZ2VzIGluIHYz OgotQWRkIEd1ZW50ZXIncyBSZXZpZXdlZC1ieQoKQ2hhbmdlcyBpbiB2MjoKLUFkZGVkIEhlaWtr aSdzIFJldmlld2VkLWJ5Ci0tLQogZHJpdmVycy91c2IvdHlwZWMvdGNwbS5jIHwgMjIgKysrKysr KysrKystLS0tLS0tLS0tLQogaW5jbHVkZS9saW51eC91c2IvdGNwbS5oIHwgIDggKystLS0tLS0K IDIgZmlsZXMgY2hhbmdlZCwgMTMgaW5zZXJ0aW9ucygrKSwgMTcgZGVsZXRpb25zKC0pCgpkaWZm IC0tZ2l0IGEvZHJpdmVycy91c2IvdHlwZWMvdGNwbS5jIGIvZHJpdmVycy91c2IvdHlwZWMvdGNw bS5jCmluZGV4IDdjZDI4YjcwMGE3Zi4uMDBjYTI4MjI0MzJmIDEwMDY0NAotLS0gYS9kcml2ZXJz L3VzYi90eXBlYy90Y3BtLmMKKysrIGIvZHJpdmVycy91c2IvdHlwZWMvdGNwbS5jCkBAIC02MTgs MTUgKzYxOCwxNSBAQCB2b2lkIHRjcG1fcGRfdHJhbnNtaXRfY29tcGxldGUoc3RydWN0IHRjcG1f cG9ydCAqcG9ydCwKIEVYUE9SVF9TWU1CT0xfR1BMKHRjcG1fcGRfdHJhbnNtaXRfY29tcGxldGUp OwogCiBzdGF0aWMgaW50IHRjcG1fbXV4X3NldChzdHJ1Y3QgdGNwbV9wb3J0ICpwb3J0LCBlbnVt IHRjcGNfbXV4X21vZGUgbW9kZSwKLQkJCWVudW0gdGNwY191c2Jfc3dpdGNoIGNvbmZpZykKKwkJ CWVudW0gdXNiX3JvbGUgdXNiX3JvbGUpCiB7CiAJaW50IHJldCA9IDA7CiAKLQl0Y3BtX2xvZyhw b3J0LCAiUmVxdWVzdGluZyBtdXggbW9kZSAlZCwgY29uZmlnICVkLCBwb2xhcml0eSAlZCIsCi0J CSBtb2RlLCBjb25maWcsIHBvcnQtPnBvbGFyaXR5KTsKKwl0Y3BtX2xvZyhwb3J0LCAiUmVxdWVz dGluZyBtdXggbW9kZSAlZCwgdXNiLXJvbGUgJWQsIHBvbGFyaXR5ICVkIiwKKwkJIG1vZGUsIHVz Yl9yb2xlLCBwb3J0LT5wb2xhcml0eSk7CiAKIAlpZiAocG9ydC0+dGNwYy0+bXV4KQotCQlyZXQg PSBwb3J0LT50Y3BjLT5tdXgtPnNldChwb3J0LT50Y3BjLT5tdXgsIG1vZGUsIGNvbmZpZywKKwkJ cmV0ID0gcG9ydC0+dGNwYy0+bXV4LT5zZXQocG9ydC0+dGNwYy0+bXV4LCBtb2RlLCB1c2Jfcm9s ZSwKIAkJCQkJICAgcG9ydC0+cG9sYXJpdHkpOwogCiAJcmV0dXJuIHJldDsKQEAgLTc0MiwxNCAr NzQyLDE1IEBAIHN0YXRpYyBpbnQgdGNwbV9zZXRfYXR0YWNoZWRfc3RhdGUoc3RydWN0IHRjcG1f cG9ydCAqcG9ydCwgYm9vbCBhdHRhY2hlZCkKIHN0YXRpYyBpbnQgdGNwbV9zZXRfcm9sZXMoc3Ry dWN0IHRjcG1fcG9ydCAqcG9ydCwgYm9vbCBhdHRhY2hlZCwKIAkJCSAgZW51bSB0eXBlY19yb2xl IHJvbGUsIGVudW0gdHlwZWNfZGF0YV9yb2xlIGRhdGEpCiB7CisJZW51bSB1c2Jfcm9sZSB1c2Jf cm9sZTsKIAlpbnQgcmV0OwogCiAJaWYgKGRhdGEgPT0gVFlQRUNfSE9TVCkKLQkJcmV0ID0gdGNw bV9tdXhfc2V0KHBvcnQsIFRZUEVDX01VWF9VU0IsCi0JCQkJICAgVENQQ19VU0JfU1dJVENIX0NP Tk5FQ1QpOworCQl1c2Jfcm9sZSA9IFVTQl9ST0xFX0hPU1Q7CiAJZWxzZQotCQlyZXQgPSB0Y3Bt X211eF9zZXQocG9ydCwgVFlQRUNfTVVYX05PTkUsCi0JCQkJICAgVENQQ19VU0JfU1dJVENIX0RJ U0NPTk5FQ1QpOworCQl1c2Jfcm9sZSA9IFVTQl9ST0xFX0RFVklDRTsKKworCXJldCA9IHRjcG1f bXV4X3NldChwb3J0LCBUWVBFQ19NVVhfVVNCLCB1c2Jfcm9sZSk7CiAJaWYgKHJldCA8IDApCiAJ CXJldHVybiByZXQ7CiAKQEAgLTIwOTYsNyArMjA5Nyw3IEBAIHN0YXRpYyBpbnQgdGNwbV9zcmNf YXR0YWNoKHN0cnVjdCB0Y3BtX3BvcnQgKnBvcnQpCiBvdXRfZGlzYWJsZV9wZDoKIAlwb3J0LT50 Y3BjLT5zZXRfcGRfcngocG9ydC0+dGNwYywgZmFsc2UpOwogb3V0X2Rpc2FibGVfbXV4OgotCXRj cG1fbXV4X3NldChwb3J0LCBUWVBFQ19NVVhfTk9ORSwgVENQQ19VU0JfU1dJVENIX0RJU0NPTk5F Q1QpOworCXRjcG1fbXV4X3NldChwb3J0LCBUWVBFQ19NVVhfTk9ORSwgVVNCX1JPTEVfTk9ORSk7 CiAJcmV0dXJuIHJldDsKIH0KIApAQCAtMjE0MCw2ICsyMTQxLDcgQEAgc3RhdGljIHZvaWQgdGNw bV9yZXNldF9wb3J0KHN0cnVjdCB0Y3BtX3BvcnQgKnBvcnQpCiAJdGNwbV9pbml0X3Zjb25uKHBv cnQpOwogCXRjcG1fc2V0X2N1cnJlbnRfbGltaXQocG9ydCwgMCwgMCk7CiAJdGNwbV9zZXRfcG9s YXJpdHkocG9ydCwgVFlQRUNfUE9MQVJJVFlfQ0MxKTsKKwl0Y3BtX211eF9zZXQocG9ydCwgVFlQ RUNfTVVYX05PTkUsIFVTQl9ST0xFX05PTkUpOwogCXRjcG1fc2V0X2F0dGFjaGVkX3N0YXRlKHBv cnQsIGZhbHNlKTsKIAlwb3J0LT50cnlfc3JjX2NvdW50ID0gMDsKIAlwb3J0LT50cnlfc25rX2Nv dW50ID0gMDsKQEAgLTIxOTAsOCArMjE5Miw2IEBAIHN0YXRpYyBpbnQgdGNwbV9zbmtfYXR0YWNo KHN0cnVjdCB0Y3BtX3BvcnQgKnBvcnQpCiBzdGF0aWMgdm9pZCB0Y3BtX3Nua19kZXRhY2goc3Ry dWN0IHRjcG1fcG9ydCAqcG9ydCkKIHsKIAl0Y3BtX2RldGFjaChwb3J0KTsKLQotCS8qIFhYWDog KERpcyljb25uZWN0IFN1cGVyU3BlZWQgbXV4PyAqLwogfQogCiBzdGF0aWMgaW50IHRjcG1fYWNj X2F0dGFjaChzdHJ1Y3QgdGNwbV9wb3J0ICpwb3J0KQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51 eC91c2IvdGNwbS5oIGIvaW5jbHVkZS9saW51eC91c2IvdGNwbS5oCmluZGV4IGNhMWMwYjU3ZjAz Zi4uMjY4NzIxYmZmMmMxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3VzYi90Y3BtLmgKKysr IGIvaW5jbHVkZS9saW51eC91c2IvdGNwbS5oCkBAIC0xNiw2ICsxNiw3IEBACiAjZGVmaW5lIF9f TElOVVhfVVNCX1RDUE1fSAogCiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8 bGludXgvdXNiL3JvbGUuaD4KICNpbmNsdWRlIDxsaW51eC91c2IvdHlwZWMuaD4KICNpbmNsdWRl ICJwZC5oIgogCkBAIC05NywxMSArOTgsNiBAQCBzdHJ1Y3QgdGNwY19jb25maWcgewogCWNvbnN0 IHN0cnVjdCB0eXBlY19hbHRtb2RlX2Rlc2MgKmFsdF9tb2RlczsKIH07CiAKLWVudW0gdGNwY191 c2Jfc3dpdGNoIHsKLQlUQ1BDX1VTQl9TV0lUQ0hfQ09OTkVDVCwKLQlUQ1BDX1VTQl9TV0lUQ0hf RElTQ09OTkVDVCwKLX07Ci0KIC8qIE11eCBzdGF0ZSBhdHRyaWJ1dGVzICovCiAjZGVmaW5lIFRD UENfTVVYX1VTQl9FTkFCTEVECQlCSVQoMCkJLyogVVNCIGVuYWJsZWQgKi8KICNkZWZpbmUgVENQ Q19NVVhfRFBfRU5BQkxFRAkJQklUKDEpCS8qIERQIGVuYWJsZWQgKi8KQEAgLTExOCw3ICsxMTQs NyBAQCBlbnVtIHRjcGNfbXV4X21vZGUgewogCiBzdHJ1Y3QgdGNwY19tdXhfZGV2IHsKIAlpbnQg KCpzZXQpKHN0cnVjdCB0Y3BjX211eF9kZXYgKmRldiwgZW51bSB0Y3BjX211eF9tb2RlIG11eF9t b2RlLAotCQkgICBlbnVtIHRjcGNfdXNiX3N3aXRjaCB1c2JfY29uZmlnLAorCQkgICBlbnVtIHVz Yl9yb2xlIHVzYl9yb2xlLAogCQkgICBlbnVtIHR5cGVjX2NjX3BvbGFyaXR5IHBvbGFyaXR5KTsK IAlib29sIGRmcF9vbmx5OwogCXZvaWQgKnByaXZfZGF0YTsK