[GIT PULL RESEND] SAA716x DVB driver

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Resend this pull request. Apparently my explanation one month ago,
why we need the userspace API of this driver in the current form [1],
got lost.

Regards,
Soeren

[1] https://www.mail-archive.com/linux-media@xxxxxxxxxxxxxxx/msg116119.html



The following changes since commit 5771a8c08880cdca3bfb4a3fc6d309d6bba20877:

  Linux v4.13-rc1 (2017-07-15 15:22:10 -0700)

are available in the git repository at:

  https://github.com/s-moch/linux-saa716x for-media

for you to fetch changes up to 1a9e44df11d702b9f569605e60c7cf8e05923178:

  saa716x: Add MAINTAINERS entry (2017-07-16 15:37:00 +0200)

----------------------------------------------------------------
Andreas Regel (127):
      saa716x: Simplified the code for I2C transfers.
      saa716x: Transport stream ports can be configured now.
      saa716x_ff: Disable frontend support through STi7109 firmware.
      saa716x_ff: Initialize the frontend of the TT S2-6400.
      saa716x_ff: Add VIDEO_GET_PTS ioctl.
      saa716x_ff: Add audio device for TT S2-6400.
      saa716x_ff: Use separate interrupts for OSD commands.
      saa716x_ff: Use third TS input of the STi7109 for playback
      saa716x_ff: Set error code when boot of firmware failed.
      saa716x_ff: Added 10ms sleep after configuring the FPGA.
      saa716x: Reduce compiler warnings
      saa716x: fix kernel oops caused by missing initialisation
      saa716x: fixed double frontend detach
      saa716x: 1ms is enough when waiting for the PLL
      saa716x_ff: Adapted frontend init to latest driver changes.
      saa716x: Improve PHI performance by shorten timings a bit.
      saa716x_ff: use double buffering for block transfers.
      saa716x_ff: Reset block_done after receiving it.
      saa716x_ff: add interrupt source for firmware log messages
      saa716x_ff: read FPGA version register
      saa716x_ff: fixed PTS/STC signed/unsigned issue
      saa716x_ff: query and print loader and firmware versions
      saa716x: disable debug printk
      osd.h: Add const keyword to struct members
      saa716x_ff: implement ioctl VIDEO_GET_SIZE
      saa716x_ff: support production version of the S2-6400
      saa716x: disable OVERFLOW and AV interrupts in FGPI
      saa716x_ff: add some FPGA register definitions
      saa716x_ff: restart TS capturing in case of non-aligned TS error
      saa716x_ff: don't clear FGPI interrupts in IRQ routine.
      saa716x: comment out SPI functions that are not needed currently
      saa716x: add changes needed for kernel 2.6.36 and up.
      saa716x: support building with media_build_experimental
      saa716x_ff: use tasklet for FIFO transfer
      saa716x: fix not working MSI
      saa716x: Disable shared IRQ when using MSI mode.
      saa716x_ff: Do an explicit demodulator reset.
      saa716x: enable wait for PLL lock when setting clocks of all ports.
      saa716x_ff: add counting of interrupts
      saa716x: don't set i2c_adapter id field
      saa716x_ff: support non-aligned TS data
      saa716x_ff: Use a TS clock of 135Mhz instead of 90 Mhz.
      saa716x_ff: Ignore false remote events.
      saa716x_ff: Fix possible crash in IRQ handler.
      saa716x_ff: move firmware command interface code to separate file.
      saa716x_ff: Allow to have osd device opened twice.
      saa716x_ff: support correct TS mux setting for FPGA 1.10.
      saa716x_budget: Add missing GPIO initialization.
      saa716x_hybrid: Add missing GPIO initialization.
      saa716x_hybrid: fix tuner settings for nemo reference board
      saa716x_hybrid: TS capturing on the nemo reference board works.
      saa716x_hybrid: Make TS capturing code more generic.
      saa716x: remove unused members from struct saa716x_config.
      saa716x: Add function saa716x_fgpi_get_write_index.
      saa716x_hybrid: Use saa716x_fgpi_get_write_index to simplify code.
      saa716x_ff: Use saa716x_fgpi_get_write_index to simplify code.
      saa716x: Set maximum number of adapters per saa716x to 4.
      saa716x_budget: Add TS capturing code.
      saa716x_hybrid: Do some cleanups.
      saa716x: remove unused load_config functions.
      saa716x_budget: Started with SkyStar 2 eXpress HD.
      saa716x_hybrid: Add support for KWorld Dual DVB-T PE310.
      saa716x: Fix I2C bus assignment on SAA7160ET.
      saa716x: Fix stack corruption when parsing ROM info.
      saa716x: Fix memory leak in ROM parsing.
      saa716x: Skip unknown device descriptors when parsing the ROM
      saa716x: change verbose level for some dprintk
      saa716x_ff: Enable now working EEPROM parsing.
      saa716x_ff: Add error message when FPGA is not responding.
      saa716x_budget: Add frontend attach for the Skystar2 eXpress HD.
      saa716x_ff: Reset the frontend on the SkyStar2 eXpress HD.
      saa716x_ff: support CEC remote codes.
      saa716x: Use interrupts for I2C writes instead of polling.
      saa716x: separate I2C reading and writing into two functions.
      saa716x_ff: change remote event printk to hexadecimal output.
      saa716x: Support buffered I2C transaction using interrupts.
      saa716x_ff: Use buffered I2C interrupt mode.
      saa716x_ff: Don't use dvb_generic_ioctl.
      saa716x_budget: Use GPIO 26 for reset on the Skystar 2 eXpress HD.
      saa716x_budget: Use I2C B for accessing the frontend on the Skystar.
      saa716x_budget: Get the Skystar 2 eXpress HD to work.
      saa716x_budget: Implement LNB power switching for Skystar 2
