Received: by 2002:a05:6a10:1a4d:0:0:0:0 with SMTP id nk13csp5968106pxb; Mon, 14 Feb 2022 11:57:05 -0800 (PST) X-Google-Smtp-Source: ABdhPJywvNc5ZF+0PfsIhH8g+bFFhc6r/D8TaRUdcowUNqZaRHgf7LdCVkQMskPWi7JT8hotydn2 X-Received: by 2002:a17:90b:1c12:b0:1b8:ad23:5996 with SMTP id oc18-20020a17090b1c1200b001b8ad235996mr280220pjb.3.1644868624933; Mon, 14 Feb 2022 11:57:04 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1644868624; cv=none; d=google.com; s=arc-20160816; b=nNMuJYaymBhGQoOjHZSw1D9UdZq4j9Eh75e9fs4mv4HGws68EZGbYFnk+EYMZen8u6 RReSw0caE6wE8wsvW+noY0wcSwoLRVwFMnaV/8BpI4+zlQQmyVaGHfHbWzkPF0WUbfpD AnDATSDs/+SpTJ7nYYo/YTGgo9ChnyBFOii/gwA5gI9jjaT/6tIM5gxEw+UQm1sxFqCl QklJK11WyIvcvJwUK9MkK+2Lunv4wYCJInO6ifZCJewW1EVpr/1xJDcq8fWWBL6FoEFF YaUdzoxDnfoimd64oI7JY8tB9arw96nljfgjq36dlV2stJFJ8vCRxq1XMde+6ACG5cIs IfzQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=g49+wFi0+L2EFX9slEZO36BXMBmO9BAHKtkIF7AjIc4=; b=Z9N12IklJS4m9YHvaPCdz6QypFmnYSqSedEWnhGEocADgJ6oM5dx/ogXc/9+BogIBC JBGThTWf8OvDO0giKIJXI/zPfCg5Ez0JTQamZdYKq/7rWRq2QJXKBkcZ3CUspwZkBwpk yJN0/kA7IjVWsGRcKl8lfx+iOScJ4rqTjAx054EF3LX4jv2V21zK/hBBqt8W+RhRpYpx D+FikoGbaP9GWtvdgRf2my0REH108VsymcXHt0zE7crF4XJkQNNhQu6lNgXUnS25I78D gWKe56w1fgpJk8X7gmHlIEFutTTcVL4RfnUjKT5JCRzyBIYUnPvO40rOpi4Zy24nQ+tA O2GQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Qaj0Oks+; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net. [23.128.96.19]) by mx.google.com with ESMTPS id y6si14730112plg.343.2022.02.14.11.57.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 14 Feb 2022 11:57:04 -0800 (PST) Received-SPF: softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) client-ip=23.128.96.19; Authentication-Results: mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=Qaj0Oks+; spf=softfail (google.com: domain of transitioning linux-kernel-owner@vger.kernel.org does not designate 23.128.96.19 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 8C64992D08; Mon, 14 Feb 2022 11:38:32 -0800 (PST) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229782AbiBLSWn (ORCPT + 99 others); Sat, 12 Feb 2022 13:22:43 -0500 Received: from mxb-00190b01.gslb.pphosted.com ([23.128.96.19]:46188 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229798AbiBLSWg (ORCPT ); Sat, 12 Feb 2022 13:22:36 -0500 Received: from mail-pj1-x102b.google.com (mail-pj1-x102b.google.com [IPv6:2607:f8b0:4864:20::102b]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4808C5E152 for ; Sat, 12 Feb 2022 10:22:28 -0800 (PST) Received: by mail-pj1-x102b.google.com with SMTP id y9so10864889pjf.1 for ; Sat, 12 Feb 2022 10:22:28 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-transfer-encoding; bh=g49+wFi0+L2EFX9slEZO36BXMBmO9BAHKtkIF7AjIc4=; b=Qaj0Oks+qpWWnbjrfPIrbHozo3YeLmLdIG/TvZbU5V6dTbOje+t2Np1msaSIll/jGZ fRn3bd46oK30vNMMF+3mmzFg9Mi6CgjKNyQIyKYruUjJXJdl/qLwxHdxZli4GArgp/O/ eYLnTc4kBSIGs6PxY6IMH5VXSV+6AAXKTnzF/pid6ZTfk+lVeYCgv77UFucBnnLgoXrb 8e1hGrMPM81vZ5MBQGXLPn3ql+ub/Y9HZiUN4Um7iWlpphmp4yjmGEu4kuGj1VT1WhPq AjnRbF1rJgyhuN+n7ibTQZ3AGqW62jAQ988nKYUuMpm2yHII2SkntIPjZ4S23eazPB+0 HoJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-transfer-encoding; bh=g49+wFi0+L2EFX9slEZO36BXMBmO9BAHKtkIF7AjIc4=; b=1L13VDcYBJGH5QKMH9JN5o3ltnCP+FGmSohi64r3t88MV9m7anF3Tru1a062KwVo0e boBF2Z2icwKeoV+pkTnw15o23jchWsuKZhr3DXA8ZwsC89tkVNLVSaoIiduD/X1Phj1h D3ENaAMuq4LirgCneZlGGr0Na2jvexK0bk0rXK7zlrDIC4f02jjZp0IiSJxD1XeW+blE HgWlxgwuxlqqpGbBQe9dG6llL/NQyy5/6TTaDI/cpuBzJir/8r00FKMU9ONRM3K/UP3M Azq9i9fHZE5cb7MkpnykwY2Nj56FN7l2UL1fBB63lyWCcluxCzWIg20kLcqrqI4lhBdj +p7g== X-Gm-Message-State: AOAM5329ibYsLIDMqnv95KKNgzPWlCdexwRDklYYdRlrB7nQRy3T56ZA RUy64wgPcAjVQ8UhFEcR7Igc X-Received: by 2002:a17:902:d486:: with SMTP id c6mr6965799plg.141.1644690147753; Sat, 12 Feb 2022 10:22:27 -0800 (PST) Received: from localhost.localdomain ([27.111.75.57]) by smtp.gmail.com with ESMTPSA id g12sm14961987pfj.148.2022.02.12.10.22.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sat, 12 Feb 2022 10:22:27 -0800 (PST) From: Manivannan Sadhasivam To: mhi@lists.linux.dev Cc: quic_hemantk@quicinc.com, quic_bbhatt@quicinc.com, quic_jhugo@quicinc.com, vinod.koul@linaro.org, bjorn.andersson@linaro.org, dmitry.baryshkov@linaro.org, quic_vbadigan@quicinc.com, quic_cang@quicinc.com, quic_skananth@quicinc.com, linux-arm-msm@vger.kernel.org, linux-kernel@vger.kernel.org, elder@linaro.org, Manivannan Sadhasivam Subject: [PATCH v3 09/25] bus: mhi: ep: Add support for registering MHI endpoint client drivers Date: Sat, 12 Feb 2022 23:51:01 +0530 Message-Id: <20220212182117.49438-10-manivannan.sadhasivam@linaro.org> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220212182117.49438-1-manivannan.sadhasivam@linaro.org> References: <20220212182117.49438-1-manivannan.sadhasivam@linaro.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-2.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS, MAILING_LIST_MULTI,RDNS_NONE,SPF_HELO_NONE,T_SCC_BODY_TEXT_LINE autolearn=no autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org This commit adds support for registering MHI endpoint client drivers with the MHI endpoint stack. MHI endpoint client drivers binds to one or more MHI endpoint devices inorder to send and receive the upper-layer protocol packets like IP packets, modem control messages, and diagnostics messages over MHI bus. Signed-off-by: Manivannan Sadhasivam --- drivers/bus/mhi/ep/main.c | 86 +++++++++++++++++++++++++++++++++++++++ include/linux/mhi_ep.h | 53 ++++++++++++++++++++++++ 2 files changed, 139 insertions(+) diff --git a/drivers/bus/mhi/ep/main.c b/drivers/bus/mhi/ep/main.c index b006011d025d..f66404181972 100644 --- a/drivers/bus/mhi/ep/main.c +++ b/drivers/bus/mhi/ep/main.c @@ -196,9 +196,89 @@ void mhi_ep_unregister_controller(struct mhi_ep_cntrl *mhi_cntrl) } EXPORT_SYMBOL_GPL(mhi_ep_unregister_controller); +static int mhi_ep_driver_probe(struct device *dev) +{ + struct mhi_ep_device *mhi_dev = to_mhi_ep_device(dev); + struct mhi_ep_driver *mhi_drv = to_mhi_ep_driver(dev->driver); + struct mhi_ep_chan *ul_chan = mhi_dev->ul_chan; + struct mhi_ep_chan *dl_chan = mhi_dev->dl_chan; + + /* Client drivers should have callbacks for both channels */ + if (!mhi_drv->ul_xfer_cb || !mhi_drv->dl_xfer_cb) + return -EINVAL; + + ul_chan->xfer_cb = mhi_drv->ul_xfer_cb; + dl_chan->xfer_cb = mhi_drv->dl_xfer_cb; + + return mhi_drv->probe(mhi_dev, mhi_dev->id); +} + +static int mhi_ep_driver_remove(struct device *dev) +{ + struct mhi_ep_device *mhi_dev = to_mhi_ep_device(dev); + struct mhi_ep_driver *mhi_drv = to_mhi_ep_driver(dev->driver); + struct mhi_result result = {}; + struct mhi_ep_chan *mhi_chan; + int dir; + + /* Skip if it is a controller device */ + if (mhi_dev->dev_type == MHI_DEVICE_CONTROLLER) + return 0; + + /* Disconnect the channels associated with the driver */ + for (dir = 0; dir < 2; dir++) { + mhi_chan = dir ? mhi_dev->ul_chan : mhi_dev->dl_chan; + + if (!mhi_chan) + continue; + + mutex_lock(&mhi_chan->lock); + /* Send channel disconnect status to the client driver */ + if (mhi_chan->xfer_cb) { + result.transaction_status = -ENOTCONN; + result.bytes_xferd = 0; + mhi_chan->xfer_cb(mhi_chan->mhi_dev, &result); + } + + /* Set channel state to DISABLED */ + mhi_chan->state = MHI_CH_STATE_DISABLED; + mhi_chan->xfer_cb = NULL; + mutex_unlock(&mhi_chan->lock); + } + + /* Remove the client driver now */ + mhi_drv->remove(mhi_dev); + + return 0; +} + +int __mhi_ep_driver_register(struct mhi_ep_driver *mhi_drv, struct module *owner) +{ + struct device_driver *driver = &mhi_drv->driver; + + if (!mhi_drv->probe || !mhi_drv->remove) + return -EINVAL; + + driver->bus = &mhi_ep_bus_type; + driver->owner = owner; + driver->probe = mhi_ep_driver_probe; + driver->remove = mhi_ep_driver_remove; + + return driver_register(driver); +} +EXPORT_SYMBOL_GPL(__mhi_ep_driver_register); + +void mhi_ep_driver_unregister(struct mhi_ep_driver *mhi_drv) +{ + driver_unregister(&mhi_drv->driver); +} +EXPORT_SYMBOL_GPL(mhi_ep_driver_unregister); + static int mhi_ep_match(struct device *dev, struct device_driver *drv) { struct mhi_ep_device *mhi_dev = to_mhi_ep_device(dev); + struct mhi_ep_driver *mhi_drv = to_mhi_ep_driver(drv); + const struct mhi_device_id *id; /* * If the device is a controller type then there is no client driver @@ -207,6 +287,12 @@ static int mhi_ep_match(struct device *dev, struct device_driver *drv) if (mhi_dev->dev_type == MHI_DEVICE_CONTROLLER) return 0; + for (id = mhi_drv->id_table; id->chan[0]; id++) + if (!strcmp(mhi_dev->name, id->chan)) { + mhi_dev->id = id; + return 1; + } + return 0; }; diff --git a/include/linux/mhi_ep.h b/include/linux/mhi_ep.h index 20238e9df1b3..da865f9d3646 100644 --- a/include/linux/mhi_ep.h +++ b/include/linux/mhi_ep.h @@ -122,7 +122,60 @@ struct mhi_ep_device { enum mhi_device_type dev_type; }; +/** + * struct mhi_ep_driver - Structure representing a MHI Endpoint client driver + * @id_table: Pointer to MHI Endpoint device ID table + * @driver: Device driver model driver + * @probe: CB function for client driver probe function + * @remove: CB function for client driver remove function + * @ul_xfer_cb: CB function for UL data transfer + * @dl_xfer_cb: CB function for DL data transfer + */ +struct mhi_ep_driver { + const struct mhi_device_id *id_table; + struct device_driver driver; + int (*probe)(struct mhi_ep_device *mhi_ep, + const struct mhi_device_id *id); + void (*remove)(struct mhi_ep_device *mhi_ep); + void (*ul_xfer_cb)(struct mhi_ep_device *mhi_dev, + struct mhi_result *result); + void (*dl_xfer_cb)(struct mhi_ep_device *mhi_dev, + struct mhi_result *result); +}; + #define to_mhi_ep_device(dev) container_of(dev, struct mhi_ep_device, dev) +#define to_mhi_ep_driver(drv) container_of(drv, struct mhi_ep_driver, driver) + +/* + * module_mhi_ep_driver() - Helper macro for drivers that don't do + * anything special other than using default mhi_ep_driver_register() and + * mhi_ep_driver_unregister(). This eliminates a lot of boilerplate. + * Each module may only use this macro once. + */ +#define module_mhi_ep_driver(mhi_drv) \ + module_driver(mhi_drv, mhi_ep_driver_register, \ + mhi_ep_driver_unregister) + +/* + * Macro to avoid include chaining to get THIS_MODULE + */ +#define mhi_ep_driver_register(mhi_drv) \ + __mhi_ep_driver_register(mhi_drv, THIS_MODULE) + +/** + * __mhi_ep_driver_register - Register a driver with MHI Endpoint bus + * @mhi_drv: Driver to be associated with the device + * @owner: The module owner + * + * Return: 0 if driver registrations succeeds, a negative error code otherwise. + */ +int __mhi_ep_driver_register(struct mhi_ep_driver *mhi_drv, struct module *owner); + +/** + * mhi_ep_driver_unregister - Unregister a driver from MHI Endpoint bus + * @mhi_drv: Driver associated with the device + */ +void mhi_ep_driver_unregister(struct mhi_ep_driver *mhi_drv); /** * mhi_ep_register_controller - Register MHI Endpoint controller -- 2.25.1