Lines Matching refs:mddi

94 static void mddi_init_rev_encap(struct mddi_info *mddi);
96 #define mddi_readl(r) readl(mddi->base + (MDDI_##r))
97 #define mddi_writel(v, r) writel((v), mddi->base + (MDDI_##r))
101 struct mddi_info *mddi = container_of(cdata, struct mddi_info, in mddi_activate_link() local
107 static void mddi_handle_link_list_done(struct mddi_info *mddi) in mddi_handle_link_list_done() argument
111 static void mddi_reset_rev_encap_ptr(struct mddi_info *mddi) in mddi_reset_rev_encap_ptr() argument
114 mddi->rev_data_curr = 0; in mddi_reset_rev_encap_ptr()
115 mddi_writel(mddi->rev_addr, REV_PTR); in mddi_reset_rev_encap_ptr()
116 mddi_writel(mddi->rev_addr, REV_PTR); in mddi_reset_rev_encap_ptr()
120 static void mddi_handle_rev_data(struct mddi_info *mddi, union mddi_rev *rev) in mddi_handle_rev_data() argument
130 memcpy(&mddi->caps, &rev->caps, in mddi_handle_rev_data()
132 mddi->flags |= FLAG_HAVE_CAPS; in mddi_handle_rev_data()
133 wake_up(&mddi->int_wait); in mddi_handle_rev_data()
136 memcpy(&mddi->status, &rev->status, in mddi_handle_rev_data()
138 mddi->flags |= FLAG_HAVE_STATUS; in mddi_handle_rev_data()
139 wake_up(&mddi->int_wait); in mddi_handle_rev_data()
142 ri = mddi->reg_read; in mddi_handle_rev_data()
158 mddi->reg_read = NULL; in mddi_handle_rev_data()
174 mddi_reset_rev_encap_ptr(mddi); in mddi_handle_rev_data()
179 mddi_reset_rev_encap_ptr(mddi); in mddi_handle_rev_data()
183 static void mddi_wait_interrupt(struct mddi_info *mddi, uint32_t intmask);
185 static void mddi_handle_rev_data_avail(struct mddi_info *mddi) in mddi_handle_rev_data_avail() argument
193 union mddi_rev *crev = mddi->rev_data + mddi->rev_data_curr; in mddi_handle_rev_data_avail()
205 ri = mddi->reg_read; in mddi_handle_rev_data_avail()
210 mddi->reg_read = NULL; in mddi_handle_rev_data_avail()
220 prev_offset = mddi->rev_data_curr; in mddi_handle_rev_data_avail()
222 length = *((uint8_t *)mddi->rev_data + mddi->rev_data_curr); in mddi_handle_rev_data_avail()
223 mddi->rev_data_curr++; in mddi_handle_rev_data_avail()
224 if (mddi->rev_data_curr == MDDI_REV_BUFFER_SIZE) in mddi_handle_rev_data_avail()
225 mddi->rev_data_curr = 0; in mddi_handle_rev_data_avail()
226 length += *((uint8_t *)mddi->rev_data + mddi->rev_data_curr) << 8; in mddi_handle_rev_data_avail()
227 mddi->rev_data_curr += 1 + length; in mddi_handle_rev_data_avail()
228 if (mddi->rev_data_curr >= MDDI_REV_BUFFER_SIZE) in mddi_handle_rev_data_avail()
229 mddi->rev_data_curr = in mddi_handle_rev_data_avail()
230 mddi->rev_data_curr % MDDI_REV_BUFFER_SIZE; in mddi_handle_rev_data_avail()
235 mddi_reset_rev_encap_ptr(mddi); in mddi_handle_rev_data_avail()
242 memcpy(&tmprev.raw[0], mddi->rev_data + prev_offset, rem); in mddi_handle_rev_data_avail()
243 memcpy(&tmprev.raw[rem], mddi->rev_data, 2 + length - rem); in mddi_handle_rev_data_avail()
244 mddi_handle_rev_data(mddi, &tmprev); in mddi_handle_rev_data_avail()
246 mddi_handle_rev_data(mddi, crev); in mddi_handle_rev_data_avail()
250 mddi->rev_data_curr >= MDDI_REV_BUFFER_SIZE / 2) { in mddi_handle_rev_data_avail()
251 mddi_writel(mddi->rev_addr, REV_PTR); in mddi_handle_rev_data_avail()
258 struct mddi_info *mddi = container_of(cdata, struct mddi_info, in mddi_isr() local
262 spin_lock(&mddi->int_lock); in mddi_isr()
270 active &= mddi->int_enable; in mddi_isr()
272 mddi->got_int |= active; in mddi_isr()
273 wake_up(&mddi->int_wait); in mddi_isr()
276 mddi->int_enable &= (~MDDI_INT_PRI_LINK_LIST_DONE); in mddi_isr()
277 mddi_handle_link_list_done(mddi); in mddi_isr()
280 mddi_handle_rev_data_avail(mddi); in mddi_isr()
283 mddi->int_enable &= ~(active & ~MDDI_INT_NEED_CLEAR); in mddi_isr()
286 mddi->int_enable &= (~MDDI_INT_LINK_ACTIVE); in mddi_isr()
287 mddi->int_enable |= MDDI_INT_IN_HIBERNATION; in mddi_isr()
291 mddi->int_enable &= (~MDDI_INT_IN_HIBERNATION); in mddi_isr()
292 mddi->int_enable |= MDDI_INT_LINK_ACTIVE; in mddi_isr()
295 mddi_writel(mddi->int_enable, INTEN); in mddi_isr()
296 spin_unlock(&mddi->int_lock); in mddi_isr()
301 static long mddi_wait_interrupt_timeout(struct mddi_info *mddi, in mddi_wait_interrupt_timeout() argument
306 spin_lock_irqsave(&mddi->int_lock, irq_flags); in mddi_wait_interrupt_timeout()
307 mddi->got_int &= ~intmask; in mddi_wait_interrupt_timeout()
308 mddi->int_enable |= intmask; in mddi_wait_interrupt_timeout()
309 mddi_writel(mddi->int_enable, INTEN); in mddi_wait_interrupt_timeout()
310 spin_unlock_irqrestore(&mddi->int_lock, irq_flags); in mddi_wait_interrupt_timeout()
311 return wait_event_timeout(mddi->int_wait, mddi->got_int & intmask, in mddi_wait_interrupt_timeout()
315 static void mddi_wait_interrupt(struct mddi_info *mddi, uint32_t intmask) in mddi_wait_interrupt() argument
317 if (mddi_wait_interrupt_timeout(mddi, intmask, HZ/10) == 0) in mddi_wait_interrupt()
321 mddi->got_int); in mddi_wait_interrupt()
324 static void mddi_init_rev_encap(struct mddi_info *mddi) in mddi_init_rev_encap() argument
326 memset(mddi->rev_data, 0xee, MDDI_REV_BUFFER_SIZE); in mddi_init_rev_encap()
327 mddi_writel(mddi->rev_addr, REV_PTR); in mddi_init_rev_encap()
329 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_init_rev_encap()
334 struct mddi_info *mddi = container_of(cdata, struct mddi_info, in mddi_set_auto_hibernate() local
337 mddi_wait_interrupt(mddi, MDDI_INT_IN_HIBERNATION); in mddi_set_auto_hibernate()
339 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_set_auto_hibernate()
343 static uint16_t mddi_init_registers(struct mddi_info *mddi) in mddi_init_registers() argument
361 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_init_registers()
377 mddi_set_auto_hibernate(&mddi->client_data, 0); in mddi_init_registers()
380 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_init_registers()
382 mddi_init_rev_encap(mddi); in mddi_init_registers()
388 struct mddi_info *mddi = container_of(cdata, struct mddi_info, in mddi_suspend() local
391 if (mddi->power_client) in mddi_suspend()
392 mddi->power_client(&mddi->client_data, 0); in mddi_suspend()
395 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_suspend()
397 clk_disable(mddi->clk); in mddi_suspend()
402 struct mddi_info *mddi = container_of(cdata, struct mddi_info, in mddi_resume() local
404 mddi_set_auto_hibernate(&mddi->client_data, 0); in mddi_resume()
406 if (mddi->power_client) in mddi_resume()
407 mddi->power_client(&mddi->client_data, 1); in mddi_resume()
409 clk_enable(mddi->clk); in mddi_resume()
411 mddi->rev_data_curr = 0; in mddi_resume()
412 mddi_init_registers(mddi); in mddi_resume()
413 mddi_writel(mddi->int_enable, INTEN); in mddi_resume()
416 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_resume()
417 mddi_set_auto_hibernate(&mddi->client_data, 1); in mddi_resume()
420 static int mddi_get_client_caps(struct mddi_info *mddi) in mddi_get_client_caps() argument
427 mddi->int_enable = MDDI_INT_LINK_ACTIVE | in mddi_get_client_caps()
434 mddi_writel(mddi->int_enable, INTEN); in mddi_get_client_caps()
437 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_get_client_caps()
448 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_get_client_caps()
459 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_get_client_caps()
460 wait_event_timeout(mddi->int_wait, mddi->flags & FLAG_HAVE_CAPS, in mddi_get_client_caps()
463 if (mddi->flags & FLAG_HAVE_CAPS) in mddi_get_client_caps()
467 return mddi->flags & FLAG_HAVE_CAPS; in mddi_get_client_caps()
471 int mddi_check_status(struct mddi_info *mddi) in mddi_check_status() argument
474 mutex_lock(&mddi->reg_read_lock); in mddi_check_status()
476 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_check_status()
479 mddi->flags &= ~FLAG_HAVE_STATUS; in mddi_check_status()
481 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_check_status()
482 wait_event_timeout(mddi->int_wait, in mddi_check_status()
483 mddi->flags & FLAG_HAVE_STATUS, in mddi_check_status()
486 if (mddi->flags & FLAG_HAVE_STATUS) { in mddi_check_status()
487 if (mddi->status.crc_error_count) in mddi_check_status()
490 mddi->status.crc_error_count); in mddi_check_status()
498 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_check_status()
502 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_check_status()
503 mutex_unlock(&mddi->reg_read_lock); in mddi_check_status()
511 struct mddi_info *mddi = container_of(cdata, struct mddi_info, in mddi_remote_write() local
516 mutex_lock(&mddi->reg_write_lock); in mddi_remote_write()
518 ll = mddi->reg_write_data; in mddi_remote_write()
533 ll->data = mddi->reg_write_addr + offsetof(struct mddi_llentry, in mddi_remote_write()
538 mddi_writel(mddi->reg_write_addr, PRI_PTR); in mddi_remote_write()
540 mddi_wait_interrupt(mddi, MDDI_INT_PRI_LINK_LIST_DONE); in mddi_remote_write()
541 mutex_unlock(&mddi->reg_write_lock); in mddi_remote_write()
546 struct mddi_info *mddi = container_of(cdata, struct mddi_info, in mddi_remote_read() local
555 mutex_lock(&mddi->reg_read_lock); in mddi_remote_read()
557 ll = mddi->reg_read_data; in mddi_remote_read()
582 mddi->reg_read = &ri; in mddi_remote_read()
583 mddi_writel(mddi->reg_read_addr, PRI_PTR); in mddi_remote_read()
585 mddi_wait_interrupt(mddi, MDDI_INT_PRI_LINK_LIST_DONE); in mddi_remote_read()
589 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_remote_read()
595 spin_lock_irqsave(&mddi->int_lock, irq_flags); in mddi_remote_read()
596 mddi->reg_read = NULL; in mddi_remote_read()
597 spin_unlock_irqrestore(&mddi->int_lock, irq_flags); in mddi_remote_read()
606 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_remote_read()
614 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_remote_read()
615 mddi->reg_read = NULL; in mddi_remote_read()
616 mutex_unlock(&mddi->reg_read_lock); in mddi_remote_read()
622 static int mddi_clk_setup(struct platform_device *pdev, struct mddi_info *mddi, in mddi_clk_setup() argument
628 mddi->clk = clk_get(&pdev->dev, "mddi_clk"); in mddi_clk_setup()
629 if (IS_ERR(mddi->clk)) { in mddi_clk_setup()
631 return PTR_ERR(mddi->clk); in mddi_clk_setup()
633 ret = clk_enable(mddi->clk); in mddi_clk_setup()
636 ret = clk_set_rate(mddi->clk, clk_rate); in mddi_clk_setup()
642 clk_put(mddi->clk); in mddi_clk_setup()
646 static int __init mddi_rev_data_setup(struct mddi_info *mddi) in mddi_rev_data_setup() argument
655 mddi->rev_data = dma; in mddi_rev_data_setup()
656 mddi->rev_data_curr = 0; in mddi_rev_data_setup()
657 mddi->rev_addr = dma_addr; in mddi_rev_data_setup()
658 mddi->reg_write_data = dma + MDDI_REV_BUFFER_SIZE; in mddi_rev_data_setup()
659 mddi->reg_write_addr = dma_addr + MDDI_REV_BUFFER_SIZE; in mddi_rev_data_setup()
660 mddi->reg_read_data = mddi->reg_write_data + 1; in mddi_rev_data_setup()
661 mddi->reg_read_addr = mddi->reg_write_addr + in mddi_rev_data_setup()
662 sizeof(*mddi->reg_write_data); in mddi_rev_data_setup()
669 struct mddi_info *mddi = &mddi_info[pdev->id]; in mddi_probe() local
678 mddi->base = ioremap(resource->start, resource_size(resource)); in mddi_probe()
679 if (!mddi->base) { in mddi_probe()
690 mddi->irq = resource->start; in mddi_probe()
691 printk(KERN_INFO "mddi: init() base=0x%p irq=%d\n", mddi->base, in mddi_probe()
692 mddi->irq); in mddi_probe()
693 mddi->power_client = pdata->power_client; in mddi_probe()
695 mutex_init(&mddi->reg_write_lock); in mddi_probe()
696 mutex_init(&mddi->reg_read_lock); in mddi_probe()
697 spin_lock_init(&mddi->int_lock); in mddi_probe()
698 init_waitqueue_head(&mddi->int_wait); in mddi_probe()
700 ret = mddi_clk_setup(pdev, mddi, pdata->clk_rate); in mddi_probe()
706 ret = mddi_rev_data_setup(mddi); in mddi_probe()
712 mddi->int_enable = 0; in mddi_probe()
713 mddi_writel(mddi->int_enable, INTEN); in mddi_probe()
714 ret = request_irq(mddi->irq, mddi_isr, 0, "mddi", in mddi_probe()
715 &mddi->client_data); in mddi_probe()
722 if (mddi->power_client) in mddi_probe()
723 mddi->power_client(&mddi->client_data, 1); in mddi_probe()
726 mddi_set_auto_hibernate(&mddi->client_data, 0); in mddi_probe()
728 mddi_wait_interrupt(mddi, MDDI_INT_NO_CMD_PKTS_PEND); in mddi_probe()
729 mddi->version = mddi_init_registers(mddi); in mddi_probe()
730 if (mddi->version < 0x20) { in mddi_probe()
732 mddi->version); in mddi_probe()
738 if (!mddi_get_client_caps(mddi)) { in mddi_probe()
747 mddi_set_auto_hibernate(&mddi->client_data, 1); in mddi_probe()
749 if (mddi->caps.Mfr_Name == 0 && mddi->caps.Product_Code == 0) in mddi_probe()
750 pdata->fixup(&mddi->caps.Mfr_Name, &mddi->caps.Product_Code); in mddi_probe()
752 mddi->client_pdev.id = 0; in mddi_probe()
755 (mddi->caps.Mfr_Name << 16 | mddi->caps.Product_Code)) { in mddi_probe()
756 mddi->client_data.private_client_data = in mddi_probe()
758 mddi->client_pdev.name = in mddi_probe()
760 mddi->client_pdev.id = in mddi_probe()
768 mddi->client_pdev.name = "mddi_c_dummy"; in mddi_probe()
770 mddi->client_pdev.name); in mddi_probe()
772 mddi->client_data.suspend = mddi_suspend; in mddi_probe()
773 mddi->client_data.resume = mddi_resume; in mddi_probe()
774 mddi->client_data.activate_link = mddi_activate_link; in mddi_probe()
775 mddi->client_data.remote_write = mddi_remote_write; in mddi_probe()
776 mddi->client_data.remote_read = mddi_remote_read; in mddi_probe()
777 mddi->client_data.auto_hibernate = mddi_set_auto_hibernate; in mddi_probe()
778 mddi->client_data.fb_resource = pdata->fb_resource; in mddi_probe()
780 mddi->client_data.interface_type = MSM_MDDI_PMDH_INTERFACE; in mddi_probe()
782 mddi->client_data.interface_type = MSM_MDDI_EMDH_INTERFACE; in mddi_probe()
790 mddi->client_pdev.dev.platform_data = &mddi->client_data; in mddi_probe()
791 printk(KERN_INFO "mddi: publish: %s\n", mddi->client_name); in mddi_probe()
792 platform_device_register(&mddi->client_pdev); in mddi_probe()
797 free_irq(mddi->irq, 0); in mddi_probe()
799 dma_free_coherent(NULL, 0x1000, mddi->rev_data, mddi->rev_addr); in mddi_probe()
803 iounmap(mddi->base); in mddi_probe()