• Home
  • Raw
  • Download

Lines Matching +full:addr +full:- +full:mode

2  * leds-netxbig.c - Driver for the 2Big and 5Big Network series LEDs
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
31 #include <linux/platform_data/leds-kirkwood-netxbig.h>
39 static void gpio_ext_set_addr(struct netxbig_gpio_ext *gpio_ext, int addr) in gpio_ext_set_addr() argument
43 for (pin = 0; pin < gpio_ext->num_addr; pin++) in gpio_ext_set_addr()
44 gpio_set_value(gpio_ext->addr[pin], (addr >> pin) & 1); in gpio_ext_set_addr()
51 for (pin = 0; pin < gpio_ext->num_data; pin++) in gpio_ext_set_data()
52 gpio_set_value(gpio_ext->data[pin], (data >> pin) & 1); in gpio_ext_set_data()
58 gpio_set_value(gpio_ext->enable, 0); in gpio_ext_enable_select()
59 gpio_set_value(gpio_ext->enable, 1); in gpio_ext_enable_select()
63 int addr, int value) in gpio_ext_set_value() argument
68 gpio_ext_set_addr(gpio_ext, addr); in gpio_ext_set_value()
81 return -EINVAL; in gpio_ext_init()
84 for (i = 0; i < gpio_ext->num_addr; i++) { in gpio_ext_init()
85 err = devm_gpio_request_one(&pdev->dev, gpio_ext->addr[i], in gpio_ext_init()
87 "GPIO extension addr"); in gpio_ext_init()
92 for (i = 0; i < gpio_ext->num_data; i++) { in gpio_ext_init()
93 err = devm_gpio_request_one(&pdev->dev, gpio_ext->data[i], in gpio_ext_init()
100 err = devm_gpio_request_one(&pdev->dev, gpio_ext->enable, in gpio_ext_init()
121 enum netxbig_led_mode mode; member
126 static int netxbig_led_get_timer_mode(enum netxbig_led_mode *mode, in netxbig_led_get_timer_mode() argument
137 *mode = timer[i].mode; in netxbig_led_get_timer_mode()
141 return -EINVAL; in netxbig_led_get_timer_mode()
150 enum netxbig_led_mode mode; in netxbig_led_blink_set() local
154 /* Look for a LED mode with the requested timer frequency. */ in netxbig_led_blink_set()
155 ret = netxbig_led_get_timer_mode(&mode, *delay_on, *delay_off, in netxbig_led_blink_set()
156 led_dat->timer, led_dat->num_timer); in netxbig_led_blink_set()
160 mode_val = led_dat->mode_val[mode]; in netxbig_led_blink_set()
162 return -EINVAL; in netxbig_led_blink_set()
164 spin_lock_irq(&led_dat->lock); in netxbig_led_blink_set()
166 gpio_ext_set_value(led_dat->gpio_ext, led_dat->mode_addr, mode_val); in netxbig_led_blink_set()
167 led_dat->mode = mode; in netxbig_led_blink_set()
169 spin_unlock_irq(&led_dat->lock); in netxbig_led_blink_set()
179 enum netxbig_led_mode mode; in netxbig_led_set() local
184 spin_lock_irqsave(&led_dat->lock, flags); in netxbig_led_set()
187 mode = NETXBIG_LED_OFF; in netxbig_led_set()
190 if (led_dat->sata) in netxbig_led_set()
191 mode = NETXBIG_LED_SATA; in netxbig_led_set()
192 else if (led_dat->mode == NETXBIG_LED_OFF) in netxbig_led_set()
193 mode = NETXBIG_LED_ON; in netxbig_led_set()
194 else /* Keep 'timer' mode. */ in netxbig_led_set()
195 mode = led_dat->mode; in netxbig_led_set()
197 mode_val = led_dat->mode_val[mode]; in netxbig_led_set()
199 gpio_ext_set_value(led_dat->gpio_ext, led_dat->mode_addr, mode_val); in netxbig_led_set()
200 led_dat->mode = mode; in netxbig_led_set()
207 gpio_ext_set_value(led_dat->gpio_ext, in netxbig_led_set()
208 led_dat->bright_addr, value); in netxbig_led_set()
210 spin_unlock_irqrestore(&led_dat->lock, flags); in netxbig_led_set()
221 enum netxbig_led_mode mode; in netxbig_led_sata_store() local
231 spin_lock_irq(&led_dat->lock); in netxbig_led_sata_store()
233 if (led_dat->sata == enable) { in netxbig_led_sata_store()
238 if (led_dat->mode != NETXBIG_LED_ON && in netxbig_led_sata_store()
239 led_dat->mode != NETXBIG_LED_SATA) in netxbig_led_sata_store()
240 mode = led_dat->mode; /* Keep modes 'off' and 'timer'. */ in netxbig_led_sata_store()
242 mode = NETXBIG_LED_SATA; in netxbig_led_sata_store()
244 mode = NETXBIG_LED_ON; in netxbig_led_sata_store()
246 mode_val = led_dat->mode_val[mode]; in netxbig_led_sata_store()
248 ret = -EINVAL; in netxbig_led_sata_store()
252 gpio_ext_set_value(led_dat->gpio_ext, led_dat->mode_addr, mode_val); in netxbig_led_sata_store()
253 led_dat->mode = mode; in netxbig_led_sata_store()
254 led_dat->sata = enable; in netxbig_led_sata_store()
259 spin_unlock_irq(&led_dat->lock); in netxbig_led_sata_store()
271 return sprintf(buf, "%d\n", led_dat->sata); in netxbig_led_sata_show()
287 spin_lock_init(&led_dat->lock); in create_netxbig_led()
288 led_dat->gpio_ext = pdata->gpio_ext; in create_netxbig_led()
289 led_dat->cdev.name = template->name; in create_netxbig_led()
290 led_dat->cdev.default_trigger = template->default_trigger; in create_netxbig_led()
291 led_dat->cdev.blink_set = netxbig_led_blink_set; in create_netxbig_led()
292 led_dat->cdev.brightness_set = netxbig_led_set; in create_netxbig_led()
303 led_dat->sata = 0; in create_netxbig_led()
304 led_dat->cdev.brightness = LED_OFF; in create_netxbig_led()
305 led_dat->cdev.max_brightness = template->bright_max; in create_netxbig_led()
306 led_dat->cdev.flags |= LED_CORE_SUSPENDRESUME; in create_netxbig_led()
307 led_dat->mode_addr = template->mode_addr; in create_netxbig_led()
308 led_dat->mode_val = template->mode_val; in create_netxbig_led()
309 led_dat->bright_addr = template->bright_addr; in create_netxbig_led()
310 led_dat->timer = pdata->timer; in create_netxbig_led()
311 led_dat->num_timer = pdata->num_timer; in create_netxbig_led()
316 if (led_dat->mode_val[NETXBIG_LED_SATA] != NETXBIG_LED_INVALID_MODE) in create_netxbig_led()
317 led_dat->cdev.groups = netxbig_led_groups; in create_netxbig_led()
319 return devm_led_classdev_register(&pdev->dev, &led_dat->cdev); in create_netxbig_led()
326 int *addr, *data; in gpio_ext_get_of_pdata() local
331 ret = of_gpio_named_count(np, "addr-gpios"); in gpio_ext_get_of_pdata()
334 "Failed to count GPIOs in DT property addr-gpios\n"); in gpio_ext_get_of_pdata()
338 addr = devm_kcalloc(dev, num_addr, sizeof(*addr), GFP_KERNEL); in gpio_ext_get_of_pdata()
339 if (!addr) in gpio_ext_get_of_pdata()
340 return -ENOMEM; in gpio_ext_get_of_pdata()
343 ret = of_get_named_gpio(np, "addr-gpios", i); in gpio_ext_get_of_pdata()
346 addr[i] = ret; in gpio_ext_get_of_pdata()
348 gpio_ext->addr = addr; in gpio_ext_get_of_pdata()
349 gpio_ext->num_addr = num_addr; in gpio_ext_get_of_pdata()
351 ret = of_gpio_named_count(np, "data-gpios"); in gpio_ext_get_of_pdata()
354 "Failed to count GPIOs in DT property data-gpios\n"); in gpio_ext_get_of_pdata()
360 return -ENOMEM; in gpio_ext_get_of_pdata()
363 ret = of_get_named_gpio(np, "data-gpios", i); in gpio_ext_get_of_pdata()
368 gpio_ext->data = data; in gpio_ext_get_of_pdata()
369 gpio_ext->num_data = num_data; in gpio_ext_get_of_pdata()
371 ret = of_get_named_gpio(np, "enable-gpio", 0); in gpio_ext_get_of_pdata()
374 "Failed to get GPIO from DT property enable-gpio\n"); in gpio_ext_get_of_pdata()
377 gpio_ext->enable = ret; in gpio_ext_get_of_pdata()
385 struct device_node *np = dev->of_node; in netxbig_leds_get_of_pdata()
397 gpio_ext_np = of_parse_phandle(np, "gpio-ext", 0); in netxbig_leds_get_of_pdata()
399 dev_err(dev, "Failed to get DT handle gpio-ext\n"); in netxbig_leds_get_of_pdata()
400 return -EINVAL; in netxbig_leds_get_of_pdata()
405 return -ENOMEM; in netxbig_leds_get_of_pdata()
410 pdata->gpio_ext = gpio_ext; in netxbig_leds_get_of_pdata()
416 return -EINVAL; in netxbig_leds_get_of_pdata()
421 return -ENOMEM; in netxbig_leds_get_of_pdata()
426 &timers[i].mode); in netxbig_leds_get_of_pdata()
427 if (timers[i].mode >= NETXBIG_LED_MODE_NUM) in netxbig_leds_get_of_pdata()
428 return -EINVAL; in netxbig_leds_get_of_pdata()
436 pdata->timer = timers; in netxbig_leds_get_of_pdata()
437 pdata->num_timer = num_timers; in netxbig_leds_get_of_pdata()
444 return -ENODEV; in netxbig_leds_get_of_pdata()
449 return -ENOMEM; in netxbig_leds_get_of_pdata()
457 ret = of_property_read_u32(child, "mode-addr", in netxbig_leds_get_of_pdata()
458 &led->mode_addr); in netxbig_leds_get_of_pdata()
462 ret = of_property_read_u32(child, "bright-addr", in netxbig_leds_get_of_pdata()
463 &led->bright_addr); in netxbig_leds_get_of_pdata()
467 ret = of_property_read_u32(child, "max-brightness", in netxbig_leds_get_of_pdata()
468 &led->bright_max); in netxbig_leds_get_of_pdata()
477 ret = -ENOMEM; in netxbig_leds_get_of_pdata()
484 ret = of_property_count_u32_elems(child, "mode-val"); in netxbig_leds_get_of_pdata()
486 ret = -EINVAL; in netxbig_leds_get_of_pdata()
491 ret = -EINVAL; in netxbig_leds_get_of_pdata()
496 int mode; in netxbig_leds_get_of_pdata() local
500 "mode-val", 2 * i, &mode); in netxbig_leds_get_of_pdata()
502 "mode-val", 2 * i + 1, &val); in netxbig_leds_get_of_pdata()
503 if (mode >= NETXBIG_LED_MODE_NUM) { in netxbig_leds_get_of_pdata()
504 ret = -EINVAL; in netxbig_leds_get_of_pdata()
507 mode_val[mode] = val; in netxbig_leds_get_of_pdata()
509 led->mode_val = mode_val; in netxbig_leds_get_of_pdata()
512 led->name = string; in netxbig_leds_get_of_pdata()
514 led->name = child->name; in netxbig_leds_get_of_pdata()
517 "linux,default-trigger", &string)) in netxbig_leds_get_of_pdata()
518 led->default_trigger = string; in netxbig_leds_get_of_pdata()
523 pdata->leds = leds; in netxbig_leds_get_of_pdata()
524 pdata->num_leds = num_leds; in netxbig_leds_get_of_pdata()
534 { .compatible = "lacie,netxbig-leds", },
543 return -ENODEV; in netxbig_leds_get_of_pdata()
549 struct netxbig_led_platform_data *pdata = dev_get_platdata(&pdev->dev); in netxbig_led_probe()
555 pdata = devm_kzalloc(&pdev->dev, sizeof(*pdata), GFP_KERNEL); in netxbig_led_probe()
557 return -ENOMEM; in netxbig_led_probe()
558 ret = netxbig_leds_get_of_pdata(&pdev->dev, pdata); in netxbig_led_probe()
563 leds_data = devm_kcalloc(&pdev->dev, in netxbig_led_probe()
564 pdata->num_leds, sizeof(*leds_data), in netxbig_led_probe()
567 return -ENOMEM; in netxbig_led_probe()
569 ret = gpio_ext_init(pdev, pdata->gpio_ext); in netxbig_led_probe()
573 for (i = 0; i < pdata->num_leds; i++) { in netxbig_led_probe()
575 &leds_data[i], &pdata->leds[i]); in netxbig_led_probe()
586 .name = "leds-netxbig",
596 MODULE_ALIAS("platform:leds-netxbig");