eXpress HD.
      saa716x_ff: Fix memory leak.
      saa716x_ff: Fix missing copy user <-> kernel space.
      saa716x: FGPI DMA buffer size is passed to saa716x_fgpi_init.
      saa716x: Fix FGPI settings for SD video capture.
      saa716x: Export some FGPI functions.
      saa716x: Remove unused header file.
      saa716x: Remove duplicate definition.
      saa716x: Make BAM register macros more generic.
      saa716x: Use global macros for MMU register access.
      saa716x: Add VI module implementation.
      saa716x: Support one-shot video capturing.
      saa716x_ff: Extend interrupt counters.
      saa716x: Change video capture format from YUYV to UYUV.
      saa716x_ff: Support capturing digital video coming from STi7109.
      saa716x_ff: Protect reading of the captured video with a mutex.
      saa716x_ff: Rename functions.
      saa716x_ff: video capture refactoring.
      saa716x: Use pitch value from stream params when setting FGPI_STRIDE.
      saa716x: use offset from stream params instead of fixed value.
      saa716x: Clear DMA buffer after allocatiion
      saa716x: Support capturing raw data via FGPI unit
      saa716x: Reset FGPI read index in saa716x_fgpi_start
      saa716x_ff: Cancel data transfer in case of a block timeout
      saa716x_ff: print decimal digits for firmware version.
      saa716x: include fix for in-kernel build
      saa716x: support directory structure of linux-3.7+
      saa716x: section mismatch fixes
      saa716x: remove __devinit and friends
      saa716x: convert fifo_worker tasklet to workqueue
      saa716x: TS output buffer cleanup
      saa716x: Fix PHI address space offsets, cleanup register definitions.
      saa716x: Clean up PHI configuration.
      saa716x: Reset PHI on init.
      saa716x: Print EEPROM content on DEBUG verbosity only.
      saa716x: Fix errors and improve saa716x_set_clk.
      saa716x_ff: Fix not setting command result length to 0 per default.
      saa716x: move card specific PHI code to saa716x_ff driver
      saa716x_ff: use special phi_fifo_write function
      saa716x_ff: Add write-combining PCI iomem window for PHI1 access.
      saa716x_ff: implement PHI speedup
      saa716x: IO memory of upper PHI1 regions is mapped in saa716x_ff
driver.
      saa716x_ff: Optimize access to FIFO.
      saa716x_ff: Align block data on 32 bytes for firmware 0.5.0 and up
      saa716x_ff: Do not return on command ready timeout
      saa716x_ff: Usa faster EMI timings only for FPGA version 1.10 and
later

Manu Abraham (137):
      saa716x: Initial framework driver to support SAA7160, SAA7161,
