/**************************************************************************** * * Copyright (c) 2014 - 2018 Samsung Electronics Co., Ltd. All rights reserved * ****************************************************************************/ #include #include #include #include "scsc_mx_impl.h" #include "mifintrbit.h" #include "miframman.h" #include "mifmboxman.h" #ifdef CONFIG_SCSC_SMAPPER #include "mifsmapper.h" #endif #ifdef CONFIG_SCSC_QOS #include "mifqos.h" #endif #include "mifproc.h" #include "mxman.h" #include "mxproc.h" #include "mxsyserr.h" #include "srvman.h" #include "mxmgmt_transport.h" #include "gdb_transport.h" #include "mxlog.h" #include "mxlogger.h" #include "panicmon.h" #include "mxlog_transport.h" #include "suspendmon.h" #include "scsc/api/bt_audio.h" #include "mxfwconfig.h" #ifdef CONFIG_SCSC_WLBTD #include "scsc_wlbtd.h" #endif struct scsc_mx { struct scsc_mif_abs *mif_abs; struct mifintrbit intr; struct miframman ram; struct miframman ram2; struct mifmboxman mbox; struct mifabox mifabox; #ifdef CONFIG_SCSC_SMAPPER struct mifsmapper smapper; #endif #ifdef CONFIG_SCSC_QOS struct mifqos qos; #endif struct mifproc proc; struct mxman mxman; struct srvman srvman; struct mxmgmt_transport mxmgmt_transport; struct gdb_transport gdb_transport_r4; struct gdb_transport gdb_transport_m4; #ifdef CONFIG_SCSC_MX450_GDB_SUPPORT struct gdb_transport gdb_transport_m4_1; #endif int users; struct mxlog mxlog; struct mxlogger mxlogger; struct panicmon panicmon; struct mxlog_transport mxlog_transport; struct suspendmon suspendmon; struct mxfwconfig mxfwconfig; }; struct scsc_mx *scsc_mx_create(struct scsc_mif_abs *mif) { struct scsc_mx *mx; mx = kzalloc(sizeof(*mx), GFP_KERNEL); if (!mx) return NULL; mx->mif_abs = mif; mifintrbit_init(&mx->intr, mif); mifmboxman_init(&mx->mbox); suspendmon_init(&mx->suspendmon, mx); mxman_init(&mx->mxman, mx); srvman_init(&mx->srvman, mx); mifproc_create_proc_dir(mx->mif_abs); #ifdef CONFIG_SCSC_WLBTD scsc_wlbtd_init(); #endif mx_syserr_init(); SCSC_TAG_DEBUG(MXMAN, "Hurray Maxwell is here with %p\n", mx); return mx; } void scsc_mx_destroy(struct scsc_mx *mx) { SCSC_TAG_DEBUG(MXMAN, "\n"); BUG_ON(mx == NULL); mifintrbit_deinit(&mx->intr); mifmboxman_deinit(scsc_mx_get_mboxman(mx)); #ifdef CONFIG_SCSC_SMAPPER mifsmapper_deinit(scsc_mx_get_smapper(mx)); #endif suspendmon_deinit(scsc_mx_get_suspendmon(mx)); mifproc_remove_proc_dir(); srvman_deinit(&mx->srvman); mxman_deinit(&mx->mxman); #ifdef CONFIG_SCSC_WLBTD scsc_wlbtd_deinit(); #endif kfree(mx); SCSC_TAG_DEBUG(MXMAN, "OK\n"); } struct scsc_mif_abs *scsc_mx_get_mif_abs(struct scsc_mx *mx) { return mx->mif_abs; } struct mifintrbit *scsc_mx_get_intrbit(struct scsc_mx *mx) { return &mx->intr; } struct miframman *scsc_mx_get_ramman(struct scsc_mx *mx) { return &mx->ram; } struct miframman *scsc_mx_get_ramman2(struct scsc_mx *mx) { return &mx->ram2; } struct mifabox *scsc_mx_get_aboxram(struct scsc_mx *mx) { return &mx->mifabox; } struct mifmboxman *scsc_mx_get_mboxman(struct scsc_mx *mx) { return &mx->mbox; } #ifdef CONFIG_SCSC_SMAPPER struct mifsmapper *scsc_mx_get_smapper(struct scsc_mx *mx) { return &mx->smapper; } #endif #ifdef CONFIG_SCSC_QOS struct mifqos *scsc_mx_get_qos(struct scsc_mx *mx) { return &mx->qos; } #endif struct device *scsc_mx_get_device(struct scsc_mx *mx) { return mx->mif_abs->get_mif_device(mx->mif_abs); } EXPORT_SYMBOL_GPL(scsc_mx_get_device); /* TODO: export a top-level API for this */ struct mxman *scsc_mx_get_mxman(struct scsc_mx *mx) { return &mx->mxman; } struct srvman *scsc_mx_get_srvman(struct scsc_mx *mx) { return &mx->srvman; } struct mxmgmt_transport *scsc_mx_get_mxmgmt_transport(struct scsc_mx *mx) { return &mx->mxmgmt_transport; } struct gdb_transport *scsc_mx_get_gdb_transport_r4(struct scsc_mx *mx) { return &mx->gdb_transport_r4; } struct gdb_transport *scsc_mx_get_gdb_transport_m4(struct scsc_mx *mx) { return &mx->gdb_transport_m4; } #ifdef CONFIG_SCSC_MX450_GDB_SUPPORT struct gdb_transport *scsc_mx_get_gdb_transport_m4_1(struct scsc_mx *mx) { return &mx->gdb_transport_m4_1; } #endif struct mxlog *scsc_mx_get_mxlog(struct scsc_mx *mx) { return &mx->mxlog; } struct panicmon *scsc_mx_get_panicmon(struct scsc_mx *mx) { return &mx->panicmon; } struct mxlog_transport *scsc_mx_get_mxlog_transport(struct scsc_mx *mx) { return &mx->mxlog_transport; } struct mxlogger *scsc_mx_get_mxlogger(struct scsc_mx *mx) { return &mx->mxlogger; } struct suspendmon *scsc_mx_get_suspendmon(struct scsc_mx *mx) { return &mx->suspendmon; } struct mxfwconfig *scsc_mx_get_mxfwconfig(struct scsc_mx *mx) { return &mx->mxfwconfig; }