int bcm_hsotgctrl_en_clock(bool on)
{
	int rc = 0;
	struct bcm_hsotgctrl_drv_data *bcm_hsotgctrl_handle =
		local_hsotgctrl_handle;

	if (!bcm_hsotgctrl_handle || !bcm_hsotgctrl_handle->otg_clk)
		return -EIO;

	if (on) {
		bcm_hsotgctrl_handle->allow_suspend = false;
		pr_err("hsotgctrl_clk=on, clk_usage=%d\n",
			clk_get_usage(bcm_hsotgctrl_handle->otg_clk));
		if (!clk_get_usage(bcm_hsotgctrl_handle->otg_clk))
			rc = clk_enable(bcm_hsotgctrl_handle->otg_clk);
	} else {
		pr_err("hsotgctrl_clk=off, clk_usage=%d usb_active:%d\n",
			clk_get_usage(bcm_hsotgctrl_handle->otg_clk),
			bcm_hsotgctrl_handle->usb_active);
		/*
		* Only allow the clock to be shut off by the
		* PMU if usb is not active
		*/
		if (!bcm_hsotgctrl_handle->usb_active) {
			clk_disable(bcm_hsotgctrl_handle->otg_clk);
			bcm_hsotgctrl_handle->allow_suspend = true;
		}
	}

	if (rc)
		dev_warn(bcm_hsotgctrl_handle->dev,
		  "%s: error in controlling clock\n", __func__);

	return rc;
}
Exemplo n.º 2
0
int low_freq_used(void)
{
	if ((clk_get_usage(usb_clk) == 0)
	    && (clk_get_usage(lcdif_clk) == 0))
		return 1;
	else
		return 0;
	}
static ssize_t dump_hsotgctrl(struct device *dev,
	struct device_attribute *attr,
	char *buf)
{
	struct bcm_hsotgctrl_drv_data *hsotgctrl_drvdata = dev_get_drvdata(dev);
	void __iomem *hsotg_ctrl_base = hsotgctrl_drvdata->hsotg_ctrl_base;
	int clk_cnt = clk_get_usage(hsotgctrl_drvdata->otg_clk);

	/* This could be done after USB is unplugged
	 * Turn on AHB clock so registers
	 * can be read even when USB is unplugged
	 */
	if (!clk_cnt)
		bcm_hsotgctrl_en_clock(true);

	pr_info("\nusbotgcontrol: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_USBOTGCONTROL_OFFSET));
	pr_info("\nphy_cfg: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_PHY_CFG_OFFSET));
	pr_info("\nphy_p1ctl: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_PHY_P1CTL_OFFSET));
	pr_info("\nbc11_status: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_BC_STATUS_OFFSET));
	pr_info("\nbc11_cfg: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_BC_CFG_OFFSET));
	pr_info("\ntp_in: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_TP_IN_OFFSET));
	pr_info("\ntp_out: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_TP_OUT_OFFSET));
	pr_info("\nphy_ctrl: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_PHY_CTRL_OFFSET));
	pr_info("\nusbreg: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_USBREG_OFFSET));
	pr_info("\nusbproben: 0x%08X",
		readl(hsotg_ctrl_base +
		    HSOTG_CTRL_USBPROBEN_OFFSET));

	/* We turned on the clock so turn it off */
	if (!clk_cnt)
		bcm_hsotgctrl_en_clock(false);

	return sprintf(buf, "hsotgctrl register dump\n");
}
int bcm_hsotgctrl_get_clk_count(void)
{
	struct bcm_hsotgctrl_drv_data *bcm_hsotgctrl_handle =
		local_hsotgctrl_handle;

	if (NULL == local_hsotgctrl_handle)
		return -ENODEV;

	if (!bcm_hsotgctrl_handle->dev)
		return -EIO;

	return clk_get_usage(bcm_hsotgctrl_handle->otg_clk);
}
static void sdhci_print_critical(struct sdhci_host *host)
{
	struct sdio_dev *dev = sdhci_priv(host);
	int ret = 0;

	if (dev->vdd_sdxc_regulator) {
		ret = irqsafe_is_regulator_enable(dev->vdd_sdxc_regulator);
		printk(KERN_ALERT "regulator enable:%d\n", ret);
	}
	if (dev->vddo_sd_regulator) {
		ret = irqsafe_is_regulator_enable(dev->vddo_sd_regulator);
		printk(KERN_ALERT "sd regulator enable:%d\n", ret);
	}
	ret = clk_get_usage(dev->peri_clk);
	printk(KERN_ALERT "clk use_cnt:%d\n", ret);
	printk(KERN_ALERT "runtime_suspended:%d\n", host->runtime_suspended);
	ret = atomic_read(&dev->dev->power.usage_count);
	printk(KERN_ALERT "pm runtime usage count:%d\n", ret);
}