提交 a9b14973 编写于 作者: A Andy Fleming 提交者: Paul Mackerras

[PATCH] Slight refactor of interrupt mapping for FSL parts

* Cleaned up interrupt mapping a little by adding a helper
  function which parses the irq out of the device-tree, and puts
  it into a resource.
* Changed the arch/ppc platform files to specify PHY_POLL, instead of -1
* Changed the fixed phy to use PHY_IGNORE_INTERRUPT
* Added ethtool.h and mii.h to phy.h includes
Signed-off-by: NPaul Mackerras <paulus@samba.org>
上级 c37858d3
...@@ -22,6 +22,7 @@ ...@@ -22,6 +22,7 @@
#include <linux/module.h> #include <linux/module.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/phy.h>
#include <linux/fsl_devices.h> #include <linux/fsl_devices.h>
#include <linux/fs_enet_pd.h> #include <linux/fs_enet_pd.h>
#include <linux/fs_uart_pd.h> #include <linux/fs_uart_pd.h>
...@@ -146,7 +147,7 @@ static int __init gfar_mdio_of_init(void) ...@@ -146,7 +147,7 @@ static int __init gfar_mdio_of_init(void)
} }
for (k = 0; k < 32; k++) for (k = 0; k < 32; k++)
mdio_data.irq[k] = -1; mdio_data.irq[k] = PHY_POLL;
while ((child = of_get_next_child(np, child)) != NULL) { while ((child = of_get_next_child(np, child)) != NULL) {
int irq = irq_of_parse_and_map(child, 0); int irq = irq_of_parse_and_map(child, 0);
...@@ -177,6 +178,7 @@ static const char *gfar_tx_intr = "tx"; ...@@ -177,6 +178,7 @@ static const char *gfar_tx_intr = "tx";
static const char *gfar_rx_intr = "rx"; static const char *gfar_rx_intr = "rx";
static const char *gfar_err_intr = "error"; static const char *gfar_err_intr = "error";
static int __init gfar_of_init(void) static int __init gfar_of_init(void)
{ {
struct device_node *np; struct device_node *np;
...@@ -204,8 +206,7 @@ static int __init gfar_of_init(void) ...@@ -204,8 +206,7 @@ static int __init gfar_of_init(void)
if (ret) if (ret)
goto err; goto err;
r[1].start = r[1].end = irq_of_parse_and_map(np, 0); of_irq_to_resource(np, 0, &r[1]);
r[1].flags = IORESOURCE_IRQ;
model = get_property(np, "model", NULL); model = get_property(np, "model", NULL);
...@@ -214,12 +215,10 @@ static int __init gfar_of_init(void) ...@@ -214,12 +215,10 @@ static int __init gfar_of_init(void)
r[1].name = gfar_tx_intr; r[1].name = gfar_tx_intr;
r[2].name = gfar_rx_intr; r[2].name = gfar_rx_intr;
r[2].start = r[2].end = irq_of_parse_and_map(np, 1); of_irq_to_resource(np, 1, &r[2]);
r[2].flags = IORESOURCE_IRQ;
r[3].name = gfar_err_intr; r[3].name = gfar_err_intr;
r[3].start = r[3].end = irq_of_parse_and_map(np, 2); of_irq_to_resource(np, 2, &r[3]);
r[3].flags = IORESOURCE_IRQ;
n_res += 2; n_res += 2;
} }
...@@ -323,8 +322,7 @@ static int __init fsl_i2c_of_init(void) ...@@ -323,8 +322,7 @@ static int __init fsl_i2c_of_init(void)
if (ret) if (ret)
goto err; goto err;
r[1].start = r[1].end = irq_of_parse_and_map(np, 0); of_irq_to_resource(np, 0, &r[1]);
r[1].flags = IORESOURCE_IRQ;
i2c_dev = platform_device_register_simple("fsl-i2c", i, r, 2); i2c_dev = platform_device_register_simple("fsl-i2c", i, r, 2);
if (IS_ERR(i2c_dev)) { if (IS_ERR(i2c_dev)) {
...@@ -459,8 +457,7 @@ static int __init fsl_usb_of_init(void) ...@@ -459,8 +457,7 @@ static int __init fsl_usb_of_init(void)
if (ret) if (ret)
goto err; goto err;
r[1].start = r[1].end = irq_of_parse_and_map(np, 0); of_irq_to_resource(np, 0, &r[1]);
r[1].flags = IORESOURCE_IRQ;
usb_dev_mph = usb_dev_mph =
platform_device_register_simple("fsl-ehci", i, r, 2); platform_device_register_simple("fsl-ehci", i, r, 2);
...@@ -507,8 +504,7 @@ static int __init fsl_usb_of_init(void) ...@@ -507,8 +504,7 @@ static int __init fsl_usb_of_init(void)
if (ret) if (ret)
goto unreg_mph; goto unreg_mph;
r[1].start = r[1].end = irq_of_parse_and_map(np, 0); of_irq_to_resource(np, 0, &r[1]);
r[1].flags = IORESOURCE_IRQ;
usb_dev_dr = usb_dev_dr =
platform_device_register_simple("fsl-ehci", i, r, 2); platform_device_register_simple("fsl-ehci", i, r, 2);
...@@ -591,8 +587,7 @@ static int __init fs_enet_of_init(void) ...@@ -591,8 +587,7 @@ static int __init fs_enet_of_init(void)
r[2].name = fcc_regs_c; r[2].name = fcc_regs_c;
fs_enet_data.fcc_regs_c = r[2].start; fs_enet_data.fcc_regs_c = r[2].start;
r[3].start = r[3].end = irq_of_parse_and_map(np, 0); of_irq_to_resource(np, 0, &r[3]);
r[3].flags = IORESOURCE_IRQ;
fs_enet_dev = fs_enet_dev =
platform_device_register_simple("fsl-cpm-fcc", i, &r[0], 4); platform_device_register_simple("fsl-cpm-fcc", i, &r[0], 4);
...@@ -754,8 +749,7 @@ static int __init cpm_uart_of_init(void) ...@@ -754,8 +749,7 @@ static int __init cpm_uart_of_init(void)
goto err; goto err;
r[1].name = scc_pram; r[1].name = scc_pram;
r[2].start = r[2].end = irq_of_parse_and_map(np, 0); of_irq_to_resource(np, 0, &r[2]);
r[2].flags = IORESOURCE_IRQ;
cpm_uart_dev = cpm_uart_dev =
platform_device_register_simple("fsl-cpm-scc:uart", i, &r[0], 3); platform_device_register_simple("fsl-cpm-scc:uart", i, &r[0], 3);
......
...@@ -121,8 +121,8 @@ mpc834x_sys_setup_arch(void) ...@@ -121,8 +121,8 @@ mpc834x_sys_setup_arch(void)
mdata->irq[0] = MPC83xx_IRQ_EXT1; mdata->irq[0] = MPC83xx_IRQ_EXT1;
mdata->irq[1] = MPC83xx_IRQ_EXT2; mdata->irq[1] = MPC83xx_IRQ_EXT2;
mdata->irq[2] = -1; mdata->irq[2] = PHY_POLL;
mdata->irq[31] = -1; mdata->irq[31] = PHY_POLL;
/* setup the board related information for the enet controllers */ /* setup the board related information for the enet controllers */
pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC83xx_TSEC1); pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC83xx_TSEC1);
......
...@@ -92,9 +92,9 @@ mpc8540ads_setup_arch(void) ...@@ -92,9 +92,9 @@ mpc8540ads_setup_arch(void)
mdata->irq[0] = MPC85xx_IRQ_EXT5; mdata->irq[0] = MPC85xx_IRQ_EXT5;
mdata->irq[1] = MPC85xx_IRQ_EXT5; mdata->irq[1] = MPC85xx_IRQ_EXT5;
mdata->irq[2] = -1; mdata->irq[2] = PHY_POLL;
mdata->irq[3] = MPC85xx_IRQ_EXT5; mdata->irq[3] = MPC85xx_IRQ_EXT5;
mdata->irq[31] = -1; mdata->irq[31] = PHY_POLL;
/* setup the board related information for the enet controllers */ /* setup the board related information for the enet controllers */
pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1);
......
...@@ -156,9 +156,9 @@ mpc8560ads_setup_arch(void) ...@@ -156,9 +156,9 @@ mpc8560ads_setup_arch(void)
mdata->irq[0] = MPC85xx_IRQ_EXT5; mdata->irq[0] = MPC85xx_IRQ_EXT5;
mdata->irq[1] = MPC85xx_IRQ_EXT5; mdata->irq[1] = MPC85xx_IRQ_EXT5;
mdata->irq[2] = -1; mdata->irq[2] = PHY_POLL;
mdata->irq[3] = MPC85xx_IRQ_EXT5; mdata->irq[3] = MPC85xx_IRQ_EXT5;
mdata->irq[31] = -1; mdata->irq[31] = PHY_POLL;
/* setup the board related information for the enet controllers */ /* setup the board related information for the enet controllers */
pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1);
......
...@@ -451,9 +451,9 @@ mpc85xx_cds_setup_arch(void) ...@@ -451,9 +451,9 @@ mpc85xx_cds_setup_arch(void)
mdata->irq[0] = MPC85xx_IRQ_EXT5; mdata->irq[0] = MPC85xx_IRQ_EXT5;
mdata->irq[1] = MPC85xx_IRQ_EXT5; mdata->irq[1] = MPC85xx_IRQ_EXT5;
mdata->irq[2] = -1; mdata->irq[2] = PHY_POLL;
mdata->irq[3] = -1; mdata->irq[3] = PHY_POLL;
mdata->irq[31] = -1; mdata->irq[31] = PHY_POLL;
/* setup the board related information for the enet controllers */ /* setup the board related information for the enet controllers */
pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1);
......
...@@ -129,7 +129,7 @@ sbc8560_setup_arch(void) ...@@ -129,7 +129,7 @@ sbc8560_setup_arch(void)
mdata->irq[25] = MPC85xx_IRQ_EXT6; mdata->irq[25] = MPC85xx_IRQ_EXT6;
mdata->irq[26] = MPC85xx_IRQ_EXT7; mdata->irq[26] = MPC85xx_IRQ_EXT7;
mdata->irq[31] = -1; mdata->irq[31] = PHY_POLL;
/* setup the board related information for the enet controllers */ /* setup the board related information for the enet controllers */
pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1);
......
...@@ -123,7 +123,7 @@ gp3_setup_arch(void) ...@@ -123,7 +123,7 @@ gp3_setup_arch(void)
mdata->irq[2] = MPC85xx_IRQ_EXT5; mdata->irq[2] = MPC85xx_IRQ_EXT5;
mdata->irq[4] = MPC85xx_IRQ_EXT5; mdata->irq[4] = MPC85xx_IRQ_EXT5;
mdata->irq[31] = -1; mdata->irq[31] = PHY_POLL;
/* setup the board related information for the enet controllers */ /* setup the board related information for the enet controllers */
pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1);
......
...@@ -137,9 +137,9 @@ tqm85xx_setup_arch(void) ...@@ -137,9 +137,9 @@ tqm85xx_setup_arch(void)
mdata->irq[0] = MPC85xx_IRQ_EXT8; mdata->irq[0] = MPC85xx_IRQ_EXT8;
mdata->irq[1] = MPC85xx_IRQ_EXT8; mdata->irq[1] = MPC85xx_IRQ_EXT8;
mdata->irq[2] = -1; mdata->irq[2] = PHY_POLL;
mdata->irq[3] = MPC85xx_IRQ_EXT8; mdata->irq[3] = MPC85xx_IRQ_EXT8;
mdata->irq[31] = -1; mdata->irq[31] = PHY_POLL;
/* setup the board related information for the enet controllers */ /* setup the board related information for the enet controllers */
pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1); pdata = (struct gianfar_platform_data *) ppc_sys_get_pdata(MPC85xx_TSEC1);
......
...@@ -266,10 +266,10 @@ static void __init mpc8272ads_fixup_mdio_pdata(struct platform_device *pdev, ...@@ -266,10 +266,10 @@ static void __init mpc8272ads_fixup_mdio_pdata(struct platform_device *pdev,
int idx) int idx)
{ {
m82xx_mii_bb_pdata.irq[0] = PHY_INTERRUPT; m82xx_mii_bb_pdata.irq[0] = PHY_INTERRUPT;
m82xx_mii_bb_pdata.irq[1] = -1; m82xx_mii_bb_pdata.irq[1] = PHY_POLL;
m82xx_mii_bb_pdata.irq[2] = -1; m82xx_mii_bb_pdata.irq[2] = PHY_POLL;
m82xx_mii_bb_pdata.irq[3] = PHY_INTERRUPT; m82xx_mii_bb_pdata.irq[3] = PHY_INTERRUPT;
m82xx_mii_bb_pdata.irq[31] = -1; m82xx_mii_bb_pdata.irq[31] = PHY_POLL;
m82xx_mii_bb_pdata.mdio_dat.offset = m82xx_mii_bb_pdata.mdio_dat.offset =
......
...@@ -361,7 +361,7 @@ int __init mpc866ads_init(void) ...@@ -361,7 +361,7 @@ int __init mpc866ads_init(void)
fmpi->mii_speed = ((((bd->bi_intfreq + 4999999) / 2500000) / 2) & 0x3F) << 1; fmpi->mii_speed = ((((bd->bi_intfreq + 4999999) / 2500000) / 2) & 0x3F) << 1;
/* No PHY interrupt line here */ /* No PHY interrupt line here */
fmpi->irq[0xf] = -1; fmpi->irq[0xf] = PHY_POLL;
/* Since either of the uarts could be used as console, they need to ready */ /* Since either of the uarts could be used as console, they need to ready */
#ifdef CONFIG_SERIAL_CPM_SMC1 #ifdef CONFIG_SERIAL_CPM_SMC1
...@@ -380,7 +380,7 @@ int __init mpc866ads_init(void) ...@@ -380,7 +380,7 @@ int __init mpc866ads_init(void)
fmpi->mii_speed = ((((bd->bi_intfreq + 4999999) / 2500000) / 2) & 0x3F) << 1; fmpi->mii_speed = ((((bd->bi_intfreq + 4999999) / 2500000) / 2) & 0x3F) << 1;
/* No PHY interrupt line here */ /* No PHY interrupt line here */
fmpi->irq[0xf] = -1; fmpi->irq[0xf] = PHY_POLL;
return 0; return 0;
} }
......
...@@ -254,7 +254,7 @@ static int fixed_mdio_register_device(int number, int speed, int duplex) ...@@ -254,7 +254,7 @@ static int fixed_mdio_register_device(int number, int speed, int duplex)
goto device_create_fail; goto device_create_fail;
} }
phydev->irq = -1; phydev->irq = PHY_IGNORE_INTERRUPT;
phydev->dev.bus = &mdio_bus_type; phydev->dev.bus = &mdio_bus_type;
if(number) if(number)
......
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
*/ */
#include <linux/types.h> #include <linux/types.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/platform_device.h>
#include <asm/atomic.h> #include <asm/atomic.h>
/* Definitions used by the flattened device tree */ /* Definitions used by the flattened device tree */
...@@ -331,6 +332,12 @@ extern int of_irq_map_one(struct device_node *device, int index, ...@@ -331,6 +332,12 @@ extern int of_irq_map_one(struct device_node *device, int index,
struct pci_dev; struct pci_dev;
extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq); extern int of_irq_map_pci(struct pci_dev *pdev, struct of_irq *out_irq);
static inline void of_irq_to_resource(struct device_node *dev, int index, struct resource *r)
{
r->start = r->end = irq_of_parse_and_map(dev, index);
r->flags = IORESOURCE_IRQ;
}
#endif /* __KERNEL__ */ #endif /* __KERNEL__ */
#endif /* _POWERPC_PROM_H */ #endif /* _POWERPC_PROM_H */
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
#include <linux/spinlock.h> #include <linux/spinlock.h>
#include <linux/device.h> #include <linux/device.h>
#include <linux/ethtool.h>
#include <linux/mii.h>
#include <asm/irq.h>
#define PHY_BASIC_FEATURES (SUPPORTED_10baseT_Half | \ #define PHY_BASIC_FEATURES (SUPPORTED_10baseT_Half | \
SUPPORTED_10baseT_Full | \ SUPPORTED_10baseT_Full | \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册