| /* |
| * Driver for Micrel/Kendin PHYs |
| * |
| * Copyright (c) 2008-2009 Gabor Juhos <juhosg@openwrt.org> |
| * Copyright (C) 2008 Imre Kaloz <kaloz@openwrt.org> |
| * |
| * 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. |
| * |
| */ |
| |
| #include <linux/module.h> |
| #include <linux/delay.h> |
| #include <linux/skbuff.h> |
| #include <linux/phy.h> |
| |
| #define KSZ_REG_INT_CTRL 0x1b |
| |
| #define KSZ_INT_LU_EN (1 << 8) /* enable Link Up interrupt */ |
| #define KSZ_INT_RF_EN (1 << 9) /* enable Remote Fault interrupt */ |
| #define KSZ_INT_LD_EN (1 << 10) /* enable Link Down interrupt */ |
| |
| #define KSZ_INT_INIT (KSZ_INT_LU_EN | KSZ_INT_LD_EN) |
| |
| static int ksz8041_ack_interrupt(struct phy_device *phydev) |
| { |
| int err; |
| |
| err = phy_read(phydev, KSZ_REG_INT_CTRL); |
| |
| return (err < 0) ? err : 0; |
| } |
| |
| static int ksz8041_config_intr(struct phy_device *phydev) |
| { |
| int err; |
| |
| if (phydev->interrupts == PHY_INTERRUPT_ENABLED) |
| err = phy_write(phydev, KSZ_REG_INT_CTRL, |
| KSZ_INT_INIT); |
| else |
| err = phy_write(phydev, KSZ_REG_INT_CTRL, 0); |
| |
| return err; |
| } |
| |
| static struct phy_driver ksz8041_phy_driver = { |
| .phy_id = 0x00221512, |
| .name = "Micrel KSZ8041", |
| .phy_id_mask = 0x001fffff, |
| .features = PHY_BASIC_FEATURES, |
| .flags = PHY_HAS_INTERRUPT, |
| .config_aneg = genphy_config_aneg, |
| .read_status = genphy_read_status, |
| .ack_interrupt = ksz8041_ack_interrupt, |
| .config_intr = ksz8041_config_intr, |
| .driver = { |
| .owner = THIS_MODULE, |
| }, |
| }; |
| |
| static int __init micrel_phy_init(void) |
| { |
| return phy_driver_register(&ksz8041_phy_driver); |
| } |
| |
| static void __exit micrel_phy_exit(void) |
| { |
| phy_driver_unregister(&ksz8041_phy_driver); |
| } |
| |
| #ifdef MODULE |
| module_init(micrel_phy_init); |
| module_exit(micrel_phy_exit); |
| #else |
| subsys_initcall(micrel_phy_init); |
| #endif |
| |
| MODULE_DESCRIPTION("Micrel/Kendin PHY driver"); |
| MODULE_AUTHOR("Gabor Juhos <juhosg@openwrt.org>"); |
| MODULE_AUTHOR("Imre Kaloz <kaloz@openwrt.org>"); |
| MODULE_LICENSE("GPL v2"); |