Commit b3ddf280 authored by Toshiro Kobayashi's avatar Toshiro Kobayashi Committed by Tony Lindgren

[PATCH] ARM: OMAP: DSP Gateway v3.3

This is DSP Gateway v3.3 patch.
parent 76330285
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2005/01/21: DSP Gateway version 3.2 * 2005/06/09: DSP Gateway version 3.3
*/ */
#include "hardware_dsp.h" #include "hardware_dsp.h"
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
#ifdef OLD_BINARY_SUPPORT #ifdef OLD_BINARY_SUPPORT
#define MBREV_3_0 0x0017 #define MBREV_3_0 0x0017
#define MBREV_3_2 0x0018
#endif #endif
#define DSP_INIT_PAGE 0xfff000 #define DSP_INIT_PAGE 0xfff000
...@@ -38,6 +39,22 @@ ...@@ -38,6 +39,22 @@
#define IDLEPG_BASE 0xfffe00 #define IDLEPG_BASE 0xfffe00
#define IDLEPG_SIZE 0x100 #define IDLEPG_SIZE 0x100
/* timeout value for DSP response */
#define DSP_TIMEOUT (10 * HZ)
enum dsp_mem_type_e {
MEM_TYPE_CROSSING = -1,
MEM_TYPE_NONE = 0,
MEM_TYPE_DARAM,
MEM_TYPE_SARAM,
MEM_TYPE_EXTERN,
};
enum arm_dsp_dir {
DIR_A2D,
DIR_D2A,
};
/* /*
* INT_D2A_MB value definition * INT_D2A_MB value definition
* INT_DSP_MAILBOX1: use Mailbox 1 (INT 10) for DSP->ARM mailbox * INT_DSP_MAILBOX1: use Mailbox 1 (INT 10) for DSP->ARM mailbox
...@@ -49,8 +66,22 @@ ...@@ -49,8 +66,22 @@
#define TASKDEV_MAX 254 #define TASKDEV_MAX 254
#define MKLONG(uw,lw) (((unsigned long)(uw)) << 16 | (lw)) #define MKLONG(uw,lw) (((unsigned long)(uw)) << 16 | (lw))
#define MKVIRT(uw,lw) dspword_to_virt(MKLONG((uw), (lw)));
#define MBCMD(nm) OMAP_DSP_MBCMD_##nm #define MBCMD(nm) OMAP_DSP_MBCMD_##nm
struct sync_seq {
unsigned short da_dsp;
unsigned short da_arm;
unsigned short ad_dsp;
unsigned short ad_arm;
};
struct mem_sync_struct {
struct sync_seq *DARAM;
struct sync_seq *SARAM;
struct sync_seq *SDRAM;
};
/* struct mbcmd and struct mbcmd_hw must be compatible */ /* struct mbcmd and struct mbcmd_hw must be compatible */
struct mbcmd { struct mbcmd {
unsigned short cmd_l:8; unsigned short cmd_l:8;
...@@ -79,26 +110,32 @@ struct mb_exarg { ...@@ -79,26 +110,32 @@ struct mb_exarg {
extern void dsp_mb_start(void); extern void dsp_mb_start(void);
extern void dsp_mb_stop(void); extern void dsp_mb_stop(void);
extern void dsp_mb_config(void *sync_seq_adr); extern int dsp_mb_config(void *p);
extern int sync_with_dsp(unsigned short *syncwd, unsigned short tid, extern int sync_with_dsp(unsigned short *syncwd, unsigned short tid,
int try_cnt); int try_cnt);
extern int __mbsend(struct mbcmd *mb); extern int __mbcmd_send(struct mbcmd *mb);
extern int __dsp_mbsend(struct mbcmd *mb, struct mb_exarg *arg, extern int __dsp_mbcmd_send(struct mbcmd *mb, struct mb_exarg *arg,
int recovery_flag); int recovery_flag);
#define dsp_mbsend(mb) __dsp_mbsend(mb, NULL, 0) #define dsp_mbcmd_send(mb) __dsp_mbcmd_send(mb, NULL, 0)
#define dsp_mbsend_recovery(mb) __dsp_mbsend(mb, NULL, 1) #define dsp_mbcmd_send_exarg(mb, arg) __dsp_mbcmd_send(mb, arg, 0)
#define dsp_mbsend_exarg(mb, arg) __dsp_mbsend(mb, arg, 0) extern int __dsp_mbcmd_send_and_wait(struct mbcmd *mb, struct mb_exarg *arg,
extern int __dsp_mbsend_and_wait(struct mbcmd *mb, struct mb_exarg *arg, wait_queue_head_t *q);
wait_queue_head_t *q); #define dsp_mbcmd_send_and_wait(mb, q) \
#define dsp_mbsend_and_wait(mb, q) \ __dsp_mbcmd_send_and_wait(mb, NULL, q)
__dsp_mbsend_and_wait(mb, NULL, q) #define dsp_mbcmd_send_and_wait_exarg(mb, arg, q) \
#define dsp_mbsend_and_wait_exarg(mb, arg, q) \ __dsp_mbcmd_send_and_wait(mb, arg, q)
__dsp_mbsend_and_wait(mb, arg, q) int __dsp_mbsend(unsigned char cmdh, unsigned char cmdl, unsigned short data,
int recovery_flag);
#define dsp_mbsend(cmdh, cmdl, data) \
__dsp_mbsend(cmdh, cmdl, data, 0)
#define dsp_mbsend_recovery(cmdh, cmdl, data) \
__dsp_mbsend(cmdh, cmdl, data, 1)
extern void ipbuf_start(void); extern void ipbuf_start(void);
extern void ipbuf_stop(void); extern void ipbuf_stop(void);
extern int ipbuf_config(unsigned short ln, unsigned short lsz, extern int ipbuf_config(unsigned short ln, unsigned short lsz, void *base);
unsigned long adr); extern int ipbuf_sys_config(void *p, enum arm_dsp_dir dir);
extern int ipbuf_p_validate(void *p, enum arm_dsp_dir dir);
extern unsigned short get_free_ipbuf(unsigned char tid); extern unsigned short get_free_ipbuf(unsigned char tid);
extern void unuse_ipbuf_nowait(unsigned short bid); extern void unuse_ipbuf_nowait(unsigned short bid);
extern void unuse_ipbuf(unsigned short bid); extern void unuse_ipbuf(unsigned short bid);
...@@ -110,6 +147,8 @@ extern void balance_ipbuf(void); ...@@ -110,6 +147,8 @@ extern void balance_ipbuf(void);
(ipbuf_pvt)->s = OMAP_DSP_TID_FREE; \ (ipbuf_pvt)->s = OMAP_DSP_TID_FREE; \
} while(0) } while(0)
extern int mbx_revision;
extern int dsp_is_ready(void); extern int dsp_is_ready(void);
extern int dspuncfg(void); extern int dspuncfg(void);
extern void dsp_runlevel(unsigned char level); extern void dsp_runlevel(unsigned char level);
...@@ -125,16 +164,24 @@ extern int dsp_rmdev(char *name); ...@@ -125,16 +164,24 @@ extern int dsp_rmdev(char *name);
extern int dsp_tadd(unsigned char minor, unsigned long adr); extern int dsp_tadd(unsigned char minor, unsigned long adr);
extern int dsp_tdel(unsigned char minor); extern int dsp_tdel(unsigned char minor);
extern int dsp_tkill(unsigned char minor); extern int dsp_tkill(unsigned char minor);
extern long taskdev_state(unsigned char minor); extern long taskdev_state_stale(unsigned char minor);
extern int dsp_dbg_config(short *buf, unsigned short sz, unsigned short lsz);
extern void dsp_dbg_stop(void);
extern int ipbuf_is_held(unsigned char tid, unsigned short bid); extern int ipbuf_is_held(unsigned char tid, unsigned short bid);
extern void dsp_mem_sync_inc(void);
extern int dsp_mem_sync_config(struct mem_sync_struct *sync);
extern enum dsp_mem_type_e dsp_mem_type(void *vadr, size_t len);
extern int dsp_address_validate(void *p, size_t len, char *fmt, ...);
extern int dsp_mem_enable(void *adr); extern int dsp_mem_enable(void *adr);
extern int dsp_mem_disable(void *adr); extern void dsp_mem_disable(void *adr);
extern int __dsp_mem_enable(void *adr); extern void dsp_mem_usecount_clear(void);
extern int __dsp_mem_disable(void *adr); extern void exmap_use(void *vadr, size_t len);
extern void exmap_unuse(void *vadr, size_t len);
extern unsigned long dsp_virt_to_phys(void *vadr, size_t *len); extern unsigned long dsp_virt_to_phys(void *vadr, size_t *len);
extern void dsp_mem_start(void); extern void dsp_mem_start(void);
extern void dsp_mem_stop(void);
extern void dsp_twch_start(void); extern void dsp_twch_start(void);
extern void dsp_twch_stop(void); extern void dsp_twch_stop(void);
...@@ -165,14 +212,9 @@ extern const struct cmdinfo *cmdinfo[]; ...@@ -165,14 +212,9 @@ extern const struct cmdinfo *cmdinfo[];
#define cmd_name(mb) (cmdinfo[(mb).cmd_h]->name) #define cmd_name(mb) (cmdinfo[(mb).cmd_h]->name)
extern char *subcmd_name(struct mbcmd *mb); extern char *subcmd_name(struct mbcmd *mb);
enum mblog_dir { extern void mblog_add(struct mbcmd *mb, enum arm_dsp_dir dir);
MBLOG_DIR_AD,
MBLOG_DIR_DA,
};
extern void mblog_add(struct mbcmd *mb, enum mblog_dir dir);
#ifdef CONFIG_OMAP_DSP_MBCMD_VERBOSE #ifdef CONFIG_OMAP_DSP_MBCMD_VERBOSE
extern void mblog_printcmd(struct mbcmd *mb, enum mblog_dir dir); extern void mblog_printcmd(struct mbcmd *mb, enum arm_dsp_dir dir);
#else /* CONFIG_OMAP_DSP_MBCMD_VERBOSE */ #else /* CONFIG_OMAP_DSP_MBCMD_VERBOSE */
#define mblog_printcmd(mb, dir) do {} while(0) #define mblog_printcmd(mb, dir) do {} while(0)
#endif /* CONFIG_OMAP_DSP_MBCMD_VERBOSE */ #endif /* CONFIG_OMAP_DSP_MBCMD_VERBOSE */
......
This diff is collapsed.
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2004/11/16: DSP Gateway version 3.2 * 2005/06/13: DSP Gateway version 3.3
*/ */
#include "hardware_dsp.h" #include "hardware_dsp.h"
...@@ -52,28 +52,28 @@ ...@@ -52,28 +52,28 @@
* default setting: wordswap = all, byteswap = APIMEM only * default setting: wordswap = all, byteswap = APIMEM only
*/ */
#define mpui_wordswap_on() \ #define mpui_wordswap_on() \
{ \ do { \
omap_writel( \ omap_writel( \
(omap_readl(MPUI_CTRL) & ~MPUI_CTRL_WORDSWAP_MASK) | \ (omap_readl(MPUI_CTRL) & ~MPUI_CTRL_WORDSWAP_MASK) | \
MPUI_CTRL_WORDSWAP_ALL, MPUI_CTRL); \ MPUI_CTRL_WORDSWAP_ALL, MPUI_CTRL); \
} while(0) } while(0)
#define mpui_wordswap_off() \ #define mpui_wordswap_off() \
{ \ do { \
omap_writel( \ omap_writel( \
(omap_readl(MPUI_CTRL) & ~MPUI_CTRL_WORDSWAP_MASK) | \ (omap_readl(MPUI_CTRL) & ~MPUI_CTRL_WORDSWAP_MASK) | \
MPUI_CTRL_WORDSWAP_NONE, MPUI_CTRL); \ MPUI_CTRL_WORDSWAP_NONE, MPUI_CTRL); \
} while(0) } while(0)
#define mpui_byteswap_on() \ #define mpui_byteswap_on() \
{ \ do { \
omap_writel( \ omap_writel( \
(omap_readl(MPUI_CTRL) & ~MPUI_CTRL_BYTESWAP_MASK) | \ (omap_readl(MPUI_CTRL) & ~MPUI_CTRL_BYTESWAP_MASK) | \
MPUI_CTRL_BYTESWAP_API, MPUI_CTRL); \ MPUI_CTRL_BYTESWAP_API, MPUI_CTRL); \
} while(0) } while(0)
#define mpui_byteswap_off() \ #define mpui_byteswap_off() \
{ \ do { \
omap_writel( \ omap_writel( \
(omap_readl(MPUI_CTRL) & ~MPUI_CTRL_BYTESWAP_MASK) | \ (omap_readl(MPUI_CTRL) & ~MPUI_CTRL_BYTESWAP_MASK) | \
MPUI_CTRL_BYTESWAP_NONE, MPUI_CTRL); \ MPUI_CTRL_BYTESWAP_NONE, MPUI_CTRL); \
...@@ -83,13 +83,13 @@ ...@@ -83,13 +83,13 @@
* TC wordswap on / off * TC wordswap on / off
*/ */
#define tc_wordswap() \ #define tc_wordswap() \
{ \ do { \
omap_writel(TC_ENDIANISM_SWAP_WORD | TC_ENDIANISM_EN, \ omap_writel(TC_ENDIANISM_SWAP_WORD | TC_ENDIANISM_EN, \
TC_ENDIANISM); \ TC_ENDIANISM); \
} while(0) } while(0)
#define tc_noswap() \ #define tc_noswap() \
{ \ do { \
omap_writel(omap_readl(TC_ENDIANISM) & ~TC_ENDIANISM_EN, \ omap_writel(omap_readl(TC_ENDIANISM) & ~TC_ENDIANISM_EN, \
TC_ENDIANISM); \ TC_ENDIANISM); \
} while(0) } while(0)
...@@ -102,16 +102,31 @@ ...@@ -102,16 +102,31 @@
#define __dsp_run() omap_set_bit_regw(ARM_RSTCT1_DSP_EN, ARM_RSTCT1) #define __dsp_run() omap_set_bit_regw(ARM_RSTCT1_DSP_EN, ARM_RSTCT1)
#define __dsp_reset() omap_clr_bit_regw(ARM_RSTCT1_DSP_EN, ARM_RSTCT1) #define __dsp_reset() omap_clr_bit_regw(ARM_RSTCT1_DSP_EN, ARM_RSTCT1)
#define RUNSTAT_RESET 0
#define RUNSTAT_IDLE 1
#define RUNSTAT_RUN 2
extern struct clk *dsp_ck_handle; extern struct clk *dsp_ck_handle;
extern struct clk *api_ck_handle; extern struct clk *api_ck_handle;
extern unsigned long dspmem_base, dspmem_size; extern unsigned long dspmem_base, dspmem_size,
extern int dsp_runstat; daram_base, daram_size,
extern unsigned short dsp_icrmask; saram_base, saram_size;
enum e_cpustat {
CPUSTAT_RESET = 0,
CPUSTAT_GBL_IDLE = 1,
CPUSTAT_CPU_IDLE = 2,
CPUSTAT_RUN = 3
};
#define cpustat_name(stat) \
((stat == CPUSTAT_RESET) ? "RESET" :\
(stat == CPUSTAT_GBL_IDLE) ? "GBL_IDLE" :\
(stat == CPUSTAT_CPU_IDLE) ? "CPU_IDLE" :\
(stat == CPUSTAT_RUN) ? "RUN" :\
"unknown")
int dsp_set_rstvect(unsigned long adr); int dsp_set_rstvect(unsigned long adr);
void dsp_idle(void);
void dsp_set_idle_boot_base(unsigned long adr, size_t size); void dsp_set_idle_boot_base(unsigned long adr, size_t size);
void dsp_cpustat_request(enum e_cpustat req);
enum e_cpustat dsp_cpustat_get_stat(void);
unsigned short dsp_cpustat_get_icrmask(void);
void dsp_cpustat_set_icrmask(unsigned short mask);
void dsp_register_mem_cb(int (*req_cb)(void), void (*rel_cb)(void));
void dsp_unregister_mem_cb(void);
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2005/02/15: DSP Gateway version 3.2 * 2005/06/07: DSP Gateway version 3.3
*/ */
#include <linux/init.h> #include <linux/init.h>
...@@ -55,17 +55,11 @@ enum mbseq_check_level { ...@@ -55,17 +55,11 @@ enum mbseq_check_level {
}; };
static enum mbseq_check_level mbseq_check_level = MBSEQ_CHECK_VERBOSE; static enum mbseq_check_level mbseq_check_level = MBSEQ_CHECK_VERBOSE;
static unsigned short mbseq_send;
static unsigned short mbseq_expect;
struct sync_seq {
unsigned short da_dsp;
unsigned short da_arm;
unsigned short ad_dsp;
unsigned short ad_arm;
};
static struct sync_seq *sync_seq; static int mbx1_valid;
static struct sync_seq *mbseq;
static unsigned short mbseq_expect_tmp;
static unsigned short *mbseq_expect = &mbseq_expect_tmp;
/* /*
* mailbox commands * mailbox commands
...@@ -78,7 +72,11 @@ extern void mbx1_bkyld(struct mbcmd *mb); ...@@ -78,7 +72,11 @@ extern void mbx1_bkyld(struct mbcmd *mb);
extern void mbx1_bksndp(struct mbcmd *mb); extern void mbx1_bksndp(struct mbcmd *mb);
extern void mbx1_bkreqp(struct mbcmd *mb); extern void mbx1_bkreqp(struct mbcmd *mb);
extern void mbx1_tctl(struct mbcmd *mb); extern void mbx1_tctl(struct mbcmd *mb);
extern void mbx1_poll(struct mbcmd *mb);
#ifdef OLD_BINARY_SUPPORT
/* v3.3 obsolete */
extern void mbx1_wdt(struct mbcmd *mb); extern void mbx1_wdt(struct mbcmd *mb);
#endif
extern void mbx1_suspend(struct mbcmd *mb); extern void mbx1_suspend(struct mbcmd *mb);
static void mbx1_kfunc(struct mbcmd *mb); static void mbx1_kfunc(struct mbcmd *mb);
extern void mbx1_tcfg(struct mbcmd *mb); extern void mbx1_tcfg(struct mbcmd *mb);
...@@ -100,7 +98,11 @@ static const struct cmdinfo ...@@ -100,7 +98,11 @@ static const struct cmdinfo
cif_bksndp = { "BKSNDP", CMD_L_TYPE_TID, mbx1_bksndp }, cif_bksndp = { "BKSNDP", CMD_L_TYPE_TID, mbx1_bksndp },
cif_bkreqp = { "BKREQP", CMD_L_TYPE_TID, mbx1_bkreqp }, cif_bkreqp = { "BKREQP", CMD_L_TYPE_TID, mbx1_bkreqp },
cif_tctl = { "TCTL", CMD_L_TYPE_TID, mbx1_tctl }, cif_tctl = { "TCTL", CMD_L_TYPE_TID, mbx1_tctl },
cif_poll = { "POLL", CMD_L_TYPE_NULL, mbx1_poll },
#ifdef OLD_BINARY_SUPPORT
/* v3.3 obsolete */
cif_wdt = { "WDT", CMD_L_TYPE_NULL, mbx1_wdt }, cif_wdt = { "WDT", CMD_L_TYPE_NULL, mbx1_wdt },
#endif
cif_runlevel = { "RUNLEVEL", CMD_L_TYPE_SUBCMD, NULL }, cif_runlevel = { "RUNLEVEL", CMD_L_TYPE_SUBCMD, NULL },
cif_pm = { "PM", CMD_L_TYPE_SUBCMD, NULL }, cif_pm = { "PM", CMD_L_TYPE_SUBCMD, NULL },
cif_suspend = { "SUSPEND", CMD_L_TYPE_NULL, mbx1_suspend }, cif_suspend = { "SUSPEND", CMD_L_TYPE_NULL, mbx1_suspend },
...@@ -129,7 +131,7 @@ const struct cmdinfo *cmdinfo[128] = { ...@@ -129,7 +131,7 @@ const struct cmdinfo *cmdinfo[128] = {
&cif_bksndp, &cif_bkreqp, &cif_null, &cif_null, &cif_bksndp, &cif_bkreqp, &cif_null, &cif_null,
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
/*30*/ &cif_tctl, &cif_null, &cif_null, &cif_null, /*30*/ &cif_tctl, &cif_null, &cif_poll, &cif_null,
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
...@@ -137,7 +139,12 @@ const struct cmdinfo *cmdinfo[128] = { ...@@ -137,7 +139,12 @@ const struct cmdinfo *cmdinfo[128] = {
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
#ifdef OLD_BINARY_SUPPORT
/* v3.3 obsolete */
/*50*/ &cif_wdt, &cif_runlevel, &cif_pm, &cif_suspend, /*50*/ &cif_wdt, &cif_runlevel, &cif_pm, &cif_suspend,
#else
/*50*/ &cif_null, &cif_runlevel, &cif_pm, &cif_suspend,
#endif
&cif_kfunc, &cif_null, &cif_null, &cif_null, &cif_kfunc, &cif_null, &cif_null, &cif_null,
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
&cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null, &cif_null,
...@@ -207,7 +214,7 @@ static __inline__ int mbsync_irq_save(unsigned long *flags, int try_cnt) ...@@ -207,7 +214,7 @@ static __inline__ int mbsync_irq_save(unsigned long *flags, int try_cnt)
#define print_mb_mmu_abort(mb) do {} while(0) #define print_mb_mmu_abort(mb) do {} while(0)
#endif /* !CONFIG_OMAP_DSP_MBCMD_VERBOSE */ #endif /* !CONFIG_OMAP_DSP_MBCMD_VERBOSE */
int __mbsend(struct mbcmd *mb) int __mbcmd_send(struct mbcmd *mb)
{ {
struct mbcmd_hw *mb_hw = (struct mbcmd_hw *)mb; struct mbcmd_hw *mb_hw = (struct mbcmd_hw *)mb;
unsigned long flags; unsigned long flags;
...@@ -220,12 +227,13 @@ int __mbsend(struct mbcmd *mb) ...@@ -220,12 +227,13 @@ int __mbsend(struct mbcmd *mb)
return -1; return -1;
} }
mb->seq = mbseq_send & 1; if (mbseq) {
mbseq_send++; mb->seq = mbseq->ad_arm;
if (sync_seq) mbseq->ad_arm++;
sync_seq->ad_arm = mbseq_send; } else
mblog_add(mb, MBLOG_DIR_AD); mb->seq = 0;
mblog_printcmd(mb, MBLOG_DIR_AD); mblog_add(mb, DIR_A2D);
mblog_printcmd(mb, DIR_A2D);
omap_writew(mb_hw->data, MAILBOX_ARM2DSP1); omap_writew(mb_hw->data, MAILBOX_ARM2DSP1);
omap_writew(mb_hw->cmd, MAILBOX_ARM2DSP1b); omap_writew(mb_hw->cmd, MAILBOX_ARM2DSP1b);
...@@ -235,9 +243,9 @@ int __mbsend(struct mbcmd *mb) ...@@ -235,9 +243,9 @@ int __mbsend(struct mbcmd *mb)
} }
/* /*
* __dsp_mbsend(): mailbox dispatcher * __dsp_mbcmd_send(): mailbox dispatcher
*/ */
int __dsp_mbsend(struct mbcmd *mb, struct mb_exarg *arg, int recovery_flag) int __dsp_mbcmd_send(struct mbcmd *mb, struct mb_exarg *arg, int recovery_flag)
{ {
static DECLARE_MUTEX(mbsend_sem); static DECLARE_MUTEX(mbsend_sem);
int ret = 0; int ret = 0;
...@@ -257,10 +265,18 @@ int __dsp_mbsend(struct mbcmd *mb, struct mb_exarg *arg, int recovery_flag) ...@@ -257,10 +265,18 @@ int __dsp_mbsend(struct mbcmd *mb, struct mb_exarg *arg, int recovery_flag)
if (arg) { /* we have extra argument */ if (arg) { /* we have extra argument */
int i; int i;
if (__dsp_mem_enable(ipbuf_sys_ad) < 0) /*
goto out; * even if ipbuf_sys_ad is in DSP internal memory,
* dsp_mem_enable() never cause to call PM mailbox command
* because in that case DSP memory should be always enabled.
* (see ipbuf_sys_hold_mem_active in ipbuf.c)
*
* Therefore, we can call this function here safely.
*/
dsp_mem_enable(ipbuf_sys_ad);
if (sync_with_dsp(&ipbuf_sys_ad->s, OMAP_DSP_TID_FREE, 10) < 0) { if (sync_with_dsp(&ipbuf_sys_ad->s, OMAP_DSP_TID_FREE, 10) < 0) {
printk(KERN_ERR "omapdsp: ipbuf_sys_ad is busy.\n"); printk(KERN_ERR "omapdsp: ipbuf_sys_ad is busy.\n");
dsp_mem_disable(ipbuf_sys_ad);
ret = -EBUSY; ret = -EBUSY;
goto out; goto out;
} }
...@@ -268,19 +284,18 @@ int __dsp_mbsend(struct mbcmd *mb, struct mb_exarg *arg, int recovery_flag) ...@@ -268,19 +284,18 @@ int __dsp_mbsend(struct mbcmd *mb, struct mb_exarg *arg, int recovery_flag)
ipbuf_sys_ad->d[i] = arg->argv[i]; ipbuf_sys_ad->d[i] = arg->argv[i];
} }
ipbuf_sys_ad->s = arg->tid; ipbuf_sys_ad->s = arg->tid;
if (__dsp_mem_disable(ipbuf_sys_ad) < 0) dsp_mem_disable(ipbuf_sys_ad);
goto out;
} }
ret = __mbsend(mb); ret = __mbcmd_send(mb);
out: out:
up(&mbsend_sem); up(&mbsend_sem);
return ret; return ret;
} }
int __dsp_mbsend_and_wait(struct mbcmd *mb, struct mb_exarg *arg, int __dsp_mbcmd_send_and_wait(struct mbcmd *mb, struct mb_exarg *arg,
wait_queue_head_t *q) wait_queue_head_t *q)
{ {
long current_state; long current_state;
DECLARE_WAITQUEUE(wait, current); DECLARE_WAITQUEUE(wait, current);
...@@ -288,36 +303,72 @@ int __dsp_mbsend_and_wait(struct mbcmd *mb, struct mb_exarg *arg, ...@@ -288,36 +303,72 @@ int __dsp_mbsend_and_wait(struct mbcmd *mb, struct mb_exarg *arg,
add_wait_queue(q, &wait); add_wait_queue(q, &wait);
current_state = current->state; current_state = current->state;
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
if (dsp_mbsend_exarg(mb, arg) < 0) { if (dsp_mbcmd_send_exarg(mb, arg) < 0) {
set_current_state(current_state); set_current_state(current_state);
remove_wait_queue(q, &wait); remove_wait_queue(q, &wait);
return -1; return -1;
} }
schedule(); schedule_timeout(DSP_TIMEOUT);
set_current_state(current_state); set_current_state(current_state);
remove_wait_queue(q, &wait); remove_wait_queue(q, &wait);
return 0; return 0;
} }
int __dsp_mbsend(unsigned char cmdh, unsigned char cmdl, unsigned short data,
int recovery_flag)
{
struct mbcmd mb;
mbcmd_set(mb, cmdh, cmdl, data);
return __dsp_mbcmd_send(&mb, NULL, recovery_flag);
}
static int mbsync_hold_mem_active;
void dsp_mb_start(void) void dsp_mb_start(void)
{ {
mbseq_send = 0; mbx1_valid = 1; /* start interpreting */
mbseq_expect = 0; mbseq_expect_tmp = 0;
} }
void dsp_mb_stop(void) void dsp_mb_stop(void)
{ {
sync_seq = NULL; mbx1_valid = 0; /* stop interpreting */
if (mbsync_hold_mem_active) {
dsp_mem_disable((void *)daram_base);
mbsync_hold_mem_active = 0;
}
mbseq = NULL;
mbseq_expect = &mbseq_expect_tmp;
} }
/* int dsp_mb_config(void *p)
* dsp_mb_config() is called from mbx1 workqueue
*/
void dsp_mb_config(void *sync_seq_adr)
{ {
sync_seq = sync_seq_adr; unsigned long flags;
sync_seq->da_arm = mbseq_expect;
if (dsp_address_validate(p, sizeof(struct sync_seq), "mbseq") < 0)
return -1;
if (dsp_mem_type(p, sizeof(struct sync_seq)) != MEM_TYPE_EXTERN) {
printk(KERN_WARNING
"omapdsp: mbseq is placed in DSP internal memory.\n"
" It will prevent DSP from idling.\n");
mbsync_hold_mem_active = 1;
/*
* dsp_mem_enable() never fails because
* it has been already enabled in dspcfg process and
* this will just increment the usecount.
*/
dsp_mem_enable((void *)daram_base);
}
local_irq_save(flags);
mbseq = p;
mbseq->da_arm = mbseq_expect_tmp;
mbseq_expect = &mbseq->da_arm;
local_irq_restore(flags);
return 0;
} }
/* /*
...@@ -351,8 +402,8 @@ static void do_mbx1(void) ...@@ -351,8 +402,8 @@ static void do_mbx1(void)
mb = &mbq.mb[mbq.rp]; mb = &mbq.mb[mbq.rp];
mblog_add(mb, MBLOG_DIR_DA); mblog_add(mb, DIR_D2A);
mblog_printcmd(mb, MBLOG_DIR_DA); mblog_printcmd(mb, DIR_D2A);
/* /*
* call handler for each command * call handler for each command
...@@ -386,7 +437,6 @@ static DECLARE_WORK(mbx1_work, (void (*)(void *))do_mbx1, NULL); ...@@ -386,7 +437,6 @@ static DECLARE_WORK(mbx1_work, (void (*)(void *))do_mbx1, NULL);
/* /*
* kernel function dispatcher * kernel function dispatcher
*/ */
#ifdef CONFIG_FB_OMAP_EXTERNAL_LCDC
extern void mbx1_fbctl_disable(void); extern void mbx1_fbctl_disable(void);
static void mbx1_kfunc_fbctl(unsigned short data) static void mbx1_kfunc_fbctl(unsigned short data)
...@@ -400,16 +450,13 @@ static void mbx1_kfunc_fbctl(unsigned short data) ...@@ -400,16 +450,13 @@ static void mbx1_kfunc_fbctl(unsigned short data)
"mailbox: Unknown FBCTL from DSP: 0x%04x\n", data); "mailbox: Unknown FBCTL from DSP: 0x%04x\n", data);
} }
} }
#endif
static void mbx1_kfunc(struct mbcmd *mb) static void mbx1_kfunc(struct mbcmd *mb)
{ {
switch (mb->cmd_l) { switch (mb->cmd_l) {
#ifdef CONFIG_FB_OMAP_EXTERNAL_LCDC
case OMAP_DSP_MBCMD_KFUNC_FBCTL: case OMAP_DSP_MBCMD_KFUNC_FBCTL:
mbx1_kfunc_fbctl(mb->data); mbx1_kfunc_fbctl(mb->data);
break; break;
#endif
default: default:
printk(KERN_ERR printk(KERN_ERR
...@@ -435,7 +482,11 @@ static irqreturn_t mbx1_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -435,7 +482,11 @@ static irqreturn_t mbx1_interrupt(int irq, void *dev_id, struct pt_regs *regs)
mb->hw.cmd = omap_readw(MAILBOX_DSP2ARM2b); mb->hw.cmd = omap_readw(MAILBOX_DSP2ARM2b);
#endif #endif
if (mb->sw.seq != (mbseq_expect & 1)) { /* if mbx1 has not been validated yet, discard. */
if (!mbx1_valid)
return IRQ_HANDLED;
if (mb->sw.seq != (*mbseq_expect & 1)) {
switch (mbseq_check_level) { switch (mbseq_check_level) {
case MBSEQ_CHECK_NONE: case MBSEQ_CHECK_NONE:
break; break;
...@@ -449,9 +500,7 @@ static irqreturn_t mbx1_interrupt(int irq, void *dev_id, struct pt_regs *regs) ...@@ -449,9 +500,7 @@ static irqreturn_t mbx1_interrupt(int irq, void *dev_id, struct pt_regs *regs)
} }
} }
mbseq_expect++; (*mbseq_expect)++;
if (sync_seq)
sync_seq->da_arm = mbseq_expect;
mbq_inc(mbq.wp); mbq_inc(mbq.wp);
if (mbq.wp == mbq.rp) { /* mbq is full */ if (mbq.wp == mbq.rp) { /* mbq is full */
...@@ -585,6 +634,9 @@ static int __init dsp_drv_probe(struct device *dev) ...@@ -585,6 +634,9 @@ static int __init dsp_drv_probe(struct device *dev)
goto fail6; goto fail6;
} }
/* MMU interrupt is not enabled until DSP runs */
disable_irq(INT_DSP_MMU);
#if 0 #if 0
ret = request_irq(INT_MPUIO, mpuio_interrupt, SA_INTERRUPT, "dsp", dev); ret = request_irq(INT_MPUIO, mpuio_interrupt, SA_INTERRUPT, "dsp", dev);
if (ret) { if (ret) {
...@@ -617,7 +669,7 @@ fail1: ...@@ -617,7 +669,7 @@ fail1:
static int dsp_drv_remove(struct device *dev) static int dsp_drv_remove(struct device *dev)
{ {
__dsp_reset(); dsp_cpustat_request(CPUSTAT_RESET);
#if 0 #if 0
free_irq(INT_MPUIO, dev); free_irq(INT_MPUIO, dev);
...@@ -626,6 +678,9 @@ static int dsp_drv_remove(struct device *dev) ...@@ -626,6 +678,9 @@ static int dsp_drv_remove(struct device *dev)
free_irq(INT_D2A_MB2, dev); free_irq(INT_D2A_MB2, dev);
free_irq(INT_D2A_MB1, dev); free_irq(INT_D2A_MB1, dev);
/* recover disable_depth */
enable_irq(INT_DSP_MMU);
dspuncfg(); dspuncfg();
dsp_taskmod_exit(); dsp_taskmod_exit();
mblog_exit(); mblog_exit();
......
This diff is collapsed.
...@@ -21,14 +21,13 @@ ...@@ -21,14 +21,13 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2005/02/10: DSP Gateway version 3.2 * 2005/07/26: DSP Gateway version 3.3
*/ */
#include <linux/module.h> #include <linux/module.h>
#include <linux/major.h> #include <linux/major.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/devfs_fs_kernel.h>
#include <linux/init.h> #include <linux/init.h>
#include <asm/arch/dsp.h> #include <asm/arch/dsp.h>
#include "hardware_dsp.h" #include "hardware_dsp.h"
...@@ -75,13 +74,12 @@ static struct file_operations dsp_ctl_core_fops = { ...@@ -75,13 +74,12 @@ static struct file_operations dsp_ctl_core_fops = {
static const struct dev_list { static const struct dev_list {
unsigned int minor; unsigned int minor;
char *devname; char *devname;
char *devfs_name;
umode_t mode; umode_t mode;
} dev_list[] = { } dev_list[] = {
{CTL_MINOR, "dspctl", "dspctl/ctl", S_IRUSR | S_IWUSR}, {CTL_MINOR, "dspctl", S_IRUSR | S_IWUSR},
{MEM_MINOR, "dspmem", "dspctl/mem", S_IRUSR | S_IWUSR | S_IRGRP}, {MEM_MINOR, "dspmem", S_IRUSR | S_IWUSR | S_IRGRP},
{TWCH_MINOR, "dsptwch", "dspctl/twch", S_IRUSR | S_IWUSR | S_IRGRP}, {TWCH_MINOR, "dsptwch", S_IRUSR | S_IWUSR | S_IRGRP},
{ERR_MINOR, "dsperr", "dspctl/err", S_IRUSR | S_IRGRP}, {ERR_MINOR, "dsperr", S_IRUSR | S_IRGRP},
}; };
int __init dsp_ctl_core_init(void) int __init dsp_ctl_core_init(void)
...@@ -99,15 +97,11 @@ int __init dsp_ctl_core_init(void) ...@@ -99,15 +97,11 @@ int __init dsp_ctl_core_init(void)
} }
dsp_ctl_class = class_create(THIS_MODULE, "dspctl"); dsp_ctl_class = class_create(THIS_MODULE, "dspctl");
devfs_mk_dir("dspctl");
for (i = 0; i < ARRAY_SIZE(dev_list); i++) { for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
class_device_create(dsp_ctl_class, class_device_create(dsp_ctl_class,
MKDEV(OMAP_DSP_CTL_MAJOR, MKDEV(OMAP_DSP_CTL_MAJOR,
dev_list[i].minor), dev_list[i].minor),
NULL, dev_list[i].devname); NULL, dev_list[i].devname);
devfs_mk_cdev(MKDEV(OMAP_DSP_CTL_MAJOR, dev_list[i].minor),
S_IFCHR | dev_list[i].mode,
dev_list[i].devfs_name);
} }
return 0; return 0;
...@@ -118,12 +112,10 @@ void dsp_ctl_core_exit(void) ...@@ -118,12 +112,10 @@ void dsp_ctl_core_exit(void)
int i; int i;
for (i = 0; i < ARRAY_SIZE(dev_list); i++) { for (i = 0; i < ARRAY_SIZE(dev_list); i++) {
devfs_remove(dev_list[i].devfs_name);
class_device_destroy(dsp_ctl_class, class_device_destroy(dsp_ctl_class,
MKDEV(OMAP_DSP_CTL_MAJOR, MKDEV(OMAP_DSP_CTL_MAJOR,
dev_list[i].minor)); dev_list[i].minor));
} }
devfs_remove("dspctl");
class_destroy(dsp_ctl_class); class_destroy(dsp_ctl_class);
unregister_chrdev(OMAP_DSP_CTL_MAJOR, "dspctl"); unregister_chrdev(OMAP_DSP_CTL_MAJOR, "dspctl");
......
This diff is collapsed.
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2004/11/22: DSP Gateway version 3.2 * 2005/03/11: DSP Gateway version 3.3
*/ */
#include <linux/module.h> #include <linux/module.h>
...@@ -138,15 +138,22 @@ int dsp_err_wdt_isset(void) ...@@ -138,15 +138,22 @@ int dsp_err_wdt_isset(void)
/* /*
* functions called from mailbox1 interrupt routine * functions called from mailbox1 interrupt routine
*/ */
void mbx1_wdt(struct mbcmd *mb) static void mbx1_err_wdt(unsigned short data)
{ {
printk(KERN_WARNING "omapdsp: DSP WDT expired!\n");
errcode |= OMAP_DSP_ERRDT_WDT; errcode |= OMAP_DSP_ERRDT_WDT;
errcnt++; errcnt++;
wdtval = mb->data; wdtval = data;
wake_up_interruptible(&err_wait_q); wake_up_interruptible(&err_wait_q);
} }
#ifdef OLD_BINARY_SUPPORT
/* v3.3 obsolete */
void mbx1_wdt(struct mbcmd *mb)
{
mbx1_err_wdt(mb->data);
}
#endif
extern void mbx1_err_ipbfull(void); extern void mbx1_err_ipbfull(void);
extern void mbx1_err_fatal(unsigned char tid); extern void mbx1_err_fatal(unsigned char tid);
...@@ -174,6 +181,10 @@ void mbx1_err(struct mbcmd *mb) ...@@ -174,6 +181,10 @@ void mbx1_err(struct mbcmd *mb)
tid = mb->data & 0x00ff; tid = mb->data & 0x00ff;
mbx1_err_fatal(tid); mbx1_err_fatal(tid);
break; break;
case OMAP_DSP_EID_WDT:
mbx1_err_wdt(mb->data);
break;
} }
} }
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2005/02/24: DSP Gateway version 3.2 * 2005/02/24: DSP Gateway version 3.3
*/ */
struct fifo_struct { struct fifo_struct {
......
...@@ -21,12 +21,25 @@ ...@@ -21,12 +21,25 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2004/09/30: DSP Gateway version 3.2 * 2005/05/30: DSP Gateway version 3.3
*/ */
#ifndef __OMAP_DSP_HARDWARE_DSP_H #ifndef __OMAP_DSP_HARDWARE_DSP_H
#define __OMAP_DSP_HARDWARE_DSP_H #define __OMAP_DSP_HARDWARE_DSP_H
#ifdef CONFIG_ARCH_OMAP1510
#define OMAP1510_DARAM_BASE 0xe0000000
#define OMAP1510_DARAM_SIZE 0x10000
#define OMAP1510_SARAM_BASE 0xe0010000
#define OMAP1510_SARAM_SIZE 0x18000
#endif
#ifdef CONFIG_ARCH_OMAP16XX
#define OMAP16XX_DARAM_BASE 0xe0000000
#define OMAP16XX_DARAM_SIZE 0x10000
#define OMAP16XX_SARAM_BASE 0xe0010000
#define OMAP16XX_SARAM_SIZE 0x18000
#endif
/* /*
* MAJOR device number: !! allocated arbitrary !! * MAJOR device number: !! allocated arbitrary !!
*/ */
...@@ -186,6 +199,7 @@ ...@@ -186,6 +199,7 @@
/* /*
* DSP ICR * DSP ICR
*/ */
#define DSPREG_ICR_RESERVED_BITS 0xffc0
#define DSPREG_ICR_EMIF_IDLE_DOMAIN 0x0020 #define DSPREG_ICR_EMIF_IDLE_DOMAIN 0x0020
#define DSPREG_ICR_DPLL_IDLE_DOMAIN 0x0010 #define DSPREG_ICR_DPLL_IDLE_DOMAIN 0x0010
#define DSPREG_ICR_PER_IDLE_DOMAIN 0x0008 #define DSPREG_ICR_PER_IDLE_DOMAIN 0x0008
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2005/02/17: DSP Gateway version 3.2 * 2005/06/06: DSP Gateway version 3.3
*/ */
#include <linux/init.h> #include <linux/init.h>
...@@ -38,51 +38,51 @@ struct ipbuf **ipbuf; ...@@ -38,51 +38,51 @@ struct ipbuf **ipbuf;
struct ipbcfg ipbcfg; struct ipbcfg ipbcfg;
struct ipbuf_sys *ipbuf_sys_da, *ipbuf_sys_ad; struct ipbuf_sys *ipbuf_sys_da, *ipbuf_sys_ad;
static struct ipblink ipb_free = IPBLINK_INIT; static struct ipblink ipb_free = IPBLINK_INIT;
static int ipbuf_sys_hold_mem_active;
void ipbuf_stop(void) void ipbuf_stop(void)
{ {
int i;
spin_lock(&ipb_free.lock);
INIT_IPBLINK(&ipb_free);
spin_unlock(&ipb_free.lock);
ipbcfg.ln = 0; ipbcfg.ln = 0;
if (ipbuf) { if (ipbuf) {
kfree(ipbuf); kfree(ipbuf);
ipbuf = NULL; ipbuf = NULL;
} }
for (i = 0; i < ipbuf_sys_hold_mem_active; i++) {
dsp_mem_disable((void *)daram_base);
}
ipbuf_sys_hold_mem_active = 0;
} }
/* int ipbuf_config(unsigned short ln, unsigned short lsz, void *base)
* ipbuf_config() is called by mailbox workqueue
*/
int ipbuf_config(unsigned short ln, unsigned short lsz, unsigned long adr)
{ {
void *base;
unsigned long lsz_byte = ((unsigned long)lsz) << 1; unsigned long lsz_byte = ((unsigned long)lsz) << 1;
size_t size; size_t size;
int ret = 0; int ret = 0;
int i; int i;
spin_lock(&ipb_free.lock);
INIT_IPBLINK(&ipb_free);
spin_unlock(&ipb_free.lock);
/* /*
* global IPBUF * global IPBUF
*/ */
if (adr & 0x1) { if (((unsigned long)base) & 0x3) {
printk(KERN_ERR printk(KERN_ERR
"mbx: global ipbuf address (0x%08lx) is odd number!\n", "omapdsp: global ipbuf address(0x%p) is not "
adr); "32-bit aligned!\n", base);
return -EINVAL; return -EINVAL;
} }
size = lsz_byte * ln; size = lsz_byte * ln;
if (adr + size > DSPSPACE_SIZE) { if (dsp_address_validate(base, size, "global ipbuf") < 0)
printk(KERN_ERR
"mbx: ipbuf address (0x%08lx) and size (0x%08x) is "
"illegal!\n", adr, size);
return -EINVAL; return -EINVAL;
}
base = dspword_to_virt(adr);
ipbuf = kmalloc(sizeof(void *) * ln, GFP_KERNEL); ipbuf = kmalloc(sizeof(void *) * ln, GFP_KERNEL);
if (ipbuf == NULL) { if (ipbuf == NULL) {
printk(KERN_ERR "mbx: memory allocation for ipbuf failed.\n"); printk(KERN_ERR
"omapdsp: memory allocation for ipbuf failed.\n");
return -ENOMEM; return -ENOMEM;
} }
for (i = 0; i < ln; i++) { for (i = 0; i < ln; i++) {
...@@ -101,20 +101,75 @@ int ipbuf_config(unsigned short ln, unsigned short lsz, unsigned long adr) ...@@ -101,20 +101,75 @@ int ipbuf_config(unsigned short ln, unsigned short lsz, unsigned long adr)
"omapdsp: ipbuf[%d] crosses 64k-word boundary!\n" "omapdsp: ipbuf[%d] crosses 64k-word boundary!\n"
" @0x%p, size=0x%08lx\n", i, top, lsz_byte); " @0x%p, size=0x%08lx\n", i, top, lsz_byte);
ret = -EINVAL; ret = -EINVAL;
goto free_out;
} }
} }
ipbcfg.ln = ln; ipbcfg.ln = ln;
ipbcfg.lsz = lsz; ipbcfg.lsz = lsz;
ipbcfg.adr = adr; ipbcfg.base = base;
ipbcfg.bsycnt = ln; /* DSP holds all ipbufs initially. */ ipbcfg.bsycnt = ln; /* DSP holds all ipbufs initially. */
ipbcfg.cnt_full = 0; ipbcfg.cnt_full = 0;
printk(KERN_INFO printk(KERN_INFO
"omapdsp: IPBUF configuration\n" "omapdsp: IPBUF configuration\n"
" %d words * %d lines at 0x%p.\n", " %d words * %d lines at 0x%p.\n",
ipbcfg.lsz, ipbcfg.ln, dspword_to_virt(ipbcfg.adr)); ipbcfg.lsz, ipbcfg.ln, ipbcfg.base);
return ret; return ret;
free_out:
kfree(ipbuf);
ipbuf = NULL;
return ret;
}
int ipbuf_sys_config(void *p, enum arm_dsp_dir dir)
{
char *dir_str = (dir == DIR_D2A) ? "D2A" : "A2D";
if (((unsigned long)p) & 0x3) {
printk(KERN_ERR
"omapdsp: system ipbuf(%s) address(0x%p) is "
"not 32-bit aligned!\n", dir_str, p);
return -1;
}
if (dsp_address_validate(p, sizeof(struct ipbuf_sys),
"system ipbuf(%s)", dir_str) < 0)
return -1;
if (dsp_mem_type(p, sizeof(struct ipbuf_sys)) != MEM_TYPE_EXTERN) {
printk(KERN_WARNING
"omapdsp: system ipbuf(%s) is placed in"
" DSP internal memory.\n"
" It will prevent DSP from idling.\n", dir_str);
ipbuf_sys_hold_mem_active++;
/*
* dsp_mem_enable() never fails because
* it has been already enabled in dspcfg process and
* this will just increment the usecount.
*/
dsp_mem_enable((void *)daram_base);
}
if (dir == DIR_D2A)
ipbuf_sys_da = p;
else
ipbuf_sys_ad = p;
return 0;
}
int ipbuf_p_validate(void *p, enum arm_dsp_dir dir)
{
char *dir_str = (dir == DIR_D2A) ? "D2A" : "A2D";
if (((unsigned long)p) & 0x3) {
printk(KERN_ERR
"omapdsp: private ipbuf(%s) address(0x%p) is "
"not 32-bit aligned!\n", dir_str, p);
return -1;
}
return dsp_address_validate(p, sizeof(struct ipbuf_p),
"private ipbuf(%s)", dir_str);
} }
/* /*
...@@ -124,19 +179,22 @@ unsigned short get_free_ipbuf(unsigned char tid) ...@@ -124,19 +179,22 @@ unsigned short get_free_ipbuf(unsigned char tid)
{ {
unsigned short bid; unsigned short bid;
if (ipblink_empty(&ipb_free)) { if (dsp_mem_enable_ipbuf() < 0)
/* FIXME: wait on queue when not available. */
return OMAP_DSP_BID_NULL; return OMAP_DSP_BID_NULL;
}
/*
* FIXME: dsp_enable_dspmem!
*/
spin_lock(&ipb_free.lock); spin_lock(&ipb_free.lock);
if (ipblink_empty(&ipb_free)) {
/* FIXME: wait on queue when not available. */
bid = OMAP_DSP_BID_NULL;
goto out;
}
bid = ipb_free.top; bid = ipb_free.top;
ipbuf[bid]->la = tid; /* lock */ ipbuf[bid]->la = tid; /* lock */
ipblink_del_top(&ipb_free, ipbuf); ipblink_del_top(&ipb_free, ipbuf);
out:
spin_unlock(&ipb_free.lock); spin_unlock(&ipb_free.lock);
dsp_mem_disable_ipbuf();
return bid; return bid;
} }
...@@ -161,12 +219,10 @@ void release_ipbuf(unsigned short bid) ...@@ -161,12 +219,10 @@ void release_ipbuf(unsigned short bid)
static int try_yld(unsigned short bid) static int try_yld(unsigned short bid)
{ {
struct mbcmd mb;
int status; int status;
ipbuf[bid]->sa = OMAP_DSP_TID_ANON; ipbuf[bid]->sa = OMAP_DSP_TID_ANON;
mbcmd_set(mb, MBCMD(BKYLD), 0, bid); status = dsp_mbsend(MBCMD(BKYLD), 0, bid);
status = dsp_mbsend(&mb);
if (status < 0) { if (status < 0) {
/* DSP is busy and ARM keeps this line. */ /* DSP is busy and ARM keeps this line. */
release_ipbuf(bid); release_ipbuf(bid);
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2005/02/17: DSP Gateway version 3.2 * 2005/05/17: DSP Gateway version 3.3
*/ */
struct ipbuf { struct ipbuf {
...@@ -43,13 +43,13 @@ struct ipbuf_p { ...@@ -43,13 +43,13 @@ struct ipbuf_p {
struct ipbuf_sys { struct ipbuf_sys {
unsigned short s; /* sync word */ unsigned short s; /* sync word */
unsigned short d[15]; /* data */ unsigned short d[31]; /* data */
}; };
struct ipbcfg { struct ipbcfg {
unsigned short ln; unsigned short ln;
unsigned short lsz; unsigned short lsz;
unsigned long adr; void *base;
unsigned short bsycnt; unsigned short bsycnt;
unsigned long cnt_full; /* count of IPBFULL error */ unsigned long cnt_full; /* count of IPBFULL error */
}; };
...@@ -72,8 +72,8 @@ extern struct ipbuf_sys *ipbuf_sys_da, *ipbuf_sys_ad; ...@@ -72,8 +72,8 @@ extern struct ipbuf_sys *ipbuf_sys_da, *ipbuf_sys_ad;
enable_irq(INT_D2A_MB1); \ enable_irq(INT_D2A_MB1); \
} while(0) } while(0)
#define dsp_mem_enable_ipbuf() dsp_mem_enable(dspword_to_virt(ipbcfg.adr)) #define dsp_mem_enable_ipbuf() dsp_mem_enable(ipbcfg.base)
#define dsp_mem_disable_ipbuf() dsp_mem_disable(dspword_to_virt(ipbcfg.adr)) #define dsp_mem_disable_ipbuf() dsp_mem_disable(ipbcfg.base)
struct ipblink { struct ipblink {
spinlock_t lock; spinlock_t lock;
...@@ -89,6 +89,7 @@ struct ipblink { ...@@ -89,6 +89,7 @@ struct ipblink {
#define INIT_IPBLINK(link) \ #define INIT_IPBLINK(link) \
do { \ do { \
spin_lock_init(&(link)->lock); \
(link)->top = OMAP_DSP_BID_NULL; \ (link)->top = OMAP_DSP_BID_NULL; \
(link)->tail = OMAP_DSP_BID_NULL; \ (link)->tail = OMAP_DSP_BID_NULL; \
} while(0) } while(0)
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2005/02/17: DSP Gateway version 3.2 * 2005/05/18: DSP Gateway version 3.3
*/ */
#include <linux/module.h> #include <linux/module.h>
...@@ -98,6 +98,7 @@ char *subcmd_name(struct mbcmd *mb) ...@@ -98,6 +98,7 @@ char *subcmd_name(struct mbcmd *mb)
(cmd_l == EID(BADTCTL)) ? "BADTCTL": (cmd_l == EID(BADTCTL)) ? "BADTCTL":
(cmd_l == EID(BADPARAM)) ? "BADPARAM": (cmd_l == EID(BADPARAM)) ? "BADPARAM":
(cmd_l == EID(FATAL)) ? "FATAL": (cmd_l == EID(FATAL)) ? "FATAL":
(cmd_l == EID(WDT)) ? "WDT":
(cmd_l == EID(NOMEM)) ? "NOMEM": (cmd_l == EID(NOMEM)) ? "NOMEM":
(cmd_l == EID(NORES)) ? "NORES": (cmd_l == EID(NORES)) ? "NORES":
(cmd_l == EID(IPBFULL)) ? "IPBFULL": (cmd_l == EID(IPBFULL)) ? "IPBFULL":
...@@ -124,7 +125,7 @@ struct mblogent { ...@@ -124,7 +125,7 @@ struct mblogent {
unsigned long jiffies; unsigned long jiffies;
unsigned short cmd; unsigned short cmd;
unsigned short data; unsigned short data;
enum mblog_dir dir; enum arm_dsp_dir dir;
}; };
static struct { static struct {
...@@ -134,7 +135,7 @@ static struct { ...@@ -134,7 +135,7 @@ static struct {
struct mblogent ent[MBLOG_DEPTH]; struct mblogent ent[MBLOG_DEPTH];
} mblog; } mblog;
void mblog_add(struct mbcmd *mb, enum mblog_dir dir) void mblog_add(struct mbcmd *mb, enum arm_dsp_dir dir)
{ {
struct mbcmd_hw *mb_hw = (struct mbcmd_hw *)mb; struct mbcmd_hw *mb_hw = (struct mbcmd_hw *)mb;
struct mblogent *ent; struct mblogent *ent;
...@@ -148,11 +149,11 @@ void mblog_add(struct mbcmd *mb, enum mblog_dir dir) ...@@ -148,11 +149,11 @@ void mblog_add(struct mbcmd *mb, enum mblog_dir dir)
if (mblog.cnt < 0xffffffff) if (mblog.cnt < 0xffffffff)
mblog.cnt++; mblog.cnt++;
switch (dir) { switch (dir) {
case MBLOG_DIR_AD: case DIR_A2D:
if (mblog.cnt_ad < 0xffffffff) if (mblog.cnt_ad < 0xffffffff)
mblog.cnt_ad++; mblog.cnt_ad++;
break; break;
case MBLOG_DIR_DA: case DIR_D2A:
if (mblog.cnt_da < 0xffffffff) if (mblog.cnt_da < 0xffffffff)
mblog.cnt_da++; mblog.cnt_da++;
break; break;
...@@ -197,7 +198,7 @@ static ssize_t mblog_show(struct device *dev, struct device_attribute *attr, ...@@ -197,7 +198,7 @@ static ssize_t mblog_show(struct device *dev, struct device_attribute *attr,
const struct cmdinfo *ci = cmdinfo[mb.sw.cmd_h]; const struct cmdinfo *ci = cmdinfo[mb.sw.cmd_h];
len += sprintf(buf + len, len += sprintf(buf + len,
(ent->dir == MBLOG_DIR_AD) ? (ent->dir == DIR_A2D) ?
"%08lx %d %04x %04x ": "%08lx %d %04x %04x ":
"%08lx %d %04x %04x ", "%08lx %d %04x %04x ",
ent->jiffies, mb.sw.seq, ent->cmd, ent->data); ent->jiffies, mb.sw.seq, ent->cmd, ent->data);
...@@ -230,13 +231,13 @@ done: ...@@ -230,13 +231,13 @@ done:
static struct device_attribute dev_attr_mblog = __ATTR_RO(mblog); static struct device_attribute dev_attr_mblog = __ATTR_RO(mblog);
#ifdef CONFIG_OMAP_DSP_MBCMD_VERBOSE #ifdef CONFIG_OMAP_DSP_MBCMD_VERBOSE
void mblog_printcmd(struct mbcmd *mb, enum mblog_dir dir) void mblog_printcmd(struct mbcmd *mb, enum arm_dsp_dir dir)
{ {
const struct cmdinfo *ci = cmdinfo[mb->cmd_h]; const struct cmdinfo *ci = cmdinfo[mb->cmd_h];
char *dir_str; char *dir_str;
char *subname; char *subname;
dir_str = (dir == MBLOG_DIR_AD) ? "sending" : "receiving"; dir_str = (dir == DIR_A2D) ? "sending" : "receiving";
switch (ci->cmd_l_type) { switch (ci->cmd_l_type) {
case CMD_L_TYPE_SUBCMD: case CMD_L_TYPE_SUBCMD:
if ((subname = subcmd_name(mb)) == NULL) if ((subname = subcmd_name(mb)) == NULL)
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2004/11/22: DSP Gateway version 3.2 * 2004/11/22: DSP Gateway version 3.3
*/ */
struct proc_list { struct proc_list {
......
This diff is collapsed.
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2004/12/01: DSP Gateway version 3.2 * 200%/05/16: DSP Gateway version 3.3
*/ */
#include <linux/module.h> #include <linux/module.h>
...@@ -83,7 +83,12 @@ static ssize_t dsp_twch_read(struct file *file, char *buf, size_t count, ...@@ -83,7 +83,12 @@ static ssize_t dsp_twch_read(struct file *file, char *buf, size_t count,
count = devcount * sizeof(long); count = devcount * sizeof(long);
change_cnt = 0; change_cnt = 0;
for (i = 0; i < devcount; i++) { for (i = 0; i < devcount; i++) {
taskstat[i] = taskdev_state(i); /*
* once the device state is read, the 'STALE' bit will be set
* so that the Dynamic Loader can distinguish the new request
* from the old one.
*/
taskstat[i] = taskdev_state_stale(i);
} }
if (copy_to_user(buf, taskstat, count)) if (copy_to_user(buf, taskstat, count))
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2004/06/29: DSP Gateway version 3.2 * 2004/06/29: DSP Gateway version 3.3
*/ */
#include <linux/linkage.h> #include <linux/linkage.h>
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2004/06/29: DSP Gateway version 3.2 * 2004/06/29: DSP Gateway version 3.3
*/ */
#ifndef _OMAP_DSP_UACCESS_DSP_H #ifndef _OMAP_DSP_UACCESS_DSP_H
......
...@@ -191,7 +191,7 @@ static int omap_mcbsp_check(unsigned int id) ...@@ -191,7 +191,7 @@ static int omap_mcbsp_check(unsigned int id)
static void omap_mcbsp_dsp_request(void) static void omap_mcbsp_dsp_request(void)
{ {
if (cpu_is_omap1510() || cpu_is_omap16xx()) { if (cpu_is_omap1510() || cpu_is_omap16xx()) {
omap_dsp_request_idle(); omap_dsp_request_mem();
clk_use(mcbsp_dsp_ck); clk_use(mcbsp_dsp_ck);
clk_use(mcbsp_api_ck); clk_use(mcbsp_api_ck);
...@@ -210,6 +210,7 @@ static void omap_mcbsp_dsp_request(void) ...@@ -210,6 +210,7 @@ static void omap_mcbsp_dsp_request(void)
static void omap_mcbsp_dsp_free(void) static void omap_mcbsp_dsp_free(void)
{ {
if (cpu_is_omap1510() || cpu_is_omap16xx()) { if (cpu_is_omap1510() || cpu_is_omap16xx()) {
omap_dsp_release_mem();
clk_unuse(mcbsp_dspxor_ck); clk_unuse(mcbsp_dspxor_ck);
clk_unuse(mcbsp_dsp_ck); clk_unuse(mcbsp_dsp_ck);
clk_unuse(mcbsp_api_ck); clk_unuse(mcbsp_api_ck);
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2005/01/17: DSP Gateway version 3.2 * 2005/06/01: DSP Gateway version 3.3
*/ */
#ifndef ASM_ARCH_DSP_H #ifndef ASM_ARCH_DSP_H
...@@ -34,14 +34,16 @@ ...@@ -34,14 +34,16 @@
#define OMAP_DSP_IOCTL_RESET 1 #define OMAP_DSP_IOCTL_RESET 1
#define OMAP_DSP_IOCTL_RUN 2 #define OMAP_DSP_IOCTL_RUN 2
#define OMAP_DSP_IOCTL_SETRSTVECT 3 #define OMAP_DSP_IOCTL_SETRSTVECT 3
#define OMAP_DSP_IOCTL_IDLE 4 #define OMAP_DSP_IOCTL_CPU_IDLE 4
#define OMAP_DSP_IOCTL_MPUI_WORDSWAP_ON 5 #define OMAP_DSP_IOCTL_MPUI_WORDSWAP_ON 5
#define OMAP_DSP_IOCTL_MPUI_WORDSWAP_OFF 6 #define OMAP_DSP_IOCTL_MPUI_WORDSWAP_OFF 6
#define OMAP_DSP_IOCTL_MPUI_BYTESWAP_ON 7 #define OMAP_DSP_IOCTL_MPUI_BYTESWAP_ON 7
#define OMAP_DSP_IOCTL_MPUI_BYTESWAP_OFF 8 #define OMAP_DSP_IOCTL_MPUI_BYTESWAP_OFF 8
#define OMAP_DSP_IOCTL_GBL_IDLE 9
#define OMAP_DSP_IOCTL_DSPCFG 10 #define OMAP_DSP_IOCTL_DSPCFG 10
#define OMAP_DSP_IOCTL_DSPUNCFG 11 #define OMAP_DSP_IOCTL_DSPUNCFG 11
#define OMAP_DSP_IOCTL_TASKCNT 12 #define OMAP_DSP_IOCTL_TASKCNT 12
#define OMAP_DSP_IOCTL_POLL 13
#define OMAP_DSP_IOCTL_REGMEMR 40 #define OMAP_DSP_IOCTL_REGMEMR 40
#define OMAP_DSP_IOCTL_REGMEMW 41 #define OMAP_DSP_IOCTL_REGMEMW 41
#define OMAP_DSP_IOCTL_REGIOR 42 #define OMAP_DSP_IOCTL_REGIOR 42
...@@ -97,8 +99,12 @@ struct omap_dsp_mapinfo { ...@@ -97,8 +99,12 @@ struct omap_dsp_mapinfo {
#define OMAP_DSP_DEVSTATE_INVALID 0x00000008 #define OMAP_DSP_DEVSTATE_INVALID 0x00000008
#define OMAP_DSP_DEVSTATE_ADDREQ 0x00000100 #define OMAP_DSP_DEVSTATE_ADDREQ 0x00000100
#define OMAP_DSP_DEVSTATE_DELREQ 0x00000200 #define OMAP_DSP_DEVSTATE_DELREQ 0x00000200
#define OMAP_DSP_DEVSTATE_KILLREQ 0x00000400
#define OMAP_DSP_DEVSTATE_ADDFAIL 0x00001000 #define OMAP_DSP_DEVSTATE_ADDFAIL 0x00001000
#define OMAP_DSP_DEVSTATE_ADDING 0x00010000
#define OMAP_DSP_DEVSTATE_DELING 0x00020000
#define OMAP_DSP_DEVSTATE_KILLING 0x00040000
#define OMAP_DSP_DEVSTATE_STATE_MASK 0x7fffffff
#define OMAP_DSP_DEVSTATE_STALE 0x80000000
struct omap_dsp_taddinfo { struct omap_dsp_taddinfo {
unsigned char minor; unsigned char minor;
...@@ -133,7 +139,7 @@ struct omap_dsp_varinfo { ...@@ -133,7 +139,7 @@ struct omap_dsp_varinfo {
unsigned short val[0]; unsigned short val[0];
}; };
#define OMAP_DSP_MBPROT_REVISION 0x0018 #define OMAP_DSP_MBPROT_REVISION 0x0019
#define OMAP_DSP_MBCMD_WDSND 0x10 #define OMAP_DSP_MBCMD_WDSND 0x10
#define OMAP_DSP_MBCMD_WDREQ 0x11 #define OMAP_DSP_MBCMD_WDREQ 0x11
...@@ -144,7 +150,8 @@ struct omap_dsp_varinfo { ...@@ -144,7 +150,8 @@ struct omap_dsp_varinfo {
#define OMAP_DSP_MBCMD_BKREQP 0x25 #define OMAP_DSP_MBCMD_BKREQP 0x25
#define OMAP_DSP_MBCMD_TCTL 0x30 #define OMAP_DSP_MBCMD_TCTL 0x30
#define OMAP_DSP_MBCMD_TCTLDATA 0x31 #define OMAP_DSP_MBCMD_TCTLDATA 0x31
#define OMAP_DSP_MBCMD_WDT 0x50 #define OMAP_DSP_MBCMD_POLL 0x32
#define OMAP_DSP_MBCMD_WDT 0x50 /* v3.3: obsolete */
#define OMAP_DSP_MBCMD_RUNLEVEL 0x51 #define OMAP_DSP_MBCMD_RUNLEVEL 0x51
#define OMAP_DSP_MBCMD_PM 0x52 #define OMAP_DSP_MBCMD_PM 0x52
#define OMAP_DSP_MBCMD_SUSPEND 0x53 #define OMAP_DSP_MBCMD_SUSPEND 0x53
...@@ -217,6 +224,7 @@ struct omap_dsp_varinfo { ...@@ -217,6 +224,7 @@ struct omap_dsp_varinfo {
#define OMAP_DSP_EID_NOMEM 0xc0 #define OMAP_DSP_EID_NOMEM 0xc0
#define OMAP_DSP_EID_NORES 0xc1 #define OMAP_DSP_EID_NORES 0xc1
#define OMAP_DSP_EID_IPBFULL 0xc2 #define OMAP_DSP_EID_IPBFULL 0xc2
#define OMAP_DSP_EID_WDT 0xd0
#define OMAP_DSP_EID_TASKNOTRDY 0xe0 #define OMAP_DSP_EID_TASKNOTRDY 0xe0
#define OMAP_DSP_EID_TASKBSY 0xe1 #define OMAP_DSP_EID_TASKBSY 0xe1
#define OMAP_DSP_EID_TASKERR 0xef #define OMAP_DSP_EID_TASKERR 0xef
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* along with this program; if not, write to the Free Software * along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* *
* 2004/09/22: DSP Gateway version 3.2 * 2005/06/03: DSP Gateway version 3.3
*/ */
#ifndef ASM_ARCH_DSP_COMMON_H #ifndef ASM_ARCH_DSP_COMMON_H
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
void omap_dsp_pm_suspend(void); void omap_dsp_pm_suspend(void);
void omap_dsp_pm_resume(void); void omap_dsp_pm_resume(void);
void omap_dsp_request_idle(void); void omap_dsp_request_mpui(void);
void omap_dsp_release_mpui(void);
int omap_dsp_request_mem(void);
int omap_dsp_release_mem(void);
#endif /* ASM_ARCH_DSP_COMMON_H */ #endif /* ASM_ARCH_DSP_COMMON_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment