fimc-is.c 23 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010
  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/i2c.h>
  24. #include <linux/of_irq.h>
  25. #include <linux/of_address.h>
  26. #include <linux/of_graph.h>
  27. #include <linux/of_platform.h>
  28. #include <linux/platform_device.h>
  29. #include <linux/pm_runtime.h>
  30. #include <linux/slab.h>
  31. #include <linux/types.h>
  32. #include <linux/videodev2.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_GICISP] = "gicisp",
  52. [ISS_CLK_PWM_ISP] = "pwm_isp",
  53. [ISS_CLK_MCUCTL_ISP] = "mcuctl_isp",
  54. [ISS_CLK_UART] = "uart",
  55. [ISS_CLK_ISP_DIV0] = "ispdiv0",
  56. [ISS_CLK_ISP_DIV1] = "ispdiv1",
  57. [ISS_CLK_MCUISP_DIV0] = "mcuispdiv0",
  58. [ISS_CLK_MCUISP_DIV1] = "mcuispdiv1",
  59. [ISS_CLK_ACLK200] = "aclk200",
  60. [ISS_CLK_ACLK200_DIV] = "div_aclk200",
  61. [ISS_CLK_ACLK400MCUISP] = "aclk400mcuisp",
  62. [ISS_CLK_ACLK400MCUISP_DIV] = "div_aclk400mcuisp",
  63. };
  64. static void fimc_is_put_clocks(struct fimc_is *is)
  65. {
  66. int i;
  67. for (i = 0; i < ISS_CLKS_MAX; i++) {
  68. if (IS_ERR(is->clocks[i]))
  69. continue;
  70. clk_put(is->clocks[i]);
  71. is->clocks[i] = ERR_PTR(-EINVAL);
  72. }
  73. }
  74. static int fimc_is_get_clocks(struct fimc_is *is)
  75. {
  76. int i, ret;
  77. for (i = 0; i < ISS_CLKS_MAX; i++)
  78. is->clocks[i] = ERR_PTR(-EINVAL);
  79. for (i = 0; i < ISS_CLKS_MAX; i++) {
  80. is->clocks[i] = clk_get(&is->pdev->dev, fimc_is_clocks[i]);
  81. if (IS_ERR(is->clocks[i])) {
  82. ret = PTR_ERR(is->clocks[i]);
  83. goto err;
  84. }
  85. }
  86. return 0;
  87. err:
  88. fimc_is_put_clocks(is);
  89. dev_err(&is->pdev->dev, "failed to get clock: %s\n",
  90. fimc_is_clocks[i]);
  91. return ret;
  92. }
  93. static int fimc_is_setup_clocks(struct fimc_is *is)
  94. {
  95. int ret;
  96. ret = clk_set_parent(is->clocks[ISS_CLK_ACLK200],
  97. is->clocks[ISS_CLK_ACLK200_DIV]);
  98. if (ret < 0)
  99. return ret;
  100. ret = clk_set_parent(is->clocks[ISS_CLK_ACLK400MCUISP],
  101. is->clocks[ISS_CLK_ACLK400MCUISP_DIV]);
  102. if (ret < 0)
  103. return ret;
  104. ret = clk_set_rate(is->clocks[ISS_CLK_ISP_DIV0], ACLK_AXI_FREQUENCY);
  105. if (ret < 0)
  106. return ret;
  107. ret = clk_set_rate(is->clocks[ISS_CLK_ISP_DIV1], ACLK_AXI_FREQUENCY);
  108. if (ret < 0)
  109. return ret;
  110. ret = clk_set_rate(is->clocks[ISS_CLK_MCUISP_DIV0],
  111. ATCLK_MCUISP_FREQUENCY);
  112. if (ret < 0)
  113. return ret;
  114. return clk_set_rate(is->clocks[ISS_CLK_MCUISP_DIV1],
  115. ATCLK_MCUISP_FREQUENCY);
  116. }
  117. static int fimc_is_enable_clocks(struct fimc_is *is)
  118. {
  119. int i, ret;
  120. for (i = 0; i < ISS_GATE_CLKS_MAX; i++) {
  121. if (IS_ERR(is->clocks[i]))
  122. continue;
  123. ret = clk_prepare_enable(is->clocks[i]);
  124. if (ret < 0) {
  125. dev_err(&is->pdev->dev, "clock %s enable failed\n",
  126. fimc_is_clocks[i]);
  127. for (--i; i >= 0; i--)
  128. clk_disable(is->clocks[i]);
  129. return ret;
  130. }
  131. pr_debug("enabled clock: %s\n", fimc_is_clocks[i]);
  132. }
  133. return 0;
  134. }
  135. static void fimc_is_disable_clocks(struct fimc_is *is)
  136. {
  137. int i;
  138. for (i = 0; i < ISS_GATE_CLKS_MAX; i++) {
  139. if (!IS_ERR(is->clocks[i])) {
  140. clk_disable_unprepare(is->clocks[i]);
  141. pr_debug("disabled clock: %s\n", fimc_is_clocks[i]);
  142. }
  143. }
  144. }
  145. static int fimc_is_parse_sensor_config(struct fimc_is *is, unsigned int index,
  146. struct device_node *node)
  147. {
  148. struct fimc_is_sensor *sensor = &is->sensor[index];
  149. struct device_node *ep, *port;
  150. u32 tmp = 0;
  151. int ret;
  152. sensor->drvdata = fimc_is_sensor_get_drvdata(node);
  153. if (!sensor->drvdata) {
  154. dev_err(&is->pdev->dev, "no driver data found for: %pOF\n",
  155. node);
  156. return -EINVAL;
  157. }
  158. ep = of_graph_get_next_endpoint(node, NULL);
  159. if (!ep)
  160. return -ENXIO;
  161. port = of_graph_get_remote_port(ep);
  162. of_node_put(ep);
  163. if (!port)
  164. return -ENXIO;
  165. /* Use MIPI-CSIS channel id to determine the ISP I2C bus index. */
  166. ret = of_property_read_u32(port, "reg", &tmp);
  167. if (ret < 0) {
  168. dev_err(&is->pdev->dev, "reg property not found at: %pOF\n",
  169. port);
  170. of_node_put(port);
  171. return ret;
  172. }
  173. of_node_put(port);
  174. sensor->i2c_bus = tmp - FIMC_INPUT_MIPI_CSI2_0;
  175. return 0;
  176. }
  177. static int fimc_is_register_subdevs(struct fimc_is *is)
  178. {
  179. struct device_node *i2c_bus, *child;
  180. int ret, index = 0;
  181. ret = fimc_isp_subdev_create(&is->isp);
  182. if (ret < 0)
  183. return ret;
  184. for_each_compatible_node(i2c_bus, NULL, FIMC_IS_I2C_COMPATIBLE) {
  185. for_each_available_child_of_node(i2c_bus, child) {
  186. ret = fimc_is_parse_sensor_config(is, index, child);
  187. if (ret < 0 || index >= FIMC_IS_SENSORS_NUM) {
  188. of_node_put(child);
  189. return ret;
  190. }
  191. index++;
  192. }
  193. }
  194. return 0;
  195. }
  196. static int fimc_is_unregister_subdevs(struct fimc_is *is)
  197. {
  198. fimc_isp_subdev_destroy(&is->isp);
  199. return 0;
  200. }
  201. static int fimc_is_load_setfile(struct fimc_is *is, char *file_name)
  202. {
  203. const struct firmware *fw;
  204. void *buf;
  205. int ret;
  206. ret = request_firmware(&fw, file_name, &is->pdev->dev);
  207. if (ret < 0) {
  208. dev_err(&is->pdev->dev, "firmware request failed (%d)\n", ret);
  209. return ret;
  210. }
  211. buf = is->memory.vaddr + is->setfile.base;
  212. memcpy(buf, fw->data, fw->size);
  213. fimc_is_mem_barrier();
  214. is->setfile.size = fw->size;
  215. pr_debug("mem vaddr: %p, setfile buf: %p\n", is->memory.vaddr, buf);
  216. memcpy(is->fw.setfile_info,
  217. fw->data + fw->size - FIMC_IS_SETFILE_INFO_LEN,
  218. FIMC_IS_SETFILE_INFO_LEN - 1);
  219. is->fw.setfile_info[FIMC_IS_SETFILE_INFO_LEN - 1] = '\0';
  220. is->setfile.state = 1;
  221. pr_debug("FIMC-IS setfile loaded: base: %#x, size: %zu B\n",
  222. is->setfile.base, fw->size);
  223. release_firmware(fw);
  224. return ret;
  225. }
  226. int fimc_is_cpu_set_power(struct fimc_is *is, int on)
  227. {
  228. unsigned int timeout = FIMC_IS_POWER_ON_TIMEOUT;
  229. if (on) {
  230. /* Disable watchdog */
  231. mcuctl_write(0, is, REG_WDT_ISP);
  232. /* Cortex-A5 start address setting */
  233. mcuctl_write(is->memory.paddr, is, MCUCTL_REG_BBOAR);
  234. /* Enable and start Cortex-A5 */
  235. pmuisp_write(0x18000, is, REG_PMU_ISP_ARM_OPTION);
  236. pmuisp_write(0x1, is, REG_PMU_ISP_ARM_CONFIGURATION);
  237. } else {
  238. /* A5 power off */
  239. pmuisp_write(0x10000, is, REG_PMU_ISP_ARM_OPTION);
  240. pmuisp_write(0x0, is, REG_PMU_ISP_ARM_CONFIGURATION);
  241. while (pmuisp_read(is, REG_PMU_ISP_ARM_STATUS) & 1) {
  242. if (timeout == 0)
  243. return -ETIME;
  244. timeout--;
  245. udelay(1);
  246. }
  247. }
  248. return 0;
  249. }
  250. /* Wait until @bit of @is->state is set to @state in the interrupt handler. */
  251. int fimc_is_wait_event(struct fimc_is *is, unsigned long bit,
  252. unsigned int state, unsigned int timeout)
  253. {
  254. int ret = wait_event_timeout(is->irq_queue,
  255. !state ^ test_bit(bit, &is->state),
  256. timeout);
  257. if (ret == 0) {
  258. dev_WARN(&is->pdev->dev, "%s() timed out\n", __func__);
  259. return -ETIME;
  260. }
  261. return 0;
  262. }
  263. int fimc_is_start_firmware(struct fimc_is *is)
  264. {
  265. struct device *dev = &is->pdev->dev;
  266. int ret;
  267. if (is->fw.f_w == NULL) {
  268. dev_err(dev, "firmware is not loaded\n");
  269. return -EINVAL;
  270. }
  271. memcpy(is->memory.vaddr, is->fw.f_w->data, is->fw.f_w->size);
  272. wmb();
  273. ret = fimc_is_cpu_set_power(is, 1);
  274. if (ret < 0)
  275. return ret;
  276. ret = fimc_is_wait_event(is, IS_ST_A5_PWR_ON, 1,
  277. msecs_to_jiffies(FIMC_IS_FW_LOAD_TIMEOUT));
  278. if (ret < 0)
  279. dev_err(dev, "FIMC-IS CPU power on failed\n");
  280. return ret;
  281. }
  282. /* Allocate working memory for the FIMC-IS CPU. */
  283. static int fimc_is_alloc_cpu_memory(struct fimc_is *is)
  284. {
  285. struct device *dev = &is->pdev->dev;
  286. is->memory.vaddr = dma_alloc_coherent(dev, FIMC_IS_CPU_MEM_SIZE,
  287. &is->memory.paddr, GFP_KERNEL);
  288. if (is->memory.vaddr == NULL)
  289. return -ENOMEM;
  290. is->memory.size = FIMC_IS_CPU_MEM_SIZE;
  291. memset(is->memory.vaddr, 0, is->memory.size);
  292. dev_info(dev, "FIMC-IS CPU memory base: %#x\n", (u32)is->memory.paddr);
  293. if (((u32)is->memory.paddr) & FIMC_IS_FW_ADDR_MASK) {
  294. dev_err(dev, "invalid firmware memory alignment: %#x\n",
  295. (u32)is->memory.paddr);
  296. dma_free_coherent(dev, is->memory.size, is->memory.vaddr,
  297. is->memory.paddr);
  298. return -EIO;
  299. }
  300. is->is_p_region = (struct is_region *)(is->memory.vaddr +
  301. FIMC_IS_CPU_MEM_SIZE - FIMC_IS_REGION_SIZE);
  302. is->is_dma_p_region = is->memory.paddr +
  303. FIMC_IS_CPU_MEM_SIZE - FIMC_IS_REGION_SIZE;
  304. is->is_shared_region = (struct is_share_region *)(is->memory.vaddr +
  305. FIMC_IS_SHARED_REGION_OFFSET);
  306. return 0;
  307. }
  308. static void fimc_is_free_cpu_memory(struct fimc_is *is)
  309. {
  310. struct device *dev = &is->pdev->dev;
  311. if (is->memory.vaddr == NULL)
  312. return;
  313. dma_free_coherent(dev, is->memory.size, is->memory.vaddr,
  314. is->memory.paddr);
  315. }
  316. static void fimc_is_load_firmware(const struct firmware *fw, void *context)
  317. {
  318. struct fimc_is *is = context;
  319. struct device *dev = &is->pdev->dev;
  320. void *buf;
  321. int ret;
  322. if (fw == NULL) {
  323. dev_err(dev, "firmware request failed\n");
  324. return;
  325. }
  326. mutex_lock(&is->lock);
  327. if (fw->size < FIMC_IS_FW_SIZE_MIN || fw->size > FIMC_IS_FW_SIZE_MAX) {
  328. dev_err(dev, "wrong firmware size: %zu\n", fw->size);
  329. goto done;
  330. }
  331. is->fw.size = fw->size;
  332. ret = fimc_is_alloc_cpu_memory(is);
  333. if (ret < 0) {
  334. dev_err(dev, "failed to allocate FIMC-IS CPU memory\n");
  335. goto done;
  336. }
  337. memcpy(is->memory.vaddr, fw->data, fw->size);
  338. wmb();
  339. /* Read firmware description. */
  340. buf = (void *)(is->memory.vaddr + fw->size - FIMC_IS_FW_DESC_LEN);
  341. memcpy(&is->fw.info, buf, FIMC_IS_FW_INFO_LEN);
  342. is->fw.info[FIMC_IS_FW_INFO_LEN] = 0;
  343. buf = (void *)(is->memory.vaddr + fw->size - FIMC_IS_FW_VER_LEN);
  344. memcpy(&is->fw.version, buf, FIMC_IS_FW_VER_LEN);
  345. is->fw.version[FIMC_IS_FW_VER_LEN - 1] = 0;
  346. is->fw.state = 1;
  347. dev_info(dev, "loaded firmware: %s, rev. %s\n",
  348. is->fw.info, is->fw.version);
  349. dev_dbg(dev, "FW size: %zu, paddr: %pad\n", fw->size, &is->memory.paddr);
  350. is->is_shared_region->chip_id = 0xe4412;
  351. is->is_shared_region->chip_rev_no = 1;
  352. fimc_is_mem_barrier();
  353. /*
  354. * FIXME: The firmware is not being released for now, as it is
  355. * needed around for copying to the IS working memory every
  356. * time before the Cortex-A5 is restarted.
  357. */
  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. /*
  523. * Some user space use cases hang up here without this
  524. * empirically chosen delay.
  525. */
  526. udelay(100);
  527. mcuctl_write(HIC_OPEN_SENSOR, is, MCUCTL_REG_ISSR(0));
  528. mcuctl_write(is->sensor_index, is, MCUCTL_REG_ISSR(1));
  529. mcuctl_write(sensor->drvdata->id, is, MCUCTL_REG_ISSR(2));
  530. mcuctl_write(sensor->i2c_bus, is, MCUCTL_REG_ISSR(3));
  531. mcuctl_write(is->is_dma_p_region, is, MCUCTL_REG_ISSR(4));
  532. fimc_is_hw_set_intgr0_gd0(is);
  533. return fimc_is_wait_event(is, IS_ST_OPEN_SENSOR, 1,
  534. sensor->drvdata->open_timeout);
  535. }
  536. int fimc_is_hw_initialize(struct fimc_is *is)
  537. {
  538. const int config_ids[] = {
  539. IS_SC_PREVIEW_STILL, IS_SC_PREVIEW_VIDEO,
  540. IS_SC_CAPTURE_STILL, IS_SC_CAPTURE_VIDEO
  541. };
  542. struct device *dev = &is->pdev->dev;
  543. u32 prev_id;
  544. int i, ret;
  545. /* Sensor initialization. Only one sensor is currently supported. */
  546. ret = fimc_is_hw_open_sensor(is, &is->sensor[0]);
  547. if (ret < 0)
  548. return ret;
  549. /* Get the setfile address. */
  550. fimc_is_hw_get_setfile_addr(is);
  551. ret = fimc_is_wait_event(is, IS_ST_SETFILE_LOADED, 1,
  552. FIMC_IS_CONFIG_TIMEOUT);
  553. if (ret < 0) {
  554. dev_err(dev, "get setfile address timed out\n");
  555. return ret;
  556. }
  557. pr_debug("setfile.base: %#x\n", is->setfile.base);
  558. /* Load the setfile. */
  559. fimc_is_load_setfile(is, FIMC_IS_SETFILE_6A3);
  560. clear_bit(IS_ST_SETFILE_LOADED, &is->state);
  561. fimc_is_hw_load_setfile(is);
  562. ret = fimc_is_wait_event(is, IS_ST_SETFILE_LOADED, 1,
  563. FIMC_IS_CONFIG_TIMEOUT);
  564. if (ret < 0) {
  565. dev_err(dev, "loading setfile timed out\n");
  566. return ret;
  567. }
  568. pr_debug("setfile: base: %#x, size: %d\n",
  569. is->setfile.base, is->setfile.size);
  570. pr_info("FIMC-IS Setfile info: %s\n", is->fw.setfile_info);
  571. /* Check magic number. */
  572. if (is->is_p_region->shared[MAX_SHARED_COUNT - 1] !=
  573. FIMC_IS_MAGIC_NUMBER) {
  574. dev_err(dev, "magic number error!\n");
  575. return -EIO;
  576. }
  577. pr_debug("shared region: %pad, parameter region: %pad\n",
  578. &is->memory.paddr + FIMC_IS_SHARED_REGION_OFFSET,
  579. &is->is_dma_p_region);
  580. is->setfile.sub_index = 0;
  581. /* Stream off. */
  582. fimc_is_hw_stream_off(is);
  583. ret = fimc_is_wait_event(is, IS_ST_STREAM_OFF, 1,
  584. FIMC_IS_CONFIG_TIMEOUT);
  585. if (ret < 0) {
  586. dev_err(dev, "stream off timeout\n");
  587. return ret;
  588. }
  589. /* Preserve previous mode. */
  590. prev_id = is->config_index;
  591. /* Set initial parameter values. */
  592. for (i = 0; i < ARRAY_SIZE(config_ids); i++) {
  593. is->config_index = config_ids[i];
  594. fimc_is_set_initial_params(is);
  595. ret = fimc_is_itf_s_param(is, true);
  596. if (ret < 0) {
  597. is->config_index = prev_id;
  598. return ret;
  599. }
  600. }
  601. is->config_index = prev_id;
  602. set_bit(IS_ST_INIT_DONE, &is->state);
  603. dev_info(dev, "initialization sequence completed (%d)\n",
  604. is->config_index);
  605. return 0;
  606. }
  607. static int fimc_is_log_show(struct seq_file *s, void *data)
  608. {
  609. struct fimc_is *is = s->private;
  610. const u8 *buf = is->memory.vaddr + FIMC_IS_DEBUG_REGION_OFFSET;
  611. if (is->memory.vaddr == NULL) {
  612. dev_err(&is->pdev->dev, "firmware memory is not initialized\n");
  613. return -EIO;
  614. }
  615. seq_printf(s, "%s\n", buf);
  616. return 0;
  617. }
  618. static int fimc_is_debugfs_open(struct inode *inode, struct file *file)
  619. {
  620. return single_open(file, fimc_is_log_show, inode->i_private);
  621. }
  622. static const struct file_operations fimc_is_debugfs_fops = {
  623. .open = fimc_is_debugfs_open,
  624. .read = seq_read,
  625. .llseek = seq_lseek,
  626. .release = single_release,
  627. };
  628. static void fimc_is_debugfs_remove(struct fimc_is *is)
  629. {
  630. debugfs_remove_recursive(is->debugfs_entry);
  631. is->debugfs_entry = NULL;
  632. }
  633. static int fimc_is_debugfs_create(struct fimc_is *is)
  634. {
  635. struct dentry *dentry;
  636. is->debugfs_entry = debugfs_create_dir("fimc_is", NULL);
  637. dentry = debugfs_create_file("fw_log", S_IRUGO, is->debugfs_entry,
  638. is, &fimc_is_debugfs_fops);
  639. if (!dentry)
  640. fimc_is_debugfs_remove(is);
  641. return is->debugfs_entry == NULL ? -EIO : 0;
  642. }
  643. static int fimc_is_runtime_resume(struct device *dev);
  644. static int fimc_is_runtime_suspend(struct device *dev);
  645. static int fimc_is_probe(struct platform_device *pdev)
  646. {
  647. struct device *dev = &pdev->dev;
  648. struct fimc_is *is;
  649. struct resource res;
  650. struct device_node *node;
  651. int ret;
  652. is = devm_kzalloc(&pdev->dev, sizeof(*is), GFP_KERNEL);
  653. if (!is)
  654. return -ENOMEM;
  655. is->pdev = pdev;
  656. is->isp.pdev = pdev;
  657. init_waitqueue_head(&is->irq_queue);
  658. spin_lock_init(&is->slock);
  659. mutex_init(&is->lock);
  660. ret = of_address_to_resource(dev->of_node, 0, &res);
  661. if (ret < 0)
  662. return ret;
  663. is->regs = devm_ioremap_resource(dev, &res);
  664. if (IS_ERR(is->regs))
  665. return PTR_ERR(is->regs);
  666. node = of_get_child_by_name(dev->of_node, "pmu");
  667. if (!node)
  668. return -ENODEV;
  669. is->pmu_regs = of_iomap(node, 0);
  670. of_node_put(node);
  671. if (!is->pmu_regs)
  672. return -ENOMEM;
  673. is->irq = irq_of_parse_and_map(dev->of_node, 0);
  674. if (!is->irq) {
  675. dev_err(dev, "no irq found\n");
  676. ret = -EINVAL;
  677. goto err_iounmap;
  678. }
  679. ret = fimc_is_get_clocks(is);
  680. if (ret < 0)
  681. goto err_iounmap;
  682. platform_set_drvdata(pdev, is);
  683. ret = request_irq(is->irq, fimc_is_irq_handler, 0, dev_name(dev), is);
  684. if (ret < 0) {
  685. dev_err(dev, "irq request failed\n");
  686. goto err_clk;
  687. }
  688. pm_runtime_enable(dev);
  689. if (!pm_runtime_enabled(dev)) {
  690. ret = fimc_is_runtime_resume(dev);
  691. if (ret < 0)
  692. goto err_irq;
  693. }
  694. ret = pm_runtime_get_sync(dev);
  695. if (ret < 0)
  696. goto err_pm;
  697. vb2_dma_contig_set_max_seg_size(dev, DMA_BIT_MASK(32));
  698. ret = devm_of_platform_populate(dev);
  699. if (ret < 0)
  700. goto err_pm;
  701. /*
  702. * Register FIMC-IS V4L2 subdevs to this driver. The video nodes
  703. * will be created within the subdev's registered() callback.
  704. */
  705. ret = fimc_is_register_subdevs(is);
  706. if (ret < 0)
  707. goto err_pm;
  708. ret = fimc_is_debugfs_create(is);
  709. if (ret < 0)
  710. goto err_sd;
  711. ret = fimc_is_request_firmware(is, FIMC_IS_FW_FILENAME);
  712. if (ret < 0)
  713. goto err_dfs;
  714. pm_runtime_put_sync(dev);
  715. dev_dbg(dev, "FIMC-IS registered successfully\n");
  716. return 0;
  717. err_dfs:
  718. fimc_is_debugfs_remove(is);
  719. err_sd:
  720. fimc_is_unregister_subdevs(is);
  721. err_pm:
  722. if (!pm_runtime_enabled(dev))
  723. fimc_is_runtime_suspend(dev);
  724. err_irq:
  725. free_irq(is->irq, is);
  726. err_clk:
  727. fimc_is_put_clocks(is);
  728. err_iounmap:
  729. iounmap(is->pmu_regs);
  730. return ret;
  731. }
  732. static int fimc_is_runtime_resume(struct device *dev)
  733. {
  734. struct fimc_is *is = dev_get_drvdata(dev);
  735. int ret;
  736. ret = fimc_is_setup_clocks(is);
  737. if (ret)
  738. return ret;
  739. return fimc_is_enable_clocks(is);
  740. }
  741. static int fimc_is_runtime_suspend(struct device *dev)
  742. {
  743. struct fimc_is *is = dev_get_drvdata(dev);
  744. fimc_is_disable_clocks(is);
  745. return 0;
  746. }
  747. #ifdef CONFIG_PM_SLEEP
  748. static int fimc_is_resume(struct device *dev)
  749. {
  750. /* TODO: */
  751. return 0;
  752. }
  753. static int fimc_is_suspend(struct device *dev)
  754. {
  755. struct fimc_is *is = dev_get_drvdata(dev);
  756. /* TODO: */
  757. if (test_bit(IS_ST_A5_PWR_ON, &is->state))
  758. return -EBUSY;
  759. return 0;
  760. }
  761. #endif /* CONFIG_PM_SLEEP */
  762. static int fimc_is_remove(struct platform_device *pdev)
  763. {
  764. struct device *dev = &pdev->dev;
  765. struct fimc_is *is = dev_get_drvdata(dev);
  766. pm_runtime_disable(dev);
  767. pm_runtime_set_suspended(dev);
  768. if (!pm_runtime_status_suspended(dev))
  769. fimc_is_runtime_suspend(dev);
  770. free_irq(is->irq, is);
  771. fimc_is_unregister_subdevs(is);
  772. vb2_dma_contig_clear_max_seg_size(dev);
  773. fimc_is_put_clocks(is);
  774. iounmap(is->pmu_regs);
  775. fimc_is_debugfs_remove(is);
  776. release_firmware(is->fw.f_w);
  777. fimc_is_free_cpu_memory(is);
  778. return 0;
  779. }
  780. static const struct of_device_id fimc_is_of_match[] = {
  781. { .compatible = "samsung,exynos4212-fimc-is" },
  782. { /* sentinel */ },
  783. };
  784. MODULE_DEVICE_TABLE(of, fimc_is_of_match);
  785. static const struct dev_pm_ops fimc_is_pm_ops = {
  786. SET_SYSTEM_SLEEP_PM_OPS(fimc_is_suspend, fimc_is_resume)
  787. SET_RUNTIME_PM_OPS(fimc_is_runtime_suspend, fimc_is_runtime_resume,
  788. NULL)
  789. };
  790. static struct platform_driver fimc_is_driver = {
  791. .probe = fimc_is_probe,
  792. .remove = fimc_is_remove,
  793. .driver = {
  794. .of_match_table = fimc_is_of_match,
  795. .name = FIMC_IS_DRV_NAME,
  796. .pm = &fimc_is_pm_ops,
  797. }
  798. };
  799. static int fimc_is_module_init(void)
  800. {
  801. int ret;
  802. ret = fimc_is_register_i2c_driver();
  803. if (ret < 0)
  804. return ret;
  805. ret = platform_driver_register(&fimc_is_driver);
  806. if (ret < 0)
  807. fimc_is_unregister_i2c_driver();
  808. return ret;
  809. }
  810. static void fimc_is_module_exit(void)
  811. {
  812. fimc_is_unregister_i2c_driver();
  813. platform_driver_unregister(&fimc_is_driver);
  814. }
  815. module_init(fimc_is_module_init);
  816. module_exit(fimc_is_module_exit);
  817. MODULE_ALIAS("platform:" FIMC_IS_DRV_NAME);
  818. MODULE_AUTHOR("Younghwan Joo <yhwan.joo@samsung.com>");
  819. MODULE_AUTHOR("Sylwester Nawrocki <s.nawrocki@samsung.com>");
  820. MODULE_LICENSE("GPL v2");