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; }
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); }