lorenzobianconi

Untitled

Nov 2nd, 2024
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Diff 3.20 KB | None | 0 0
  1. diff --git a/drivers/pwm/pwm-airoha.c b/drivers/pwm/pwm-airoha.c
  2. index 4fe55e756839..026f41a5077e 100644
  3. --- a/drivers/pwm/pwm-airoha.c
  4. +++ b/drivers/pwm/pwm-airoha.c
  5. @@ -37,7 +37,12 @@
  6.  #define SERIAL_GPIO_FLASH_MODE_MASK    BIT(1)
  7.  #define SERIAL_GPIO_MODE_74HC164_MASK  BIT(0)
  8.  
  9. -#define REG_GPIO_FLASH_PRD_SET(_n) (0x003c + (((_n) / 2) * 4))
  10. +#define REG_GPIO_FLASH_PRD_SET(_n) (0x003c + (((_n) >> 1) << 2))
  11. +#define GPIO_FLASH_PRD_HIGH_MASK(_n)   \
  12. +   GENMASK(7 + (((_n) % 2) << 4)((_n) % 2) << 4)
  13. +#define GPIO_FLASH_PRD_LOW_MASK(_n)    \
  14. +   GENMASK(15 + (((_n) % 2) << 4), 8 + (((_n) % 2) << 4))
  15. +
  16.  /* Each flash period reg have up to 2 config */
  17.  #define GPIO_FLASH_PRD_LOW_PRD     GENMASK(15, 8)
  18.  #define GPIO_FLASH_PRD_HIGH_PRD        GENMASK(7, 0)
  19. @@ -69,6 +74,9 @@
  20.  #define AIROHA_PWM_NUM_SIPO        17
  21.  #define AIROHA_PWM_MAX_CHANNELS        (AIROHA_PWM_NUM_GPIO + AIROHA_PWM_NUM_SIPO)
  22.  
  23. +#define AIROHA_PWM_FIELD_GET(mask, val)    (((val) & (mask)) >> __ffs(mask))
  24. +#define AIROHA_PWM_FIELD_SET(mask, val)    (((val) << __ffs(mask)) & (mask))
  25. +
  26.  struct airoha_pwm_bucket {
  27.     /* Bitmask of PWM channels using this bucket */
  28.     u64 used;
  29. @@ -231,7 +239,6 @@ static void airoha_pwm_calc_bucket_config(struct airoha_pwm *pc, int bucket,
  30.                       u64 duty_ns, u64 period_ns)
  31.  {
  32.     u32 period_tick, duty_tick, mask, val;
  33. -   u32 duty_val;
  34.  
  35.     duty_tick = airoha_pwm_get_duty_tick_from_ns(duty_ns, period_ns);
  36.     period_tick = mul_u64_u64_div_u64(period_ns, AIROHA_PWM_PERIOD_MAX,
  37. @@ -245,13 +252,15 @@ static void airoha_pwm_calc_bucket_config(struct airoha_pwm *pc, int bucket,
  38.                mask, val);
  39.  
  40.     /* Configure duty cycle */
  41. -   duty_val = FIELD_PREP(GPIO_FLASH_PRD_HIGH_PRD, duty_tick) |
  42. -          FIELD_PREP(GPIO_FLASH_PRD_LOW_PRD,
  43. -                 AIROHA_PWM_DUTY_FULL - duty_tick);
  44. -   mask = GPIO_FLASH_PRD << GPIO_FLASH_PRD_SHIFT(bucket);
  45. -   val = duty_val << GPIO_FLASH_PRD_SHIFT(bucket);
  46. +   val = AIROHA_PWM_FIELD_SET(GPIO_FLASH_PRD_HIGH_MASK(bucket),
  47. +                  duty_tick);
  48.     regmap_update_bits(pc->regmap, REG_GPIO_FLASH_PRD_SET(bucket),
  49. -              mask, val);
  50. +              GPIO_FLASH_PRD_HIGH_MASK(bucket), val);
  51. +
  52. +   val = AIROHA_PWM_FIELD_SET(GPIO_FLASH_PRD_LOW_MASK(bucket),
  53. +                  AIROHA_PWM_DUTY_FULL - duty_tick);
  54. +   regmap_update_bits(pc->regmap, REG_GPIO_FLASH_PRD_SET(bucket),
  55. +              GPIO_FLASH_PRD_LOW_MASK(bucket), val);
  56.  }
  57.  
  58.  static void airoha_pwm_config_flash_map(struct airoha_pwm *pc,
  59. @@ -350,11 +359,9 @@ static int airoha_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
  60.                 struct pwm_state *state)
  61.  {
  62.     struct airoha_pwm *pc = pwmchip_get_drvdata(chip);
  63. -   u32 period_tick, duty_tick;
  64. -   int hwpwm = pwm->hwpwm;
  65. -   u32 addr, val;
  66. +   u32 period_tick, duty_tick, addr, val;
  67. +   int ret, hwpwm = pwm->hwpwm;
  68.     u8 bucket;
  69. -   int ret;
  70.  
  71.     if (hwpwm < AIROHA_PWM_NUM_GPIO) {
  72.         addr = REG_GPIO_FLASH_MAP(hwpwm);
  73. @@ -389,8 +396,8 @@ static int airoha_pwm_get_state(struct pwm_chip *chip, struct pwm_device *pwm,
  74.     if (ret)
  75.         return ret;
  76.  
  77. -   duty_tick = FIELD_GET(GPIO_FLASH_PRD_HIGH_PRD,
  78. -                 val << GPIO_FLASH_PRD_SHIFT(bucket));
  79. +   duty_tick = AIROHA_PWM_FIELD_GET(GPIO_FLASH_PRD_HIGH_MASK(bucket),
  80. +                    val);
  81.     state->duty_cycle = mul_u64_u64_div_u64(duty_tick, state->period,
  82.                         AIROHA_PWM_DUTY_FULL);
  83.  
  84.  
Advertisement
Add Comment
Please, Sign In to add comment