Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-elphel
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Commits
Open sidebar
Elphel
linux-elphel
Commits
1f97a843
Commit
1f97a843
authored
Jan 11, 2018
by
Oleg Dzhimiev
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fixed spinlocks
parent
5d80abac
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
14 additions
and
19 deletions
+14
-19
x393_videomem.c
src/drivers/elphel/x393_videomem.c
+14
-19
No files found.
src/drivers/elphel/x393_videomem.c
View file @
1f97a843
...
@@ -48,21 +48,6 @@
...
@@ -48,21 +48,6 @@
#define MEMBRIDGE_CMD_IRQ_EN 0x3
#define MEMBRIDGE_CMD_IRQ_EN 0x3
// like in framepars.c
// lock membridge run
#undef LOCK_BH_PROCESSPARS
#define LOCK_BH_FRAMEPARS
#ifdef LOCK_BH_FRAMEPARS
#define FLAGS_IBH
#define LOCK_IBH(x) spin_lock_bh(x)
#define UNLOCK_IBH(x) spin_unlock_bh(x)
#else
#define FLAGS_IBH unsigned long flags;
#define LOCK_IBH(x) spin_lock_irqsave(x,flags)
#define UNLOCK_IBH(x) spin_unlock_irqrestore(x,flags)
#endif
static
const
struct
of_device_id
elphel393_videomem_of_match
[];
static
const
struct
of_device_id
elphel393_videomem_of_match
[];
static
struct
device
*
g_dev_ptr
;
///< Global pointer to basic device structure. This pointer is used in debugfs output functions
static
struct
device
*
g_dev_ptr
;
///< Global pointer to basic device structure. This pointer is used in debugfs output functions
...
@@ -71,6 +56,8 @@ wait_queue_head_t videomem_wait_queue;
...
@@ -71,6 +56,8 @@ wait_queue_head_t videomem_wait_queue;
static
DEFINE_SPINLOCK
(
lock
);
///< for read-modify-write channel enable
static
DEFINE_SPINLOCK
(
lock
);
///< for read-modify-write channel enable
static
DEFINE_SPINLOCK
(
membridge_lock
);
///< to lock membridge, unlock on membridge_done interrupt
static
DEFINE_SPINLOCK
(
membridge_lock
);
///< to lock membridge, unlock on membridge_done interrupt
static
int
membridge_locked
=
0
;
/**
/**
* VIDEOMEM_RAW & IMAGE_RAW are for debug memory access.
* VIDEOMEM_RAW & IMAGE_RAW are for debug memory access.
* Indexed devices are for per channel access
* Indexed devices are for per channel access
...
@@ -685,7 +672,7 @@ struct raw_priv_t {
...
@@ -685,7 +672,7 @@ struct raw_priv_t {
dma_addr_t
phys_addr
;
///< physical address of memory region reported by memory driver
dma_addr_t
phys_addr
;
///< physical address of memory region reported by memory driver
};
};
static
inline
int
membridge_is_busy
(){
static
inline
int
membridge_is_busy
(
void
){
x393_status_membridge_t
status
=
x393_membridge_status
();
x393_status_membridge_t
status
=
x393_membridge_status
();
return
status
.
busy
;
return
status
.
busy
;
}
}
...
@@ -700,6 +687,15 @@ int membridge_start(struct file * file){
...
@@ -700,6 +687,15 @@ int membridge_start(struct file * file){
x393_status_membridge_t
status
;
x393_status_membridge_t
status
;
spin_lock
(
&
membridge_lock
);
if
(
membridge_locked
==
0
){
membridge_locked
=
1
;
}
else
{
spin_unlock
(
&
membridge_lock
);
return
-
EBUSY
;
}
spin_unlock
(
&
membridge_lock
);
// no need
// no need
frame_number
=
GLOBALPARS
(
privData
->
sensor_num
,
G_THIS_FRAME
)
&
PARS_FRAMES_MASK
;
frame_number
=
GLOBALPARS
(
privData
->
sensor_num
,
G_THIS_FRAME
)
&
PARS_FRAMES_MASK
;
...
@@ -838,7 +834,7 @@ ssize_t videomem_write (struct file * file, const char * buf, size_t count, lo
...
@@ -838,7 +834,7 @@ ssize_t videomem_write (struct file * file, const char * buf, size_t count, lo
* @return file position (absolute frame number)
* @return file position (absolute frame number)
*/
*/
loff_t
videomem_lseek
(
struct
file
*
file
,
loff_t
offset
,
int
orig
){
loff_t
videomem_lseek
(
struct
file
*
file
,
loff_t
offset
,
int
orig
){
FLAGS_IBH
;
unsigned
long
target_frame
;
unsigned
long
target_frame
;
struct
raw_priv_t
*
privData
=
(
struct
raw_priv_t
*
)
file
->
private_data
;
struct
raw_priv_t
*
privData
=
(
struct
raw_priv_t
*
)
file
->
private_data
;
int
sensor_port
=
privData
->
sensor_num
;
int
sensor_port
=
privData
->
sensor_num
;
...
@@ -873,9 +869,7 @@ loff_t videomem_lseek(struct file * file, loff_t offset, int orig){
...
@@ -873,9 +869,7 @@ loff_t videomem_lseek(struct file * file, loff_t offset, int orig){
return
-
EBUSY
;
return
-
EBUSY
;
}
}
LOCK_IBH
(
&
membridge_lock
);
res
=
membridge_start
(
file
);
res
=
membridge_start
(
file
);
UNLOCK_IBH
(
&
membridge_lock
);
if
(
res
<
0
)
return
res
;
if
(
res
<
0
)
return
res
;
}
}
...
@@ -1055,6 +1049,7 @@ static irqreturn_t videomem_irq_handler(int irq, ///< [in] irq interru
...
@@ -1055,6 +1049,7 @@ static irqreturn_t videomem_irq_handler(int irq, ///< [in] irq interru
//TODO: Do what is needed here
//TODO: Do what is needed here
pr_info
(
"Wake up, videomem interrupt received!!!
\n
"
);
pr_info
(
"Wake up, videomem interrupt received!!!
\n
"
);
x393_membridge_ctrl_irq
(
ctrl_interrupts
);
// reset interrupt
x393_membridge_ctrl_irq
(
ctrl_interrupts
);
// reset interrupt
membridge_locked
=
0
;
wake_up_interruptible
(
&
videomem_wait_queue
);
wake_up_interruptible
(
&
videomem_wait_queue
);
return
IRQ_HANDLED
;
return
IRQ_HANDLED
;
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment