fimc-is.c 23 KB

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