static int get_divider(struct device *dev) { struct fb_info *fb = dev_get_drvdata(dev); struct lcdfreq_info *lcdfreq = dev_get_lcdfreq(dev); struct clksrc_clk *clksrc; struct clk *clk; u32 rate, reg; u8 fimd_div, i; lcdfreq->clksrc = clksrc = get_clksrc(dev->parent); clk = clk_get_parent(&clksrc->clk); rate = clk_get_rate(clk); lcdfreq->table[NORMAL].cmu_div = DIV_ROUND_CLOSEST(rate, lcdfreq->table[NORMAL].vclk); lcdfreq->table[LIMIT].cmu_div = DIV_ROUND_CLOSEST(rate, lcdfreq->table[LIMIT].vclk); if (lcdfreq->table[LIMIT].cmu_div > (1 << clksrc->reg_div.size)) fimd_div = gcd(lcdfreq->table[NORMAL].cmu_div, lcdfreq->table[LIMIT].cmu_div); else fimd_div = 1; dev_info(dev, "%s rate is %d, fimd div=%d\n", clk->name, rate, fimd_div); reg = get_fimd_divider(dev) + 1; if ((!fimd_div) || (fimd_div > 256) || (fimd_div != reg)) { dev_info(dev, "%s skip, fimd div=%d, reg=%d\n", __func__, fimd_div, reg); goto err; } for (i = 0; i < LEVEL_MAX; i++) { lcdfreq->table[i].cmu_div /= fimd_div; if (lcdfreq->table[i].cmu_div > (1 << clksrc->reg_div.size)) { dev_info(fb->dev, "%s skip, cmu div=%d\n", __func__, lcdfreq->table[i].cmu_div); goto err; } dev_info(dev, "%dhz div is %d\n", lcdfreq->table[i].hz, lcdfreq->table[i].cmu_div); lcdfreq->table[i].cmu_div--; } reg = get_div(dev); if (lcdfreq->table[NORMAL].cmu_div != reg) { dev_info(dev, "%s skip, cmu div=%d, reg=%d\n", __func__, lcdfreq->table[NORMAL].cmu_div, reg); goto err; } for (i = 0; i < LEVEL_MAX; i++) { reg = lcdfreq->table[i].cmu_div; lcdfreq->table[i].cmu_div = (reg << clksrc->reg_div.size) | reg; } return 0; err: return -EINVAL; }
static ssize_t freq_show(struct device *dev, struct device_attribute *attr, char *buf) { struct fb_info *fb = dev_get_drvdata(dev); struct s3cfb_window *win = fb->par; struct s3cfb_global *fbdev = get_fimd_global(win->id); struct s3cfb_lcd *lcd = fbdev->lcd; return sprintf(buf, "%dhz, hfp=%d, hbp=%d, hsw=%d, div=%d\n", lcd->freq, lcd->timing.h_fp, lcd->timing.h_bp, lcd->timing.h_sw, get_div(fbdev)+1); }
static ssize_t level_show(struct device *dev, struct device_attribute *attr, char *buf) { struct lcdfreq_info *info = dev_get_lcdfreq(dev); if (!info->enable) { dev_err(info->dev, "%s reject. enable flag is %d\n", __func__, info->enable); return -EINVAL; } return sprintf(buf, "%d, div=%d\n", info->table[info->level].hz, get_div(info->dev)); }
static ssize_t level_show(struct device *dev, struct device_attribute *attr, char *buf) { struct fb_info *fb = dev_get_drvdata(dev); struct s3cfb_window *win = fb->par; struct s3cfb_global *fbdev = get_fimd_global(win->id); struct lcdfreq_info *lcdfreq = fbdev->data; if (unlikely(fbdev->system_state == POWER_OFF || !lcdfreq->enable)) { dev_err(dev, "%s reject. %d, %d\n", __func__, fbdev->system_state, lcdfreq->enable); return -EINVAL; } return sprintf(buf, "%dhz, div=%d\n", lcdfreq->table[lcdfreq->level].hz, get_div(fbdev)); }
static void __init tango4_clkgen_setup(struct device_node *np) { int div, ret; void __iomem *base = of_iomap(np, 0); const char *parent = of_clk_get_parent_name(np, 0); if (!base) panic("%s: invalid address\n", np->full_name); make_pll(0, parent, base); make_pll(1, parent, base); out[0] = clk_register_divider(NULL, "cpuclk", "pll0", 0, base + CPUCLK_CTRL, 8, 8, CLK_DIVIDER_ONE_BASED, NULL); div = readl_relaxed(base + SYSCLK_CTRL) & BIT(23) ? get_div(base) : 4; out[1] = clk_register_fixed_factor(NULL, "sysclk", "pll1", 0, 1, div); ret = of_clk_add_provider(np, of_clk_src_onecell_get, &clk_data); if (IS_ERR(out[0]) || IS_ERR(out[1]) || ret < 0) panic("%s: clk registration failed\n", np->full_name); }
char *ft_itoa(int n) { int tab[20]; char *str; tab[0] = 0; tab[1] = get_size(n); str = (char*)ft_memalloc(sizeof(char) * tab[1] + 1); if (n == 0) return (ft_strdup("0")); if (n == 2147483647) return (ft_strdup("2147483647")); if (n == (-2147483648)) return (ft_strdup("-2147483648")); tab[2] = get_div(n); if (n < 0) { n = -n; str[0] = '-'; tab[0] += 1; } str = ft_fill_str(str, tab, n); return (str); }