| .. | .. |
|---|
| 1 | +/* SPDX-License-Identifier: GPL-2.0+ */ |
|---|
| 1 | 2 | /* |
|---|
| 2 | 3 | * Driver for Analog Devices ADV748X video decoder and HDMI receiver |
|---|
| 3 | 4 | * |
|---|
| 4 | 5 | * Copyright (C) 2017 Renesas Electronics Corp. |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or modify it |
|---|
| 7 | | - * under the terms of the GNU General Public License as published by the |
|---|
| 8 | | - * Free Software Foundation; either version 2 of the License, or (at your |
|---|
| 9 | | - * option) any later version. |
|---|
| 10 | 6 | * |
|---|
| 11 | 7 | * Authors: |
|---|
| 12 | 8 | * Koji Matsuoka <koji.matsuoka.xm@renesas.com> |
|---|
| .. | .. |
|---|
| 43 | 39 | ADV748X_PAGE_MAX, |
|---|
| 44 | 40 | |
|---|
| 45 | 41 | /* Fake pages for register sequences */ |
|---|
| 46 | | - ADV748X_PAGE_WAIT, /* Wait x msec */ |
|---|
| 47 | 42 | ADV748X_PAGE_EOR, /* End Mark */ |
|---|
| 48 | 43 | }; |
|---|
| 49 | 44 | |
|---|
| .. | .. |
|---|
| 83 | 78 | struct v4l2_mbus_framefmt format; |
|---|
| 84 | 79 | unsigned int page; |
|---|
| 85 | 80 | unsigned int port; |
|---|
| 81 | + unsigned int num_lanes; |
|---|
| 82 | + unsigned int active_lanes; |
|---|
| 86 | 83 | |
|---|
| 87 | 84 | struct media_pad pads[ADV748X_CSI2_NR_PADS]; |
|---|
| 88 | 85 | struct v4l2_ctrl_handler ctrl_hdl; |
|---|
| 89 | 86 | struct v4l2_ctrl *pixel_rate; |
|---|
| 87 | + struct v4l2_subdev *src; |
|---|
| 90 | 88 | struct v4l2_subdev sd; |
|---|
| 91 | 89 | }; |
|---|
| 92 | 90 | |
|---|
| 93 | 91 | #define notifier_to_csi2(n) container_of(n, struct adv748x_csi2, notifier) |
|---|
| 94 | 92 | #define adv748x_sd_to_csi2(sd) container_of(sd, struct adv748x_csi2, sd) |
|---|
| 93 | + |
|---|
| 95 | 94 | #define is_tx_enabled(_tx) ((_tx)->state->endpoints[(_tx)->port] != NULL) |
|---|
| 95 | +#define is_txa(_tx) ((_tx) == &(_tx)->state->txa) |
|---|
| 96 | +#define is_txb(_tx) ((_tx) == &(_tx)->state->txb) |
|---|
| 97 | +#define is_tx(_tx) (is_txa(_tx) || is_txb(_tx)) |
|---|
| 98 | + |
|---|
| 99 | +#define is_afe_enabled(_state) \ |
|---|
| 100 | + ((_state)->endpoints[ADV748X_PORT_AIN0] != NULL || \ |
|---|
| 101 | + (_state)->endpoints[ADV748X_PORT_AIN1] != NULL || \ |
|---|
| 102 | + (_state)->endpoints[ADV748X_PORT_AIN2] != NULL || \ |
|---|
| 103 | + (_state)->endpoints[ADV748X_PORT_AIN3] != NULL || \ |
|---|
| 104 | + (_state)->endpoints[ADV748X_PORT_AIN4] != NULL || \ |
|---|
| 105 | + (_state)->endpoints[ADV748X_PORT_AIN5] != NULL || \ |
|---|
| 106 | + (_state)->endpoints[ADV748X_PORT_AIN6] != NULL || \ |
|---|
| 107 | + (_state)->endpoints[ADV748X_PORT_AIN7] != NULL) |
|---|
| 108 | +#define is_hdmi_enabled(_state) ((_state)->endpoints[ADV748X_PORT_HDMI] != NULL) |
|---|
| 96 | 109 | |
|---|
| 97 | 110 | enum adv748x_hdmi_pads { |
|---|
| 98 | 111 | ADV748X_HDMI_SINK, |
|---|
| .. | .. |
|---|
| 108 | 121 | |
|---|
| 109 | 122 | struct v4l2_dv_timings timings; |
|---|
| 110 | 123 | struct v4l2_fract aspect_ratio; |
|---|
| 124 | + |
|---|
| 125 | + struct adv748x_csi2 *tx; |
|---|
| 111 | 126 | |
|---|
| 112 | 127 | struct { |
|---|
| 113 | 128 | u8 edid[512]; |
|---|
| .. | .. |
|---|
| 138 | 153 | struct v4l2_ctrl_handler ctrl_hdl; |
|---|
| 139 | 154 | struct v4l2_subdev sd; |
|---|
| 140 | 155 | struct v4l2_mbus_framefmt format; |
|---|
| 156 | + |
|---|
| 157 | + struct adv748x_csi2 *tx; |
|---|
| 141 | 158 | |
|---|
| 142 | 159 | bool streaming; |
|---|
| 143 | 160 | v4l2_std_id curr_norm; |
|---|
| .. | .. |
|---|
| 194 | 211 | #define ADV748X_IO_PD 0x00 /* power down controls */ |
|---|
| 195 | 212 | #define ADV748X_IO_PD_RX_EN BIT(6) |
|---|
| 196 | 213 | |
|---|
| 214 | +#define ADV748X_IO_REG_01 0x01 /* pwrdn{2}b, prog_xtal_freq */ |
|---|
| 215 | +#define ADV748X_IO_REG_01_PWRDN_MASK (BIT(7) | BIT(6)) |
|---|
| 216 | +#define ADV748X_IO_REG_01_PWRDN2B BIT(7) /* CEC Wakeup Support */ |
|---|
| 217 | +#define ADV748X_IO_REG_01_PWRDNB BIT(6) /* CEC Wakeup Support */ |
|---|
| 218 | + |
|---|
| 197 | 219 | #define ADV748X_IO_REG_04 0x04 |
|---|
| 198 | 220 | #define ADV748X_IO_REG_04_FORCE_FR BIT(0) /* Force CP free-run */ |
|---|
| 199 | 221 | |
|---|
| .. | .. |
|---|
| 207 | 229 | #define ADV748X_IO_10_CSI4_EN BIT(7) |
|---|
| 208 | 230 | #define ADV748X_IO_10_CSI1_EN BIT(6) |
|---|
| 209 | 231 | #define ADV748X_IO_10_PIX_OUT_EN BIT(5) |
|---|
| 232 | +#define ADV748X_IO_10_CSI4_IN_SEL_AFE BIT(3) |
|---|
| 210 | 233 | |
|---|
| 211 | 234 | #define ADV748X_IO_CHIP_REV_ID_1 0xdf |
|---|
| 212 | 235 | #define ADV748X_IO_CHIP_REV_ID_2 0xe0 |
|---|
| 213 | 236 | |
|---|
| 237 | +#define ADV748X_IO_REG_F2 0xf2 |
|---|
| 238 | +#define ADV748X_IO_REG_F2_READ_AUTO_INC BIT(0) |
|---|
| 239 | + |
|---|
| 240 | +/* For PAGE slave address offsets */ |
|---|
| 214 | 241 | #define ADV748X_IO_SLAVE_ADDR_BASE 0xf2 |
|---|
| 242 | + |
|---|
| 243 | +/* |
|---|
| 244 | + * The ADV748x_Recommended_Settings_PrA_2014-08-20.pdf details both 0x80 and |
|---|
| 245 | + * 0xff as examples for performing a software reset. |
|---|
| 246 | + */ |
|---|
| 247 | +#define ADV748X_IO_REG_FF 0xff |
|---|
| 248 | +#define ADV748X_IO_REG_FF_MAIN_RESET 0xff |
|---|
| 215 | 249 | |
|---|
| 216 | 250 | /* HDMI RX Map */ |
|---|
| 217 | 251 | #define ADV748X_HDMI_LW1 0x07 /* line width_1 */ |
|---|
| .. | .. |
|---|
| 378 | 412 | #define cp_write(s, r, v) adv748x_write(s, ADV748X_PAGE_CP, r, v) |
|---|
| 379 | 413 | #define cp_clrset(s, r, m, v) cp_write(s, r, (cp_read(s, r) & ~(m)) | (v)) |
|---|
| 380 | 414 | |
|---|
| 381 | | -#define txa_read(s, r) adv748x_read(s, ADV748X_PAGE_TXA, r) |
|---|
| 382 | | -#define txb_read(s, r) adv748x_read(s, ADV748X_PAGE_TXB, r) |
|---|
| 383 | | - |
|---|
| 384 | 415 | #define tx_read(t, r) adv748x_read(t->state, t->page, r) |
|---|
| 385 | 416 | #define tx_write(t, r, v) adv748x_write(t->state, t->page, r, v) |
|---|
| 386 | 417 | |
|---|
| .. | .. |
|---|
| 400 | 431 | int adv748x_register_subdevs(struct adv748x_state *state, |
|---|
| 401 | 432 | struct v4l2_device *v4l2_dev); |
|---|
| 402 | 433 | |
|---|
| 403 | | -int adv748x_txa_power(struct adv748x_state *state, bool on); |
|---|
| 404 | | -int adv748x_txb_power(struct adv748x_state *state, bool on); |
|---|
| 434 | +int adv748x_tx_power(struct adv748x_csi2 *tx, bool on); |
|---|
| 405 | 435 | |
|---|
| 406 | 436 | int adv748x_afe_init(struct adv748x_afe *afe); |
|---|
| 407 | 437 | void adv748x_afe_cleanup(struct adv748x_afe *afe); |
|---|