SAA7162 chips
      saa716x: Add missing return, to avoid falling through the error codes
      saa716x: Updated board definitions
      saa716x: Add some register definitions
      saa716x: Add Read/Write macros
      saa716x: Initial attempt to Boot the core
      saa716x: Initial attempt to initialize the I2C core
      saa716x: Setup CGU
      saa716x: Whitespace cleanup
      saa716x: Use subsystem Vendor ID
      saa716x: Small cleanups
      saa716x: Enable all inputs
      saa716x: Initial go at MSI setup
      saa716x: Update I2C register definitions and fields
      saa716x: Initial go at the I2C implementation
      saa716x: Remove unused definitions
      saa716x: Move i2c related stuff to it's own header
      saa716x: Add some labels
      saa716x: Rename files
      saa716x: Fix subdevice ID
      saa716x: Add more register definitions
      saa716x: Update/Reorganize register definitions
      saa716x: Implement internal Boot mode
      saa716x: Update register definitions
      saa716x: Still scratching
      saa716x: Initialize MSI
      saa716x: Cleanup internal Boot configuration
      saa716x: Cleanup external Boot configuration
      saa716x: Initialize CGU and MSI modules
      saa716x: Enable more debugging
      saa716x: Check DMA availability
      saa716x: Small cleanups and fixes
      saa716x: Fix typo
      saa716x: Reset internal modules
      saa716x: Still debugging
      saa716x: Code simplification
      saa716x: Terminate PCI ID list
      saa716x: Rename Rd/Wr operations
      saa716x: Fix usage of wrong datatypes
      saa716x: CGU related fixes
      saa716x: Continue MSI-X implementation
      saa716x: Add routines to handle clock related events
      saa716x: Add support for Avermedia HC82 PCIe expresscard
      saa716x: Disable BAR2 access
      saa716x: Code cleanup
      saa716x: Register SAA716x Adapter
      saa716x: Add initial support for the second adapter
      saa716x: Initialize adapters on the budget device
      saa716x: Register only the relevant adapters for a specific device
      saa716x: Add Avermedia HC82 specific device configuration
      saa716x: Fix typo
      saa716x: Register an array of devices
      saa716x: Add support for the Avermedia H788 device
      saa716x: Add support for the Azurewave VP-6002 device
      saa716x: Usea separate frontend_attach for each of the devices
      saa716x: Use a separate IRQ handler for separate modules
      saa716x: Try to attach the demodulator
      saa716x: Fix typo in register definitions
      saa716x: Updates and Code simplification
      saa716x: Check device revision for I2C bus orderring
      saa716x: Add support for the NXP Atlantis reference design
      saa716x: Free IRQ before module unload
      saa716x: Code reorganization
      saa716x: Add support for the KNC1 Dual S2 device
      saa716x: Add support for the VP-3071 DVB-T dual device
      saa716x: Add GPIO control functions
      saa716x: Use power and reset controls within a sig\ngle loop
      saa716x: Use a configuration per adapter
      saa716x: VP-1028: add power, reset configuration
      saa716x: H788: Add power, reset configuration
      saa716x: HC82: Add power, reset configuration
      saa716x: Display Bus status
      saa716x: Bug: Address needs to be shifted one bit
      saa716x: Initial go at DMA routines
      saa716x: Print warning, if MSI module is not supported
      saa716x: Handle MSI in a generic manner
      saa716x: Add PHI port definitions
      saa716x: Initialize PHI bus
      saa716x: Add GREG routines
      saa716x: Reorganize CGU related routines
      saa716x: Do not initialize the CGU twice
      saa716x: Add more debug info, initialize handler count
      saa716x: Add/remove I2C MSI vectors
      saa716x: Add interrupt debugging
      saa716x: Return error on MSI enable failure
      saa716x: Initialize FPGI pagetables
      saa716x: Setup FGPI parameters
      saa716x: Use a separate module to handle Full fledged cards
      saa716x: NULL terminate PCI ID list
      saa716x: Read the mask bits instead
      saa716x: Reduce a bit of noise in the handler debug mode
      saa716x: Sleep a little while before enabling interrupts again
      saa716x: Use individual handlers
      saa716x: Transmit D is programmed, not S data
      saa716x: Print return values
      saa716x: Use adapter ordering
      saa716x: Disable debugging
      osd.h: Kickstart the TT S2 6400 Dual HD Premium - OSD update
      saa716x: Kickstart the TT S2 6400 Dual HD Premium
      saa716x: Code simplification, Overhaul, ROM dump
      saa716x: Set the default rate for the NEMO reference design
      saa716x: Code simplification, Overhauling, I2C related fixes
      saa716x: Try to attach the frontends
      saa716x: Don't cast pointers to 32 bit int
      saa716x: Partial rework of SPI I/O
      saa716x: Add video device support
      saa716x: S2-6400: Try to attach the frontend
      saa716x: Handle multiple I2C messages
      saa716x: Fix ROM parser
      saa716x: Setup default I2C rates
      saa716x: Fix BUS ordering
      saa716x: Fix swapped I2C buses
      saa716x: Print wait time, reduce number of loops
      saa716x: Fix missing address in single write operation
      saa716x: make register definitions specific to each of the modules
      saa716x: Fix register definition typo
      saa716x: Add function declaration
      saa716x: Fix FGPI internal clock divider state
      saa716x: Fix dmabuf allocation
      saa716x: Cleanup debug prints
      saa716x: Handle failure correctly
      saa716x: Handle proper buffer flush
      saa716x: FGPI DMA handling fixes
      saa716x: Finally! we have stream capture
      saa716x: Make the framework buildable
      saa716x: Fix build issues
      saa716x: Deinitialize I2C interrupts on exit
      saa716x: Factorize register/detach routines to common code
      saa716x: Start DMA engine as and when requested
      saa716x: Enable timeout for modules having no clock
      saa716x: Reset the frontend after powerup
      saa716x: GPIO fix
      saa716x: Fix powerup/reset
      saa716x: Use the correct I2C Bus
      saa716x: Code simplification
      saa716x: Try to attach frontend on the Nemo reference board
      saa716x: Do not report non-fatal errors to avoid issues with buggy
