diff options
author | Felipe Contreras | 2010-11-10 19:09:04 +0100 |
---|---|---|
committer | Omar Ramirez Luna | 2010-11-11 01:34:42 +0100 |
commit | 677f2ded8179c8d5d49cfea0d5217691182b48f2 (patch) | |
tree | cd86a5425c72e8bc8e9c930bea43488c1253223d /drivers/staging/tidspbridge/pmgr/dev.c | |
parent | Revert "staging: tidspbridge - update Kconfig to select IOMMU module" (diff) | |
download | kernel-qcow2-linux-677f2ded8179c8d5d49cfea0d5217691182b48f2.tar.gz kernel-qcow2-linux-677f2ded8179c8d5d49cfea0d5217691182b48f2.tar.xz kernel-qcow2-linux-677f2ded8179c8d5d49cfea0d5217691182b48f2.zip |
Revert "staging: tidspbridge - remove dmm custom module"
This reverts commit 2ab573487a98c06fdfb34308f641f09369d61fa2.
Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
Signed-off-by: Omar Ramirez Luna <omar.ramirez@ti.com>
Diffstat (limited to 'drivers/staging/tidspbridge/pmgr/dev.c')
-rw-r--r-- | drivers/staging/tidspbridge/pmgr/dev.c | 61 |
1 files changed, 57 insertions, 4 deletions
diff --git a/drivers/staging/tidspbridge/pmgr/dev.c b/drivers/staging/tidspbridge/pmgr/dev.c index 7b30267ef0e2..e3c78fbfb3c0 100644 --- a/drivers/staging/tidspbridge/pmgr/dev.c +++ b/drivers/staging/tidspbridge/pmgr/dev.c @@ -34,6 +34,7 @@ #include <dspbridge/cod.h> #include <dspbridge/drv.h> #include <dspbridge/proc.h> +#include <dspbridge/dmm.h> /* ----------------------------------- Resource Manager */ #include <dspbridge/mgr.h> @@ -74,6 +75,7 @@ struct dev_object { struct msg_mgr *hmsg_mgr; /* Message manager. */ struct io_mgr *hio_mgr; /* IO manager (CHNL, msg_ctrl) */ struct cmm_object *hcmm_mgr; /* SM memory manager. */ + struct dmm_object *dmm_mgr; /* Dynamic memory manager. */ struct ldr_module *module_obj; /* Bridge Module handle. */ u32 word_size; /* DSP word size: quick access. */ struct drv_object *hdrv_obj; /* Driver Object */ @@ -248,6 +250,9 @@ int dev_create_device(struct dev_object **device_obj, /* Instantiate the DEH module */ status = bridge_deh_create(&dev_obj->hdeh_mgr, dev_obj); } + /* Create DMM mgr . */ + status = dmm_create(&dev_obj->dmm_mgr, + (struct dev_object *)dev_obj, NULL); } /* Add the new DEV_Object to the global list: */ if (!status) { @@ -273,6 +278,8 @@ leave: kfree(dev_obj->proc_list); if (dev_obj->cod_mgr) cod_delete(dev_obj->cod_mgr); + if (dev_obj->dmm_mgr) + dmm_destroy(dev_obj->dmm_mgr); kfree(dev_obj); } @@ -382,6 +389,11 @@ int dev_destroy_device(struct dev_object *hdev_obj) dev_obj->hcmm_mgr = NULL; } + if (dev_obj->dmm_mgr) { + dmm_destroy(dev_obj->dmm_mgr); + dev_obj->dmm_mgr = NULL; + } + /* Call the driver's bridge_dev_destroy() function: */ /* Require of DevDestroy */ if (dev_obj->hbridge_context) { @@ -462,6 +474,32 @@ int dev_get_cmm_mgr(struct dev_object *hdev_obj, } /* + * ======== dev_get_dmm_mgr ======== + * Purpose: + * Retrieve the handle to the dynamic memory manager created for this + * device. + */ +int dev_get_dmm_mgr(struct dev_object *hdev_obj, + struct dmm_object **mgr) +{ + int status = 0; + struct dev_object *dev_obj = hdev_obj; + + DBC_REQUIRE(refs > 0); + DBC_REQUIRE(mgr != NULL); + + if (hdev_obj) { + *mgr = dev_obj->dmm_mgr; + } else { + *mgr = NULL; + status = -EFAULT; + } + + DBC_ENSURE(!status || (mgr != NULL && *mgr == NULL)); + return status; +} + +/* * ======== dev_get_cod_mgr ======== * Purpose: * Retrieve the COD manager create for this device. @@ -713,8 +751,10 @@ void dev_exit(void) refs--; - if (refs == 0) + if (refs == 0) { cmm_exit(); + dmm_exit(); + } DBC_ENSURE(refs >= 0); } @@ -726,12 +766,25 @@ void dev_exit(void) */ bool dev_init(void) { - bool ret = true; + bool cmm_ret, dmm_ret, ret = true; DBC_REQUIRE(refs >= 0); - if (refs == 0) - ret = cmm_init(); + if (refs == 0) { + cmm_ret = cmm_init(); + dmm_ret = dmm_init(); + + ret = cmm_ret && dmm_ret; + + if (!ret) { + if (cmm_ret) + cmm_exit(); + + if (dmm_ret) + dmm_exit(); + + } + } if (ret) refs++; |