Ejemplo n.º 1
0
static int tpu_pwm_request(struct pwm_chip *chip, struct pwm_device *_pwm)
{
	struct tpu_device *tpu = to_tpu_device(chip);
	struct tpu_pwm_device *pwm;

	if (_pwm->hwpwm >= TPU_CHANNEL_MAX)
		return -EINVAL;

	pwm = kzalloc(sizeof(*pwm), GFP_KERNEL);
	if (pwm == NULL)
		return -ENOMEM;

	pwm->tpu = tpu;
	pwm->channel = _pwm->hwpwm;
	pwm->polarity = PWM_POLARITY_NORMAL;
	pwm->prescaler = 0;
	pwm->period = 0;
	pwm->duty = 0;

	pwm->timer_on = false;

	pwm_set_chip_data(_pwm, pwm);

	return 0;
}
Ejemplo n.º 2
0
static int s3c_pwm_request(struct pwm_chip *chip,
				 struct pwm_device *pwm)
{
	struct s3c_chip *s3c = to_s3c_chip(chip);
	struct s3c_pwm_device *s3c_pwm;
	struct device *dev = chip->dev;
	void __iomem *reg_base = s3c->reg_base;
	unsigned char clk_tin_name[16];
	unsigned char clk_tdiv_name[16];
	static struct clk *clk_timers;
	unsigned int id = pwm->pwm;
	unsigned long flags;
	int ret;

	s3c_pwm = devm_kzalloc(chip->dev, sizeof(*s3c_pwm), GFP_KERNEL);
	if (!s3c_pwm)
		return -ENOMEM;

	/* calculate base of control bits in TCON */
	s3c_pwm->tcon_base = id == 0 ? 0 : (id * 4) + 4;
	s3c_pwm->pwm_id = id;

	s3c_pwm->pwm = pwm;
	pwm_set_chip_data(pwm, s3c_pwm);

	snprintf(clk_tin_name, sizeof(clk_tin_name), "pwm-tin%d", id);
	clk_timers = devm_clk_get(dev, clk_tin_name);
	if (IS_ERR(clk_timers)) {
		dev_err(dev, "failed to get pwm tin clk\n");
		ret = PTR_ERR(clk_timers);
		goto err;
	}
	s3c_pwm->clk_tin = clk_timers;

	snprintf(clk_tdiv_name, sizeof(clk_tdiv_name), "pwm-tdiv%d", id);
	clk_timers = devm_clk_get(dev, clk_tdiv_name);
	if (IS_ERR(clk_timers)) {
		dev_err(dev, "failed to get pwm tdiv clk\n");
		ret = PTR_ERR(clk_timers);
		goto err;
	}
	s3c_pwm->clk_div = clk_timers;

	spin_lock_irqsave(&pwm_spinlock, flags);
	s3c_pwm_init(s3c, s3c_pwm);
	spin_unlock_irqrestore(&pwm_spinlock, flags);

	s3c->s3c_pwm[id] = s3c_pwm;

	pwm_dbg(s3c, "config bits %02x\n",
		(__raw_readl(reg_base + REG_TCON) >> s3c_pwm->tcon_base) & 0x0f);
	return 0;

err:
	devm_kfree(chip->dev, s3c_pwm);
	return ret;
}
Ejemplo n.º 3
0
static int bfin_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
{
	struct bfin_pwm *priv;
	int ret;

	if (pwm->hwpwm >= ARRAY_SIZE(pwm_to_gptimer_per))
		return -EINVAL;

	priv = kzalloc(sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	priv->pin = pwm_to_gptimer_per[pwm->hwpwm];

	ret = peripheral_request(priv->pin, NULL);
	if (ret) {
		kfree(priv);
		return ret;
	}

	pwm_set_chip_data(pwm, priv);

	return 0;
}