BIOS's

Oliver Endriss (3):
      saa716x_ff: Rename saa716x_ff.c to saa716x_ff_main.c
      saa716x_ff: Support remote control receiver
      saa716x: Use tasklet to transfer data to the demuxer (TT S2-6400)

Soeren Moch (13):
      saa716x: i2c_del_adapter() fix
      saa716x_ff: init frontends to low-power mode
      saa716x_ff: Add linux-4.5 support
      saa716x_ff: Avoid sleeping in fifo_worker
      saa716x: remove unused saa716x_msi_handler
      saa716x: pci: Remove asm includes for compatibility with linux-4.6
      saa716x: add linux-4.10 support
      saa716x: Remove broken MSI-X support
      saa716x: Use %zu printk format for sizeof return values
      saa716x_budget: Fix build in current mainline
      saa716x_hybrid: Fix build in current mainline
      saa716x: Hook up driver in staging/media
      saa716x: Add MAINTAINERS entry

 MAINTAINERS                                      |    6 +
 drivers/staging/media/Kconfig                    |    2 +
 drivers/staging/media/Makefile                   |    1 +
 drivers/staging/media/saa716x/Kconfig            |   63 +
 drivers/staging/media/saa716x/Makefile           |   27 +
 drivers/staging/media/saa716x/TODO               |    6 +
 drivers/staging/media/saa716x/saa716x_adap.c     |  251 +++
 drivers/staging/media/saa716x/saa716x_adap.h     |    9 +
 drivers/staging/media/saa716x/saa716x_aip.c      |   20 +
 drivers/staging/media/saa716x/saa716x_aip.h      |    9 +
 drivers/staging/media/saa716x/saa716x_aip_reg.h  |   62 +
 drivers/staging/media/saa716x/saa716x_boot.c     |  319 ++++
 drivers/staging/media/saa716x/saa716x_boot.h     |   18 +
 drivers/staging/media/saa716x/saa716x_budget.c   |  664 ++++++++
 drivers/staging/media/saa716x/saa716x_budget.h   |   15 +
 drivers/staging/media/saa716x/saa716x_cgu.c      |  540 +++++++
 drivers/staging/media/saa716x/saa716x_cgu.h      |   63 +
 drivers/staging/media/saa716x/saa716x_cgu_reg.h  |  178 +++
 drivers/staging/media/saa716x/saa716x_dcs_reg.h  |   56 +
 drivers/staging/media/saa716x/saa716x_dma.c      |  308 ++++
 drivers/staging/media/saa716x/saa716x_dma.h      |   61 +
 drivers/staging/media/saa716x/saa716x_dma_reg.h  |  201 +++
 drivers/staging/media/saa716x/saa716x_ff.h       |  187 +++
 drivers/staging/media/saa716x/saa716x_ff_cmd.c   |  433 +++++
 drivers/staging/media/saa716x/saa716x_ff_cmd.h   |   16 +
 drivers/staging/media/saa716x/saa716x_ff_ir.c    |  265 +++
 drivers/staging/media/saa716x/saa716x_ff_main.c  | 1859
