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