cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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");