++++++++++++++++++++++
 drivers/staging/media/saa716x/saa716x_ff_phi.c   |  229 +++
 drivers/staging/media/saa716x/saa716x_ff_phi.h   |   14 +
 drivers/staging/media/saa716x/saa716x_fgpi.c     |  386 +++++
 drivers/staging/media/saa716x/saa716x_fgpi.h     |   92 ++
 drivers/staging/media/saa716x/saa716x_fgpi_reg.h |   74 +
 drivers/staging/media/saa716x/saa716x_gpio.c     |  140 ++
 drivers/staging/media/saa716x/saa716x_gpio.h     |   26 +
 drivers/staging/media/saa716x/saa716x_gpio_reg.h |   47 +
 drivers/staging/media/saa716x/saa716x_greg.c     |   42 +
 drivers/staging/media/saa716x/saa716x_greg.h     |    9 +
 drivers/staging/media/saa716x/saa716x_greg_reg.h |   91 ++
 drivers/staging/media/saa716x/saa716x_hybrid.c   |  726 +++++++++
 drivers/staging/media/saa716x/saa716x_hybrid.h   |   13 +
 drivers/staging/media/saa716x/saa716x_i2c.c      |  728 +++++++++
 drivers/staging/media/saa716x/saa716x_i2c.h      |   52 +
 drivers/staging/media/saa716x/saa716x_i2c_reg.h  |  145 ++
 drivers/staging/media/saa716x/saa716x_mod.h      |   50 +
 drivers/staging/media/saa716x/saa716x_msi.c      |  479 ++++++
 drivers/staging/media/saa716x/saa716x_msi.h      |   87 +
 drivers/staging/media/saa716x/saa716x_msi_reg.h  |  143 ++
 drivers/staging/media/saa716x/saa716x_pci.c      |  222 +++
 drivers/staging/media/saa716x/saa716x_phi.c      |   23 +
 drivers/staging/media/saa716x/saa716x_phi.h      |    8 +
 drivers/staging/media/saa716x/saa716x_phi_reg.h  |   94 ++
 drivers/staging/media/saa716x/saa716x_priv.h     |  193 +++
 drivers/staging/media/saa716x/saa716x_rom.c      | 1071 +++++++++++++
 drivers/staging/media/saa716x/saa716x_rom.h      |  253 +++
 drivers/staging/media/saa716x/saa716x_spi.c      |  313 ++++
 drivers/staging/media/saa716x/saa716x_spi.h      |   23 +
 drivers/staging/media/saa716x/saa716x_spi_reg.h  |   27 +
 drivers/staging/media/saa716x/saa716x_vip.c      |  401 +++++
 drivers/staging/media/saa716x/saa716x_vip.h      |   58 +
 drivers/staging/media/saa716x/saa716x_vip_reg.h  |  141 ++
 include/uapi/linux/dvb/osd.h                     |   16 +
 61 files changed, 12055 insertions(+)
 create mode 100644 drivers/staging/media/saa716x/Kconfig
 create mode 100644 drivers/staging/media/saa716x/Makefile
 create mode 100644 drivers/staging/media/saa716x/TODO
 create mode 100644 drivers/staging/media/saa716x/saa716x_adap.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_adap.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_aip.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_aip.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_aip_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_boot.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_boot.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_budget.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_budget.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_cgu.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_cgu.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_cgu_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_dcs_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_dma.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_dma.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_dma_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_ff.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_ff_cmd.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_ff_cmd.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_ff_ir.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_ff_main.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_ff_phi.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_ff_phi.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_fgpi.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_fgpi.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_fgpi_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_gpio.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_gpio.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_gpio_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_greg.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_greg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_greg_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_hybrid.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_hybrid.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_i2c.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_i2c.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_i2c_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_mod.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_msi.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_msi.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_msi_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_pci.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_phi.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_phi.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_phi_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_priv.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_rom.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_rom.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_spi.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_spi.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_spi_reg.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_vip.c
 create mode 100644 drivers/staging/media/saa716x/saa716x_vip.h
 create mode 100644 drivers/staging/media/saa716x/saa716x_vip_reg.h





[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux