aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/staging
diff options
context:
space:
mode:
authorIsmael Luceno <ismael.luceno@corp.bluecherry.net>2014-05-18 15:44:11 -0400
committerMauro Carvalho Chehab <m.chehab@samsung.com>2014-05-25 11:33:07 -0400
commit3a4d339fe8803a7e7d901f61ea268af71d899169 (patch)
tree7bcc0d48f5f33e44968017b1dc1ce0f25d72e2aa /drivers/staging
parent85ac1a1772bb41da895bad83a81f6a62c8f293f6 (diff)
[media] solo6x10: Reduce OSD writes to the minimum necessary
Instead of unconditionally writing SOLO_EOSD_EXT_SIZE() bytes to the OSD area (which is 64 or 128 kB depending on the PCI board) we only write the actual amount of data needed which is 16 * OSD_TEXT_MAX (= 16 * 44). Signed-off-by: Ismael Luceno <ismael.luceno@corp.bluecherry.net> Signed-off-by: Hans Verkuil <hans.verkuil@cisco.com> Signed-off-by: Mauro Carvalho Chehab <m.chehab@samsung.com>
Diffstat (limited to 'drivers/staging')
-rw-r--r--drivers/staging/media/solo6x10/solo6x10-enc.c31
-rw-r--r--drivers/staging/media/solo6x10/solo6x10-offsets.h2
2 files changed, 16 insertions, 17 deletions
diff --git a/drivers/staging/media/solo6x10/solo6x10-enc.c b/drivers/staging/media/solo6x10/solo6x10-enc.c
index 94d5735abf85..2db53b68c62f 100644
--- a/drivers/staging/media/solo6x10/solo6x10-enc.c
+++ b/drivers/staging/media/solo6x10/solo6x10-enc.c
@@ -134,51 +134,48 @@ static void solo_capture_config(struct solo_dev *solo_dev)
134 kfree(buf); 134 kfree(buf);
135} 135}
136 136
137#define SOLO_OSD_WRITE_SIZE (16 * OSD_TEXT_MAX)
138
137/* Should be called with enable_lock held */ 139/* Should be called with enable_lock held */
138int solo_osd_print(struct solo_enc_dev *solo_enc) 140int solo_osd_print(struct solo_enc_dev *solo_enc)
139{ 141{
140 struct solo_dev *solo_dev = solo_enc->solo_dev; 142 struct solo_dev *solo_dev = solo_enc->solo_dev;
141 unsigned char *str = solo_enc->osd_text; 143 unsigned char *str = solo_enc->osd_text;
142 u8 *buf = solo_enc->osd_buf; 144 u8 *buf = solo_enc->osd_buf;
143 u32 reg = solo_reg_read(solo_dev, SOLO_VE_OSD_CH); 145 u32 reg;
144 const struct font_desc *vga = find_font("VGA8x16"); 146 const struct font_desc *vga = find_font("VGA8x16");
145 const unsigned char *vga_data; 147 const unsigned char *vga_data;
146 int len;
147 int i, j; 148 int i, j;
148 149
149 if (WARN_ON_ONCE(!vga)) 150 if (WARN_ON_ONCE(!vga))
150 return -ENODEV; 151 return -ENODEV;
151 152
152 len = strlen(str); 153 reg = solo_reg_read(solo_dev, SOLO_VE_OSD_CH);
153 154 if (!*str) {
154 if (len == 0) {
155 /* Disable OSD on this channel */ 155 /* Disable OSD on this channel */
156 reg &= ~(1 << solo_enc->ch); 156 reg &= ~(1 << solo_enc->ch);
157 solo_reg_write(solo_dev, SOLO_VE_OSD_CH, reg); 157 goto out;
158 return 0;
159 } 158 }
160 159
161 memset(buf, 0, SOLO_EOSD_EXT_SIZE_MAX); 160 memset(buf, 0, SOLO_OSD_WRITE_SIZE);
162 vga_data = (const unsigned char *)vga->data; 161 vga_data = (const unsigned char *)vga->data;
163 162
164 for (i = 0; i < len; i++) { 163 for (i = 0; *str; i++, str++) {
165 unsigned char c = str[i];
166
167 for (j = 0; j < 16; j++) { 164 for (j = 0; j < 16; j++) {
168 buf[(j * 2) + (i % 2) + (i / 2 * 32)] = 165 buf[(j << 1) | (i & 1) | ((i & ~1) << 4)] =
169 bitrev8(vga_data[(c * 16) + j]); 166 bitrev8(vga_data[(*str << 4) | j]);
170 } 167 }
171 } 168 }
172 169
173 solo_p2m_dma(solo_dev, 1, buf, 170 solo_p2m_dma(solo_dev, 1, buf,
174 SOLO_EOSD_EXT_ADDR + 171 SOLO_EOSD_EXT_ADDR_CHAN(solo_dev, solo_enc->ch),
175 (solo_enc->ch * SOLO_EOSD_EXT_SIZE(solo_dev)), 172 SOLO_OSD_WRITE_SIZE, 0, 0);
176 SOLO_EOSD_EXT_SIZE(solo_dev), 0, 0);
177 173
178 /* Enable OSD on this channel */ 174 /* Enable OSD on this channel */
179 reg |= (1 << solo_enc->ch); 175 reg |= (1 << solo_enc->ch);
180 solo_reg_write(solo_dev, SOLO_VE_OSD_CH, reg);
181 176
177out:
178 solo_reg_write(solo_dev, SOLO_VE_OSD_CH, reg);
182 return 0; 179 return 0;
183} 180}
184 181
diff --git a/drivers/staging/media/solo6x10/solo6x10-offsets.h b/drivers/staging/media/solo6x10/solo6x10-offsets.h
index f005dca501f1..13eeb4470dcf 100644
--- a/drivers/staging/media/solo6x10/solo6x10-offsets.h
+++ b/drivers/staging/media/solo6x10/solo6x10-offsets.h
@@ -35,6 +35,8 @@
35#define SOLO_EOSD_EXT_SIZE_MAX 0x20000 35#define SOLO_EOSD_EXT_SIZE_MAX 0x20000
36#define SOLO_EOSD_EXT_AREA(__solo) \ 36#define SOLO_EOSD_EXT_AREA(__solo) \
37 (SOLO_EOSD_EXT_SIZE(__solo) * 32) 37 (SOLO_EOSD_EXT_SIZE(__solo) * 32)
38#define SOLO_EOSD_EXT_ADDR_CHAN(__solo, ch) \
39 (SOLO_EOSD_EXT_ADDR + SOLO_EOSD_EXT_SIZE(__solo) * (ch))
38 40
39#define SOLO_MOTION_EXT_ADDR(__solo) \ 41#define SOLO_MOTION_EXT_ADDR(__solo) \
40 (SOLO_EOSD_EXT_ADDR + SOLO_EOSD_EXT_AREA(__solo)) 42 (SOLO_EOSD_EXT_ADDR + SOLO_EOSD_EXT_AREA(__solo))