On 03/08/2013 03:59 PM, Arun Kumar K wrote:
The hardware interface module finally sends the commands to the
FIMC-IS firmware and runs the interrupt handler for getting the
responses.
Signed-off-by: Arun Kumar K<[email protected]>
Signed-off-by: Kilyeon Im<[email protected]>
---
.../media/platform/exynos5-is/fimc-is-interface.c | 1003 ++++++++++++++++++++
.../media/platform/exynos5-is/fimc-is-interface.h | 130 +++
2 files changed, 1133 insertions(+)
create mode 100644 drivers/media/platform/exynos5-is/fimc-is-interface.c
create mode 100644 drivers/media/platform/exynos5-is/fimc-is-interface.h
[...]
+static void itf_set_state(struct fimc_is_interface *itf,
+ unsigned long state)
+{
+ unsigned long flags;
+ spin_lock_irqsave(&itf->slock_state, flags);
+ set_bit(state,&itf->state);
If itf->state is always modified with itf->slock_state spinlock
held you could use non-atomic variant, i.e. __set_bit().
+ spin_unlock_irqrestore(&itf->slock_state, flags);
+}
+
+static void itf_clr_state(struct fimc_is_interface *itf,
+ unsigned long state)
+{
+ unsigned long flags;
+ spin_lock_irqsave(&itf->slock_state, flags);
+ clear_bit(state,&itf->state);
+ spin_unlock_irqrestore(&itf->slock_state, flags);
+}
+
+static int itf_get_state(struct fimc_is_interface *itf,
+ unsigned long state)
+{
+ int ret = 0;
+ unsigned long flags;
+
+ spin_lock_irqsave(&itf->slock_state, flags);
+ ret = test_bit(state,&itf->state);
+ spin_unlock_irqrestore(&itf->slock_state, flags);
+ return ret;
+}
+int fimc_is_itf_hw_dump(struct fimc_is_interface *itf)
+{
+ struct fimc_is *is = fimc_interface_to_is(itf);
+ int debug_cnt;
+ char *debug;
+ char letter;
+ int count = 0, i;
+
+ debug = (char *)(is->minfo.fw_vaddr + DEBUG_OFFSET);
+ debug_cnt = *((int *)(is->minfo.fw_vaddr + DEBUGCTL_OFFSET))
+ - DEBUG_OFFSET;
+
+ if (itf->debug_cnt> debug_cnt)
+ count = (DEBUG_CNT - itf->debug_cnt) + debug_cnt;
+ else
+ count = debug_cnt - itf->debug_cnt;
+
+ if (count) {
+ pr_info("start(%d %d)\n", debug_cnt, count);
+ for (i = itf->debug_cnt; count> 0; count--) {
+ letter = debug[i];
+ if (letter)
+ pr_cont("%c", letter);
+ i++;
+ if (i> DEBUG_CNT)
+ i = 0;
+ }
+ itf->debug_cnt = debug_cnt;
+ pr_info("end\n");
+ }
+ return count;
+}
Why don't you use debugfs for dumping this log buffer ? I found it much
more convenient and the logs appear exactly as written by the firmware.
This is what I have in the Exynos4x12 FIMC-IS driver:
static int fimc_is_log_show(struct seq_file *s, void *data)
{
struct fimc_is *is = s->private;
const u8 *buf = is->memory.vaddr + FIMC_IS_DEBUG_REGION_OFFSET;
if (is->memory.vaddr == NULL) {
dev_err(&is->pdev->dev, "Firmware memory is not initialized\n");
return -EIO;
}
seq_printf(s, "%s\n", buf);
return 0;
}
static int fimc_is_debugfs_open(struct inode *inode, struct file *file)
{
return single_open(file, fimc_is_log_show, inode->i_private);
}
static const struct file_operations fimc_is_debugfs_fops = {
.open = fimc_is_debugfs_open,
.read = seq_read,
.llseek = seq_lseek,
.release = single_release,
};
static void fimc_is_debugfs_remove(struct fimc_is *is)
{
debugfs_remove(is->debugfs_entry);
is->debugfs_entry = NULL;
}
static int fimc_is_debugfs_create(struct fimc_is *is)
{
struct dentry *dentry;
is->debugfs_entry = debugfs_create_dir("fimc_is", NULL);
dentry = debugfs_create_file("fw_log", S_IRUGO, is->debugfs_entry,
is, &fimc_is_debugfs_fops);
if (!dentry)
fimc_is_debugfs_remove(is);
return is->debugfs_entry == NULL ? -EIO : 0;
}
_______________________________________________
devicetree-discuss mailing list
[email protected]
https://lists.ozlabs.org/listinfo/devicetree-discuss