コード例 #1
0
/* specific 8787 power on/off setting for SAARC */
static void wifi_set_power(unsigned int on)
{
	unsigned long wlan_pd_mfp = 0;
	int gpio_power_down = mfp_to_gpio(MFP_PIN_GPIO77);

	wlan_pd_mfp = pxa3xx_mfp_read(gpio_power_down);

	if (on) {
		/* set wlan_pd pin to output high in low power
			mode to ensure 8787 is not power off in low power mode*/
		wlan_pd_mfp |= 0x100;
		pxa3xx_mfp_write(gpio_power_down, wlan_pd_mfp & 0xffff);

		/* enable 32KHz TOUT */
		enable_oscc_tout_s0();
		}
	else {
		/*set wlan_pd pin to output low in low power
			mode to save power in low power mode */
		wlan_pd_mfp &= ~0x100;
		pxa3xx_mfp_write(gpio_power_down, wlan_pd_mfp & 0xffff);

		/* disable 32KHz TOUT */
		disable_oscc_tout_s0();
	}

}
コード例 #2
0
static int si4703_close(struct inode *inode, struct file *file)
{
	struct si4703_device *chip = video_get_drvdata(video_devdata(file));

	unset_radio_dvfm_constraint();

	if (!chip) {
		disable_oscc_tout_s0();
		return -ENODEV;
	}

	if (si4703_power_down(chip))
		printk(KERN_ERR "Radio did not shutdown properly");

	chip->users = 0;
	if (chip->removed)
		kfree(chip);

	/* disable clock */
	disable_oscc_tout_s0();

	return 0;
}
コード例 #3
0
static int si4703_open(struct inode *inode, struct file *file)
{
	struct si4703_device *chip = video_get_drvdata(video_devdata(file));

	set_radio_dvfm_constraint();

	/* enable clock */
	enable_oscc_tout_s0();

	chip->users = 1;
	chip->muted = 1;

	if (si4703_power_up(chip)) {
		printk(KERN_ERR "Radio did not start up properly");
		chip->users = 0;
		disable_oscc_tout_s0();
		return -EIO;
	}
	si4703_setfreq(chip, chip->curfreq);

	return 0;
}
コード例 #4
0
static int si4703_probe(struct i2c_client *client)
{
	uint16_t id;
	int ret;
	struct si4703_device *chip;
	struct si4703_platform_data *pdata = client->dev.platform_data;

	chip = kmalloc(sizeof(struct si4703_device), GFP_KERNEL);
	if (!chip)
		return -ENOMEM;

	chip->videodev = video_device_alloc();
	if (!chip->videodev) {
		kfree(chip);
		return -ENOMEM;
	}
	chip->client = client;
	chip->irq = client->irq;
	init_waitqueue_head(&chip->wait);
	i2c_set_clientdata(client, chip);

	enable_oscc_tout_s0();
	pdata->setup(client, pdata->context);
	if (chip->irq >= 0) {
		ret = request_irq(chip->irq, si4703_irq_handler,
			       IRQF_TRIGGER_FALLING, "si4703", chip);
		if (ret) {
			kfree(chip->videodev);
			kfree(chip);
			printk(KERN_ERR "request IRQ for si4703 failed!\n");
			return ret;
		}
	}

	/* init shadow registers */
	if (si4703_read(chip, REG_READ_START - 1, &id)) {
		free_irq(chip->irq, chip);
		kfree(chip->videodev);
		kfree(chip);
		printk(KERN_ERR "%s: failed to init shadow registers\n",
			      __FUNCTION__);
		disable_oscc_tout_s0();
		return -EIO;
	}
	si4703_power_up(chip);
	ret = si4703_read(chip, REG_CHIPID, &id);
	if (ret)
		printk(KERN_ERR "%s: failed to detect si4703\n",
			      __FUNCTION__);
	else
		printk(KERN_INFO "%s: si4703(0x%04x) detected\n",
				__FUNCTION__, id);
	si4703_power_down(chip);

	/* init volume to maxium */
	chip->curvol = 0xf;

	memcpy(chip->videodev, &si4703_videodev_template,
		sizeof(si4703_videodev_template));
	chip->removed = 0;
	chip->users = 0;
	chip->curfreq = FREQ_MIN*FREQ_MUL;
	video_set_drvdata(chip->videodev, chip);
	if (video_register_device(chip->videodev, VFL_TYPE_RADIO, 0)) {
		printk(KERN_ERR "Could not register video device");
		free_irq(chip->irq, chip);
		video_device_release(chip->videodev);
		kfree(chip->videodev);
		kfree(chip);
		disable_oscc_tout_s0();
		return -EIO;
	}

	disable_oscc_tout_s0();
	return 0;
}