0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012 #ifndef __OMAP2_DSS_H
0013 #define __OMAP2_DSS_H
0014
0015 #include <linux/interrupt.h>
0016
0017 #ifdef pr_fmt
0018 #undef pr_fmt
0019 #endif
0020
0021 #ifdef DSS_SUBSYS_NAME
0022 #define pr_fmt(fmt) DSS_SUBSYS_NAME ": " fmt
0023 #else
0024 #define pr_fmt(fmt) fmt
0025 #endif
0026
0027 #define DSSDBG(format, ...) \
0028 pr_debug(format, ## __VA_ARGS__)
0029
0030 #ifdef DSS_SUBSYS_NAME
0031 #define DSSERR(format, ...) \
0032 printk(KERN_ERR "omapdss " DSS_SUBSYS_NAME " error: " format, \
0033 ## __VA_ARGS__)
0034 #else
0035 #define DSSERR(format, ...) \
0036 printk(KERN_ERR "omapdss error: " format, ## __VA_ARGS__)
0037 #endif
0038
0039 #ifdef DSS_SUBSYS_NAME
0040 #define DSSINFO(format, ...) \
0041 printk(KERN_INFO "omapdss " DSS_SUBSYS_NAME ": " format, \
0042 ## __VA_ARGS__)
0043 #else
0044 #define DSSINFO(format, ...) \
0045 printk(KERN_INFO "omapdss: " format, ## __VA_ARGS__)
0046 #endif
0047
0048 #ifdef DSS_SUBSYS_NAME
0049 #define DSSWARN(format, ...) \
0050 printk(KERN_WARNING "omapdss " DSS_SUBSYS_NAME ": " format, \
0051 ## __VA_ARGS__)
0052 #else
0053 #define DSSWARN(format, ...) \
0054 printk(KERN_WARNING "omapdss: " format, ## __VA_ARGS__)
0055 #endif
0056
0057
0058
0059 #define FLD_MASK(start, end) (((1 << ((start) - (end) + 1)) - 1) << (end))
0060 #define FLD_VAL(val, start, end) (((val) << (end)) & FLD_MASK(start, end))
0061 #define FLD_GET(val, start, end) (((val) & FLD_MASK(start, end)) >> (end))
0062 #define FLD_MOD(orig, val, start, end) \
0063 (((orig) & ~FLD_MASK(start, end)) | FLD_VAL(val, start, end))
0064
0065 enum omap_dss_clk_source {
0066 OMAP_DSS_CLK_SRC_FCK = 0,
0067
0068 OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC,
0069
0070 OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI,
0071
0072 OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC,
0073 OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI,
0074 };
0075
0076 enum dss_io_pad_mode {
0077 DSS_IO_PAD_MODE_RESET,
0078 DSS_IO_PAD_MODE_RFBI,
0079 DSS_IO_PAD_MODE_BYPASS,
0080 };
0081
0082 enum dss_hdmi_venc_clk_source_select {
0083 DSS_VENC_TV_CLK = 0,
0084 DSS_HDMI_M_PCLK = 1,
0085 };
0086
0087 enum dss_dsi_content_type {
0088 DSS_DSI_CONTENT_DCS,
0089 DSS_DSI_CONTENT_GENERIC,
0090 };
0091
0092 enum dss_pll_id {
0093 DSS_PLL_DSI1,
0094 DSS_PLL_DSI2,
0095 DSS_PLL_HDMI,
0096 DSS_PLL_VIDEO1,
0097 DSS_PLL_VIDEO2,
0098 };
0099
0100 struct dss_pll;
0101
0102 #define DSS_PLL_MAX_HSDIVS 4
0103
0104
0105
0106
0107
0108 struct dss_pll_clock_info {
0109
0110 unsigned long fint;
0111 unsigned long clkdco;
0112 unsigned long clkout[DSS_PLL_MAX_HSDIVS];
0113
0114
0115 u16 n;
0116 u16 m;
0117 u32 mf;
0118 u16 mX[DSS_PLL_MAX_HSDIVS];
0119 u16 sd;
0120 };
0121
0122 struct dss_pll_ops {
0123 int (*enable)(struct dss_pll *pll);
0124 void (*disable)(struct dss_pll *pll);
0125 int (*set_config)(struct dss_pll *pll,
0126 const struct dss_pll_clock_info *cinfo);
0127 };
0128
0129 struct dss_pll_hw {
0130 unsigned n_max;
0131 unsigned m_min;
0132 unsigned m_max;
0133 unsigned mX_max;
0134
0135 unsigned long fint_min, fint_max;
0136 unsigned long clkdco_min, clkdco_low, clkdco_max;
0137
0138 u8 n_msb, n_lsb;
0139 u8 m_msb, m_lsb;
0140 u8 mX_msb[DSS_PLL_MAX_HSDIVS], mX_lsb[DSS_PLL_MAX_HSDIVS];
0141
0142 bool has_stopmode;
0143 bool has_freqsel;
0144 bool has_selfreqdco;
0145 bool has_refsel;
0146 };
0147
0148 struct dss_pll {
0149 const char *name;
0150 enum dss_pll_id id;
0151
0152 struct clk *clkin;
0153 struct regulator *regulator;
0154
0155 void __iomem *base;
0156
0157 const struct dss_pll_hw *hw;
0158
0159 const struct dss_pll_ops *ops;
0160
0161 struct dss_pll_clock_info cinfo;
0162 };
0163
0164 struct dispc_clock_info {
0165
0166 unsigned long lck;
0167 unsigned long pck;
0168
0169
0170 u16 lck_div;
0171 u16 pck_div;
0172 };
0173
0174 struct dss_lcd_mgr_config {
0175 enum dss_io_pad_mode io_pad_mode;
0176
0177 bool stallmode;
0178 bool fifohandcheck;
0179
0180 struct dispc_clock_info clock_info;
0181
0182 int video_port_width;
0183
0184 int lcden_sig_polarity;
0185 };
0186
0187 struct seq_file;
0188 struct platform_device;
0189
0190
0191 struct platform_device *dss_get_core_pdev(void);
0192 int dss_dsi_enable_pads(int dsi_id, unsigned lane_mask);
0193 void dss_dsi_disable_pads(int dsi_id, unsigned lane_mask);
0194 int dss_set_min_bus_tput(struct device *dev, unsigned long tput);
0195 void dss_debugfs_create_file(const char *name, void (*write)(struct seq_file *));
0196
0197
0198 int dss_suspend_all_devices(void);
0199 int dss_resume_all_devices(void);
0200 void dss_disable_all_devices(void);
0201
0202 int display_init_sysfs(struct platform_device *pdev);
0203 void display_uninit_sysfs(struct platform_device *pdev);
0204
0205
0206 int dss_init_overlay_managers(void);
0207 void dss_uninit_overlay_managers(void);
0208 int dss_init_overlay_managers_sysfs(struct platform_device *pdev);
0209 void dss_uninit_overlay_managers_sysfs(struct platform_device *pdev);
0210 int dss_mgr_simple_check(struct omap_overlay_manager *mgr,
0211 const struct omap_overlay_manager_info *info);
0212 int dss_mgr_check_timings(struct omap_overlay_manager *mgr,
0213 const struct omap_video_timings *timings);
0214 int dss_mgr_check(struct omap_overlay_manager *mgr,
0215 struct omap_overlay_manager_info *info,
0216 const struct omap_video_timings *mgr_timings,
0217 const struct dss_lcd_mgr_config *config,
0218 struct omap_overlay_info **overlay_infos);
0219
0220 static inline bool dss_mgr_is_lcd(enum omap_channel id)
0221 {
0222 if (id == OMAP_DSS_CHANNEL_LCD || id == OMAP_DSS_CHANNEL_LCD2 ||
0223 id == OMAP_DSS_CHANNEL_LCD3)
0224 return true;
0225 else
0226 return false;
0227 }
0228
0229 int dss_manager_kobj_init(struct omap_overlay_manager *mgr,
0230 struct platform_device *pdev);
0231 void dss_manager_kobj_uninit(struct omap_overlay_manager *mgr);
0232
0233
0234 void dss_init_overlays(struct platform_device *pdev);
0235 void dss_uninit_overlays(struct platform_device *pdev);
0236 void dss_overlay_setup_dispc_manager(struct omap_overlay_manager *mgr);
0237 int dss_ovl_simple_check(struct omap_overlay *ovl,
0238 const struct omap_overlay_info *info);
0239 int dss_ovl_check(struct omap_overlay *ovl, struct omap_overlay_info *info,
0240 const struct omap_video_timings *mgr_timings);
0241 bool dss_ovl_use_replication(struct dss_lcd_mgr_config config,
0242 enum omap_color_mode mode);
0243 int dss_overlay_kobj_init(struct omap_overlay *ovl,
0244 struct platform_device *pdev);
0245 void dss_overlay_kobj_uninit(struct omap_overlay *ovl);
0246
0247
0248 int dss_init_platform_driver(void) __init;
0249 void dss_uninit_platform_driver(void);
0250
0251 int dss_runtime_get(void);
0252 void dss_runtime_put(void);
0253
0254 unsigned long dss_get_dispc_clk_rate(void);
0255 int dss_dpi_select_source(int port, enum omap_channel channel);
0256 void dss_select_hdmi_venc_clk_source(enum dss_hdmi_venc_clk_source_select);
0257 enum dss_hdmi_venc_clk_source_select dss_get_hdmi_venc_clk_source(void);
0258 const char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src);
0259 void dss_dump_clocks(struct seq_file *s);
0260
0261
0262 struct dss_pll *dss_video_pll_init(struct platform_device *pdev, int id,
0263 struct regulator *regulator);
0264 void dss_video_pll_uninit(struct dss_pll *pll);
0265
0266
0267 struct device_node *dss_of_port_get_parent_device(struct device_node *port);
0268 u32 dss_of_port_get_port_number(struct device_node *port);
0269
0270 #if defined(CONFIG_FB_OMAP2_DSS_DEBUGFS)
0271 void dss_debug_dump_clocks(struct seq_file *s);
0272 #endif
0273
0274 void dss_ctrl_pll_enable(enum dss_pll_id pll_id, bool enable);
0275 void dss_ctrl_pll_set_control_mux(enum dss_pll_id pll_id,
0276 enum omap_channel channel);
0277
0278 void dss_sdi_init(int datapairs);
0279 int dss_sdi_enable(void);
0280 void dss_sdi_disable(void);
0281
0282 void dss_select_dsi_clk_source(int dsi_module,
0283 enum omap_dss_clk_source clk_src);
0284 void dss_select_lcd_clk_source(enum omap_channel channel,
0285 enum omap_dss_clk_source clk_src);
0286 enum omap_dss_clk_source dss_get_dispc_clk_source(void);
0287 enum omap_dss_clk_source dss_get_dsi_clk_source(int dsi_module);
0288 enum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel);
0289
0290 void dss_set_venc_output(enum omap_dss_venc_type type);
0291 void dss_set_dac_pwrdn_bgz(bool enable);
0292
0293 int dss_set_fck_rate(unsigned long rate);
0294
0295 typedef bool (*dss_div_calc_func)(unsigned long fck, void *data);
0296 bool dss_div_calc(unsigned long pck, unsigned long fck_min,
0297 dss_div_calc_func func, void *data);
0298
0299
0300 int sdi_init_platform_driver(void) __init;
0301 void sdi_uninit_platform_driver(void);
0302
0303 #ifdef CONFIG_FB_OMAP2_DSS_SDI
0304 int sdi_init_port(struct platform_device *pdev, struct device_node *port);
0305 void sdi_uninit_port(struct device_node *port);
0306 #else
0307 static inline int sdi_init_port(struct platform_device *pdev,
0308 struct device_node *port)
0309 {
0310 return 0;
0311 }
0312 static inline void sdi_uninit_port(struct device_node *port)
0313 {
0314 }
0315 #endif
0316
0317
0318
0319 #ifdef CONFIG_FB_OMAP2_DSS_DSI
0320
0321 struct dentry;
0322 struct file_operations;
0323
0324 int dsi_init_platform_driver(void) __init;
0325 void dsi_uninit_platform_driver(void);
0326
0327 void dsi_dump_clocks(struct seq_file *s);
0328
0329 void dsi_irq_handler(void);
0330 u8 dsi_get_pixel_size(enum omap_dss_dsi_pixel_format fmt);
0331
0332 #else
0333 static inline u8 dsi_get_pixel_size(enum omap_dss_dsi_pixel_format fmt)
0334 {
0335 WARN(1, "%s: DSI not compiled in, returning pixel_size as 0\n",
0336 __func__);
0337 return 0;
0338 }
0339 #endif
0340
0341
0342 int dpi_init_platform_driver(void) __init;
0343 void dpi_uninit_platform_driver(void);
0344
0345 #ifdef CONFIG_FB_OMAP2_DSS_DPI
0346 int dpi_init_port(struct platform_device *pdev, struct device_node *port);
0347 void dpi_uninit_port(struct device_node *port);
0348 #else
0349 static inline int dpi_init_port(struct platform_device *pdev,
0350 struct device_node *port)
0351 {
0352 return 0;
0353 }
0354 static inline void dpi_uninit_port(struct device_node *port)
0355 {
0356 }
0357 #endif
0358
0359
0360 int dispc_init_platform_driver(void) __init;
0361 void dispc_uninit_platform_driver(void);
0362 void dispc_dump_clocks(struct seq_file *s);
0363
0364 void dispc_enable_sidle(void);
0365 void dispc_disable_sidle(void);
0366
0367 void dispc_lcd_enable_signal(bool enable);
0368 void dispc_pck_free_enable(bool enable);
0369 void dispc_enable_fifomerge(bool enable);
0370 void dispc_enable_gamma_table(bool enable);
0371
0372 typedef bool (*dispc_div_calc_func)(int lckd, int pckd, unsigned long lck,
0373 unsigned long pck, void *data);
0374 bool dispc_div_calc(unsigned long dispc,
0375 unsigned long pck_min, unsigned long pck_max,
0376 dispc_div_calc_func func, void *data);
0377
0378 bool dispc_mgr_timings_ok(enum omap_channel channel,
0379 const struct omap_video_timings *timings);
0380 int dispc_calc_clock_rates(unsigned long dispc_fclk_rate,
0381 struct dispc_clock_info *cinfo);
0382
0383
0384 void dispc_ovl_set_fifo_threshold(enum omap_plane plane, u32 low, u32 high);
0385 void dispc_ovl_compute_fifo_thresholds(enum omap_plane plane,
0386 u32 *fifo_low, u32 *fifo_high, bool use_fifomerge,
0387 bool manual_update);
0388
0389 void dispc_mgr_set_clock_div(enum omap_channel channel,
0390 const struct dispc_clock_info *cinfo);
0391 int dispc_mgr_get_clock_div(enum omap_channel channel,
0392 struct dispc_clock_info *cinfo);
0393 void dispc_set_tv_pclk(unsigned long pclk);
0394
0395 u32 dispc_read_irqstatus(void);
0396 void dispc_clear_irqstatus(u32 mask);
0397 u32 dispc_read_irqenable(void);
0398 void dispc_write_irqenable(u32 mask);
0399
0400 int dispc_request_irq(irq_handler_t handler, void *dev_id);
0401 void dispc_free_irq(void *dev_id);
0402
0403 int dispc_runtime_get(void);
0404 void dispc_runtime_put(void);
0405
0406 void dispc_mgr_enable(enum omap_channel channel, bool enable);
0407 bool dispc_mgr_is_enabled(enum omap_channel channel);
0408 u32 dispc_mgr_get_vsync_irq(enum omap_channel channel);
0409 u32 dispc_mgr_get_framedone_irq(enum omap_channel channel);
0410 u32 dispc_mgr_get_sync_lost_irq(enum omap_channel channel);
0411 bool dispc_mgr_go_busy(enum omap_channel channel);
0412 void dispc_mgr_go(enum omap_channel channel);
0413 void dispc_mgr_set_lcd_config(enum omap_channel channel,
0414 const struct dss_lcd_mgr_config *config);
0415 void dispc_mgr_set_timings(enum omap_channel channel,
0416 const struct omap_video_timings *timings);
0417 void dispc_mgr_setup(enum omap_channel channel,
0418 const struct omap_overlay_manager_info *info);
0419
0420 int dispc_ovl_check(enum omap_plane plane, enum omap_channel channel,
0421 const struct omap_overlay_info *oi,
0422 const struct omap_video_timings *timings,
0423 int *x_predecim, int *y_predecim);
0424
0425 int dispc_ovl_enable(enum omap_plane plane, bool enable);
0426 bool dispc_ovl_enabled(enum omap_plane plane);
0427 void dispc_ovl_set_channel_out(enum omap_plane plane,
0428 enum omap_channel channel);
0429 int dispc_ovl_setup(enum omap_plane plane, const struct omap_overlay_info *oi,
0430 bool replication, const struct omap_video_timings *mgr_timings,
0431 bool mem_to_mem);
0432
0433
0434 int venc_init_platform_driver(void) __init;
0435 void venc_uninit_platform_driver(void);
0436
0437
0438 int hdmi4_init_platform_driver(void) __init;
0439 void hdmi4_uninit_platform_driver(void);
0440
0441 int hdmi5_init_platform_driver(void) __init;
0442 void hdmi5_uninit_platform_driver(void);
0443
0444
0445 #ifdef CONFIG_FB_OMAP2_DSS_COLLECT_IRQ_STATS
0446 static inline void dss_collect_irq_stats(u32 irqstatus, unsigned *irq_arr)
0447 {
0448 int b;
0449 for (b = 0; b < 32; ++b) {
0450 if (irqstatus & (1 << b))
0451 irq_arr[b]++;
0452 }
0453 }
0454 #endif
0455
0456
0457 typedef bool (*dss_pll_calc_func)(int n, int m, unsigned long fint,
0458 unsigned long clkdco, void *data);
0459 typedef bool (*dss_hsdiv_calc_func)(int m_dispc, unsigned long dispc,
0460 void *data);
0461
0462 int dss_pll_register(struct dss_pll *pll);
0463 void dss_pll_unregister(struct dss_pll *pll);
0464 struct dss_pll *dss_pll_find(const char *name);
0465 int dss_pll_enable(struct dss_pll *pll);
0466 void dss_pll_disable(struct dss_pll *pll);
0467 int dss_pll_set_config(struct dss_pll *pll,
0468 const struct dss_pll_clock_info *cinfo);
0469
0470 bool dss_pll_hsdiv_calc(const struct dss_pll *pll, unsigned long clkdco,
0471 unsigned long out_min, unsigned long out_max,
0472 dss_hsdiv_calc_func func, void *data);
0473 bool dss_pll_calc(const struct dss_pll *pll, unsigned long clkin,
0474 unsigned long pll_min, unsigned long pll_max,
0475 dss_pll_calc_func func, void *data);
0476 int dss_pll_write_config_type_a(struct dss_pll *pll,
0477 const struct dss_pll_clock_info *cinfo);
0478 int dss_pll_write_config_type_b(struct dss_pll *pll,
0479 const struct dss_pll_clock_info *cinfo);
0480 int dss_pll_wait_reset_done(struct dss_pll *pll);
0481
0482
0483
0484 struct dss_mgr_ops {
0485 int (*connect)(struct omap_overlay_manager *mgr,
0486 struct omap_dss_device *dst);
0487 void (*disconnect)(struct omap_overlay_manager *mgr,
0488 struct omap_dss_device *dst);
0489
0490 void (*start_update)(struct omap_overlay_manager *mgr);
0491 int (*enable)(struct omap_overlay_manager *mgr);
0492 void (*disable)(struct omap_overlay_manager *mgr);
0493 void (*set_timings)(struct omap_overlay_manager *mgr,
0494 const struct omap_video_timings *timings);
0495 void (*set_lcd_config)(struct omap_overlay_manager *mgr,
0496 const struct dss_lcd_mgr_config *config);
0497 int (*register_framedone_handler)(struct omap_overlay_manager *mgr,
0498 void (*handler)(void *), void *data);
0499 void (*unregister_framedone_handler)(struct omap_overlay_manager *mgr,
0500 void (*handler)(void *), void *data);
0501 };
0502
0503 int dss_install_mgr_ops(const struct dss_mgr_ops *mgr_ops);
0504 void dss_uninstall_mgr_ops(void);
0505
0506 int dss_mgr_connect(struct omap_overlay_manager *mgr,
0507 struct omap_dss_device *dst);
0508 void dss_mgr_disconnect(struct omap_overlay_manager *mgr,
0509 struct omap_dss_device *dst);
0510 void dss_mgr_set_timings(struct omap_overlay_manager *mgr,
0511 const struct omap_video_timings *timings);
0512 void dss_mgr_set_lcd_config(struct omap_overlay_manager *mgr,
0513 const struct dss_lcd_mgr_config *config);
0514 int dss_mgr_enable(struct omap_overlay_manager *mgr);
0515 void dss_mgr_disable(struct omap_overlay_manager *mgr);
0516 void dss_mgr_start_update(struct omap_overlay_manager *mgr);
0517 int dss_mgr_register_framedone_handler(struct omap_overlay_manager *mgr,
0518 void (*handler)(void *), void *data);
0519 void dss_mgr_unregister_framedone_handler(struct omap_overlay_manager *mgr,
0520 void (*handler)(void *), void *data);
0521
0522 #endif