Lines Matching +full:enable +full:- +full:offset
1 // SPDX-License-Identifier: GPL-2.0-only
3 * adv7511_cec.c - Analog Devices ADV7511/33 cec driver
38 unsigned int offset = adv7511->info->reg_cec_offset; in adv_cec_tx_raw_status() local
41 if (regmap_read(adv7511->regmap_cec, in adv_cec_tx_raw_status()
42 ADV7511_REG_CEC_TX_ENABLE + offset, &val)) in adv_cec_tx_raw_status()
49 drm_connector_hdmi_cec_transmit_attempt_done(adv7511->cec_connector, in adv_cec_tx_raw_status()
65 if (regmap_read(adv7511->regmap_cec, in adv_cec_tx_raw_status()
66 ADV7511_REG_CEC_TX_LOW_DRV_CNT + offset, &cnt)) { in adv_cec_tx_raw_status()
77 drm_connector_hdmi_cec_transmit_done(adv7511->cec_connector, status, in adv_cec_tx_raw_status()
83 drm_connector_hdmi_cec_transmit_attempt_done(adv7511->cec_connector, in adv_cec_tx_raw_status()
91 unsigned int offset = adv7511->info->reg_cec_offset; in adv7511_cec_rx() local
97 if (regmap_read(adv7511->regmap_cec, in adv7511_cec_rx()
98 ADV7511_REG_CEC_RX_FRAME_LEN[rx_buf] + offset, &len)) in adv7511_cec_rx()
110 regmap_read(adv7511->regmap_cec, in adv7511_cec_rx()
111 i + ADV7511_REG_CEC_RX_FRAME_HDR[rx_buf] + offset, in adv7511_cec_rx()
116 /* Toggle RX Ready Clear bit to re-enable this RX buffer */ in adv7511_cec_rx()
117 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_rx()
118 ADV7511_REG_CEC_RX_BUFFERS + offset, BIT(rx_buf), in adv7511_cec_rx()
120 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_rx()
121 ADV7511_REG_CEC_RX_BUFFERS + offset, BIT(rx_buf), 0); in adv7511_cec_rx()
123 drm_connector_hdmi_cec_received_msg(adv7511->cec_connector, &msg); in adv7511_cec_rx()
128 unsigned int offset = adv7511->info->reg_cec_offset; in adv7511_cec_irq_process() local
136 int rx_order[3] = { -1, -1, -1 }; in adv7511_cec_irq_process()
148 if (regmap_read(adv7511->regmap_cec, in adv7511_cec_irq_process()
149 ADV7511_REG_CEC_RX_STATUS + offset, &rx_status)) in adv7511_cec_irq_process()
163 * read from in order, where -1 indicates that there are no in adv7511_cec_irq_process()
170 rx_order[timestamp - 1] = i; in adv7511_cec_irq_process()
186 int adv7511_cec_enable(struct drm_bridge *bridge, bool enable) in adv7511_cec_enable() argument
189 unsigned int offset = adv7511->info->reg_cec_offset; in adv7511_cec_enable() local
191 if (adv7511->i2c_cec == NULL) in adv7511_cec_enable()
192 return -EIO; in adv7511_cec_enable()
194 if (!adv7511->cec_enabled_adap && enable) { in adv7511_cec_enable()
196 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_enable()
197 ADV7511_REG_CEC_CLK_DIV + offset, in adv7511_cec_enable()
199 /* non-legacy mode and clear all rx buffers */ in adv7511_cec_enable()
200 regmap_write(adv7511->regmap_cec, in adv7511_cec_enable()
201 ADV7511_REG_CEC_RX_BUFFERS + offset, 0x0f); in adv7511_cec_enable()
202 regmap_write(adv7511->regmap_cec, in adv7511_cec_enable()
203 ADV7511_REG_CEC_RX_BUFFERS + offset, 0x08); in adv7511_cec_enable()
205 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_enable()
206 ADV7511_REG_CEC_TX_ENABLE + offset, 1, 0); in adv7511_cec_enable()
211 /* rx: ready 1-3 */ in adv7511_cec_enable()
212 regmap_update_bits(adv7511->regmap, in adv7511_cec_enable()
215 } else if (adv7511->cec_enabled_adap && !enable) { in adv7511_cec_enable()
216 regmap_update_bits(adv7511->regmap, in adv7511_cec_enable()
218 /* disable address mask 1-3 */ in adv7511_cec_enable()
219 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_enable()
220 ADV7511_REG_CEC_LOG_ADDR_MASK + offset, in adv7511_cec_enable()
223 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_enable()
224 ADV7511_REG_CEC_CLK_DIV + offset, in adv7511_cec_enable()
226 adv7511->cec_valid_addrs = 0; in adv7511_cec_enable()
228 adv7511->cec_enabled_adap = enable; in adv7511_cec_enable()
235 unsigned int offset = adv7511->info->reg_cec_offset; in adv7511_cec_log_addr() local
238 if (!adv7511->cec_enabled_adap) in adv7511_cec_log_addr()
239 return addr == CEC_LOG_ADDR_INVALID ? 0 : -EIO; in adv7511_cec_log_addr()
242 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_log_addr()
243 ADV7511_REG_CEC_LOG_ADDR_MASK + offset, in adv7511_cec_log_addr()
245 adv7511->cec_valid_addrs = 0; in adv7511_cec_log_addr()
250 bool is_valid = adv7511->cec_valid_addrs & (1 << i); in adv7511_cec_log_addr()
254 if (is_valid && adv7511->cec_addr[i] == addr) in adv7511_cec_log_addr()
260 return -ENXIO; in adv7511_cec_log_addr()
262 adv7511->cec_addr[i] = addr; in adv7511_cec_log_addr()
263 adv7511->cec_valid_addrs |= 1 << i; in adv7511_cec_log_addr()
267 /* enable address mask 0 */ in adv7511_cec_log_addr()
268 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_log_addr()
269 ADV7511_REG_CEC_LOG_ADDR_MASK + offset, in adv7511_cec_log_addr()
272 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_log_addr()
273 ADV7511_REG_CEC_LOG_ADDR_0_1 + offset, in adv7511_cec_log_addr()
277 /* enable address mask 1 */ in adv7511_cec_log_addr()
278 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_log_addr()
279 ADV7511_REG_CEC_LOG_ADDR_MASK + offset, in adv7511_cec_log_addr()
282 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_log_addr()
283 ADV7511_REG_CEC_LOG_ADDR_0_1 + offset, in adv7511_cec_log_addr()
287 /* enable address mask 2 */ in adv7511_cec_log_addr()
288 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_log_addr()
289 ADV7511_REG_CEC_LOG_ADDR_MASK + offset, in adv7511_cec_log_addr()
292 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_log_addr()
293 ADV7511_REG_CEC_LOG_ADDR_2 + offset, in adv7511_cec_log_addr()
304 unsigned int offset = adv7511->info->reg_cec_offset; in adv7511_cec_transmit() local
305 u8 len = msg->len; in adv7511_cec_transmit()
309 * The number of retries is the number of attempts - 1, but retry in adv7511_cec_transmit()
313 regmap_update_bits(adv7511->regmap_cec, in adv7511_cec_transmit()
314 ADV7511_REG_CEC_TX_RETRY + offset, in adv7511_cec_transmit()
315 0x70, max(1, attempts - 1) << 4); in adv7511_cec_transmit()
318 regmap_update_bits(adv7511->regmap, ADV7511_REG_INT(1), 0x38, 0x38); in adv7511_cec_transmit()
322 regmap_write(adv7511->regmap_cec, in adv7511_cec_transmit()
323 i + ADV7511_REG_CEC_TX_FRAME_HDR + offset, in adv7511_cec_transmit()
324 msg->msg[i]); in adv7511_cec_transmit()
327 regmap_write(adv7511->regmap_cec, in adv7511_cec_transmit()
328 ADV7511_REG_CEC_TX_FRAME_LEN + offset, len); in adv7511_cec_transmit()
329 /* start transmit, enable tx */ in adv7511_cec_transmit()
330 regmap_write(adv7511->regmap_cec, in adv7511_cec_transmit()
331 ADV7511_REG_CEC_TX_ENABLE + offset, 0x01); in adv7511_cec_transmit()
337 adv7511->cec_clk = devm_clk_get(dev, "cec"); in adv7511_cec_parse_dt()
338 if (IS_ERR(adv7511->cec_clk)) { in adv7511_cec_parse_dt()
339 int ret = PTR_ERR(adv7511->cec_clk); in adv7511_cec_parse_dt()
341 adv7511->cec_clk = NULL; in adv7511_cec_parse_dt()
344 clk_prepare_enable(adv7511->cec_clk); in adv7511_cec_parse_dt()
345 adv7511->cec_clk_freq = clk_get_rate(adv7511->cec_clk); in adv7511_cec_parse_dt()
353 struct device *dev = &adv7511->i2c_main->dev; in adv7511_cec_init()
354 unsigned int offset = adv7511->info->reg_cec_offset; in adv7511_cec_init() local
360 adv7511->cec_connector = connector; in adv7511_cec_init()
362 regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, 0); in adv7511_cec_init()
364 regmap_write(adv7511->regmap_cec, in adv7511_cec_init()
365 ADV7511_REG_CEC_SOFT_RESET + offset, 0x01); in adv7511_cec_init()
366 regmap_write(adv7511->regmap_cec, in adv7511_cec_init()
367 ADV7511_REG_CEC_SOFT_RESET + offset, 0x00); in adv7511_cec_init()
369 /* non-legacy mode - use all three RX buffers */ in adv7511_cec_init()
370 regmap_write(adv7511->regmap_cec, in adv7511_cec_init()
371 ADV7511_REG_CEC_RX_BUFFERS + offset, 0x08); in adv7511_cec_init()
373 regmap_write(adv7511->regmap_cec, in adv7511_cec_init()
374 ADV7511_REG_CEC_CLK_DIV + offset, in adv7511_cec_init()
375 ((adv7511->cec_clk_freq / 750000) - 1) << 2); in adv7511_cec_init()
380 regmap_write(adv7511->regmap, ADV7511_REG_CEC_CTRL, in adv7511_cec_init()
382 return ret == -EPROBE_DEFER ? ret : 0; in adv7511_cec_init()