Lines Matching defs:av7110
3 * av7110_hw.c: av7110 low level hardware access and firmware interface
23 #include "av7110.h"
43 int av7110_debiwrite(struct av7110 *av7110, u32 config,
46 struct saa7146_dev *dev = av7110->dev;
52 if (saa7146_wait_for_debi_done(av7110->dev, 0) < 0) {
60 saa7146_write(dev, DEBI_AD, av7110->debi_bus);
66 u32 av7110_debiread(struct av7110 *av7110, u32 config, int addr, unsigned int count)
68 struct saa7146_dev *dev = av7110->dev;
75 if (saa7146_wait_for_debi_done(av7110->dev, 0) < 0) {
79 saa7146_write(dev, DEBI_AD, av7110->debi_bus);
86 if (saa7146_wait_for_debi_done(av7110->dev, 0) < 0) {
98 /* av7110 ARM core boot stuff */
100 void av7110_reset_arm(struct av7110 *av7110)
102 saa7146_setgpio(av7110->dev, RESET_LINE, SAA7146_GPIO_OUTLO);
105 SAA7146_IER_DISABLE(av7110->dev, MASK_19 | MASK_03);
106 SAA7146_ISR_CLEAR(av7110->dev, MASK_19 | MASK_03);
108 saa7146_setgpio(av7110->dev, RESET_LINE, SAA7146_GPIO_OUTHI);
111 ARM_ResetMailBox(av7110);
113 SAA7146_ISR_CLEAR(av7110->dev, MASK_19 | MASK_03);
114 SAA7146_IER_ENABLE(av7110->dev, MASK_03);
116 av7110->arm_ready = 1;
121 static int waitdebi(struct av7110 *av7110, int adr, int state)
125 dprintk(4, "%p\n", av7110);
128 if (irdebi(av7110, DEBINOSWAP, adr, 0, 2) == state)
135 static int load_dram(struct av7110 *av7110, u32 *data, int len)
141 dprintk(4, "%p\n", av7110);
148 if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
153 mwdebi(av7110, DEBISWAB, bootblock,
156 iwdebi(av7110, DEBISWAB, AV7110_BOOT_BASE, swab32(base), 4);
157 iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, AV7110_BOOT_MAX_SIZE, 2);
158 iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
163 if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
168 mwdebi(av7110, DEBISWAB, bootblock,
171 mwdebi(av7110, DEBISWAB, bootblock,
174 iwdebi(av7110, DEBISWAB, AV7110_BOOT_BASE, swab32(base), 4);
175 iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, rest, 2);
176 iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
178 if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_EMPTY) < 0) {
182 iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_SIZE, 0, 2);
183 iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
184 if (waitdebi(av7110, AV7110_BOOT_STATE, BOOTSTATE_AV7110_BOOT_COMPLETE) < 0) {
192 /* we cannot write av7110 DRAM directly, so load a bootloader into
194 int av7110_bootarm(struct av7110 *av7110)
197 const char *fw_name = "av7110/bootcode.bin";
198 struct saa7146_dev *dev = av7110->dev;
202 dprintk(4, "%p\n", av7110);
204 av7110->arm_ready = 0;
209 SAA7146_IER_DISABLE(av7110->dev, MASK_03 | MASK_19);
210 SAA7146_ISR_CLEAR(av7110->dev, MASK_19 | MASK_03);
213 saa7146_write(av7110->dev, MC1, 0x08800880);
214 saa7146_write(av7110->dev, DD1_STREAM_B, 0x00000000);
215 saa7146_write(av7110->dev, MC2, (MASK_09 | MASK_25 | MASK_10 | MASK_26));
218 iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4);
220 iwdebi(av7110, DEBISWAP, DPRAM_BASE, 0x76543210, 4);
222 if ((ret=irdebi(av7110, DEBINOSWAP, DPRAM_BASE, 0, 4)) != 0x10325476) {
228 iwdebi(av7110, DEBISWAP, DPRAM_BASE + i, 0x00, 4);
244 mwdebi(av7110, DEBISWAB, DPRAM_BASE, fw->data, fw->size);
246 iwdebi(av7110, DEBINOSWAP, AV7110_BOOT_STATE, BOOTSTATE_BUFFER_FULL, 2);
248 if (saa7146_wait_for_debi_done(av7110->dev, 1)) {
256 if (load_dram(av7110, (u32 *)av7110->bin_root, av7110->size_root) < 0) {
265 mwdebi(av7110, DEBISWAB, DPRAM_BASE, av7110->bin_dpram, av7110->size_dpram);
267 if (saa7146_wait_for_debi_done(av7110->dev, 1)) {
274 //ARM_ClearIrq(av7110);
275 ARM_ResetMailBox(av7110);
276 SAA7146_ISR_CLEAR(av7110->dev, MASK_19 | MASK_03);
277 SAA7146_IER_ENABLE(av7110->dev, MASK_03);
279 av7110->arm_errors = 0;
280 av7110->arm_ready = 1;
283 MODULE_FIRMWARE("av7110/bootcode.bin");
289 int av7110_wait_msgstate(struct av7110 *av7110, u16 flags)
295 if (FW_VERSION(av7110->arm_app) <= 0x261c) {
305 if (mutex_lock_interruptible(&av7110->dcomlock))
307 stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
308 mutex_unlock(&av7110->dcomlock);
321 static int __av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
330 // dprintk(4, "%p\n", av7110);
332 if (!av7110->arm_ready) {
340 if (rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) == 0)
344 av7110->arm_errors++;
350 if (FW_VERSION(av7110->arm_app) <= 0x261f)
351 wdebi(av7110, DEBINOSWAP, COM_IF_LOCK, 0xffff, 2);
357 if (rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2) == 0)
382 if (FW_VERSION(av7110->arm_app) >= 0x261d) {
397 stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
408 av7110->arm_errors++;
416 wdebi(av7110, DEBINOSWAP, COMMAND + 2 * i, (u32) buf[i], 2);
419 wdebi(av7110, DEBINOSWAP, COMMAND + 2, (u32) buf[1], 2);
421 wdebi(av7110, DEBINOSWAP, COMMAND + 2, 0, 2);
423 wdebi(av7110, DEBINOSWAP, COMMAND, (u32) buf[0], 2);
425 if (FW_VERSION(av7110->arm_app) <= 0x261f)
426 wdebi(av7110, DEBINOSWAP, COM_IF_LOCK, 0x0000, 2);
432 if (rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) == 0)
442 stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
456 static int av7110_send_fw_cmd(struct av7110 *av7110, u16* buf, int length)
460 // dprintk(4, "%p\n", av7110);
462 if (!av7110->arm_ready) {
466 if (mutex_lock_interruptible(&av7110->dcomlock))
469 ret = __av7110_send_fw_cmd(av7110, buf, length);
470 mutex_unlock(&av7110->dcomlock);
477 int av7110_fw_cmd(struct av7110 *av7110, int type, int com, int num, ...)
483 // dprintk(4, "%p\n", av7110);
502 ret = av7110_send_fw_cmd(av7110, buf, num + 2);
509 int av7110_send_ci_cmd(struct av7110 *av7110, u8 subcom, u8 *buf, u8 len)
515 dprintk(4, "%p\n", av7110);
525 ret = av7110_send_fw_cmd(av7110, cmd, 18);
532 int av7110_fw_request(struct av7110 *av7110, u16 *request_buf,
542 dprintk(4, "%p\n", av7110);
544 if (!av7110->arm_ready) {
549 if (mutex_lock_interruptible(&av7110->dcomlock))
552 if ((err = __av7110_send_fw_cmd(av7110, request_buf, request_buf_len)) < 0) {
553 mutex_unlock(&av7110->dcomlock);
561 if (rdebi(av7110, DEBINOSWAP, COMMAND, 0, 2) == 0)
565 mutex_unlock(&av7110->dcomlock);
577 if (rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2) == 0)
581 mutex_unlock(&av7110->dcomlock);
589 stat = rdebi(av7110, DEBINOSWAP, MSGSTATE, 0, 2);
592 mutex_unlock(&av7110->dcomlock);
597 mutex_unlock(&av7110->dcomlock);
603 reply_buf[i] = rdebi(av7110, DEBINOSWAP, COM_BUFF + 2 * i, 0, 2);
605 mutex_unlock(&av7110->dcomlock);
609 static int av7110_fw_query(struct av7110 *av7110, u16 tag, u16* buf, s16 length)
612 ret = av7110_fw_request(av7110, &tag, 0, buf, length);
624 int av7110_firmversion(struct av7110 *av7110)
629 dprintk(4, "%p\n", av7110);
631 if (av7110_fw_query(av7110, tag, buf, 16)) {
633 av7110->dvb_adapter.num);
637 av7110->arm_fw = (buf[0] << 16) + buf[1];
638 av7110->arm_rtsl = (buf[2] << 16) + buf[3];
639 av7110->arm_vid = (buf[4] << 16) + buf[5];
640 av7110->arm_app = (buf[6] << 16) + buf[7];
641 av7110->avtype = (buf[8] << 16) + buf[9];
644 av7110->dvb_adapter.num, av7110->arm_fw,
645 av7110->arm_rtsl, av7110->arm_vid, av7110->arm_app);
648 if (FW_CI_LL_SUPPORT(av7110->arm_app))
650 av7110->dvb_adapter.num);
653 av7110->dvb_adapter.num);
659 int av7110_diseqc_send(struct av7110 *av7110, int len, u8 *msg, unsigned long burst)
665 dprintk(4, "%p\n", av7110);
681 ret = av7110_send_fw_cmd(av7110, buf, 18);
690 static inline int SetColorBlend(struct av7110 *av7110, u8 windownr)
692 return av7110_fw_cmd(av7110, COMTYPE_OSD, SetCBlend, 1, windownr);
695 static inline int SetBlend_(struct av7110 *av7110, u8 windownr,
698 return av7110_fw_cmd(av7110, COMTYPE_OSD, SetBlend, 4,
702 static inline int SetColor_(struct av7110 *av7110, u8 windownr,
705 return av7110_fw_cmd(av7110, COMTYPE_OSD, SetColor, 5,
709 static inline int SetFont(struct av7110 *av7110, u8 windownr, u8 fontsize,
712 return av7110_fw_cmd(av7110, COMTYPE_OSD, Set_Font, 4,
716 static int FlushText(struct av7110 *av7110)
721 if (mutex_lock_interruptible(&av7110->dcomlock))
726 if (rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2) == 0)
731 mutex_unlock(&av7110->dcomlock);
736 mutex_unlock(&av7110->dcomlock);
740 static int WriteText(struct av7110 *av7110, u8 win, u16 x, u16 y, char *buf)
747 if (mutex_lock_interruptible(&av7110->dcomlock))
753 if (rdebi(av7110, DEBINOSWAP, BUFF1_BASE, 0, 2) == 0)
758 mutex_unlock(&av7110->dcomlock);
767 if (rdebi(av7110, DEBINOSWAP, HANDSHAKE_REG, 0, 2) == 0)
772 mutex_unlock(&av7110->dcomlock);
779 wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i * 2,
782 wdebi(av7110, DEBINOSWAP, BUFF1_BASE + i * 2, 0, 2);
783 ret = __av7110_send_fw_cmd(av7110, cbuf, 5);
784 mutex_unlock(&av7110->dcomlock);
790 static inline int DrawLine(struct av7110 *av7110, u8 windownr,
793 return av7110_fw_cmd(av7110, COMTYPE_OSD, DLine, 6,
797 static inline int DrawBlock(struct av7110 *av7110, u8 windownr,
800 return av7110_fw_cmd(av7110, COMTYPE_OSD, DBox, 6,
804 static inline int HideWindow(struct av7110 *av7110, u8 windownr)
806 return av7110_fw_cmd(av7110, COMTYPE_OSD, WHide, 1, windownr);
809 static inline int MoveWindowRel(struct av7110 *av7110, u8 windownr, u16 x, u16 y)
811 return av7110_fw_cmd(av7110, COMTYPE_OSD, WMoveD, 3, windownr, x, y);
814 static inline int MoveWindowAbs(struct av7110 *av7110, u8 windownr, u16 x, u16 y)
816 return av7110_fw_cmd(av7110, COMTYPE_OSD, WMoveA, 3, windownr, x, y);
819 static inline int DestroyOSDWindow(struct av7110 *av7110, u8 windownr)
821 return av7110_fw_cmd(av7110, COMTYPE_OSD, WDestroy, 1, windownr);
824 static inline int CreateOSDWindow(struct av7110 *av7110, u8 windownr,
828 return av7110_fw_cmd(av7110, COMTYPE_OSD, WCreate, 4,
840 static inline int WaitUntilBmpLoaded(struct av7110 *av7110)
842 int ret = wait_event_timeout(av7110->bmpq,
843 av7110->bmp_state != BMP_LOADING, 10*HZ);
846 ret, av7110->bmp_state);
847 av7110->bmp_state = BMP_NONE;
853 static inline int LoadBitmap(struct av7110 *av7110,
863 dprintk(4, "%p\n", av7110);
865 format = bpp2bit[av7110->osdbpp[av7110->osdwin]];
867 av7110->bmp_state = BMP_LOADING;
877 av7110->bmp_state = BMP_NONE;
880 av7110->bmplen = ((dx * dy * bpp + 7) & ~7) / 8;
881 av7110->bmpp = 0;
882 if (av7110->bmplen > 32768) {
883 av7110->bmp_state = BMP_NONE;
887 if (copy_from_user(av7110->bmpbuf + 1024 + i * dx, data + i * inc, dx)) {
888 av7110->bmp_state = BMP_NONE;
894 c = ((u8 *)av7110->bmpbuf)[1024 + i * delta + delta - 1];
896 c |= (((u8 *)av7110->bmpbuf)[1024 + i * delta + d]
898 ((u8 *)av7110->bmpbuf)[1024 + i] = c;
902 av7110->bmplen += 1024;
903 dprintk(4, "av7110_fw_cmd: LoadBmp size %d\n", av7110->bmplen);
904 ret = av7110_fw_cmd(av7110, COMTYPE_OSD, LoadBmp, 3, format, dx, dy);
906 ret = WaitUntilBmpLoaded(av7110);
910 static int BlitBitmap(struct av7110 *av7110, u16 x, u16 y)
912 dprintk(4, "%p\n", av7110);
914 return av7110_fw_cmd(av7110, COMTYPE_OSD, BlitBmp, 4, av7110->osdwin, x, y, 0);
917 static inline int ReleaseBitmap(struct av7110 *av7110)
919 dprintk(4, "%p\n", av7110);
921 if (av7110->bmp_state != BMP_LOADED && FW_VERSION(av7110->arm_app) < 0x261e)
923 if (av7110->bmp_state == BMP_LOADING)
925 av7110->bmp_state = BMP_NONE;
926 return av7110_fw_cmd(av7110, COMTYPE_OSD, ReleaseBmp, 0);
945 static int OSDSetColor(struct av7110 *av7110, u8 color, u8 r, u8 g, u8 b, u8 blend)
955 ret = SetColor_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]],
958 ret = SetBlend_(av7110, av7110->osdwin, bpp2pal[av7110->osdbpp[av7110->osdwin]],
963 static int OSDSetPalette(struct av7110 *av7110, u32 __user * colors, u8 first, u8 last)
980 wdebi(av7110, DEBINOSWAP, DATA_BUFF3_BASE + i * 4, yuv, 4);
982 return av7110_fw_cmd(av7110, COMTYPE_OSD, Set_Palette, 4,
983 av7110->osdwin,
984 bpp2pal[av7110->osdbpp[av7110->osdwin]],
988 static int OSDSetBlock(struct av7110 *av7110, int x0, int y0,
1001 bpp = av7110->osdbpp[av7110->osdwin] + 1;
1008 if (av7110->bmp_state == BMP_LOADING) {
1010 BUG_ON (FW_VERSION(av7110->arm_app) >= 0x261e);
1011 rc = WaitUntilBmpLoaded(av7110);
1021 rc = LoadBitmap(av7110, w, lpb, inc, data);
1024 rc = BlitBitmap(av7110, x0, y0 + i * lpb);
1030 rc = LoadBitmap(av7110, w, brest / bpl, inc, data);
1032 rc = BlitBitmap(av7110, x0, y0 + bnum * lpb);
1034 release_rc = ReleaseBitmap(av7110);
1042 int av7110_osd_cmd(struct av7110 *av7110, osd_cmd_t *dc)
1046 if (mutex_lock_interruptible(&av7110->osd_mutex))
1051 ret = DestroyOSDWindow(av7110, av7110->osdwin);
1054 av7110->osdbpp[av7110->osdwin] = (dc->color - 1) & 7;
1055 ret = CreateOSDWindow(av7110, av7110->osdwin,
1056 bpp2bit[av7110->osdbpp[av7110->osdwin]],
1061 ret = MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0);
1064 ret = SetColorBlend(av7110, av7110->osdwin);
1068 ret = MoveWindowRel(av7110, av7110->osdwin, 0, 0);
1071 ret = HideWindow(av7110, av7110->osdwin);
1074 ret = DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, 0);
1077 ret = DrawBlock(av7110, av7110->osdwin, 0, 0, 720, 576, dc->color);
1080 ret = OSDSetColor(av7110, dc->color, dc->x0, dc->y0, dc->x1, dc->y1);
1083 if (FW_VERSION(av7110->arm_app) >= 0x2618)
1084 ret = OSDSetPalette(av7110, dc->data, dc->color, dc->x0);
1098 ret = OSDSetColor(av7110, dc->color + i, r, g, b, blend);
1105 ret = DrawLine(av7110, av7110->osdwin,
1112 ret = OSDSetBlock(av7110, dc->x0, dc->y0, dc->x1, dc->y1, dc->color, dc->data);
1115 ret = DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0,
1119 ret = DrawBlock(av7110, av7110->osdwin, dc->x0, dc->y0,
1123 ret = DrawLine(av7110, av7110->osdwin,
1137 ret = SetFont(av7110, av7110->osdwin, dc->x1,
1140 ret = FlushText(av7110);
1142 ret = WriteText(av7110, av7110->osdwin, dc->x0, dc->y0, textbuf);
1149 av7110->osdwin = dc->x0;
1154 ret = MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0);
1156 ret = SetColorBlend(av7110, av7110->osdwin);
1164 av7110->osdbpp[av7110->osdwin] = (1 << (dc->color & 3)) - 1;
1166 av7110->osdbpp[av7110->osdwin] = 0;
1167 ret = CreateOSDWindow(av7110, av7110->osdwin, (osd_raw_window_t)dc->color,
1172 ret = MoveWindowAbs(av7110, av7110->osdwin, dc->x0, dc->y0);
1174 ret = SetColorBlend(av7110, av7110->osdwin);
1182 mutex_unlock(&av7110->osd_mutex);
1191 int av7110_osd_capability(struct av7110 *av7110, osd_cap_t *cap)
1195 if (FW_4M_SDRAM(av7110->arm_app))