2 * Copyright (C) 2012 Spreadtrum Communications Inc.
4 * This software is licensed under the terms of the GNU General Public
5 * License version 2, as published by the Free Software Foundation, and
6 * may be copied, distributed, and modified under those terms.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
14 #include <linux/module.h>
15 #include <linux/kernel.h>
16 #include <linux/errno.h>
17 #include <linux/poll.h>
19 #include <linux/interrupt.h>
20 #include <linux/platform_device.h>
21 #include <linux/miscdevice.h>
22 #include <linux/slab.h>
23 #include <linux/types.h>
24 #include <linux/delay.h>
25 #include <linux/clk.h>
27 #include <linux/of_device.h>
28 #include <linux/vmalloc.h>
29 //#include <mach/sci.h>
30 #include <soc/sprd/sci.h>
31 //#include <mach/hardware.h>
33 #include <soc/sprd/hardware.h>
35 #include <asm/cacheflush.h>
36 #include <video/sprd_isp.h>
37 #include "parse_hwinfo.h"
38 #include "compat_isp_drv.h"
42 #define ISP_MINOR MISC_DYNAMIC_MINOR
44 static struct isp_k_private *s_isp_private;
46 static int isp_wr_addr(struct isp_reg_bits *ptr);
48 static int32_t isp_block_buf_alloc(struct isp_k_private *isp_private)
53 buf_len = ISP_REG_BUF_SIZE + ISP_RAW_AE_BUF_SIZE + ISP_FRGB_GAMMA_BUF_SIZE + ISP_YUV_YGAMMA_BUF_SIZE + ISP_RAW_AWB_BUF_SIZE;
55 isp_private->block_buf_addr = (unsigned long)vzalloc(buf_len);
56 if (0 == isp_private->block_buf_addr) {
58 printk("isp_block_buf_alloc: no memory error.\n");
60 isp_private->block_buf_len = buf_len;
61 isp_private->reg_buf_addr = isp_private->block_buf_addr;
62 isp_private->reg_buf_len = ISP_REG_BUF_SIZE;
63 isp_private->raw_aem_buf_addr = isp_private->reg_buf_addr + isp_private->reg_buf_len;
64 isp_private->raw_aem_buf_len = ISP_RAW_AE_BUF_SIZE;
65 isp_private->full_gamma_buf_addr = isp_private->raw_aem_buf_addr + isp_private->raw_aem_buf_len;
66 isp_private->full_gamma_buf_len = ISP_FRGB_GAMMA_BUF_SIZE;
67 isp_private->yuv_ygamma_buf_addr = isp_private->full_gamma_buf_addr + isp_private->full_gamma_buf_len;
68 isp_private->yuv_ygamma_buf_len = ISP_YUV_YGAMMA_BUF_SIZE;
69 isp_private->raw_awbm_buf_addr = isp_private->yuv_ygamma_buf_addr + isp_private->yuv_ygamma_buf_len;
70 isp_private->raw_awbm_buf_len = ISP_RAW_AWB_BUF_SIZE;
76 static int32_t isp_block_buf_free(struct isp_k_private *isp_private)
80 if ((0x00 != isp_private->block_buf_addr)
81 && (0x00 != isp_private->block_buf_len)) {
82 vfree((void *)isp_private->block_buf_addr);
83 isp_private->block_buf_addr = 0x00;
84 isp_private->block_buf_len = 0x00;
85 isp_private->reg_buf_addr = 0x00;
86 isp_private->reg_buf_len = 0x00;
87 isp_private->raw_aem_buf_addr = 0x00;
88 isp_private->raw_aem_buf_len = 0x00;
89 isp_private->full_gamma_buf_addr = 0x00;
90 isp_private->full_gamma_buf_len = 0x00;
91 isp_private->yuv_ygamma_buf_addr = 0x00;
92 isp_private->yuv_ygamma_buf_len = 0x00;
93 isp_private->raw_awbm_buf_addr = 0x00;
94 isp_private->raw_awbm_buf_len = 0x00;
99 static int32_t isp_yiq_antiflicker_buf_free(struct isp_k_private *isp_private)
103 if ((0x00 != isp_private->yiq_antiflicker_buf_addr)
104 && (0x00 != isp_private->yiq_antiflicker_order)) {
105 free_pages(isp_private->yiq_antiflicker_buf_addr, isp_private->yiq_antiflicker_order);
106 isp_private->yiq_antiflicker_buf_addr = 0x00;
107 isp_private->yiq_antiflicker_len = 0x00;
108 isp_private->yiq_antiflicker_order = 0x00;
114 static int32_t isp_yiq_antiflicker_buf_alloc(struct isp_k_private *isp_private, uint32_t len)
123 isp_private->yiq_antiflicker_len = len;
124 isp_private->yiq_antiflicker_order = get_order(len);
125 isp_private->yiq_antiflicker_buf_addr = (unsigned long)__get_free_pages(GFP_KERNEL | __GFP_COMP, isp_private->yiq_antiflicker_order);
126 if (NULL == (void*)isp_private->yiq_antiflicker_buf_addr) {
127 printk("isp_yiq_antiflicker_buf_alloc: memory error, addr:0x%lx, len:0x%x, order:0x%x.\n",
128 isp_private->yiq_antiflicker_buf_addr,
129 isp_private->yiq_antiflicker_len,
130 isp_private->yiq_antiflicker_order);
134 ptr = (void*)isp_private->yiq_antiflicker_buf_addr;
135 buf = virt_to_phys((volatile void *)isp_private->yiq_antiflicker_buf_addr);
137 dmac_flush_range(ptr, ptr + len);
138 outer_flush_range(__pa(ptr), __pa(ptr) + len);
144 static int32_t isp_lsc_buf_free(struct isp_k_private *isp_private)
148 if ((0x00 != isp_private->lsc_buf_addr)
149 && (0x00 != isp_private->lsc_buf_order)) {
150 free_pages(isp_private->lsc_buf_addr, isp_private->lsc_buf_order);
151 isp_private->lsc_buf_addr = 0x00;
152 isp_private->lsc_buf_len = 0x00;
153 isp_private->lsc_buf_order = 0x00;
159 static int32_t isp_lsc_buf_alloc(struct isp_k_private *isp_private, uint32_t len)
168 isp_private->lsc_buf_len = len;
169 isp_private->lsc_buf_order = get_order(len);
170 isp_private->lsc_buf_addr = (unsigned long)__get_free_pages(GFP_KERNEL | __GFP_COMP, isp_private->lsc_buf_order);
171 if (NULL == (void*)isp_private->lsc_buf_addr) {
172 printk("isp_lsc_buf_alloc: memory error, addr:0x%lx, len:0x%x, order:0x%x.\n",
173 isp_private->lsc_buf_addr,
174 isp_private->lsc_buf_len,
175 isp_private->lsc_buf_order);
179 ptr = (void*)isp_private->lsc_buf_addr;
180 buf = virt_to_phys((volatile void *)isp_private->lsc_buf_addr);
182 dmac_flush_range(ptr, ptr + len);
183 outer_flush_range(__pa(ptr), __pa(ptr) + len);
190 static int32_t isp_binging4awb_buf_free(struct isp_k_private *isp_private)
194 if ((0x00 != isp_private->bing4awb_buf_addr)
195 && (0x00 != isp_private->bing4awb_buf_len)) {
196 free_pages(isp_private->bing4awb_buf_addr, isp_private->bing4awb_buf_len);
197 isp_private->bing4awb_buf_addr = 0x00;
198 isp_private->bing4awb_buf_len = 0x00;
199 isp_private->bing4awb_buf_order = 0x00;
205 static int32_t isp_binging4awb_buf_alloc(struct isp_k_private *isp_private, uint32_t len)
214 isp_private->bing4awb_buf_len = len;
215 isp_private->bing4awb_buf_order = get_order(len);
216 isp_private->bing4awb_buf_addr = (unsigned long)__get_free_pages(GFP_KERNEL | __GFP_COMP,
217 isp_private->bing4awb_buf_order);
218 if (NULL == (void *)isp_private->bing4awb_buf_addr) {
219 printk("isp_binging4awb_buf_alloc: memory error, addr:0x%lx, len:0x%x, order:0x%x.\n",
220 isp_private->bing4awb_buf_addr,
221 isp_private->bing4awb_buf_len,
222 isp_private->bing4awb_buf_order);
226 ptr = (void *)isp_private->bing4awb_buf_addr;
227 buf = virt_to_phys((volatile void *)isp_private->bing4awb_buf_addr);
228 dmac_flush_range(ptr, ptr + len);
229 outer_flush_range(__pa(ptr), __pa(ptr) + len);
236 static int32_t isp_b4awb_switch_buf(struct isp_k_private *isp_private)
241 /*first bypass b4awb*/
242 REG_MWR(ISP_BINNING_PARAM, BIT_0, 0x1);
245 if (isp_private->b4awb_buf[0].buf_flag == 1) {
246 isp_private->b4awb_buf[1].buf_flag = 1;
247 REG_WR(ISP_BINNING_MEM_ADDR, isp_private->b4awb_buf[1].buf_phys_addr);
248 isp_private->b4awb_buf[0].buf_flag = 0;
249 } else if (isp_private->b4awb_buf[1].buf_flag == 1) {
250 isp_private->b4awb_buf[0].buf_flag = 1;
251 REG_WR(ISP_BINNING_MEM_ADDR, isp_private->b4awb_buf[0].buf_phys_addr);
252 isp_private->b4awb_buf[1].buf_flag = 0;
256 REG_MWR(ISP_BINNING_PARAM, BIT_0, 0x0);
261 static void isp_read_reg(struct isp_reg_bits *reg_bits_ptr, uint32_t counts)
264 unsigned long reg_val = 0, reg_addr = 0;
266 for (i = 0; i < counts; i++) {
267 reg_addr = ISP_BASE_ADDR + reg_bits_ptr[i].reg_addr;
268 reg_val = REG_RD(reg_addr);
269 reg_bits_ptr[i].reg_value = reg_val;
270 reg_bits_ptr[i].reg_addr = reg_addr;
274 static void isp_write_reg(struct isp_reg_bits *reg_bits_ptr, uint32_t counts)
277 unsigned long reg_val = 0, reg_addr = 0;
279 for (i = 0; i < counts; i++) {
280 reg_addr = reg_bits_ptr[i].reg_addr + ISP_BASE_ADDR;
281 reg_val = reg_bits_ptr[i].reg_value;
282 REG_WR(reg_addr, reg_val);
286 static int32_t isp_queue_init(struct isp_queue *queue)
289 printk("isp_queue_init: queue is null error.\n");
293 memset(queue, 0x00, sizeof(*queue));
294 queue->write = &queue->node[0];
295 queue->read = &queue->node[0];
299 static int32_t isp_queue_write(struct isp_queue *queue, struct isp_node *node)
301 struct isp_node *ori_node = NULL;
303 if (NULL == queue || NULL == node) {
304 printk("isp_queue_write: queue or node is null error %p %p\n",
309 ori_node = queue->write;
311 *queue->write++ = *node;
312 if (queue->write > &queue->node[ISP_QUEUE_LENGTH-1])
313 queue->write = &queue->node[0];
315 if (queue->write == queue->read)
316 queue->write = ori_node;
320 static int32_t isp_queue_read(struct isp_queue *queue, struct isp_node *node)
322 if (NULL == queue || NULL == node) {
323 printk("isp_queue_read: queue or node is null error %p %p\n",
327 if (queue->read != queue->write) {
328 *node = *queue->read++;
329 if (queue->read > &queue->node[ISP_QUEUE_LENGTH-1])
330 queue->read = &queue->node[0];
335 static int32_t isp_set_clk(struct isp_k_file *file, enum isp_clk_sel clk_sel)
338 char *parent = "clk_256m";
339 struct clk *clk_parent = NULL;
340 struct isp_k_private *isp_private = NULL;
343 printk("isp_set_clk: file is null error.\n");
347 isp_private = file->isp_private;
349 printk("isp_set_clk: isp_private is null error.\n");
355 parent = "clk_usbpll";
373 parent = "clk_76p8m";
376 printk("isp_set_clk: close clock %d\n", (int)clk_get_rate(isp_private->clock));
377 if (isp_private->clock) {
378 clk_disable(isp_private->clock);
379 clk_put(isp_private->clock);
380 isp_private->clock = NULL;
388 if (NULL == isp_private->clock) {
389 isp_private->clock = parse_clk(isp_private->dn, "clk_isp");
390 if (IS_ERR(isp_private->clock)) {
391 printk("isp_set_clk: parse_clk error.\n");
395 clk_disable(isp_private->clock);
398 clk_parent = clk_get(NULL, parent);
399 if (IS_ERR(clk_parent)) {
400 printk("isp_set_clk: clk_get error %d\n", (int)clk_parent);
404 ret = clk_set_parent(isp_private->clock, clk_parent);
406 printk("isp_set_clk: clk_set_parent error.\n");
409 ret = clk_enable(isp_private->clock);
411 printk("isp_set_clk: clk_enable error.\n");
417 static int32_t isp_module_rst(struct isp_k_file *file)
420 struct isp_k_private *isp_private = NULL;
423 printk("isp_module_rst: file is null error.\n");
426 isp_private = file->isp_private;
428 printk("isp_module_rst: isp_private is null error.\n");
431 if (0x00 != atomic_read(&isp_private->users)) {
432 ret = isp_axi_bus_waiting();
435 sci_glb_set(ISP_MODULE_RESET, ISP_RST_LOG_BIT);
436 sci_glb_set(ISP_MODULE_RESET, ISP_RST_CFG_BIT);
437 sci_glb_set(ISP_MODULE_RESET, ISP_RST_LOG_BIT);
438 sci_glb_set(ISP_MODULE_RESET, ISP_RST_CFG_BIT);
439 sci_glb_set(ISP_MODULE_RESET, ISP_RST_LOG_BIT);
440 sci_glb_set(ISP_MODULE_RESET, ISP_RST_CFG_BIT);
441 sci_glb_clr(ISP_MODULE_RESET, ISP_RST_CFG_BIT);
442 sci_glb_clr(ISP_MODULE_RESET, ISP_RST_LOG_BIT);
447 static int32_t isp_module_eb(struct isp_k_file *file)
450 struct isp_k_private *isp_private = NULL;
453 printk("isp_module_eb: file is null error.\n");
457 isp_private = file->isp_private;
459 printk("isp_module_eb: isp_private is null error.\n");
463 if (0x01 == atomic_inc_return(&isp_private->users)) {
465 ret = clk_mm_i_eb(isp_private->dn, 1);
466 if (unlikely(0 != ret)) {
468 printk("isp_module_eb: clk_mm_i_eb error.\n");
471 #if defined(CONFIG_MACH_SP7720EA)
472 ret = isp_set_clk(file, ISP_CLK_256M);
473 #elif defined(CONFIG_ARCH_SCX35LT8)
474 ret = isp_set_clk(file, ISP_CLK_480M);
476 ret = isp_set_clk(file, ISP_CLK_312M);
478 if (unlikely(0 != ret)) {
480 printk("isp_module_eb: isp_set_clk error.\n");
487 static int32_t isp_module_dis(struct isp_k_file *file)
490 struct isp_k_private *isp_private = NULL;
493 printk("isp_module_dis: file is null error.\n");
497 isp_private = file->isp_private;
499 printk("isp_module_dis: isp_private is null error.\n");
503 if (0x00 == atomic_dec_return(&isp_private->users)) {
505 ret = isp_set_clk(file, ISP_CLK_NONE);
506 if (unlikely(0 != ret)) {
508 printk("isp_module_dis: isp_set_clk error.\n");
511 ret = clk_mm_i_eb(isp_private->dn, 0);
512 if (unlikely(0 != ret)) {
514 printk("isp_module_dis: close clk_mm_i error.\n");
521 static irqreturn_t isp_isr(int irq, void *dev_id)
524 unsigned long flag = 0;
525 struct isp_node node;
526 struct isp_k_file *fd = NULL;
527 struct isp_drv_private *drv_private = NULL;
530 printk("isp_isr: dev_id is null error.\n");
534 fd = (struct isp_k_file *)dev_id;
535 drv_private = (struct isp_drv_private *)&fd->drv_private;
538 printk("isp_isr: drv_private is null error.\n");
542 spin_lock_irqsave(&drv_private->isr_lock, flag);
543 memset(&node, 0x00, sizeof(node));
544 ret = isp_get_int_num(&node);
547 if (node.irq_val1 & BIT_18) {
548 isp_b4awb_switch_buf(fd->isp_private);
551 isp_queue_write((struct isp_queue *)&drv_private->queue, (struct isp_node *)&node);
552 spin_unlock_irqrestore(&drv_private->isr_lock, flag);
554 up(&drv_private->isr_done_lock);
563 static int32_t isp_register_irq(struct isp_k_file *file)
567 ret = request_irq(ISP_IRQ, isp_isr, IRQF_SHARED, "ISP", (void *)file);
572 static void isp_unregister_irq(struct isp_k_file *file)
574 free_irq (ISP_IRQ, (void *)file);
577 static int isp_open (struct inode *node, struct file *file)
580 struct isp_k_private *isp_private = s_isp_private;//platform_get_drvdata(rot_get_platform_device())
581 struct isp_k_file *fd = NULL;
585 printk("isp_open: file is null error.\n");
591 printk("isp_open: isp_private is null, error.\n");
595 down(&isp_private->device_lock);
597 fd = vzalloc(sizeof(*fd));
600 up(&isp_private->device_lock);
601 printk("isp_open: no memory for fd, error.\n");
605 fd->isp_private = isp_private;
607 spin_lock_init(&fd->drv_private.isr_lock);
608 sema_init(&fd->drv_private.isr_done_lock, 0);
609 ret = isp_queue_init(&(fd->drv_private.queue));
610 if (unlikely(0 != ret)) {
613 up(&isp_private->device_lock);
614 printk("isp_open: isp_queue_init error.\n");
618 ret = isp_module_eb(fd);
619 if (unlikely(0 != ret)) {
621 printk("isp_open: isp_module_eb error.\n");
625 ret = isp_module_rst(fd);
626 if (unlikely(0 != ret)) {
629 printk("isp_open: isp_module_rst error.\n");
633 ret = isp_register_irq(fd);
634 if (unlikely(0 != ret)) {
637 printk("isp_open: isp_register_irq error.\n");
641 file->private_data = fd;
643 printk("isp_open: success.\n");
651 file->private_data = NULL;
653 up(&isp_private->device_lock);
658 static int isp_release (struct inode *node, struct file *file)
661 struct isp_k_private *isp_private = NULL;
662 struct isp_k_file *fd = NULL;
666 printk("isp_release: file is null error.\n");
670 fd = file->private_data;
673 printk("isp_release: fd is null error.\n");
677 isp_private = fd->isp_private;
679 printk("isp_release: isp_private is null error.\n");
683 down(&isp_private->ioctl_lock);
685 isp_unregister_irq(fd);
687 ret = isp_module_dis(fd);
689 up(&isp_private->ioctl_lock);
695 file->private_data = NULL;
698 up(&isp_private->device_lock);
700 printk("isp_release: success.\n");
705 static long isp_ioctl( struct file *file, unsigned int cmd, unsigned long param)
708 struct isp_irq irq_param;
709 struct isp_node node;
710 struct isp_reg_param reg_param = {0, 0};
711 struct isp_reg_bits *reg_bits_ptr = NULL;
712 struct isp_k_private *isp_private = NULL;
713 struct isp_drv_private *drv_private = NULL;
714 struct isp_k_file *fd = NULL;
718 printk("isp_ioctl: file is null error.\n");
722 fd = file->private_data;
725 printk("isp_ioctl: private_data is null error.\n");
729 isp_private = fd->isp_private;
732 printk("isp_ioctl: isp_private is null error.\n");
736 drv_private = &fd->drv_private;
741 ret = down_interruptible(&fd->drv_private.isr_done_lock);
743 memset(&irq_param, 0, sizeof(irq_param));
744 irq_param.ret_val = ret;
745 ret = copy_to_user ((void *)param, (void *)&irq_param, sizeof(irq_param));
747 printk("isp_ioctl: irq: copy_to_user error ret = %d\n", (uint32_t)ret);
753 ret = isp_queue_read(&drv_private->queue, &node);
756 printk("isp_ioctl: isp_queue_read error, ret = 0x%x\n", (uint32_t)ret);
760 memset(&irq_param, 0, sizeof(irq_param));
761 irq_param.irq_val0 = node.irq_val0;
762 irq_param.irq_val1 = node.irq_val1;
763 irq_param.irq_val2 = node.irq_val2;
764 irq_param.irq_val3 = node.irq_val3;
765 irq_param.reserved = node.reserved;
766 ret = copy_to_user ((void *)param, (void *)&irq_param, sizeof(irq_param));
769 printk("isp_k: ioctl irq: copy_to_user error, ret = 0x%x", (uint32_t)ret);
776 uint32_t buf_size = 0;
778 down(&isp_private->ioctl_lock);
780 ret = copy_from_user((void *)®_param, (void *)param, sizeof(struct isp_reg_param));
783 printk("isp_ioctl: read copy_from_user 0 error, ret = 0x%x\n", (uint32_t)ret);
787 buf_size = reg_param.counts * sizeof(struct isp_reg_bits);
788 if (buf_size > isp_private->reg_buf_len) {
790 printk("isp_ioctl: read buf len error.\n");
794 reg_bits_ptr = (struct isp_reg_bits *)isp_private->reg_buf_addr;
795 ret = copy_from_user((void *)reg_bits_ptr, (void *)reg_param.reg_param, buf_size);
798 printk("isp_ioctl: read copy_from_user 1 error, ret = 0x%x\n", (uint32_t)ret);
802 isp_read_reg(reg_bits_ptr, reg_param.counts);
804 ret = copy_to_user((void *)reg_param.reg_param, (void *)reg_bits_ptr, buf_size);
807 printk("isp_ioctl: read copy_to_user error, ret = 0x%x\n", (uint32_t)ret);
813 memset((void *)isp_private->reg_buf_addr, 0x00, buf_size);
817 up(&isp_private->ioctl_lock);
824 uint32_t buf_size = 0;
826 down(&isp_private->ioctl_lock);
828 ret = copy_from_user((void *)®_param, (void *)param, sizeof(struct isp_reg_param));
830 printk("isp_ioctl: write copy_from_user 0 error, ret = 0x%x\n", (uint32_t)ret);
835 buf_size = reg_param.counts * sizeof(struct isp_reg_bits);
836 if (buf_size > isp_private->reg_buf_len) {
838 printk("isp_ioctl: write buf len error.\n");
842 reg_bits_ptr = (struct isp_reg_bits *)isp_private->reg_buf_addr;
843 ret = copy_from_user((void *)reg_bits_ptr, (void *)reg_param.reg_param, buf_size);
846 printk("isp_ioctl: write copy_from_user 1 error, ret = 0x%x\n", (uint32_t)ret);
850 isp_write_reg(reg_bits_ptr, reg_param.counts);
854 memset((void *)isp_private->reg_buf_addr, 0x00, buf_size);
858 up(&isp_private->ioctl_lock);
865 down(&isp_private->ioctl_lock);
867 ret = isp_module_rst(fd);
870 printk("isp_ioctl: restet error.\n");
873 up(&isp_private->ioctl_lock);
880 unsigned long flag = 0;
881 struct isp_node node;
883 down(&isp_private->ioctl_lock);
885 isp_en_irq(ISP_INT_CLEAR_MODE);
887 spin_lock_irqsave(&drv_private->isr_lock,flag);
888 memset(&node, 0x00, sizeof(node));
889 node.reserved = ISP_INT_EVT_STOP;
890 isp_queue_write((struct isp_queue *)&drv_private->queue, (struct isp_node *)&node);
891 spin_unlock_irqrestore(&drv_private->isr_lock, flag);
893 up(&fd->drv_private.isr_done_lock);
895 up(&isp_private->ioctl_lock);
902 struct isp_interrupt int_param;
904 down(&isp_private->ioctl_lock);
906 ret = copy_from_user((void *)&int_param, (void *)param, sizeof(int_param));
909 printk("isp_ioctl: int copy_from_user error, ret = %d\n", (uint32_t)ret);
913 isp_en_irq(int_param.int_mode);
915 up(&isp_private->ioctl_lock);
920 case ISP_IO_CFG_PARAM:
921 down(&isp_private->ioctl_lock);
922 ret = isp_cfg_param((void *)param, isp_private);
923 up(&isp_private->ioctl_lock);
926 case ISP_IO_CAPABILITY:
927 ret = isp_capability((void *)param);
935 int ISP_REG_NUM = 20467;
937 struct isp_reg_bits *ptr = (struct isp_reg_bits *)vmalloc(ISP_REG_NUM * sizeof(struct isp_reg_bits));
940 printk("isp_ioctl:REG_READ: kmalloc error\n");
943 memset(ptr, 0, ISP_REG_NUM * sizeof(struct isp_reg_bits));
945 num = isp_wr_addr(ptr);
947 isp_read_reg(ptr, num);
949 ret = copy_to_user((void *)param, (void *)ptr, ISP_REG_NUM * sizeof(struct isp_reg_bits));
951 printk("isp_ioctl: REG_READ: copy_to_user error ret = %d\n", (uint32_t)ret);
960 printk("isp_ioctl: cmd is unsupported, cmd = %x\n", (int32_t)cmd);
967 static struct file_operations isp_fops = {
968 .owner = THIS_MODULE,
970 .unlocked_ioctl = isp_ioctl,
971 .compat_ioctl = compat_isp_ioctl,
972 .release = isp_release,
975 static struct miscdevice isp_dev = {
981 static int isp_probe(struct platform_device *pdev)
984 struct isp_k_private *isp_private = NULL;
986 isp_private = devm_kzalloc(&pdev->dev, sizeof(*isp_private), GFP_KERNEL);
988 printk("isp_probe: isp_private is null error.\n");
992 atomic_set(&isp_private->users, 0);
993 isp_private->dn = pdev->dev.of_node;
994 isp_private->clock = NULL;
995 sema_init(&isp_private->device_lock, 1);
996 sema_init(&isp_private->ioctl_lock, 1);
997 ret = isp_block_buf_alloc(isp_private);
1000 devm_kfree(&pdev->dev, isp_private);
1001 printk("isp_probe: no memory for isp_private, error.\n");
1005 platform_set_drvdata(pdev, isp_private);
1006 s_isp_private = isp_private;
1007 ret = isp_lsc_buf_alloc(isp_private, ISP_LSC_BUF_SIZE);
1010 isp_block_buf_free(isp_private);
1011 devm_kfree(&pdev->dev, isp_private);
1012 platform_set_drvdata(pdev, NULL);
1013 printk("isp_probe: no memory for isp lsc buf alloc, error.\n");
1017 ret = isp_binging4awb_buf_alloc(isp_private, ISP_BING4AWB_SIZE);
1020 isp_lsc_buf_free(isp_private);
1021 isp_block_buf_free(isp_private);
1022 devm_kfree(&pdev->dev, isp_private);
1023 platform_set_drvdata(pdev, NULL);
1024 printk("isp_probe: no memory for isp lsc buf alloc, error.\n");
1028 ret = isp_yiq_antiflicker_buf_alloc(isp_private, ISP_YIQ_ANTIFLICKER_SIZE);
1031 isp_binging4awb_buf_free(isp_private);
1032 isp_lsc_buf_free(isp_private);
1033 isp_block_buf_free(isp_private);
1034 devm_kfree(&pdev->dev, isp_private);
1035 platform_set_drvdata(pdev, NULL);
1036 printk("isp_probe: no memory for isp lsc buf alloc, error.\n");
1040 ret = misc_register(&isp_dev);
1043 isp_yiq_antiflicker_buf_free(isp_private);
1044 isp_binging4awb_buf_free(isp_private);
1045 isp_lsc_buf_free(isp_private);
1046 isp_block_buf_free(isp_private);
1047 devm_kfree(&pdev->dev, isp_private);
1048 platform_set_drvdata(pdev, NULL);
1049 printk("isp_probe: misc_register error.\n");
1052 parse_baseaddress(pdev->dev.of_node);
1053 printk("isp_probe: success.\n");
1058 static int isp_remove(struct platform_device *dev)
1060 struct isp_k_private *isp_private = NULL;
1062 isp_private = platform_get_drvdata(dev);
1065 isp_yiq_antiflicker_buf_free(isp_private);
1066 isp_binging4awb_buf_free(isp_private);
1067 isp_lsc_buf_free(isp_private);
1068 isp_block_buf_free(isp_private);
1069 devm_kfree(&dev->dev, isp_private);
1070 platform_set_drvdata(dev, NULL);
1072 printk("isp_remove: isp_private is null error.\n");
1075 misc_deregister(&isp_dev);
1076 printk("isp_remove: success.\n");
1080 static const struct of_device_id of_match_table_isp[] = {
1081 { .compatible = "sprd,sprd_isp", },
1085 static struct platform_driver isp_driver = {
1087 .remove = isp_remove,
1089 .owner = THIS_MODULE,
1091 .of_match_table = of_match_ptr(of_match_table_isp),
1095 static int __init isp_init(void)
1097 printk ("isp_init: success.\n");
1099 if (platform_driver_register(&isp_driver)) {
1100 printk ("isp_init: platform_driver_register error.\n");
1107 static void __exit isp_exit(void)
1109 printk ("isp_exit: success.\n");
1111 platform_driver_unregister(&isp_driver);
1114 static int isp_wr_addr(struct isp_reg_bits *ptr)
1120 printk("isp_wr_addr: ptr\n");
1124 struct isp_reg_bits *ptr_reg = ptr;
1126 ptr_reg -> reg_addr = 0x0000; /* Interrupt part*/
1129 for (i = 0; i < 17; i++)
1132 ptr_reg -> reg_addr = 0x0014 + i * 0x4;
1136 for (i = 0; i < 4; i++) /*Fetch*/
1139 ptr_reg -> reg_addr = 0x0100 + i * 0x4;
1143 for(i = 0; i < 2; i++)
1146 ptr_reg -> reg_addr = 0x0114 + i * 0x4;
1150 for(i = 0; i < 10; i++)
1153 ptr_reg -> reg_addr = 0x0120 + i * 0x4;
1157 for(i = 0; i < 4; i++) /* store*/
1160 ptr_reg -> reg_addr = 0x0200 + i * 0x4;
1164 for(i = 0; i < 10; i++)
1167 ptr_reg -> reg_addr = 0x0214 + i * 0x4;
1171 for(i = 0; i < 12; i++) /* dispatch */
1174 ptr_reg -> reg_addr = 0x0300 + i * 0x4;
1178 for(i = 0; i < 2; i++) /* arbiter */
1181 ptr_reg -> reg_addr = 0x0400 + i * 0x4;
1185 for(i = 0; i < 4; i++)
1188 ptr_reg -> reg_addr = 0x0414 + i * 0x4;
1192 for(i = 0; i < 2; i++) /* axi */
1195 ptr_reg -> reg_addr = 0x0500 + i * 0x4;
1199 for(i = 0; i < 2; i++)
1202 ptr_reg -> reg_addr = 0x0514 + i * 0x4;
1206 ptr_reg++; /* raw sizer */
1207 ptr_reg -> reg_addr = 0x0600;
1210 for(i = 0; i < 45; i++)
1213 ptr_reg -> reg_addr = 0x0614 + i * 0x4;
1217 for(i = 0; i < 3; i++) /* common */
1220 ptr_reg -> reg_addr = 0x0700 + i * 0x4;
1224 for(i = 0; i < 16; i++)
1227 ptr_reg -> reg_addr = 0x0714 + i * 0x4;
1231 for(i = 0; i < 2; i++) /* global gain */
1234 ptr_reg -> reg_addr = 0x1000 + i * 0x14;
1238 ptr_reg++; /* BLC */
1239 ptr_reg -> reg_addr = 0x1100;
1242 for(i = 0; i < 3; i++)
1245 ptr_reg -> reg_addr = 0x1114 + i * 0x4;
1249 ptr_reg++; /* RGBG */
1250 ptr_reg -> reg_addr = 0x1200;
1253 for(i = 0; i < 3; i++)
1256 ptr_reg -> reg_addr = 0x1214 + i * 0x4;
1260 for(i = 0; i < 2; i++) /* PWD */
1263 ptr_reg -> reg_addr = 0x1300 + i * 0x4;
1267 for(i = 0; i < 11; i++)
1270 ptr_reg -> reg_addr = 0x1314 + i * 0x4;
1274 ptr_reg++; /* NLC */
1275 ptr_reg -> reg_addr = 0x1400;
1278 for(i = 0; (ptr_reg->reg_addr) < 0x14b0; i++)
1281 ptr_reg -> reg_addr = 0x1414 + i * 0x4;
1285 ptr_reg++; /* lens shading calibration */
1286 ptr_reg -> reg_addr = 0x1500;
1289 for(i = 0; i < 15; i++)
1292 ptr_reg -> reg_addr = 0x1514 + i * 0x4;
1296 ptr_reg++; /* binning */
1297 ptr_reg -> reg_addr = 0x1600;
1300 for(i = 0; i < 3; i++)
1303 ptr_reg -> reg_addr = 0x1614 + i * 0x4;
1307 ptr_reg++; /* AWBM */
1308 ptr_reg -> reg_addr = 0x1700;
1311 for(i = 0; i < 34; i++)
1314 ptr_reg -> reg_addr = 0x1714 + i * 0x4;
1318 for(i = 0; i < 2; i++)
1321 ptr_reg -> reg_addr = 0x17A0 + i * 0x4;
1325 ptr_reg++; /* AWBC */
1326 ptr_reg -> reg_addr = 0x1800;
1329 for(i = 0; i < 14; i++)
1332 ptr_reg -> reg_addr = 0x1814 + i * 0x4;
1336 ptr_reg++; /* AEM */
1337 ptr_reg -> reg_addr = 0x1900;
1340 for(i = 0; i < 4; i++)
1343 ptr_reg -> reg_addr = 0x1914 + i * 0x4;
1347 ptr_reg++; /* BPC */
1348 ptr_reg -> reg_addr = 0x1A00;
1351 for(i = 0; i < 14; i++)
1354 ptr_reg -> reg_addr = 0x1A14 + i * 0x4;
1358 ptr_reg++; /* GRGB */
1359 ptr_reg -> reg_addr = 0x1B00;
1362 for(i = 0; i < 2; i++)
1365 ptr_reg -> reg_addr = 0x1B14 + i * 0x4;
1369 ptr_reg++; /* BDN */
1370 ptr_reg -> reg_addr = 0x1C00;
1373 for(i = 0; i < 101; i++)
1376 ptr_reg -> reg_addr = 0x1C14 + i * 0x4;
1380 for(i = 0; i < 7; i++)
1383 ptr_reg -> reg_addr = 0x1DA8 + i * 0x4;
1387 ptr_reg++; /* RGBG2 */
1388 ptr_reg -> reg_addr = 0x1E00;
1391 for(i = 0; i < 3; i++)
1394 ptr_reg -> reg_addr = 0x1E14 + i * 0x4;
1398 ptr_reg++; /* 1d lnc */
1399 ptr_reg -> reg_addr = 0x1F00;
1402 for(i = 0; i < 19; i++)
1405 ptr_reg -> reg_addr = 0x1F14 + i * 0x4;
1409 ptr_reg++; /* NLM VST IVST */
1410 ptr_reg -> reg_addr = 0x2014;
1414 ptr_reg -> reg_addr = 0x2214;
1417 for(i = 0; i < 3; i++)
1420 ptr_reg -> reg_addr = 0x2100 + i * 0x4;
1424 for(i = 0; i < 35; i++)
1427 ptr_reg -> reg_addr = 0x2114 + i * 0x4;
1431 ptr_reg++; /* CFA: clolor filter array */
1432 ptr_reg -> reg_addr = 0x3000;
1435 for(i = 0; i < 7; i++)
1438 ptr_reg -> reg_addr = 0x3014 + i * 0x4;
1442 for(i = 0; i < 2; i++) /* CMC */
1445 ptr_reg -> reg_addr = 0x3100 + i * 0x4;
1449 for(i = 0; i < 5; i++)
1452 ptr_reg -> reg_addr = 0x3114 + i * 0x4;
1456 for(i = 0; i < 5; i++)
1459 ptr_reg -> reg_addr = 0x312C + i * 0x4;
1463 for(i = 0; i < 2; i++) /* GAMMA */
1466 ptr_reg -> reg_addr = 0x3300 + i * 0x14;
1470 for(i = 0; i < 2; i++) /* Color matrix correction for 8 bits */
1473 ptr_reg -> reg_addr = 0x3500 + i * 0x4;
1477 for(i = 0; i < 16; i++)
1480 ptr_reg -> reg_addr = 0x3514 + i * 0x4;
1484 for(i = 0; i < 2; i++) /* CT: Color transformation */
1487 ptr_reg -> reg_addr = 0x3600 + i * 0x4;
1492 ptr_reg -> reg_addr = 0x3614;
1495 for(i = 0; i < 2; i++) /* CCE: clolor conversion enhancement */
1498 ptr_reg -> reg_addr = 0x3700 + i * 0x4;
1502 for(i = 0; i < 13; i++)
1505 ptr_reg -> reg_addr = 0x3714 + i * 0x4;
1509 for(i = 0; i < 2; i++) /* HSV */
1512 ptr_reg -> reg_addr = 0x3800 + i * 0x14;
1516 ptr_reg++; /* Radial CSC */
1517 ptr_reg -> reg_addr = 0x3900;
1520 for(i = 0; i < 14; i++)
1523 ptr_reg -> reg_addr = 0x3914 + i * 0x4;
1527 for(i = 0; i < 2; i++) /* ISP_PRECNRNEW */
1530 ptr_reg -> reg_addr = 0x3A00 + i * 0x4;
1534 for(i = 0; i < 4; i++)
1537 ptr_reg -> reg_addr = 0x3A14 + i * 0x4;
1541 ptr_reg++; /* ISP_PSTRZ */
1542 ptr_reg -> reg_addr = 0x3B00;
1545 for(i = 0; i < 9; i++)
1548 ptr_reg -> reg_addr = 0x3B14 + i * 0x4;
1552 for(i = 0; i < 2; i++) /* AFM: auto focus monitor */
1555 ptr_reg -> reg_addr = 0x3C00 + i * 0x4;
1559 for(i = 0; i < 105; i++)
1562 ptr_reg -> reg_addr = 0x3C14 + i * 0x4;
1566 ptr_reg++; /* YIQ AEM */
1567 ptr_reg -> reg_addr = 0x4100;
1570 for(i = 0; i < 10; i++)
1573 ptr_reg -> reg_addr = 0x4114 + i * 0x4;
1577 for(i = 0; i < 2; i++) /* ANTI FLICKER */
1580 ptr_reg -> reg_addr = 0x4200 + i * 0x4;
1584 for(i = 0; i < 4; i++)
1587 ptr_reg -> reg_addr = 0x4214 + i * 0x4;
1591 for(i = 0; i < 2; i++) /* YIQ AFM */
1594 ptr_reg -> reg_addr = 0x4300 + i * 0x4;
1598 for(i = 0; i < 158; i++)
1601 ptr_reg -> reg_addr = 0x4314 + i * 0x4;
1605 for(i = 0; i < 2; i++) /* Pre-CDN */
1608 ptr_reg -> reg_addr = 0x5000 + i * 0x4;
1612 for(i = 0; i < 19; i++)
1615 ptr_reg -> reg_addr = 0x5014 + i * 0x4;
1619 for(i = 0; i < 2; i++) /* Pre-Filter */
1622 ptr_reg -> reg_addr = 0x5100 + i * 0x4;
1626 for(i = 0; i < 2; i++)
1629 ptr_reg -> reg_addr = 0x5114 + i * 0x4;
1633 for(i = 0; i < 2; i++) /* Brightness */
1636 ptr_reg -> reg_addr = 0x5300 + i * 0x14;
1640 for(i = 0; i < 2; i++) /* Contrast */
1643 ptr_reg -> reg_addr = 0x5400 + i * 0x14;
1647 ptr_reg++; /* HIST: histogram */
1648 ptr_reg -> reg_addr = 0x5500;
1651 for(i = 0; i < 5; i++)
1654 ptr_reg -> reg_addr = 0x5514 + i * 0x4;
1658 ptr_reg++; /* HIST2 */
1659 ptr_reg -> reg_addr = 0x5600;
1662 for(i = 0; i < 9; i++)
1665 ptr_reg -> reg_addr = 0x5614 + i * 0x4;
1669 ptr_reg++; /* AUTOCONT: auto contrat adjustment */
1670 ptr_reg -> reg_addr = 0x5700;
1673 for(i = 0; i < 2; i++)
1676 ptr_reg -> reg_addr = 0x5714 + i * 0x4;
1680 for(i = 0; i < 2; i++) /* cdn */
1683 ptr_reg -> reg_addr = 0x5800 + i * 0x4;
1687 for(i = 0; i < 18; i++)
1690 ptr_reg -> reg_addr = 0x5814 + i * 0x4;
1694 ptr_reg++; /* edge */
1695 ptr_reg -> reg_addr = 0x5900;
1698 for(i = 0; i < 12; i++)
1701 ptr_reg -> reg_addr = 0x5914 + i * 0x4;
1705 for(i = 0; i < 2; i++) /* emboss */
1708 ptr_reg -> reg_addr = 0x5A00 + i * 0x14;
1712 for(i = 0; i < 2; i++)
1715 ptr_reg -> reg_addr = 0x5A00 + i * 0x14;
1719 ptr_reg++; /* CSS */
1720 ptr_reg -> reg_addr = 0x5B00;
1723 for(i = 0; i < 10; i++)
1726 ptr_reg -> reg_addr = 0x5B14 + i * 0x4;
1730 for(i = 0; i < 2; i++) /* csa */
1733 ptr_reg -> reg_addr = 0x5C00 + i * 0x14;
1737 for(i = 0; i < 2; i++) /* hua */
1740 ptr_reg -> reg_addr = 0x5D00 + i * 0x14;
1744 ptr_reg++; /* post-cdn */
1745 ptr_reg -> reg_addr = 0x5E00;
1748 for(i = 0; i < 29; i++)
1751 ptr_reg -> reg_addr = 0x5E14 + i * 0x4;
1756 ptr_reg -> reg_addr = 0x5F14;
1759 for(i = 0; i < 2; i++) /* ygamma */
1762 ptr_reg -> reg_addr = 0x6000 + i * 0x14;
1766 for(i = 0; i < 2; i++) /* ydelay */
1769 ptr_reg -> reg_addr = 0x6100 + i * 0x14;
1773 for(i = 0; i < 2; i++) /* iircnr */
1776 ptr_reg -> reg_addr = 0x6400 + i * 0x4;
1780 for(i = 0; i < 16; i++)
1783 ptr_reg -> reg_addr = 0x6414 + i * 0x4;
1787 for(i = 0; i < 2; i++)
1790 ptr_reg -> reg_addr = 0x2000 + i * 0x54;
1794 for(i = 0; (ptr_reg->reg_addr) < 0x153fc; i++) // isp v memory1: awbm; isp v memory2:aem
1797 ptr_reg -> reg_addr = 0x10000 + i * 0x4;
1801 for(i = 0; (ptr_reg->reg_addr) < 0x163fc; i++)
1804 ptr_reg -> reg_addr = 0x16000 + i * 0x4;
1808 for(i = 0; (ptr_reg->reg_addr) < 0x17b60; i++)
1811 ptr_reg -> reg_addr = 0x17000 + i * 0x4;
1815 for(i = 0; (ptr_reg->reg_addr) < 0x185a0; i++)
1818 ptr_reg -> reg_addr = 0x18000 + i * 0x4;
1822 for(i = 0; (ptr_reg->reg_addr) < 0x1b200; i++)
1825 ptr_reg -> reg_addr = 0x19000 + i * 0x4;
1829 for(i = 0; i < 3; i++)
1832 int addr_base = 0x1c000 + i * 0x1000;
1833 for(addr_n = 0; (ptr_reg->reg_addr) < (addr_base + 0x200); addr_n++)
1836 ptr_reg -> reg_addr = addr_base + addr_n * 0x4;
1841 for(i = 0; (ptr_reg->reg_addr) < 0x20b60; i++)
1844 ptr_reg -> reg_addr = 0x1f000 + i * 0x4;
1848 for(i = 0; (ptr_reg->reg_addr) < 0x215a0; i++)
1851 ptr_reg -> reg_addr = 0x21000 + i * 0x4;
1855 for(i = 0; (ptr_reg->reg_addr) < 0x24200; i++)
1858 ptr_reg -> reg_addr = 0x22000 + i * 0x4;
1862 for(i = 0; i < 3; i++)
1865 int addr_base = 0x25000 + i * 0x1000;
1866 for(addr_n = 0; (ptr_reg->reg_addr) < (addr_base + 0x200); addr_n++)
1869 ptr_reg -> reg_addr = addr_base + addr_n * 0x4;
1874 for(i = 0; (ptr_reg->reg_addr) < 0x2b2fc; i++)
1877 ptr_reg -> reg_addr = 0x28000 + i * 0x4;
1881 for(i = 0; (ptr_reg->reg_addr) < 0x2e2fc; i++)
1884 ptr_reg -> reg_addr = 0x2C000 + i * 0x4;
1891 module_init(isp_init);
1892 module_exit(isp_exit);
1893 MODULE_DESCRIPTION("Isp Driver");
1894 MODULE_LICENSE("GPL");