aboutsummaryrefslogtreecommitdiff
path: root/sys/dev/ufshci/ufshci.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/ufshci/ufshci.c')
-rw-r--r--sys/dev/ufshci/ufshci.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/sys/dev/ufshci/ufshci.c b/sys/dev/ufshci/ufshci.c
new file mode 100644
index 000000000000..84a9629e74b0
--- /dev/null
+++ b/sys/dev/ufshci/ufshci.c
@@ -0,0 +1,76 @@
+/*-
+ * Copyright (c) 2025, Samsung Electronics Co., Ltd.
+ * Written by Jaeyoon Choi
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <sys/param.h>
+#include <sys/bus.h>
+#include <sys/conf.h>
+#include <sys/module.h>
+
+#include "ufshci_private.h"
+
+MALLOC_DEFINE(M_UFSHCI, "ufshci", "ufshci(4) memory allocations");
+
+int
+ufshci_attach(device_t dev)
+{
+ struct ufshci_controller *ctrlr = device_get_softc(dev);
+ int status;
+
+ status = ufshci_ctrlr_construct(ctrlr, dev);
+ if (status != 0) {
+ ufshci_ctrlr_destruct(ctrlr, dev);
+ return (status);
+ }
+
+ ctrlr->config_hook.ich_func = ufshci_ctrlr_start_config_hook;
+ ctrlr->config_hook.ich_arg = ctrlr;
+
+ if (config_intrhook_establish(&ctrlr->config_hook) != 0)
+ return (ENOMEM);
+
+ return (0);
+}
+
+int
+ufshci_detach(device_t dev)
+{
+ struct ufshci_controller *ctrlr = device_get_softc(dev);
+
+ config_intrhook_drain(&ctrlr->config_hook);
+
+ ufshci_ctrlr_destruct(ctrlr, dev);
+
+ return (0);
+}
+
+void
+ufshci_completion_poll_cb(void *arg, const struct ufshci_completion *cpl,
+ bool error)
+{
+ struct ufshci_completion_poll_status *status = arg;
+
+ /*
+ * Copy status into the argument passed by the caller, so that the
+ * caller can check the status to determine if the the request passed
+ * or failed.
+ */
+ memcpy(&status->cpl.response_upiu, &cpl->response_upiu, cpl->size);
+ status->error = error;
+ atomic_store_rel_int(&status->done, 1);
+}
+
+static int
+ufshci_modevent(module_t mod __unused, int type __unused, void *argp __unused)
+{
+ return (0);
+}
+
+static moduledata_t ufshci_mod = { "ufshci", ufshci_modevent, 0 };
+
+DECLARE_MODULE(ufshci, ufshci_mod, SI_SUB_DRIVERS, SI_ORDER_FIRST);
+MODULE_VERSION(ufshci, 1);
+MODULE_DEPEND(ufshci, cam, 1, 1, 1);