static int __init spi_probe(struct platform_device *pdev)
{
	struct ssc_pio_t *pio_info =
			(struct ssc_pio_t *)pdev->dev.platform_data;
	struct spi_master *master;
	struct spi_stm_gpio *st_bitbang;

	dgb_print("\n");
	master = spi_alloc_master(&pdev->dev, sizeof(struct spi_stm_gpio));
	if (!master)
		return -1;

	st_bitbang = spi_master_get_devdata(master);
	if (!st_bitbang)
		return -1;

	platform_set_drvdata(pdev, st_bitbang);
	st_bitbang->bitbang.master = master;
	st_bitbang->bitbang.master->setup = spi_stmpio_setup;
	st_bitbang->bitbang.setup_transfer = spi_stmpio_setup_transfer;
	st_bitbang->bitbang.chipselect = spi_stpio_chipselect;
	st_bitbang->bitbang.txrx_word[SPI_MODE_0] = spi_gpio_txrx_mode0;
	st_bitbang->bitbang.txrx_word[SPI_MODE_1] = spi_gpio_txrx_mode1;
	st_bitbang->bitbang.txrx_word[SPI_MODE_2] = spi_gpio_txrx_mode2;
	st_bitbang->bitbang.txrx_word[SPI_MODE_3] = spi_gpio_txrx_mode3;

	if (pio_info->chipselect)
		st_bitbang->bitbang.chipselect = (void (*)
						  (struct spi_device *, int))
			(pio_info->chipselect);
	else
		st_bitbang->bitbang.chipselect = spi_stpio_chipselect;

	master->num_chipselect = SPI_NO_CHIPSELECT + 1;
	master->bus_num = pdev->id;
	st_bitbang->max_speed_hz = SPI_STMPIO_MAX_SPEED_HZ;

	pio_info->clk = stpio_request_pin(pio_info->pio[0].pio_port,
					  pio_info->pio[0].pio_pin,
					  "SPI Clock", STPIO_OUT);
	if (!pio_info->clk) {
		printk(KERN_ERR NAME " Faild to clk pin allocation PIO%d[%d]\n",
		       pio_info->pio[0].pio_port, pio_info->pio[0].pio_pin);
		return -1;
	}
	pio_info->sdout = stpio_request_pin(pio_info->pio[1].pio_port,
					    pio_info->pio[1].pio_pin,
					    "SPI Data Out", STPIO_OUT);
	if (!pio_info->sdout) {
		printk(KERN_ERR NAME " Faild to sda pin allocation PIO%d[%d]\n",
		       pio_info->pio[1].pio_port, pio_info->pio[1].pio_pin);
		return -1;
	}
	pio_info->sdin = stpio_request_pin(pio_info->pio[2].pio_port,
					   pio_info->pio[2].pio_pin,
					   "SPI Data In", STPIO_IN);
	if (!pio_info->sdin) {
		printk(KERN_ERR NAME " Faild to sdo pin allocation PIO%d[%d]\n",
		       pio_info->pio[1].pio_port, pio_info->pio[1].pio_pin);
		return -1;
	}

	stpio_set_pin(pio_info->clk, 0);
	stpio_set_pin(pio_info->sdout, 0);
	stpio_set_pin(pio_info->sdin, 0);

	if (spi_bitbang_start(&st_bitbang->bitbang)) {
		printk(KERN_ERR NAME
		       "The SPI Core refuses the spi_stm_gpio adapter\n");
		return -1;
	}

	printk(KERN_INFO NAME ": Registered SPI Bus %d: "
	       "SCL [%d,%d], SDO [%d,%d], SDI [%d, %d]\n",
	       master->bus_num,
	       pio_info->pio[0].pio_port, pio_info->pio[0].pio_pin,
	       pio_info->pio[1].pio_port, pio_info->pio[1].pio_pin,
	       pio_info->pio[2].pio_port, pio_info->pio[2].pio_pin);

	return 0;
}
예제 #2
0
int proc_video_switch_write(struct file *file, const char __user *buf, unsigned long count, void *data)
{
	char *page;
	char *myString;
	ssize_t ret = -ENOMEM;
	unsigned long mlen;

	printk("%s %ld - ", __FUNCTION__, count);

	mutex_lock (&(ProcDeviceContext->DvbContext->Lock));

	page = (char *)__get_free_page(GFP_KERNEL);
	if (page)
	{
		ret = -EFAULT;
		if (copy_from_user(page, buf, count))
			goto out;

		myString = (char *) kmalloc(count + 1, GFP_KERNEL);
		strncpy(myString, page, count);

		myString[count] = '\0';

		mlen=count;

		if ((count>0)&&(myString[count-1]=='\n'))
		{
			myString[count-1] = '\0';
			count--;
		}

		printk("proc_video_switch_write >> %s\n", myString);
		if (video_switch_type == 0)
		{
			if (fms6403_in2_sel_pin == NULL)
				fms6403_in2_sel_pin = stpio_request_pin (5, 3, "fms6403_in2_sel_pin", STPIO_OUT);

			if (fms6403_fsel0_pin == NULL)
				fms6403_fsel0_pin = stpio_request_pin (4, 6, "fms6403_fsel0_pin", STPIO_OUT);

			if (fms6403_fsel1_pin == NULL)
				fms6403_fsel1_pin = stpio_request_pin (3, 5, "fms6403_fsel1_pin", STPIO_OUT);

			if (strncmp("scart", myString, count) == 0)
			{
				stpio_set_pin(fms6403_in2_sel_pin,0);//0=rgb 1=yvu
				printk("!!!!!!!!!!!!! SET PAL !!!!!!!!!!!!!!\n");
				video_switch=0;
			}
			else if (strncmp("component1080p", myString, count) == 0)
			{
				stpio_set_pin(fms6403_in2_sel_pin,1);//0=rgb 1=yvu
				stpio_set_pin(fms6403_fsel0_pin,1);//1080p50
				stpio_set_pin(fms6403_fsel1_pin,1);
				printk("!!!!!!!!!!!!! SET Filter Bypass !!!!!!!!!!!!!!\n");
				video_switch=1;
			}
			else if (strncmp("component1080i", myString, count) == 0)
			{
				stpio_set_pin(fms6403_in2_sel_pin,1);//0=rgb 1=yvu
				stpio_set_pin(fms6403_fsel0_pin,0);//720p/1080i
				stpio_set_pin(fms6403_fsel1_pin,1);
				printk("!!!!!!!!!!!!! SET Filter FMS6403 32Mhz !!!!!!!!!!!!!!\n");
				video_switch=2;
			}
			else if (strncmp("component720p", myString, count) == 0)
			{
				stpio_set_pin(fms6403_in2_sel_pin,1);//0=rgb 1=yvu
				stpio_set_pin(fms6403_fsel0_pin,0);//720p/1080i
				stpio_set_pin(fms6403_fsel1_pin,1);
				printk("!!!!!!!!!!!!! SET Filter FMS6403 32Mhz !!!!!!!!!!!!!!\n");
				video_switch=3;
			}
			else if (strncmp("component576p", myString, count) == 0)
			{
				stpio_set_pin(fms6403_in2_sel_pin,1);//0=rgb 1=yvu
				stpio_set_pin(fms6403_fsel0_pin,1);//576p
				stpio_set_pin(fms6403_fsel1_pin,0);
				printk("!!!!!!!!!!!!! SET Filter FMS6403 15Mhz !!!!!!!!!!!!!!\n");
				video_switch=4;
			}
			else if (strncmp("component576i", myString, count) == 0)
			{
				stpio_set_pin(fms6403_in2_sel_pin,1);//0=rgb 1=yvu
				stpio_set_pin(fms6403_fsel0_pin,1);//576p
				stpio_set_pin(fms6403_fsel1_pin,0);
				printk("!!!!!!!!!!!!! SET Filter FMS6403 15Mhz !!!!!!!!!!!!!!\n");
				video_switch=5;
			}
		} //switch type
		if(video_switch_type==1) //bxzb
		{
			if (pin02 == NULL)
				pin02 = stpio_request_pin (0, 2, "pin02", STPIO_OUT);

			if (pin06 == NULL)
				pin06 = stpio_request_pin (0, 6, "pin06", STPIO_OUT);

			if (pin24 == NULL)
				pin24 = stpio_request_pin (2, 4, "pin23", STPIO_OUT);

			//0 0 1 - jest rgb
			//0 0 0 - jest rgb
			stpio_set_pin (pin02, 0);//pin6 - E
			stpio_set_pin (pin06, 0);
			stpio_set_pin (pin24, 1);//1-rgb
		}
		/* always return count to avoid endless loop */
		//ret = count;
		ret = mlen;
		kfree(myString);
	}

out:
	free_page((unsigned long)page);
	mutex_unlock (&(ProcDeviceContext->DvbContext->Lock));
	return ret;
}
static void set_vpp(struct map_info * info, int enable)
{
	stpio_set_pin(vpp_pio, enable);
}