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;
}
Exemple #2
0
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);
}
Exemple #3
0
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));
}
Exemple #4
0
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));
}
Exemple #5
0
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);
}
Exemple #6
0
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);
}