Lines Matching refs:cec

79 static void cec_hw_init(struct stm32_cec *cec)  in cec_hw_init()  argument
81 regmap_update_bits(cec->regmap, CEC_CR, TXEOM | TXSOM | CECEN, 0); in cec_hw_init()
83 regmap_update_bits(cec->regmap, CEC_IER, ALL_TX_IT | ALL_RX_IT, in cec_hw_init()
86 regmap_update_bits(cec->regmap, CEC_CFGR, FULL_CFG, FULL_CFG); in cec_hw_init()
89 static void stm32_tx_done(struct stm32_cec *cec, u32 status) in stm32_tx_done() argument
92 cec_transmit_done(cec->adap, CEC_TX_STATUS_ERROR, in stm32_tx_done()
98 cec_transmit_done(cec->adap, CEC_TX_STATUS_ARB_LOST, in stm32_tx_done()
104 cec_transmit_done(cec->adap, CEC_TX_STATUS_NACK, in stm32_tx_done()
109 if (cec->irq_status & TXBR) { in stm32_tx_done()
111 if (cec->tx_cnt < cec->tx_msg.len) in stm32_tx_done()
112 regmap_write(cec->regmap, CEC_TXDR, in stm32_tx_done()
113 cec->tx_msg.msg[cec->tx_cnt++]); in stm32_tx_done()
116 if (cec->tx_cnt == cec->tx_msg.len) in stm32_tx_done()
117 regmap_update_bits(cec->regmap, CEC_CR, TXEOM, TXEOM); in stm32_tx_done()
120 if (cec->irq_status & TXEND) in stm32_tx_done()
121 cec_transmit_done(cec->adap, CEC_TX_STATUS_OK, 0, 0, 0, 0); in stm32_tx_done()
124 static void stm32_rx_done(struct stm32_cec *cec, u32 status) in stm32_rx_done() argument
126 if (cec->irq_status & (RXACKE | RXOVR)) { in stm32_rx_done()
127 cec->rx_msg.len = 0; in stm32_rx_done()
131 if (cec->irq_status & RXBR) { in stm32_rx_done()
134 regmap_read(cec->regmap, CEC_RXDR, &val); in stm32_rx_done()
135 cec->rx_msg.msg[cec->rx_msg.len++] = val & 0xFF; in stm32_rx_done()
138 if (cec->irq_status & RXEND) { in stm32_rx_done()
139 cec_received_msg(cec->adap, &cec->rx_msg); in stm32_rx_done()
140 cec->rx_msg.len = 0; in stm32_rx_done()
146 struct stm32_cec *cec = arg; in stm32_cec_irq_thread() local
148 if (cec->irq_status & ALL_TX_IT) in stm32_cec_irq_thread()
149 stm32_tx_done(cec, cec->irq_status); in stm32_cec_irq_thread()
151 if (cec->irq_status & ALL_RX_IT) in stm32_cec_irq_thread()
152 stm32_rx_done(cec, cec->irq_status); in stm32_cec_irq_thread()
154 cec->irq_status = 0; in stm32_cec_irq_thread()
161 struct stm32_cec *cec = arg; in stm32_cec_irq_handler() local
163 regmap_read(cec->regmap, CEC_ISR, &cec->irq_status); in stm32_cec_irq_handler()
165 regmap_update_bits(cec->regmap, CEC_ISR, in stm32_cec_irq_handler()
174 struct stm32_cec *cec = adap->priv; in stm32_cec_adap_enable() local
178 ret = clk_enable(cec->clk_cec); in stm32_cec_adap_enable()
180 dev_err(cec->dev, "fail to enable cec clock\n"); in stm32_cec_adap_enable()
182 clk_enable(cec->clk_hdmi_cec); in stm32_cec_adap_enable()
183 regmap_update_bits(cec->regmap, CEC_CR, CECEN, CECEN); in stm32_cec_adap_enable()
185 clk_disable(cec->clk_cec); in stm32_cec_adap_enable()
186 clk_disable(cec->clk_hdmi_cec); in stm32_cec_adap_enable()
187 regmap_update_bits(cec->regmap, CEC_CR, CECEN, 0); in stm32_cec_adap_enable()
195 struct stm32_cec *cec = adap->priv; in stm32_cec_adap_log_addr() local
200 regmap_read_poll_timeout(cec->regmap, CEC_CR, val, !(val & TXSOM), in stm32_cec_adap_log_addr()
202 regmap_update_bits(cec->regmap, CEC_CR, CECEN, 0); in stm32_cec_adap_log_addr()
205 regmap_update_bits(cec->regmap, CEC_CFGR, OAR, 0); in stm32_cec_adap_log_addr()
207 regmap_update_bits(cec->regmap, CEC_CFGR, oar, oar); in stm32_cec_adap_log_addr()
209 regmap_update_bits(cec->regmap, CEC_CR, CECEN, CECEN); in stm32_cec_adap_log_addr()
217 struct stm32_cec *cec = adap->priv; in stm32_cec_adap_transmit() local
220 cec->tx_msg = *msg; in stm32_cec_adap_transmit()
221 cec->tx_cnt = 0; in stm32_cec_adap_transmit()
227 if (cec->tx_msg.len == 1) in stm32_cec_adap_transmit()
228 regmap_update_bits(cec->regmap, CEC_CR, TXEOM, TXEOM); in stm32_cec_adap_transmit()
231 regmap_update_bits(cec->regmap, CEC_CR, TXSOM, TXSOM); in stm32_cec_adap_transmit()
234 regmap_write(cec->regmap, CEC_TXDR, cec->tx_msg.msg[0]); in stm32_cec_adap_transmit()
235 cec->tx_cnt++; in stm32_cec_adap_transmit()
257 struct stm32_cec *cec; in stm32_cec_probe() local
261 cec = devm_kzalloc(&pdev->dev, sizeof(*cec), GFP_KERNEL); in stm32_cec_probe()
262 if (!cec) in stm32_cec_probe()
265 cec->dev = &pdev->dev; in stm32_cec_probe()
271 cec->regmap = devm_regmap_init_mmio_clk(&pdev->dev, "cec", mmio, in stm32_cec_probe()
274 if (IS_ERR(cec->regmap)) in stm32_cec_probe()
275 return PTR_ERR(cec->regmap); in stm32_cec_probe()
277 cec->irq = platform_get_irq(pdev, 0); in stm32_cec_probe()
278 if (cec->irq < 0) in stm32_cec_probe()
279 return cec->irq; in stm32_cec_probe()
281 ret = devm_request_threaded_irq(&pdev->dev, cec->irq, in stm32_cec_probe()
285 pdev->name, cec); in stm32_cec_probe()
289 cec->clk_cec = devm_clk_get(&pdev->dev, "cec"); in stm32_cec_probe()
290 if (IS_ERR(cec->clk_cec)) in stm32_cec_probe()
291 return dev_err_probe(&pdev->dev, PTR_ERR(cec->clk_cec), in stm32_cec_probe()
294 ret = clk_prepare(cec->clk_cec); in stm32_cec_probe()
300 cec->clk_hdmi_cec = devm_clk_get(&pdev->dev, "hdmi-cec"); in stm32_cec_probe()
301 if (IS_ERR(cec->clk_hdmi_cec) && in stm32_cec_probe()
302 PTR_ERR(cec->clk_hdmi_cec) == -EPROBE_DEFER) { in stm32_cec_probe()
307 if (!IS_ERR(cec->clk_hdmi_cec)) { in stm32_cec_probe()
308 ret = clk_prepare(cec->clk_hdmi_cec); in stm32_cec_probe()
319 cec->adap = cec_allocate_adapter(&stm32_cec_adap_ops, cec, in stm32_cec_probe()
321 ret = PTR_ERR_OR_ZERO(cec->adap); in stm32_cec_probe()
325 ret = cec_register_adapter(cec->adap, &pdev->dev); in stm32_cec_probe()
329 cec_hw_init(cec); in stm32_cec_probe()
331 platform_set_drvdata(pdev, cec); in stm32_cec_probe()
336 cec_delete_adapter(cec->adap); in stm32_cec_probe()
339 clk_unprepare(cec->clk_hdmi_cec); in stm32_cec_probe()
342 clk_unprepare(cec->clk_cec); in stm32_cec_probe()
348 struct stm32_cec *cec = platform_get_drvdata(pdev); in stm32_cec_remove() local
350 clk_unprepare(cec->clk_cec); in stm32_cec_remove()
351 clk_unprepare(cec->clk_hdmi_cec); in stm32_cec_remove()
353 cec_unregister_adapter(cec->adap); in stm32_cec_remove()