Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

leds: Remove auto blink in 88pm860x

88pm860x supports auto-blink LED in hardware. It messed with
timer trigger. Now disable the auto-blink function.

Signed-off-by: Haojian Zhuang <haojian.zhuang@marvell.com>
Cc: Richard Purdie <rpurdie@rpsys.net>
Signed-off-by: Samuel Ortiz <sameo@linux.intel.com>

authored by

Haojian Zhuang and committed by
Samuel Ortiz
f5d59fc5 0b315884

+28 -95
+28 -95
drivers/leds/leds-88pm860x.c
··· 24 24 #define LED_CURRENT_MASK (0x07 << 5) 25 25 26 26 #define LED_BLINK_ON_MASK (0x07) 27 - #define LED_BLINK_PERIOD_MASK (0x0F << 3) 28 27 #define LED_BLINK_MASK (0x7F) 29 28 30 29 #define LED_BLINK_ON(x) ((x & 0x7) * 66 + 66) 31 - #define LED_BLINK_PERIOD(x) ((x & 0xF) * 530 + 930) 32 30 #define LED_BLINK_ON_MIN LED_BLINK_ON(0) 33 31 #define LED_BLINK_ON_MAX LED_BLINK_ON(0x7) 34 - #define LED_BLINK_PERIOD_MIN LED_BLINK_PERIOD(0) 35 - #define LED_BLINK_PERIOD_MAX LED_BLINK_PERIOD(0xE) 32 + #define LED_ON_CONTINUOUS (0x0F << 3) 36 33 #define LED_TO_ON(x) ((x - 66) / 66) 37 - #define LED_TO_PERIOD(x) ((x - 930) / 530) 38 34 39 35 #define LED1_BLINK_EN (1 << 1) 40 36 #define LED2_BLINK_EN (1 << 2) 41 - 42 - enum { 43 - SET_BRIGHTNESS, 44 - SET_BLINK, 45 - }; 46 37 47 38 struct pm860x_led { 48 39 struct led_classdev cdev; ··· 45 54 46 55 int port; 47 56 int iset; 48 - int command; 49 - int offset; 50 57 unsigned char brightness; 51 58 unsigned char current_brightness; 52 59 ··· 84 95 case PM8606_LED1_GREEN: 85 96 case PM8606_LED1_BLUE: 86 97 ret = PM8606_RGB1A; 98 + break; 87 99 case PM8606_LED2_RED: 88 100 case PM8606_LED2_GREEN: 89 101 case PM8606_LED2_BLUE: 90 102 ret = PM8606_RGB2A; 103 + break; 91 104 } 92 105 return ret; 93 106 } ··· 113 122 return ret; 114 123 } 115 124 116 - static int __led_set(struct pm860x_led *led, int command) 117 - { 118 - struct pm860x_chip *chip = led->chip; 119 - int mask, ret; 120 - 121 - mutex_lock(&led->lock); 122 - switch (command) { 123 - case SET_BRIGHTNESS: 124 - if ((led->current_brightness == 0) && led->brightness) { 125 - if (led->iset) { 126 - ret = pm860x_set_bits(led->i2c, led->offset, 127 - LED_CURRENT_MASK, led->iset); 128 - if (ret < 0) 129 - goto out; 130 - } 131 - } else if (led->brightness == 0) { 132 - ret = pm860x_set_bits(led->i2c, led->offset, 133 - LED_CURRENT_MASK, 0); 134 - if (ret < 0) 135 - goto out; 136 - } 137 - ret = pm860x_set_bits(led->i2c, led->offset, LED_PWM_MASK, 138 - led->brightness); 139 - if (ret < 0) 140 - goto out; 141 - led->current_brightness = led->brightness; 142 - dev_dbg(chip->dev, "Update LED. (reg:%d, brightness:%d)\n", 143 - led->offset, led->brightness); 144 - break; 145 - case SET_BLINK: 146 - ret = pm860x_set_bits(led->i2c, led->offset, 147 - LED_BLINK_MASK, led->blink_data); 148 - if (ret < 0) 149 - goto out; 150 - 151 - mask = __blink_ctl_mask(led->port); 152 - ret = pm860x_set_bits(led->i2c, PM8606_WLED3B, mask, mask); 153 - if (ret < 0) 154 - goto out; 155 - dev_dbg(chip->dev, "LED blink delay on:%dms, delay off:%dms\n", 156 - led->blink_on, led->blink_off); 157 - break; 158 - } 159 - out: 160 - mutex_unlock(&led->lock); 161 - return 0; 162 - } 163 - 164 125 static void pm860x_led_work(struct work_struct *work) 165 126 { 127 + 166 128 struct pm860x_led *led; 129 + struct pm860x_chip *chip; 130 + int mask; 167 131 168 132 led = container_of(work, struct pm860x_led, work); 169 - __led_set(led, led->command); 133 + chip = led->chip; 134 + mutex_lock(&led->lock); 135 + if ((led->current_brightness == 0) && led->brightness) { 136 + if (led->iset) { 137 + pm860x_set_bits(led->i2c, __led_off(led->port), 138 + LED_CURRENT_MASK, led->iset); 139 + } 140 + mask = __blink_ctl_mask(led->port); 141 + pm860x_set_bits(led->i2c, PM8606_WLED3B, mask, mask); 142 + } else if (led->brightness == 0) { 143 + pm860x_set_bits(led->i2c, __led_off(led->port), 144 + LED_CURRENT_MASK, 0); 145 + mask = __blink_ctl_mask(led->port); 146 + pm860x_set_bits(led->i2c, PM8606_WLED3B, mask, 0); 147 + } 148 + pm860x_set_bits(led->i2c, __led_off(led->port), LED_PWM_MASK, 149 + led->brightness); 150 + led->current_brightness = led->brightness; 151 + dev_dbg(chip->dev, "Update LED. (reg:%d, brightness:%d)\n", 152 + __led_off(led->port), led->brightness); 153 + mutex_unlock(&led->lock); 170 154 } 171 155 172 156 static void pm860x_led_set(struct led_classdev *cdev, ··· 149 183 { 150 184 struct pm860x_led *data = container_of(cdev, struct pm860x_led, cdev); 151 185 152 - data->offset = __led_off(data->port); 153 186 data->brightness = value >> 3; 154 - data->command = SET_BRIGHTNESS; 155 187 schedule_work(&data->work); 156 - } 157 - 158 - static int pm860x_led_blink(struct led_classdev *cdev, 159 - unsigned long *delay_on, 160 - unsigned long *delay_off) 161 - { 162 - struct pm860x_led *data = container_of(cdev, struct pm860x_led, cdev); 163 - int period, on; 164 - 165 - on = *delay_on; 166 - if ((on < LED_BLINK_ON_MIN) || (on > LED_BLINK_ON_MAX)) 167 - return -EINVAL; 168 - 169 - on = LED_TO_ON(on); 170 - on = LED_BLINK_ON(on); 171 - 172 - period = on + *delay_off; 173 - if ((period < LED_BLINK_PERIOD_MIN) || (period > LED_BLINK_PERIOD_MAX)) 174 - return -EINVAL; 175 - period = LED_TO_PERIOD(period); 176 - period = LED_BLINK_PERIOD(period); 177 - 178 - data->offset = __blink_off(data->port); 179 - data->blink_on = on; 180 - data->blink_off = period - data->blink_on; 181 - data->blink_data = (period << 3) | data->blink_on; 182 - data->command = SET_BLINK; 183 - schedule_work(&data->work); 184 - 185 - return 0; 186 188 } 187 189 188 190 static int __check_device(struct pm860x_led_pdata *pdata, char *name) ··· 191 257 pm860x_pdata = pdev->dev.parent->platform_data; 192 258 pdata = pm860x_pdata->led; 193 259 } else { 194 - dev_err(&pdev->dev, "missing platform data\n"); 260 + dev_err(&pdev->dev, "No platform data!\n"); 195 261 return -EINVAL; 196 262 } 197 263 ··· 213 279 data->current_brightness = 0; 214 280 data->cdev.name = data->name; 215 281 data->cdev.brightness_set = pm860x_led_set; 216 - data->cdev.blink_set = pm860x_led_blink; 217 282 mutex_init(&data->lock); 218 283 INIT_WORK(&data->work, pm860x_led_work); 219 284