Lines Matching refs:hdq_data
55 struct hdq_data { struct
105 static inline u8 hdq_reg_in(struct hdq_data *hdq_data, u32 offset) in hdq_reg_in() argument
107 return __raw_readl(hdq_data->hdq_base + offset); in hdq_reg_in()
110 static inline void hdq_reg_out(struct hdq_data *hdq_data, u32 offset, u8 val) in hdq_reg_out() argument
112 __raw_writel(val, hdq_data->hdq_base + offset); in hdq_reg_out()
115 static inline u8 hdq_reg_merge(struct hdq_data *hdq_data, u32 offset, in hdq_reg_merge() argument
118 u8 new_val = (__raw_readl(hdq_data->hdq_base + offset) & ~mask) in hdq_reg_merge()
120 __raw_writel(new_val, hdq_data->hdq_base + offset); in hdq_reg_merge()
131 static int hdq_wait_for_flag(struct hdq_data *hdq_data, u32 offset, in hdq_wait_for_flag() argument
139 while (((*status = hdq_reg_in(hdq_data, offset)) & flag) in hdq_wait_for_flag()
147 while (!((*status = hdq_reg_in(hdq_data, offset)) & flag) in hdq_wait_for_flag()
160 static int hdq_write_byte(struct hdq_data *hdq_data, u8 val, u8 *status) in hdq_write_byte() argument
168 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); in hdq_write_byte()
170 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in hdq_write_byte()
172 hdq_data->hdq_irqstatus = 0; in hdq_write_byte()
173 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); in hdq_write_byte()
175 hdq_reg_out(hdq_data, OMAP_HDQ_TX_DATA, val); in hdq_write_byte()
178 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, OMAP_HDQ_CTRL_STATUS_GO, in hdq_write_byte()
182 hdq_data->hdq_irqstatus, OMAP_HDQ_TIMEOUT); in hdq_write_byte()
184 dev_dbg(hdq_data->dev, "TX wait elapsed\n"); in hdq_write_byte()
189 *status = hdq_data->hdq_irqstatus; in hdq_write_byte()
192 dev_dbg(hdq_data->dev, "timeout waiting for" in hdq_write_byte()
199 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, in hdq_write_byte()
203 dev_dbg(hdq_data->dev, "timeout waiting GO bit" in hdq_write_byte()
214 struct hdq_data *hdq_data = _hdq; in hdq_isr() local
217 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); in hdq_isr()
218 hdq_data->hdq_irqstatus = hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in hdq_isr()
219 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); in hdq_isr()
220 dev_dbg(hdq_data->dev, "hdq_isr: %x", hdq_data->hdq_irqstatus); in hdq_isr()
222 if (hdq_data->hdq_irqstatus & in hdq_isr()
260 static int _omap_hdq_reset(struct hdq_data *hdq_data) in _omap_hdq_reset() argument
265 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, OMAP_HDQ_SYSCONFIG_SOFTRESET); in _omap_hdq_reset()
272 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, in _omap_hdq_reset()
277 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_SYSSTATUS, in _omap_hdq_reset()
280 dev_dbg(hdq_data->dev, "timeout waiting HDQ reset, %x", in _omap_hdq_reset()
283 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, in _omap_hdq_reset()
286 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in _omap_hdq_reset()
294 static int omap_hdq_break(struct hdq_data *hdq_data) in omap_hdq_break() argument
300 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_hdq_break()
302 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_hdq_break()
307 spin_lock_irqsave(&hdq_data->hdq_spinlock, irqflags); in omap_hdq_break()
309 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in omap_hdq_break()
311 hdq_data->hdq_irqstatus = 0; in omap_hdq_break()
312 spin_unlock_irqrestore(&hdq_data->hdq_spinlock, irqflags); in omap_hdq_break()
315 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_hdq_break()
322 hdq_data->hdq_irqstatus, OMAP_HDQ_TIMEOUT); in omap_hdq_break()
324 dev_dbg(hdq_data->dev, "break wait elapsed\n"); in omap_hdq_break()
329 tmp_status = hdq_data->hdq_irqstatus; in omap_hdq_break()
332 dev_dbg(hdq_data->dev, "timeout waiting for TIMEOUT, %x", in omap_hdq_break()
341 ret = hdq_wait_for_flag(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_hdq_break()
346 dev_dbg(hdq_data->dev, "timeout waiting INIT&GO bits" in omap_hdq_break()
350 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_break()
355 static int hdq_read_byte(struct hdq_data *hdq_data, u8 *val) in hdq_read_byte() argument
360 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in hdq_read_byte()
366 if (!hdq_data->hdq_usecount) { in hdq_read_byte()
371 if (!(hdq_data->hdq_irqstatus & OMAP_HDQ_INT_STATUS_RXCOMPLETE)) { in hdq_read_byte()
372 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, in hdq_read_byte()
379 (hdq_data->hdq_irqstatus in hdq_read_byte()
383 hdq_reg_merge(hdq_data, OMAP_HDQ_CTRL_STATUS, 0, in hdq_read_byte()
385 status = hdq_data->hdq_irqstatus; in hdq_read_byte()
388 dev_dbg(hdq_data->dev, "timeout waiting for" in hdq_read_byte()
395 *val = hdq_reg_in(hdq_data, OMAP_HDQ_RX_DATA); in hdq_read_byte()
397 mutex_unlock(&hdq_data->hdq_mutex); in hdq_read_byte()
404 static int omap_hdq_get(struct hdq_data *hdq_data) in omap_hdq_get() argument
408 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_hdq_get()
414 if (OMAP_HDQ_MAX_USER == hdq_data->hdq_usecount) { in omap_hdq_get()
415 dev_dbg(hdq_data->dev, "attempt to exceed the max use count"); in omap_hdq_get()
419 hdq_data->hdq_usecount++; in omap_hdq_get()
421 if (1 == hdq_data->hdq_usecount) { in omap_hdq_get()
423 pm_runtime_get_sync(hdq_data->dev); in omap_hdq_get()
426 if (!(hdq_reg_in(hdq_data, OMAP_HDQ_SYSSTATUS) & in omap_hdq_get()
428 ret = _omap_hdq_reset(hdq_data); in omap_hdq_get()
431 hdq_data->hdq_usecount--; in omap_hdq_get()
434 hdq_reg_out(hdq_data, OMAP_HDQ_CTRL_STATUS, in omap_hdq_get()
437 hdq_reg_out(hdq_data, OMAP_HDQ_SYSCONFIG, in omap_hdq_get()
439 hdq_reg_in(hdq_data, OMAP_HDQ_INT_STATUS); in omap_hdq_get()
445 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_get()
451 static int omap_hdq_put(struct hdq_data *hdq_data) in omap_hdq_put() argument
455 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_hdq_put()
459 if (0 == hdq_data->hdq_usecount) { in omap_hdq_put()
460 dev_dbg(hdq_data->dev, "attempt to decrement use count" in omap_hdq_put()
464 hdq_data->hdq_usecount--; in omap_hdq_put()
466 if (0 == hdq_data->hdq_usecount) in omap_hdq_put()
467 pm_runtime_put_sync(hdq_data->dev); in omap_hdq_put()
469 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_put()
477 struct hdq_data *hdq_data = _hdq; in omap_w1_read_byte() local
481 ret = hdq_read_byte(hdq_data, &val); in omap_w1_read_byte()
483 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_read_byte()
485 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_read_byte()
488 hdq_data->init_trans = 0; in omap_w1_read_byte()
489 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_read_byte()
490 omap_hdq_put(hdq_data); in omap_w1_read_byte()
495 if (hdq_data->init_trans) { in omap_w1_read_byte()
496 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_read_byte()
498 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_read_byte()
501 hdq_data->init_trans = 0; in omap_w1_read_byte()
502 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_read_byte()
503 omap_hdq_put(hdq_data); in omap_w1_read_byte()
512 struct hdq_data *hdq_data = _hdq; in omap_w1_write_byte() local
517 if (hdq_data->init_trans == 0) in omap_w1_write_byte()
518 omap_hdq_get(hdq_data); in omap_w1_write_byte()
520 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_write_byte()
522 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_write_byte()
525 hdq_data->init_trans++; in omap_w1_write_byte()
526 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_write_byte()
528 ret = hdq_write_byte(hdq_data, byte, &status); in omap_w1_write_byte()
530 dev_dbg(hdq_data->dev, "TX failure:Ctrl status %x\n", status); in omap_w1_write_byte()
535 if (hdq_data->init_trans > 1) { in omap_w1_write_byte()
536 omap_hdq_put(hdq_data); in omap_w1_write_byte()
537 ret = mutex_lock_interruptible(&hdq_data->hdq_mutex); in omap_w1_write_byte()
539 dev_dbg(hdq_data->dev, "Could not acquire mutex\n"); in omap_w1_write_byte()
542 hdq_data->init_trans = 0; in omap_w1_write_byte()
543 mutex_unlock(&hdq_data->hdq_mutex); in omap_w1_write_byte()
550 struct hdq_data *hdq_data; in omap_hdq_probe() local
555 hdq_data = devm_kzalloc(dev, sizeof(*hdq_data), GFP_KERNEL); in omap_hdq_probe()
556 if (!hdq_data) { in omap_hdq_probe()
561 hdq_data->dev = dev; in omap_hdq_probe()
562 platform_set_drvdata(pdev, hdq_data); in omap_hdq_probe()
565 hdq_data->hdq_base = devm_ioremap_resource(dev, res); in omap_hdq_probe()
566 if (IS_ERR(hdq_data->hdq_base)) in omap_hdq_probe()
567 return PTR_ERR(hdq_data->hdq_base); in omap_hdq_probe()
569 hdq_data->hdq_usecount = 0; in omap_hdq_probe()
570 mutex_init(&hdq_data->hdq_mutex); in omap_hdq_probe()
575 rev = hdq_reg_in(hdq_data, OMAP_HDQ_REVISION); in omap_hdq_probe()
579 spin_lock_init(&hdq_data->hdq_spinlock); in omap_hdq_probe()
587 ret = devm_request_irq(dev, irq, hdq_isr, 0, "omap_hdq", hdq_data); in omap_hdq_probe()
593 omap_hdq_break(hdq_data); in omap_hdq_probe()
597 omap_w1_master.data = hdq_data; in omap_hdq_probe()
617 struct hdq_data *hdq_data = platform_get_drvdata(pdev); in omap_hdq_remove() local
619 mutex_lock(&hdq_data->hdq_mutex); in omap_hdq_remove()
621 if (hdq_data->hdq_usecount) { in omap_hdq_remove()
623 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_remove()
627 mutex_unlock(&hdq_data->hdq_mutex); in omap_hdq_remove()