source: branches/backfire/package/mac80211/patches/580-ath9k_extra_leds.patch @ 29599

Last change on this file since 29599 was 29599, checked in by nbd, 5 years ago

mac80211: backport from trunk

File size: 6.7 KB
  • drivers/net/wireless/ath/ath9k/ath9k.h

    a b void ath9k_btcoex_timer_pause(struct ath 
    474474#ifdef CONFIG_MAC80211_LEDS 
    475475void ath_init_leds(struct ath_softc *sc); 
    476476void ath_deinit_leds(struct ath_softc *sc); 
     477int ath_create_gpio_led(struct ath_softc *sc, int gpio, const char *name, 
     478                        const char *trigger, bool active_low); 
     479 
    477480#else 
    478481static inline void ath_init_leds(struct ath_softc *sc) 
    479482{ 
    struct ath9k_vif_iter_data { 
    594597        int nothers;   /* number of vifs not specified above. */ 
    595598}; 
    596599 
     600struct ath_led { 
     601        struct list_head list; 
     602        struct ath_softc *sc; 
     603        const struct gpio_led *gpio; 
     604        struct led_classdev cdev; 
     605}; 
     606 
    597607struct ath_softc { 
    598608        struct ieee80211_hw *hw; 
    599609        struct device *dev; 
    struct ath_softc { 
    637647        struct ieee80211_supported_band sbands[IEEE80211_NUM_BANDS]; 
    638648 
    639649#ifdef CONFIG_MAC80211_LEDS 
    640         bool led_registered; 
    641         char led_name[32]; 
    642         struct led_classdev led_cdev; 
     650        const char *led_default_trigger; 
     651        struct list_head leds; 
    643652#endif 
    644653 
    645654        struct ath9k_hw_cal_data caldata; 
  • drivers/net/wireless/ath/ath9k/gpio.c

    a b  
    2424static void ath_led_brightness(struct led_classdev *led_cdev, 
    2525                               enum led_brightness brightness) 
    2626{ 
    27         struct ath_softc *sc = container_of(led_cdev, struct ath_softc, led_cdev); 
    28         ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, (brightness == LED_OFF)); 
     27        struct ath_led *led = container_of(led_cdev, struct ath_led, cdev); 
     28        struct ath_softc *sc = led->sc; 
     29 
     30        ath9k_ps_wakeup(sc); 
     31        ath9k_hw_set_gpio(sc->sc_ah, led->gpio->gpio, 
     32                          (brightness != LED_OFF) ^ led->gpio->active_low); 
     33        ath9k_ps_restore(sc); 
     34} 
     35 
     36static int ath_add_led(struct ath_softc *sc, struct ath_led *led) 
     37{ 
     38        const struct gpio_led *gpio = led->gpio; 
     39        int ret; 
     40 
     41        led->cdev.name = gpio->name; 
     42        led->cdev.default_trigger = gpio->default_trigger; 
     43        led->cdev.brightness_set = ath_led_brightness; 
     44 
     45        ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &led->cdev); 
     46        if (ret < 0) 
     47                return ret; 
     48 
     49        led->sc = sc; 
     50        list_add(&led->list, &sc->leds); 
     51 
     52        /* Configure gpio for output */ 
     53        ath9k_hw_cfg_output(sc->sc_ah, gpio->gpio, 
     54                            AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 
     55 
     56        /* LED off */ 
     57        ath9k_hw_set_gpio(sc->sc_ah, gpio->gpio, gpio->active_low); 
     58 
     59        return 0; 
     60} 
     61 
     62int ath_create_gpio_led(struct ath_softc *sc, int gpio_num, const char *name, 
     63                        const char *trigger, bool active_low) 
     64{ 
     65        struct ath_led *led; 
     66        struct gpio_led *gpio; 
     67        char *_name; 
     68        int ret; 
     69 
     70        led = kzalloc(sizeof(*led) + sizeof(*gpio) + strlen(name) + 1, 
     71                      GFP_KERNEL); 
     72        if (!led) 
     73                return -ENOMEM; 
     74 
     75        led->gpio = gpio = (struct gpio_led *) (led + 1); 
     76        _name = (char *) (led->gpio + 1); 
     77 
     78        strcpy(_name, name); 
     79        gpio->name = _name; 
     80        gpio->gpio = gpio_num; 
     81        gpio->active_low = active_low; 
     82        gpio->default_trigger = trigger; 
     83 
     84        ret = ath_add_led(sc, led); 
     85        if (unlikely(ret < 0)) 
     86                kfree(led); 
     87 
     88        return ret; 
    2989} 
    3090 
    3191void ath_deinit_leds(struct ath_softc *sc) 
    3292{ 
    33         if (!sc->led_registered) 
    34                 return; 
     93        struct ath_led *led; 
    3594 
    36         ath_led_brightness(&sc->led_cdev, LED_OFF); 
    37         led_classdev_unregister(&sc->led_cdev); 
     95        while (!list_empty(&sc->leds)) { 
     96                led = list_first_entry(&sc->leds, struct ath_led, list); 
     97                list_del(&led->list); 
     98                ath_led_brightness(&led->cdev, LED_OFF); 
     99                led_classdev_unregister(&led->cdev); 
     100                kfree(led); 
     101        } 
    38102} 
    39103 
    40104void ath_init_leds(struct ath_softc *sc) 
    41105{ 
    42         int ret; 
     106        char led_name[32]; 
     107        const char *trigger; 
     108 
     109        INIT_LIST_HEAD(&sc->leds); 
    43110 
    44111        if (AR_SREV_9100(sc->sc_ah)) 
    45112                return; 
    void ath_init_leds(struct ath_softc *sc) 
    57124                        sc->sc_ah->led_pin = ATH_LED_PIN_DEF; 
    58125        } 
    59126 
    60         /* Configure gpio 1 for output */ 
    61         ath9k_hw_cfg_output(sc->sc_ah, sc->sc_ah->led_pin, 
    62                             AR_GPIO_OUTPUT_MUX_AS_OUTPUT); 
    63         /* LED off, active low */ 
    64         ath9k_hw_set_gpio(sc->sc_ah, sc->sc_ah->led_pin, 1); 
    65  
    66         if (!led_blink) 
    67                 sc->led_cdev.default_trigger = 
    68                         ieee80211_get_radio_led_name(sc->hw); 
    69  
    70         snprintf(sc->led_name, sizeof(sc->led_name), 
    71                 "ath9k-%s", wiphy_name(sc->hw->wiphy)); 
    72         sc->led_cdev.name = sc->led_name; 
    73         sc->led_cdev.brightness_set = ath_led_brightness; 
     127        snprintf(led_name, sizeof(led_name), "ath9k-%s", 
     128                 wiphy_name(sc->hw->wiphy)); 
    74129 
    75         ret = led_classdev_register(wiphy_dev(sc->hw->wiphy), &sc->led_cdev); 
    76         if (ret < 0) 
    77                 return; 
     130        if (led_blink) 
     131                trigger = sc->led_default_trigger; 
     132        else 
     133                trigger = ieee80211_get_radio_led_name(sc->hw); 
    78134 
    79         sc->led_registered = true; 
     135        ath_create_gpio_led(sc, sc->sc_ah->led_pin, led_name, trigger, 1); 
    80136} 
    81137#endif 
    82138 
  • drivers/net/wireless/ath/ath9k/init.c

    a b int ath9k_init_device(u16 devid, struct  
    803803 
    804804#ifdef CONFIG_MAC80211_LEDS 
    805805        /* must be initialized before ieee80211_register_hw */ 
    806         sc->led_cdev.default_trigger = ieee80211_create_tpt_led_trigger(sc->hw, 
     806        sc->led_default_trigger = ieee80211_create_tpt_led_trigger(sc->hw, 
    807807                IEEE80211_TPT_LEDTRIG_FL_RADIO, ath9k_tpt_blink, 
    808808                ARRAY_SIZE(ath9k_tpt_blink)); 
    809809#endif 
  • drivers/net/wireless/ath/ath9k/debug.c

    a b static const struct file_operations fops 
    13041304        .llseek = default_llseek, 
    13051305}; 
    13061306 
     1307#ifdef CONFIG_MAC80211_LEDS 
     1308 
     1309static ssize_t write_file_gpio_led(struct file *file, const char __user *ubuf, 
     1310                                   size_t count, loff_t *ppos) 
     1311{ 
     1312        struct ath_softc *sc = file->private_data; 
     1313        char buf[32], *str, *name, *c; 
     1314        ssize_t len; 
     1315        unsigned int gpio; 
     1316        bool active_low = false; 
     1317 
     1318        len = min(count, sizeof(buf) - 1); 
     1319        if (copy_from_user(buf, ubuf, len)) 
     1320                return -EFAULT; 
     1321 
     1322        buf[len] = '\0'; 
     1323        name = strchr(buf, ','); 
     1324        if (!name) 
     1325                return -EINVAL; 
     1326 
     1327        *(name++) = 0; 
     1328        if (!*name) 
     1329                return -EINVAL; 
     1330 
     1331        c = strchr(name, '\n'); 
     1332        if (c) 
     1333                *c = 0; 
     1334 
     1335        str = buf; 
     1336        if (*str == '!') { 
     1337                str++; 
     1338                active_low = true; 
     1339        } 
     1340 
     1341        if (kstrtouint(str, 0, &gpio) < 0) 
     1342                return -EINVAL; 
     1343 
     1344        if (gpio >= sc->sc_ah->caps.num_gpio_pins) 
     1345                return -EINVAL; 
     1346 
     1347        if (ath_create_gpio_led(sc, gpio, name, NULL, active_low) < 0) 
     1348                return -EINVAL; 
     1349 
     1350        return count; 
     1351} 
     1352 
     1353static const struct file_operations fops_gpio_led = { 
     1354        .write = write_file_gpio_led, 
     1355        .open = ath9k_debugfs_open, 
     1356        .owner = THIS_MODULE, 
     1357        .llseek = default_llseek, 
     1358}; 
     1359 
     1360#endif 
     1361 
    13071362void ath9k_debug_samp_bb_mac(struct ath_softc *sc) 
    13081363{ 
    13091364#define ATH_SAMP_DBG(c) (sc->debug.bb_mac_samp[sc->debug.sampidx].c) 
    int ath9k_init_debug(struct ath_hw *ah) 
    17251780        debugfs_create_file("samples", S_IRUSR, sc->debug.debugfs_phy, sc, 
    17261781                            &fops_samps); 
    17271782 
     1783#ifdef CONFIG_MAC80211_LEDS 
     1784        debugfs_create_file("gpio_led", S_IWUSR, 
     1785                           sc->debug.debugfs_phy, sc, &fops_gpio_led); 
     1786#endif 
     1787 
    17281788        debugfs_create_u32("gpio_mask", S_IRUSR | S_IWUSR, 
    17291789                           sc->debug.debugfs_phy, &sc->sc_ah->gpio_mask); 
    17301790 
Note: See TracBrowser for help on using the repository browser.