Lines Matching refs:cec

52 static inline u32 cec_read(struct tegra_cec *cec, u32 reg)  in cec_read()  argument
54 return readl(cec->cec_base + reg); in cec_read()
57 static inline void cec_write(struct tegra_cec *cec, u32 reg, u32 val) in cec_write() argument
59 writel(val, cec->cec_base + reg); in cec_write()
62 static void tegra_cec_error_recovery(struct tegra_cec *cec) in tegra_cec_error_recovery() argument
66 hw_ctrl = cec_read(cec, TEGRA_CEC_HW_CONTROL); in tegra_cec_error_recovery()
67 cec_write(cec, TEGRA_CEC_HW_CONTROL, 0); in tegra_cec_error_recovery()
68 cec_write(cec, TEGRA_CEC_INT_STAT, 0xffffffff); in tegra_cec_error_recovery()
69 cec_write(cec, TEGRA_CEC_HW_CONTROL, hw_ctrl); in tegra_cec_error_recovery()
75 struct tegra_cec *cec = dev_get_drvdata(dev); in tegra_cec_irq_thread_handler() local
77 if (cec->tx_done) { in tegra_cec_irq_thread_handler()
78 cec_transmit_attempt_done(cec->adap, cec->tx_status); in tegra_cec_irq_thread_handler()
79 cec->tx_done = false; in tegra_cec_irq_thread_handler()
81 if (cec->rx_done) { in tegra_cec_irq_thread_handler()
84 msg.len = cec->rx_buf_cnt; in tegra_cec_irq_thread_handler()
85 memcpy(msg.msg, cec->rx_buf, msg.len); in tegra_cec_irq_thread_handler()
86 cec_received_msg(cec->adap, &msg); in tegra_cec_irq_thread_handler()
87 cec->rx_done = false; in tegra_cec_irq_thread_handler()
88 cec->rx_buf_cnt = 0; in tegra_cec_irq_thread_handler()
96 struct tegra_cec *cec = dev_get_drvdata(dev); in tegra_cec_irq_handler() local
99 status = cec_read(cec, TEGRA_CEC_INT_STAT); in tegra_cec_irq_handler()
100 mask = cec_read(cec, TEGRA_CEC_INT_MASK); in tegra_cec_irq_handler()
110 tegra_cec_error_recovery(cec); in tegra_cec_irq_handler()
111 cec_write(cec, TEGRA_CEC_INT_MASK, in tegra_cec_irq_handler()
114 cec->tx_done = true; in tegra_cec_irq_handler()
115 cec->tx_status = CEC_TX_STATUS_ERROR; in tegra_cec_irq_handler()
121 tegra_cec_error_recovery(cec); in tegra_cec_irq_handler()
122 cec_write(cec, TEGRA_CEC_INT_MASK, in tegra_cec_irq_handler()
125 cec->tx_done = true; in tegra_cec_irq_handler()
127 cec->tx_status = CEC_TX_STATUS_LOW_DRIVE; in tegra_cec_irq_handler()
129 cec->tx_status = CEC_TX_STATUS_ARB_LOST; in tegra_cec_irq_handler()
134 cec_write(cec, TEGRA_CEC_INT_STAT, in tegra_cec_irq_handler()
138 tegra_cec_error_recovery(cec); in tegra_cec_irq_handler()
140 cec->tx_done = true; in tegra_cec_irq_handler()
141 cec->tx_status = CEC_TX_STATUS_NACK; in tegra_cec_irq_handler()
143 cec->tx_done = true; in tegra_cec_irq_handler()
144 cec->tx_status = CEC_TX_STATUS_OK; in tegra_cec_irq_handler()
153 if (cec->tx_buf_cur == cec->tx_buf_cnt) { in tegra_cec_irq_handler()
154 cec_write(cec, TEGRA_CEC_INT_MASK, in tegra_cec_irq_handler()
157 cec_write(cec, TEGRA_CEC_TX_REGISTER, in tegra_cec_irq_handler()
158 cec->tx_buf[cec->tx_buf_cur++]); in tegra_cec_irq_handler()
159 cec_write(cec, TEGRA_CEC_INT_STAT, in tegra_cec_irq_handler()
165 cec_write(cec, TEGRA_CEC_INT_STAT, in tegra_cec_irq_handler()
167 cec->rx_done = false; in tegra_cec_irq_handler()
168 cec->rx_buf_cnt = 0; in tegra_cec_irq_handler()
173 cec_write(cec, TEGRA_CEC_INT_STAT, in tegra_cec_irq_handler()
175 v = cec_read(cec, TEGRA_CEC_RX_REGISTER); in tegra_cec_irq_handler()
176 if (cec->rx_buf_cnt < CEC_MAX_MSG_SIZE) in tegra_cec_irq_handler()
177 cec->rx_buf[cec->rx_buf_cnt++] = v & 0xff; in tegra_cec_irq_handler()
179 cec->rx_done = true; in tegra_cec_irq_handler()
189 struct tegra_cec *cec = adap->priv; in tegra_cec_adap_enable() local
191 cec->rx_buf_cnt = 0; in tegra_cec_adap_enable()
192 cec->tx_buf_cnt = 0; in tegra_cec_adap_enable()
193 cec->tx_buf_cur = 0; in tegra_cec_adap_enable()
195 cec_write(cec, TEGRA_CEC_HW_CONTROL, 0); in tegra_cec_adap_enable()
196 cec_write(cec, TEGRA_CEC_INT_MASK, 0); in tegra_cec_adap_enable()
197 cec_write(cec, TEGRA_CEC_INT_STAT, 0xffffffff); in tegra_cec_adap_enable()
198 cec_write(cec, TEGRA_CEC_SW_CONTROL, 0); in tegra_cec_adap_enable()
203 cec_write(cec, TEGRA_CEC_INPUT_FILTER, (1U << 31) | 0x20); in tegra_cec_adap_enable()
205 cec_write(cec, TEGRA_CEC_RX_TIMING_0, in tegra_cec_adap_enable()
211 cec_write(cec, TEGRA_CEC_RX_TIMING_1, in tegra_cec_adap_enable()
217 cec_write(cec, TEGRA_CEC_RX_TIMING_2, in tegra_cec_adap_enable()
220 cec_write(cec, TEGRA_CEC_TX_TIMING_0, in tegra_cec_adap_enable()
226 cec_write(cec, TEGRA_CEC_TX_TIMING_1, in tegra_cec_adap_enable()
232 cec_write(cec, TEGRA_CEC_TX_TIMING_2, in tegra_cec_adap_enable()
237 cec_write(cec, TEGRA_CEC_INT_MASK, in tegra_cec_adap_enable()
246 cec_write(cec, TEGRA_CEC_HW_CONTROL, TEGRA_CEC_HWCTRL_TX_RX_MODE); in tegra_cec_adap_enable()
252 struct tegra_cec *cec = adap->priv; in tegra_cec_adap_log_addr() local
253 u32 state = cec_read(cec, TEGRA_CEC_HW_CONTROL); in tegra_cec_adap_log_addr()
260 cec_write(cec, TEGRA_CEC_HW_CONTROL, state); in tegra_cec_adap_log_addr()
267 struct tegra_cec *cec = adap->priv; in tegra_cec_adap_monitor_all_enable() local
268 u32 reg = cec_read(cec, TEGRA_CEC_HW_CONTROL); in tegra_cec_adap_monitor_all_enable()
274 cec_write(cec, TEGRA_CEC_HW_CONTROL, reg); in tegra_cec_adap_monitor_all_enable()
282 struct tegra_cec *cec = adap->priv; in tegra_cec_adap_transmit() local
290 cec->tx_buf_cur = 0; in tegra_cec_adap_transmit()
291 cec->tx_buf_cnt = msg->len; in tegra_cec_adap_transmit()
294 cec->tx_buf[i] = mode | msg->msg[i]; in tegra_cec_adap_transmit()
296 cec->tx_buf[i] |= TEGRA_CEC_TX_REG_START_BIT; in tegra_cec_adap_transmit()
298 cec->tx_buf[i] |= TEGRA_CEC_TX_REG_EOM; in tegra_cec_adap_transmit()
300 cec->tx_buf[i] |= TEGRA_CEC_TX_REG_RETRY; in tegra_cec_adap_transmit()
303 mask = cec_read(cec, TEGRA_CEC_INT_MASK); in tegra_cec_adap_transmit()
304 cec_write(cec, TEGRA_CEC_INT_MASK, in tegra_cec_adap_transmit()
320 struct tegra_cec *cec; in tegra_cec_probe() local
329 cec = devm_kzalloc(&pdev->dev, sizeof(struct tegra_cec), GFP_KERNEL); in tegra_cec_probe()
331 if (!cec) in tegra_cec_probe()
349 cec->tegra_cec_irq = platform_get_irq(pdev, 0); in tegra_cec_probe()
351 if (cec->tegra_cec_irq <= 0) in tegra_cec_probe()
354 cec->cec_base = devm_ioremap(&pdev->dev, res->start, in tegra_cec_probe()
357 if (!cec->cec_base) { in tegra_cec_probe()
362 cec->clk = devm_clk_get(&pdev->dev, "cec"); in tegra_cec_probe()
364 if (IS_ERR_OR_NULL(cec->clk)) { in tegra_cec_probe()
369 ret = clk_prepare_enable(cec->clk); in tegra_cec_probe()
376 cec->dev = &pdev->dev; in tegra_cec_probe()
378 platform_set_drvdata(pdev, cec); in tegra_cec_probe()
380 ret = devm_request_threaded_irq(&pdev->dev, cec->tegra_cec_irq, in tegra_cec_probe()
390 cec->adap = cec_allocate_adapter(&tegra_cec_ops, cec, TEGRA_CEC_NAME, in tegra_cec_probe()
394 if (IS_ERR(cec->adap)) { in tegra_cec_probe()
400 cec->notifier = cec_notifier_cec_adap_register(hdmi_dev, NULL, in tegra_cec_probe()
401 cec->adap); in tegra_cec_probe()
402 if (!cec->notifier) { in tegra_cec_probe()
407 ret = cec_register_adapter(cec->adap, &pdev->dev); in tegra_cec_probe()
416 cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); in tegra_cec_probe()
418 cec_delete_adapter(cec->adap); in tegra_cec_probe()
420 clk_disable_unprepare(cec->clk); in tegra_cec_probe()
426 struct tegra_cec *cec = platform_get_drvdata(pdev); in tegra_cec_remove() local
428 clk_disable_unprepare(cec->clk); in tegra_cec_remove()
430 cec_notifier_cec_adap_unregister(cec->notifier, cec->adap); in tegra_cec_remove()
431 cec_unregister_adapter(cec->adap); in tegra_cec_remove()
439 struct tegra_cec *cec = platform_get_drvdata(pdev); in tegra_cec_suspend() local
441 clk_disable_unprepare(cec->clk); in tegra_cec_suspend()
449 struct tegra_cec *cec = platform_get_drvdata(pdev); in tegra_cec_resume() local
453 return clk_prepare_enable(cec->clk); in tegra_cec_resume()