| .. | .. |
|---|
| 9 | 9 | #define _RKX110_X120_H |
|---|
| 10 | 10 | |
|---|
| 11 | 11 | #include <drm/drm_panel.h> |
|---|
| 12 | +#include <drm/drm_bridge.h> |
|---|
| 13 | +#include <drm/drm_connector.h> |
|---|
| 12 | 14 | #include <dt-bindings/mfd/rockchip-serdes.h> |
|---|
| 13 | 15 | #include <linux/i2c.h> |
|---|
| 14 | 16 | #include <video/videomode.h> |
|---|
| 15 | 17 | |
|---|
| 16 | | -#define MAX_PANEL 2 |
|---|
| 18 | +#define RK_SERDES_MAX_ROUTE 2 |
|---|
| 17 | 19 | #define RK_SERDES_PASSTHROUGH_CNT 11 |
|---|
| 18 | 20 | |
|---|
| 19 | 21 | #define SERDES_VERSION_V0(type) 0x2201 |
|---|
| .. | .. |
|---|
| 142 | 144 | |
|---|
| 143 | 145 | struct rkx110_combrxphy { |
|---|
| 144 | 146 | enum combrx_phy_mode mode; |
|---|
| 147 | + uint8_t lanes; |
|---|
| 145 | 148 | u64 rate; |
|---|
| 146 | 149 | struct configure_opts_combphy mipi_dphy_cfg; |
|---|
| 147 | 150 | }; |
|---|
| 148 | 151 | |
|---|
| 149 | 152 | struct rkx120_dsi_tx { |
|---|
| 153 | + struct rkx120_combtxphy *combtxphy; |
|---|
| 154 | + |
|---|
| 150 | 155 | int bpp; /* 24/18/16*/ |
|---|
| 151 | 156 | enum serdes_dsi_bus_format bus_format; |
|---|
| 152 | 157 | enum serdes_dsi_mode_flags mode_flags; |
|---|
| .. | .. |
|---|
| 221 | 226 | u32 remote0_port1; |
|---|
| 222 | 227 | u32 remote1_port0; |
|---|
| 223 | 228 | u32 remote1_port1; |
|---|
| 229 | + u32 route_flag; |
|---|
| 224 | 230 | }; |
|---|
| 225 | 231 | |
|---|
| 226 | 232 | struct rk_serdes_chip { |
|---|
| .. | .. |
|---|
| 233 | 239 | struct pattern_gen { |
|---|
| 234 | 240 | const char *name; |
|---|
| 235 | 241 | struct rk_serdes_chip *chip; |
|---|
| 242 | + struct rk_serdes_route *route; |
|---|
| 236 | 243 | u32 base; |
|---|
| 237 | 244 | u32 link_src_reg; |
|---|
| 238 | 245 | u8 link_src_offset; |
|---|
| 246 | + u8 type; |
|---|
| 239 | 247 | }; |
|---|
| 240 | 248 | |
|---|
| 241 | 249 | struct rk_serdes_pt_pin { |
|---|
| .. | .. |
|---|
| 259 | 267 | struct rk_serdes { |
|---|
| 260 | 268 | struct device *dev; |
|---|
| 261 | 269 | struct rk_serdes_chip chip[DEVICE_MAX]; |
|---|
| 270 | + struct regulator *supply; |
|---|
| 262 | 271 | struct gpio_desc *reset; |
|---|
| 263 | 272 | struct gpio_desc *enable; |
|---|
| 273 | + struct gpio_desc *irq_gpio; |
|---|
| 264 | 274 | |
|---|
| 275 | + int irq; |
|---|
| 265 | 276 | /* |
|---|
| 266 | 277 | * Control by I2C-Debug |
|---|
| 267 | 278 | */ |
|---|
| .. | .. |
|---|
| 276 | 287 | struct dentry *debugfs_remote1; |
|---|
| 277 | 288 | struct dentry *debugfs_rate; |
|---|
| 278 | 289 | |
|---|
| 279 | | - struct videomode *vm; |
|---|
| 290 | + struct rk_serdes_route *route[RK_SERDES_MAX_ROUTE]; |
|---|
| 280 | 291 | u32 stream_type; |
|---|
| 281 | 292 | u32 version; |
|---|
| 282 | | - u32 route_flag; |
|---|
| 283 | 293 | u8 remote_nr; |
|---|
| 284 | | - struct rkx110_combrxphy combrxphy; |
|---|
| 285 | | - struct rkx110_dsi_rx dsi_rx; |
|---|
| 286 | | - struct rkx120_combtxphy combtxphy; |
|---|
| 287 | | - struct rkx120_dsi_tx dsi_tx; |
|---|
| 294 | + u8 lane_nr; |
|---|
| 295 | + u8 channel_nr; |
|---|
| 296 | + u8 route_nr; |
|---|
| 288 | 297 | |
|---|
| 289 | 298 | int (*i2c_read_reg)(struct i2c_client *client, u32 addr, u32 *value); |
|---|
| 290 | 299 | int (*i2c_write_reg)(struct i2c_client *client, u32 addr, u32 value); |
|---|
| .. | .. |
|---|
| 315 | 324 | int cmd_cnt; |
|---|
| 316 | 325 | }; |
|---|
| 317 | 326 | |
|---|
| 327 | +struct rk_serdes_panel; |
|---|
| 318 | 328 | struct rk_serdes_panel { |
|---|
| 319 | 329 | struct drm_panel panel; |
|---|
| 330 | + struct drm_bridge bridge; |
|---|
| 331 | + struct drm_connector connector; |
|---|
| 320 | 332 | struct device *dev; |
|---|
| 321 | 333 | struct rk_serdes *parent; |
|---|
| 322 | | - struct rk_serdes_route route; |
|---|
| 323 | | - unsigned int bus_format; |
|---|
| 324 | | - int link_mode; |
|---|
| 334 | + struct rk_serdes_panel *secondary; |
|---|
| 325 | 335 | |
|---|
| 326 | 336 | struct panel_cmds *on_cmds; |
|---|
| 327 | 337 | struct panel_cmds *off_cmds; |
|---|
| .. | .. |
|---|
| 329 | 339 | struct regulator *supply; |
|---|
| 330 | 340 | struct gpio_desc *enable_gpio; |
|---|
| 331 | 341 | struct gpio_desc *reset_gpio; |
|---|
| 342 | + |
|---|
| 343 | + struct rk_serdes_route route; |
|---|
| 344 | + struct rkx110_combrxphy combrxphy; |
|---|
| 345 | + struct rkx110_dsi_rx dsi_rx; |
|---|
| 346 | + struct rkx120_combtxphy combtxphy; |
|---|
| 347 | + struct rkx120_dsi_tx dsi_tx; |
|---|
| 348 | + |
|---|
| 349 | + unsigned int bus_format; |
|---|
| 350 | + unsigned int id; |
|---|
| 351 | + u32 connector_type; |
|---|
| 352 | + |
|---|
| 353 | + bool multi_panel; |
|---|
| 332 | 354 | }; |
|---|
| 333 | 355 | |
|---|
| 334 | | -int rkx110_linktx_enable(struct rk_serdes *serdes, struct rk_serdes_route *route); |
|---|
| 356 | +int rkx110_display_linktx_enable(struct rk_serdes *serdes, struct rk_serdes_route *route); |
|---|
| 335 | 357 | void rkx110_linktx_video_enable(struct rk_serdes *serdes, u8 dev_id, bool enable); |
|---|
| 336 | 358 | void rkx110_linktx_channel_enable(struct rk_serdes *serdes, u8 ch_id, u8 dev_id, bool enable); |
|---|
| 337 | 359 | void rkx120_linkrx_engine_enable(struct rk_serdes *serdes, u8 en_id, u8 dev_id, bool enable); |
|---|
| 338 | 360 | void rkx110_set_stream_source(struct rk_serdes *serdes, int local_port, u8 dev_id); |
|---|
| 339 | | -int rkx120_linkrx_enable(struct rk_serdes *serdes, struct rk_serdes_route *route, u8 remote_id); |
|---|
| 361 | +int rkx120_display_linkrx_enable(struct rk_serdes *serdes, |
|---|
| 362 | + struct rk_serdes_route *route, u8 remote_id); |
|---|
| 340 | 363 | int rkx120_rgb_tx_enable(struct rk_serdes *serdes, struct rk_serdes_route *route, u8 remote_id); |
|---|
| 341 | 364 | int rkx120_lvds_tx_enable(struct rk_serdes *serdes, struct rk_serdes_route *route, u8 remote_id, |
|---|
| 342 | 365 | u8 phy_id); |
|---|
| .. | .. |
|---|
| 354 | 377 | void rkx120_pcs_enable(struct rk_serdes *serdes, bool enable, u8 pcs_id, u8 dev_id); |
|---|
| 355 | 378 | void rkx110_ser_pma_enable(struct rk_serdes *serdes, bool enable, u8 pma_id, u8 remote_id); |
|---|
| 356 | 379 | void rkx120_des_pma_enable(struct rk_serdes *serdes, bool enable, u8 pma_id, u8 remote_id); |
|---|
| 357 | | -void rkx110_linktx_wait_link_ready(struct rk_serdes *serdes, u8 id); |
|---|
| 358 | | -void rkx120_linkrx_wait_link_ready(struct rk_serdes *serdes, u8 id); |
|---|
| 380 | +int rkx110_linktx_wait_link_ready(struct rk_serdes *serdes, u8 id); |
|---|
| 381 | +int rkx120_linkrx_wait_link_ready(struct rk_serdes *serdes, u8 id); |
|---|
| 359 | 382 | void rkx110_x120_pattern_gen_debugfs_create_file(struct pattern_gen *pattern_gen, |
|---|
| 360 | 383 | struct rk_serdes_chip *chip, |
|---|
| 361 | 384 | struct dentry *dentry); |
|---|
| .. | .. |
|---|
| 363 | 386 | bool is_rx); |
|---|
| 364 | 387 | void rkx120_linkrx_passthrough_cfg(struct rk_serdes *serdes, u32 client_id, u32 func_id, |
|---|
| 365 | 388 | bool is_rx); |
|---|
| 389 | +void rkx110_irq_enable(struct rk_serdes *serdes, u8 dev_id); |
|---|
| 390 | +void rkx110_irq_disable(struct rk_serdes *serdes, u8 dev_id); |
|---|
| 391 | +int rkx110_irq_handler(struct rk_serdes *serdes, u8 dev_id); |
|---|
| 392 | +void rkx120_irq_enable(struct rk_serdes *serdes, u8 dev_id); |
|---|
| 393 | +void rkx120_irq_disable(struct rk_serdes *serdes, u8 dev_id); |
|---|
| 394 | +int rkx120_irq_handler(struct rk_serdes *serdes, u8 dev_id); |
|---|
| 395 | + |
|---|
| 396 | +int rkx110_linktx_dsi_rec_start(struct rk_serdes *serdes, u8 dev_id, u8 dsi_id, bool enable); |
|---|
| 397 | +int rkx110_linktx_dsi_type_select(struct rk_serdes *serdes, u8 dev_id, u8 dsi_id, bool is_cmd); |
|---|
| 398 | +int rkx110_linktx_dsi_deley_length_config(struct rk_serdes *serdes, u8 dev_id, u8 dsi_id, |
|---|
| 399 | + u32 length); |
|---|
| 366 | 400 | #endif |
|---|