18edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors/* 28edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * timberdale.c timberdale FPGA MFD driver 38edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * Copyright (c) 2009 Intel Corporation 48edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * 58edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * This program is free software; you can redistribute it and/or modify 68edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * it under the terms of the GNU General Public License version 2 as 78edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * published by the Free Software Foundation. 88edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * 98edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * This program is distributed in the hope that it will be useful, 108edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * but WITHOUT ANY WARRANTY; without even the implied warranty of 118edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 128edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * GNU General Public License for more details. 138edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * 148edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * You should have received a copy of the GNU General Public License 158edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * along with this program; if not, write to the Free Software 168edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 178edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors */ 188edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 198edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors/* Supports: 208edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * Timberdale FPGA 218edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors */ 228edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 238edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/kernel.h> 248edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/module.h> 258edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/pci.h> 268edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/msi.h> 278edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/mfd/core.h> 285a0e3ad6af8660be21ca98a971cd00f331318c05Tejun Heo#include <linux/slab.h> 298edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 308edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/timb_gpio.h> 318edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 328edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/i2c.h> 338edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/i2c-ocores.h> 34d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors#include <linux/i2c-xiic.h> 358edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/i2c/tsc2007.h> 368edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 378edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/spi/spi.h> 388edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/spi/xilinx_spi.h> 398edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/spi/max7301.h> 408edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include <linux/spi/mc33880.h> 418edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 42071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors#include <media/timb_radio.h> 43c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors#include <media/timb_video.h> 44071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors 45dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors#include <linux/timb_dma.h> 46dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors 476901ffd97d3d820c608dd579dd908ac77128efefRichard Röjfors#include <linux/ks8842.h> 486901ffd97d3d820c608dd579dd908ac77128efefRichard Röjfors 498edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#include "timberdale.h" 508edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 518edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors#define DRIVER_NAME "timberdale" 528edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 538edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstruct timberdale_device { 548edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors resource_size_t ctl_mapbase; 558edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors unsigned char __iomem *ctl_membase; 568edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors struct { 578edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors u32 major; 588edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors u32 minor; 598edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors u32 config; 608edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } fw; 618edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 628edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 638edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors/*--------------------------------------------------------------------------*/ 648edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 658edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic struct tsc2007_platform_data timberdale_tsc2007_platform_data = { 668edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .model = 2003, 678edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .x_plate_ohms = 100 688edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 698edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 708edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic struct i2c_board_info timberdale_i2c_board_info[] = { 718edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 728edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors I2C_BOARD_INFO("tsc2007", 0x48), 738edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .platform_data = &timberdale_tsc2007_platform_data, 748edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .irq = IRQ_TIMBERDALE_TSC_INT 758edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 768edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 778edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 78d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjforsstatic __devinitdata struct xiic_i2c_platform_data 79d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjforstimberdale_xiic_platform_data = { 80d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .devices = timberdale_i2c_board_info, 81d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .num_devices = ARRAY_SIZE(timberdale_i2c_board_info) 82d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors}; 83d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors 848edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic __devinitdata struct ocores_i2c_platform_data 858edbede9ebf5959ec9951175a239925225440f5fRichard Röjforstimberdale_ocores_platform_data = { 868edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .regstep = 4, 878edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .clock_khz = 62500, 888edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .devices = timberdale_i2c_board_info, 898edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_devices = ARRAY_SIZE(timberdale_i2c_board_info) 908edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 918edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 92ae9f52f05c8223c8b4e18b042febf7a7bb46332aTobias Klauserstatic const __devinitconst struct resource timberdale_xiic_resources[] = { 93d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors { 94d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .start = XIICOFFSET, 95d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .end = XIICEND, 96d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .flags = IORESOURCE_MEM, 97d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors }, 98d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors { 99d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .start = IRQ_TIMBERDALE_I2C, 100d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .end = IRQ_TIMBERDALE_I2C, 101d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .flags = IORESOURCE_IRQ, 102d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors }, 103d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors}; 104d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors 105ae9f52f05c8223c8b4e18b042febf7a7bb46332aTobias Klauserstatic const __devinitconst struct resource timberdale_ocores_resources[] = { 1068edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 1078edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = OCORESOFFSET, 1088edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = OCORESEND, 1098edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_MEM, 1108edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 1118edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 1128edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_I2C, 1138edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_I2C, 1148edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 1158edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 1168edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 1178edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 1188edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsconst struct max7301_platform_data timberdale_max7301_platform_data = { 1198edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .base = 200 1208edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 1218edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 1228edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsconst struct mc33880_platform_data timberdale_mc33880_platform_data = { 1238edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .base = 100 1248edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 1258edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 1268edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic struct spi_board_info timberdale_spi_16bit_board_info[] = { 1278edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 1288edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .modalias = "max7301", 1298edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .max_speed_hz = 26000, 1308edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .chip_select = 2, 1318edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .mode = SPI_MODE_0, 1328edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .platform_data = &timberdale_max7301_platform_data 1338edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 1348edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 1358edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 1368edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic struct spi_board_info timberdale_spi_8bit_board_info[] = { 1378edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 1388edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .modalias = "mc33880", 1398edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .max_speed_hz = 4000, 1408edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .chip_select = 1, 1418edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .mode = SPI_MODE_1, 1428edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .platform_data = &timberdale_mc33880_platform_data 1438edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 1448edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 1458edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 1468edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic __devinitdata struct xspi_platform_data timberdale_xspi_platform_data = { 1478edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_chipselect = 3, 1488edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .little_endian = true, 1498edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors /* bits per word and devices will be filled in runtime depending 1508edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors * on the HW config 1518edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors */ 1528edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 1538edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 154ae9f52f05c8223c8b4e18b042febf7a7bb46332aTobias Klauserstatic const __devinitconst struct resource timberdale_spi_resources[] = { 1558edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 1568edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = SPIOFFSET, 1578edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = SPIEND, 1588edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_MEM, 1598edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 1608edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 1618edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_SPI, 1628edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_SPI, 1638edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 1648edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 1658edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 1668edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 1676901ffd97d3d820c608dd579dd908ac77128efefRichard Röjforsstatic __devinitdata struct ks8842_platform_data 1686901ffd97d3d820c608dd579dd908ac77128efefRichard Röjfors timberdale_ks8842_platform_data = { 1696901ffd97d3d820c608dd579dd908ac77128efefRichard Röjfors .rx_dma_channel = DMA_ETH_RX, 1706901ffd97d3d820c608dd579dd908ac77128efefRichard Röjfors .tx_dma_channel = DMA_ETH_TX 1716901ffd97d3d820c608dd579dd908ac77128efefRichard Röjfors}; 1726901ffd97d3d820c608dd579dd908ac77128efefRichard Röjfors 173ae9f52f05c8223c8b4e18b042febf7a7bb46332aTobias Klauserstatic const __devinitconst struct resource timberdale_eth_resources[] = { 1748edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 1758edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = ETHOFFSET, 1768edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = ETHEND, 1778edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_MEM, 1788edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 1798edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 1808edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_ETHSW_IF, 1818edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_ETHSW_IF, 1828edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 1838edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 1848edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 1858edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 1868edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic __devinitdata struct timbgpio_platform_data 1878edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_gpio_platform_data = { 1888edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .gpio_base = 0, 1898edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .nr_pins = GPIO_NR_PINS, 1908edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .irq_base = 200, 1918edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 1928edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 193ae9f52f05c8223c8b4e18b042febf7a7bb46332aTobias Klauserstatic const __devinitconst struct resource timberdale_gpio_resources[] = { 1948edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 1958edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = GPIOOFFSET, 1968edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = GPIOEND, 1978edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_MEM, 1988edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 1998edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 2008edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_GPIO, 2018edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_GPIO, 2028edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 2038edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 2048edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 2058edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 206ae9f52f05c8223c8b4e18b042febf7a7bb46332aTobias Klauserstatic const __devinitconst struct resource timberdale_mlogicore_resources[] = { 2078edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 2088edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = MLCOREOFFSET, 2098edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = MLCOREEND, 2108edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_MEM, 2118edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 2128edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 2138edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_MLCORE, 2148edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_MLCORE, 2158edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 2168edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 2178edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 2188edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_MLCORE_BUF, 2198edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_MLCORE_BUF, 2208edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 2218edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 2228edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 2238edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 224ae9f52f05c8223c8b4e18b042febf7a7bb46332aTobias Klauserstatic const __devinitconst struct resource timberdale_uart_resources[] = { 2258edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 2268edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = UARTOFFSET, 2278edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = UARTEND, 2288edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_MEM, 2298edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 2308edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 2318edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_UART, 2328edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_UART, 2338edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 2348edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 2358edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 2368edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 237ae9f52f05c8223c8b4e18b042febf7a7bb46332aTobias Klauserstatic const __devinitconst struct resource timberdale_uartlite_resources[] = { 2388edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 2398edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = UARTLITEOFFSET, 2408edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = UARTLITEEND, 2418edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_MEM, 2428edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 2438edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 2448edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_UARTLITE, 2458edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_UARTLITE, 2468edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 2478edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 2488edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 2498edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 250c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjforsstatic __devinitdata struct i2c_board_info timberdale_adv7180_i2c_board_info = { 251c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors /* Requires jumper JP9 to be off */ 252c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors I2C_BOARD_INFO("adv7180", 0x42 >> 1), 253c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .irq = IRQ_TIMBERDALE_ADV7180 254c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors}; 255c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors 256c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjforsstatic __devinitdata struct timb_video_platform_data 257c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors timberdale_video_platform_data = { 258c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .dma_channel = DMA_VIDEO_RX, 259c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .i2c_adapter = 0, 260c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .encoder = { 261c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .info = &timberdale_adv7180_i2c_board_info 262c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors } 263c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors}; 264c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors 265c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjforsstatic const __devinitconst struct resource 266c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjforstimberdale_radio_resources[] = { 267071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors { 268071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .start = RDSOFFSET, 269071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .end = RDSEND, 270071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .flags = IORESOURCE_MEM, 271071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors }, 272071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors { 273071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .start = IRQ_TIMBERDALE_RDS, 274071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .end = IRQ_TIMBERDALE_RDS, 275071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .flags = IORESOURCE_IRQ, 276071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors }, 277071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors}; 278071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors 279071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjforsstatic __devinitdata struct i2c_board_info timberdale_tef6868_i2c_board_info = { 280071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors I2C_BOARD_INFO("tef6862", 0x60) 281071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors}; 282071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors 283071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjforsstatic __devinitdata struct i2c_board_info timberdale_saa7706_i2c_board_info = { 284071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors I2C_BOARD_INFO("saa7706h", 0x1C) 285071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors}; 286071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors 287071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjforsstatic __devinitdata struct timb_radio_platform_data 288071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors timberdale_radio_platform_data = { 289071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .i2c_adapter = 0, 2909cd49719fda38613e9d7c712b11a54ea4ea005dcRichard Röjfors .tuner = &timberdale_tef6868_i2c_board_info, 2919cd49719fda38613e9d7c712b11a54ea4ea005dcRichard Röjfors .dsp = &timberdale_saa7706_i2c_board_info 292071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors}; 293071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors 294c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjforsstatic const __devinitconst struct resource timberdale_video_resources[] = { 295c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors { 296c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .start = LOGIWOFFSET, 297c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .end = LOGIWEND, 298c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .flags = IORESOURCE_MEM, 299c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors }, 300c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors /* 301c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors note that the "frame buffer" is located in DMA area 302c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors starting at 0x1200000 303c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors */ 304c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors}; 305c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors 306dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjforsstatic __devinitdata struct timb_dma_platform_data timb_dma_platform_data = { 307dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .nr_channels = 10, 308dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .channels = { 309dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 310dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* UART RX */ 311dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .rx = true, 312dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptors = 2, 313dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptor_elements = 1 314dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 315dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 316dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* UART TX */ 317dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .rx = false, 318dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptors = 2, 319dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptor_elements = 1 320dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 321dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 322dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* MLB RX */ 323dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .rx = true, 324dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptors = 2, 325dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptor_elements = 1 326dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 327dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 328dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* MLB TX */ 329dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .rx = false, 330dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptors = 2, 331dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptor_elements = 1 332dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 333dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 334dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* Video RX */ 335dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .rx = true, 336dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .bytes_per_line = 1440, 337dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptors = 2, 338dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptor_elements = 16 339dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 340dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 341dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* Video framedrop */ 342dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 343dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 344dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* SDHCI RX */ 345dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .rx = true, 346dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 347dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 348dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* SDHCI TX */ 349dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 350dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 351dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* ETH RX */ 352dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .rx = true, 353dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptors = 2, 354dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptor_elements = 1 355dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 356dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 357dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors /* ETH TX */ 358dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .rx = false, 359dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptors = 2, 360dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .descriptor_elements = 1 361dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 362dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors } 363dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors}; 364dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors 365ae9f52f05c8223c8b4e18b042febf7a7bb46332aTobias Klauserstatic const __devinitconst struct resource timberdale_dma_resources[] = { 3668edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 3678edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = DMAOFFSET, 3688edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = DMAEND, 3698edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_MEM, 3708edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 3718edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 3728edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_DMA, 3738edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_DMA, 3748edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 3758edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 3768edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 3778edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 3788edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic __devinitdata struct mfd_cell timberdale_cells_bar0_cfg0[] = { 3798edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 380dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .name = "timb-dma", 381dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_dma_resources), 382dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors .resources = timberdale_dma_resources, 3833271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timb_dma_platform_data, 3843271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timb_dma_platform_data), 385dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors }, 386dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors { 3878edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-uart", 3888edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_uart_resources), 3898edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_uart_resources, 3908edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 3918edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 392d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .name = "xiic-i2c", 393d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .num_resources = ARRAY_SIZE(timberdale_xiic_resources), 394d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .resources = timberdale_xiic_resources, 3953271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_xiic_platform_data, 3963271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_xiic_platform_data), 397d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors }, 398d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors { 3998edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-gpio", 4008edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_gpio_resources), 4018edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_gpio_resources, 4023271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_gpio_platform_data, 4033271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_gpio_platform_data), 4048edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 4058edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 406c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .name = "timb-video", 407c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_video_resources), 408c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .resources = timberdale_video_resources, 4093271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_video_platform_data, 4103271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_video_platform_data), 411c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors }, 412c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors { 413071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .name = "timb-radio", 414071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .num_resources = ARRAY_SIZE(timberdale_radio_resources), 415071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .resources = timberdale_radio_resources, 4163271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_radio_platform_data, 4173271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_radio_platform_data), 418071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors }, 419071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors { 4208edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "xilinx_spi", 4218edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_spi_resources), 4228edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_spi_resources, 4233271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_xspi_platform_data, 4243271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_xspi_platform_data), 4258edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 4268edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 4278edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "ks8842", 4288edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_eth_resources), 4298edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_eth_resources, 4303271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_ks8842_platform_data, 4313271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_ks8842_platform_data), 4328edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 433dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors}; 434dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors 435dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjforsstatic __devinitdata struct mfd_cell timberdale_cells_bar0_cfg1[] = { 4368edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 4378edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-dma", 4388edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_dma_resources), 4398edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_dma_resources, 4403271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timb_dma_platform_data, 4413271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timb_dma_platform_data), 4428edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 4438edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 4448edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-uart", 4458edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_uart_resources), 4468edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_uart_resources, 4478edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 4488edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 4498edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "uartlite", 4508edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_uartlite_resources), 4518edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_uartlite_resources, 4528edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 4538edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 454d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .name = "xiic-i2c", 455d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .num_resources = ARRAY_SIZE(timberdale_xiic_resources), 456d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .resources = timberdale_xiic_resources, 4573271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_xiic_platform_data, 4583271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_xiic_platform_data), 459d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors }, 460d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors { 4618edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-gpio", 4628edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_gpio_resources), 4638edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_gpio_resources, 4643271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_gpio_platform_data, 4653271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_gpio_platform_data), 4668edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 4678edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 4688edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-mlogicore", 4698edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_mlogicore_resources), 4708edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_mlogicore_resources, 4718edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 4728edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 473c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .name = "timb-video", 474c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_video_resources), 475c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .resources = timberdale_video_resources, 4763271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_video_platform_data, 4773271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_video_platform_data), 478c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors }, 479c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors { 480071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .name = "timb-radio", 481071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .num_resources = ARRAY_SIZE(timberdale_radio_resources), 482071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .resources = timberdale_radio_resources, 4833271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_radio_platform_data, 4843271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_radio_platform_data), 485071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors }, 486071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors { 4878edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "xilinx_spi", 4888edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_spi_resources), 4898edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_spi_resources, 4903271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_xspi_platform_data, 4913271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_xspi_platform_data), 4928edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 4938edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 4948edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "ks8842", 4958edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_eth_resources), 4968edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_eth_resources, 4973271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_ks8842_platform_data, 4983271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_ks8842_platform_data), 4998edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 500dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors}; 501dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors 502dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjforsstatic __devinitdata struct mfd_cell timberdale_cells_bar0_cfg2[] = { 5038edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 5048edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-dma", 5058edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_dma_resources), 5068edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_dma_resources, 5073271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timb_dma_platform_data, 5083271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timb_dma_platform_data), 5098edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 5108edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 5118edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-uart", 5128edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_uart_resources), 5138edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_uart_resources, 5148edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 5158edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 516d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .name = "xiic-i2c", 517d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .num_resources = ARRAY_SIZE(timberdale_xiic_resources), 518d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors .resources = timberdale_xiic_resources, 5193271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_xiic_platform_data, 5203271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_xiic_platform_data), 521d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors }, 522d84027bc4d176a0c06e8f62a9f7a002bdd444012Richard Röjfors { 5238edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-gpio", 5248edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_gpio_resources), 5258edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_gpio_resources, 5263271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_gpio_platform_data, 5273271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_gpio_platform_data), 5288edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 5298edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 530c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .name = "timb-video", 531c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_video_resources), 532c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .resources = timberdale_video_resources, 5333271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_video_platform_data, 5343271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_video_platform_data), 535c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors }, 536c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors { 537071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .name = "timb-radio", 538071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .num_resources = ARRAY_SIZE(timberdale_radio_resources), 539071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .resources = timberdale_radio_resources, 5403271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_radio_platform_data, 5413271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_radio_platform_data), 542071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors }, 543071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors { 5448edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "xilinx_spi", 5458edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_spi_resources), 5468edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_spi_resources, 5473271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_xspi_platform_data, 5483271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_xspi_platform_data), 5498edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 550dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors}; 551dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjfors 552dc64f30fa557ab1108e97e499a9acc550baa38bcRichard Röjforsstatic __devinitdata struct mfd_cell timberdale_cells_bar0_cfg3[] = { 5538edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 5548edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-dma", 5558edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_dma_resources), 5568edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_dma_resources, 5573271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timb_dma_platform_data, 5583271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timb_dma_platform_data), 5598edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 5608edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 5618edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-uart", 5628edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_uart_resources), 5638edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_uart_resources, 5648edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 5658edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 5668edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "ocores-i2c", 5678edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_ocores_resources), 5688edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_ocores_resources, 5693271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_ocores_platform_data, 5703271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_ocores_platform_data), 5718edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 5728edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 5738edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "timb-gpio", 5748edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_gpio_resources), 5758edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_gpio_resources, 5763271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_gpio_platform_data, 5773271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_gpio_platform_data), 5788edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 5798edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 580c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .name = "timb-video", 581c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_video_resources), 582c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors .resources = timberdale_video_resources, 5833271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_video_platform_data, 5843271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_video_platform_data), 585c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors }, 586c091575c8b35b39b8f271e0d4b692329a705240aRichard Röjfors { 587071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .name = "timb-radio", 588071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .num_resources = ARRAY_SIZE(timberdale_radio_resources), 589071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors .resources = timberdale_radio_resources, 5903271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_radio_platform_data, 5913271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_radio_platform_data), 592071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors }, 593071193ff4182c8f785e770c54e35f3ea2bb98b84Richard Röjfors { 5948edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "xilinx_spi", 5958edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_spi_resources), 5968edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_spi_resources, 5973271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_xspi_platform_data, 5983271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_xspi_platform_data), 5998edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 6008edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 6018edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "ks8842", 6028edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_eth_resources), 6038edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_eth_resources, 6043271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .platform_data = &timberdale_ks8842_platform_data, 6053271d382c3ffe61ef3d059ef47e635dbe031030eSamuel Ortiz .pdata_size = sizeof(timberdale_ks8842_platform_data), 6068edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 6078edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 6088edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6098edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic const __devinitconst struct resource timberdale_sdhc_resources[] = { 6108edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors /* located in bar 1 and bar 2 */ 6118edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 6128edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = SDHC0OFFSET, 6138edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = SDHC0END, 6148edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_MEM, 6158edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 6168edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 6178edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .start = IRQ_TIMBERDALE_SDHC, 6188edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .end = IRQ_TIMBERDALE_SDHC, 6198edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .flags = IORESOURCE_IRQ, 6208edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 6218edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 6228edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6238edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic __devinitdata struct mfd_cell timberdale_cells_bar1[] = { 6248edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 6258edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "sdhci", 6268edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_sdhc_resources), 6278edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_sdhc_resources, 6288edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 6298edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 6308edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6318edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic __devinitdata struct mfd_cell timberdale_cells_bar2[] = { 6328edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 6338edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = "sdhci", 6348edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .num_resources = ARRAY_SIZE(timberdale_sdhc_resources), 6358edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .resources = timberdale_sdhc_resources, 6368edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors }, 6378edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 6388edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6398edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic ssize_t show_fw_ver(struct device *dev, struct device_attribute *attr, 6408edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors char *buf) 6418edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors{ 6428edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors struct pci_dev *pdev = to_pci_dev(dev); 6438edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors struct timberdale_device *priv = pci_get_drvdata(pdev); 6448edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6458edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors return sprintf(buf, "%d.%d.%d\n", priv->fw.major, priv->fw.minor, 6468edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->fw.config); 6478edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors} 6488edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6498edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic DEVICE_ATTR(fw_ver, S_IRUGO, show_fw_ver, NULL); 6508edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6518edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors/*--------------------------------------------------------------------------*/ 6528edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6538edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic int __devinit timb_probe(struct pci_dev *dev, 6548edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors const struct pci_device_id *id) 6558edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors{ 6568edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors struct timberdale_device *priv; 6578edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors int err, i; 6588edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors resource_size_t mapbase; 6598edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors struct msix_entry *msix_entries = NULL; 6608edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors u8 ip_setup; 6618edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6628edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv = kzalloc(sizeof(*priv), GFP_KERNEL); 6638edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (!priv) 6648edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors return -ENOMEM; 6658edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6668edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors pci_set_drvdata(dev, priv); 6678edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6688edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = pci_enable_device(dev); 6698edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (err) 6708edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_enable; 6718edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6728edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors mapbase = pci_resource_start(dev, 0); 6738edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (!mapbase) { 6748edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, "No resource\n"); 6758edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_start; 6768edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 6778edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6788edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors /* create a resource for the PCI master register */ 6798edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->ctl_mapbase = mapbase + CHIPCTLOFFSET; 6808edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (!request_mem_region(priv->ctl_mapbase, CHIPCTLSIZE, "timb-ctl")) { 6818edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, "Failed to request ctl mem\n"); 6828edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_request; 6838edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 6848edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6858edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->ctl_membase = ioremap(priv->ctl_mapbase, CHIPCTLSIZE); 6868edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (!priv->ctl_membase) { 6878edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, "ioremap failed for ctl mem\n"); 6888edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_ioremap; 6898edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 6908edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6918edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors /* read the HW config */ 6928edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->fw.major = ioread32(priv->ctl_membase + TIMB_REV_MAJOR); 6938edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->fw.minor = ioread32(priv->ctl_membase + TIMB_REV_MINOR); 6948edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->fw.config = ioread32(priv->ctl_membase + TIMB_HW_CONFIG); 6958edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 6968edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (priv->fw.major > TIMB_SUPPORTED_MAJOR) { 6978edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, "The driver supports an older " 6988edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors "version of the FPGA, please update the driver to " 6998edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors "support %d.%d\n", priv->fw.major, priv->fw.minor); 700981c65a9b3e24029f64bd45c7a92f901899a033eJulia Lawall goto err_config; 7018edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 7028edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (priv->fw.major < TIMB_SUPPORTED_MAJOR || 7038edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->fw.minor < TIMB_REQUIRED_MINOR) { 7048edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, "The FPGA image is too old (%d.%d), " 7058edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors "please upgrade the FPGA to at least: %d.%d\n", 7068edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->fw.major, priv->fw.minor, 7078edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors TIMB_SUPPORTED_MAJOR, TIMB_REQUIRED_MINOR); 708981c65a9b3e24029f64bd45c7a92f901899a033eJulia Lawall goto err_config; 7098edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 7108edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7118edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors msix_entries = kzalloc(TIMBERDALE_NR_IRQS * sizeof(*msix_entries), 7128edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors GFP_KERNEL); 7138edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (!msix_entries) 714981c65a9b3e24029f64bd45c7a92f901899a033eJulia Lawall goto err_config; 7158edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7168edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors for (i = 0; i < TIMBERDALE_NR_IRQS; i++) 7178edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors msix_entries[i].entry = i; 7188edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7198edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = pci_enable_msix(dev, msix_entries, TIMBERDALE_NR_IRQS); 7208edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (err) { 7218edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, 7228edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors "MSI-X init failed: %d, expected entries: %d\n", 7238edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err, TIMBERDALE_NR_IRQS); 7248edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_msix; 7258edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 7268edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7278edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = device_create_file(&dev->dev, &dev_attr_fw_ver); 7288edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (err) 7298edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_create_file; 7308edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7318edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors /* Reset all FPGA PLB peripherals */ 7328edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors iowrite32(0x1, priv->ctl_membase + TIMB_SW_RST); 7338edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7348edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors /* update IRQ offsets in I2C board info */ 7358edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors for (i = 0; i < ARRAY_SIZE(timberdale_i2c_board_info); i++) 7368edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_i2c_board_info[i].irq = 7378edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors msix_entries[timberdale_i2c_board_info[i].irq].vector; 7388edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7398edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors /* Update the SPI configuration depending on the HW (8 or 16 bit) */ 7408edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (priv->fw.config & TIMB_HW_CONFIG_SPI_8BIT) { 7418edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_xspi_platform_data.bits_per_word = 8; 7428edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_xspi_platform_data.devices = 7438edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_spi_8bit_board_info; 7448edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_xspi_platform_data.num_devices = 7458edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors ARRAY_SIZE(timberdale_spi_8bit_board_info); 7468edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } else { 7478edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_xspi_platform_data.bits_per_word = 16; 7488edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_xspi_platform_data.devices = 7498edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_spi_16bit_board_info; 7508edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_xspi_platform_data.num_devices = 7518edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors ARRAY_SIZE(timberdale_spi_16bit_board_info); 7528edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 7538edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7548edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors ip_setup = priv->fw.config & TIMB_HW_VER_MASK; 7558edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors switch (ip_setup) { 7568edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors case TIMB_HW_VER0: 7578edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = mfd_add_devices(&dev->dev, -1, 7588edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_cells_bar0_cfg0, 7598edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors ARRAY_SIZE(timberdale_cells_bar0_cfg0), 7608edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors &dev->resource[0], msix_entries[0].vector); 7618edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors break; 7628edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors case TIMB_HW_VER1: 7638edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = mfd_add_devices(&dev->dev, -1, 7648edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_cells_bar0_cfg1, 7658edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors ARRAY_SIZE(timberdale_cells_bar0_cfg1), 7668edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors &dev->resource[0], msix_entries[0].vector); 7678edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors break; 7688edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors case TIMB_HW_VER2: 7698edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = mfd_add_devices(&dev->dev, -1, 7708edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_cells_bar0_cfg2, 7718edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors ARRAY_SIZE(timberdale_cells_bar0_cfg2), 7728edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors &dev->resource[0], msix_entries[0].vector); 7738edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors break; 7748edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors case TIMB_HW_VER3: 7758edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = mfd_add_devices(&dev->dev, -1, 7768edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_cells_bar0_cfg3, 7778edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors ARRAY_SIZE(timberdale_cells_bar0_cfg3), 7788edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors &dev->resource[0], msix_entries[0].vector); 7798edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors break; 7808edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors default: 7818edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, "Uknown IP setup: %d.%d.%d\n", 7828edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->fw.major, priv->fw.minor, ip_setup); 7838edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = -ENODEV; 7848edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_mfd; 7858edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors break; 7868edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 7878edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7888edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (err) { 7898edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err); 7908edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_mfd; 7918edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 7928edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 7938edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = mfd_add_devices(&dev->dev, 0, 7948edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_cells_bar1, ARRAY_SIZE(timberdale_cells_bar1), 7958edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors &dev->resource[1], msix_entries[0].vector); 7968edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (err) { 7978edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err); 7988edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_mfd2; 7998edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 8008edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8018edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors /* only version 0 and 3 have the iNand routed to SDHCI */ 8028edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (((priv->fw.config & TIMB_HW_VER_MASK) == TIMB_HW_VER0) || 8038edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors ((priv->fw.config & TIMB_HW_VER_MASK) == TIMB_HW_VER3)) { 8048edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = mfd_add_devices(&dev->dev, 1, timberdale_cells_bar2, 8058edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors ARRAY_SIZE(timberdale_cells_bar2), 8068edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors &dev->resource[2], msix_entries[0].vector); 8078edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (err) { 8088edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_err(&dev->dev, "mfd_add_devices failed: %d\n", err); 8098edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors goto err_mfd2; 8108edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 8118edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 8128edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8138edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors kfree(msix_entries); 8148edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8158edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors dev_info(&dev->dev, 8168edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors "Found Timberdale Card. Rev: %d.%d, HW config: 0x%02x\n", 8178edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors priv->fw.major, priv->fw.minor, priv->fw.config); 8188edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8198edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors return 0; 8208edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8218edbede9ebf5959ec9951175a239925225440f5fRichard Röjforserr_mfd2: 8228edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors mfd_remove_devices(&dev->dev); 8238edbede9ebf5959ec9951175a239925225440f5fRichard Röjforserr_mfd: 8248edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors device_remove_file(&dev->dev, &dev_attr_fw_ver); 8258edbede9ebf5959ec9951175a239925225440f5fRichard Röjforserr_create_file: 8268edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors pci_disable_msix(dev); 8278edbede9ebf5959ec9951175a239925225440f5fRichard Röjforserr_msix: 828981c65a9b3e24029f64bd45c7a92f901899a033eJulia Lawall kfree(msix_entries); 829981c65a9b3e24029f64bd45c7a92f901899a033eJulia Lawallerr_config: 8308edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors iounmap(priv->ctl_membase); 8318edbede9ebf5959ec9951175a239925225440f5fRichard Röjforserr_ioremap: 8328edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors release_mem_region(priv->ctl_mapbase, CHIPCTLSIZE); 8338edbede9ebf5959ec9951175a239925225440f5fRichard Röjforserr_request: 8348edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors pci_set_drvdata(dev, NULL); 8358edbede9ebf5959ec9951175a239925225440f5fRichard Röjforserr_start: 8368edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors pci_disable_device(dev); 8378edbede9ebf5959ec9951175a239925225440f5fRichard Röjforserr_enable: 8388edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors kfree(priv); 8398edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors pci_set_drvdata(dev, NULL); 8408edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors return -ENODEV; 8418edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors} 8428edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8438edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic void __devexit timb_remove(struct pci_dev *dev) 8448edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors{ 8458edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors struct timberdale_device *priv = pci_get_drvdata(dev); 8468edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8478edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors mfd_remove_devices(&dev->dev); 8488edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8498edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors device_remove_file(&dev->dev, &dev_attr_fw_ver); 8508edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8518edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors iounmap(priv->ctl_membase); 8528edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors release_mem_region(priv->ctl_mapbase, CHIPCTLSIZE); 8538edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8548edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors pci_disable_msix(dev); 8558edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors pci_disable_device(dev); 8568edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors pci_set_drvdata(dev, NULL); 8578edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors kfree(priv); 8588edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors} 8598edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 86061485c63c4a4e823445da4ae8798d9082f6bc586Axel Linstatic DEFINE_PCI_DEVICE_TABLE(timberdale_pci_tbl) = { 8618edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { PCI_DEVICE(PCI_VENDOR_ID_TIMB, PCI_DEVICE_ID_TIMB) }, 8628edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors { 0 } 8638edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 8648edbede9ebf5959ec9951175a239925225440f5fRichard RöjforsMODULE_DEVICE_TABLE(pci, timberdale_pci_tbl); 8658edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8668edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic struct pci_driver timberdale_pci_driver = { 8678edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .name = DRIVER_NAME, 8688edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .id_table = timberdale_pci_tbl, 8698edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .probe = timb_probe, 8708edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors .remove = __devexit_p(timb_remove), 8718edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors}; 8728edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8738edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic int __init timberdale_init(void) 8748edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors{ 8758edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors int err; 8768edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8778edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors err = pci_register_driver(&timberdale_pci_driver); 8788edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors if (err < 0) { 8798edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors printk(KERN_ERR 8808edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors "Failed to register PCI driver for %s device.\n", 8818edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_pci_driver.name); 8828edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors return -ENODEV; 8838edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors } 8848edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8858edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors printk(KERN_INFO "Driver for %s has been successfully registered.\n", 8868edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_pci_driver.name); 8878edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8888edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors return 0; 8898edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors} 8908edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8918edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsstatic void __exit timberdale_exit(void) 8928edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors{ 8938edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors pci_unregister_driver(&timberdale_pci_driver); 8948edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8958edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors printk(KERN_INFO "Driver for %s has been successfully unregistered.\n", 8968edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors timberdale_pci_driver.name); 8978edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors} 8988edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 8998edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsmodule_init(timberdale_init); 9008edbede9ebf5959ec9951175a239925225440f5fRichard Röjforsmodule_exit(timberdale_exit); 9018edbede9ebf5959ec9951175a239925225440f5fRichard Röjfors 9028edbede9ebf5959ec9951175a239925225440f5fRichard RöjforsMODULE_AUTHOR("Mocean Laboratories <info@mocean-labs.com>"); 9038edbede9ebf5959ec9951175a239925225440f5fRichard RöjforsMODULE_VERSION(DRV_VERSION); 9048edbede9ebf5959ec9951175a239925225440f5fRichard RöjforsMODULE_LICENSE("GPL v2"); 905