aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@arm.linux.org.uk>2014-04-06 18:20:13 -0400
committerBryan Wu <cooloney@gmail.com>2014-05-08 02:28:07 -0400
commitb795e6d94f2193d5e9087f05c445b069a7aa0dcd (patch)
tree7498c2bf069d0122570bae0fe8b8b0f6916f6658
parent5f7b03dc2ab5f4ca16e5d6bc3e6dcd2953c6fede (diff)
leds: leds-pwm: convert OF parsing code to use led_pwm_add()
Convert the OF parsing code to use the common PWM LED registration code, which means we have a consistent method, and single point where the registration happens for both paths. Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk> Signed-off-by: Bryan Wu <cooloney@gmail.com>
-rw-r--r--drivers/leds/leds-pwm.c62
1 files changed, 23 insertions, 39 deletions
diff --git a/drivers/leds/leds-pwm.c b/drivers/leds/leds-pwm.c
index 203e332967b2..35c1c5f144dc 100644
--- a/drivers/leds/leds-pwm.c
+++ b/drivers/leds/leds-pwm.c
@@ -93,7 +93,7 @@ static void led_pwm_cleanup(struct led_pwm_priv *priv)
93} 93}
94 94
95static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv, 95static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
96 struct led_pwm *led) 96 struct led_pwm *led, struct device_node *child)
97{ 97{
98 struct led_pwm_data *led_data = &priv->leds[priv->num_leds]; 98 struct led_pwm_data *led_data = &priv->leds[priv->num_leds];
99 int ret; 99 int ret;
@@ -107,7 +107,10 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
107 led_data->cdev.max_brightness = led->max_brightness; 107 led_data->cdev.max_brightness = led->max_brightness;
108 led_data->cdev.flags = LED_CORE_SUSPENDRESUME; 108 led_data->cdev.flags = LED_CORE_SUSPENDRESUME;
109 109
110 led_data->pwm = devm_pwm_get(dev, led->name); 110 if (child)
111 led_data->pwm = devm_of_pwm_get(dev, child, NULL);
112 else
113 led_data->pwm = devm_pwm_get(dev, led->name);
111 if (IS_ERR(led_data->pwm)) { 114 if (IS_ERR(led_data->pwm)) {
112 ret = PTR_ERR(led_data->pwm); 115 ret = PTR_ERR(led_data->pwm);
113 dev_err(dev, "unable to request PWM for %s: %d\n", 116 dev_err(dev, "unable to request PWM for %s: %d\n",
@@ -115,6 +118,9 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
115 return ret; 118 return ret;
116 } 119 }
117 120
121 if (child)
122 led_data->period = pwm_get_period(led_data->pwm);
123
118 led_data->can_sleep = pwm_can_sleep(led_data->pwm); 124 led_data->can_sleep = pwm_can_sleep(led_data->pwm);
119 if (led_data->can_sleep) 125 if (led_data->can_sleep)
120 INIT_WORK(&led_data->work, led_pwm_work); 126 INIT_WORK(&led_data->work, led_pwm_work);
@@ -130,53 +136,30 @@ static int led_pwm_add(struct device *dev, struct led_pwm_priv *priv,
130 return ret; 136 return ret;
131} 137}
132 138
133static int led_pwm_create_of(struct platform_device *pdev, 139static int led_pwm_create_of(struct device *dev, struct led_pwm_priv *priv)
134 struct led_pwm_priv *priv)
135{ 140{
136 struct device_node *child; 141 struct device_node *child;
137 int ret; 142 struct led_pwm led;
138 143 int ret = 0;
139 for_each_child_of_node(pdev->dev.of_node, child) {
140 struct led_pwm_data *led_dat = &priv->leds[priv->num_leds];
141 144
142 led_dat->cdev.name = of_get_property(child, "label", 145 memset(&led, 0, sizeof(led));
143 NULL) ? : child->name;
144 146
145 led_dat->pwm = devm_of_pwm_get(&pdev->dev, child, NULL); 147 for_each_child_of_node(dev->of_node, child) {
146 if (IS_ERR(led_dat->pwm)) { 148 led.name = of_get_property(child, "label", NULL) ? :
147 dev_err(&pdev->dev, "unable to request PWM for %s\n", 149 child->name;
148 led_dat->cdev.name);
149 ret = PTR_ERR(led_dat->pwm);
150 goto err;
151 }
152 /* Get the period from PWM core when n*/
153 led_dat->period = pwm_get_period(led_dat->pwm);
154 150
155 led_dat->cdev.default_trigger = of_get_property(child, 151 led.default_trigger = of_get_property(child,
156 "linux,default-trigger", NULL); 152 "linux,default-trigger", NULL);
157 of_property_read_u32(child, "max-brightness", 153 of_property_read_u32(child, "max-brightness",
158 &led_dat->cdev.max_brightness); 154 &led.max_brightness);
159
160 led_dat->cdev.brightness_set = led_pwm_set;
161 led_dat->cdev.brightness = LED_OFF;
162 led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME;
163
164 led_dat->can_sleep = pwm_can_sleep(led_dat->pwm);
165 if (led_dat->can_sleep)
166 INIT_WORK(&led_dat->work, led_pwm_work);
167 155
168 ret = led_classdev_register(&pdev->dev, &led_dat->cdev); 156 ret = led_pwm_add(dev, priv, &led, child);
169 if (ret < 0) { 157 if (ret) {
170 dev_err(&pdev->dev, "failed to register for %s\n",
171 led_dat->cdev.name);
172 of_node_put(child); 158 of_node_put(child);
173 goto err; 159 break;
174 } 160 }
175 priv->num_leds++;
176 } 161 }
177 162
178 return 0;
179err:
180 return ret; 163 return ret;
181} 164}
182 165
@@ -202,12 +185,13 @@ static int led_pwm_probe(struct platform_device *pdev)
202 185
203 if (pdata) { 186 if (pdata) {
204 for (i = 0; i < count; i++) { 187 for (i = 0; i < count; i++) {
205 ret = led_pwm_add(&pdev->dev, priv, &pdata->leds[i]); 188 ret = led_pwm_add(&pdev->dev, priv, &pdata->leds[i],
189 NULL);
206 if (ret) 190 if (ret)
207 break; 191 break;
208 } 192 }
209 } else { 193 } else {
210 ret = led_pwm_create_of(pdev, priv); 194 ret = led_pwm_create_of(&pdev->dev, priv);
211 } 195 }
212 196
213 if (ret) { 197 if (ret) {