max96717.c 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Maxim GMSL2 Serializer Driver
  4. *
  5. * Copyright (C) 2024 Collabora Ltd.
  6. */
  7. #include <linux/bitfield.h>
  8. #include <linux/clk.h>
  9. #include <linux/clk-provider.h>
  10. #include <linux/delay.h>
  11. #include <linux/gpio/driver.h>
  12. #include <linux/i2c-mux.h>
  13. #include <linux/i2c.h>
  14. #include <linux/property.h>
  15. #include <linux/regmap.h>
  16. #include <media/v4l2-cci.h>
  17. #include <media/v4l2-ctrls.h>
  18. #include <media/v4l2-fwnode.h>
  19. #include <media/v4l2-subdev.h>
  20. #define MAX96717_DEVICE_ID 0xbf
  21. #define MAX96717F_DEVICE_ID 0xc8
  22. #define MAX96717_PORTS 2
  23. #define MAX96717_PAD_SINK 0
  24. #define MAX96717_PAD_SOURCE 1
  25. #define MAX96717_CSI_NLANES 4
  26. #define MAX96717_DEFAULT_CLKOUT_RATE 24000000UL
  27. /* DEV */
  28. #define MAX96717_REG3 CCI_REG8(0x3)
  29. #define MAX96717_RCLKSEL GENMASK(1, 0)
  30. #define RCLKSEL_REF_PLL CCI_REG8(0x3)
  31. #define MAX96717_REG6 CCI_REG8(0x6)
  32. #define RCLKEN BIT(5)
  33. #define MAX96717_DEV_ID CCI_REG8(0xd)
  34. #define MAX96717_DEV_REV CCI_REG8(0xe)
  35. #define MAX96717_DEV_REV_MASK GENMASK(3, 0)
  36. /* VID_TX Z */
  37. #define MAX96717_VIDEO_TX0 CCI_REG8(0x110)
  38. #define MAX96717_VIDEO_AUTO_BPP BIT(3)
  39. #define MAX96717_VIDEO_TX2 CCI_REG8(0x112)
  40. #define MAX96717_VIDEO_PCLKDET BIT(7)
  41. /* VTX_Z */
  42. #define MAX96717_VTX0 CCI_REG8(0x24e)
  43. #define MAX96717_VTX1 CCI_REG8(0x24f)
  44. #define MAX96717_PATTERN_CLK_FREQ GENMASK(3, 1)
  45. #define MAX96717_VTX_VS_DLY CCI_REG24(0x250)
  46. #define MAX96717_VTX_VS_HIGH CCI_REG24(0x253)
  47. #define MAX96717_VTX_VS_LOW CCI_REG24(0x256)
  48. #define MAX96717_VTX_V2H CCI_REG24(0x259)
  49. #define MAX96717_VTX_HS_HIGH CCI_REG16(0x25c)
  50. #define MAX96717_VTX_HS_LOW CCI_REG16(0x25e)
  51. #define MAX96717_VTX_HS_CNT CCI_REG16(0x260)
  52. #define MAX96717_VTX_V2D CCI_REG24(0x262)
  53. #define MAX96717_VTX_DE_HIGH CCI_REG16(0x265)
  54. #define MAX96717_VTX_DE_LOW CCI_REG16(0x267)
  55. #define MAX96717_VTX_DE_CNT CCI_REG16(0x269)
  56. #define MAX96717_VTX29 CCI_REG8(0x26b)
  57. #define MAX96717_VTX_MODE GENMASK(1, 0)
  58. #define MAX96717_VTX_GRAD_INC CCI_REG8(0x26c)
  59. #define MAX96717_VTX_CHKB_COLOR_A CCI_REG24(0x26d)
  60. #define MAX96717_VTX_CHKB_COLOR_B CCI_REG24(0x270)
  61. #define MAX96717_VTX_CHKB_RPT_CNT_A CCI_REG8(0x273)
  62. #define MAX96717_VTX_CHKB_RPT_CNT_B CCI_REG8(0x274)
  63. #define MAX96717_VTX_CHKB_ALT CCI_REG8(0x275)
  64. /* GPIO */
  65. #define MAX96717_NUM_GPIO 11
  66. #define MAX96717_GPIO_REG_A(gpio) CCI_REG8(0x2be + (gpio) * 3)
  67. #define MAX96717_GPIO_OUT BIT(4)
  68. #define MAX96717_GPIO_IN BIT(3)
  69. #define MAX96717_GPIO_RX_EN BIT(2)
  70. #define MAX96717_GPIO_TX_EN BIT(1)
  71. #define MAX96717_GPIO_OUT_DIS BIT(0)
  72. /* FRONTTOP */
  73. /* MAX96717 only have CSI port 'B' */
  74. #define MAX96717_FRONTOP0 CCI_REG8(0x308)
  75. #define MAX96717_START_PORT_B BIT(5)
  76. /* MIPI_RX */
  77. #define MAX96717_MIPI_RX1 CCI_REG8(0x331)
  78. #define MAX96717_MIPI_LANES_CNT GENMASK(5, 4)
  79. #define MAX96717_MIPI_RX2 CCI_REG8(0x332) /* phy1 Lanes map */
  80. #define MAX96717_PHY2_LANES_MAP GENMASK(7, 4)
  81. #define MAX96717_MIPI_RX3 CCI_REG8(0x333) /* phy2 Lanes map */
  82. #define MAX96717_PHY1_LANES_MAP GENMASK(3, 0)
  83. #define MAX96717_MIPI_RX4 CCI_REG8(0x334) /* phy1 lane polarities */
  84. #define MAX96717_PHY1_LANES_POL GENMASK(6, 4)
  85. #define MAX96717_MIPI_RX5 CCI_REG8(0x335) /* phy2 lane polarities */
  86. #define MAX96717_PHY2_LANES_POL GENMASK(2, 0)
  87. /* MIPI_RX_EXT */
  88. #define MAX96717_MIPI_RX_EXT11 CCI_REG8(0x383)
  89. #define MAX96717_TUN_MODE BIT(7)
  90. /* REF_VTG */
  91. #define REF_VTG0 CCI_REG8(0x3f0)
  92. #define REFGEN_PREDEF_EN BIT(6)
  93. #define REFGEN_PREDEF_FREQ_MASK GENMASK(5, 4)
  94. #define REFGEN_PREDEF_FREQ_ALT BIT(3)
  95. #define REFGEN_RST BIT(1)
  96. #define REFGEN_EN BIT(0)
  97. /* MISC */
  98. #define PIO_SLEW_1 CCI_REG8(0x570)
  99. enum max96717_vpg_mode {
  100. MAX96717_VPG_DISABLED = 0,
  101. MAX96717_VPG_CHECKERBOARD = 1,
  102. MAX96717_VPG_GRADIENT = 2,
  103. };
  104. struct max96717_priv {
  105. struct i2c_client *client;
  106. struct regmap *regmap;
  107. struct i2c_mux_core *mux;
  108. struct v4l2_mbus_config_mipi_csi2 mipi_csi2;
  109. struct v4l2_subdev sd;
  110. struct media_pad pads[MAX96717_PORTS];
  111. struct v4l2_ctrl_handler ctrl_handler;
  112. struct v4l2_async_notifier notifier;
  113. struct v4l2_subdev *source_sd;
  114. u16 source_sd_pad;
  115. u64 enabled_source_streams;
  116. u8 pll_predef_index;
  117. struct clk_hw clk_hw;
  118. struct gpio_chip gpio_chip;
  119. enum max96717_vpg_mode pattern;
  120. };
  121. static inline struct max96717_priv *sd_to_max96717(struct v4l2_subdev *sd)
  122. {
  123. return container_of(sd, struct max96717_priv, sd);
  124. }
  125. static inline struct max96717_priv *clk_hw_to_max96717(struct clk_hw *hw)
  126. {
  127. return container_of(hw, struct max96717_priv, clk_hw);
  128. }
  129. static int max96717_i2c_mux_select(struct i2c_mux_core *mux, u32 chan)
  130. {
  131. return 0;
  132. }
  133. static int max96717_i2c_mux_init(struct max96717_priv *priv)
  134. {
  135. priv->mux = i2c_mux_alloc(priv->client->adapter, &priv->client->dev,
  136. 1, 0, I2C_MUX_LOCKED | I2C_MUX_GATE,
  137. max96717_i2c_mux_select, NULL);
  138. if (!priv->mux)
  139. return -ENOMEM;
  140. return i2c_mux_add_adapter(priv->mux, 0, 0);
  141. }
  142. static inline int max96717_start_csi(struct max96717_priv *priv, bool start)
  143. {
  144. return cci_update_bits(priv->regmap, MAX96717_FRONTOP0,
  145. MAX96717_START_PORT_B,
  146. start ? MAX96717_START_PORT_B : 0, NULL);
  147. }
  148. static int max96717_apply_patgen_timing(struct max96717_priv *priv,
  149. struct v4l2_subdev_state *state)
  150. {
  151. struct v4l2_mbus_framefmt *fmt =
  152. v4l2_subdev_state_get_format(state, MAX96717_PAD_SOURCE);
  153. const u32 h_active = fmt->width;
  154. const u32 h_fp = 88;
  155. const u32 h_sw = 44;
  156. const u32 h_bp = 148;
  157. u32 h_tot;
  158. const u32 v_active = fmt->height;
  159. const u32 v_fp = 4;
  160. const u32 v_sw = 5;
  161. const u32 v_bp = 36;
  162. u32 v_tot;
  163. int ret = 0;
  164. h_tot = h_active + h_fp + h_sw + h_bp;
  165. v_tot = v_active + v_fp + v_sw + v_bp;
  166. /* 75 Mhz pixel clock */
  167. cci_update_bits(priv->regmap, MAX96717_VTX1,
  168. MAX96717_PATTERN_CLK_FREQ, 0xa, &ret);
  169. dev_info(&priv->client->dev, "height: %d width: %d\n", fmt->height,
  170. fmt->width);
  171. cci_write(priv->regmap, MAX96717_VTX_VS_DLY, 0, &ret);
  172. cci_write(priv->regmap, MAX96717_VTX_VS_HIGH, v_sw * h_tot, &ret);
  173. cci_write(priv->regmap, MAX96717_VTX_VS_LOW,
  174. (v_active + v_fp + v_bp) * h_tot, &ret);
  175. cci_write(priv->regmap, MAX96717_VTX_HS_HIGH, h_sw, &ret);
  176. cci_write(priv->regmap, MAX96717_VTX_HS_LOW, h_active + h_fp + h_bp,
  177. &ret);
  178. cci_write(priv->regmap, MAX96717_VTX_V2D,
  179. h_tot * (v_sw + v_bp) + (h_sw + h_bp), &ret);
  180. cci_write(priv->regmap, MAX96717_VTX_HS_CNT, v_tot, &ret);
  181. cci_write(priv->regmap, MAX96717_VTX_DE_HIGH, h_active, &ret);
  182. cci_write(priv->regmap, MAX96717_VTX_DE_LOW, h_fp + h_sw + h_bp,
  183. &ret);
  184. cci_write(priv->regmap, MAX96717_VTX_DE_CNT, v_active, &ret);
  185. /* B G R */
  186. cci_write(priv->regmap, MAX96717_VTX_CHKB_COLOR_A, 0xfecc00, &ret);
  187. /* B G R */
  188. cci_write(priv->regmap, MAX96717_VTX_CHKB_COLOR_B, 0x006aa7, &ret);
  189. cci_write(priv->regmap, MAX96717_VTX_CHKB_RPT_CNT_A, 0x3c, &ret);
  190. cci_write(priv->regmap, MAX96717_VTX_CHKB_RPT_CNT_B, 0x3c, &ret);
  191. cci_write(priv->regmap, MAX96717_VTX_CHKB_ALT, 0x3c, &ret);
  192. cci_write(priv->regmap, MAX96717_VTX_GRAD_INC, 0x10, &ret);
  193. return ret;
  194. }
  195. static int max96717_apply_patgen(struct max96717_priv *priv,
  196. struct v4l2_subdev_state *state)
  197. {
  198. unsigned int val;
  199. int ret = 0;
  200. if (priv->pattern)
  201. ret = max96717_apply_patgen_timing(priv, state);
  202. cci_write(priv->regmap, MAX96717_VTX0, priv->pattern ? 0xfb : 0,
  203. &ret);
  204. val = FIELD_PREP(MAX96717_VTX_MODE, priv->pattern);
  205. cci_update_bits(priv->regmap, MAX96717_VTX29, MAX96717_VTX_MODE,
  206. val, &ret);
  207. return ret;
  208. }
  209. static int max96717_s_ctrl(struct v4l2_ctrl *ctrl)
  210. {
  211. struct max96717_priv *priv =
  212. container_of(ctrl->handler, struct max96717_priv, ctrl_handler);
  213. int ret;
  214. switch (ctrl->id) {
  215. case V4L2_CID_TEST_PATTERN:
  216. if (priv->enabled_source_streams)
  217. return -EBUSY;
  218. priv->pattern = ctrl->val;
  219. break;
  220. default:
  221. return -EINVAL;
  222. }
  223. /* Use bpp from bpp register */
  224. ret = cci_update_bits(priv->regmap, MAX96717_VIDEO_TX0,
  225. MAX96717_VIDEO_AUTO_BPP,
  226. priv->pattern ? 0 : MAX96717_VIDEO_AUTO_BPP,
  227. NULL);
  228. /*
  229. * Pattern generator doesn't work with tunnel mode.
  230. * Needs RGB color format and deserializer tunnel mode must be disabled.
  231. */
  232. return cci_update_bits(priv->regmap, MAX96717_MIPI_RX_EXT11,
  233. MAX96717_TUN_MODE,
  234. priv->pattern ? 0 : MAX96717_TUN_MODE, &ret);
  235. }
  236. static const char * const max96717_test_pattern[] = {
  237. "Disabled",
  238. "Checkerboard",
  239. "Gradient"
  240. };
  241. static const struct v4l2_ctrl_ops max96717_ctrl_ops = {
  242. .s_ctrl = max96717_s_ctrl,
  243. };
  244. static int max96717_gpiochip_get(struct gpio_chip *gpiochip,
  245. unsigned int offset)
  246. {
  247. struct max96717_priv *priv = gpiochip_get_data(gpiochip);
  248. u64 val;
  249. int ret;
  250. ret = cci_read(priv->regmap, MAX96717_GPIO_REG_A(offset),
  251. &val, NULL);
  252. if (ret)
  253. return ret;
  254. if (val & MAX96717_GPIO_OUT_DIS)
  255. return !!(val & MAX96717_GPIO_IN);
  256. else
  257. return !!(val & MAX96717_GPIO_OUT);
  258. }
  259. static int max96717_gpiochip_set(struct gpio_chip *gpiochip,
  260. unsigned int offset, int value)
  261. {
  262. struct max96717_priv *priv = gpiochip_get_data(gpiochip);
  263. return cci_update_bits(priv->regmap, MAX96717_GPIO_REG_A(offset),
  264. MAX96717_GPIO_OUT, MAX96717_GPIO_OUT, NULL);
  265. }
  266. static int max96717_gpio_get_direction(struct gpio_chip *gpiochip,
  267. unsigned int offset)
  268. {
  269. struct max96717_priv *priv = gpiochip_get_data(gpiochip);
  270. u64 val;
  271. int ret;
  272. ret = cci_read(priv->regmap, MAX96717_GPIO_REG_A(offset), &val, NULL);
  273. if (ret < 0)
  274. return ret;
  275. return !!(val & MAX96717_GPIO_OUT_DIS);
  276. }
  277. static int max96717_gpio_direction_out(struct gpio_chip *gpiochip,
  278. unsigned int offset, int value)
  279. {
  280. struct max96717_priv *priv = gpiochip_get_data(gpiochip);
  281. return cci_update_bits(priv->regmap, MAX96717_GPIO_REG_A(offset),
  282. MAX96717_GPIO_OUT_DIS | MAX96717_GPIO_OUT,
  283. value ? MAX96717_GPIO_OUT : 0, NULL);
  284. }
  285. static int max96717_gpio_direction_in(struct gpio_chip *gpiochip,
  286. unsigned int offset)
  287. {
  288. struct max96717_priv *priv = gpiochip_get_data(gpiochip);
  289. return cci_update_bits(priv->regmap, MAX96717_GPIO_REG_A(offset),
  290. MAX96717_GPIO_OUT_DIS, MAX96717_GPIO_OUT_DIS,
  291. NULL);
  292. }
  293. static int max96717_gpiochip_probe(struct max96717_priv *priv)
  294. {
  295. struct device *dev = &priv->client->dev;
  296. struct gpio_chip *gc = &priv->gpio_chip;
  297. int i, ret = 0;
  298. gc->label = dev_name(dev);
  299. gc->parent = dev;
  300. gc->owner = THIS_MODULE;
  301. gc->ngpio = MAX96717_NUM_GPIO;
  302. gc->base = -1;
  303. gc->can_sleep = true;
  304. gc->get_direction = max96717_gpio_get_direction;
  305. gc->direction_input = max96717_gpio_direction_in;
  306. gc->direction_output = max96717_gpio_direction_out;
  307. gc->set = max96717_gpiochip_set;
  308. gc->get = max96717_gpiochip_get;
  309. /* Disable GPIO forwarding */
  310. for (i = 0; i < gc->ngpio; i++)
  311. cci_update_bits(priv->regmap, MAX96717_GPIO_REG_A(i),
  312. MAX96717_GPIO_RX_EN | MAX96717_GPIO_TX_EN,
  313. 0, &ret);
  314. if (ret)
  315. return ret;
  316. ret = devm_gpiochip_add_data(dev, gc, priv);
  317. if (ret) {
  318. dev_err(dev, "Unable to create gpio_chip\n");
  319. return ret;
  320. }
  321. return 0;
  322. }
  323. static int _max96717_set_routing(struct v4l2_subdev *sd,
  324. struct v4l2_subdev_state *state,
  325. struct v4l2_subdev_krouting *routing)
  326. {
  327. static const struct v4l2_mbus_framefmt format = {
  328. .width = 1280,
  329. .height = 1080,
  330. .code = MEDIA_BUS_FMT_Y8_1X8,
  331. .field = V4L2_FIELD_NONE,
  332. };
  333. int ret;
  334. ret = v4l2_subdev_routing_validate(sd, routing,
  335. V4L2_SUBDEV_ROUTING_ONLY_1_TO_1);
  336. if (ret)
  337. return ret;
  338. ret = v4l2_subdev_set_routing_with_fmt(sd, state, routing, &format);
  339. if (ret)
  340. return ret;
  341. return 0;
  342. }
  343. static int max96717_set_routing(struct v4l2_subdev *sd,
  344. struct v4l2_subdev_state *state,
  345. enum v4l2_subdev_format_whence which,
  346. struct v4l2_subdev_krouting *routing)
  347. {
  348. struct max96717_priv *priv = sd_to_max96717(sd);
  349. if (which == V4L2_SUBDEV_FORMAT_ACTIVE && priv->enabled_source_streams)
  350. return -EBUSY;
  351. return _max96717_set_routing(sd, state, routing);
  352. }
  353. static int max96717_set_fmt(struct v4l2_subdev *sd,
  354. struct v4l2_subdev_state *state,
  355. struct v4l2_subdev_format *format)
  356. {
  357. struct max96717_priv *priv = sd_to_max96717(sd);
  358. struct v4l2_mbus_framefmt *fmt;
  359. u64 stream_source_mask;
  360. if (format->which == V4L2_SUBDEV_FORMAT_ACTIVE &&
  361. priv->enabled_source_streams)
  362. return -EBUSY;
  363. /* No transcoding, source and sink formats must match. */
  364. if (format->pad == MAX96717_PAD_SOURCE)
  365. return v4l2_subdev_get_fmt(sd, state, format);
  366. /* Set sink format */
  367. fmt = v4l2_subdev_state_get_format(state, format->pad, format->stream);
  368. if (!fmt)
  369. return -EINVAL;
  370. *fmt = format->format;
  371. /* Propagate to source format */
  372. fmt = v4l2_subdev_state_get_opposite_stream_format(state, format->pad,
  373. format->stream);
  374. if (!fmt)
  375. return -EINVAL;
  376. *fmt = format->format;
  377. stream_source_mask = BIT(format->stream);
  378. return v4l2_subdev_state_xlate_streams(state, MAX96717_PAD_SOURCE,
  379. MAX96717_PAD_SINK,
  380. &stream_source_mask);
  381. }
  382. static int max96717_init_state(struct v4l2_subdev *sd,
  383. struct v4l2_subdev_state *state)
  384. {
  385. struct v4l2_subdev_route routes[] = {
  386. {
  387. .sink_pad = MAX96717_PAD_SINK,
  388. .sink_stream = 0,
  389. .source_pad = MAX96717_PAD_SOURCE,
  390. .source_stream = 0,
  391. .flags = V4L2_SUBDEV_ROUTE_FL_ACTIVE,
  392. },
  393. };
  394. struct v4l2_subdev_krouting routing = {
  395. .num_routes = ARRAY_SIZE(routes),
  396. .routes = routes,
  397. };
  398. return _max96717_set_routing(sd, state, &routing);
  399. }
  400. static bool max96717_pipe_pclkdet(struct max96717_priv *priv)
  401. {
  402. u64 val = 0;
  403. cci_read(priv->regmap, MAX96717_VIDEO_TX2, &val, NULL);
  404. return val & MAX96717_VIDEO_PCLKDET;
  405. }
  406. static int max96717_log_status(struct v4l2_subdev *sd)
  407. {
  408. struct max96717_priv *priv = sd_to_max96717(sd);
  409. struct device *dev = &priv->client->dev;
  410. dev_info(dev, "Serializer: max96717\n");
  411. dev_info(dev, "Pipe: pclkdet:%d\n", max96717_pipe_pclkdet(priv));
  412. return 0;
  413. }
  414. static int max96717_enable_streams(struct v4l2_subdev *sd,
  415. struct v4l2_subdev_state *state, u32 pad,
  416. u64 streams_mask)
  417. {
  418. struct max96717_priv *priv = sd_to_max96717(sd);
  419. u64 sink_streams;
  420. int ret;
  421. if (!priv->enabled_source_streams)
  422. max96717_start_csi(priv, true);
  423. ret = max96717_apply_patgen(priv, state);
  424. if (ret)
  425. goto stop_csi;
  426. if (!priv->pattern) {
  427. sink_streams =
  428. v4l2_subdev_state_xlate_streams(state,
  429. MAX96717_PAD_SOURCE,
  430. MAX96717_PAD_SINK,
  431. &streams_mask);
  432. ret = v4l2_subdev_enable_streams(priv->source_sd,
  433. priv->source_sd_pad,
  434. sink_streams);
  435. if (ret)
  436. goto stop_csi;
  437. }
  438. priv->enabled_source_streams |= streams_mask;
  439. return 0;
  440. stop_csi:
  441. if (!priv->enabled_source_streams)
  442. max96717_start_csi(priv, false);
  443. return ret;
  444. }
  445. static int max96717_disable_streams(struct v4l2_subdev *sd,
  446. struct v4l2_subdev_state *state, u32 pad,
  447. u64 streams_mask)
  448. {
  449. struct max96717_priv *priv = sd_to_max96717(sd);
  450. u64 sink_streams;
  451. /*
  452. * Stop the CSI receiver first then the source,
  453. * otherwise the device may become unresponsive
  454. * while holding the I2C bus low.
  455. */
  456. priv->enabled_source_streams &= ~streams_mask;
  457. if (!priv->enabled_source_streams)
  458. max96717_start_csi(priv, false);
  459. if (!priv->pattern) {
  460. int ret;
  461. sink_streams =
  462. v4l2_subdev_state_xlate_streams(state,
  463. MAX96717_PAD_SOURCE,
  464. MAX96717_PAD_SINK,
  465. &streams_mask);
  466. ret = v4l2_subdev_disable_streams(priv->source_sd,
  467. priv->source_sd_pad,
  468. sink_streams);
  469. if (ret)
  470. return ret;
  471. }
  472. return 0;
  473. }
  474. static const struct v4l2_subdev_pad_ops max96717_pad_ops = {
  475. .enable_streams = max96717_enable_streams,
  476. .disable_streams = max96717_disable_streams,
  477. .set_routing = max96717_set_routing,
  478. .get_fmt = v4l2_subdev_get_fmt,
  479. .set_fmt = max96717_set_fmt,
  480. };
  481. static const struct v4l2_subdev_core_ops max96717_subdev_core_ops = {
  482. .log_status = max96717_log_status,
  483. };
  484. static const struct v4l2_subdev_internal_ops max96717_internal_ops = {
  485. .init_state = max96717_init_state,
  486. };
  487. static const struct v4l2_subdev_ops max96717_subdev_ops = {
  488. .core = &max96717_subdev_core_ops,
  489. .pad = &max96717_pad_ops,
  490. };
  491. static const struct media_entity_operations max96717_entity_ops = {
  492. .link_validate = v4l2_subdev_link_validate,
  493. };
  494. static int max96717_notify_bound(struct v4l2_async_notifier *notifier,
  495. struct v4l2_subdev *source_subdev,
  496. struct v4l2_async_connection *asd)
  497. {
  498. struct max96717_priv *priv = sd_to_max96717(notifier->sd);
  499. struct device *dev = &priv->client->dev;
  500. int ret;
  501. ret = media_entity_get_fwnode_pad(&source_subdev->entity,
  502. source_subdev->fwnode,
  503. MEDIA_PAD_FL_SOURCE);
  504. if (ret < 0) {
  505. dev_err(dev, "Failed to find pad for %s\n",
  506. source_subdev->name);
  507. return ret;
  508. }
  509. priv->source_sd = source_subdev;
  510. priv->source_sd_pad = ret;
  511. ret = media_create_pad_link(&source_subdev->entity, priv->source_sd_pad,
  512. &priv->sd.entity, 0,
  513. MEDIA_LNK_FL_ENABLED |
  514. MEDIA_LNK_FL_IMMUTABLE);
  515. if (ret) {
  516. dev_err(dev, "Unable to link %s:%u -> %s:0\n",
  517. source_subdev->name, priv->source_sd_pad,
  518. priv->sd.name);
  519. return ret;
  520. }
  521. return 0;
  522. }
  523. static const struct v4l2_async_notifier_operations max96717_notify_ops = {
  524. .bound = max96717_notify_bound,
  525. };
  526. static int max96717_v4l2_notifier_register(struct max96717_priv *priv)
  527. {
  528. struct device *dev = &priv->client->dev;
  529. struct v4l2_async_connection *asd;
  530. struct fwnode_handle *ep_fwnode;
  531. int ret;
  532. ep_fwnode = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev),
  533. MAX96717_PAD_SINK, 0, 0);
  534. if (!ep_fwnode) {
  535. dev_err(dev, "No graph endpoint\n");
  536. return -ENODEV;
  537. }
  538. v4l2_async_subdev_nf_init(&priv->notifier, &priv->sd);
  539. asd = v4l2_async_nf_add_fwnode_remote(&priv->notifier, ep_fwnode,
  540. struct v4l2_async_connection);
  541. fwnode_handle_put(ep_fwnode);
  542. if (IS_ERR(asd)) {
  543. dev_err(dev, "Failed to add subdev: %pe", asd);
  544. v4l2_async_nf_cleanup(&priv->notifier);
  545. return PTR_ERR(asd);
  546. }
  547. priv->notifier.ops = &max96717_notify_ops;
  548. ret = v4l2_async_nf_register(&priv->notifier);
  549. if (ret) {
  550. dev_err(dev, "Failed to register subdev_notifier");
  551. v4l2_async_nf_cleanup(&priv->notifier);
  552. return ret;
  553. }
  554. return 0;
  555. }
  556. static int max96717_subdev_init(struct max96717_priv *priv)
  557. {
  558. struct device *dev = &priv->client->dev;
  559. int ret;
  560. v4l2_i2c_subdev_init(&priv->sd, priv->client, &max96717_subdev_ops);
  561. priv->sd.internal_ops = &max96717_internal_ops;
  562. v4l2_ctrl_handler_init(&priv->ctrl_handler, 1);
  563. priv->sd.ctrl_handler = &priv->ctrl_handler;
  564. v4l2_ctrl_new_std_menu_items(&priv->ctrl_handler,
  565. &max96717_ctrl_ops,
  566. V4L2_CID_TEST_PATTERN,
  567. ARRAY_SIZE(max96717_test_pattern) - 1,
  568. 0, 0, max96717_test_pattern);
  569. if (priv->ctrl_handler.error) {
  570. ret = priv->ctrl_handler.error;
  571. goto err_free_ctrl;
  572. }
  573. priv->sd.flags |= V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_STREAMS;
  574. priv->sd.entity.function = MEDIA_ENT_F_VID_IF_BRIDGE;
  575. priv->sd.entity.ops = &max96717_entity_ops;
  576. priv->pads[MAX96717_PAD_SINK].flags = MEDIA_PAD_FL_SINK;
  577. priv->pads[MAX96717_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
  578. ret = media_entity_pads_init(&priv->sd.entity, 2, priv->pads);
  579. if (ret) {
  580. dev_err_probe(dev, ret, "Failed to init pads\n");
  581. goto err_free_ctrl;
  582. }
  583. ret = v4l2_subdev_init_finalize(&priv->sd);
  584. if (ret) {
  585. dev_err_probe(dev, ret,
  586. "v4l2 subdev init finalized failed\n");
  587. goto err_entity_cleanup;
  588. }
  589. ret = max96717_v4l2_notifier_register(priv);
  590. if (ret) {
  591. dev_err_probe(dev, ret,
  592. "v4l2 subdev notifier register failed\n");
  593. goto err_free_state;
  594. }
  595. ret = v4l2_async_register_subdev(&priv->sd);
  596. if (ret) {
  597. dev_err_probe(dev, ret, "v4l2_async_register_subdev error\n");
  598. goto err_unreg_notif;
  599. }
  600. return 0;
  601. err_unreg_notif:
  602. v4l2_async_nf_unregister(&priv->notifier);
  603. v4l2_async_nf_cleanup(&priv->notifier);
  604. err_free_state:
  605. v4l2_subdev_cleanup(&priv->sd);
  606. err_entity_cleanup:
  607. media_entity_cleanup(&priv->sd.entity);
  608. err_free_ctrl:
  609. v4l2_ctrl_handler_free(&priv->ctrl_handler);
  610. return ret;
  611. }
  612. static void max96717_subdev_uninit(struct max96717_priv *priv)
  613. {
  614. v4l2_async_unregister_subdev(&priv->sd);
  615. v4l2_async_nf_unregister(&priv->notifier);
  616. v4l2_async_nf_cleanup(&priv->notifier);
  617. v4l2_subdev_cleanup(&priv->sd);
  618. media_entity_cleanup(&priv->sd.entity);
  619. v4l2_ctrl_handler_free(&priv->ctrl_handler);
  620. }
  621. struct max96717_pll_predef_freq {
  622. unsigned long freq;
  623. bool is_alt;
  624. u8 val;
  625. };
  626. static const struct max96717_pll_predef_freq max96717_predef_freqs[] = {
  627. { 13500000, true, 0 }, { 19200000, false, 0 },
  628. { 24000000, true, 1 }, { 27000000, false, 1 },
  629. { 37125000, false, 2 }, { 74250000, false, 3 },
  630. };
  631. static unsigned long
  632. max96717_clk_recalc_rate(struct clk_hw *hw, unsigned long parent_rate)
  633. {
  634. struct max96717_priv *priv = clk_hw_to_max96717(hw);
  635. return max96717_predef_freqs[priv->pll_predef_index].freq;
  636. }
  637. static unsigned int max96717_clk_find_best_index(struct max96717_priv *priv,
  638. unsigned long rate)
  639. {
  640. unsigned int i, idx = 0;
  641. unsigned long diff_new, diff_old = U32_MAX;
  642. for (i = 0; i < ARRAY_SIZE(max96717_predef_freqs); i++) {
  643. diff_new = abs(rate - max96717_predef_freqs[i].freq);
  644. if (diff_new < diff_old) {
  645. diff_old = diff_new;
  646. idx = i;
  647. }
  648. }
  649. return idx;
  650. }
  651. static int max96717_clk_determine_rate(struct clk_hw *hw,
  652. struct clk_rate_request *req)
  653. {
  654. struct max96717_priv *priv = clk_hw_to_max96717(hw);
  655. struct device *dev = &priv->client->dev;
  656. unsigned int idx;
  657. idx = max96717_clk_find_best_index(priv, req->rate);
  658. if (req->rate != max96717_predef_freqs[idx].freq) {
  659. dev_warn(dev, "Request CLK freq:%lu, found CLK freq:%lu\n",
  660. req->rate, max96717_predef_freqs[idx].freq);
  661. }
  662. req->rate = max96717_predef_freqs[idx].freq;
  663. return 0;
  664. }
  665. static int max96717_clk_set_rate(struct clk_hw *hw, unsigned long rate,
  666. unsigned long parent_rate)
  667. {
  668. struct max96717_priv *priv = clk_hw_to_max96717(hw);
  669. unsigned int val, idx;
  670. int ret = 0;
  671. idx = max96717_clk_find_best_index(priv, rate);
  672. val = FIELD_PREP(REFGEN_PREDEF_FREQ_MASK,
  673. max96717_predef_freqs[idx].val);
  674. if (max96717_predef_freqs[idx].is_alt)
  675. val |= REFGEN_PREDEF_FREQ_ALT;
  676. val |= REFGEN_RST | REFGEN_PREDEF_EN;
  677. cci_write(priv->regmap, REF_VTG0, val, &ret);
  678. cci_update_bits(priv->regmap, REF_VTG0, REFGEN_RST | REFGEN_EN,
  679. REFGEN_EN, &ret);
  680. if (ret)
  681. return ret;
  682. priv->pll_predef_index = idx;
  683. return 0;
  684. }
  685. static int max96717_clk_prepare(struct clk_hw *hw)
  686. {
  687. struct max96717_priv *priv = clk_hw_to_max96717(hw);
  688. return cci_update_bits(priv->regmap, MAX96717_REG6, RCLKEN,
  689. RCLKEN, NULL);
  690. }
  691. static void max96717_clk_unprepare(struct clk_hw *hw)
  692. {
  693. struct max96717_priv *priv = clk_hw_to_max96717(hw);
  694. cci_update_bits(priv->regmap, MAX96717_REG6, RCLKEN, 0, NULL);
  695. }
  696. static const struct clk_ops max96717_clk_ops = {
  697. .prepare = max96717_clk_prepare,
  698. .unprepare = max96717_clk_unprepare,
  699. .set_rate = max96717_clk_set_rate,
  700. .recalc_rate = max96717_clk_recalc_rate,
  701. .determine_rate = max96717_clk_determine_rate,
  702. };
  703. static int max96717_register_clkout(struct max96717_priv *priv)
  704. {
  705. struct device *dev = &priv->client->dev;
  706. struct clk_init_data init = { .ops = &max96717_clk_ops };
  707. int ret;
  708. init.name = kasprintf(GFP_KERNEL, "max96717.%s.clk_out", dev_name(dev));
  709. if (!init.name)
  710. return -ENOMEM;
  711. /* RCLKSEL Reference PLL output */
  712. ret = cci_update_bits(priv->regmap, MAX96717_REG3, MAX96717_RCLKSEL,
  713. MAX96717_RCLKSEL, NULL);
  714. /* MFP4 fastest slew rate */
  715. cci_update_bits(priv->regmap, PIO_SLEW_1, BIT(5) | BIT(4), 0, &ret);
  716. if (ret)
  717. goto free_init_name;
  718. priv->clk_hw.init = &init;
  719. /* Initialize to 24 MHz */
  720. ret = max96717_clk_set_rate(&priv->clk_hw,
  721. MAX96717_DEFAULT_CLKOUT_RATE, 0);
  722. if (ret < 0)
  723. goto free_init_name;
  724. ret = devm_clk_hw_register(dev, &priv->clk_hw);
  725. kfree(init.name);
  726. if (ret)
  727. return dev_err_probe(dev, ret, "Cannot register clock HW\n");
  728. ret = devm_of_clk_add_hw_provider(dev, of_clk_hw_simple_get,
  729. &priv->clk_hw);
  730. if (ret)
  731. return dev_err_probe(dev, ret,
  732. "Cannot add OF clock provider\n");
  733. return 0;
  734. free_init_name:
  735. kfree(init.name);
  736. return ret;
  737. }
  738. static int max96717_init_csi_lanes(struct max96717_priv *priv)
  739. {
  740. struct v4l2_mbus_config_mipi_csi2 *mipi = &priv->mipi_csi2;
  741. unsigned long lanes_used = 0;
  742. unsigned int nlanes, lane, val = 0;
  743. int ret;
  744. nlanes = mipi->num_data_lanes;
  745. ret = cci_update_bits(priv->regmap, MAX96717_MIPI_RX1,
  746. MAX96717_MIPI_LANES_CNT,
  747. FIELD_PREP(MAX96717_MIPI_LANES_CNT,
  748. nlanes - 1), NULL);
  749. /* lanes polarity */
  750. for (lane = 0; lane < nlanes + 1; lane++) {
  751. if (!mipi->lane_polarities[lane])
  752. continue;
  753. /* Clock lane */
  754. if (lane == 0)
  755. val |= BIT(2);
  756. else if (lane < 3)
  757. val |= BIT(lane - 1);
  758. else
  759. val |= BIT(lane);
  760. }
  761. cci_update_bits(priv->regmap, MAX96717_MIPI_RX5,
  762. MAX96717_PHY2_LANES_POL,
  763. FIELD_PREP(MAX96717_PHY2_LANES_POL, val), &ret);
  764. cci_update_bits(priv->regmap, MAX96717_MIPI_RX4,
  765. MAX96717_PHY1_LANES_POL,
  766. FIELD_PREP(MAX96717_PHY1_LANES_POL,
  767. val >> 3), &ret);
  768. /* lanes mapping */
  769. for (lane = 0, val = 0; lane < nlanes; lane++) {
  770. val |= (mipi->data_lanes[lane] - 1) << (lane * 2);
  771. lanes_used |= BIT(mipi->data_lanes[lane] - 1);
  772. }
  773. /*
  774. * Unused lanes need to be mapped as well to not have
  775. * the same lanes mapped twice.
  776. */
  777. for (; lane < MAX96717_CSI_NLANES; lane++) {
  778. unsigned int idx = find_first_zero_bit(&lanes_used,
  779. MAX96717_CSI_NLANES);
  780. val |= idx << (lane * 2);
  781. lanes_used |= BIT(idx);
  782. }
  783. cci_update_bits(priv->regmap, MAX96717_MIPI_RX3,
  784. MAX96717_PHY1_LANES_MAP,
  785. FIELD_PREP(MAX96717_PHY1_LANES_MAP, val), &ret);
  786. return cci_update_bits(priv->regmap, MAX96717_MIPI_RX2,
  787. MAX96717_PHY2_LANES_MAP,
  788. FIELD_PREP(MAX96717_PHY2_LANES_MAP, val >> 4),
  789. &ret);
  790. }
  791. static int max96717_hw_init(struct max96717_priv *priv)
  792. {
  793. struct device *dev = &priv->client->dev;
  794. u64 dev_id, val;
  795. int ret;
  796. ret = cci_read(priv->regmap, MAX96717_DEV_ID, &dev_id, NULL);
  797. if (ret)
  798. return dev_err_probe(dev, ret,
  799. "Fail to read the device id\n");
  800. if (dev_id != MAX96717_DEVICE_ID && dev_id != MAX96717F_DEVICE_ID)
  801. return dev_err_probe(dev, -EOPNOTSUPP,
  802. "Unsupported device id got %x\n", (u8)dev_id);
  803. ret = cci_read(priv->regmap, MAX96717_DEV_REV, &val, NULL);
  804. if (ret)
  805. return dev_err_probe(dev, ret,
  806. "Fail to read device revision");
  807. dev_dbg(dev, "Found %x (rev %lx)\n", (u8)dev_id,
  808. (u8)val & MAX96717_DEV_REV_MASK);
  809. ret = cci_read(priv->regmap, MAX96717_MIPI_RX_EXT11, &val, NULL);
  810. if (ret)
  811. return dev_err_probe(dev, ret,
  812. "Fail to read mipi rx extension");
  813. if (!(val & MAX96717_TUN_MODE))
  814. return dev_err_probe(dev, -EOPNOTSUPP,
  815. "Only supporting tunnel mode");
  816. return max96717_init_csi_lanes(priv);
  817. }
  818. static int max96717_parse_dt(struct max96717_priv *priv)
  819. {
  820. struct device *dev = &priv->client->dev;
  821. struct v4l2_fwnode_endpoint vep = { .bus_type = V4L2_MBUS_CSI2_DPHY };
  822. struct fwnode_handle *ep_fwnode;
  823. unsigned char num_data_lanes;
  824. int ret;
  825. ep_fwnode = fwnode_graph_get_endpoint_by_id(dev_fwnode(dev),
  826. MAX96717_PAD_SINK, 0, 0);
  827. if (!ep_fwnode)
  828. return dev_err_probe(dev, -ENOENT, "no endpoint found\n");
  829. ret = v4l2_fwnode_endpoint_parse(ep_fwnode, &vep);
  830. fwnode_handle_put(ep_fwnode);
  831. if (ret < 0)
  832. return dev_err_probe(dev, ret, "Failed to parse sink endpoint");
  833. num_data_lanes = vep.bus.mipi_csi2.num_data_lanes;
  834. if (num_data_lanes < 1 || num_data_lanes > MAX96717_CSI_NLANES)
  835. return dev_err_probe(dev, -EINVAL,
  836. "Invalid data lanes must be 1 to 4\n");
  837. priv->mipi_csi2 = vep.bus.mipi_csi2;
  838. return 0;
  839. }
  840. static int max96717_probe(struct i2c_client *client)
  841. {
  842. struct device *dev = &client->dev;
  843. struct max96717_priv *priv;
  844. int ret;
  845. priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
  846. if (!priv)
  847. return -ENOMEM;
  848. priv->client = client;
  849. priv->regmap = devm_cci_regmap_init_i2c(client, 16);
  850. if (IS_ERR(priv->regmap)) {
  851. ret = PTR_ERR(priv->regmap);
  852. return dev_err_probe(dev, ret, "Failed to init regmap\n");
  853. }
  854. ret = max96717_parse_dt(priv);
  855. if (ret)
  856. return dev_err_probe(dev, ret, "Failed to parse the dt\n");
  857. ret = max96717_hw_init(priv);
  858. if (ret)
  859. return dev_err_probe(dev, ret,
  860. "Failed to initialize the hardware\n");
  861. ret = max96717_gpiochip_probe(priv);
  862. if (ret)
  863. return dev_err_probe(&client->dev, ret,
  864. "Failed to init gpiochip\n");
  865. ret = max96717_register_clkout(priv);
  866. if (ret)
  867. return dev_err_probe(dev, ret, "Failed to register clkout\n");
  868. ret = max96717_subdev_init(priv);
  869. if (ret)
  870. return dev_err_probe(dev, ret,
  871. "Failed to initialize v4l2 subdev\n");
  872. ret = max96717_i2c_mux_init(priv);
  873. if (ret) {
  874. dev_err_probe(dev, ret, "failed to add remote i2c adapter\n");
  875. max96717_subdev_uninit(priv);
  876. }
  877. return ret;
  878. }
  879. static void max96717_remove(struct i2c_client *client)
  880. {
  881. struct v4l2_subdev *sd = i2c_get_clientdata(client);
  882. struct max96717_priv *priv = sd_to_max96717(sd);
  883. max96717_subdev_uninit(priv);
  884. i2c_mux_del_adapters(priv->mux);
  885. }
  886. static const struct of_device_id max96717_of_ids[] = {
  887. { .compatible = "maxim,max96717f" },
  888. { }
  889. };
  890. MODULE_DEVICE_TABLE(of, max96717_of_ids);
  891. static struct i2c_driver max96717_i2c_driver = {
  892. .driver = {
  893. .name = "max96717",
  894. .of_match_table = max96717_of_ids,
  895. },
  896. .probe = max96717_probe,
  897. .remove = max96717_remove,
  898. };
  899. module_i2c_driver(max96717_i2c_driver);
  900. MODULE_DESCRIPTION("Maxim GMSL2 MAX96717 Serializer Driver");
  901. MODULE_AUTHOR("Julien Massot <julien.massot@collabora.com>");
  902. MODULE_LICENSE("GPL");