/** make proc filesystem **/ int zion_proc_read(char *buf, char **start, off_t offset, int length, int *eof, void *data) { zion_params_t *zion_params; int j; u32 val=0; u16 revision; int len=0; zion_params = find_zion(0); if(zion_params==NULL) { return 0; } revision = mbus_readw(MBUS_ADDR(zion_params,0)); len += sprintf(buf+len, "ZION (Rev. %04X):\n" " Base Address:\n" " MBusAddr=0x%X(%d byte) WorkRAM=0x%X(%d byte)\n" " SDRAM=0x%X(%d byte) Partial-SDRAM=0x%X(%d byte)\n" " Resources:\n" " Bus=%d Dev=%d Func=%d IRQ=%d\n" " Driver:\n" " Version: %s.%s.%s\n", revision, zion_params->mbus_addr, zion_params->mbus_size, zion_params->wram_addr, zion_params->wram_size, zion_params->whole_sdram_addr, zion_params->whole_sdram_size, zion_params->partial_sdram_addr, zion_params->partial_sdram_size, (zion_params->dev->bus)->number, (zion_params->dev->devfn) >> 3, (zion_params->dev->devfn) & 0x07,zion_params->dev->irq, ZIONDRV_MAJOR_VER, ZIONDRV_MINOR_VER, ZIONDRV_PATCH_LEV); len += sprintf(buf + len," (VENDOR_ID=%04X,", zion_params->dev->vendor); len += sprintf(buf + len," DEVICE_ID=%04X)\n", zion_params->dev->device); len+= sprintf(buf+len, " PCI Config Regs. : \n"); for (j = 0; j < 256; j += 4) { if ((j % 32) == 0) { len += sprintf(buf + len,"0x%02X : ", j); } pci_read_config_dword(zion_params->dev, j, &val); len += sprintf(buf + len,"%08X ", val); if ((j % 32) == 28) { len += sprintf(buf + len,"\n"); } } len -= offset; if(len < length) { *eof = 1; if(len <= 0) return 0; } else { len = length; } *start = buf + offset; return len; }
int zion_set_params(struct zionvga_reset_arg *reset_arg) { u16 reg = 0; int pal_line = reset_arg->pal_line; int spl_line = reset_arg->spl_line; zion_params_t *params = find_zion(0); if(params == NULL){ return -ENODEV; } reg = mbus_readw(MBUS_ADDR(params,ZIONVGA_VGA_SETTING)); reg &= VGA_RSTR_EN; //Don't touch VGA_RSTR_EN bit (It should be set by TX) if(pal_line==576) { reg |= PAL_LINE_SEL; ZIONVGA_Y_RES = 576; } else if(pal_line==480) { reg &= ~PAL_LINE_SEL; ZIONVGA_Y_RES = 480; } else { PERROR("Unsupported VGA SIZE : PAL-Line=%d",pal_line); return -EINVAL; } if(spl_line==720) { reg |= SPL_SEL; ZIONVGA_X_RES = 720; } else if(spl_line==640) { reg &= ~SPL_SEL; ZIONVGA_X_RES = 640; } else { PERROR("Unsupported VGA SIZE : SPL-Line=%d",spl_line); return -EINVAL; } #if defined(CONFIG_P2PF_K240) || defined(CONFIG_P2PF_K202) || defined(CONFIG_P2PF_K246A) reg |= (CSC_EN); #else reg |= (CSC_EN|TRS_ON); #endif //CONFIG_P2PF_K240 || CONFIG_P2PF_K246A mbus_writew(reg, MBUS_ADDR(params,ZIONVGA_VGA_SETTING)); // Just for assurance reg = mbus_readw(MBUS_ADDR(params,ZIONVGA_VGA_SETTING)); zionvga_encode_var( &default_var ); zion_fb_info.fb_info.var = default_var; return 0; }
static int zion_common_ioctl(zion_params_t *zion_params, struct inode *inode, struct file *filp, unsigned int function, unsigned long arg) { struct zion_config_byte zion_config_byte = {0}; struct zion_config_word zion_config_word = {0}; struct zion_config_dword zion_config_dword = {0}; struct zion_buf zion_buf; struct ZION_Interrupt_Bits zion_interrupt = {0}; u16 revision; switch(function) { case ZION_MBUS_READ_CONFIG_BYTE: if(copy_from_user((void *)&zion_config_byte, (void *)arg, sizeof(struct zion_config_byte))) return -EFAULT; zion_config_byte.val = (u8) mbus_readb( MBUS_ADDR(zion_params, zion_config_byte.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_byte, sizeof(struct zion_config_byte))) return -EFAULT; break; case ZION_MBUS_READ_CONFIG_WORD: if(copy_from_user((void *)&zion_config_word, (void *)arg, sizeof(struct zion_config_word))) return -EFAULT; zion_config_word.val = (u16) mbus_readw( MBUS_ADDR(zion_params,zion_config_word.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_word, sizeof(struct zion_config_word))) return -EFAULT; break; case ZION_MBUS_READ_CONFIG_DWORD: if(copy_from_user((void *)&zion_config_dword, (void *)arg, sizeof(struct zion_config_dword))) return -EFAULT; zion_config_dword.val = (u32) mbus_readl( MBUS_ADDR(zion_params,zion_config_dword.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_dword, sizeof(struct zion_config_dword))) return -EFAULT; break; case ZION_MBUS_WRITE_CONFIG_BYTE: if(copy_from_user((void *)&zion_config_byte, (void *)arg, sizeof(struct zion_config_byte))) return -EFAULT; mbus_writeb(zion_config_byte.val, MBUS_ADDR(zion_params, zion_config_byte.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_byte, sizeof(struct zion_config_byte))) return -EFAULT; break; case ZION_MBUS_WRITE_CONFIG_WORD: if(copy_from_user((void *)&zion_config_word, (void *)arg, sizeof(struct zion_config_word))) return -EFAULT; mbus_writew(zion_config_word.val, MBUS_ADDR(zion_params, zion_config_word.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_word, sizeof(struct zion_config_word))) return -EFAULT; break; case ZION_MBUS_WRITE_CONFIG_DWORD: if(copy_from_user((void *)&zion_config_dword, (void *)arg, sizeof(struct zion_config_dword))) return -EFAULT; mbus_writel(zion_config_dword.val, MBUS_ADDR(zion_params, zion_config_dword.where) ); if(copy_to_user((void *)arg, (void *)&zion_config_dword, sizeof(struct zion_config_dword))) return -EFAULT; break; case ZION_WRAM_READ: if(copy_from_user((void *)&zion_buf, (void *)arg, sizeof(struct zion_buf))) return -EFAULT; if((zion_buf.size = neo_wram_pio_read(zion_params, zion_buf.addr, zion_buf.buf, zion_buf.size, zion_buf.access_type))==0) return -EINVAL; if(copy_to_user((void *)arg, (void *)&zion_buf, sizeof(struct zion_buf))) return -EFAULT; break; case ZION_WRAM_WRITE: if(copy_from_user((void *)&zion_buf, (void *)arg, sizeof(struct zion_buf))) return -EFAULT; if((zion_buf.size = neo_wram_pio_write(zion_params, zion_buf.addr, zion_buf.buf, zion_buf.size, zion_buf.access_type))==0) return -EINVAL; if(copy_to_user((void *)arg, (void *)&zion_buf, sizeof(struct zion_buf))) return -EFAULT; break; case ZION_WAIT_INTERRUPT: zion_goto_bed(zion_params, &zion_interrupt); /* zion_interrupt.c */ if(copy_to_user((void *)arg, (void *)&zion_interrupt, sizeof(struct ZION_Interrupt_Bits))) return -EFAULT; break; case ZION_WAKE_THREADS_UP: zion_rout_them_up(zion_params); /* zion_interrupt.c */ break; case ZION_SET_ENABLE_BITS: if(copy_from_user((void *)&zion_interrupt, (void *)arg, sizeof(struct ZION_Interrupt_Bits))) return -EFAULT; zion_set_enable_bits(zion_params, &zion_interrupt); /* zion_interrupt.c */ break; case ZION_GET_ENABLE_BITS: zion_get_enable_bits(zion_params, &zion_interrupt); /* zion_interrupt.c */ if(copy_to_user((void *)arg, (void *)&zion_interrupt, sizeof(struct ZION_Interrupt_Bits))) return -EFAULT; break; case ZION_SET_TIMEOUT: zion_params->wait_timeout = arg; /* by jiffies */ break; case ZION_GET_REVISION: revision = zion_params->revision; if(copy_to_user((void *)arg, (void *)&revision, sizeof(u16))) { return -EFAULT; } break; default: PERROR("No such IOCTL.\n"); return -EINVAL; } return 0; }