Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f7566b5 authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "mhi: devices: satellite: add option to defer initialization"

parents a18b979e 6d74baa2
Loading
Loading
Loading
Loading
+150 −19
Original line number Diff line number Diff line
@@ -19,7 +19,7 @@
		esoc-0 = <&mdm0>;

		/* mhi bus specific settings */
		mhi,max-channels = <106>;
		mhi,max-channels = <110>;
		mhi,timeout = <2000>;

		mhi_channels: mhi_channels {
@@ -253,8 +253,8 @@
			mhi_chan@25 {
				reg = <25>;
				label = "BL";
				mhi,num-elements = <64>;
				mhi,event-ring = <2>;
				mhi,num-elements = <32>;
				mhi,event-ring = <1>;
				mhi,chan-dir = <2>;
				mhi,data-type = <0>;
				mhi,doorbell-mode = <2>;
@@ -330,7 +330,7 @@
			mhi_chan@52 {
				reg = <52>;
				label = "SLPI_0";
				mhi,event-ring = <4>;
				mhi,event-ring = <5>;
				mhi,chan-dir = <0>;
				mhi,data-type = <3>;
				mhi,ee = <0x4>;
@@ -340,7 +340,7 @@
			mhi_chan@53 {
				reg = <53>;
				label = "SLPI_1";
				mhi,event-ring = <4>;
				mhi,event-ring = <5>;
				mhi,chan-dir = <0>;
				mhi,data-type = <3>;
				mhi,ee = <0x4>;
@@ -350,7 +350,7 @@
			mhi_chan@70 {
				reg = <70>;
				label = "ADSP_2";
				mhi,event-ring = <5>;
				mhi,event-ring = <4>;
				mhi,chan-dir = <0>;
				mhi,data-type = <3>;
				mhi,ee = <0x4>;
@@ -360,7 +360,7 @@
			mhi_chan@71 {
				reg = <71>;
				label = "ADSP_3";
				mhi,event-ring = <5>;
				mhi,event-ring = <4>;
				mhi,chan-dir = <0>;
				mhi,data-type = <3>;
				mhi,ee = <0x4>;
@@ -387,11 +387,22 @@
				mhi,offload-chan;
			};

			mhi_chan@80 {
				reg = <80>;
				label = "AUDIO_VOICE_0";
				mhi,event-ring = <0>;
				mhi,chan-dir = <0>;
				mhi,ee = <0x4>;
				mhi,data-type = <3>;
				mhi,offload-chan;
				status = "ok";
			};

			mhi_chan@100 {
				reg = <100>;
				label = "IP_HW0";
				mhi,num-elements = <512>;
				mhi,event-ring = <4>;
				mhi,event-ring = <6>;
				mhi,chan-dir = <1>;
				mhi,data-type = <1>;
				mhi,doorbell-mode = <3>;
@@ -403,12 +414,68 @@
				reg = <101>;
				label = "IP_HW0";
				mhi,num-elements = <512>;
				mhi,event-ring = <5>;
				mhi,event-ring = <7>;
				mhi,chan-dir = <2>;
				mhi,data-type = <1>;
				mhi,data-type = <4>;
				mhi,doorbell-mode = <3>;
				mhi,ee = <0x4>;
			};

			mhi_chan@102 {
				reg = <102>;
				label = "IP_HW_ADPL";
				mhi,event-ring = <8>;
				mhi,chan-dir = <2>;
				mhi,data-type = <3>;
				mhi,ee = <0x4>;
				mhi,offload-chan;
				mhi,lpm-notify;
			};

			mhi_chan@103 {
				reg = <103>;
				label = "IP_HW_QDSS";
				mhi,num-elements = <128>;
				mhi,event-ring = <9>;
				mhi,chan-dir = <2>;
				mhi,data-type = <0>;
				mhi,doorbell-mode = <2>;
				mhi,ee = <0x4>;
			};

			mhi_chan@104 {
				reg = <104>;
				label = "IP_HW0_RSC";
				mhi,num-elements = <512>;
				mhi,local-elements = <3078>;
				mhi,event-ring = <7>;
				mhi,chan-dir = <2>;
				mhi,data-type = <5>;
				mhi,doorbell-mode = <3>;
				mhi,ee = <0x4>;
				mhi,chan-type = <3>;
			};

			mhi_chan@107 {
				reg = <107>;
				label = "IP_HW_MHIP_1";
				mhi,event-ring = <10>;
				mhi,chan-dir = <1>;
				mhi,data-type = <3>;
				mhi,ee = <0x4>;
				mhi,offload-chan;
			};

			mhi_chan@108 {
				reg = <108>;
				label = "IP_HW_MHIP_1";
				mhi,event-ring = <11>;
				mhi,chan-dir = <2>;
				mhi,data-type = <3>;
				mhi,ee = <0x4>;
				mhi,offload-chan;
				mhi,lpm-notify;
			};
		};

		mhi_events: mhi_events {
@@ -450,6 +517,26 @@
			};

			mhi_event@4 {
				mhi,num-elements = <512>;
				mhi,intmod = <5>;
				mhi,msi = <0>;
				mhi,priority = <1>;
				mhi,brstmode = <3>;
				mhi,client-manage;
				mhi,offload;
			};

			mhi_event@5 {
				mhi,num-elements = <512>;
				mhi,intmod = <5>;
				mhi,msi = <0>;
				mhi,priority = <1>;
				mhi,brstmode = <3>;
				mhi,client-manage;
				mhi,offload;
			};

			mhi_event@6 {
				mhi,num-elements = <1024>;
				mhi,intmod = <5>;
				mhi,msi = <5>;
@@ -457,11 +544,9 @@
				mhi,priority = <1>;
				mhi,brstmode = <3>;
				mhi,hw-ev;
				mhi,client-manage;
				mhi,offload;
			};

			mhi_event@5 {
			mhi_event@7 {
				mhi,num-elements = <1024>;
				mhi,intmod = <5>;
				mhi,msi = <6>;
@@ -470,6 +555,51 @@
				mhi,brstmode = <3>;
				mhi,hw-ev;
				mhi,client-manage;
			};

			mhi_event@8 {
				mhi,num-elements = <0>;
				mhi,intmod = <0>;
				mhi,msi = <0>;
				mhi,chan = <102>;
				mhi,priority = <1>;
				mhi,brstmode = <3>;
				mhi,hw-ev;
				mhi,client-manage;
				mhi,offload;
			};

			mhi_event@9 {
				mhi,num-elements = <1024>;
				mhi,intmod = <5>;
				mhi,msi = <7>;
				mhi,chan = <103>;
				mhi,priority = <1>;
				mhi,brstmode = <2>;
				mhi,hw-ev;
			};

			mhi_event@10 {
				mhi,num-elements = <0>;
				mhi,intmod = <0>;
				mhi,msi = <0>;
				mhi,chan = <107>;
				mhi,priority = <1>;
				mhi,brstmode = <3>;
				mhi,hw-ev;
				mhi,client-manage;
				mhi,offload;
			};

			mhi_event@11 {
				mhi,num-elements = <0>;
				mhi,intmod = <0>;
				mhi,msi = <0>;
				mhi,chan = <108>;
				mhi,priority = <1>;
				mhi,brstmode = <3>;
				mhi,hw-ev;
				mhi,client-manage;
				mhi,offload;
			};
		};
@@ -483,13 +613,14 @@
				mhi,chan = "IP_HW0";
				mhi,interface-name = "rmnet_mhi";
				mhi,mru = <0x4000>;
				mhi,chain-skb;
			};

			mhi_netdev_1: mhi_rmnet@1 {
			mhi_rmnet@1 {
				reg = <0x1>;
				mhi,chan = "IP_HW_ADPL";
				mhi,interface-name = "rmnet_mhi";
				mhi,mru = <0x4000>;
				mhi,chan = "IP_HW0_RSC";
				mhi,mru = <0x8000>;
				mhi,rsc-parent = <&mhi_netdev_0>;
			};

			mhi_qrtr {
@@ -500,13 +631,13 @@
			mhi_subsys_adsp_0: mhi_dev@2 {
				reg = <0x2>;
				mhi,chan = "ADSP_0";
				mhi,num-devices = <4>;
				mhi,max-devices = <4>;
			};

			mhi_subsys_slpi_0: mhi_dev@3 {
				reg = <0x3>;
				mhi,chan = "SLPI_0";
				mhi,num-devices = <4>;
				mhi,max-devices = <4>;
			};
		};
	};
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@
		swr0 = &swr0;
		swr1 = &swr1;
		swr2 = &swr2;
		mhi-netdev0 = &mhi_netdev_0;
	};

	cpus {
+58 −0
Original line number Diff line number Diff line
// SPDX-License-Identifier: GPL-2.0-only
/* Copyright (c) 2019, The Linux Foundation. All rights reserved.*/

#include <linux/debugfs.h>
#include <linux/device.h>
#include <linux/dma-direction.h>
#include <linux/dma-mapping.h>
@@ -18,6 +19,8 @@

#define MHI_SAT_DRIVER_NAME "mhi_satellite"

static bool mhi_sat_defer_init = true; /* set by default */

/* logging macros */
#define IPC_LOG_PAGES (10)
#define IPC_LOG_LVL (MHI_MSG_LVL_INFO)
@@ -282,6 +285,9 @@ struct mhi_sat_driver {

	struct mhi_sat_subsys *subsys; /* pointer to subsystem array */
	unsigned int num_subsys;

	struct dentry *dentry; /* debugfs directory */
	bool deferred_init_done; /* flag for deferred init protection */
};

static struct mhi_sat_driver mhi_sat_driver;
@@ -1041,6 +1047,44 @@ static struct mhi_driver mhi_sat_dev_driver = {
	},
};

int mhi_sat_trigger_init(void *data, u64 val)
{
	struct mhi_sat_subsys *subsys;
	int i, ret;

	if (mhi_sat_driver.deferred_init_done)
		return -EIO;

	ret = register_rpmsg_driver(&mhi_sat_rpmsg_driver);
	if (ret)
		goto error_sat_trigger_init;

	ret = mhi_driver_register(&mhi_sat_dev_driver);
	if (ret)
		goto error_sat_trigger_register;

	mhi_sat_driver.deferred_init_done = true;

	return 0;

error_sat_trigger_register:
	unregister_rpmsg_driver(&mhi_sat_rpmsg_driver);

error_sat_trigger_init:
	subsys = mhi_sat_driver.subsys;
	for (i = 0; i < mhi_sat_driver.num_subsys; i++, subsys++) {
		ipc_log_context_destroy(subsys->ipc_log);
		mutex_destroy(&subsys->cntrl_mutex);
	}
	kfree(mhi_sat_driver.subsys);
	mhi_sat_driver.subsys = NULL;

	return ret;
}

DEFINE_SIMPLE_ATTRIBUTE(mhi_sat_debugfs_fops, NULL,
			mhi_sat_trigger_init, "%llu\n");

static int mhi_sat_init(void)
{
	struct mhi_sat_subsys *subsys;
@@ -1066,6 +1110,20 @@ static int mhi_sat_init(void)
		subsys->ipc_log = ipc_log_context_create(IPC_LOG_PAGES, log, 0);
	}

	/* create debugfs entry if defer_init is enabled */
	if (mhi_sat_defer_init) {
		mhi_sat_driver.dentry = debugfs_create_dir("mhi_sat", NULL);
		if (IS_ERR_OR_NULL(mhi_sat_driver.dentry)) {
			ret = -ENODEV;
			goto error_sat_init;
		}

		debugfs_create_file("debug", 0444, mhi_sat_driver.dentry, NULL,
				    &mhi_sat_debugfs_fops);

		return 0;
	}

	ret = register_rpmsg_driver(&mhi_sat_rpmsg_driver);
	if (ret)
		goto error_sat_init;