Lines Matching refs:hdq_data

60 struct hdq_data {  struct
82 static inline u8 hdq_reg_in(struct hdq_data *hdq_data, u32 offset) in hdq_reg_in() argument
84 return __raw_readl(hdq_data->hdq_base + offset); in hdq_reg_in()
87 static inline void hdq_reg_out(struct hdq_data *hdq_data, u32 offset, u8 val) in hdq_reg_out() argument
89 __raw_writel(val, hdq_data->hdq_base + offset); in hdq_reg_out()
92 static inline u8 hdq_reg_merge(struct hdq_data *hdq_data, u32 offset, in hdq_reg_merge() argument
95 u8 new_val = (__raw_readl(hdq_data->hdq_base + offset) & ~mask) in hdq_reg_merge()
97 __raw_writel(new_val, hdq_data->hdq_base + offset); in hdq_reg_merge()
102 static void hdq_disable_interrupt(struct hdq_data *hdq_data, u32 offset, in hdq_disable_interrupt() argument
107 ie = readl(hdq_data->hdq_base + offset); in hdq_disable_interrupt()
108 writel(ie & mask, hdq_data->hdq_base + offset); in hdq_disable_interrupt()
117 static int hdq_wait_for_flag(struct hdq_data *hdq_data, u32 offset, in hdq_wait_for_flag() argument
125 while (((*status = hdq_reg_in(hdq_data, offset)) & flag) in hdq_wait_for_flag()
133 while (!((*status = hdq_reg_in(hdq_data, offset)) & flag) in hdq_wait_for_flag()
146 static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status) in hdq_write_byte() argument
154 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); in hdq_write_byte()
156 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in hdq_write_byte()
158 hdq_data->hdq_irqstatus = 0; in hdq_write_byte()
159 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); in hdq_write_byte()
161 hdq_reg_out(hdq_data, OMAP_HDQ_TX_DATA, val); in hdq_write_byte()
164 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, OMAP_HDQ_CTRL_STATUS_GO, in hdq_write_byte()
168 hdq_data->hdq_irqstatus, OMAP_HDQ_TIMEOUT); in hdq_write_byte()
170 dev_dbg(hdq_data->dev, "TX wait elapsed\n"); in hdq_write_byte()
175 *status = hdq_data->hdq_irqstatus; in hdq_write_byte()
178 dev_dbg(hdq_data->dev, "timeout waiting for" in hdq_write_byte()
185 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, in hdq_write_byte()
189 dev_dbg(hdq_data->dev, "timeout waiting GO bit" in hdq_write_byte()
200 struct hdq_data *hdq_data = _hdq; in hdq_isr() local
203 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); in hdq_isr()
204 hdq_data->hdq_irqstatus = hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in hdq_isr()
205 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); in hdq_isr()
206 dev_dbg(hdq_data->dev, "hdq_isr: %x", hdq_data->hdq_irqstatus); in hdq_isr()
208 if (hdq_data->hdq_irqstatus & in hdq_isr()
240 static int _omap_hdq_reset(struct hdq_data *hdq_data) in _omap_hdq_reset() argument
245 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in _omap_hdq_reset()
253 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, in _omap_hdq_reset()
258 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_SYSSTATUS, in _omap_hdq_reset()
261 dev_dbg(hdq_data->dev, "timeout waiting HDQ reset, %x", in _omap_hdq_reset()
264 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, in _omap_hdq_reset()
267 hdq_data->mode); in _omap_hdq_reset()
268 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in _omap_hdq_reset()
276 static int omap_hdq_break(struct hdq_data *hdq_data) in omap_hdq_break() argument
282 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_hdq_break()
284 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_hdq_break()
289 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); in omap_hdq_break()
291 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in omap_hdq_break()
293 hdq_data->hdq_irqstatus = 0; in omap_hdq_break()
294 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); in omap_hdq_break()
297 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_hdq_break()
304 hdq_data->hdq_irqstatus, OMAP_HDQ_TIMEOUT); in omap_hdq_break()
306 dev_dbg(hdq_data->dev, "break wait elapsed\n"); in omap_hdq_break()
311 tmp_status = hdq_data->hdq_irqstatus; in omap_hdq_break()
314 dev_dbg(hdq_data->dev, "timeout waiting for TIMEOUT, %x", in omap_hdq_break()
324 if (!(hdq_reg_in(hdq_data, OMAP_HDQ_CTRL_STATUS) & in omap_hdq_break()
326 dev_dbg(hdq_data->dev, "Presence bit not set\n"); in omap_hdq_break()
335 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_hdq_break()
340 dev_dbg(hdq_data->dev, "timeout waiting INIT&GO bits" in omap_hdq_break()
344 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_break()
349 static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val) in hdq_read_byte() argument
354 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in hdq_read_byte()
360 if (!hdq_data->hdq_usecount) { in hdq_read_byte()
365 if (!(hdq_data->hdq_irqstatus & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) { in hdq_read_byte()
366 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, in hdq_read_byte()
373 (hdq_data->hdq_irqstatus in hdq_read_byte()
377 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, 0, in hdq_read_byte()
379 status = hdq_data->hdq_irqstatus; in hdq_read_byte()
382 dev_dbg(hdq_data->dev, "timeout waiting for" in hdq_read_byte()
389 *val = hdq_reg_in(hdq_data, OMAP_HDQ_RX_DATA); in hdq_read_byte()
391 mutex_unlock(&hdq_data->hdq_mutex); in hdq_read_byte()
398 static int omap_hdq_get(struct hdq_data *hdq_data) in omap_hdq_get() argument
402 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_hdq_get()
408 if (OMAP_HDQ_MAX_USER == hdq_data->hdq_usecount) { in omap_hdq_get()
409 dev_dbg(hdq_data->dev, "attempt to exceed the max use count"); in omap_hdq_get()
413 hdq_data->hdq_usecount++; in omap_hdq_get()
415 if (1 == hdq_data->hdq_usecount) { in omap_hdq_get()
417 pm_runtime_get_sync(hdq_data->dev); in omap_hdq_get()
420 if (!(hdq_reg_in(hdq_data, OMAP_HDQ_SYSSTATUS) & in omap_hdq_get()
422 ret = _omap_hdq_reset(hdq_data); in omap_hdq_get()
425 hdq_data->hdq_usecount--; in omap_hdq_get()
428 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_hdq_get()
431 hdq_data->mode); in omap_hdq_get()
432 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in omap_hdq_get()
434 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in omap_hdq_get()
440 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_get()
446 static int omap_hdq_put(struct hdq_data *hdq_data) in omap_hdq_put() argument
450 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_hdq_put()
454 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in omap_hdq_put()
456 if (0 == hdq_data->hdq_usecount) { in omap_hdq_put()
457 dev_dbg(hdq_data->dev, "attempt to decrement use count" in omap_hdq_put()
461 hdq_data->hdq_usecount--; in omap_hdq_put()
463 if (0 == hdq_data->hdq_usecount) in omap_hdq_put()
464 pm_runtime_put_sync(hdq_data->dev); in omap_hdq_put()
466 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_put()
480 struct hdq_data *hdq_data = _hdq; in omap_w1_triplet() local
487 err = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_triplet()
489 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_triplet()
493 hdq_data->hdq_irqstatus = 0; in omap_w1_triplet()
498 (hdq_data->hdq_irqstatus in omap_w1_triplet()
502 dev_dbg(hdq_data->dev, "RX wait elapsed\n"); in omap_w1_triplet()
507 hdq_data->hdq_irqstatus = 0; in omap_w1_triplet()
512 (hdq_data->hdq_irqstatus in omap_w1_triplet()
516 dev_dbg(hdq_data->dev, "RX wait elapsed\n"); in omap_w1_triplet()
538 (hdq_data->hdq_irqstatus in omap_w1_triplet()
542 dev_dbg(hdq_data->dev, "TX wait elapsed\n"); in omap_w1_triplet()
550 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_triplet()
568 struct hdq_data *hdq_data = _hdq; in omap_w1_read_byte() local
573 if (hdq_data->init_trans == 0) in omap_w1_read_byte()
574 omap_hdq_get(hdq_data); in omap_w1_read_byte()
576 ret = hdq_read_byte(hdq_data, &val); in omap_w1_read_byte()
578 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_read_byte()
580 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_read_byte()
583 hdq_data->init_trans = 0; in omap_w1_read_byte()
584 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_read_byte()
585 omap_hdq_put(hdq_data); in omap_w1_read_byte()
589 hdq_disable_interrupt(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_w1_read_byte()
593 if (hdq_data->init_trans) { in omap_w1_read_byte()
594 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_read_byte()
596 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_read_byte()
599 hdq_data->init_trans = 0; in omap_w1_read_byte()
600 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_read_byte()
601 omap_hdq_put(hdq_data); in omap_w1_read_byte()
610 struct hdq_data *hdq_data = _hdq; in omap_w1_write_byte() local
615 if (hdq_data->init_trans == 0) in omap_w1_write_byte()
616 omap_hdq_get(hdq_data); in omap_w1_write_byte()
624 omap_hdq_break(hdq_data); in omap_w1_write_byte()
626 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_write_byte()
628 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_write_byte()
631 hdq_data->init_trans++; in omap_w1_write_byte()
632 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_write_byte()
634 ret = hdq_write_byte(hdq_data, byte, &status); in omap_w1_write_byte()
636 dev_dbg(hdq_data->dev, "TX failure:Ctrl status %x\n", status); in omap_w1_write_byte()
641 if (hdq_data->init_trans > 1) { in omap_w1_write_byte()
642 omap_hdq_put(hdq_data); in omap_w1_write_byte()
643 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_write_byte()
645 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_write_byte()
648 hdq_data->init_trans = 0; in omap_w1_write_byte()
649 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_write_byte()
662 struct hdq_data *hdq_data; in omap_hdq_probe() local
668 hdq_data = devm_kzalloc(dev, sizeof(*hdq_data), GFP_KERNEL); in omap_hdq_probe()
669 if (!hdq_data) { in omap_hdq_probe()
674 hdq_data->dev = dev; in omap_hdq_probe()
675 platform_set_drvdata(pdev, hdq_data); in omap_hdq_probe()
678 hdq_data->hdq_base = devm_ioremap_resource(dev, res); in omap_hdq_probe()
679 if (IS_ERR(hdq_data->hdq_base)) in omap_hdq_probe()
680 return PTR_ERR(hdq_data->hdq_base); in omap_hdq_probe()
682 hdq_data->hdq_usecount = 0; in omap_hdq_probe()
683 hdq_data->rrw = 0; in omap_hdq_probe()
684 mutex_init(&hdq_data->hdq_mutex); in omap_hdq_probe()
693 ret = _omap_hdq_reset(hdq_data); in omap_hdq_probe()
699 rev = hdq_reg_in(hdq_data, OMAP_HDQ_REVISION); in omap_hdq_probe()
703 spin_lock_init(&hdq_data->hdq_spinlock); in omap_hdq_probe()
712 ret = devm_request_irq(dev, irq, hdq_isr, 0, "omap_hdq", hdq_data); in omap_hdq_probe()
718 omap_hdq_break(hdq_data); in omap_hdq_probe()
724 hdq_data->mode = 0; in omap_hdq_probe()
727 hdq_data->mode = 1; in omap_hdq_probe()
731 omap_w1_master.data = hdq_data; in omap_hdq_probe()
751 struct hdq_data *hdq_data = platform_get_drvdata(pdev); in omap_hdq_remove() local
753 mutex_lock(&hdq_data->hdq_mutex); in omap_hdq_remove()
755 if (hdq_data->hdq_usecount) { in omap_hdq_remove()
757 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_remove()
761 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_remove()