예제 #1
0
/***************************************************************************
 * zion_edma_set_region
 * @func
 *		set EDMA buffer addresses
 * @args
 *		zion_params_t	*params	[in]:	parameters of ZION driver
 *		int				dma_ch	[in]:	channel
 *		int				num		[in]:	buffer number
 *		unsigned long	lower	[in]:	lower address
 *		unsigned long	upper	[in]:	upper address
 * @return
 * 		int
 * 		   0		:	success
 * 		   -EINVAL	:	invalid argument
 * @comment
 * 		static function
 * @author
 * 		H. Hoshino
 **************************************************************************/
static int
zion_edma_set_region(zion_params_t * params, int dma_ch,
					 int num, unsigned long lower, unsigned long upper)
{
	unsigned short tlower = (unsigned short)( (lower&0x07FF0000L) >> 16 );
	
	/* Check channel number */
	if (dma_ch >= ZION_EDMA_NR_CH)
    {
		PERROR("Invalid EDMA Channel.\n");
		return (-EINVAL);
    }

	/* for DEBUG */
	PDEBUG( "[CH%d Buf%d] lower: 0x%08lX, tlower: 0x%04X, upper: 0x%08lX\n",
			dma_ch, num, lower, tlower, upper );
	
	/* Set addresses */
	mbus_writew(tlower, MBUS_ADDR(params, ZION_MBUS_EDMA_BUFF_LWR_ADRS(dma_ch, num)));
	mbus_writel(upper,  MBUS_ADDR(params, ZION_MBUS_EDMA_BUFF_UPR_ADRS(dma_ch, num)));
	
	return (0);
}
예제 #2
0
int init_zion_vga(void)
{
	int ret;
	zion_params_t *params = find_zion(0);
	u32 off_addr; 

	if(params == NULL){
		return -ENODEV;
	}

	PINFO("ZION VGA Frame Buffer Driver Installed.\n");
	PDEBUG("compiled "__DATE__" "__TIME__"\n");

	//Check Fireball
	if((params->revision & 0xF000) == 0xF000){
		PINFO("This is fireball! ZION VGA cannot be used!!\n");
		return 0;
	}

#ifdef CONFIG_ZION_FB_SETUP

	PINFO("Setting FB Address ... %p and %p\n",
		(void *)CONFIG_ZION_FB_FIRST_ADDR, (void *)CONFIG_ZION_FB_SECOND_ADDR);
	mbus_writel(CONFIG_ZION_FB_FIRST_ADDR, MBUS_ADDR(params,ZIONVGA_BUFFER_BASE_ADDRESS_0));
	mbus_writel(CONFIG_ZION_FB_SECOND_ADDR, MBUS_ADDR(params,ZIONVGA_BUFFER_BASE_ADDRESS_1));

#endif //CONFIG_ZION_FB_SETUP

	//Get VGA FB Region
	off_addr = mbus_readl(MBUS_ADDR(params, ZIONVGA_BUFFER_BASE_ADDRESS_0));
	dma_direction[0] = params->whole_sdram_addr + off_addr;

	PINFO("FB1_BUS_ADDR:%p\n",(void *)dma_direction[0]);

	off_addr = mbus_readl(MBUS_ADDR(params, ZIONVGA_BUFFER_BASE_ADDRESS_1));
	dma_direction[1] =  params->whole_sdram_addr + off_addr;

	PINFO("FB2_BUS_ADDR:%p\n",(void *)dma_direction[1]);

	memset(&zion_fb_info, 0, sizeof(struct zion_vga_info));

	zion_fb_info.ram_address = (unsigned long)__get_free_pages(GFP_KERNEL | __GFP_DMA, ZIONVGA_VRAM_ORDER);

	if(!zion_fb_info.ram_address){
		PERROR("failed get_free_pages(): ram_address\n");
		ret = -ENOMEM;
		goto fail_gfp_fb;
	}

	memset((void *)zion_fb_info.ram_address, 0, ZIONVGA_VRAM_SIZE);

	PDEBUG("ram_address = 0x%08lx (virtual)\n", (unsigned long)zion_fb_info.ram_address);
	PDEBUG("ram_address = 0x%08lx (physical)\n", virt_to_bus((void *)zion_fb_info.ram_address));

	zion_fb_info.fb_info.screen_base = (void __iomem *)zion_fb_info.ram_address;
	zion_fb_info.fb_info.fbops = &zion_vga_ops;

	//setup var_screen_info
	zionvga_encode_var(&default_var);
	zion_fb_info.fb_info.var = default_var;

	zionvga_encode_fix(&zion_fb_info.fb_info.fix);
	zion_fb_info.fb_info.par = &zion_current_par;

	// This should give a reasonable default video mode
	ret = fb_alloc_cmap(&zion_fb_info.fb_info.cmap, 256, 0);
	if(ret){
		PERROR( "failed fb_alloc_cmap()\n" );
		ret = -ENOMEM;
		goto fail_alloc_cmap;
	}

	if(register_framebuffer(&zion_fb_info.fb_info) < 0){ 
		PERROR("failed register_framebuffer()\n");
		ret = -EINVAL;
		goto fail_reg_fb;
	}

	PINFO("fb%d: %s frame buffer device\n",	zion_fb_info.fb_info.node, zion_fb_info.fb_info.fix.id);

	return 0;

fail_reg_fb:
	fb_dealloc_cmap( &zion_fb_info.fb_info.cmap);

fail_alloc_cmap:
	free_pages(zion_fb_info.ram_address, ZIONVGA_VRAM_ORDER);
  
fail_gfp_fb:
	return ret;
}
예제 #3
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;
}