mdfld_device.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585
  1. /**************************************************************************
  2. * Copyright (c) 2011, Intel Corporation.
  3. * All Rights Reserved.
  4. *
  5. * This program is free software; you can redistribute it and/or modify it
  6. * under the terms and conditions of the GNU General Public License,
  7. * version 2, as published by the Free Software Foundation.
  8. *
  9. * This program is distributed in the hope it will be useful, but WITHOUT
  10. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  11. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
  12. * more details.
  13. *
  14. * You should have received a copy of the GNU General Public License along with
  15. * this program; if not, write to the Free Software Foundation, Inc.,
  16. * 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA.
  17. *
  18. **************************************************************************/
  19. #include "psb_drv.h"
  20. #include "mid_bios.h"
  21. #include "mdfld_output.h"
  22. #include "mdfld_dsi_output.h"
  23. #include "tc35876x-dsi-lvds.h"
  24. #include <asm/intel_scu_ipc.h>
  25. #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
  26. #define MRST_BLC_MAX_PWM_REG_FREQ 0xFFFF
  27. #define BLC_PWM_PRECISION_FACTOR 100 /* 10000000 */
  28. #define BLC_PWM_FREQ_CALC_CONSTANT 32
  29. #define MHz 1000000
  30. #define BRIGHTNESS_MIN_LEVEL 1
  31. #define BRIGHTNESS_MAX_LEVEL 100
  32. #define BRIGHTNESS_MASK 0xFF
  33. #define BLC_POLARITY_NORMAL 0
  34. #define BLC_POLARITY_INVERSE 1
  35. #define BLC_ADJUSTMENT_MAX 100
  36. #define MDFLD_BLC_PWM_PRECISION_FACTOR 10
  37. #define MDFLD_BLC_MAX_PWM_REG_FREQ 0xFFFE
  38. #define MDFLD_BLC_MIN_PWM_REG_FREQ 0x2
  39. #define MDFLD_BACKLIGHT_PWM_POLARITY_BIT_CLEAR (0xFFFE)
  40. #define MDFLD_BACKLIGHT_PWM_CTL_SHIFT (16)
  41. static struct backlight_device *mdfld_backlight_device;
  42. int mdfld_set_brightness(struct backlight_device *bd)
  43. {
  44. struct drm_device *dev =
  45. (struct drm_device *)bl_get_data(mdfld_backlight_device);
  46. struct drm_psb_private *dev_priv = dev->dev_private;
  47. int level = bd->props.brightness;
  48. DRM_DEBUG_DRIVER("backlight level set to %d\n", level);
  49. /* Perform value bounds checking */
  50. if (level < BRIGHTNESS_MIN_LEVEL)
  51. level = BRIGHTNESS_MIN_LEVEL;
  52. if (gma_power_begin(dev, false)) {
  53. u32 adjusted_level = 0;
  54. /*
  55. * Adjust the backlight level with the percent in
  56. * dev_priv->blc_adj2
  57. */
  58. adjusted_level = level * dev_priv->blc_adj2;
  59. adjusted_level = adjusted_level / BLC_ADJUSTMENT_MAX;
  60. dev_priv->brightness_adjusted = adjusted_level;
  61. if (mdfld_get_panel_type(dev, 0) == TC35876X) {
  62. if (dev_priv->dpi_panel_on[0] ||
  63. dev_priv->dpi_panel_on[2])
  64. tc35876x_brightness_control(dev,
  65. dev_priv->brightness_adjusted);
  66. } else {
  67. if (dev_priv->dpi_panel_on[0])
  68. mdfld_dsi_brightness_control(dev, 0,
  69. dev_priv->brightness_adjusted);
  70. }
  71. if (dev_priv->dpi_panel_on[2])
  72. mdfld_dsi_brightness_control(dev, 2,
  73. dev_priv->brightness_adjusted);
  74. gma_power_end(dev);
  75. }
  76. /* cache the brightness for later use */
  77. dev_priv->brightness = level;
  78. return 0;
  79. }
  80. static int mdfld_get_brightness(struct backlight_device *bd)
  81. {
  82. struct drm_device *dev =
  83. (struct drm_device *)bl_get_data(mdfld_backlight_device);
  84. struct drm_psb_private *dev_priv = dev->dev_private;
  85. DRM_DEBUG_DRIVER("brightness = 0x%x \n", dev_priv->brightness);
  86. /* return locally cached var instead of HW read (due to DPST etc.) */
  87. return dev_priv->brightness;
  88. }
  89. static const struct backlight_ops mdfld_ops = {
  90. .get_brightness = mdfld_get_brightness,
  91. .update_status = mdfld_set_brightness,
  92. };
  93. static int device_backlight_init(struct drm_device *dev)
  94. {
  95. struct drm_psb_private *dev_priv = (struct drm_psb_private *)
  96. dev->dev_private;
  97. dev_priv->blc_adj1 = BLC_ADJUSTMENT_MAX;
  98. dev_priv->blc_adj2 = BLC_ADJUSTMENT_MAX;
  99. return 0;
  100. }
  101. static int mdfld_backlight_init(struct drm_device *dev)
  102. {
  103. struct backlight_properties props;
  104. int ret = 0;
  105. memset(&props, 0, sizeof(struct backlight_properties));
  106. props.max_brightness = BRIGHTNESS_MAX_LEVEL;
  107. props.type = BACKLIGHT_PLATFORM;
  108. mdfld_backlight_device = backlight_device_register("mdfld-bl",
  109. NULL, (void *)dev, &mdfld_ops, &props);
  110. if (IS_ERR(mdfld_backlight_device))
  111. return PTR_ERR(mdfld_backlight_device);
  112. ret = device_backlight_init(dev);
  113. if (ret)
  114. return ret;
  115. mdfld_backlight_device->props.brightness = BRIGHTNESS_MAX_LEVEL;
  116. mdfld_backlight_device->props.max_brightness = BRIGHTNESS_MAX_LEVEL;
  117. backlight_update_status(mdfld_backlight_device);
  118. return 0;
  119. }
  120. #endif
  121. struct backlight_device *mdfld_get_backlight_device(void)
  122. {
  123. #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
  124. return mdfld_backlight_device;
  125. #else
  126. return NULL;
  127. #endif
  128. }
  129. /*
  130. * mdfld_save_display_registers
  131. *
  132. * Description: We are going to suspend so save current display
  133. * register state.
  134. *
  135. * Notes: FIXME_JLIU7 need to add the support for DPI MIPI & HDMI audio
  136. */
  137. static int mdfld_save_display_registers(struct drm_device *dev, int pipenum)
  138. {
  139. struct drm_psb_private *dev_priv = dev->dev_private;
  140. struct medfield_state *regs = &dev_priv->regs.mdfld;
  141. struct psb_pipe *pipe = &dev_priv->regs.pipe[pipenum];
  142. int i;
  143. u32 *mipi_val;
  144. /* register */
  145. u32 dpll_reg = MRST_DPLL_A;
  146. u32 fp_reg = MRST_FPA0;
  147. u32 pipeconf_reg = PIPEACONF;
  148. u32 htot_reg = HTOTAL_A;
  149. u32 hblank_reg = HBLANK_A;
  150. u32 hsync_reg = HSYNC_A;
  151. u32 vtot_reg = VTOTAL_A;
  152. u32 vblank_reg = VBLANK_A;
  153. u32 vsync_reg = VSYNC_A;
  154. u32 pipesrc_reg = PIPEASRC;
  155. u32 dspstride_reg = DSPASTRIDE;
  156. u32 dsplinoff_reg = DSPALINOFF;
  157. u32 dsptileoff_reg = DSPATILEOFF;
  158. u32 dspsize_reg = DSPASIZE;
  159. u32 dsppos_reg = DSPAPOS;
  160. u32 dspsurf_reg = DSPASURF;
  161. u32 mipi_reg = MIPI;
  162. u32 dspcntr_reg = DSPACNTR;
  163. u32 dspstatus_reg = PIPEASTAT;
  164. u32 palette_reg = PALETTE_A;
  165. switch (pipenum) {
  166. case 0:
  167. mipi_val = &regs->saveMIPI;
  168. break;
  169. case 1:
  170. mipi_val = &regs->saveMIPI;
  171. /* register */
  172. dpll_reg = MDFLD_DPLL_B;
  173. fp_reg = MDFLD_DPLL_DIV0;
  174. pipeconf_reg = PIPEBCONF;
  175. htot_reg = HTOTAL_B;
  176. hblank_reg = HBLANK_B;
  177. hsync_reg = HSYNC_B;
  178. vtot_reg = VTOTAL_B;
  179. vblank_reg = VBLANK_B;
  180. vsync_reg = VSYNC_B;
  181. pipesrc_reg = PIPEBSRC;
  182. dspstride_reg = DSPBSTRIDE;
  183. dsplinoff_reg = DSPBLINOFF;
  184. dsptileoff_reg = DSPBTILEOFF;
  185. dspsize_reg = DSPBSIZE;
  186. dsppos_reg = DSPBPOS;
  187. dspsurf_reg = DSPBSURF;
  188. dspcntr_reg = DSPBCNTR;
  189. dspstatus_reg = PIPEBSTAT;
  190. palette_reg = PALETTE_B;
  191. break;
  192. case 2:
  193. /* register */
  194. pipeconf_reg = PIPECCONF;
  195. htot_reg = HTOTAL_C;
  196. hblank_reg = HBLANK_C;
  197. hsync_reg = HSYNC_C;
  198. vtot_reg = VTOTAL_C;
  199. vblank_reg = VBLANK_C;
  200. vsync_reg = VSYNC_C;
  201. pipesrc_reg = PIPECSRC;
  202. dspstride_reg = DSPCSTRIDE;
  203. dsplinoff_reg = DSPCLINOFF;
  204. dsptileoff_reg = DSPCTILEOFF;
  205. dspsize_reg = DSPCSIZE;
  206. dsppos_reg = DSPCPOS;
  207. dspsurf_reg = DSPCSURF;
  208. mipi_reg = MIPI_C;
  209. dspcntr_reg = DSPCCNTR;
  210. dspstatus_reg = PIPECSTAT;
  211. palette_reg = PALETTE_C;
  212. /* pointer to values */
  213. mipi_val = &regs->saveMIPI_C;
  214. break;
  215. default:
  216. DRM_ERROR("%s, invalid pipe number.\n", __func__);
  217. return -EINVAL;
  218. }
  219. /* Pipe & plane A info */
  220. pipe->dpll = PSB_RVDC32(dpll_reg);
  221. pipe->fp0 = PSB_RVDC32(fp_reg);
  222. pipe->conf = PSB_RVDC32(pipeconf_reg);
  223. pipe->htotal = PSB_RVDC32(htot_reg);
  224. pipe->hblank = PSB_RVDC32(hblank_reg);
  225. pipe->hsync = PSB_RVDC32(hsync_reg);
  226. pipe->vtotal = PSB_RVDC32(vtot_reg);
  227. pipe->vblank = PSB_RVDC32(vblank_reg);
  228. pipe->vsync = PSB_RVDC32(vsync_reg);
  229. pipe->src = PSB_RVDC32(pipesrc_reg);
  230. pipe->stride = PSB_RVDC32(dspstride_reg);
  231. pipe->linoff = PSB_RVDC32(dsplinoff_reg);
  232. pipe->tileoff = PSB_RVDC32(dsptileoff_reg);
  233. pipe->size = PSB_RVDC32(dspsize_reg);
  234. pipe->pos = PSB_RVDC32(dsppos_reg);
  235. pipe->surf = PSB_RVDC32(dspsurf_reg);
  236. pipe->cntr = PSB_RVDC32(dspcntr_reg);
  237. pipe->status = PSB_RVDC32(dspstatus_reg);
  238. /*save palette (gamma) */
  239. for (i = 0; i < 256; i++)
  240. pipe->palette[i] = PSB_RVDC32(palette_reg + (i << 2));
  241. if (pipenum == 1) {
  242. regs->savePFIT_CONTROL = PSB_RVDC32(PFIT_CONTROL);
  243. regs->savePFIT_PGM_RATIOS = PSB_RVDC32(PFIT_PGM_RATIOS);
  244. regs->saveHDMIPHYMISCCTL = PSB_RVDC32(HDMIPHYMISCCTL);
  245. regs->saveHDMIB_CONTROL = PSB_RVDC32(HDMIB_CONTROL);
  246. return 0;
  247. }
  248. *mipi_val = PSB_RVDC32(mipi_reg);
  249. return 0;
  250. }
  251. /*
  252. * mdfld_restore_display_registers
  253. *
  254. * Description: We are going to resume so restore display register state.
  255. *
  256. * Notes: FIXME_JLIU7 need to add the support for DPI MIPI & HDMI audio
  257. */
  258. static int mdfld_restore_display_registers(struct drm_device *dev, int pipenum)
  259. {
  260. /* To get panel out of ULPS mode. */
  261. u32 temp = 0;
  262. u32 device_ready_reg = DEVICE_READY_REG;
  263. struct drm_psb_private *dev_priv = dev->dev_private;
  264. struct mdfld_dsi_config *dsi_config = NULL;
  265. struct medfield_state *regs = &dev_priv->regs.mdfld;
  266. struct psb_pipe *pipe = &dev_priv->regs.pipe[pipenum];
  267. u32 i;
  268. u32 dpll;
  269. u32 timeout = 0;
  270. /* register */
  271. u32 dpll_reg = MRST_DPLL_A;
  272. u32 fp_reg = MRST_FPA0;
  273. u32 pipeconf_reg = PIPEACONF;
  274. u32 htot_reg = HTOTAL_A;
  275. u32 hblank_reg = HBLANK_A;
  276. u32 hsync_reg = HSYNC_A;
  277. u32 vtot_reg = VTOTAL_A;
  278. u32 vblank_reg = VBLANK_A;
  279. u32 vsync_reg = VSYNC_A;
  280. u32 pipesrc_reg = PIPEASRC;
  281. u32 dspstride_reg = DSPASTRIDE;
  282. u32 dsplinoff_reg = DSPALINOFF;
  283. u32 dsptileoff_reg = DSPATILEOFF;
  284. u32 dspsize_reg = DSPASIZE;
  285. u32 dsppos_reg = DSPAPOS;
  286. u32 dspsurf_reg = DSPASURF;
  287. u32 dspstatus_reg = PIPEASTAT;
  288. u32 mipi_reg = MIPI;
  289. u32 dspcntr_reg = DSPACNTR;
  290. u32 palette_reg = PALETTE_A;
  291. /* values */
  292. u32 dpll_val = pipe->dpll;
  293. u32 mipi_val = regs->saveMIPI;
  294. switch (pipenum) {
  295. case 0:
  296. dpll_val &= ~DPLL_VCO_ENABLE;
  297. dsi_config = dev_priv->dsi_configs[0];
  298. break;
  299. case 1:
  300. /* register */
  301. dpll_reg = MDFLD_DPLL_B;
  302. fp_reg = MDFLD_DPLL_DIV0;
  303. pipeconf_reg = PIPEBCONF;
  304. htot_reg = HTOTAL_B;
  305. hblank_reg = HBLANK_B;
  306. hsync_reg = HSYNC_B;
  307. vtot_reg = VTOTAL_B;
  308. vblank_reg = VBLANK_B;
  309. vsync_reg = VSYNC_B;
  310. pipesrc_reg = PIPEBSRC;
  311. dspstride_reg = DSPBSTRIDE;
  312. dsplinoff_reg = DSPBLINOFF;
  313. dsptileoff_reg = DSPBTILEOFF;
  314. dspsize_reg = DSPBSIZE;
  315. dsppos_reg = DSPBPOS;
  316. dspsurf_reg = DSPBSURF;
  317. dspcntr_reg = DSPBCNTR;
  318. dspstatus_reg = PIPEBSTAT;
  319. palette_reg = PALETTE_B;
  320. /* values */
  321. dpll_val &= ~DPLL_VCO_ENABLE;
  322. break;
  323. case 2:
  324. /* register */
  325. pipeconf_reg = PIPECCONF;
  326. htot_reg = HTOTAL_C;
  327. hblank_reg = HBLANK_C;
  328. hsync_reg = HSYNC_C;
  329. vtot_reg = VTOTAL_C;
  330. vblank_reg = VBLANK_C;
  331. vsync_reg = VSYNC_C;
  332. pipesrc_reg = PIPECSRC;
  333. dspstride_reg = DSPCSTRIDE;
  334. dsplinoff_reg = DSPCLINOFF;
  335. dsptileoff_reg = DSPCTILEOFF;
  336. dspsize_reg = DSPCSIZE;
  337. dsppos_reg = DSPCPOS;
  338. dspsurf_reg = DSPCSURF;
  339. mipi_reg = MIPI_C;
  340. dspcntr_reg = DSPCCNTR;
  341. dspstatus_reg = PIPECSTAT;
  342. palette_reg = PALETTE_C;
  343. /* values */
  344. mipi_val = regs->saveMIPI_C;
  345. dsi_config = dev_priv->dsi_configs[1];
  346. break;
  347. default:
  348. DRM_ERROR("%s, invalid pipe number.\n", __func__);
  349. return -EINVAL;
  350. }
  351. /*make sure VGA plane is off. it initializes to on after reset!*/
  352. PSB_WVDC32(0x80000000, VGACNTRL);
  353. if (pipenum == 1) {
  354. PSB_WVDC32(dpll_val & ~DPLL_VCO_ENABLE, dpll_reg);
  355. PSB_RVDC32(dpll_reg);
  356. PSB_WVDC32(pipe->fp0, fp_reg);
  357. } else {
  358. dpll = PSB_RVDC32(dpll_reg);
  359. if (!(dpll & DPLL_VCO_ENABLE)) {
  360. /* When ungating power of DPLL, needs to wait 0.5us
  361. before enable the VCO */
  362. if (dpll & MDFLD_PWR_GATE_EN) {
  363. dpll &= ~MDFLD_PWR_GATE_EN;
  364. PSB_WVDC32(dpll, dpll_reg);
  365. /* FIXME_MDFLD PO - change 500 to 1 after PO */
  366. udelay(500);
  367. }
  368. PSB_WVDC32(pipe->fp0, fp_reg);
  369. PSB_WVDC32(dpll_val, dpll_reg);
  370. /* FIXME_MDFLD PO - change 500 to 1 after PO */
  371. udelay(500);
  372. dpll_val |= DPLL_VCO_ENABLE;
  373. PSB_WVDC32(dpll_val, dpll_reg);
  374. PSB_RVDC32(dpll_reg);
  375. /* wait for DSI PLL to lock */
  376. while (timeout < 20000 &&
  377. !(PSB_RVDC32(pipeconf_reg) & PIPECONF_DSIPLL_LOCK)) {
  378. udelay(150);
  379. timeout++;
  380. }
  381. if (timeout == 20000) {
  382. DRM_ERROR("%s, can't lock DSIPLL.\n",
  383. __func__);
  384. return -EINVAL;
  385. }
  386. }
  387. }
  388. /* Restore mode */
  389. PSB_WVDC32(pipe->htotal, htot_reg);
  390. PSB_WVDC32(pipe->hblank, hblank_reg);
  391. PSB_WVDC32(pipe->hsync, hsync_reg);
  392. PSB_WVDC32(pipe->vtotal, vtot_reg);
  393. PSB_WVDC32(pipe->vblank, vblank_reg);
  394. PSB_WVDC32(pipe->vsync, vsync_reg);
  395. PSB_WVDC32(pipe->src, pipesrc_reg);
  396. PSB_WVDC32(pipe->status, dspstatus_reg);
  397. /*set up the plane*/
  398. PSB_WVDC32(pipe->stride, dspstride_reg);
  399. PSB_WVDC32(pipe->linoff, dsplinoff_reg);
  400. PSB_WVDC32(pipe->tileoff, dsptileoff_reg);
  401. PSB_WVDC32(pipe->size, dspsize_reg);
  402. PSB_WVDC32(pipe->pos, dsppos_reg);
  403. PSB_WVDC32(pipe->surf, dspsurf_reg);
  404. if (pipenum == 1) {
  405. /* restore palette (gamma) */
  406. /*DRM_UDELAY(50000); */
  407. for (i = 0; i < 256; i++)
  408. PSB_WVDC32(pipe->palette[i], palette_reg + (i << 2));
  409. PSB_WVDC32(regs->savePFIT_CONTROL, PFIT_CONTROL);
  410. PSB_WVDC32(regs->savePFIT_PGM_RATIOS, PFIT_PGM_RATIOS);
  411. /*TODO: resume HDMI port */
  412. /*TODO: resume pipe*/
  413. /*enable the plane*/
  414. PSB_WVDC32(pipe->cntr & ~DISPLAY_PLANE_ENABLE, dspcntr_reg);
  415. return 0;
  416. }
  417. /*set up pipe related registers*/
  418. PSB_WVDC32(mipi_val, mipi_reg);
  419. /*setup MIPI adapter + MIPI IP registers*/
  420. if (dsi_config)
  421. mdfld_dsi_controller_init(dsi_config, pipenum);
  422. if (in_atomic() || in_interrupt())
  423. mdelay(20);
  424. else
  425. msleep(20);
  426. /*enable the plane*/
  427. PSB_WVDC32(pipe->cntr, dspcntr_reg);
  428. if (in_atomic() || in_interrupt())
  429. mdelay(20);
  430. else
  431. msleep(20);
  432. /* LP Hold Release */
  433. temp = REG_READ(mipi_reg);
  434. temp |= LP_OUTPUT_HOLD_RELEASE;
  435. REG_WRITE(mipi_reg, temp);
  436. mdelay(1);
  437. /* Set DSI host to exit from Utra Low Power State */
  438. temp = REG_READ(device_ready_reg);
  439. temp &= ~ULPS_MASK;
  440. temp |= 0x3;
  441. temp |= EXIT_ULPS_DEV_READY;
  442. REG_WRITE(device_ready_reg, temp);
  443. mdelay(1);
  444. temp = REG_READ(device_ready_reg);
  445. temp &= ~ULPS_MASK;
  446. temp |= EXITING_ULPS;
  447. REG_WRITE(device_ready_reg, temp);
  448. mdelay(1);
  449. /*enable the pipe*/
  450. PSB_WVDC32(pipe->conf, pipeconf_reg);
  451. /* restore palette (gamma) */
  452. /*DRM_UDELAY(50000); */
  453. for (i = 0; i < 256; i++)
  454. PSB_WVDC32(pipe->palette[i], palette_reg + (i << 2));
  455. return 0;
  456. }
  457. static int mdfld_save_registers(struct drm_device *dev)
  458. {
  459. /* mdfld_save_cursor_overlay_registers(dev); */
  460. mdfld_save_display_registers(dev, 0);
  461. mdfld_save_display_registers(dev, 2);
  462. mdfld_disable_crtc(dev, 0);
  463. mdfld_disable_crtc(dev, 2);
  464. return 0;
  465. }
  466. static int mdfld_restore_registers(struct drm_device *dev)
  467. {
  468. mdfld_restore_display_registers(dev, 2);
  469. mdfld_restore_display_registers(dev, 0);
  470. /* mdfld_restore_cursor_overlay_registers(dev); */
  471. return 0;
  472. }
  473. static int mdfld_power_down(struct drm_device *dev)
  474. {
  475. /* FIXME */
  476. return 0;
  477. }
  478. static int mdfld_power_up(struct drm_device *dev)
  479. {
  480. /* FIXME */
  481. return 0;
  482. }
  483. const struct psb_ops mdfld_chip_ops = {
  484. .name = "mdfld",
  485. .accel_2d = 0,
  486. .pipes = 3,
  487. .crtcs = 3,
  488. .lvds_mask = (1 << 1),
  489. .hdmi_mask = (1 << 1),
  490. .sgx_offset = MRST_SGX_OFFSET,
  491. .chip_setup = mid_chip_setup,
  492. .crtc_helper = &mdfld_helper_funcs,
  493. .crtc_funcs = &psb_intel_crtc_funcs,
  494. .output_init = mdfld_output_init,
  495. #ifdef CONFIG_BACKLIGHT_CLASS_DEVICE
  496. .backlight_init = mdfld_backlight_init,
  497. #endif
  498. .save_regs = mdfld_save_registers,
  499. .restore_regs = mdfld_restore_registers,
  500. .power_down = mdfld_power_down,
  501. .power_up = mdfld_power_up,
  502. };