aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/video/omap2/dss/dsi.c84
-rw-r--r--drivers/video/omap2/dss/dss.h5
-rw-r--r--include/video/omapdss.h12
3 files changed, 87 insertions, 14 deletions
diff --git a/drivers/video/omap2/dss/dsi.c b/drivers/video/omap2/dss/dsi.c
index d3bffe8b2a38..bb5588932b02 100644
--- a/drivers/video/omap2/dss/dsi.c
+++ b/drivers/video/omap2/dss/dsi.c
@@ -3065,38 +3065,60 @@ int dsi_vc_send_null(struct omap_dss_device *dssdev, int channel)
3065} 3065}
3066EXPORT_SYMBOL(dsi_vc_send_null); 3066EXPORT_SYMBOL(dsi_vc_send_null);
3067 3067
3068int dsi_vc_dcs_write_nosync(struct omap_dss_device *dssdev, int channel, 3068static int dsi_vc_write_nosync_common(struct omap_dss_device *dssdev,
3069 u8 *data, int len) 3069 int channel, u8 *data, int len, enum dss_dsi_content_type type)
3070{ 3070{
3071 struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 3071 struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
3072 int r; 3072 int r;
3073 3073
3074 BUG_ON(len == 0); 3074 if (len == 0) {
3075 3075 BUG_ON(type == DSS_DSI_CONTENT_DCS);
3076 if (len == 1) {
3077 r = dsi_vc_send_short(dsidev, channel, 3076 r = dsi_vc_send_short(dsidev, channel,
3077 MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM, 0, 0);
3078 } else if (len == 1) {
3079 r = dsi_vc_send_short(dsidev, channel,
3080 type == DSS_DSI_CONTENT_GENERIC ?
3081 MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM :
3078 MIPI_DSI_DCS_SHORT_WRITE, data[0], 0); 3082 MIPI_DSI_DCS_SHORT_WRITE, data[0], 0);
3079 } else if (len == 2) { 3083 } else if (len == 2) {
3080 r = dsi_vc_send_short(dsidev, channel, 3084 r = dsi_vc_send_short(dsidev, channel,
3085 type == DSS_DSI_CONTENT_GENERIC ?
3086 MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM :
3081 MIPI_DSI_DCS_SHORT_WRITE_PARAM, 3087 MIPI_DSI_DCS_SHORT_WRITE_PARAM,
3082 data[0] | (data[1] << 8), 0); 3088 data[0] | (data[1] << 8), 0);
3083 } else { 3089 } else {
3084 /* 0x39 = DCS Long Write */ 3090 r = dsi_vc_send_long(dsidev, channel,
3085 r = dsi_vc_send_long(dsidev, channel, MIPI_DSI_DCS_LONG_WRITE, 3091 type == DSS_DSI_CONTENT_GENERIC ?
3086 data, len, 0); 3092 MIPI_DSI_GENERIC_LONG_WRITE :
3093 MIPI_DSI_DCS_LONG_WRITE, data, len, 0);
3087 } 3094 }
3088 3095
3089 return r; 3096 return r;
3090} 3097}
3098
3099int dsi_vc_dcs_write_nosync(struct omap_dss_device *dssdev, int channel,
3100 u8 *data, int len)
3101{
3102 return dsi_vc_write_nosync_common(dssdev, channel, data, len,
3103 DSS_DSI_CONTENT_DCS);
3104}
3091EXPORT_SYMBOL(dsi_vc_dcs_write_nosync); 3105EXPORT_SYMBOL(dsi_vc_dcs_write_nosync);
3092 3106
3093int dsi_vc_dcs_write(struct omap_dss_device *dssdev, int channel, u8 *data, 3107int dsi_vc_generic_write_nosync(struct omap_dss_device *dssdev, int channel,
3094 int len) 3108 u8 *data, int len)
3109{
3110 return dsi_vc_write_nosync_common(dssdev, channel, data, len,
3111 DSS_DSI_CONTENT_GENERIC);
3112}
3113EXPORT_SYMBOL(dsi_vc_generic_write_nosync);
3114
3115static int dsi_vc_write_common(struct omap_dss_device *dssdev, int channel,
3116 u8 *data, int len, enum dss_dsi_content_type type)
3095{ 3117{
3096 struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 3118 struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev);
3097 int r; 3119 int r;
3098 3120
3099 r = dsi_vc_dcs_write_nosync(dssdev, channel, data, len); 3121 r = dsi_vc_write_nosync_common(dssdev, channel, data, len, type);
3100 if (r) 3122 if (r)
3101 goto err; 3123 goto err;
3102 3124
@@ -3114,18 +3136,39 @@ int dsi_vc_dcs_write(struct omap_dss_device *dssdev, int channel, u8 *data,
3114 3136
3115 return 0; 3137 return 0;
3116err: 3138err:
3117 DSSERR("dsi_vc_dcs_write(ch %d, cmd 0x%02x, len %d) failed\n", 3139 DSSERR("dsi_vc_write_common(ch %d, cmd 0x%02x, len %d) failed\n",
3118 channel, data[0], len); 3140 channel, data[0], len);
3119 return r; 3141 return r;
3120} 3142}
3143
3144int dsi_vc_dcs_write(struct omap_dss_device *dssdev, int channel, u8 *data,
3145 int len)
3146{
3147 return dsi_vc_write_common(dssdev, channel, data, len,
3148 DSS_DSI_CONTENT_DCS);
3149}
3121EXPORT_SYMBOL(dsi_vc_dcs_write); 3150EXPORT_SYMBOL(dsi_vc_dcs_write);
3122 3151
3152int dsi_vc_generic_write(struct omap_dss_device *dssdev, int channel, u8 *data,
3153 int len)
3154{
3155 return dsi_vc_write_common(dssdev, channel, data, len,
3156 DSS_DSI_CONTENT_GENERIC);
3157}
3158EXPORT_SYMBOL(dsi_vc_generic_write);
3159
3123int dsi_vc_dcs_write_0(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd) 3160int dsi_vc_dcs_write_0(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd)
3124{ 3161{
3125 return dsi_vc_dcs_write(dssdev, channel, &dcs_cmd, 1); 3162 return dsi_vc_dcs_write(dssdev, channel, &dcs_cmd, 1);
3126} 3163}
3127EXPORT_SYMBOL(dsi_vc_dcs_write_0); 3164EXPORT_SYMBOL(dsi_vc_dcs_write_0);
3128 3165
3166int dsi_vc_generic_write_0(struct omap_dss_device *dssdev, int channel)
3167{
3168 return dsi_vc_generic_write(dssdev, channel, NULL, 0);
3169}
3170EXPORT_SYMBOL(dsi_vc_generic_write_0);
3171
3129int dsi_vc_dcs_write_1(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd, 3172int dsi_vc_dcs_write_1(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
3130 u8 param) 3173 u8 param)
3131{ 3174{
@@ -3136,6 +3179,23 @@ int dsi_vc_dcs_write_1(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
3136} 3179}
3137EXPORT_SYMBOL(dsi_vc_dcs_write_1); 3180EXPORT_SYMBOL(dsi_vc_dcs_write_1);
3138 3181
3182int dsi_vc_generic_write_1(struct omap_dss_device *dssdev, int channel,
3183 u8 param)
3184{
3185 return dsi_vc_generic_write(dssdev, channel, &param, 1);
3186}
3187EXPORT_SYMBOL(dsi_vc_generic_write_1);
3188
3189int dsi_vc_generic_write_2(struct omap_dss_device *dssdev, int channel,
3190 u8 param1, u8 param2)
3191{
3192 u8 buf[2];
3193 buf[0] = param1;
3194 buf[1] = param2;
3195 return dsi_vc_generic_write(dssdev, channel, buf, 2);
3196}
3197EXPORT_SYMBOL(dsi_vc_generic_write_2);
3198
3139int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd, 3199int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
3140 u8 *buf, int buflen) 3200 u8 *buf, int buflen)
3141{ 3201{
diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
index a095a62c64e8..3ec8dd7066a2 100644
--- a/drivers/video/omap2/dss/dss.h
+++ b/drivers/video/omap2/dss/dss.h
@@ -108,6 +108,11 @@ enum dss_hdmi_venc_clk_source_select {
108 DSS_HDMI_M_PCLK = 1, 108 DSS_HDMI_M_PCLK = 1,
109}; 109};
110 110
111enum dss_dsi_content_type {
112 DSS_DSI_CONTENT_DCS,
113 DSS_DSI_CONTENT_GENERIC,
114};
115
111struct dss_clock_info { 116struct dss_clock_info {
112 /* rates that we get with dividers below */ 117 /* rates that we get with dividers below */
113 unsigned long fck; 118 unsigned long fck;
diff --git a/include/video/omapdss.h b/include/video/omapdss.h
index aeadbc880e38..49ffdd201c2d 100644
--- a/include/video/omapdss.h
+++ b/include/video/omapdss.h
@@ -225,12 +225,20 @@ void dsi_bus_lock(struct omap_dss_device *dssdev);
225void dsi_bus_unlock(struct omap_dss_device *dssdev); 225void dsi_bus_unlock(struct omap_dss_device *dssdev);
226int dsi_vc_dcs_write(struct omap_dss_device *dssdev, int channel, u8 *data, 226int dsi_vc_dcs_write(struct omap_dss_device *dssdev, int channel, u8 *data,
227 int len); 227 int len);
228int dsi_vc_dcs_write_0(struct omap_dss_device *dssdev, int channel, 228int dsi_vc_generic_write(struct omap_dss_device *dssdev, int channel, u8 *data,
229 u8 dcs_cmd); 229 int len);
230int dsi_vc_dcs_write_0(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd);
231int dsi_vc_generic_write_0(struct omap_dss_device *dssdev, int channel);
230int dsi_vc_dcs_write_1(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd, 232int dsi_vc_dcs_write_1(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
231 u8 param); 233 u8 param);
234int dsi_vc_generic_write_1(struct omap_dss_device *dssdev, int channel,
235 u8 param);
236int dsi_vc_generic_write_2(struct omap_dss_device *dssdev, int channel,
237 u8 param1, u8 param2);
232int dsi_vc_dcs_write_nosync(struct omap_dss_device *dssdev, int channel, 238int dsi_vc_dcs_write_nosync(struct omap_dss_device *dssdev, int channel,
233 u8 *data, int len); 239 u8 *data, int len);
240int dsi_vc_generic_write_nosync(struct omap_dss_device *dssdev, int channel,
241 u8 *data, int len);
234int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd, 242int dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,
235 u8 *buf, int buflen); 243 u8 *buf, int buflen);
236int dsi_vc_dcs_read_1(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd, 244int dsi_vc_dcs_read_1(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd,