1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright (C) STMicroelectronics SA 2017
9 #include <linux/interrupt.h>
10 #include <linux/kernel.h>
11 #include <linux/module.h>
13 #include <linux/platform_device.h>
14 #include <linux/regmap.h>
16 #include <media/cec.h>
18 #define CEC_NAME "stm32-cec"
21 #define CEC_CR 0x0000 /* Control Register */
22 #define CEC_CFGR 0x0004 /* ConFiGuration Register */
23 #define CEC_TXDR 0x0008 /* Rx data Register */
24 #define CEC_RXDR 0x000C /* Rx data Register */
25 #define CEC_ISR 0x0010 /* Interrupt and status Register */
26 #define CEC_IER 0x0014 /* Interrupt enable Register */
33 #define OAR GENMASK(30, 16)
35 #define BRDNOGEN BIT(7)
36 #define LBPEGEN BIT(6)
40 #define SFT GENMASK(2, 0)
41 #define FULL_CFG (LSTN | SFTOP | BRDNOGEN | LBPEGEN | BREGEN | BRESTP \
44 #define TXACKE BIT(12)
55 #define ALL_TX_IT (TXEND | TXBR | TXACKE | TXERR | TXUDR | ARBLST)
56 #define ALL_RX_IT (RXEND | RXBR | RXACKE | RXOVR)
59 * 400 ms is the time it takes for one 16 byte message to be
60 * transferred and 5 is the maximum number of retries. Add
61 * another 100 ms as a margin.
63 #define CEC_XFER_TIMEOUT_MS (5 * 400 + 100)
66 struct cec_adapter
*adap
;
69 struct clk
*clk_hdmi_cec
;
70 struct reset_control
*rstc
;
71 struct regmap
*regmap
;
74 struct cec_msg rx_msg
;
75 struct cec_msg tx_msg
;
79 static void cec_hw_init(struct stm32_cec
*cec
)
81 regmap_update_bits(cec
->regmap
, CEC_CR
, TXEOM
| TXSOM
| CECEN
, 0);
83 regmap_update_bits(cec
->regmap
, CEC_IER
, ALL_TX_IT
| ALL_RX_IT
,
84 ALL_TX_IT
| ALL_RX_IT
);
86 regmap_update_bits(cec
->regmap
, CEC_CFGR
, FULL_CFG
, FULL_CFG
);
89 static void stm32_tx_done(struct stm32_cec
*cec
, u32 status
)
91 if (status
& (TXERR
| TXUDR
)) {
92 cec_transmit_done(cec
->adap
, CEC_TX_STATUS_ERROR
,
97 if (status
& ARBLST
) {
98 cec_transmit_done(cec
->adap
, CEC_TX_STATUS_ARB_LOST
,
103 if (status
& TXACKE
) {
104 cec_transmit_done(cec
->adap
, CEC_TX_STATUS_NACK
,
109 if (cec
->irq_status
& TXBR
) {
111 if (cec
->tx_cnt
< cec
->tx_msg
.len
)
112 regmap_write(cec
->regmap
, CEC_TXDR
,
113 cec
->tx_msg
.msg
[cec
->tx_cnt
++]);
115 /* TXEOM is set to command transmission of the last byte */
116 if (cec
->tx_cnt
== cec
->tx_msg
.len
)
117 regmap_update_bits(cec
->regmap
, CEC_CR
, TXEOM
, TXEOM
);
120 if (cec
->irq_status
& TXEND
)
121 cec_transmit_done(cec
->adap
, CEC_TX_STATUS_OK
, 0, 0, 0, 0);
124 static void stm32_rx_done(struct stm32_cec
*cec
, u32 status
)
126 if (cec
->irq_status
& (RXACKE
| RXOVR
)) {
131 if (cec
->irq_status
& RXBR
) {
134 regmap_read(cec
->regmap
, CEC_RXDR
, &val
);
135 cec
->rx_msg
.msg
[cec
->rx_msg
.len
++] = val
& 0xFF;
138 if (cec
->irq_status
& RXEND
) {
139 cec_received_msg(cec
->adap
, &cec
->rx_msg
);
144 static irqreturn_t
stm32_cec_irq_thread(int irq
, void *arg
)
146 struct stm32_cec
*cec
= arg
;
148 if (cec
->irq_status
& ALL_TX_IT
)
149 stm32_tx_done(cec
, cec
->irq_status
);
151 if (cec
->irq_status
& ALL_RX_IT
)
152 stm32_rx_done(cec
, cec
->irq_status
);
159 static irqreturn_t
stm32_cec_irq_handler(int irq
, void *arg
)
161 struct stm32_cec
*cec
= arg
;
163 regmap_read(cec
->regmap
, CEC_ISR
, &cec
->irq_status
);
165 regmap_update_bits(cec
->regmap
, CEC_ISR
,
166 ALL_TX_IT
| ALL_RX_IT
,
167 ALL_TX_IT
| ALL_RX_IT
);
169 return IRQ_WAKE_THREAD
;
172 static int stm32_cec_adap_enable(struct cec_adapter
*adap
, bool enable
)
174 struct stm32_cec
*cec
= adap
->priv
;
178 ret
= clk_enable(cec
->clk_cec
);
180 dev_err(cec
->dev
, "fail to enable cec clock\n");
182 clk_enable(cec
->clk_hdmi_cec
);
183 regmap_update_bits(cec
->regmap
, CEC_CR
, CECEN
, CECEN
);
185 clk_disable(cec
->clk_cec
);
186 clk_disable(cec
->clk_hdmi_cec
);
187 regmap_update_bits(cec
->regmap
, CEC_CR
, CECEN
, 0);
193 static int stm32_cec_adap_log_addr(struct cec_adapter
*adap
, u8 logical_addr
)
195 struct stm32_cec
*cec
= adap
->priv
;
196 u32 oar
= (1 << logical_addr
) << 16;
199 /* Poll every 100µs the register CEC_CR to wait end of transmission */
200 regmap_read_poll_timeout(cec
->regmap
, CEC_CR
, val
, !(val
& TXSOM
),
201 100, CEC_XFER_TIMEOUT_MS
* 1000);
202 regmap_update_bits(cec
->regmap
, CEC_CR
, CECEN
, 0);
204 if (logical_addr
== CEC_LOG_ADDR_INVALID
)
205 regmap_update_bits(cec
->regmap
, CEC_CFGR
, OAR
, 0);
207 regmap_update_bits(cec
->regmap
, CEC_CFGR
, oar
, oar
);
209 regmap_update_bits(cec
->regmap
, CEC_CR
, CECEN
, CECEN
);
214 static int stm32_cec_adap_transmit(struct cec_adapter
*adap
, u8 attempts
,
215 u32 signal_free_time
, struct cec_msg
*msg
)
217 struct stm32_cec
*cec
= adap
->priv
;
224 * If the CEC message consists of only one byte,
225 * TXEOM must be set before of TXSOM.
227 if (cec
->tx_msg
.len
== 1)
228 regmap_update_bits(cec
->regmap
, CEC_CR
, TXEOM
, TXEOM
);
230 /* TXSOM is set to command transmission of the first byte */
231 regmap_update_bits(cec
->regmap
, CEC_CR
, TXSOM
, TXSOM
);
233 /* Write the header (first byte of message) */
234 regmap_write(cec
->regmap
, CEC_TXDR
, cec
->tx_msg
.msg
[0]);
240 static const struct cec_adap_ops stm32_cec_adap_ops
= {
241 .adap_enable
= stm32_cec_adap_enable
,
242 .adap_log_addr
= stm32_cec_adap_log_addr
,
243 .adap_transmit
= stm32_cec_adap_transmit
,
246 static const struct regmap_config stm32_cec_regmap_cfg
= {
249 .reg_stride
= sizeof(u32
),
250 .max_register
= 0x14,
254 static int stm32_cec_probe(struct platform_device
*pdev
)
256 u32 caps
= CEC_CAP_DEFAULTS
| CEC_CAP_PHYS_ADDR
| CEC_MODE_MONITOR_ALL
;
257 struct stm32_cec
*cec
;
261 cec
= devm_kzalloc(&pdev
->dev
, sizeof(*cec
), GFP_KERNEL
);
265 cec
->dev
= &pdev
->dev
;
267 mmio
= devm_platform_ioremap_resource(pdev
, 0);
269 return PTR_ERR(mmio
);
271 cec
->regmap
= devm_regmap_init_mmio_clk(&pdev
->dev
, "cec", mmio
,
272 &stm32_cec_regmap_cfg
);
274 if (IS_ERR(cec
->regmap
))
275 return PTR_ERR(cec
->regmap
);
277 cec
->irq
= platform_get_irq(pdev
, 0);
281 ret
= devm_request_threaded_irq(&pdev
->dev
, cec
->irq
,
282 stm32_cec_irq_handler
,
283 stm32_cec_irq_thread
,
289 cec
->clk_cec
= devm_clk_get(&pdev
->dev
, "cec");
290 if (IS_ERR(cec
->clk_cec
))
291 return dev_err_probe(&pdev
->dev
, PTR_ERR(cec
->clk_cec
),
292 "Cannot get cec clock\n");
294 ret
= clk_prepare(cec
->clk_cec
);
296 dev_err(&pdev
->dev
, "Unable to prepare cec clock\n");
300 cec
->clk_hdmi_cec
= devm_clk_get(&pdev
->dev
, "hdmi-cec");
301 if (IS_ERR(cec
->clk_hdmi_cec
) &&
302 PTR_ERR(cec
->clk_hdmi_cec
) == -EPROBE_DEFER
) {
304 goto err_unprepare_cec_clk
;
307 if (!IS_ERR(cec
->clk_hdmi_cec
)) {
308 ret
= clk_prepare(cec
->clk_hdmi_cec
);
310 dev_err(&pdev
->dev
, "Can't prepare hdmi-cec clock\n");
311 goto err_unprepare_cec_clk
;
316 * CEC_CAP_PHYS_ADDR caps should be removed when a cec notifier is
317 * available for example when a drm driver can provide edid
319 cec
->adap
= cec_allocate_adapter(&stm32_cec_adap_ops
, cec
,
320 CEC_NAME
, caps
, CEC_MAX_LOG_ADDRS
);
321 ret
= PTR_ERR_OR_ZERO(cec
->adap
);
323 goto err_unprepare_hdmi_cec_clk
;
325 ret
= cec_register_adapter(cec
->adap
, &pdev
->dev
);
327 goto err_delete_adapter
;
331 platform_set_drvdata(pdev
, cec
);
336 cec_delete_adapter(cec
->adap
);
338 err_unprepare_hdmi_cec_clk
:
339 clk_unprepare(cec
->clk_hdmi_cec
);
341 err_unprepare_cec_clk
:
342 clk_unprepare(cec
->clk_cec
);
346 static void stm32_cec_remove(struct platform_device
*pdev
)
348 struct stm32_cec
*cec
= platform_get_drvdata(pdev
);
350 clk_unprepare(cec
->clk_cec
);
351 clk_unprepare(cec
->clk_hdmi_cec
);
353 cec_unregister_adapter(cec
->adap
);
356 static const struct of_device_id stm32_cec_of_match
[] = {
357 { .compatible
= "st,stm32-cec" },
360 MODULE_DEVICE_TABLE(of
, stm32_cec_of_match
);
362 static struct platform_driver stm32_cec_driver
= {
363 .probe
= stm32_cec_probe
,
364 .remove
= stm32_cec_remove
,
367 .of_match_table
= stm32_cec_of_match
,
371 module_platform_driver(stm32_cec_driver
);
373 MODULE_AUTHOR("Benjamin Gaignard <benjamin.gaignard@st.com>");
374 MODULE_AUTHOR("Yannick Fertre <yannick.fertre@st.com>");
375 MODULE_DESCRIPTION("STMicroelectronics STM32 Consumer Electronics Control");
376 MODULE_LICENSE("GPL v2");