rcar-csi2.c (39503B)
1// SPDX-License-Identifier: GPL-2.0 2/* 3 * Driver for Renesas R-Car MIPI CSI-2 Receiver 4 * 5 * Copyright (C) 2018 Renesas Electronics Corp. 6 */ 7 8#include <linux/delay.h> 9#include <linux/interrupt.h> 10#include <linux/io.h> 11#include <linux/module.h> 12#include <linux/of.h> 13#include <linux/of_device.h> 14#include <linux/of_graph.h> 15#include <linux/platform_device.h> 16#include <linux/pm_runtime.h> 17#include <linux/reset.h> 18#include <linux/sys_soc.h> 19 20#include <media/mipi-csi2.h> 21#include <media/v4l2-ctrls.h> 22#include <media/v4l2-device.h> 23#include <media/v4l2-fwnode.h> 24#include <media/v4l2-mc.h> 25#include <media/v4l2-subdev.h> 26 27struct rcar_csi2; 28 29/* Register offsets and bits */ 30 31/* Control Timing Select */ 32#define TREF_REG 0x00 33#define TREF_TREF BIT(0) 34 35/* Software Reset */ 36#define SRST_REG 0x04 37#define SRST_SRST BIT(0) 38 39/* PHY Operation Control */ 40#define PHYCNT_REG 0x08 41#define PHYCNT_SHUTDOWNZ BIT(17) 42#define PHYCNT_RSTZ BIT(16) 43#define PHYCNT_ENABLECLK BIT(4) 44#define PHYCNT_ENABLE_3 BIT(3) 45#define PHYCNT_ENABLE_2 BIT(2) 46#define PHYCNT_ENABLE_1 BIT(1) 47#define PHYCNT_ENABLE_0 BIT(0) 48 49/* Checksum Control */ 50#define CHKSUM_REG 0x0c 51#define CHKSUM_ECC_EN BIT(1) 52#define CHKSUM_CRC_EN BIT(0) 53 54/* 55 * Channel Data Type Select 56 * VCDT[0-15]: Channel 0 VCDT[16-31]: Channel 1 57 * VCDT2[0-15]: Channel 2 VCDT2[16-31]: Channel 3 58 */ 59#define VCDT_REG 0x10 60#define VCDT2_REG 0x14 61#define VCDT_VCDTN_EN BIT(15) 62#define VCDT_SEL_VC(n) (((n) & 0x3) << 8) 63#define VCDT_SEL_DTN_ON BIT(6) 64#define VCDT_SEL_DT(n) (((n) & 0x3f) << 0) 65 66/* Frame Data Type Select */ 67#define FRDT_REG 0x18 68 69/* Field Detection Control */ 70#define FLD_REG 0x1c 71#define FLD_FLD_NUM(n) (((n) & 0xff) << 16) 72#define FLD_DET_SEL(n) (((n) & 0x3) << 4) 73#define FLD_FLD_EN4 BIT(3) 74#define FLD_FLD_EN3 BIT(2) 75#define FLD_FLD_EN2 BIT(1) 76#define FLD_FLD_EN BIT(0) 77 78/* Automatic Standby Control */ 79#define ASTBY_REG 0x20 80 81/* Long Data Type Setting 0 */ 82#define LNGDT0_REG 0x28 83 84/* Long Data Type Setting 1 */ 85#define LNGDT1_REG 0x2c 86 87/* Interrupt Enable */ 88#define INTEN_REG 0x30 89#define INTEN_INT_AFIFO_OF BIT(27) 90#define INTEN_INT_ERRSOTHS BIT(4) 91#define INTEN_INT_ERRSOTSYNCHS BIT(3) 92 93/* Interrupt Source Mask */ 94#define INTCLOSE_REG 0x34 95 96/* Interrupt Status Monitor */ 97#define INTSTATE_REG 0x38 98#define INTSTATE_INT_ULPS_START BIT(7) 99#define INTSTATE_INT_ULPS_END BIT(6) 100 101/* Interrupt Error Status Monitor */ 102#define INTERRSTATE_REG 0x3c 103 104/* Short Packet Data */ 105#define SHPDAT_REG 0x40 106 107/* Short Packet Count */ 108#define SHPCNT_REG 0x44 109 110/* LINK Operation Control */ 111#define LINKCNT_REG 0x48 112#define LINKCNT_MONITOR_EN BIT(31) 113#define LINKCNT_REG_MONI_PACT_EN BIT(25) 114#define LINKCNT_ICLK_NONSTOP BIT(24) 115 116/* Lane Swap */ 117#define LSWAP_REG 0x4c 118#define LSWAP_L3SEL(n) (((n) & 0x3) << 6) 119#define LSWAP_L2SEL(n) (((n) & 0x3) << 4) 120#define LSWAP_L1SEL(n) (((n) & 0x3) << 2) 121#define LSWAP_L0SEL(n) (((n) & 0x3) << 0) 122 123/* PHY Test Interface Write Register */ 124#define PHTW_REG 0x50 125#define PHTW_DWEN BIT(24) 126#define PHTW_TESTDIN_DATA(n) (((n & 0xff)) << 16) 127#define PHTW_CWEN BIT(8) 128#define PHTW_TESTDIN_CODE(n) ((n & 0xff)) 129 130#define PHYFRX_REG 0x64 131#define PHYFRX_FORCERX_MODE_3 BIT(3) 132#define PHYFRX_FORCERX_MODE_2 BIT(2) 133#define PHYFRX_FORCERX_MODE_1 BIT(1) 134#define PHYFRX_FORCERX_MODE_0 BIT(0) 135 136struct phtw_value { 137 u16 data; 138 u16 code; 139}; 140 141struct rcsi2_mbps_reg { 142 u16 mbps; 143 u16 reg; 144}; 145 146static const struct rcsi2_mbps_reg phtw_mbps_v3u[] = { 147 { .mbps = 1500, .reg = 0xcc }, 148 { .mbps = 1550, .reg = 0x1d }, 149 { .mbps = 1600, .reg = 0x27 }, 150 { .mbps = 1650, .reg = 0x30 }, 151 { .mbps = 1700, .reg = 0x39 }, 152 { .mbps = 1750, .reg = 0x42 }, 153 { .mbps = 1800, .reg = 0x4b }, 154 { .mbps = 1850, .reg = 0x55 }, 155 { .mbps = 1900, .reg = 0x5e }, 156 { .mbps = 1950, .reg = 0x67 }, 157 { .mbps = 2000, .reg = 0x71 }, 158 { .mbps = 2050, .reg = 0x79 }, 159 { .mbps = 2100, .reg = 0x83 }, 160 { .mbps = 2150, .reg = 0x8c }, 161 { .mbps = 2200, .reg = 0x95 }, 162 { .mbps = 2250, .reg = 0x9e }, 163 { .mbps = 2300, .reg = 0xa7 }, 164 { .mbps = 2350, .reg = 0xb0 }, 165 { .mbps = 2400, .reg = 0xba }, 166 { .mbps = 2450, .reg = 0xc3 }, 167 { .mbps = 2500, .reg = 0xcc }, 168 { /* sentinel */ }, 169}; 170 171static const struct rcsi2_mbps_reg phtw_mbps_h3_v3h_m3n[] = { 172 { .mbps = 80, .reg = 0x86 }, 173 { .mbps = 90, .reg = 0x86 }, 174 { .mbps = 100, .reg = 0x87 }, 175 { .mbps = 110, .reg = 0x87 }, 176 { .mbps = 120, .reg = 0x88 }, 177 { .mbps = 130, .reg = 0x88 }, 178 { .mbps = 140, .reg = 0x89 }, 179 { .mbps = 150, .reg = 0x89 }, 180 { .mbps = 160, .reg = 0x8a }, 181 { .mbps = 170, .reg = 0x8a }, 182 { .mbps = 180, .reg = 0x8b }, 183 { .mbps = 190, .reg = 0x8b }, 184 { .mbps = 205, .reg = 0x8c }, 185 { .mbps = 220, .reg = 0x8d }, 186 { .mbps = 235, .reg = 0x8e }, 187 { .mbps = 250, .reg = 0x8e }, 188 { /* sentinel */ }, 189}; 190 191static const struct rcsi2_mbps_reg phtw_mbps_v3m_e3[] = { 192 { .mbps = 80, .reg = 0x00 }, 193 { .mbps = 90, .reg = 0x20 }, 194 { .mbps = 100, .reg = 0x40 }, 195 { .mbps = 110, .reg = 0x02 }, 196 { .mbps = 130, .reg = 0x22 }, 197 { .mbps = 140, .reg = 0x42 }, 198 { .mbps = 150, .reg = 0x04 }, 199 { .mbps = 170, .reg = 0x24 }, 200 { .mbps = 180, .reg = 0x44 }, 201 { .mbps = 200, .reg = 0x06 }, 202 { .mbps = 220, .reg = 0x26 }, 203 { .mbps = 240, .reg = 0x46 }, 204 { .mbps = 250, .reg = 0x08 }, 205 { .mbps = 270, .reg = 0x28 }, 206 { .mbps = 300, .reg = 0x0a }, 207 { .mbps = 330, .reg = 0x2a }, 208 { .mbps = 360, .reg = 0x4a }, 209 { .mbps = 400, .reg = 0x0c }, 210 { .mbps = 450, .reg = 0x2c }, 211 { .mbps = 500, .reg = 0x0e }, 212 { .mbps = 550, .reg = 0x2e }, 213 { .mbps = 600, .reg = 0x10 }, 214 { .mbps = 650, .reg = 0x30 }, 215 { .mbps = 700, .reg = 0x12 }, 216 { .mbps = 750, .reg = 0x32 }, 217 { .mbps = 800, .reg = 0x52 }, 218 { .mbps = 850, .reg = 0x72 }, 219 { .mbps = 900, .reg = 0x14 }, 220 { .mbps = 950, .reg = 0x34 }, 221 { .mbps = 1000, .reg = 0x54 }, 222 { .mbps = 1050, .reg = 0x74 }, 223 { .mbps = 1125, .reg = 0x16 }, 224 { /* sentinel */ }, 225}; 226 227/* PHY Test Interface Clear */ 228#define PHTC_REG 0x58 229#define PHTC_TESTCLR BIT(0) 230 231/* PHY Frequency Control */ 232#define PHYPLL_REG 0x68 233#define PHYPLL_HSFREQRANGE(n) ((n) << 16) 234 235static const struct rcsi2_mbps_reg hsfreqrange_v3u[] = { 236 { .mbps = 80, .reg = 0x00 }, 237 { .mbps = 90, .reg = 0x10 }, 238 { .mbps = 100, .reg = 0x20 }, 239 { .mbps = 110, .reg = 0x30 }, 240 { .mbps = 120, .reg = 0x01 }, 241 { .mbps = 130, .reg = 0x11 }, 242 { .mbps = 140, .reg = 0x21 }, 243 { .mbps = 150, .reg = 0x31 }, 244 { .mbps = 160, .reg = 0x02 }, 245 { .mbps = 170, .reg = 0x12 }, 246 { .mbps = 180, .reg = 0x22 }, 247 { .mbps = 190, .reg = 0x32 }, 248 { .mbps = 205, .reg = 0x03 }, 249 { .mbps = 220, .reg = 0x13 }, 250 { .mbps = 235, .reg = 0x23 }, 251 { .mbps = 250, .reg = 0x33 }, 252 { .mbps = 275, .reg = 0x04 }, 253 { .mbps = 300, .reg = 0x14 }, 254 { .mbps = 325, .reg = 0x25 }, 255 { .mbps = 350, .reg = 0x35 }, 256 { .mbps = 400, .reg = 0x05 }, 257 { .mbps = 450, .reg = 0x16 }, 258 { .mbps = 500, .reg = 0x26 }, 259 { .mbps = 550, .reg = 0x37 }, 260 { .mbps = 600, .reg = 0x07 }, 261 { .mbps = 650, .reg = 0x18 }, 262 { .mbps = 700, .reg = 0x28 }, 263 { .mbps = 750, .reg = 0x39 }, 264 { .mbps = 800, .reg = 0x09 }, 265 { .mbps = 850, .reg = 0x19 }, 266 { .mbps = 900, .reg = 0x29 }, 267 { .mbps = 950, .reg = 0x3a }, 268 { .mbps = 1000, .reg = 0x0a }, 269 { .mbps = 1050, .reg = 0x1a }, 270 { .mbps = 1100, .reg = 0x2a }, 271 { .mbps = 1150, .reg = 0x3b }, 272 { .mbps = 1200, .reg = 0x0b }, 273 { .mbps = 1250, .reg = 0x1b }, 274 { .mbps = 1300, .reg = 0x2b }, 275 { .mbps = 1350, .reg = 0x3c }, 276 { .mbps = 1400, .reg = 0x0c }, 277 { .mbps = 1450, .reg = 0x1c }, 278 { .mbps = 1500, .reg = 0x2c }, 279 { .mbps = 1550, .reg = 0x3d }, 280 { .mbps = 1600, .reg = 0x0d }, 281 { .mbps = 1650, .reg = 0x1d }, 282 { .mbps = 1700, .reg = 0x2e }, 283 { .mbps = 1750, .reg = 0x3e }, 284 { .mbps = 1800, .reg = 0x0e }, 285 { .mbps = 1850, .reg = 0x1e }, 286 { .mbps = 1900, .reg = 0x2f }, 287 { .mbps = 1950, .reg = 0x3f }, 288 { .mbps = 2000, .reg = 0x0f }, 289 { .mbps = 2050, .reg = 0x40 }, 290 { .mbps = 2100, .reg = 0x41 }, 291 { .mbps = 2150, .reg = 0x42 }, 292 { .mbps = 2200, .reg = 0x43 }, 293 { .mbps = 2300, .reg = 0x45 }, 294 { .mbps = 2350, .reg = 0x46 }, 295 { .mbps = 2400, .reg = 0x47 }, 296 { .mbps = 2450, .reg = 0x48 }, 297 { .mbps = 2500, .reg = 0x49 }, 298 { /* sentinel */ }, 299}; 300 301static const struct rcsi2_mbps_reg hsfreqrange_h3_v3h_m3n[] = { 302 { .mbps = 80, .reg = 0x00 }, 303 { .mbps = 90, .reg = 0x10 }, 304 { .mbps = 100, .reg = 0x20 }, 305 { .mbps = 110, .reg = 0x30 }, 306 { .mbps = 120, .reg = 0x01 }, 307 { .mbps = 130, .reg = 0x11 }, 308 { .mbps = 140, .reg = 0x21 }, 309 { .mbps = 150, .reg = 0x31 }, 310 { .mbps = 160, .reg = 0x02 }, 311 { .mbps = 170, .reg = 0x12 }, 312 { .mbps = 180, .reg = 0x22 }, 313 { .mbps = 190, .reg = 0x32 }, 314 { .mbps = 205, .reg = 0x03 }, 315 { .mbps = 220, .reg = 0x13 }, 316 { .mbps = 235, .reg = 0x23 }, 317 { .mbps = 250, .reg = 0x33 }, 318 { .mbps = 275, .reg = 0x04 }, 319 { .mbps = 300, .reg = 0x14 }, 320 { .mbps = 325, .reg = 0x25 }, 321 { .mbps = 350, .reg = 0x35 }, 322 { .mbps = 400, .reg = 0x05 }, 323 { .mbps = 450, .reg = 0x16 }, 324 { .mbps = 500, .reg = 0x26 }, 325 { .mbps = 550, .reg = 0x37 }, 326 { .mbps = 600, .reg = 0x07 }, 327 { .mbps = 650, .reg = 0x18 }, 328 { .mbps = 700, .reg = 0x28 }, 329 { .mbps = 750, .reg = 0x39 }, 330 { .mbps = 800, .reg = 0x09 }, 331 { .mbps = 850, .reg = 0x19 }, 332 { .mbps = 900, .reg = 0x29 }, 333 { .mbps = 950, .reg = 0x3a }, 334 { .mbps = 1000, .reg = 0x0a }, 335 { .mbps = 1050, .reg = 0x1a }, 336 { .mbps = 1100, .reg = 0x2a }, 337 { .mbps = 1150, .reg = 0x3b }, 338 { .mbps = 1200, .reg = 0x0b }, 339 { .mbps = 1250, .reg = 0x1b }, 340 { .mbps = 1300, .reg = 0x2b }, 341 { .mbps = 1350, .reg = 0x3c }, 342 { .mbps = 1400, .reg = 0x0c }, 343 { .mbps = 1450, .reg = 0x1c }, 344 { .mbps = 1500, .reg = 0x2c }, 345 { /* sentinel */ }, 346}; 347 348static const struct rcsi2_mbps_reg hsfreqrange_m3w_h3es1[] = { 349 { .mbps = 80, .reg = 0x00 }, 350 { .mbps = 90, .reg = 0x10 }, 351 { .mbps = 100, .reg = 0x20 }, 352 { .mbps = 110, .reg = 0x30 }, 353 { .mbps = 120, .reg = 0x01 }, 354 { .mbps = 130, .reg = 0x11 }, 355 { .mbps = 140, .reg = 0x21 }, 356 { .mbps = 150, .reg = 0x31 }, 357 { .mbps = 160, .reg = 0x02 }, 358 { .mbps = 170, .reg = 0x12 }, 359 { .mbps = 180, .reg = 0x22 }, 360 { .mbps = 190, .reg = 0x32 }, 361 { .mbps = 205, .reg = 0x03 }, 362 { .mbps = 220, .reg = 0x13 }, 363 { .mbps = 235, .reg = 0x23 }, 364 { .mbps = 250, .reg = 0x33 }, 365 { .mbps = 275, .reg = 0x04 }, 366 { .mbps = 300, .reg = 0x14 }, 367 { .mbps = 325, .reg = 0x05 }, 368 { .mbps = 350, .reg = 0x15 }, 369 { .mbps = 400, .reg = 0x25 }, 370 { .mbps = 450, .reg = 0x06 }, 371 { .mbps = 500, .reg = 0x16 }, 372 { .mbps = 550, .reg = 0x07 }, 373 { .mbps = 600, .reg = 0x17 }, 374 { .mbps = 650, .reg = 0x08 }, 375 { .mbps = 700, .reg = 0x18 }, 376 { .mbps = 750, .reg = 0x09 }, 377 { .mbps = 800, .reg = 0x19 }, 378 { .mbps = 850, .reg = 0x29 }, 379 { .mbps = 900, .reg = 0x39 }, 380 { .mbps = 950, .reg = 0x0a }, 381 { .mbps = 1000, .reg = 0x1a }, 382 { .mbps = 1050, .reg = 0x2a }, 383 { .mbps = 1100, .reg = 0x3a }, 384 { .mbps = 1150, .reg = 0x0b }, 385 { .mbps = 1200, .reg = 0x1b }, 386 { .mbps = 1250, .reg = 0x2b }, 387 { .mbps = 1300, .reg = 0x3b }, 388 { .mbps = 1350, .reg = 0x0c }, 389 { .mbps = 1400, .reg = 0x1c }, 390 { .mbps = 1450, .reg = 0x2c }, 391 { .mbps = 1500, .reg = 0x3c }, 392 { /* sentinel */ }, 393}; 394 395/* PHY ESC Error Monitor */ 396#define PHEERM_REG 0x74 397 398/* PHY Clock Lane Monitor */ 399#define PHCLM_REG 0x78 400#define PHCLM_STOPSTATECKL BIT(0) 401 402/* PHY Data Lane Monitor */ 403#define PHDLM_REG 0x7c 404 405/* CSI0CLK Frequency Configuration Preset Register */ 406#define CSI0CLKFCPR_REG 0x260 407#define CSI0CLKFREQRANGE(n) ((n & 0x3f) << 16) 408 409struct rcar_csi2_format { 410 u32 code; 411 unsigned int datatype; 412 unsigned int bpp; 413}; 414 415static const struct rcar_csi2_format rcar_csi2_formats[] = { 416 { 417 .code = MEDIA_BUS_FMT_RGB888_1X24, 418 .datatype = MIPI_CSI2_DT_RGB888, 419 .bpp = 24, 420 }, { 421 .code = MEDIA_BUS_FMT_UYVY8_1X16, 422 .datatype = MIPI_CSI2_DT_YUV422_8B, 423 .bpp = 16, 424 }, { 425 .code = MEDIA_BUS_FMT_YUYV8_1X16, 426 .datatype = MIPI_CSI2_DT_YUV422_8B, 427 .bpp = 16, 428 }, { 429 .code = MEDIA_BUS_FMT_UYVY8_2X8, 430 .datatype = MIPI_CSI2_DT_YUV422_8B, 431 .bpp = 16, 432 }, { 433 .code = MEDIA_BUS_FMT_YUYV10_2X10, 434 .datatype = MIPI_CSI2_DT_YUV422_8B, 435 .bpp = 20, 436 }, { 437 .code = MEDIA_BUS_FMT_Y10_1X10, 438 .datatype = MIPI_CSI2_DT_RAW10, 439 .bpp = 10, 440 }, { 441 .code = MEDIA_BUS_FMT_SBGGR8_1X8, 442 .datatype = MIPI_CSI2_DT_RAW8, 443 .bpp = 8, 444 }, { 445 .code = MEDIA_BUS_FMT_SGBRG8_1X8, 446 .datatype = MIPI_CSI2_DT_RAW8, 447 .bpp = 8, 448 }, { 449 .code = MEDIA_BUS_FMT_SGRBG8_1X8, 450 .datatype = MIPI_CSI2_DT_RAW8, 451 .bpp = 8, 452 }, { 453 .code = MEDIA_BUS_FMT_SRGGB8_1X8, 454 .datatype = MIPI_CSI2_DT_RAW8, 455 .bpp = 8, 456 }, { 457 .code = MEDIA_BUS_FMT_Y8_1X8, 458 .datatype = MIPI_CSI2_DT_RAW8, 459 .bpp = 8, 460 }, 461}; 462 463static const struct rcar_csi2_format *rcsi2_code_to_fmt(unsigned int code) 464{ 465 unsigned int i; 466 467 for (i = 0; i < ARRAY_SIZE(rcar_csi2_formats); i++) 468 if (rcar_csi2_formats[i].code == code) 469 return &rcar_csi2_formats[i]; 470 471 return NULL; 472} 473 474enum rcar_csi2_pads { 475 RCAR_CSI2_SINK, 476 RCAR_CSI2_SOURCE_VC0, 477 RCAR_CSI2_SOURCE_VC1, 478 RCAR_CSI2_SOURCE_VC2, 479 RCAR_CSI2_SOURCE_VC3, 480 NR_OF_RCAR_CSI2_PAD, 481}; 482 483struct rcar_csi2_info { 484 int (*init_phtw)(struct rcar_csi2 *priv, unsigned int mbps); 485 int (*phy_post_init)(struct rcar_csi2 *priv); 486 const struct rcsi2_mbps_reg *hsfreqrange; 487 unsigned int csi0clkfreqrange; 488 unsigned int num_channels; 489 bool clear_ulps; 490 bool use_isp; 491}; 492 493struct rcar_csi2 { 494 struct device *dev; 495 void __iomem *base; 496 const struct rcar_csi2_info *info; 497 struct reset_control *rstc; 498 499 struct v4l2_subdev subdev; 500 struct media_pad pads[NR_OF_RCAR_CSI2_PAD]; 501 502 struct v4l2_async_notifier notifier; 503 struct v4l2_subdev *remote; 504 unsigned int remote_pad; 505 506 int channel_vc[4]; 507 508 struct mutex lock; /* Protects mf and stream_count. */ 509 struct v4l2_mbus_framefmt mf; 510 int stream_count; 511 512 unsigned short lanes; 513 unsigned char lane_swap[4]; 514}; 515 516static inline struct rcar_csi2 *sd_to_csi2(struct v4l2_subdev *sd) 517{ 518 return container_of(sd, struct rcar_csi2, subdev); 519} 520 521static inline struct rcar_csi2 *notifier_to_csi2(struct v4l2_async_notifier *n) 522{ 523 return container_of(n, struct rcar_csi2, notifier); 524} 525 526static u32 rcsi2_read(struct rcar_csi2 *priv, unsigned int reg) 527{ 528 return ioread32(priv->base + reg); 529} 530 531static void rcsi2_write(struct rcar_csi2 *priv, unsigned int reg, u32 data) 532{ 533 iowrite32(data, priv->base + reg); 534} 535 536static void rcsi2_enter_standby(struct rcar_csi2 *priv) 537{ 538 rcsi2_write(priv, PHYCNT_REG, 0); 539 rcsi2_write(priv, PHTC_REG, PHTC_TESTCLR); 540 reset_control_assert(priv->rstc); 541 usleep_range(100, 150); 542 pm_runtime_put(priv->dev); 543} 544 545static int rcsi2_exit_standby(struct rcar_csi2 *priv) 546{ 547 int ret; 548 549 ret = pm_runtime_resume_and_get(priv->dev); 550 if (ret < 0) 551 return ret; 552 553 reset_control_deassert(priv->rstc); 554 555 return 0; 556} 557 558static int rcsi2_wait_phy_start(struct rcar_csi2 *priv, 559 unsigned int lanes) 560{ 561 unsigned int timeout; 562 563 /* Wait for the clock and data lanes to enter LP-11 state. */ 564 for (timeout = 0; timeout <= 20; timeout++) { 565 const u32 lane_mask = (1 << lanes) - 1; 566 567 if ((rcsi2_read(priv, PHCLM_REG) & PHCLM_STOPSTATECKL) && 568 (rcsi2_read(priv, PHDLM_REG) & lane_mask) == lane_mask) 569 return 0; 570 571 usleep_range(1000, 2000); 572 } 573 574 dev_err(priv->dev, "Timeout waiting for LP-11 state\n"); 575 576 return -ETIMEDOUT; 577} 578 579static int rcsi2_set_phypll(struct rcar_csi2 *priv, unsigned int mbps) 580{ 581 const struct rcsi2_mbps_reg *hsfreq; 582 const struct rcsi2_mbps_reg *hsfreq_prev = NULL; 583 584 if (mbps < priv->info->hsfreqrange->mbps) 585 dev_warn(priv->dev, "%u Mbps less than min PHY speed %u Mbps", 586 mbps, priv->info->hsfreqrange->mbps); 587 588 for (hsfreq = priv->info->hsfreqrange; hsfreq->mbps != 0; hsfreq++) { 589 if (hsfreq->mbps >= mbps) 590 break; 591 hsfreq_prev = hsfreq; 592 } 593 594 if (!hsfreq->mbps) { 595 dev_err(priv->dev, "Unsupported PHY speed (%u Mbps)", mbps); 596 return -ERANGE; 597 } 598 599 if (hsfreq_prev && 600 ((mbps - hsfreq_prev->mbps) <= (hsfreq->mbps - mbps))) 601 hsfreq = hsfreq_prev; 602 603 rcsi2_write(priv, PHYPLL_REG, PHYPLL_HSFREQRANGE(hsfreq->reg)); 604 605 return 0; 606} 607 608static int rcsi2_calc_mbps(struct rcar_csi2 *priv, unsigned int bpp, 609 unsigned int lanes) 610{ 611 struct v4l2_subdev *source; 612 struct v4l2_ctrl *ctrl; 613 u64 mbps; 614 615 if (!priv->remote) 616 return -ENODEV; 617 618 source = priv->remote; 619 620 /* Read the pixel rate control from remote. */ 621 ctrl = v4l2_ctrl_find(source->ctrl_handler, V4L2_CID_PIXEL_RATE); 622 if (!ctrl) { 623 dev_err(priv->dev, "no pixel rate control in subdev %s\n", 624 source->name); 625 return -EINVAL; 626 } 627 628 /* 629 * Calculate the phypll in mbps. 630 * link_freq = (pixel_rate * bits_per_sample) / (2 * nr_of_lanes) 631 * bps = link_freq * 2 632 */ 633 mbps = v4l2_ctrl_g_ctrl_int64(ctrl) * bpp; 634 do_div(mbps, lanes * 1000000); 635 636 return mbps; 637} 638 639static int rcsi2_get_active_lanes(struct rcar_csi2 *priv, 640 unsigned int *lanes) 641{ 642 struct v4l2_mbus_config mbus_config = { 0 }; 643 int ret; 644 645 *lanes = priv->lanes; 646 647 ret = v4l2_subdev_call(priv->remote, pad, get_mbus_config, 648 priv->remote_pad, &mbus_config); 649 if (ret == -ENOIOCTLCMD) { 650 dev_dbg(priv->dev, "No remote mbus configuration available\n"); 651 return 0; 652 } 653 654 if (ret) { 655 dev_err(priv->dev, "Failed to get remote mbus configuration\n"); 656 return ret; 657 } 658 659 if (mbus_config.type != V4L2_MBUS_CSI2_DPHY) { 660 dev_err(priv->dev, "Unsupported media bus type %u\n", 661 mbus_config.type); 662 return -EINVAL; 663 } 664 665 if (mbus_config.bus.mipi_csi2.num_data_lanes > priv->lanes) { 666 dev_err(priv->dev, 667 "Unsupported mbus config: too many data lanes %u\n", 668 mbus_config.bus.mipi_csi2.num_data_lanes); 669 return -EINVAL; 670 } 671 672 *lanes = mbus_config.bus.mipi_csi2.num_data_lanes; 673 674 return 0; 675} 676 677static int rcsi2_start_receiver(struct rcar_csi2 *priv) 678{ 679 const struct rcar_csi2_format *format; 680 u32 phycnt, vcdt = 0, vcdt2 = 0, fld = 0; 681 unsigned int lanes; 682 unsigned int i; 683 int mbps, ret; 684 685 dev_dbg(priv->dev, "Input size (%ux%u%c)\n", 686 priv->mf.width, priv->mf.height, 687 priv->mf.field == V4L2_FIELD_NONE ? 'p' : 'i'); 688 689 /* Code is validated in set_fmt. */ 690 format = rcsi2_code_to_fmt(priv->mf.code); 691 if (!format) 692 return -EINVAL; 693 694 /* 695 * Enable all supported CSI-2 channels with virtual channel and 696 * data type matching. 697 * 698 * NOTE: It's not possible to get individual datatype for each 699 * source virtual channel. Once this is possible in V4L2 700 * it should be used here. 701 */ 702 for (i = 0; i < priv->info->num_channels; i++) { 703 u32 vcdt_part; 704 705 if (priv->channel_vc[i] < 0) 706 continue; 707 708 vcdt_part = VCDT_SEL_VC(priv->channel_vc[i]) | VCDT_VCDTN_EN | 709 VCDT_SEL_DTN_ON | VCDT_SEL_DT(format->datatype); 710 711 /* Store in correct reg and offset. */ 712 if (i < 2) 713 vcdt |= vcdt_part << ((i % 2) * 16); 714 else 715 vcdt2 |= vcdt_part << ((i % 2) * 16); 716 } 717 718 if (priv->mf.field == V4L2_FIELD_ALTERNATE) { 719 fld = FLD_DET_SEL(1) | FLD_FLD_EN4 | FLD_FLD_EN3 | FLD_FLD_EN2 720 | FLD_FLD_EN; 721 722 if (priv->mf.height == 240) 723 fld |= FLD_FLD_NUM(0); 724 else 725 fld |= FLD_FLD_NUM(1); 726 } 727 728 /* 729 * Get the number of active data lanes inspecting the remote mbus 730 * configuration. 731 */ 732 ret = rcsi2_get_active_lanes(priv, &lanes); 733 if (ret) 734 return ret; 735 736 phycnt = PHYCNT_ENABLECLK; 737 phycnt |= (1 << lanes) - 1; 738 739 mbps = rcsi2_calc_mbps(priv, format->bpp, lanes); 740 if (mbps < 0) 741 return mbps; 742 743 /* Enable interrupts. */ 744 rcsi2_write(priv, INTEN_REG, INTEN_INT_AFIFO_OF | INTEN_INT_ERRSOTHS 745 | INTEN_INT_ERRSOTSYNCHS); 746 747 /* Init */ 748 rcsi2_write(priv, TREF_REG, TREF_TREF); 749 rcsi2_write(priv, PHTC_REG, 0); 750 751 /* Configure */ 752 if (!priv->info->use_isp) { 753 rcsi2_write(priv, VCDT_REG, vcdt); 754 if (vcdt2) 755 rcsi2_write(priv, VCDT2_REG, vcdt2); 756 } 757 758 /* Lanes are zero indexed. */ 759 rcsi2_write(priv, LSWAP_REG, 760 LSWAP_L0SEL(priv->lane_swap[0] - 1) | 761 LSWAP_L1SEL(priv->lane_swap[1] - 1) | 762 LSWAP_L2SEL(priv->lane_swap[2] - 1) | 763 LSWAP_L3SEL(priv->lane_swap[3] - 1)); 764 765 /* Start */ 766 if (priv->info->init_phtw) { 767 ret = priv->info->init_phtw(priv, mbps); 768 if (ret) 769 return ret; 770 } 771 772 if (priv->info->hsfreqrange) { 773 ret = rcsi2_set_phypll(priv, mbps); 774 if (ret) 775 return ret; 776 } 777 778 if (priv->info->csi0clkfreqrange) 779 rcsi2_write(priv, CSI0CLKFCPR_REG, 780 CSI0CLKFREQRANGE(priv->info->csi0clkfreqrange)); 781 782 if (priv->info->use_isp) 783 rcsi2_write(priv, PHYFRX_REG, 784 PHYFRX_FORCERX_MODE_3 | PHYFRX_FORCERX_MODE_2 | 785 PHYFRX_FORCERX_MODE_1 | PHYFRX_FORCERX_MODE_0); 786 787 rcsi2_write(priv, PHYCNT_REG, phycnt); 788 rcsi2_write(priv, LINKCNT_REG, LINKCNT_MONITOR_EN | 789 LINKCNT_REG_MONI_PACT_EN | LINKCNT_ICLK_NONSTOP); 790 rcsi2_write(priv, FLD_REG, fld); 791 rcsi2_write(priv, PHYCNT_REG, phycnt | PHYCNT_SHUTDOWNZ); 792 rcsi2_write(priv, PHYCNT_REG, phycnt | PHYCNT_SHUTDOWNZ | PHYCNT_RSTZ); 793 794 ret = rcsi2_wait_phy_start(priv, lanes); 795 if (ret) 796 return ret; 797 798 if (priv->info->use_isp) 799 rcsi2_write(priv, PHYFRX_REG, 0); 800 801 /* Run post PHY start initialization, if needed. */ 802 if (priv->info->phy_post_init) { 803 ret = priv->info->phy_post_init(priv); 804 if (ret) 805 return ret; 806 } 807 808 /* Clear Ultra Low Power interrupt. */ 809 if (priv->info->clear_ulps) 810 rcsi2_write(priv, INTSTATE_REG, 811 INTSTATE_INT_ULPS_START | 812 INTSTATE_INT_ULPS_END); 813 return 0; 814} 815 816static int rcsi2_start(struct rcar_csi2 *priv) 817{ 818 int ret; 819 820 ret = rcsi2_exit_standby(priv); 821 if (ret < 0) 822 return ret; 823 824 ret = rcsi2_start_receiver(priv); 825 if (ret) { 826 rcsi2_enter_standby(priv); 827 return ret; 828 } 829 830 ret = v4l2_subdev_call(priv->remote, video, s_stream, 1); 831 if (ret) { 832 rcsi2_enter_standby(priv); 833 return ret; 834 } 835 836 return 0; 837} 838 839static void rcsi2_stop(struct rcar_csi2 *priv) 840{ 841 rcsi2_enter_standby(priv); 842 v4l2_subdev_call(priv->remote, video, s_stream, 0); 843} 844 845static int rcsi2_s_stream(struct v4l2_subdev *sd, int enable) 846{ 847 struct rcar_csi2 *priv = sd_to_csi2(sd); 848 int ret = 0; 849 850 mutex_lock(&priv->lock); 851 852 if (!priv->remote) { 853 ret = -ENODEV; 854 goto out; 855 } 856 857 if (enable && priv->stream_count == 0) { 858 ret = rcsi2_start(priv); 859 if (ret) 860 goto out; 861 } else if (!enable && priv->stream_count == 1) { 862 rcsi2_stop(priv); 863 } 864 865 priv->stream_count += enable ? 1 : -1; 866out: 867 mutex_unlock(&priv->lock); 868 869 return ret; 870} 871 872static int rcsi2_set_pad_format(struct v4l2_subdev *sd, 873 struct v4l2_subdev_state *sd_state, 874 struct v4l2_subdev_format *format) 875{ 876 struct rcar_csi2 *priv = sd_to_csi2(sd); 877 struct v4l2_mbus_framefmt *framefmt; 878 879 mutex_lock(&priv->lock); 880 881 if (!rcsi2_code_to_fmt(format->format.code)) 882 format->format.code = rcar_csi2_formats[0].code; 883 884 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) { 885 priv->mf = format->format; 886 } else { 887 framefmt = v4l2_subdev_get_try_format(sd, sd_state, 0); 888 *framefmt = format->format; 889 } 890 891 mutex_unlock(&priv->lock); 892 893 return 0; 894} 895 896static int rcsi2_get_pad_format(struct v4l2_subdev *sd, 897 struct v4l2_subdev_state *sd_state, 898 struct v4l2_subdev_format *format) 899{ 900 struct rcar_csi2 *priv = sd_to_csi2(sd); 901 902 mutex_lock(&priv->lock); 903 904 if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE) 905 format->format = priv->mf; 906 else 907 format->format = *v4l2_subdev_get_try_format(sd, sd_state, 0); 908 909 mutex_unlock(&priv->lock); 910 911 return 0; 912} 913 914static const struct v4l2_subdev_video_ops rcar_csi2_video_ops = { 915 .s_stream = rcsi2_s_stream, 916}; 917 918static const struct v4l2_subdev_pad_ops rcar_csi2_pad_ops = { 919 .set_fmt = rcsi2_set_pad_format, 920 .get_fmt = rcsi2_get_pad_format, 921}; 922 923static const struct v4l2_subdev_ops rcar_csi2_subdev_ops = { 924 .video = &rcar_csi2_video_ops, 925 .pad = &rcar_csi2_pad_ops, 926}; 927 928static irqreturn_t rcsi2_irq(int irq, void *data) 929{ 930 struct rcar_csi2 *priv = data; 931 u32 status, err_status; 932 933 status = rcsi2_read(priv, INTSTATE_REG); 934 err_status = rcsi2_read(priv, INTERRSTATE_REG); 935 936 if (!status) 937 return IRQ_HANDLED; 938 939 rcsi2_write(priv, INTSTATE_REG, status); 940 941 if (!err_status) 942 return IRQ_HANDLED; 943 944 rcsi2_write(priv, INTERRSTATE_REG, err_status); 945 946 dev_info(priv->dev, "Transfer error, restarting CSI-2 receiver\n"); 947 948 return IRQ_WAKE_THREAD; 949} 950 951static irqreturn_t rcsi2_irq_thread(int irq, void *data) 952{ 953 struct rcar_csi2 *priv = data; 954 955 mutex_lock(&priv->lock); 956 rcsi2_stop(priv); 957 usleep_range(1000, 2000); 958 if (rcsi2_start(priv)) 959 dev_warn(priv->dev, "Failed to restart CSI-2 receiver\n"); 960 mutex_unlock(&priv->lock); 961 962 return IRQ_HANDLED; 963} 964 965/* ----------------------------------------------------------------------------- 966 * Async handling and registration of subdevices and links. 967 */ 968 969static int rcsi2_notify_bound(struct v4l2_async_notifier *notifier, 970 struct v4l2_subdev *subdev, 971 struct v4l2_async_subdev *asd) 972{ 973 struct rcar_csi2 *priv = notifier_to_csi2(notifier); 974 int pad; 975 976 pad = media_entity_get_fwnode_pad(&subdev->entity, asd->match.fwnode, 977 MEDIA_PAD_FL_SOURCE); 978 if (pad < 0) { 979 dev_err(priv->dev, "Failed to find pad for %s\n", subdev->name); 980 return pad; 981 } 982 983 priv->remote = subdev; 984 priv->remote_pad = pad; 985 986 dev_dbg(priv->dev, "Bound %s pad: %d\n", subdev->name, pad); 987 988 return media_create_pad_link(&subdev->entity, pad, 989 &priv->subdev.entity, 0, 990 MEDIA_LNK_FL_ENABLED | 991 MEDIA_LNK_FL_IMMUTABLE); 992} 993 994static void rcsi2_notify_unbind(struct v4l2_async_notifier *notifier, 995 struct v4l2_subdev *subdev, 996 struct v4l2_async_subdev *asd) 997{ 998 struct rcar_csi2 *priv = notifier_to_csi2(notifier); 999 1000 priv->remote = NULL; 1001 1002 dev_dbg(priv->dev, "Unbind %s\n", subdev->name); 1003} 1004 1005static const struct v4l2_async_notifier_operations rcar_csi2_notify_ops = { 1006 .bound = rcsi2_notify_bound, 1007 .unbind = rcsi2_notify_unbind, 1008}; 1009 1010static int rcsi2_parse_v4l2(struct rcar_csi2 *priv, 1011 struct v4l2_fwnode_endpoint *vep) 1012{ 1013 unsigned int i; 1014 1015 /* Only port 0 endpoint 0 is valid. */ 1016 if (vep->base.port || vep->base.id) 1017 return -ENOTCONN; 1018 1019 if (vep->bus_type != V4L2_MBUS_CSI2_DPHY) { 1020 dev_err(priv->dev, "Unsupported bus: %u\n", vep->bus_type); 1021 return -EINVAL; 1022 } 1023 1024 priv->lanes = vep->bus.mipi_csi2.num_data_lanes; 1025 if (priv->lanes != 1 && priv->lanes != 2 && priv->lanes != 4) { 1026 dev_err(priv->dev, "Unsupported number of data-lanes: %u\n", 1027 priv->lanes); 1028 return -EINVAL; 1029 } 1030 1031 for (i = 0; i < ARRAY_SIZE(priv->lane_swap); i++) { 1032 priv->lane_swap[i] = i < priv->lanes ? 1033 vep->bus.mipi_csi2.data_lanes[i] : i; 1034 1035 /* Check for valid lane number. */ 1036 if (priv->lane_swap[i] < 1 || priv->lane_swap[i] > 4) { 1037 dev_err(priv->dev, "data-lanes must be in 1-4 range\n"); 1038 return -EINVAL; 1039 } 1040 } 1041 1042 return 0; 1043} 1044 1045static int rcsi2_parse_dt(struct rcar_csi2 *priv) 1046{ 1047 struct v4l2_async_subdev *asd; 1048 struct fwnode_handle *fwnode; 1049 struct fwnode_handle *ep; 1050 struct v4l2_fwnode_endpoint v4l2_ep = { 1051 .bus_type = V4L2_MBUS_CSI2_DPHY 1052 }; 1053 int ret; 1054 1055 ep = fwnode_graph_get_endpoint_by_id(dev_fwnode(priv->dev), 0, 0, 0); 1056 if (!ep) { 1057 dev_err(priv->dev, "Not connected to subdevice\n"); 1058 return -EINVAL; 1059 } 1060 1061 ret = v4l2_fwnode_endpoint_parse(ep, &v4l2_ep); 1062 if (ret) { 1063 dev_err(priv->dev, "Could not parse v4l2 endpoint\n"); 1064 fwnode_handle_put(ep); 1065 return -EINVAL; 1066 } 1067 1068 ret = rcsi2_parse_v4l2(priv, &v4l2_ep); 1069 if (ret) { 1070 fwnode_handle_put(ep); 1071 return ret; 1072 } 1073 1074 fwnode = fwnode_graph_get_remote_endpoint(ep); 1075 fwnode_handle_put(ep); 1076 1077 dev_dbg(priv->dev, "Found '%pOF'\n", to_of_node(fwnode)); 1078 1079 v4l2_async_nf_init(&priv->notifier); 1080 priv->notifier.ops = &rcar_csi2_notify_ops; 1081 1082 asd = v4l2_async_nf_add_fwnode(&priv->notifier, fwnode, 1083 struct v4l2_async_subdev); 1084 fwnode_handle_put(fwnode); 1085 if (IS_ERR(asd)) 1086 return PTR_ERR(asd); 1087 1088 ret = v4l2_async_subdev_nf_register(&priv->subdev, &priv->notifier); 1089 if (ret) 1090 v4l2_async_nf_cleanup(&priv->notifier); 1091 1092 return ret; 1093} 1094 1095/* ----------------------------------------------------------------------------- 1096 * PHTW initialization sequences. 1097 * 1098 * NOTE: Magic values are from the datasheet and lack documentation. 1099 */ 1100 1101static int rcsi2_phtw_write(struct rcar_csi2 *priv, u16 data, u16 code) 1102{ 1103 unsigned int timeout; 1104 1105 rcsi2_write(priv, PHTW_REG, 1106 PHTW_DWEN | PHTW_TESTDIN_DATA(data) | 1107 PHTW_CWEN | PHTW_TESTDIN_CODE(code)); 1108 1109 /* Wait for DWEN and CWEN to be cleared by hardware. */ 1110 for (timeout = 0; timeout <= 20; timeout++) { 1111 if (!(rcsi2_read(priv, PHTW_REG) & (PHTW_DWEN | PHTW_CWEN))) 1112 return 0; 1113 1114 usleep_range(1000, 2000); 1115 } 1116 1117 dev_err(priv->dev, "Timeout waiting for PHTW_DWEN and/or PHTW_CWEN\n"); 1118 1119 return -ETIMEDOUT; 1120} 1121 1122static int rcsi2_phtw_write_array(struct rcar_csi2 *priv, 1123 const struct phtw_value *values) 1124{ 1125 const struct phtw_value *value; 1126 int ret; 1127 1128 for (value = values; value->data || value->code; value++) { 1129 ret = rcsi2_phtw_write(priv, value->data, value->code); 1130 if (ret) 1131 return ret; 1132 } 1133 1134 return 0; 1135} 1136 1137static int rcsi2_phtw_write_mbps(struct rcar_csi2 *priv, unsigned int mbps, 1138 const struct rcsi2_mbps_reg *values, u16 code) 1139{ 1140 const struct rcsi2_mbps_reg *value; 1141 const struct rcsi2_mbps_reg *prev_value = NULL; 1142 1143 for (value = values; value->mbps; value++) { 1144 if (value->mbps >= mbps) 1145 break; 1146 prev_value = value; 1147 } 1148 1149 if (prev_value && 1150 ((mbps - prev_value->mbps) <= (value->mbps - mbps))) 1151 value = prev_value; 1152 1153 if (!value->mbps) { 1154 dev_err(priv->dev, "Unsupported PHY speed (%u Mbps)", mbps); 1155 return -ERANGE; 1156 } 1157 1158 return rcsi2_phtw_write(priv, value->reg, code); 1159} 1160 1161static int __rcsi2_init_phtw_h3_v3h_m3n(struct rcar_csi2 *priv, 1162 unsigned int mbps) 1163{ 1164 static const struct phtw_value step1[] = { 1165 { .data = 0xcc, .code = 0xe2 }, 1166 { .data = 0x01, .code = 0xe3 }, 1167 { .data = 0x11, .code = 0xe4 }, 1168 { .data = 0x01, .code = 0xe5 }, 1169 { .data = 0x10, .code = 0x04 }, 1170 { /* sentinel */ }, 1171 }; 1172 1173 static const struct phtw_value step2[] = { 1174 { .data = 0x38, .code = 0x08 }, 1175 { .data = 0x01, .code = 0x00 }, 1176 { .data = 0x4b, .code = 0xac }, 1177 { .data = 0x03, .code = 0x00 }, 1178 { .data = 0x80, .code = 0x07 }, 1179 { /* sentinel */ }, 1180 }; 1181 1182 int ret; 1183 1184 ret = rcsi2_phtw_write_array(priv, step1); 1185 if (ret) 1186 return ret; 1187 1188 if (mbps != 0 && mbps <= 250) { 1189 ret = rcsi2_phtw_write(priv, 0x39, 0x05); 1190 if (ret) 1191 return ret; 1192 1193 ret = rcsi2_phtw_write_mbps(priv, mbps, phtw_mbps_h3_v3h_m3n, 1194 0xf1); 1195 if (ret) 1196 return ret; 1197 } 1198 1199 return rcsi2_phtw_write_array(priv, step2); 1200} 1201 1202static int rcsi2_init_phtw_h3_v3h_m3n(struct rcar_csi2 *priv, unsigned int mbps) 1203{ 1204 return __rcsi2_init_phtw_h3_v3h_m3n(priv, mbps); 1205} 1206 1207static int rcsi2_init_phtw_h3es2(struct rcar_csi2 *priv, unsigned int mbps) 1208{ 1209 return __rcsi2_init_phtw_h3_v3h_m3n(priv, 0); 1210} 1211 1212static int rcsi2_init_phtw_v3m_e3(struct rcar_csi2 *priv, unsigned int mbps) 1213{ 1214 return rcsi2_phtw_write_mbps(priv, mbps, phtw_mbps_v3m_e3, 0x44); 1215} 1216 1217static int rcsi2_phy_post_init_v3m_e3(struct rcar_csi2 *priv) 1218{ 1219 static const struct phtw_value step1[] = { 1220 { .data = 0xee, .code = 0x34 }, 1221 { .data = 0xee, .code = 0x44 }, 1222 { .data = 0xee, .code = 0x54 }, 1223 { .data = 0xee, .code = 0x84 }, 1224 { .data = 0xee, .code = 0x94 }, 1225 { /* sentinel */ }, 1226 }; 1227 1228 return rcsi2_phtw_write_array(priv, step1); 1229} 1230 1231static int rcsi2_init_phtw_v3u(struct rcar_csi2 *priv, 1232 unsigned int mbps) 1233{ 1234 /* In case of 1500Mbps or less */ 1235 static const struct phtw_value step1[] = { 1236 { .data = 0xcc, .code = 0xe2 }, 1237 { /* sentinel */ }, 1238 }; 1239 1240 static const struct phtw_value step2[] = { 1241 { .data = 0x01, .code = 0xe3 }, 1242 { .data = 0x11, .code = 0xe4 }, 1243 { .data = 0x01, .code = 0xe5 }, 1244 { /* sentinel */ }, 1245 }; 1246 1247 /* In case of 1500Mbps or less */ 1248 static const struct phtw_value step3[] = { 1249 { .data = 0x38, .code = 0x08 }, 1250 { /* sentinel */ }, 1251 }; 1252 1253 static const struct phtw_value step4[] = { 1254 { .data = 0x01, .code = 0x00 }, 1255 { .data = 0x4b, .code = 0xac }, 1256 { .data = 0x03, .code = 0x00 }, 1257 { .data = 0x80, .code = 0x07 }, 1258 { /* sentinel */ }, 1259 }; 1260 1261 int ret; 1262 1263 if (mbps != 0 && mbps <= 1500) 1264 ret = rcsi2_phtw_write_array(priv, step1); 1265 else 1266 ret = rcsi2_phtw_write_mbps(priv, mbps, phtw_mbps_v3u, 0xe2); 1267 if (ret) 1268 return ret; 1269 1270 ret = rcsi2_phtw_write_array(priv, step2); 1271 if (ret) 1272 return ret; 1273 1274 if (mbps != 0 && mbps <= 1500) { 1275 ret = rcsi2_phtw_write_array(priv, step3); 1276 if (ret) 1277 return ret; 1278 } 1279 1280 ret = rcsi2_phtw_write_array(priv, step4); 1281 if (ret) 1282 return ret; 1283 1284 return ret; 1285} 1286 1287/* ----------------------------------------------------------------------------- 1288 * Platform Device Driver. 1289 */ 1290 1291static int rcsi2_link_setup(struct media_entity *entity, 1292 const struct media_pad *local, 1293 const struct media_pad *remote, u32 flags) 1294{ 1295 struct v4l2_subdev *sd = media_entity_to_v4l2_subdev(entity); 1296 struct rcar_csi2 *priv = sd_to_csi2(sd); 1297 struct video_device *vdev; 1298 int channel, vc; 1299 u32 id; 1300 1301 if (!is_media_entity_v4l2_video_device(remote->entity)) { 1302 dev_err(priv->dev, "Remote is not a video device\n"); 1303 return -EINVAL; 1304 } 1305 1306 vdev = media_entity_to_video_device(remote->entity); 1307 1308 if (of_property_read_u32(vdev->dev_parent->of_node, "renesas,id", &id)) { 1309 dev_err(priv->dev, "No renesas,id, can't configure routing\n"); 1310 return -EINVAL; 1311 } 1312 1313 channel = id % 4; 1314 1315 if (flags & MEDIA_LNK_FL_ENABLED) { 1316 if (media_entity_remote_pad(local)) { 1317 dev_dbg(priv->dev, 1318 "Each VC can only be routed to one output channel\n"); 1319 return -EINVAL; 1320 } 1321 1322 vc = local->index - 1; 1323 1324 dev_dbg(priv->dev, "Route VC%d to VIN%u on output channel %d\n", 1325 vc, id, channel); 1326 } else { 1327 vc = -1; 1328 } 1329 1330 priv->channel_vc[channel] = vc; 1331 1332 return 0; 1333} 1334 1335static const struct media_entity_operations rcar_csi2_entity_ops = { 1336 .link_setup = rcsi2_link_setup, 1337 .link_validate = v4l2_subdev_link_validate, 1338}; 1339 1340static int rcsi2_probe_resources(struct rcar_csi2 *priv, 1341 struct platform_device *pdev) 1342{ 1343 int irq, ret; 1344 1345 priv->base = devm_platform_ioremap_resource(pdev, 0); 1346 if (IS_ERR(priv->base)) 1347 return PTR_ERR(priv->base); 1348 1349 irq = platform_get_irq(pdev, 0); 1350 if (irq < 0) 1351 return irq; 1352 1353 ret = devm_request_threaded_irq(&pdev->dev, irq, rcsi2_irq, 1354 rcsi2_irq_thread, IRQF_SHARED, 1355 KBUILD_MODNAME, priv); 1356 if (ret) 1357 return ret; 1358 1359 priv->rstc = devm_reset_control_get(&pdev->dev, NULL); 1360 1361 return PTR_ERR_OR_ZERO(priv->rstc); 1362} 1363 1364static const struct rcar_csi2_info rcar_csi2_info_r8a7795 = { 1365 .init_phtw = rcsi2_init_phtw_h3_v3h_m3n, 1366 .hsfreqrange = hsfreqrange_h3_v3h_m3n, 1367 .csi0clkfreqrange = 0x20, 1368 .num_channels = 4, 1369 .clear_ulps = true, 1370}; 1371 1372static const struct rcar_csi2_info rcar_csi2_info_r8a7795es1 = { 1373 .hsfreqrange = hsfreqrange_m3w_h3es1, 1374 .num_channels = 4, 1375}; 1376 1377static const struct rcar_csi2_info rcar_csi2_info_r8a7795es2 = { 1378 .init_phtw = rcsi2_init_phtw_h3es2, 1379 .hsfreqrange = hsfreqrange_h3_v3h_m3n, 1380 .csi0clkfreqrange = 0x20, 1381 .num_channels = 4, 1382 .clear_ulps = true, 1383}; 1384 1385static const struct rcar_csi2_info rcar_csi2_info_r8a7796 = { 1386 .hsfreqrange = hsfreqrange_m3w_h3es1, 1387 .num_channels = 4, 1388}; 1389 1390static const struct rcar_csi2_info rcar_csi2_info_r8a77961 = { 1391 .hsfreqrange = hsfreqrange_m3w_h3es1, 1392 .num_channels = 4, 1393}; 1394 1395static const struct rcar_csi2_info rcar_csi2_info_r8a77965 = { 1396 .init_phtw = rcsi2_init_phtw_h3_v3h_m3n, 1397 .hsfreqrange = hsfreqrange_h3_v3h_m3n, 1398 .csi0clkfreqrange = 0x20, 1399 .num_channels = 4, 1400 .clear_ulps = true, 1401}; 1402 1403static const struct rcar_csi2_info rcar_csi2_info_r8a77970 = { 1404 .init_phtw = rcsi2_init_phtw_v3m_e3, 1405 .phy_post_init = rcsi2_phy_post_init_v3m_e3, 1406 .num_channels = 4, 1407}; 1408 1409static const struct rcar_csi2_info rcar_csi2_info_r8a77980 = { 1410 .init_phtw = rcsi2_init_phtw_h3_v3h_m3n, 1411 .hsfreqrange = hsfreqrange_h3_v3h_m3n, 1412 .csi0clkfreqrange = 0x20, 1413 .clear_ulps = true, 1414}; 1415 1416static const struct rcar_csi2_info rcar_csi2_info_r8a77990 = { 1417 .init_phtw = rcsi2_init_phtw_v3m_e3, 1418 .phy_post_init = rcsi2_phy_post_init_v3m_e3, 1419 .num_channels = 2, 1420}; 1421 1422static const struct rcar_csi2_info rcar_csi2_info_r8a779a0 = { 1423 .init_phtw = rcsi2_init_phtw_v3u, 1424 .hsfreqrange = hsfreqrange_v3u, 1425 .csi0clkfreqrange = 0x20, 1426 .clear_ulps = true, 1427 .use_isp = true, 1428}; 1429 1430static const struct of_device_id rcar_csi2_of_table[] = { 1431 { 1432 .compatible = "renesas,r8a774a1-csi2", 1433 .data = &rcar_csi2_info_r8a7796, 1434 }, 1435 { 1436 .compatible = "renesas,r8a774b1-csi2", 1437 .data = &rcar_csi2_info_r8a77965, 1438 }, 1439 { 1440 .compatible = "renesas,r8a774c0-csi2", 1441 .data = &rcar_csi2_info_r8a77990, 1442 }, 1443 { 1444 .compatible = "renesas,r8a774e1-csi2", 1445 .data = &rcar_csi2_info_r8a7795, 1446 }, 1447 { 1448 .compatible = "renesas,r8a7795-csi2", 1449 .data = &rcar_csi2_info_r8a7795, 1450 }, 1451 { 1452 .compatible = "renesas,r8a7796-csi2", 1453 .data = &rcar_csi2_info_r8a7796, 1454 }, 1455 { 1456 .compatible = "renesas,r8a77961-csi2", 1457 .data = &rcar_csi2_info_r8a77961, 1458 }, 1459 { 1460 .compatible = "renesas,r8a77965-csi2", 1461 .data = &rcar_csi2_info_r8a77965, 1462 }, 1463 { 1464 .compatible = "renesas,r8a77970-csi2", 1465 .data = &rcar_csi2_info_r8a77970, 1466 }, 1467 { 1468 .compatible = "renesas,r8a77980-csi2", 1469 .data = &rcar_csi2_info_r8a77980, 1470 }, 1471 { 1472 .compatible = "renesas,r8a77990-csi2", 1473 .data = &rcar_csi2_info_r8a77990, 1474 }, 1475 { 1476 .compatible = "renesas,r8a779a0-csi2", 1477 .data = &rcar_csi2_info_r8a779a0, 1478 }, 1479 { /* sentinel */ }, 1480}; 1481MODULE_DEVICE_TABLE(of, rcar_csi2_of_table); 1482 1483static const struct soc_device_attribute r8a7795[] = { 1484 { 1485 .soc_id = "r8a7795", .revision = "ES1.*", 1486 .data = &rcar_csi2_info_r8a7795es1, 1487 }, 1488 { 1489 .soc_id = "r8a7795", .revision = "ES2.*", 1490 .data = &rcar_csi2_info_r8a7795es2, 1491 }, 1492 { /* sentinel */ } 1493}; 1494 1495static int rcsi2_probe(struct platform_device *pdev) 1496{ 1497 const struct soc_device_attribute *attr; 1498 struct rcar_csi2 *priv; 1499 unsigned int i, num_pads; 1500 int ret; 1501 1502 priv = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); 1503 if (!priv) 1504 return -ENOMEM; 1505 1506 priv->info = of_device_get_match_data(&pdev->dev); 1507 1508 /* 1509 * The different ES versions of r8a7795 (H3) behave differently but 1510 * share the same compatible string. 1511 */ 1512 attr = soc_device_match(r8a7795); 1513 if (attr) 1514 priv->info = attr->data; 1515 1516 priv->dev = &pdev->dev; 1517 1518 mutex_init(&priv->lock); 1519 priv->stream_count = 0; 1520 1521 ret = rcsi2_probe_resources(priv, pdev); 1522 if (ret) { 1523 dev_err(priv->dev, "Failed to get resources\n"); 1524 goto error_mutex; 1525 } 1526 1527 platform_set_drvdata(pdev, priv); 1528 1529 ret = rcsi2_parse_dt(priv); 1530 if (ret) 1531 goto error_mutex; 1532 1533 priv->subdev.owner = THIS_MODULE; 1534 priv->subdev.dev = &pdev->dev; 1535 v4l2_subdev_init(&priv->subdev, &rcar_csi2_subdev_ops); 1536 v4l2_set_subdevdata(&priv->subdev, &pdev->dev); 1537 snprintf(priv->subdev.name, V4L2_SUBDEV_NAME_SIZE, "%s %s", 1538 KBUILD_MODNAME, dev_name(&pdev->dev)); 1539 priv->subdev.flags = V4L2_SUBDEV_FL_HAS_DEVNODE; 1540 1541 priv->subdev.entity.function = MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER; 1542 priv->subdev.entity.ops = &rcar_csi2_entity_ops; 1543 1544 num_pads = priv->info->use_isp ? 2 : NR_OF_RCAR_CSI2_PAD; 1545 1546 priv->pads[RCAR_CSI2_SINK].flags = MEDIA_PAD_FL_SINK; 1547 for (i = RCAR_CSI2_SOURCE_VC0; i < num_pads; i++) 1548 priv->pads[i].flags = MEDIA_PAD_FL_SOURCE; 1549 1550 ret = media_entity_pads_init(&priv->subdev.entity, num_pads, 1551 priv->pads); 1552 if (ret) 1553 goto error_async; 1554 1555 for (i = 0; i < ARRAY_SIZE(priv->channel_vc); i++) 1556 priv->channel_vc[i] = -1; 1557 1558 pm_runtime_enable(&pdev->dev); 1559 1560 ret = v4l2_async_register_subdev(&priv->subdev); 1561 if (ret < 0) 1562 goto error_async; 1563 1564 dev_info(priv->dev, "%d lanes found\n", priv->lanes); 1565 1566 return 0; 1567 1568error_async: 1569 v4l2_async_nf_unregister(&priv->notifier); 1570 v4l2_async_nf_cleanup(&priv->notifier); 1571error_mutex: 1572 mutex_destroy(&priv->lock); 1573 1574 return ret; 1575} 1576 1577static int rcsi2_remove(struct platform_device *pdev) 1578{ 1579 struct rcar_csi2 *priv = platform_get_drvdata(pdev); 1580 1581 v4l2_async_nf_unregister(&priv->notifier); 1582 v4l2_async_nf_cleanup(&priv->notifier); 1583 v4l2_async_unregister_subdev(&priv->subdev); 1584 1585 pm_runtime_disable(&pdev->dev); 1586 1587 mutex_destroy(&priv->lock); 1588 1589 return 0; 1590} 1591 1592static struct platform_driver rcar_csi2_pdrv = { 1593 .remove = rcsi2_remove, 1594 .probe = rcsi2_probe, 1595 .driver = { 1596 .name = "rcar-csi2", 1597 .suppress_bind_attrs = true, 1598 .of_match_table = rcar_csi2_of_table, 1599 }, 1600}; 1601 1602module_platform_driver(rcar_csi2_pdrv); 1603 1604MODULE_AUTHOR("Niklas Söderlund <niklas.soderlund@ragnatech.se>"); 1605MODULE_DESCRIPTION("Renesas R-Car MIPI CSI-2 receiver driver"); 1606MODULE_LICENSE("GPL");