ipu-bridge.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888
  1. // SPDX-License-Identifier: GPL-2.0
  2. /* Author: Dan Scally <djrscally@gmail.com> */
  3. #include <linux/acpi.h>
  4. #include <linux/cleanup.h>
  5. #include <linux/device.h>
  6. #include <linux/i2c.h>
  7. #include <linux/mei_cl_bus.h>
  8. #include <linux/platform_device.h>
  9. #include <linux/pm_runtime.h>
  10. #include <linux/property.h>
  11. #include <linux/string.h>
  12. #include <linux/workqueue.h>
  13. #include <media/ipu-bridge.h>
  14. #include <media/v4l2-fwnode.h>
  15. #define ADEV_DEV(adev) ACPI_PTR(&((adev)->dev))
  16. /*
  17. * 92335fcf-3203-4472-af93-7b4453ac29da
  18. *
  19. * Used to build MEI CSI device name to lookup MEI CSI device by
  20. * device_find_child_by_name().
  21. */
  22. #define MEI_CSI_UUID \
  23. UUID_LE(0x92335FCF, 0x3203, 0x4472, \
  24. 0xAF, 0x93, 0x7B, 0x44, 0x53, 0xAC, 0x29, 0xDA)
  25. /*
  26. * IVSC device name
  27. *
  28. * Used to match IVSC device by ipu_bridge_match_ivsc_dev()
  29. */
  30. #define IVSC_DEV_NAME "intel_vsc"
  31. /*
  32. * Extend this array with ACPI Hardware IDs of devices known to be working
  33. * plus the number of link-frequencies expected by their drivers, along with
  34. * the frequency values in hertz. This is somewhat opportunistic way of adding
  35. * support for this for now in the hopes of a better source for the information
  36. * (possibly some encoded value in the SSDB buffer that we're unaware of)
  37. * becoming apparent in the future.
  38. *
  39. * Do not add an entry for a sensor that is not actually supported.
  40. *
  41. * Please keep the list sorted by ACPI HID.
  42. */
  43. static const struct ipu_sensor_config ipu_supported_sensors[] = {
  44. /* Himax HM11B1 */
  45. IPU_SENSOR_CONFIG("HIMX11B1", 1, 384000000),
  46. /* Himax HM2170 */
  47. IPU_SENSOR_CONFIG("HIMX2170", 1, 384000000),
  48. /* Himax HM2172 */
  49. IPU_SENSOR_CONFIG("HIMX2172", 1, 384000000),
  50. /* GalaxyCore GC0310 */
  51. IPU_SENSOR_CONFIG("INT0310", 0),
  52. /* Omnivision OV5693 */
  53. IPU_SENSOR_CONFIG("INT33BE", 1, 419200000),
  54. /* Omnivision OV2740 */
  55. IPU_SENSOR_CONFIG("INT3474", 1, 180000000),
  56. /* Omnivision OV8865 */
  57. IPU_SENSOR_CONFIG("INT347A", 1, 360000000),
  58. /* Omnivision OV7251 */
  59. IPU_SENSOR_CONFIG("INT347E", 1, 319200000),
  60. /* Hynix Hi-556 */
  61. IPU_SENSOR_CONFIG("INT3537", 1, 437000000),
  62. /* Omnivision OV01A10 / OV01A1S */
  63. IPU_SENSOR_CONFIG("OVTI01A0", 1, 400000000),
  64. IPU_SENSOR_CONFIG("OVTI01AS", 1, 400000000),
  65. /* Omnivision OV02C10 */
  66. IPU_SENSOR_CONFIG("OVTI02C1", 1, 400000000),
  67. /* Omnivision OV02E10 */
  68. IPU_SENSOR_CONFIG("OVTI02E1", 1, 360000000),
  69. /* Omnivision OV08A10 */
  70. IPU_SENSOR_CONFIG("OVTI08A1", 1, 500000000),
  71. /* Omnivision OV08x40 */
  72. IPU_SENSOR_CONFIG("OVTI08F4", 1, 400000000),
  73. /* Omnivision OV13B10 */
  74. IPU_SENSOR_CONFIG("OVTI13B1", 1, 560000000),
  75. IPU_SENSOR_CONFIG("OVTIDB10", 1, 560000000),
  76. /* Omnivision OV2680 */
  77. IPU_SENSOR_CONFIG("OVTI2680", 1, 331200000),
  78. /* Omnivision OV8856 */
  79. IPU_SENSOR_CONFIG("OVTI8856", 3, 180000000, 360000000, 720000000),
  80. };
  81. static const struct ipu_property_names prop_names = {
  82. .clock_frequency = "clock-frequency",
  83. .rotation = "rotation",
  84. .orientation = "orientation",
  85. .bus_type = "bus-type",
  86. .data_lanes = "data-lanes",
  87. .remote_endpoint = "remote-endpoint",
  88. .link_frequencies = "link-frequencies",
  89. };
  90. static const char * const ipu_vcm_types[] = {
  91. "ad5823",
  92. "dw9714",
  93. "ad5816",
  94. "dw9719",
  95. "dw9718",
  96. "dw9806b",
  97. "wv517s",
  98. "lc898122xa",
  99. "lc898212axb",
  100. };
  101. #if IS_ENABLED(CONFIG_ACPI)
  102. /*
  103. * Used to figure out IVSC acpi device by ipu_bridge_get_ivsc_acpi_dev()
  104. * instead of device and driver match to probe IVSC device.
  105. */
  106. static const struct acpi_device_id ivsc_acpi_ids[] = {
  107. { "INTC1059" },
  108. { "INTC1095" },
  109. { "INTC100A" },
  110. { "INTC10CF" },
  111. };
  112. static struct acpi_device *ipu_bridge_get_ivsc_acpi_dev(struct acpi_device *adev)
  113. {
  114. unsigned int i;
  115. for (i = 0; i < ARRAY_SIZE(ivsc_acpi_ids); i++) {
  116. const struct acpi_device_id *acpi_id = &ivsc_acpi_ids[i];
  117. struct acpi_device *consumer, *ivsc_adev;
  118. acpi_handle handle = acpi_device_handle(adev);
  119. for_each_acpi_dev_match(ivsc_adev, acpi_id->id, NULL, -1)
  120. /* camera sensor depends on IVSC in DSDT if exist */
  121. for_each_acpi_consumer_dev(ivsc_adev, consumer)
  122. if (consumer->handle == handle) {
  123. acpi_dev_put(consumer);
  124. return ivsc_adev;
  125. }
  126. }
  127. return NULL;
  128. }
  129. #else
  130. static struct acpi_device *ipu_bridge_get_ivsc_acpi_dev(struct acpi_device *adev)
  131. {
  132. return NULL;
  133. }
  134. #endif
  135. static int ipu_bridge_match_ivsc_dev(struct device *dev, const void *adev)
  136. {
  137. if (ACPI_COMPANION(dev) != adev)
  138. return 0;
  139. if (!sysfs_streq(dev_name(dev), IVSC_DEV_NAME))
  140. return 0;
  141. return 1;
  142. }
  143. static struct device *ipu_bridge_get_ivsc_csi_dev(struct acpi_device *adev)
  144. {
  145. struct device *dev, *csi_dev;
  146. uuid_le uuid = MEI_CSI_UUID;
  147. char name[64];
  148. /* IVSC device on platform bus */
  149. dev = bus_find_device(&platform_bus_type, NULL, adev,
  150. ipu_bridge_match_ivsc_dev);
  151. if (dev) {
  152. snprintf(name, sizeof(name), "%s-%pUl", dev_name(dev), &uuid);
  153. csi_dev = device_find_child_by_name(dev, name);
  154. put_device(dev);
  155. return csi_dev;
  156. }
  157. return NULL;
  158. }
  159. static int ipu_bridge_check_ivsc_dev(struct ipu_sensor *sensor,
  160. struct acpi_device *sensor_adev)
  161. {
  162. struct acpi_device *adev;
  163. struct device *csi_dev;
  164. adev = ipu_bridge_get_ivsc_acpi_dev(sensor_adev);
  165. if (adev) {
  166. csi_dev = ipu_bridge_get_ivsc_csi_dev(adev);
  167. if (!csi_dev) {
  168. acpi_dev_put(adev);
  169. dev_err(ADEV_DEV(adev), "Failed to find MEI CSI dev\n");
  170. return -ENODEV;
  171. }
  172. sensor->csi_dev = csi_dev;
  173. sensor->ivsc_adev = adev;
  174. }
  175. return 0;
  176. }
  177. static int ipu_bridge_read_acpi_buffer(struct acpi_device *adev, char *id,
  178. void *data, u32 size)
  179. {
  180. struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL };
  181. union acpi_object *obj;
  182. acpi_status status;
  183. int ret = 0;
  184. status = acpi_evaluate_object(ACPI_PTR(adev->handle),
  185. id, NULL, &buffer);
  186. if (ACPI_FAILURE(status))
  187. return -ENODEV;
  188. obj = buffer.pointer;
  189. if (!obj) {
  190. dev_err(ADEV_DEV(adev), "Couldn't locate ACPI buffer\n");
  191. return -ENODEV;
  192. }
  193. if (obj->type != ACPI_TYPE_BUFFER) {
  194. dev_err(ADEV_DEV(adev), "Not an ACPI buffer\n");
  195. ret = -ENODEV;
  196. goto out_free_buff;
  197. }
  198. if (obj->buffer.length > size) {
  199. dev_err(ADEV_DEV(adev), "Given buffer is too small\n");
  200. ret = -EINVAL;
  201. goto out_free_buff;
  202. }
  203. memcpy(data, obj->buffer.pointer, obj->buffer.length);
  204. out_free_buff:
  205. kfree(buffer.pointer);
  206. return ret;
  207. }
  208. static u32 ipu_bridge_parse_rotation(struct acpi_device *adev,
  209. struct ipu_sensor_ssdb *ssdb)
  210. {
  211. switch (ssdb->degree) {
  212. case IPU_SENSOR_ROTATION_NORMAL:
  213. return 0;
  214. case IPU_SENSOR_ROTATION_INVERTED:
  215. return 180;
  216. default:
  217. dev_warn(ADEV_DEV(adev),
  218. "Unknown rotation %d. Assume 0 degree rotation\n",
  219. ssdb->degree);
  220. return 0;
  221. }
  222. }
  223. static enum v4l2_fwnode_orientation ipu_bridge_parse_orientation(struct acpi_device *adev)
  224. {
  225. enum v4l2_fwnode_orientation orientation;
  226. struct acpi_pld_info *pld = NULL;
  227. acpi_status status = AE_ERROR;
  228. #if IS_ENABLED(CONFIG_ACPI)
  229. status = acpi_get_physical_device_location(adev->handle, &pld);
  230. #endif
  231. if (ACPI_FAILURE(status)) {
  232. dev_warn(ADEV_DEV(adev), "_PLD call failed, using default orientation\n");
  233. return V4L2_FWNODE_ORIENTATION_EXTERNAL;
  234. }
  235. switch (pld->panel) {
  236. case ACPI_PLD_PANEL_FRONT:
  237. orientation = V4L2_FWNODE_ORIENTATION_FRONT;
  238. break;
  239. case ACPI_PLD_PANEL_BACK:
  240. orientation = V4L2_FWNODE_ORIENTATION_BACK;
  241. break;
  242. case ACPI_PLD_PANEL_TOP:
  243. case ACPI_PLD_PANEL_LEFT:
  244. case ACPI_PLD_PANEL_RIGHT:
  245. case ACPI_PLD_PANEL_UNKNOWN:
  246. orientation = V4L2_FWNODE_ORIENTATION_EXTERNAL;
  247. break;
  248. default:
  249. dev_warn(ADEV_DEV(adev), "Unknown _PLD panel val %d\n",
  250. pld->panel);
  251. orientation = V4L2_FWNODE_ORIENTATION_EXTERNAL;
  252. break;
  253. }
  254. ACPI_FREE(pld);
  255. return orientation;
  256. }
  257. int ipu_bridge_parse_ssdb(struct acpi_device *adev, struct ipu_sensor *sensor)
  258. {
  259. struct ipu_sensor_ssdb ssdb = {};
  260. int ret;
  261. ret = ipu_bridge_read_acpi_buffer(adev, "SSDB", &ssdb, sizeof(ssdb));
  262. if (ret)
  263. return ret;
  264. if (ssdb.vcmtype > ARRAY_SIZE(ipu_vcm_types)) {
  265. dev_warn(ADEV_DEV(adev), "Unknown VCM type %d\n", ssdb.vcmtype);
  266. ssdb.vcmtype = 0;
  267. }
  268. if (ssdb.lanes > IPU_MAX_LANES) {
  269. dev_err(ADEV_DEV(adev), "Number of lanes in SSDB is invalid\n");
  270. return -EINVAL;
  271. }
  272. sensor->link = ssdb.link;
  273. sensor->lanes = ssdb.lanes;
  274. sensor->mclkspeed = ssdb.mclkspeed;
  275. sensor->rotation = ipu_bridge_parse_rotation(adev, &ssdb);
  276. sensor->orientation = ipu_bridge_parse_orientation(adev);
  277. if (ssdb.vcmtype)
  278. sensor->vcm_type = ipu_vcm_types[ssdb.vcmtype - 1];
  279. return 0;
  280. }
  281. EXPORT_SYMBOL_NS_GPL(ipu_bridge_parse_ssdb, INTEL_IPU_BRIDGE);
  282. static void ipu_bridge_create_fwnode_properties(
  283. struct ipu_sensor *sensor,
  284. struct ipu_bridge *bridge,
  285. const struct ipu_sensor_config *cfg)
  286. {
  287. struct ipu_property_names *names = &sensor->prop_names;
  288. struct software_node *nodes = sensor->swnodes;
  289. sensor->prop_names = prop_names;
  290. if (sensor->csi_dev) {
  291. sensor->local_ref[0] =
  292. SOFTWARE_NODE_REFERENCE(&nodes[SWNODE_IVSC_SENSOR_ENDPOINT]);
  293. sensor->remote_ref[0] =
  294. SOFTWARE_NODE_REFERENCE(&nodes[SWNODE_IVSC_IPU_ENDPOINT]);
  295. sensor->ivsc_sensor_ref[0] =
  296. SOFTWARE_NODE_REFERENCE(&nodes[SWNODE_SENSOR_ENDPOINT]);
  297. sensor->ivsc_ipu_ref[0] =
  298. SOFTWARE_NODE_REFERENCE(&nodes[SWNODE_IPU_ENDPOINT]);
  299. sensor->ivsc_sensor_ep_properties[0] =
  300. PROPERTY_ENTRY_U32(names->bus_type,
  301. V4L2_FWNODE_BUS_TYPE_CSI2_DPHY);
  302. sensor->ivsc_sensor_ep_properties[1] =
  303. PROPERTY_ENTRY_U32_ARRAY_LEN(names->data_lanes,
  304. bridge->data_lanes,
  305. sensor->lanes);
  306. sensor->ivsc_sensor_ep_properties[2] =
  307. PROPERTY_ENTRY_REF_ARRAY(names->remote_endpoint,
  308. sensor->ivsc_sensor_ref);
  309. sensor->ivsc_ipu_ep_properties[0] =
  310. PROPERTY_ENTRY_U32(names->bus_type,
  311. V4L2_FWNODE_BUS_TYPE_CSI2_DPHY);
  312. sensor->ivsc_ipu_ep_properties[1] =
  313. PROPERTY_ENTRY_U32_ARRAY_LEN(names->data_lanes,
  314. bridge->data_lanes,
  315. sensor->lanes);
  316. sensor->ivsc_ipu_ep_properties[2] =
  317. PROPERTY_ENTRY_REF_ARRAY(names->remote_endpoint,
  318. sensor->ivsc_ipu_ref);
  319. } else {
  320. sensor->local_ref[0] =
  321. SOFTWARE_NODE_REFERENCE(&nodes[SWNODE_IPU_ENDPOINT]);
  322. sensor->remote_ref[0] =
  323. SOFTWARE_NODE_REFERENCE(&nodes[SWNODE_SENSOR_ENDPOINT]);
  324. }
  325. sensor->dev_properties[0] = PROPERTY_ENTRY_U32(
  326. sensor->prop_names.clock_frequency,
  327. sensor->mclkspeed);
  328. sensor->dev_properties[1] = PROPERTY_ENTRY_U32(
  329. sensor->prop_names.rotation,
  330. sensor->rotation);
  331. sensor->dev_properties[2] = PROPERTY_ENTRY_U32(
  332. sensor->prop_names.orientation,
  333. sensor->orientation);
  334. if (sensor->vcm_type) {
  335. sensor->vcm_ref[0] =
  336. SOFTWARE_NODE_REFERENCE(&sensor->swnodes[SWNODE_VCM]);
  337. sensor->dev_properties[3] =
  338. PROPERTY_ENTRY_REF_ARRAY("lens-focus", sensor->vcm_ref);
  339. }
  340. sensor->ep_properties[0] = PROPERTY_ENTRY_U32(
  341. sensor->prop_names.bus_type,
  342. V4L2_FWNODE_BUS_TYPE_CSI2_DPHY);
  343. sensor->ep_properties[1] = PROPERTY_ENTRY_U32_ARRAY_LEN(
  344. sensor->prop_names.data_lanes,
  345. bridge->data_lanes, sensor->lanes);
  346. sensor->ep_properties[2] = PROPERTY_ENTRY_REF_ARRAY(
  347. sensor->prop_names.remote_endpoint,
  348. sensor->local_ref);
  349. if (cfg->nr_link_freqs > 0)
  350. sensor->ep_properties[3] = PROPERTY_ENTRY_U64_ARRAY_LEN(
  351. sensor->prop_names.link_frequencies,
  352. cfg->link_freqs,
  353. cfg->nr_link_freqs);
  354. sensor->ipu_properties[0] = PROPERTY_ENTRY_U32_ARRAY_LEN(
  355. sensor->prop_names.data_lanes,
  356. bridge->data_lanes, sensor->lanes);
  357. sensor->ipu_properties[1] = PROPERTY_ENTRY_REF_ARRAY(
  358. sensor->prop_names.remote_endpoint,
  359. sensor->remote_ref);
  360. }
  361. static void ipu_bridge_init_swnode_names(struct ipu_sensor *sensor)
  362. {
  363. snprintf(sensor->node_names.remote_port,
  364. sizeof(sensor->node_names.remote_port),
  365. SWNODE_GRAPH_PORT_NAME_FMT, sensor->link);
  366. snprintf(sensor->node_names.port,
  367. sizeof(sensor->node_names.port),
  368. SWNODE_GRAPH_PORT_NAME_FMT, 0); /* Always port 0 */
  369. snprintf(sensor->node_names.endpoint,
  370. sizeof(sensor->node_names.endpoint),
  371. SWNODE_GRAPH_ENDPOINT_NAME_FMT, 0); /* And endpoint 0 */
  372. if (sensor->vcm_type) {
  373. /* append link to distinguish nodes with same model VCM */
  374. snprintf(sensor->node_names.vcm, sizeof(sensor->node_names.vcm),
  375. "%s-%u", sensor->vcm_type, sensor->link);
  376. }
  377. if (sensor->csi_dev) {
  378. snprintf(sensor->node_names.ivsc_sensor_port,
  379. sizeof(sensor->node_names.ivsc_sensor_port),
  380. SWNODE_GRAPH_PORT_NAME_FMT, 0);
  381. snprintf(sensor->node_names.ivsc_ipu_port,
  382. sizeof(sensor->node_names.ivsc_ipu_port),
  383. SWNODE_GRAPH_PORT_NAME_FMT, 1);
  384. }
  385. }
  386. static void ipu_bridge_init_swnode_group(struct ipu_sensor *sensor)
  387. {
  388. struct software_node *nodes = sensor->swnodes;
  389. sensor->group[SWNODE_SENSOR_HID] = &nodes[SWNODE_SENSOR_HID];
  390. sensor->group[SWNODE_SENSOR_PORT] = &nodes[SWNODE_SENSOR_PORT];
  391. sensor->group[SWNODE_SENSOR_ENDPOINT] = &nodes[SWNODE_SENSOR_ENDPOINT];
  392. sensor->group[SWNODE_IPU_PORT] = &nodes[SWNODE_IPU_PORT];
  393. sensor->group[SWNODE_IPU_ENDPOINT] = &nodes[SWNODE_IPU_ENDPOINT];
  394. if (sensor->vcm_type)
  395. sensor->group[SWNODE_VCM] = &nodes[SWNODE_VCM];
  396. if (sensor->csi_dev) {
  397. sensor->group[SWNODE_IVSC_HID] =
  398. &nodes[SWNODE_IVSC_HID];
  399. sensor->group[SWNODE_IVSC_SENSOR_PORT] =
  400. &nodes[SWNODE_IVSC_SENSOR_PORT];
  401. sensor->group[SWNODE_IVSC_SENSOR_ENDPOINT] =
  402. &nodes[SWNODE_IVSC_SENSOR_ENDPOINT];
  403. sensor->group[SWNODE_IVSC_IPU_PORT] =
  404. &nodes[SWNODE_IVSC_IPU_PORT];
  405. sensor->group[SWNODE_IVSC_IPU_ENDPOINT] =
  406. &nodes[SWNODE_IVSC_IPU_ENDPOINT];
  407. if (sensor->vcm_type)
  408. sensor->group[SWNODE_VCM] = &nodes[SWNODE_VCM];
  409. } else {
  410. if (sensor->vcm_type)
  411. sensor->group[SWNODE_IVSC_HID] = &nodes[SWNODE_VCM];
  412. }
  413. }
  414. static void ipu_bridge_create_connection_swnodes(struct ipu_bridge *bridge,
  415. struct ipu_sensor *sensor)
  416. {
  417. struct ipu_node_names *names = &sensor->node_names;
  418. struct software_node *nodes = sensor->swnodes;
  419. ipu_bridge_init_swnode_names(sensor);
  420. nodes[SWNODE_SENSOR_HID] = NODE_SENSOR(sensor->name,
  421. sensor->dev_properties);
  422. nodes[SWNODE_SENSOR_PORT] = NODE_PORT(sensor->node_names.port,
  423. &nodes[SWNODE_SENSOR_HID]);
  424. nodes[SWNODE_SENSOR_ENDPOINT] = NODE_ENDPOINT(
  425. sensor->node_names.endpoint,
  426. &nodes[SWNODE_SENSOR_PORT],
  427. sensor->ep_properties);
  428. nodes[SWNODE_IPU_PORT] = NODE_PORT(sensor->node_names.remote_port,
  429. &bridge->ipu_hid_node);
  430. nodes[SWNODE_IPU_ENDPOINT] = NODE_ENDPOINT(
  431. sensor->node_names.endpoint,
  432. &nodes[SWNODE_IPU_PORT],
  433. sensor->ipu_properties);
  434. if (sensor->csi_dev) {
  435. const char *device_hid = "";
  436. #if IS_ENABLED(CONFIG_ACPI)
  437. device_hid = acpi_device_hid(sensor->ivsc_adev);
  438. #endif
  439. snprintf(sensor->ivsc_name, sizeof(sensor->ivsc_name), "%s-%u",
  440. device_hid, sensor->link);
  441. nodes[SWNODE_IVSC_HID] = NODE_SENSOR(sensor->ivsc_name,
  442. sensor->ivsc_properties);
  443. nodes[SWNODE_IVSC_SENSOR_PORT] =
  444. NODE_PORT(names->ivsc_sensor_port,
  445. &nodes[SWNODE_IVSC_HID]);
  446. nodes[SWNODE_IVSC_SENSOR_ENDPOINT] =
  447. NODE_ENDPOINT(names->endpoint,
  448. &nodes[SWNODE_IVSC_SENSOR_PORT],
  449. sensor->ivsc_sensor_ep_properties);
  450. nodes[SWNODE_IVSC_IPU_PORT] =
  451. NODE_PORT(names->ivsc_ipu_port,
  452. &nodes[SWNODE_IVSC_HID]);
  453. nodes[SWNODE_IVSC_IPU_ENDPOINT] =
  454. NODE_ENDPOINT(names->endpoint,
  455. &nodes[SWNODE_IVSC_IPU_PORT],
  456. sensor->ivsc_ipu_ep_properties);
  457. }
  458. nodes[SWNODE_VCM] = NODE_VCM(sensor->node_names.vcm);
  459. ipu_bridge_init_swnode_group(sensor);
  460. }
  461. /*
  462. * The actual instantiation must be done from a workqueue to avoid
  463. * a deadlock on taking list_lock from v4l2-async twice.
  464. */
  465. struct ipu_bridge_instantiate_vcm_work_data {
  466. struct work_struct work;
  467. struct device *sensor;
  468. char name[16];
  469. struct i2c_board_info board_info;
  470. };
  471. static void ipu_bridge_instantiate_vcm_work(struct work_struct *work)
  472. {
  473. struct ipu_bridge_instantiate_vcm_work_data *data =
  474. container_of(work, struct ipu_bridge_instantiate_vcm_work_data,
  475. work);
  476. struct acpi_device *adev = ACPI_COMPANION(data->sensor);
  477. struct i2c_client *vcm_client;
  478. bool put_fwnode = true;
  479. int ret;
  480. /*
  481. * The client may get probed before the device_link gets added below
  482. * make sure the sensor is powered-up during probe.
  483. */
  484. ret = pm_runtime_get_sync(data->sensor);
  485. if (ret < 0) {
  486. dev_err(data->sensor, "Error %d runtime-resuming sensor, cannot instantiate VCM\n",
  487. ret);
  488. goto out_pm_put;
  489. }
  490. /*
  491. * Note the client is created only once and then kept around
  492. * even after a rmmod, just like the software-nodes.
  493. */
  494. vcm_client = i2c_acpi_new_device_by_fwnode(acpi_fwnode_handle(adev),
  495. 1, &data->board_info);
  496. if (IS_ERR(vcm_client)) {
  497. dev_err(data->sensor, "Error instantiating VCM client: %ld\n",
  498. PTR_ERR(vcm_client));
  499. goto out_pm_put;
  500. }
  501. device_link_add(&vcm_client->dev, data->sensor, DL_FLAG_PM_RUNTIME);
  502. dev_info(data->sensor, "Instantiated %s VCM\n", data->board_info.type);
  503. put_fwnode = false; /* Ownership has passed to the i2c-client */
  504. out_pm_put:
  505. pm_runtime_put(data->sensor);
  506. put_device(data->sensor);
  507. if (put_fwnode)
  508. fwnode_handle_put(data->board_info.fwnode);
  509. kfree(data);
  510. }
  511. int ipu_bridge_instantiate_vcm(struct device *sensor)
  512. {
  513. struct ipu_bridge_instantiate_vcm_work_data *data;
  514. struct fwnode_handle *vcm_fwnode;
  515. struct i2c_client *vcm_client;
  516. struct acpi_device *adev;
  517. char *sep;
  518. adev = ACPI_COMPANION(sensor);
  519. if (!adev)
  520. return 0;
  521. vcm_fwnode = fwnode_find_reference(dev_fwnode(sensor), "lens-focus", 0);
  522. if (IS_ERR(vcm_fwnode))
  523. return 0;
  524. /* When reloading modules the client will already exist */
  525. vcm_client = i2c_find_device_by_fwnode(vcm_fwnode);
  526. if (vcm_client) {
  527. fwnode_handle_put(vcm_fwnode);
  528. put_device(&vcm_client->dev);
  529. return 0;
  530. }
  531. data = kzalloc(sizeof(*data), GFP_KERNEL);
  532. if (!data) {
  533. fwnode_handle_put(vcm_fwnode);
  534. return -ENOMEM;
  535. }
  536. INIT_WORK(&data->work, ipu_bridge_instantiate_vcm_work);
  537. data->sensor = get_device(sensor);
  538. snprintf(data->name, sizeof(data->name), "%s-VCM",
  539. acpi_dev_name(adev));
  540. data->board_info.dev_name = data->name;
  541. data->board_info.fwnode = vcm_fwnode;
  542. snprintf(data->board_info.type, sizeof(data->board_info.type),
  543. "%pfwP", vcm_fwnode);
  544. /* Strip "-<link>" postfix */
  545. sep = strchrnul(data->board_info.type, '-');
  546. *sep = 0;
  547. queue_work(system_long_wq, &data->work);
  548. return 0;
  549. }
  550. EXPORT_SYMBOL_NS_GPL(ipu_bridge_instantiate_vcm, INTEL_IPU_BRIDGE);
  551. static int ipu_bridge_instantiate_ivsc(struct ipu_sensor *sensor)
  552. {
  553. struct fwnode_handle *fwnode;
  554. if (!sensor->csi_dev)
  555. return 0;
  556. fwnode = software_node_fwnode(&sensor->swnodes[SWNODE_IVSC_HID]);
  557. if (!fwnode)
  558. return -ENODEV;
  559. set_secondary_fwnode(sensor->csi_dev, fwnode);
  560. return 0;
  561. }
  562. static void ipu_bridge_unregister_sensors(struct ipu_bridge *bridge)
  563. {
  564. struct ipu_sensor *sensor;
  565. unsigned int i;
  566. for (i = 0; i < bridge->n_sensors; i++) {
  567. sensor = &bridge->sensors[i];
  568. software_node_unregister_node_group(sensor->group);
  569. acpi_dev_put(sensor->adev);
  570. put_device(sensor->csi_dev);
  571. acpi_dev_put(sensor->ivsc_adev);
  572. }
  573. }
  574. static int ipu_bridge_connect_sensor(const struct ipu_sensor_config *cfg,
  575. struct ipu_bridge *bridge)
  576. {
  577. struct fwnode_handle *fwnode, *primary;
  578. struct ipu_sensor *sensor;
  579. struct acpi_device *adev = NULL;
  580. int ret;
  581. #if IS_ENABLED(CONFIG_ACPI)
  582. for_each_acpi_dev_match(adev, cfg->hid, NULL, -1) {
  583. #else
  584. while (true) {
  585. #endif
  586. if (!ACPI_PTR(adev->status.enabled))
  587. continue;
  588. if (bridge->n_sensors >= IPU_MAX_PORTS) {
  589. acpi_dev_put(adev);
  590. dev_err(bridge->dev, "Exceeded available IPU ports\n");
  591. return -EINVAL;
  592. }
  593. sensor = &bridge->sensors[bridge->n_sensors];
  594. ret = bridge->parse_sensor_fwnode(adev, sensor);
  595. if (ret)
  596. goto err_put_adev;
  597. snprintf(sensor->name, sizeof(sensor->name), "%s-%u",
  598. cfg->hid, sensor->link);
  599. ret = ipu_bridge_check_ivsc_dev(sensor, adev);
  600. if (ret)
  601. goto err_put_adev;
  602. ipu_bridge_create_fwnode_properties(sensor, bridge, cfg);
  603. ipu_bridge_create_connection_swnodes(bridge, sensor);
  604. ret = software_node_register_node_group(sensor->group);
  605. if (ret)
  606. goto err_put_ivsc;
  607. fwnode = software_node_fwnode(&sensor->swnodes[
  608. SWNODE_SENSOR_HID]);
  609. if (!fwnode) {
  610. ret = -ENODEV;
  611. goto err_free_swnodes;
  612. }
  613. sensor->adev = ACPI_PTR(acpi_dev_get(adev));
  614. primary = acpi_fwnode_handle(adev);
  615. primary->secondary = fwnode;
  616. ret = ipu_bridge_instantiate_ivsc(sensor);
  617. if (ret)
  618. goto err_free_swnodes;
  619. dev_info(bridge->dev, "Found supported sensor %s\n",
  620. acpi_dev_name(adev));
  621. bridge->n_sensors++;
  622. }
  623. return 0;
  624. err_free_swnodes:
  625. software_node_unregister_node_group(sensor->group);
  626. err_put_ivsc:
  627. put_device(sensor->csi_dev);
  628. acpi_dev_put(sensor->ivsc_adev);
  629. err_put_adev:
  630. acpi_dev_put(adev);
  631. return ret;
  632. }
  633. static int ipu_bridge_connect_sensors(struct ipu_bridge *bridge)
  634. {
  635. unsigned int i;
  636. int ret;
  637. for (i = 0; i < ARRAY_SIZE(ipu_supported_sensors); i++) {
  638. const struct ipu_sensor_config *cfg =
  639. &ipu_supported_sensors[i];
  640. ret = ipu_bridge_connect_sensor(cfg, bridge);
  641. if (ret)
  642. goto err_unregister_sensors;
  643. }
  644. return 0;
  645. err_unregister_sensors:
  646. ipu_bridge_unregister_sensors(bridge);
  647. return ret;
  648. }
  649. static int ipu_bridge_ivsc_is_ready(void)
  650. {
  651. struct acpi_device *sensor_adev, *adev;
  652. struct device *csi_dev;
  653. bool ready = true;
  654. unsigned int i;
  655. for (i = 0; i < ARRAY_SIZE(ipu_supported_sensors); i++) {
  656. #if IS_ENABLED(CONFIG_ACPI)
  657. const struct ipu_sensor_config *cfg =
  658. &ipu_supported_sensors[i];
  659. for_each_acpi_dev_match(sensor_adev, cfg->hid, NULL, -1) {
  660. #else
  661. while (true) {
  662. sensor_adev = NULL;
  663. #endif
  664. if (!ACPI_PTR(sensor_adev->status.enabled))
  665. continue;
  666. adev = ipu_bridge_get_ivsc_acpi_dev(sensor_adev);
  667. if (!adev)
  668. continue;
  669. csi_dev = ipu_bridge_get_ivsc_csi_dev(adev);
  670. if (!csi_dev)
  671. ready = false;
  672. put_device(csi_dev);
  673. acpi_dev_put(adev);
  674. }
  675. }
  676. return ready;
  677. }
  678. static int ipu_bridge_check_fwnode_graph(struct fwnode_handle *fwnode)
  679. {
  680. struct fwnode_handle *endpoint;
  681. if (IS_ERR_OR_NULL(fwnode))
  682. return -EINVAL;
  683. endpoint = fwnode_graph_get_next_endpoint(fwnode, NULL);
  684. if (endpoint) {
  685. fwnode_handle_put(endpoint);
  686. return 0;
  687. }
  688. return ipu_bridge_check_fwnode_graph(fwnode->secondary);
  689. }
  690. static DEFINE_MUTEX(ipu_bridge_mutex);
  691. int ipu_bridge_init(struct device *dev,
  692. ipu_parse_sensor_fwnode_t parse_sensor_fwnode)
  693. {
  694. struct fwnode_handle *fwnode;
  695. struct ipu_bridge *bridge;
  696. unsigned int i;
  697. int ret;
  698. guard(mutex)(&ipu_bridge_mutex);
  699. if (!ipu_bridge_check_fwnode_graph(dev_fwnode(dev)))
  700. return 0;
  701. if (!ipu_bridge_ivsc_is_ready())
  702. return -EPROBE_DEFER;
  703. bridge = kzalloc(sizeof(*bridge), GFP_KERNEL);
  704. if (!bridge)
  705. return -ENOMEM;
  706. strscpy(bridge->ipu_node_name, IPU_HID,
  707. sizeof(bridge->ipu_node_name));
  708. bridge->ipu_hid_node.name = bridge->ipu_node_name;
  709. bridge->dev = dev;
  710. bridge->parse_sensor_fwnode = parse_sensor_fwnode;
  711. ret = software_node_register(&bridge->ipu_hid_node);
  712. if (ret < 0) {
  713. dev_err(dev, "Failed to register the IPU HID node\n");
  714. goto err_free_bridge;
  715. }
  716. /*
  717. * Map the lane arrangement, which is fixed for the IPU3 (meaning we
  718. * only need one, rather than one per sensor). We include it as a
  719. * member of the struct ipu_bridge rather than a global variable so
  720. * that it survives if the module is unloaded along with the rest of
  721. * the struct.
  722. */
  723. for (i = 0; i < IPU_MAX_LANES; i++)
  724. bridge->data_lanes[i] = i + 1;
  725. ret = ipu_bridge_connect_sensors(bridge);
  726. if (ret || bridge->n_sensors == 0)
  727. goto err_unregister_ipu;
  728. dev_info(dev, "Connected %d cameras\n", bridge->n_sensors);
  729. fwnode = software_node_fwnode(&bridge->ipu_hid_node);
  730. if (!fwnode) {
  731. dev_err(dev, "Error getting fwnode from ipu software_node\n");
  732. ret = -ENODEV;
  733. goto err_unregister_sensors;
  734. }
  735. set_secondary_fwnode(dev, fwnode);
  736. return 0;
  737. err_unregister_sensors:
  738. ipu_bridge_unregister_sensors(bridge);
  739. err_unregister_ipu:
  740. software_node_unregister(&bridge->ipu_hid_node);
  741. err_free_bridge:
  742. kfree(bridge);
  743. return ret;
  744. }
  745. EXPORT_SYMBOL_NS_GPL(ipu_bridge_init, INTEL_IPU_BRIDGE);
  746. MODULE_LICENSE("GPL");
  747. MODULE_DESCRIPTION("Intel IPU Sensors Bridge driver");