xilinx_spi: add a platform driver using the xilinx_spi common module.
Subsystems (2)
PATCH 4/4 xilinx_spi: add a platform driver using the xilinx_spi common module.
This patch adds in a platform device driver using the xilinx_spi common module.
Signed-off-by Richard Röjfors <[email protected]>
---
drivers/spi/xilinx_spi_pltfm.c new file +101 -0
@@ -0,0 +1,101 @@ +/* +* xilinx_spi_pltfm.c Support for Xilinx SPI platform devices +* Copyright (c) 2009 Intel Corporation +* +* This program is free software; you can redistribute it and/or modify +* it under the terms of the GNU General Public License version 2 as +* published by the Free Software Foundation. +* +* This program is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software +* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +/* Supports: +* Xilinx SPI devices as platform devices +* +* Inspired by xilinx_spi.c, 2002-2007 (c) MontaVista Software, Inc. +*/ + +#include <linux/module.h> +#include <linux/init.h> +#include <linux/interrupt.h> +#include <linux/io.h> +#include <linux/platform_device.h> + +#include <linux/spi/xilinx_spi.h> +#include "xilinx_spi.h" + +static int __devinit xilinx_spi_probe (struct platform_device *dev) +{ +struct xspi_platform_data *pdata; +struct resource *r; +int irq; +struct spi_master *master; +u8 i; + + pdata = dev->dev.platform_data; +if (pdata ==NULL ) +return -ENODEV ; + + r =platform_get_resource (dev,IORESOURCE_MEM ,0 ); +if (r ==NULL ) +return -ENODEV ; + + irq =platform_get_irq (dev,0 ); +if (irq <0 ) +return -ENXIO ; + + master =xilinx_spi_init (&dev->dev, r, irq, dev->id, + pdata->num_chipselect, false, pdata->bits_per_word); +if (IS_ERR (master)) +return PTR_ERR (master); + +for (i =0 ; i < pdata->num_devices; i++) +spi_new_device (master, pdata->devices + i); + +platform_set_drvdata (dev, master); +return 0 ; +} + +static int __devexit xilinx_spi_remove(struct platform_device *dev) +{ +xilinx_spi_deinit (platform_get_drvdata (dev)); +platform_set_drvdata (dev,0 ); + +return 0 ; +} + +/* work with hotplug and coldplug */ +MODULE_ALIAS ("platform:" XILINX_SPI_NAME ); + +static struct platform_driver xilinx_spi_driver = { + .probe = xilinx_spi_probe, + .remove =__devexit_p (xilinx_spi_remove), + .driver = { + .name =XILINX_SPI_NAME , + .owner =THIS_MODULE , + }, +}; + +static int __init xilinx_spi_pltfm_init (void ) +{ +return platform_driver_register (&xilinx_spi_driver); +} +module_init (xilinx_spi_pltfm_init); + +static void __exit xilinx_spi_pltfm_exit(void) +{ +platform_driver_unregister (&xilinx_spi_driver); +} +module_exit (xilinx_spi_pltfm_exit); + +MODULE_AUTHOR ("Mocean Laboratories <[email protected]>" ); +MODULE_DESCRIPTION ("Xilinx SPI platform driver" ); +MODULE_LICENSE ("GPL v2" ); +
include/linux/spi/xilinx_spi.h new file +19 -0
@@ -0,0 +1,19 @@ +#ifndef __LINUX_SPI_XILINX_SPI_H +#define __LINUX_SPI_XILINX_SPI_H + +/** +* struct xspi_platform_data - Platform data of the Xilinx SPI driver +* @num_chipselect: Number of chip select by the IP +* @bits_per_word: Number of bits per word. 8/16/32, Note that the DS464 +* only support 8bit SPI. +* @devices: Devices to add when the driver is probed. +* @num_devices: Number of devices in the devices array. +*/ +struct xspi_platform_data { +u16 num_chipselect; +u8 bits_per_word; +struct spi_board_info *devices; +u8 num_devices; +}; + +#endif /* __LINUX_SPI_XILINX_SPI_H */
Quoted 3 lines · Richard Röjfors
This patch adds in a platform device driver using the
xilinx_spicommon module.Signed-off-by Richard Röjfors <[email protected]>
Pretty straight forward stuff. Looks right to me. (Except of course for adding the pdata structure earlier in the series so that the of_driver can use it too.
Thanks for all this work.
Cheers,
g.
Signature · 2 lines
Grant Likely, B.Sc., P.Eng. Secret Lab Technologies Ltd.