docs: def setup(channel, direction, initial=None, pull_up_down=None):
      """
      You need to set up every channel you are using as an input or an output.
  
      :param channel: the channel based on the numbering system you have specified
          (:py:attr:`GPIO.BOARD`, :py:attr:`GPIO.BCM` or :py:attr:`GPIO.SUNXI`).
      :param direction: whether to treat the GPIO pin as input or output (use only
          :py:attr:`GPIO.IN` or :py:attr:`GPIO.OUT`).
      :param initial: (optional) When supplied and setting up an output pin,
          resets the pin to the value given (can be :py:attr:`0` / :py:attr:`GPIO.LOW` /
          :py:attr:`False` or :py:attr:`1` / :py:attr:`GPIO.HIGH` / :py:attr:`True`).
      :param pull_up_down: (optional) When supplied and setting up an input pin,
          configures the pin to 3.3V (pull-up) or 0V (pull-down) depending on the
          value given (can be :py:attr:`GPIO.PUD_OFF` / :py:attr:`GPIO.PUD_UP` /
          :py:attr:`GPIO.PUD_DOWN`)
  
      To configure a channel as an input:
  
      .. code:: python
  
         GPIO.setup(channel, GPIO.IN)
  
      To set up a channel as an output:
  
      .. code:: python
  
         GPIO.setup(channel, GPIO.OUT)
  
      You can also specify an initial value for your output channel:
  
      .. code:: python
  
         GPIO.setup(channel, GPIO.OUT, initial=GPIO.HIGH)
  
      **Setup more than one channel:**
      You can set up more than one channel per call. For example:
  
      .. code:: python
  
         chan_list = [11,12]    # add as many channels as you want!
                                # you can tuples instead i.e.:
                                #   chan_list = (11,12)
         GPIO.setup(chan_list, GPIO.OUT)
      """
      if _mode is None:
          raise RuntimeError("Mode has not been set")
  
      if pull_up_down is not None:
          if _gpio_warnings:
              warnings.warn("Pull up/down setting are not (yet) fully supported, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.", stacklevel=2)
  
      if isinstance(channel, list):
          for ch in channel:
              setup(ch, direction, initial)
      else:
          if channel in _exports:
              raise RuntimeError("Channel {0} is already configured".format(channel))
          pin = get_gpio_pin(_mode, channel)
          try:
              sysfs.export(pin)
          except (OSError, IOError) as e:
              if e.errno == 16:   # Device or resource busy
                  if _gpio_warnings:
                      warnings.warn("Channel {0} is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.".format(channel), stacklevel=2)
                  sysfs.unexport(pin)
                  sysfs.export(pin)
              else:
                  raise e
  
          sysfs.direction(pin, direction)
          _exports[channel] = direction
          if direction == OUT and initial is not None:
              sysfs.output(pin, initial)