Commit e3fe982b authored by Uwe Kleine-König's avatar Uwe Kleine-König Committed by Thierry Reding

pwm: samsung: Put per-channel data into driver data

Instead of allocating extra data in .request() provide the needed memory
in struct samsung_pwm_chip. This reduces the number of allocations. Even
though now all 5 channel structs are allocated this is probably
outweighed by the reduced overhead to track up to 6 smaller allocations.

Link: https://lore.kernel.org/r/20230705080650.2353391-3-u.kleine-koenig@pengutronix.deSigned-off-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
Signed-off-by: default avatarThierry Reding <thierry.reding@gmail.com>
parent 1b2af7bb
...@@ -88,6 +88,7 @@ struct samsung_pwm_chip { ...@@ -88,6 +88,7 @@ struct samsung_pwm_chip {
struct clk *base_clk; struct clk *base_clk;
struct clk *tclk0; struct clk *tclk0;
struct clk *tclk1; struct clk *tclk1;
struct samsung_pwm_channel channel[SAMSUNG_PWM_NUM];
}; };
#ifndef CONFIG_CLKSRC_SAMSUNG_PWM #ifndef CONFIG_CLKSRC_SAMSUNG_PWM
...@@ -228,7 +229,6 @@ static unsigned long pwm_samsung_calc_tin(struct samsung_pwm_chip *chip, ...@@ -228,7 +229,6 @@ static unsigned long pwm_samsung_calc_tin(struct samsung_pwm_chip *chip,
static int pwm_samsung_request(struct pwm_chip *chip, struct pwm_device *pwm) static int pwm_samsung_request(struct pwm_chip *chip, struct pwm_device *pwm)
{ {
struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip); struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip);
struct samsung_pwm_channel *our_chan;
if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) { if (!(our_chip->variant.output_mask & BIT(pwm->hwpwm))) {
dev_warn(chip->dev, dev_warn(chip->dev,
...@@ -237,20 +237,11 @@ static int pwm_samsung_request(struct pwm_chip *chip, struct pwm_device *pwm) ...@@ -237,20 +237,11 @@ static int pwm_samsung_request(struct pwm_chip *chip, struct pwm_device *pwm)
return -EINVAL; return -EINVAL;
} }
our_chan = kzalloc(sizeof(*our_chan), GFP_KERNEL); memset(&our_chip->channel[pwm->hwpwm], 0, sizeof(our_chip->channel[pwm->hwpwm]));
if (!our_chan)
return -ENOMEM;
pwm_set_chip_data(pwm, our_chan);
return 0; return 0;
} }
static void pwm_samsung_free(struct pwm_chip *chip, struct pwm_device *pwm)
{
kfree(pwm_get_chip_data(pwm));
}
static int pwm_samsung_enable(struct pwm_chip *chip, struct pwm_device *pwm) static int pwm_samsung_enable(struct pwm_chip *chip, struct pwm_device *pwm)
{ {
struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip); struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip);
...@@ -318,7 +309,7 @@ static int __pwm_samsung_config(struct pwm_chip *chip, struct pwm_device *pwm, ...@@ -318,7 +309,7 @@ static int __pwm_samsung_config(struct pwm_chip *chip, struct pwm_device *pwm,
int duty_ns, int period_ns, bool force_period) int duty_ns, int period_ns, bool force_period)
{ {
struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip); struct samsung_pwm_chip *our_chip = to_samsung_pwm_chip(chip);
struct samsung_pwm_channel *chan = pwm_get_chip_data(pwm); struct samsung_pwm_channel *chan = &our_chip->channel[pwm->hwpwm];
u32 tin_ns = chan->tin_ns, tcnt, tcmp, oldtcmp; u32 tin_ns = chan->tin_ns, tcnt, tcmp, oldtcmp;
tcnt = readl(our_chip->base + REG_TCNTB(pwm->hwpwm)); tcnt = readl(our_chip->base + REG_TCNTB(pwm->hwpwm));
...@@ -473,7 +464,6 @@ static int pwm_samsung_apply(struct pwm_chip *chip, struct pwm_device *pwm, ...@@ -473,7 +464,6 @@ static int pwm_samsung_apply(struct pwm_chip *chip, struct pwm_device *pwm,
static const struct pwm_ops pwm_samsung_ops = { static const struct pwm_ops pwm_samsung_ops = {
.request = pwm_samsung_request, .request = pwm_samsung_request,
.free = pwm_samsung_free,
.apply = pwm_samsung_apply, .apply = pwm_samsung_apply,
}; };
...@@ -638,9 +628,9 @@ static int pwm_samsung_resume(struct device *dev) ...@@ -638,9 +628,9 @@ static int pwm_samsung_resume(struct device *dev)
for (i = 0; i < SAMSUNG_PWM_NUM; i++) { for (i = 0; i < SAMSUNG_PWM_NUM; i++) {
struct pwm_device *pwm = &chip->pwms[i]; struct pwm_device *pwm = &chip->pwms[i];
struct samsung_pwm_channel *chan = pwm_get_chip_data(pwm); struct samsung_pwm_channel *chan = &our_chip->channel[i];
if (!chan) if (!(pwm->flags & PWMF_REQUESTED))
continue; continue;
if (our_chip->variant.output_mask & BIT(i)) if (our_chip->variant.output_mask & BIT(i))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment