fimc-is.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995
  1. /*
  2. * Samsung EXYNOS4x12 FIMC-IS (Imaging Subsystem) driver
  3. *
  4. * Copyright (C) 2013 Samsung Electronics Co., Ltd.
  5. *
  6. * Authors: Sylwester Nawrocki <s.nawrocki@samsung.com>
  7. * Younghwan Joo <yhwan.joo@samsung.com>
  8. *
  9. * This program is free software; you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2 as
  11. * published by the Free Software Foundation.
  12. */
  13. #define pr_fmt(fmt) "%s:%d " fmt, __func__, __LINE__
  14. #include <linux/device.h>
  15. #include <linux/debugfs.h>
  16. #include <linux/delay.h>
  17. #include <linux/dma-contiguous.h>
  18. #include <linux/errno.h>
  19. #include <linux/firmware.h>
  20. #include <linux/interrupt.h>
  21. #include <linux/kernel.h>
  22. #include <linux/module.h>
  23. #include <linux/of_i2c.h>
  24. #include <linux/of_irq.h>
  25. #include <linux/of_address.h>
  26. #include <linux/of_platform.h>
  27. #include <linux/platform_device.h>
  28. #include <linux/pm_runtime.h>
  29. #include <linux/slab.h>
  30. #include <linux/types.h>
  31. #include <linux/videodev2.h>
  32. #include <media/v4l2-of.h>
  33. #include <media/videobuf2-dma-contig.h>
  34. #include "media-dev.h"
  35. #include "fimc-is.h"
  36. #include "fimc-is-command.h"
  37. #include "fimc-is-errno.h"
  38. #include "fimc-is-i2c.h"
  39. #include "fimc-is-param.h"
  40. #include "fimc-is-regs.h"
  41. static char *fimc_is_clocks[ISS_CLKS_MAX] = {
  42. [ISS_CLK_PPMUISPX] = "ppmuispx",
  43. [ISS_CLK_PPMUISPMX] = "ppmuispmx",
  44. [ISS_CLK_LITE0] = "lite0",
  45. [ISS_CLK_LITE1] = "lite1",
  46. [ISS_CLK_MPLL] = "mpll",
  47. [ISS_CLK_ISP] = "isp",
  48. [ISS_CLK_DRC] = "drc",
  49. [ISS_CLK_FD] = "fd",
  50. [ISS_CLK_MCUISP] = "mcuisp",
  51. [ISS_CLK_UART] = "uart",
  52. [ISS_CLK_ISP_DIV0] = "ispdiv0",
  53. [ISS_CLK_ISP_DIV1] = "ispdiv1",
  54. [ISS_CLK_MCUISP_DIV0] = "mcuispdiv0",
  55. [ISS_CLK_MCUISP_DIV1] = "mcuispdiv1",
  56. [ISS_CLK_ACLK200] = "aclk200",
  57. [ISS_CLK_ACLK200_DIV] = "div_aclk200",
  58. [ISS_CLK_ACLK400MCUISP] = "aclk400mcuisp",
  59. [ISS_CLK_ACLK400MCUISP_DIV] = "div_aclk400mcuisp",
  60. };
  61. static void fimc_is_put_clocks(struct fimc_is *is)
  62. {
  63. int i;
  64. for (i = 0; i < ISS_CLKS_MAX; i++) {
  65. if (IS_ERR(is->clocks[i]))
  66. continue;
  67. clk_put(is->clocks[i]);
  68. is->clocks[i] = ERR_PTR(-EINVAL);
  69. }
  70. }
  71. static int fimc_is_get_clocks(struct fimc_is *is)
  72. {
  73. int i, ret;
  74. for (i = 0; i < ISS_CLKS_MAX; i++)
  75. is->clocks[i] = ERR_PTR(-EINVAL);
  76. for (i = 0; i < ISS_CLKS_MAX; i++) {
  77. is->clocks[i] = clk_get(&is->pdev->dev, fimc_is_clocks[i]);
  78. if (IS_ERR(is->clocks[i])) {
  79. ret = PTR_ERR(is->clocks[i]);
  80. goto err;
  81. }
  82. }
  83. return 0;
  84. err:
  85. fimc_is_put_clocks(is);
  86. dev_err(&is->pdev->dev, "failed to get clock: %s\n",
  87. fimc_is_clocks[i]);
  88. return ret;
  89. }
  90. static int fimc_is_setup_clocks(struct fimc_is *is)
  91. {
  92. int ret;
  93. ret = clk_set_parent(is->clocks[ISS_CLK_ACLK200],
  94. is->clocks[ISS_CLK_ACLK200_DIV]);
  95. if (ret < 0)
  96. return ret;
  97. ret = clk_set_parent(is->clocks[ISS_CLK_ACLK400MCUISP],
  98. is->clocks[ISS_CLK_ACLK400MCUISP_DIV]);
  99. if (ret < 0)
  100. return ret;
  101. ret = clk_set_rate(is->clocks[ISS_CLK_ISP_DIV0], ACLK_AXI_FREQUENCY);
  102. if (ret < 0)
  103. return ret;
  104. ret = clk_set_rate(is->clocks[ISS_CLK_ISP_DIV1], ACLK_AXI_FREQUENCY);
  105. if (ret < 0)
  106. return ret;
  107. ret = clk_set_rate(is->clocks[ISS_CLK_MCUISP_DIV0],
  108. ATCLK_MCUISP_FREQUENCY);
  109. if (ret < 0)
  110. return ret;
  111. return clk_set_rate(is->clocks[ISS_CLK_MCUISP_DIV1],
  112. ATCLK_MCUISP_FREQUENCY);
  113. }
  114. static int fimc_is_enable_clocks(struct fimc_is *is)
  115. {
  116. int i, ret;
  117. for (i = 0; i < ISS_GATE_CLKS_MAX; i++) {
  118. if (IS_ERR(is->clocks[i]))
  119. continue;
  120. ret = clk_prepare_enable(is->clocks[i]);
  121. if (ret < 0) {
  122. dev_err(&is->pdev->dev, "clock %s enable failed\n",
  123. fimc_is_clocks[i]);
  124. for (--i; i >= 0; i--)
  125. clk_disable(is->clocks[i]);
  126. return ret;
  127. }
  128. pr_debug("enabled clock: %s\n", fimc_is_clocks[i]);
  129. }
  130. return 0;
  131. }
  132. static void fimc_is_disable_clocks(struct fimc_is *is)
  133. {
  134. int i;
  135. for (i = 0; i < ISS_GATE_CLKS_MAX; i++) {
  136. if (!IS_ERR(is->clocks[i])) {
  137. clk_disable_unprepare(is->clocks[i]);
  138. pr_debug("disabled clock: %s\n", fimc_is_clocks[i]);
  139. }
  140. }
  141. }
  142. static int fimc_is_parse_sensor_config(struct fimc_is_sensor *sensor,
  143. struct device_node *np)
  144. {
  145. u32 tmp = 0;
  146. int ret;
  147. np = v4l2_of_get_next_endpoint(np, NULL);
  148. if (!np)
  149. return -ENXIO;
  150. np = v4l2_of_get_remote_port(np);
  151. if (!np)
  152. return -ENXIO;
  153. /* Use MIPI-CSIS channel id to determine the ISP I2C bus index. */
  154. ret = of_property_read_u32(np, "reg", &tmp);
  155. sensor->i2c_bus = tmp - FIMC_INPUT_MIPI_CSI2_0;
  156. return ret;
  157. }
  158. static int fimc_is_register_subdevs(struct fimc_is *is)
  159. {
  160. struct device_node *adapter, *child;
  161. int ret;
  162. ret = fimc_isp_subdev_create(&is->isp);
  163. if (ret < 0)
  164. return ret;
  165. for_each_compatible_node(adapter, NULL, FIMC_IS_I2C_COMPATIBLE) {
  166. if (!of_find_device_by_node(adapter)) {
  167. of_node_put(adapter);
  168. return -EPROBE_DEFER;
  169. }
  170. for_each_available_child_of_node(adapter, child) {
  171. struct i2c_client *client;
  172. struct v4l2_subdev *sd;
  173. client = of_find_i2c_device_by_node(child);
  174. if (!client)
  175. goto e_retry;
  176. sd = i2c_get_clientdata(client);
  177. if (!sd)
  178. goto e_retry;
  179. /* FIXME: Add support for multiple sensors. */
  180. if (WARN_ON(is->sensor))
  181. continue;
  182. is->sensor = sd_to_fimc_is_sensor(sd);
  183. if (fimc_is_parse_sensor_config(is->sensor, child)) {
  184. dev_warn(&is->pdev->dev, "DT parse error: %s\n",
  185. child->full_name);
  186. }
  187. pr_debug("%s(): registered subdev: %p\n",
  188. __func__, sd->name);
  189. }
  190. }
  191. return 0;
  192. e_retry:
  193. of_node_put(child);
  194. return -EPROBE_DEFER;
  195. }
  196. static int fimc_is_unregister_subdevs(struct fimc_is *is)
  197. {
  198. fimc_isp_subdev_destroy(&is->isp);
  199. is->sensor = NULL;
  200. return 0;
  201. }
  202. static int fimc_is_load_setfile(struct fimc_is *is, char *file_name)
  203. {
  204. const struct firmware *fw;
  205. void *buf;
  206. int ret;
  207. ret = request_firmware(&fw, file_name, &is->pdev->dev);
  208. if (ret < 0) {
  209. dev_err(&is->pdev->dev, "firmware request failed (%d)\n", ret);
  210. return ret;
  211. }
  212. buf = is->memory.vaddr + is->setfile.base;
  213. memcpy(buf, fw->data, fw->size);
  214. fimc_is_mem_barrier();
  215. is->setfile.size = fw->size;
  216. pr_debug("mem vaddr: %p, setfile buf: %p\n", is->memory.vaddr, buf);
  217. memcpy(is->fw.setfile_info,
  218. fw->data + fw->size - FIMC_IS_SETFILE_INFO_LEN,
  219. FIMC_IS_SETFILE_INFO_LEN - 1);
  220. is->fw.setfile_info[FIMC_IS_SETFILE_INFO_LEN - 1] = '\0';
  221. is->setfile.state = 1;
  222. pr_debug("FIMC-IS setfile loaded: base: %#x, size: %zu B\n",
  223. is->setfile.base, fw->size);
  224. release_firmware(fw);
  225. return ret;
  226. }
  227. int fimc_is_cpu_set_power(struct fimc_is *is, int on)
  228. {
  229. unsigned int timeout = FIMC_IS_POWER_ON_TIMEOUT;
  230. if (on) {
  231. /* Disable watchdog */
  232. mcuctl_write(0, is, REG_WDT_ISP);
  233. /* Cortex-A5 start address setting */
  234. mcuctl_write(is->memory.paddr, is, MCUCTL_REG_BBOAR);
  235. /* Enable and start Cortex-A5 */
  236. pmuisp_write(0x18000, is, REG_PMU_ISP_ARM_OPTION);
  237. pmuisp_write(0x1, is, REG_PMU_ISP_ARM_CONFIGURATION);
  238. } else {
  239. /* A5 power off */
  240. pmuisp_write(0x10000, is, REG_PMU_ISP_ARM_OPTION);
  241. pmuisp_write(0x0, is, REG_PMU_ISP_ARM_CONFIGURATION);
  242. while (pmuisp_read(is, REG_PMU_ISP_ARM_STATUS) & 1) {
  243. if (timeout == 0)
  244. return -ETIME;
  245. timeout--;
  246. udelay(1);
  247. }
  248. }
  249. return 0;
  250. }
  251. /* Wait until @bit of @is->state is set to @state in the interrupt handler. */
  252. int fimc_is_wait_event(struct fimc_is *is, unsigned long bit,
  253. unsigned int state, unsigned int timeout)
  254. {
  255. int ret = wait_event_timeout(is->irq_queue,
  256. !state ^ test_bit(bit, &is->state),
  257. timeout);
  258. if (ret == 0) {
  259. dev_WARN(&is->pdev->dev, "%s() timed out\n", __func__);
  260. return -ETIME;
  261. }
  262. return 0;
  263. }
  264. int fimc_is_start_firmware(struct fimc_is *is)
  265. {
  266. struct device *dev = &is->pdev->dev;
  267. int ret;
  268. if (is->fw.f_w == NULL) {
  269. dev_err(dev, "firmware is not loaded\n");
  270. return -EINVAL;
  271. }
  272. memcpy(is->memory.vaddr, is->fw.f_w->data, is->fw.f_w->size);
  273. wmb();
  274. ret = fimc_is_cpu_set_power(is, 1);
  275. if (ret < 0)
  276. return ret;
  277. ret = fimc_is_wait_event(is, IS_ST_A5_PWR_ON, 1,
  278. msecs_to_jiffies(FIMC_IS_FW_LOAD_TIMEOUT));
  279. if (ret < 0)
  280. dev_err(dev, "FIMC-IS CPU power on failed\n");
  281. return ret;
  282. }
  283. /* Allocate working memory for the FIMC-IS CPU. */
  284. static int fimc_is_alloc_cpu_memory(struct fimc_is *is)
  285. {
  286. struct device *dev = &is->pdev->dev;
  287. is->memory.vaddr = dma_alloc_coherent(dev, FIMC_IS_CPU_MEM_SIZE,
  288. &is->memory.paddr, GFP_KERNEL);
  289. if (is->memory.vaddr == NULL)
  290. return -ENOMEM;
  291. is->memory.size = FIMC_IS_CPU_MEM_SIZE;
  292. memset(is->memory.vaddr, 0, is->memory.size);
  293. dev_info(dev, "FIMC-IS CPU memory base: %#x\n", (u32)is->memory.paddr);
  294. if (((u32)is->memory.paddr) & FIMC_IS_FW_ADDR_MASK) {
  295. dev_err(dev, "invalid firmware memory alignment: %#x\n",
  296. (u32)is->memory.paddr);
  297. dma_free_coherent(dev, is->memory.size, is->memory.vaddr,
  298. is->memory.paddr);
  299. return -EIO;
  300. }
  301. is->is_p_region = (struct is_region *)(is->memory.vaddr +
  302. FIMC_IS_CPU_MEM_SIZE - FIMC_IS_REGION_SIZE);
  303. is->is_dma_p_region = is->memory.paddr +
  304. FIMC_IS_CPU_MEM_SIZE - FIMC_IS_REGION_SIZE;
  305. is->is_shared_region = (struct is_share_region *)(is->memory.vaddr +
  306. FIMC_IS_SHARED_REGION_OFFSET);
  307. return 0;
  308. }
  309. static void fimc_is_free_cpu_memory(struct fimc_is *is)
  310. {
  311. struct device *dev = &is->pdev->dev;
  312. dma_free_coherent(dev, is->memory.size, is->memory.vaddr,
  313. is->memory.paddr);
  314. }
  315. static void fimc_is_load_firmware(const struct firmware *fw, void *context)
  316. {
  317. struct fimc_is *is = context;
  318. struct device *dev = &is->pdev->dev;
  319. void *buf;
  320. int ret;
  321. if (fw == NULL) {
  322. dev_err(dev, "firmware request failed\n");
  323. return;
  324. }
  325. mutex_lock(&is->lock);
  326. if (fw->size < FIMC_IS_FW_SIZE_MIN || fw->size > FIMC_IS_FW_SIZE_MAX) {
  327. dev_err(dev, "wrong firmware size: %d\n", fw->size);
  328. goto done;
  329. }
  330. is->fw.size = fw->size;
  331. ret = fimc_is_alloc_cpu_memory(is);
  332. if (ret < 0) {
  333. dev_err(dev, "failed to allocate FIMC-IS CPU memory\n");
  334. goto done;
  335. }
  336. memcpy(is->memory.vaddr, fw->data, fw->size);
  337. wmb();
  338. /* Read firmware description. */
  339. buf = (void *)(is->memory.vaddr + fw->size - FIMC_IS_FW_DESC_LEN);
  340. memcpy(&is->fw.info, buf, FIMC_IS_FW_INFO_LEN);
  341. is->fw.info[FIMC_IS_FW_INFO_LEN] = 0;
  342. buf = (void *)(is->memory.vaddr + fw->size - FIMC_IS_FW_VER_LEN);
  343. memcpy(&is->fw.version, buf, FIMC_IS_FW_VER_LEN);
  344. is->fw.version[FIMC_IS_FW_VER_LEN - 1] = 0;
  345. is->fw.state = 1;
  346. dev_info(dev, "loaded firmware: %s, rev. %s\n",
  347. is->fw.info, is->fw.version);
  348. dev_dbg(dev, "FW size: %d, paddr: %#x\n", fw->size, is->memory.paddr);
  349. is->is_shared_region->chip_id = 0xe4412;
  350. is->is_shared_region->chip_rev_no = 1;
  351. fimc_is_mem_barrier();
  352. /*
  353. * FIXME: The firmware is not being released for now, as it is
  354. * needed around for copying to the IS working memory every
  355. * time before the Cortex-A5 is restarted.
  356. */
  357. if (is->fw.f_w)
  358. release_firmware(is->fw.f_w);
  359. is->fw.f_w = fw;
  360. done:
  361. mutex_unlock(&is->lock);
  362. }
  363. static int fimc_is_request_firmware(struct fimc_is *is, const char *fw_name)
  364. {
  365. return request_firmware_nowait(THIS_MODULE,
  366. FW_ACTION_HOTPLUG, fw_name, &is->pdev->dev,
  367. GFP_KERNEL, is, fimc_is_load_firmware);
  368. }
  369. /* General IS interrupt handler */
  370. static void fimc_is_general_irq_handler(struct fimc_is *is)
  371. {
  372. is->i2h_cmd.cmd = mcuctl_read(is, MCUCTL_REG_ISSR(10));
  373. switch (is->i2h_cmd.cmd) {
  374. case IHC_GET_SENSOR_NUM:
  375. fimc_is_hw_get_params(is, 1);
  376. fimc_is_hw_wait_intmsr0_intmsd0(is);
  377. fimc_is_hw_set_sensor_num(is);
  378. pr_debug("ISP FW version: %#x\n", is->i2h_cmd.args[0]);
  379. break;
  380. case IHC_SET_FACE_MARK:
  381. case IHC_FRAME_DONE:
  382. fimc_is_hw_get_params(is, 2);
  383. break;
  384. case IHC_SET_SHOT_MARK:
  385. case IHC_AA_DONE:
  386. case IH_REPLY_DONE:
  387. fimc_is_hw_get_params(is, 3);
  388. break;
  389. case IH_REPLY_NOT_DONE:
  390. fimc_is_hw_get_params(is, 4);
  391. break;
  392. case IHC_NOT_READY:
  393. break;
  394. default:
  395. pr_info("unknown command: %#x\n", is->i2h_cmd.cmd);
  396. }
  397. fimc_is_fw_clear_irq1(is, FIMC_IS_INT_GENERAL);
  398. switch (is->i2h_cmd.cmd) {
  399. case IHC_GET_SENSOR_NUM:
  400. fimc_is_hw_set_intgr0_gd0(is);
  401. set_bit(IS_ST_A5_PWR_ON, &is->state);
  402. break;
  403. case IHC_SET_SHOT_MARK:
  404. break;
  405. case IHC_SET_FACE_MARK:
  406. is->fd_header.count = is->i2h_cmd.args[0];
  407. is->fd_header.index = is->i2h_cmd.args[1];
  408. is->fd_header.offset = 0;
  409. break;
  410. case IHC_FRAME_DONE:
  411. break;
  412. case IHC_AA_DONE:
  413. pr_debug("AA_DONE - %d, %d, %d\n", is->i2h_cmd.args[0],
  414. is->i2h_cmd.args[1], is->i2h_cmd.args[2]);
  415. break;
  416. case IH_REPLY_DONE:
  417. pr_debug("ISR_DONE: args[0]: %#x\n", is->i2h_cmd.args[0]);
  418. switch (is->i2h_cmd.args[0]) {
  419. case HIC_PREVIEW_STILL...HIC_CAPTURE_VIDEO:
  420. /* Get CAC margin */
  421. set_bit(IS_ST_CHANGE_MODE, &is->state);
  422. is->isp.cac_margin_x = is->i2h_cmd.args[1];
  423. is->isp.cac_margin_y = is->i2h_cmd.args[2];
  424. pr_debug("CAC margin (x,y): (%d,%d)\n",
  425. is->isp.cac_margin_x, is->isp.cac_margin_y);
  426. break;
  427. case HIC_STREAM_ON:
  428. clear_bit(IS_ST_STREAM_OFF, &is->state);
  429. set_bit(IS_ST_STREAM_ON, &is->state);
  430. break;
  431. case HIC_STREAM_OFF:
  432. clear_bit(IS_ST_STREAM_ON, &is->state);
  433. set_bit(IS_ST_STREAM_OFF, &is->state);
  434. break;
  435. case HIC_SET_PARAMETER:
  436. is->config[is->config_index].p_region_index[0] = 0;
  437. is->config[is->config_index].p_region_index[1] = 0;
  438. set_bit(IS_ST_BLOCK_CMD_CLEARED, &is->state);
  439. pr_debug("HIC_SET_PARAMETER\n");
  440. break;
  441. case HIC_GET_PARAMETER:
  442. break;
  443. case HIC_SET_TUNE:
  444. break;
  445. case HIC_GET_STATUS:
  446. break;
  447. case HIC_OPEN_SENSOR:
  448. set_bit(IS_ST_OPEN_SENSOR, &is->state);
  449. pr_debug("data lanes: %d, settle line: %d\n",
  450. is->i2h_cmd.args[2], is->i2h_cmd.args[1]);
  451. break;
  452. case HIC_CLOSE_SENSOR:
  453. clear_bit(IS_ST_OPEN_SENSOR, &is->state);
  454. is->sensor_index = 0;
  455. break;
  456. case HIC_MSG_TEST:
  457. pr_debug("config MSG level completed\n");
  458. break;
  459. case HIC_POWER_DOWN:
  460. clear_bit(IS_ST_PWR_SUBIP_ON, &is->state);
  461. break;
  462. case HIC_GET_SET_FILE_ADDR:
  463. is->setfile.base = is->i2h_cmd.args[1];
  464. set_bit(IS_ST_SETFILE_LOADED, &is->state);
  465. break;
  466. case HIC_LOAD_SET_FILE:
  467. set_bit(IS_ST_SETFILE_LOADED, &is->state);
  468. break;
  469. }
  470. break;
  471. case IH_REPLY_NOT_DONE:
  472. pr_err("ISR_NDONE: %d: %#x, %s\n", is->i2h_cmd.args[0],
  473. is->i2h_cmd.args[1],
  474. fimc_is_strerr(is->i2h_cmd.args[1]));
  475. if (is->i2h_cmd.args[1] & IS_ERROR_TIME_OUT_FLAG)
  476. pr_err("IS_ERROR_TIME_OUT\n");
  477. switch (is->i2h_cmd.args[1]) {
  478. case IS_ERROR_SET_PARAMETER:
  479. fimc_is_mem_barrier();
  480. }
  481. switch (is->i2h_cmd.args[0]) {
  482. case HIC_SET_PARAMETER:
  483. is->config[is->config_index].p_region_index[0] = 0;
  484. is->config[is->config_index].p_region_index[1] = 0;
  485. set_bit(IS_ST_BLOCK_CMD_CLEARED, &is->state);
  486. break;
  487. }
  488. break;
  489. case IHC_NOT_READY:
  490. pr_err("IS control sequence error: Not Ready\n");
  491. break;
  492. }
  493. wake_up(&is->irq_queue);
  494. }
  495. static irqreturn_t fimc_is_irq_handler(int irq, void *priv)
  496. {
  497. struct fimc_is *is = priv;
  498. unsigned long flags;
  499. u32 status;
  500. spin_lock_irqsave(&is->slock, flags);
  501. status = mcuctl_read(is, MCUCTL_REG_INTSR1);
  502. if (status & (1UL << FIMC_IS_INT_GENERAL))
  503. fimc_is_general_irq_handler(is);
  504. if (status & (1UL << FIMC_IS_INT_FRAME_DONE_ISP))
  505. fimc_isp_irq_handler(is);
  506. spin_unlock_irqrestore(&is->slock, flags);
  507. return IRQ_HANDLED;
  508. }
  509. static int fimc_is_hw_open_sensor(struct fimc_is *is,
  510. struct fimc_is_sensor *sensor)
  511. {
  512. struct sensor_open_extended *soe = (void *)&is->is_p_region->shared;
  513. fimc_is_hw_wait_intmsr0_intmsd0(is);
  514. soe->self_calibration_mode = 1;
  515. soe->actuator_type = 0;
  516. soe->mipi_lane_num = 0;
  517. soe->mclk = 0;
  518. soe->mipi_speed = 0;
  519. soe->fast_open_sensor = 0;
  520. soe->i2c_sclk = 88000000;
  521. fimc_is_mem_barrier();
  522. mcuctl_write(HIC_OPEN_SENSOR, is, MCUCTL_REG_ISSR(0));
  523. mcuctl_write(is->sensor_index, is, MCUCTL_REG_ISSR(1));
  524. mcuctl_write(sensor->drvdata->id, is, MCUCTL_REG_ISSR(2));
  525. mcuctl_write(sensor->i2c_bus, is, MCUCTL_REG_ISSR(3));
  526. mcuctl_write(is->is_dma_p_region, is, MCUCTL_REG_ISSR(4));
  527. fimc_is_hw_set_intgr0_gd0(is);
  528. return fimc_is_wait_event(is, IS_ST_OPEN_SENSOR, 1,
  529. FIMC_IS_SENSOR_OPEN_TIMEOUT);
  530. }
  531. int fimc_is_hw_initialize(struct fimc_is *is)
  532. {
  533. const int config_ids[] = {
  534. IS_SC_PREVIEW_STILL, IS_SC_PREVIEW_VIDEO,
  535. IS_SC_CAPTURE_STILL, IS_SC_CAPTURE_VIDEO
  536. };
  537. struct device *dev = &is->pdev->dev;
  538. u32 prev_id;
  539. int i, ret;
  540. /* Sensor initialization. */
  541. ret = fimc_is_hw_open_sensor(is, is->sensor);
  542. if (ret < 0)
  543. return ret;
  544. /* Get the setfile address. */
  545. fimc_is_hw_get_setfile_addr(is);
  546. ret = fimc_is_wait_event(is, IS_ST_SETFILE_LOADED, 1,
  547. FIMC_IS_CONFIG_TIMEOUT);
  548. if (ret < 0) {
  549. dev_err(dev, "get setfile address timed out\n");
  550. return ret;
  551. }
  552. pr_debug("setfile.base: %#x\n", is->setfile.base);
  553. /* Load the setfile. */
  554. fimc_is_load_setfile(is, FIMC_IS_SETFILE_6A3);
  555. clear_bit(IS_ST_SETFILE_LOADED, &is->state);
  556. fimc_is_hw_load_setfile(is);
  557. ret = fimc_is_wait_event(is, IS_ST_SETFILE_LOADED, 1,
  558. FIMC_IS_CONFIG_TIMEOUT);
  559. if (ret < 0) {
  560. dev_err(dev, "loading setfile timed out\n");
  561. return ret;
  562. }
  563. pr_debug("setfile: base: %#x, size: %d\n",
  564. is->setfile.base, is->setfile.size);
  565. pr_info("FIMC-IS Setfile info: %s\n", is->fw.setfile_info);
  566. /* Check magic number. */
  567. if (is->is_p_region->shared[MAX_SHARED_COUNT - 1] !=
  568. FIMC_IS_MAGIC_NUMBER) {
  569. dev_err(dev, "magic number error!\n");
  570. return -EIO;
  571. }
  572. pr_debug("shared region: %#x, parameter region: %#x\n",
  573. is->memory.paddr + FIMC_IS_SHARED_REGION_OFFSET,
  574. is->is_dma_p_region);
  575. is->setfile.sub_index = 0;
  576. /* Stream off. */
  577. fimc_is_hw_stream_off(is);
  578. ret = fimc_is_wait_event(is, IS_ST_STREAM_OFF, 1,
  579. FIMC_IS_CONFIG_TIMEOUT);
  580. if (ret < 0) {
  581. dev_err(dev, "stream off timeout\n");
  582. return ret;
  583. }
  584. /* Preserve previous mode. */
  585. prev_id = is->config_index;
  586. /* Set initial parameter values. */
  587. for (i = 0; i < ARRAY_SIZE(config_ids); i++) {
  588. is->config_index = config_ids[i];
  589. fimc_is_set_initial_params(is);
  590. ret = fimc_is_itf_s_param(is, true);
  591. if (ret < 0) {
  592. is->config_index = prev_id;
  593. return ret;
  594. }
  595. }
  596. is->config_index = prev_id;
  597. set_bit(IS_ST_INIT_DONE, &is->state);
  598. dev_info(dev, "initialization sequence completed (%d)\n",
  599. is->config_index);
  600. return 0;
  601. }
  602. static int fimc_is_log_show(struct seq_file *s, void *data)
  603. {
  604. struct fimc_is *is = s->private;
  605. const u8 *buf = is->memory.vaddr + FIMC_IS_DEBUG_REGION_OFFSET;
  606. if (is->memory.vaddr == NULL) {
  607. dev_err(&is->pdev->dev, "firmware memory is not initialized\n");
  608. return -EIO;
  609. }
  610. seq_printf(s, "%s\n", buf);
  611. return 0;
  612. }
  613. static int fimc_is_debugfs_open(struct inode *inode, struct file *file)
  614. {
  615. return single_open(file, fimc_is_log_show, inode->i_private);
  616. }
  617. static const struct file_operations fimc_is_debugfs_fops = {
  618. .open = fimc_is_debugfs_open,
  619. .read = seq_read,
  620. .llseek = seq_lseek,
  621. .release = single_release,
  622. };
  623. static void fimc_is_debugfs_remove(struct fimc_is *is)
  624. {
  625. debugfs_remove_recursive(is->debugfs_entry);
  626. is->debugfs_entry = NULL;
  627. }
  628. static int fimc_is_debugfs_create(struct fimc_is *is)
  629. {
  630. struct dentry *dentry;
  631. is->debugfs_entry = debugfs_create_dir("fimc_is", NULL);
  632. dentry = debugfs_create_file("fw_log", S_IRUGO, is->debugfs_entry,
  633. is, &fimc_is_debugfs_fops);
  634. if (!dentry)
  635. fimc_is_debugfs_remove(is);
  636. return is->debugfs_entry == NULL ? -EIO : 0;
  637. }
  638. static int fimc_is_probe(struct platform_device *pdev)
  639. {
  640. struct device *dev = &pdev->dev;
  641. struct fimc_is *is;
  642. struct resource res;
  643. struct device_node *node;
  644. int ret;
  645. is = devm_kzalloc(&pdev->dev, sizeof(*is), GFP_KERNEL);
  646. if (!is)
  647. return -ENOMEM;
  648. is->pdev = pdev;
  649. is->isp.pdev = pdev;
  650. init_waitqueue_head(&is->irq_queue);
  651. spin_lock_init(&is->slock);
  652. mutex_init(&is->lock);
  653. ret = of_address_to_resource(dev->of_node, 0, &res);
  654. if (ret < 0)
  655. return ret;
  656. is->regs = devm_ioremap_resource(dev, &res);
  657. if (IS_ERR(is->regs))
  658. return PTR_ERR(is->regs);
  659. node = of_get_child_by_name(dev->of_node, "pmu");
  660. if (!node)
  661. return -ENODEV;
  662. is->pmu_regs = of_iomap(node, 0);
  663. if (!is->pmu_regs)
  664. return -ENOMEM;
  665. is->irq = irq_of_parse_and_map(dev->of_node, 0);
  666. if (is->irq < 0) {
  667. dev_err(dev, "no irq found\n");
  668. return is->irq;
  669. }
  670. ret = fimc_is_get_clocks(is);
  671. if (ret < 0)
  672. return ret;
  673. platform_set_drvdata(pdev, is);
  674. ret = request_irq(is->irq, fimc_is_irq_handler, 0, dev_name(dev), is);
  675. if (ret < 0) {
  676. dev_err(dev, "irq request failed\n");
  677. goto err_clk;
  678. }
  679. pm_runtime_enable(dev);
  680. ret = pm_runtime_get_sync(dev);
  681. if (ret < 0)
  682. goto err_irq;
  683. is->alloc_ctx = vb2_dma_contig_init_ctx(dev);
  684. if (IS_ERR(is->alloc_ctx)) {
  685. ret = PTR_ERR(is->alloc_ctx);
  686. goto err_irq;
  687. }
  688. /*
  689. * Register FIMC-IS V4L2 subdevs to this driver. The video nodes
  690. * will be created within the subdev's registered() callback.
  691. */
  692. ret = fimc_is_register_subdevs(is);
  693. if (ret < 0)
  694. goto err_vb;
  695. ret = fimc_is_debugfs_create(is);
  696. if (ret < 0)
  697. goto err_sd;
  698. ret = fimc_is_request_firmware(is, FIMC_IS_FW_FILENAME);
  699. if (ret < 0)
  700. goto err_dfs;
  701. pm_runtime_put_sync(dev);
  702. dev_dbg(dev, "FIMC-IS registered successfully\n");
  703. return 0;
  704. err_dfs:
  705. fimc_is_debugfs_remove(is);
  706. err_vb:
  707. vb2_dma_contig_cleanup_ctx(is->alloc_ctx);
  708. err_sd:
  709. fimc_is_unregister_subdevs(is);
  710. err_irq:
  711. free_irq(is->irq, is);
  712. err_clk:
  713. fimc_is_put_clocks(is);
  714. return ret;
  715. }
  716. static int fimc_is_runtime_resume(struct device *dev)
  717. {
  718. struct fimc_is *is = dev_get_drvdata(dev);
  719. int ret;
  720. ret = fimc_is_setup_clocks(is);
  721. if (ret)
  722. return ret;
  723. return fimc_is_enable_clocks(is);
  724. }
  725. static int fimc_is_runtime_suspend(struct device *dev)
  726. {
  727. struct fimc_is *is = dev_get_drvdata(dev);
  728. fimc_is_disable_clocks(is);
  729. return 0;
  730. }
  731. #ifdef CONFIG_PM_SLEEP
  732. static int fimc_is_resume(struct device *dev)
  733. {
  734. /* TODO: */
  735. return 0;
  736. }
  737. static int fimc_is_suspend(struct device *dev)
  738. {
  739. struct fimc_is *is = dev_get_drvdata(dev);
  740. /* TODO: */
  741. if (test_bit(IS_ST_A5_PWR_ON, &is->state))
  742. return -EBUSY;
  743. return 0;
  744. }
  745. #endif /* CONFIG_PM_SLEEP */
  746. static int fimc_is_remove(struct platform_device *pdev)
  747. {
  748. struct fimc_is *is = platform_get_drvdata(pdev);
  749. pm_runtime_disable(&pdev->dev);
  750. pm_runtime_set_suspended(&pdev->dev);
  751. free_irq(is->irq, is);
  752. fimc_is_unregister_subdevs(is);
  753. vb2_dma_contig_cleanup_ctx(is->alloc_ctx);
  754. fimc_is_put_clocks(is);
  755. fimc_is_debugfs_remove(is);
  756. if (is->fw.f_w)
  757. release_firmware(is->fw.f_w);
  758. fimc_is_free_cpu_memory(is);
  759. return 0;
  760. }
  761. static const struct of_device_id fimc_is_of_match[] = {
  762. { .compatible = "samsung,exynos4212-fimc-is" },
  763. { /* sentinel */ },
  764. };
  765. MODULE_DEVICE_TABLE(of, fimc_is_of_match);
  766. static const struct dev_pm_ops fimc_is_pm_ops = {
  767. SET_SYSTEM_SLEEP_PM_OPS(fimc_is_suspend, fimc_is_resume)
  768. SET_RUNTIME_PM_OPS(fimc_is_runtime_suspend, fimc_is_runtime_resume,
  769. NULL)
  770. };
  771. static struct platform_driver fimc_is_driver = {
  772. .probe = fimc_is_probe,
  773. .remove = fimc_is_remove,
  774. .driver = {
  775. .of_match_table = fimc_is_of_match,
  776. .name = FIMC_IS_DRV_NAME,
  777. .owner = THIS_MODULE,
  778. .pm = &fimc_is_pm_ops,
  779. }
  780. };
  781. static int fimc_is_module_init(void)
  782. {
  783. int ret;
  784. ret = fimc_is_register_sensor_driver();
  785. if (ret < 0)
  786. return ret;
  787. ret = fimc_is_register_i2c_driver();
  788. if (ret < 0)
  789. goto err_sens;
  790. ret = platform_driver_register(&fimc_is_driver);
  791. if (!ret)
  792. return ret;
  793. fimc_is_unregister_i2c_driver();
  794. err_sens:
  795. fimc_is_unregister_sensor_driver();
  796. return ret;
  797. }
  798. static void fimc_is_module_exit(void)
  799. {
  800. fimc_is_unregister_sensor_driver();
  801. fimc_is_unregister_i2c_driver();
  802. platform_driver_unregister(&fimc_is_driver);
  803. }
  804. module_init(fimc_is_module_init);
  805. module_exit(fimc_is_module_exit);
  806. MODULE_ALIAS("platform:" FIMC_IS_DRV_NAME);
  807. MODULE_AUTHOR("Younghwan Joo <yhwan.joo@samsung.com>");
  808. MODULE_AUTHOR("Sylwester Nawrocki <s.nawrocki@samsung.com>");