/* 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(); } }
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; }
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; }
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; }