RE: [PATCH V2] am35xx-emac: move generic EMAC init to separate file

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

 



> -----Original Message-----
> From: linux-omap-owner@xxxxxxxxxxxxxxx [mailto:linux-omap-
> owner@xxxxxxxxxxxxxxx] On Behalf Of Ilya Yanok
> Sent: Wednesday, December 21, 2011 4:57 AM
> To: linux-omap@xxxxxxxxxxxxxxx
> Cc: sasha_d@xxxxxxxxxxx; Ilya Yanok
> Subject: [PATCH V2] am35xx-emac: move generic EMAC init to separate file
> 
> AM35xx SoCs include DaVinci EMAC IP. Initialization code in
> board-am3517evm.c is pretty board independent and will work for any
> AM35xx based board so move this code to it's own file to be reused by
> other boards.
> 
> Signed-off-by: Ilya Yanok <yanok@xxxxxxxxxxx>
> 
> ---
> Changes from V1:
> 
>  - removed clock aliases
> 
>  arch/arm/mach-omap2/Makefile          |    3 +
>  arch/arm/mach-omap2/am35xx-emac.c     |  131
> +++++++++++++++++++++++++++++++++
>  arch/arm/mach-omap2/am35xx-emac.h     |   16 ++++
>  arch/arm/mach-omap2/board-am3517evm.c |  114 +---------------------------
> -
>  4 files changed, 152 insertions(+), 112 deletions(-)
>  create mode 100644 arch/arm/mach-omap2/am35xx-emac.c
>  create mode 100644 arch/arm/mach-omap2/am35xx-emac.h
> 
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index fc9b238..5d75cb5 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -270,4 +270,7 @@ smsc911x-$(CONFIG_SMSC911X)		:= gpmc-smsc911x.o
>  obj-y					+= $(smsc911x-m) $(smsc911x-y)
>  obj-$(CONFIG_ARCH_OMAP4)		+= hwspinlock.o
> 
> +emac-$(CONFIG_TI_DAVINCI_EMAC)		:= am35xx-emac.o
> +obj-y					+= $(emac-m) $(emac-y)
> +
>  obj-y					+= common-board-devices.o twl-common.o
> diff --git a/arch/arm/mach-omap2/am35xx-emac.c b/arch/arm/mach-
> omap2/am35xx-emac.c
> new file mode 100644
> index 0000000..eb23a09
> --- /dev/null
> +++ b/arch/arm/mach-omap2/am35xx-emac.c
> @@ -0,0 +1,131 @@
> +/*
> + * Copyright (C) 2011 Ilya Yanok, Emcraft Systems
> + *
> + * Based on mach-omap2/board-am3517evm.c
> + * Copyright (C) 2009 Texas Instruments Incorporated
> + * Author: Ranjith Lohithakshan <ranjithl@xxxxxx>
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License version 2
> + * published by the Free Software Foundation.
> + *
> + * This program is distributed "as is" WITHOUT ANY WARRANTY of any kind,
> + * whether express or implied; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * General Public License for more details.
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/davinci_emac.h>
> +#include <linux/platform_device.h>
> +#include <plat/irqs.h>
> +#include <mach/am35xx.h>
> +
> +#include "control.h"
> +
> +static struct mdio_platform_data am35xx_mdio_pdata;
> +
> +static struct resource am35xx_mdio_resources[] = {
> +	{
> +		.start  = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET,
> +		.end    = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET +
> +			  SZ_4K - 1,
> +		.flags  = IORESOURCE_MEM,
> +	},
> +};
This will not be board independent, using AM35xx everywhere.

To make it completely board independent, you should get all this platform 
specific data from board file. Probably have emac_init() function here and 
pass the data.


Do you know any other platform or device using this IP?

Thanks,
Vaibhav

> +
> +static struct platform_device am35xx_mdio_device = {
> +	.name		= "davinci_mdio",
> +	.id		= 0,
> +	.num_resources	= ARRAY_SIZE(am35xx_mdio_resources),
> +	.resource	= am35xx_mdio_resources,
> +	.dev.platform_data = &am35xx_mdio_pdata,
> +};
> +
> +static void am35xx_enable_ethernet_int(void)
> +{
> +	u32 regval;
> +
> +	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
> +	regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
> +		AM35XX_CPGMAC_C0_TX_PULSE_CLR |
> +		AM35XX_CPGMAC_C0_MISC_PULSE_CLR |
> +		AM35XX_CPGMAC_C0_RX_THRESH_CLR);
> +	omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
> +	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
> +}
> +
> +static void am35xx_disable_ethernet_int(void)
> +{
> +	u32 regval;
> +
> +	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
> +	regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
> +		AM35XX_CPGMAC_C0_TX_PULSE_CLR);
> +	omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
> +	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
> +}
> +
> +static struct emac_platform_data am35xx_emac_pdata = {
> +	.ctrl_reg_offset	= AM35XX_EMAC_CNTRL_OFFSET,
> +	.ctrl_mod_reg_offset	= AM35XX_EMAC_CNTRL_MOD_OFFSET,
> +	.ctrl_ram_offset	= AM35XX_EMAC_CNTRL_RAM_OFFSET,
> +	.ctrl_ram_size		= AM35XX_EMAC_CNTRL_RAM_SIZE,
> +	.version		= EMAC_VERSION_2,
> +	.hw_ram_addr		= AM35XX_EMAC_HW_RAM_ADDR,
> +	.interrupt_enable	= am35xx_enable_ethernet_int,
> +	.interrupt_disable	= am35xx_disable_ethernet_int,
> +};
> +
> +static struct resource am35xx_emac_resources[] = {
> +	{
> +		.start  = AM35XX_IPSS_EMAC_BASE,
> +		.end    = AM35XX_IPSS_EMAC_BASE + 0x2FFFF,
> +		.flags  = IORESOURCE_MEM,
> +	},
> +	{
> +		.start  = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
> +		.end    = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
> +		.flags  = IORESOURCE_IRQ,
> +	},
> +	{
> +		.start  = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
> +		.end    = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
> +		.flags  = IORESOURCE_IRQ,
> +	},
> +	{
> +		.start  = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
> +		.end    = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
> +		.flags  = IORESOURCE_IRQ,
> +	},
> +	{
> +		.start  = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
> +		.end    = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
> +		.flags  = IORESOURCE_IRQ,
> +	},
> +};
> +
> +static struct platform_device am35xx_emac_device = {
> +	.name		= "davinci_emac",
> +	.id		= -1,
> +	.num_resources	= ARRAY_SIZE(am35xx_emac_resources),
> +	.resource	= am35xx_emac_resources,
> +	.dev		= {
> +		.platform_data	= &am35xx_emac_pdata,
> +	},
> +};
> +
> +void am35xx_ethernet_init(unsigned long mdio_bus_freq, int rmii_en)
> +{
> +	unsigned int regval;
> +
> +	am35xx_emac_pdata.rmii_en = rmii_en;
> +	am35xx_mdio_pdata.bus_freq = mdio_bus_freq;
> +	platform_device_register(&am35xx_emac_device);
> +	platform_device_register(&am35xx_mdio_device);
> +
> +	regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
> +	regval = regval & (~(AM35XX_CPGMACSS_SW_RST));
> +	omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET);
> +	regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
> +}
> diff --git a/arch/arm/mach-omap2/am35xx-emac.h b/arch/arm/mach-
> omap2/am35xx-emac.h
> new file mode 100644
> index 0000000..e318d9a
> --- /dev/null
> +++ b/arch/arm/mach-omap2/am35xx-emac.h
> @@ -0,0 +1,16 @@
> +/*
> + * Copyright (C) 2011 Ilya Yanok, Emcraft Systems
> + *
> + * 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.
> + */
> +
> +#ifdef CONFIG_TI_DAVINCI_EMAC
> +void am35xx_ethernet_init(unsigned long mdio_bus_freq, int rmii_en);
> +#else
> +static inline void am35xx_ethernet_init(unsigned long mdio_bus_freq,
> +		int rmii_en)
> +{
> +}
> +#endif
> diff --git a/arch/arm/mach-omap2/board-am3517evm.c b/arch/arm/mach-
> omap2/board-am3517evm.c
> index 3a44f07..0842f58 100644
> --- a/arch/arm/mach-omap2/board-am3517evm.c
> +++ b/arch/arm/mach-omap2/board-am3517evm.c
> @@ -39,123 +39,13 @@
>  #include <video/omap-panel-generic-dpi.h>
>  #include <video/omap-panel-dvi.h>
> 
> +#include "am35xx-emac.h"
>  #include "mux.h"
>  #include "control.h"
>  #include "hsmmc.h"
> 
>  #define AM35XX_EVM_MDIO_FREQUENCY	(1000000)
> 
> -static struct mdio_platform_data am3517_evm_mdio_pdata = {
> -	.bus_freq	= AM35XX_EVM_MDIO_FREQUENCY,
> -};
> -
> -static struct resource am3517_mdio_resources[] = {
> -	{
> -		.start  = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET,
> -		.end    = AM35XX_IPSS_EMAC_BASE + AM35XX_EMAC_MDIO_OFFSET +
> -			  SZ_4K - 1,
> -		.flags  = IORESOURCE_MEM,
> -	},
> -};
> -
> -static struct platform_device am3517_mdio_device = {
> -	.name		= "davinci_mdio",
> -	.id		= 0,
> -	.num_resources	= ARRAY_SIZE(am3517_mdio_resources),
> -	.resource	= am3517_mdio_resources,
> -	.dev.platform_data = &am3517_evm_mdio_pdata,
> -};
> -
> -static struct emac_platform_data am3517_evm_emac_pdata = {
> -	.rmii_en	= 1,
> -};
> -
> -static struct resource am3517_emac_resources[] = {
> -	{
> -		.start  = AM35XX_IPSS_EMAC_BASE,
> -		.end    = AM35XX_IPSS_EMAC_BASE + 0x2FFFF,
> -		.flags  = IORESOURCE_MEM,
> -	},
> -	{
> -		.start  = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
> -		.end    = INT_35XX_EMAC_C0_RXTHRESH_IRQ,
> -		.flags  = IORESOURCE_IRQ,
> -	},
> -	{
> -		.start  = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
> -		.end    = INT_35XX_EMAC_C0_RX_PULSE_IRQ,
> -		.flags  = IORESOURCE_IRQ,
> -	},
> -	{
> -		.start  = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
> -		.end    = INT_35XX_EMAC_C0_TX_PULSE_IRQ,
> -		.flags  = IORESOURCE_IRQ,
> -	},
> -	{
> -		.start  = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
> -		.end    = INT_35XX_EMAC_C0_MISC_PULSE_IRQ,
> -		.flags  = IORESOURCE_IRQ,
> -	},
> -};
> -
> -static struct platform_device am3517_emac_device = {
> -	.name		= "davinci_emac",
> -	.id		= -1,
> -	.num_resources	= ARRAY_SIZE(am3517_emac_resources),
> -	.resource	= am3517_emac_resources,
> -};
> -
> -static void am3517_enable_ethernet_int(void)
> -{
> -	u32 regval;
> -
> -	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
> -	regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
> -		AM35XX_CPGMAC_C0_TX_PULSE_CLR |
> -		AM35XX_CPGMAC_C0_MISC_PULSE_CLR |
> -		AM35XX_CPGMAC_C0_RX_THRESH_CLR);
> -	omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
> -	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
> -}
> -
> -static void am3517_disable_ethernet_int(void)
> -{
> -	u32 regval;
> -
> -	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
> -	regval = (regval | AM35XX_CPGMAC_C0_RX_PULSE_CLR |
> -		AM35XX_CPGMAC_C0_TX_PULSE_CLR);
> -	omap_ctrl_writel(regval, AM35XX_CONTROL_LVL_INTR_CLEAR);
> -	regval = omap_ctrl_readl(AM35XX_CONTROL_LVL_INTR_CLEAR);
> -}
> -
> -static void am3517_evm_ethernet_init(struct emac_platform_data *pdata)
> -{
> -	unsigned int regval;
> -
> -	pdata->ctrl_reg_offset		= AM35XX_EMAC_CNTRL_OFFSET;
> -	pdata->ctrl_mod_reg_offset	= AM35XX_EMAC_CNTRL_MOD_OFFSET;
> -	pdata->ctrl_ram_offset		= AM35XX_EMAC_CNTRL_RAM_OFFSET;
> -	pdata->ctrl_ram_size		= AM35XX_EMAC_CNTRL_RAM_SIZE;
> -	pdata->version			= EMAC_VERSION_2;
> -	pdata->hw_ram_addr		= AM35XX_EMAC_HW_RAM_ADDR;
> -	pdata->interrupt_enable		= am3517_enable_ethernet_int;
> -	pdata->interrupt_disable	= am3517_disable_ethernet_int;
> -	am3517_emac_device.dev.platform_data	= pdata;
> -	platform_device_register(&am3517_emac_device);
> -	platform_device_register(&am3517_mdio_device);
> -	clk_add_alias(NULL, dev_name(&am3517_mdio_device.dev),
> -		      NULL, &am3517_emac_device.dev);
> -
> -	regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
> -	regval = regval & (~(AM35XX_CPGMACSS_SW_RST));
> -	omap_ctrl_writel(regval, AM35XX_CONTROL_IP_SW_RESET);
> -	regval = omap_ctrl_readl(AM35XX_CONTROL_IP_SW_RESET);
> -
> -	return ;
> -}
> -
> -
> 
>  #define LCD_PANEL_PWR		176
>  #define LCD_PANEL_BKLIGHT_PWR	182
> @@ -498,7 +388,7 @@ static void __init am3517_evm_init(void)
>  	i2c_register_board_info(1, am3517evm_i2c1_boardinfo,
>  				ARRAY_SIZE(am3517evm_i2c1_boardinfo));
>  	/*Ethernet*/
> -	am3517_evm_ethernet_init(&am3517_evm_emac_pdata);
> +	am35xx_ethernet_init(AM35XX_EVM_MDIO_FREQUENCY, 1);
> 
>  	/* MUSB */
>  	am3517_evm_musb_init();
> --
> 1.7.6.4
> 
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to majordomo@xxxxxxxxxxxxxxx
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Arm (vger)]     [ARM Kernel]     [ARM MSM]     [Linux Tegra]     [Linux WPAN Networking]     [Linux Wireless Networking]     [Maemo Users]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Trails]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux