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