mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
pwm: lp3943: Drop usage of pwm_[gs]et_chip_data()
Instead of distributing the driver's bookkeeping over 3 (i.e. LP3943_NUM_PWMS + 1) separately allocated memory chunks, put all together in struct lp3943_pwm. This reduces the number of memory allocations and so fragmentation and maybe even the number of cache misses. Also &lp3943_pwm->pwm_map[pwm->hwpwm] is cheaper to evaluate than pwm_get_chip_data(pwm) as the former is just an addition in machine code while the latter involves a function call. Link: https://lore.kernel.org/r/20230705080650.2353391-5-u.kleine-koenig@pengutronix.de Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de> Signed-off-by: Thierry Reding <thierry.reding@gmail.com>
This commit is contained in:
parent
89c8de78ce
commit
06cc476775
@ -23,6 +23,7 @@ struct lp3943_pwm {
|
||||
struct pwm_chip chip;
|
||||
struct lp3943 *lp3943;
|
||||
struct lp3943_platform_data *pdata;
|
||||
struct lp3943_pwm_map pwm_map[LP3943_NUM_PWMS];
|
||||
};
|
||||
|
||||
static inline struct lp3943_pwm *to_lp3943_pwm(struct pwm_chip *chip)
|
||||
@ -35,13 +36,9 @@ lp3943_pwm_request_map(struct lp3943_pwm *lp3943_pwm, int hwpwm)
|
||||
{
|
||||
struct lp3943_platform_data *pdata = lp3943_pwm->pdata;
|
||||
struct lp3943 *lp3943 = lp3943_pwm->lp3943;
|
||||
struct lp3943_pwm_map *pwm_map;
|
||||
struct lp3943_pwm_map *pwm_map = &lp3943_pwm->pwm_map[hwpwm];
|
||||
int i, offset;
|
||||
|
||||
pwm_map = kzalloc(sizeof(*pwm_map), GFP_KERNEL);
|
||||
if (!pwm_map)
|
||||
return ERR_PTR(-ENOMEM);
|
||||
|
||||
pwm_map->output = pdata->pwms[hwpwm]->output;
|
||||
pwm_map->num_outputs = pdata->pwms[hwpwm]->num_outputs;
|
||||
|
||||
@ -49,10 +46,8 @@ lp3943_pwm_request_map(struct lp3943_pwm *lp3943_pwm, int hwpwm)
|
||||
offset = pwm_map->output[i];
|
||||
|
||||
/* Return an error if the pin is already assigned */
|
||||
if (test_and_set_bit(offset, &lp3943->pin_used)) {
|
||||
kfree(pwm_map);
|
||||
if (test_and_set_bit(offset, &lp3943->pin_used))
|
||||
return ERR_PTR(-EBUSY);
|
||||
}
|
||||
}
|
||||
|
||||
return pwm_map;
|
||||
@ -67,7 +62,7 @@ static int lp3943_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
|
||||
if (IS_ERR(pwm_map))
|
||||
return PTR_ERR(pwm_map);
|
||||
|
||||
return pwm_set_chip_data(pwm, pwm_map);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void lp3943_pwm_free_map(struct lp3943_pwm *lp3943_pwm,
|
||||
@ -80,14 +75,12 @@ static void lp3943_pwm_free_map(struct lp3943_pwm *lp3943_pwm,
|
||||
offset = pwm_map->output[i];
|
||||
clear_bit(offset, &lp3943->pin_used);
|
||||
}
|
||||
|
||||
kfree(pwm_map);
|
||||
}
|
||||
|
||||
static void lp3943_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
|
||||
{
|
||||
struct lp3943_pwm *lp3943_pwm = to_lp3943_pwm(chip);
|
||||
struct lp3943_pwm_map *pwm_map = pwm_get_chip_data(pwm);
|
||||
struct lp3943_pwm_map *pwm_map = &lp3943_pwm->pwm_map[pwm->hwpwm];
|
||||
|
||||
lp3943_pwm_free_map(lp3943_pwm, pwm_map);
|
||||
}
|
||||
@ -159,7 +152,7 @@ static int lp3943_pwm_set_mode(struct lp3943_pwm *lp3943_pwm,
|
||||
static int lp3943_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
|
||||
{
|
||||
struct lp3943_pwm *lp3943_pwm = to_lp3943_pwm(chip);
|
||||
struct lp3943_pwm_map *pwm_map = pwm_get_chip_data(pwm);
|
||||
struct lp3943_pwm_map *pwm_map = &lp3943_pwm->pwm_map[pwm->hwpwm];
|
||||
u8 val;
|
||||
|
||||
if (pwm->hwpwm == 0)
|
||||
@ -178,7 +171,7 @@ static int lp3943_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
|
||||
static void lp3943_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
|
||||
{
|
||||
struct lp3943_pwm *lp3943_pwm = to_lp3943_pwm(chip);
|
||||
struct lp3943_pwm_map *pwm_map = pwm_get_chip_data(pwm);
|
||||
struct lp3943_pwm_map *pwm_map = &lp3943_pwm->pwm_map[pwm->hwpwm];
|
||||
|
||||
/*
|
||||
* LP3943 outputs are open-drain, so the pin should be configured
|
||||
|
Loading…
Reference in New Issue
Block a user