Lines Matching refs:hdq_data
58 struct hdq_data { struct
110 static inline u8 hdq_reg_in(struct hdq_data *hdq_data, u32 offset) in hdq_reg_in() argument
112 return __raw_readl(hdq_data->hdq_base + offset); in hdq_reg_in()
115 static inline void hdq_reg_out(struct hdq_data *hdq_data, u32 offset, u8 val) in hdq_reg_out() argument
117 __raw_writel(val, hdq_data->hdq_base + offset); in hdq_reg_out()
120 static inline u8 hdq_reg_merge(struct hdq_data *hdq_data, u32 offset, in hdq_reg_merge() argument
123 u8 new_val = (__raw_readl(hdq_data->hdq_base + offset) & ~mask) in hdq_reg_merge()
125 __raw_writel(new_val, hdq_data->hdq_base + offset); in hdq_reg_merge()
130 static void hdq_disable_interrupt(struct hdq_data *hdq_data, u32 offset, in hdq_disable_interrupt() argument
135 ie = readl(hdq_data->hdq_base + offset); in hdq_disable_interrupt()
136 writel(ie & mask, hdq_data->hdq_base + offset); in hdq_disable_interrupt()
145 static int hdq_wait_for_flag(struct hdq_data *hdq_data, u32 offset, in hdq_wait_for_flag() argument
153 while (((*status = hdq_reg_in(hdq_data, offset)) & flag) in hdq_wait_for_flag()
161 while (!((*status = hdq_reg_in(hdq_data, offset)) & flag) in hdq_wait_for_flag()
174 static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status) in hdq_write_byte() argument
182 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); in hdq_write_byte()
184 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in hdq_write_byte()
186 hdq_data->hdq_irqstatus = 0; in hdq_write_byte()
187 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); in hdq_write_byte()
189 hdq_reg_out(hdq_data, OMAP_HDQ_TX_DATA, val); in hdq_write_byte()
192 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, OMAP_HDQ_CTRL_STATUS_GO, in hdq_write_byte()
196 hdq_data->hdq_irqstatus, OMAP_HDQ_TIMEOUT); in hdq_write_byte()
198 dev_dbg(hdq_data->dev, "TX wait elapsed\n"); in hdq_write_byte()
203 *status = hdq_data->hdq_irqstatus; in hdq_write_byte()
206 dev_dbg(hdq_data->dev, "timeout waiting for" in hdq_write_byte()
213 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, in hdq_write_byte()
217 dev_dbg(hdq_data->dev, "timeout waiting GO bit" in hdq_write_byte()
228 struct hdq_data *hdq_data = _hdq; in hdq_isr() local
231 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); in hdq_isr()
232 hdq_data->hdq_irqstatus = hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in hdq_isr()
233 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); in hdq_isr()
234 dev_dbg(hdq_data->dev, "hdq_isr: %x", hdq_data->hdq_irqstatus); in hdq_isr()
236 if (hdq_data->hdq_irqstatus & in hdq_isr()
268 static int _omap_hdq_reset(struct hdq_data *hdq_data) in _omap_hdq_reset() argument
273 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in _omap_hdq_reset()
281 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, in _omap_hdq_reset()
286 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_SYSSTATUS, in _omap_hdq_reset()
289 dev_dbg(hdq_data->dev, "timeout waiting HDQ reset, %x", in _omap_hdq_reset()
292 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, in _omap_hdq_reset()
295 hdq_data->mode); in _omap_hdq_reset()
296 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in _omap_hdq_reset()
304 static int omap_hdq_break(struct hdq_data *hdq_data) in omap_hdq_break() argument
310 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_hdq_break()
312 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_hdq_break()
317 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); in omap_hdq_break()
319 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in omap_hdq_break()
321 hdq_data->hdq_irqstatus = 0; in omap_hdq_break()
322 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); in omap_hdq_break()
325 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_hdq_break()
332 hdq_data->hdq_irqstatus, OMAP_HDQ_TIMEOUT); in omap_hdq_break()
334 dev_dbg(hdq_data->dev, "break wait elapsed\n"); in omap_hdq_break()
339 tmp_status = hdq_data->hdq_irqstatus; in omap_hdq_break()
342 dev_dbg(hdq_data->dev, "timeout waiting for TIMEOUT, %x", in omap_hdq_break()
352 if (!(hdq_reg_in(hdq_data, OMAP_HDQ_CTRL_STATUS) & in omap_hdq_break()
354 dev_dbg(hdq_data->dev, "Presence bit not set\n"); in omap_hdq_break()
363 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_hdq_break()
368 dev_dbg(hdq_data->dev, "timeout waiting INIT&GO bits" in omap_hdq_break()
372 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_break()
377 static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val) in hdq_read_byte() argument
382 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in hdq_read_byte()
388 if (!hdq_data->hdq_usecount) { in hdq_read_byte()
393 hdq_data->hdq_irqstatus = 0; in hdq_read_byte()
395 if (!(hdq_data->hdq_irqstatus & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) { in hdq_read_byte()
396 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, in hdq_read_byte()
403 (hdq_data->hdq_irqstatus in hdq_read_byte()
407 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, 0, in hdq_read_byte()
409 status = hdq_data->hdq_irqstatus; in hdq_read_byte()
412 dev_dbg(hdq_data->dev, "timeout waiting for" in hdq_read_byte()
419 *val = hdq_reg_in(hdq_data, OMAP_HDQ_RX_DATA); in hdq_read_byte()
421 mutex_unlock(&hdq_data->hdq_mutex); in hdq_read_byte()
428 static int omap_hdq_get(struct hdq_data *hdq_data) in omap_hdq_get() argument
432 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_hdq_get()
438 if (OMAP_HDQ_MAX_USER == hdq_data->hdq_usecount) { in omap_hdq_get()
439 dev_dbg(hdq_data->dev, "attempt to exceed the max use count"); in omap_hdq_get()
443 hdq_data->hdq_usecount++; in omap_hdq_get()
445 if (1 == hdq_data->hdq_usecount) { in omap_hdq_get()
447 pm_runtime_get_sync(hdq_data->dev); in omap_hdq_get()
450 if (!(hdq_reg_in(hdq_data, OMAP_HDQ_SYSSTATUS) & in omap_hdq_get()
452 ret = _omap_hdq_reset(hdq_data); in omap_hdq_get()
455 hdq_data->hdq_usecount--; in omap_hdq_get()
458 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_hdq_get()
461 hdq_data->mode); in omap_hdq_get()
462 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in omap_hdq_get()
464 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in omap_hdq_get()
470 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_get()
476 static int omap_hdq_put(struct hdq_data *hdq_data) in omap_hdq_put() argument
480 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_hdq_put()
484 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in omap_hdq_put()
486 if (0 == hdq_data->hdq_usecount) { in omap_hdq_put()
487 dev_dbg(hdq_data->dev, "attempt to decrement use count" in omap_hdq_put()
491 hdq_data->hdq_usecount--; in omap_hdq_put()
493 if (0 == hdq_data->hdq_usecount) in omap_hdq_put()
494 pm_runtime_put_sync(hdq_data->dev); in omap_hdq_put()
496 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_put()
510 struct hdq_data *hdq_data = _hdq; in omap_w1_triplet() local
517 err = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_triplet()
519 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_triplet()
523 hdq_data->hdq_irqstatus = 0; in omap_w1_triplet()
528 (hdq_data->hdq_irqstatus in omap_w1_triplet()
532 dev_dbg(hdq_data->dev, "RX wait elapsed\n"); in omap_w1_triplet()
537 hdq_data->hdq_irqstatus = 0; in omap_w1_triplet()
542 (hdq_data->hdq_irqstatus in omap_w1_triplet()
546 dev_dbg(hdq_data->dev, "RX wait elapsed\n"); in omap_w1_triplet()
568 (hdq_data->hdq_irqstatus in omap_w1_triplet()
572 dev_dbg(hdq_data->dev, "TX wait elapsed\n"); in omap_w1_triplet()
580 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_triplet()
598 struct hdq_data *hdq_data = _hdq; in omap_w1_read_byte() local
603 if (hdq_data->init_trans == 0) in omap_w1_read_byte()
604 omap_hdq_get(hdq_data); in omap_w1_read_byte()
606 ret = hdq_read_byte(hdq_data, &val); in omap_w1_read_byte()
608 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_read_byte()
610 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_read_byte()
613 hdq_data->init_trans = 0; in omap_w1_read_byte()
614 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_read_byte()
615 omap_hdq_put(hdq_data); in omap_w1_read_byte()
619 hdq_disable_interrupt(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_w1_read_byte()
621 hdq_data->hdq_usecount = 0; in omap_w1_read_byte()
624 if (hdq_data->init_trans) { in omap_w1_read_byte()
625 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_read_byte()
627 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_read_byte()
630 hdq_data->init_trans = 0; in omap_w1_read_byte()
631 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_read_byte()
632 omap_hdq_put(hdq_data); in omap_w1_read_byte()
641 struct hdq_data *hdq_data = _hdq; in omap_w1_write_byte() local
646 if (hdq_data->init_trans == 0) in omap_w1_write_byte()
647 omap_hdq_get(hdq_data); in omap_w1_write_byte()
655 omap_hdq_break(hdq_data); in omap_w1_write_byte()
657 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_write_byte()
659 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_write_byte()
662 hdq_data->init_trans++; in omap_w1_write_byte()
663 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_write_byte()
665 ret = hdq_write_byte(hdq_data, byte, &status); in omap_w1_write_byte()
667 dev_dbg(hdq_data->dev, "TX failure:Ctrl status %x\n", status); in omap_w1_write_byte()
672 if (hdq_data->init_trans > 1) { in omap_w1_write_byte()
673 omap_hdq_put(hdq_data); in omap_w1_write_byte()
674 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_write_byte()
676 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_write_byte()
679 hdq_data->init_trans = 0; in omap_w1_write_byte()
680 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_write_byte()
687 struct hdq_data *hdq_data; in omap_hdq_probe() local
693 hdq_data = devm_kzalloc(dev, sizeof(*hdq_data), GFP_KERNEL); in omap_hdq_probe()
694 if (!hdq_data) { in omap_hdq_probe()
699 hdq_data->dev = dev; in omap_hdq_probe()
700 platform_set_drvdata(pdev, hdq_data); in omap_hdq_probe()
703 hdq_data->hdq_base = devm_ioremap_resource(dev, res); in omap_hdq_probe()
704 if (IS_ERR(hdq_data->hdq_base)) in omap_hdq_probe()
705 return PTR_ERR(hdq_data->hdq_base); in omap_hdq_probe()
707 hdq_data->hdq_usecount = 0; in omap_hdq_probe()
708 hdq_data->rrw = 0; in omap_hdq_probe()
709 mutex_init(&hdq_data->hdq_mutex); in omap_hdq_probe()
718 ret = _omap_hdq_reset(hdq_data); in omap_hdq_probe()
724 rev = hdq_reg_in(hdq_data, OMAP_HDQ_REVISION); in omap_hdq_probe()
728 spin_lock_init(&hdq_data->hdq_spinlock); in omap_hdq_probe()
736 ret = devm_request_irq(dev, irq, hdq_isr, 0, "omap_hdq", hdq_data); in omap_hdq_probe()
742 omap_hdq_break(hdq_data); in omap_hdq_probe()
748 hdq_data->mode = 0; in omap_hdq_probe()
751 hdq_data->mode = 1; in omap_hdq_probe()
755 omap_w1_master.data = hdq_data; in omap_hdq_probe()
775 struct hdq_data *hdq_data = platform_get_drvdata(pdev); in omap_hdq_remove() local
777 mutex_lock(&hdq_data->hdq_mutex); in omap_hdq_remove()
779 if (hdq_data->hdq_usecount) { in omap_hdq_remove()
781 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_remove()
785 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_remove()