173970055SRussell King #include <linux/delay.h> 254a2fc62SFlorian Fainelli #include <linux/gpio/consumer.h> 373970055SRussell King #include <linux/i2c.h> 473970055SRussell King #include <linux/interrupt.h> 573970055SRussell King #include <linux/jiffies.h> 673970055SRussell King #include <linux/module.h> 773970055SRussell King #include <linux/mutex.h> 873970055SRussell King #include <linux/of.h> 973970055SRussell King #include <linux/phy.h> 1073970055SRussell King #include <linux/platform_device.h> 1173970055SRussell King #include <linux/rtnetlink.h> 1273970055SRussell King #include <linux/slab.h> 1373970055SRussell King #include <linux/workqueue.h> 1473970055SRussell King 1573970055SRussell King #include "mdio-i2c.h" 1673970055SRussell King #include "sfp.h" 1773970055SRussell King #include "swphy.h" 1873970055SRussell King 1973970055SRussell King enum { 2073970055SRussell King GPIO_MODDEF0, 2173970055SRussell King GPIO_LOS, 2273970055SRussell King GPIO_TX_FAULT, 2373970055SRussell King GPIO_TX_DISABLE, 2473970055SRussell King GPIO_RATE_SELECT, 2573970055SRussell King GPIO_MAX, 2673970055SRussell King 2773970055SRussell King SFP_F_PRESENT = BIT(GPIO_MODDEF0), 2873970055SRussell King SFP_F_LOS = BIT(GPIO_LOS), 2973970055SRussell King SFP_F_TX_FAULT = BIT(GPIO_TX_FAULT), 3073970055SRussell King SFP_F_TX_DISABLE = BIT(GPIO_TX_DISABLE), 3173970055SRussell King SFP_F_RATE_SELECT = BIT(GPIO_RATE_SELECT), 3273970055SRussell King 3373970055SRussell King SFP_E_INSERT = 0, 3473970055SRussell King SFP_E_REMOVE, 3573970055SRussell King SFP_E_DEV_DOWN, 3673970055SRussell King SFP_E_DEV_UP, 3773970055SRussell King SFP_E_TX_FAULT, 3873970055SRussell King SFP_E_TX_CLEAR, 3973970055SRussell King SFP_E_LOS_HIGH, 4073970055SRussell King SFP_E_LOS_LOW, 4173970055SRussell King SFP_E_TIMEOUT, 4273970055SRussell King 4373970055SRussell King SFP_MOD_EMPTY = 0, 4473970055SRussell King SFP_MOD_PROBE, 4573970055SRussell King SFP_MOD_PRESENT, 4673970055SRussell King SFP_MOD_ERROR, 4773970055SRussell King 4873970055SRussell King SFP_DEV_DOWN = 0, 4973970055SRussell King SFP_DEV_UP, 5073970055SRussell King 5173970055SRussell King SFP_S_DOWN = 0, 5273970055SRussell King SFP_S_INIT, 5373970055SRussell King SFP_S_WAIT_LOS, 5473970055SRussell King SFP_S_LINK_UP, 5573970055SRussell King SFP_S_TX_FAULT, 5673970055SRussell King SFP_S_REINIT, 5773970055SRussell King SFP_S_TX_DISABLE, 5873970055SRussell King }; 5973970055SRussell King 6073970055SRussell King static const char *gpio_of_names[] = { 6125ee0793SBaruch Siach "mod-def0", 6273970055SRussell King "los", 6373970055SRussell King "tx-fault", 6473970055SRussell King "tx-disable", 6525ee0793SBaruch Siach "rate-select0", 6673970055SRussell King }; 6773970055SRussell King 6873970055SRussell King static const enum gpiod_flags gpio_flags[] = { 6973970055SRussell King GPIOD_IN, 7073970055SRussell King GPIOD_IN, 7173970055SRussell King GPIOD_IN, 7273970055SRussell King GPIOD_ASIS, 7373970055SRussell King GPIOD_ASIS, 7473970055SRussell King }; 7573970055SRussell King 7673970055SRussell King #define T_INIT_JIFFIES msecs_to_jiffies(300) 7773970055SRussell King #define T_RESET_US 10 7873970055SRussell King #define T_FAULT_RECOVER msecs_to_jiffies(1000) 7973970055SRussell King 8073970055SRussell King /* SFP module presence detection is poor: the three MOD DEF signals are 8173970055SRussell King * the same length on the PCB, which means it's possible for MOD DEF 0 to 8273970055SRussell King * connect before the I2C bus on MOD DEF 1/2. 8373970055SRussell King * 8473970055SRussell King * The SFP MSA specifies 300ms as t_init (the time taken for TX_FAULT to 8573970055SRussell King * be deasserted) but makes no mention of the earliest time before we can 8673970055SRussell King * access the I2C EEPROM. However, Avago modules require 300ms. 8773970055SRussell King */ 8873970055SRussell King #define T_PROBE_INIT msecs_to_jiffies(300) 8973970055SRussell King #define T_PROBE_RETRY msecs_to_jiffies(100) 9073970055SRussell King 91516b29edSFlorian Fainelli /* SFP modules appear to always have their PHY configured for bus address 9273970055SRussell King * 0x56 (which with mdio-i2c, translates to a PHY address of 22). 9373970055SRussell King */ 9473970055SRussell King #define SFP_PHY_ADDR 22 9573970055SRussell King 96516b29edSFlorian Fainelli /* Give this long for the PHY to reset. */ 9773970055SRussell King #define T_PHY_RESET_MS 50 9873970055SRussell King 9973970055SRussell King static DEFINE_MUTEX(sfp_mutex); 10073970055SRussell King 10173970055SRussell King struct sfp { 10273970055SRussell King struct device *dev; 10373970055SRussell King struct i2c_adapter *i2c; 10473970055SRussell King struct mii_bus *i2c_mii; 10573970055SRussell King struct sfp_bus *sfp_bus; 10673970055SRussell King struct phy_device *mod_phy; 10773970055SRussell King 10873970055SRussell King unsigned int (*get_state)(struct sfp *); 10973970055SRussell King void (*set_state)(struct sfp *, unsigned int); 11073970055SRussell King int (*read)(struct sfp *, bool, u8, void *, size_t); 11173970055SRussell King 11273970055SRussell King struct gpio_desc *gpio[GPIO_MAX]; 11373970055SRussell King 11473970055SRussell King unsigned int state; 11573970055SRussell King struct delayed_work poll; 11673970055SRussell King struct delayed_work timeout; 11773970055SRussell King struct mutex sm_mutex; 11873970055SRussell King unsigned char sm_mod_state; 11973970055SRussell King unsigned char sm_dev_state; 12073970055SRussell King unsigned short sm_state; 12173970055SRussell King unsigned int sm_retries; 12273970055SRussell King 12373970055SRussell King struct sfp_eeprom_id id; 12473970055SRussell King }; 12573970055SRussell King 12673970055SRussell King static unsigned long poll_jiffies; 12773970055SRussell King 12873970055SRussell King static unsigned int sfp_gpio_get_state(struct sfp *sfp) 12973970055SRussell King { 13073970055SRussell King unsigned int i, state, v; 13173970055SRussell King 13273970055SRussell King for (i = state = 0; i < GPIO_MAX; i++) { 13373970055SRussell King if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) 13473970055SRussell King continue; 13573970055SRussell King 13673970055SRussell King v = gpiod_get_value_cansleep(sfp->gpio[i]); 13773970055SRussell King if (v) 13873970055SRussell King state |= BIT(i); 13973970055SRussell King } 14073970055SRussell King 14173970055SRussell King return state; 14273970055SRussell King } 14373970055SRussell King 14473970055SRussell King static void sfp_gpio_set_state(struct sfp *sfp, unsigned int state) 14573970055SRussell King { 14673970055SRussell King if (state & SFP_F_PRESENT) { 14773970055SRussell King /* If the module is present, drive the signals */ 14873970055SRussell King if (sfp->gpio[GPIO_TX_DISABLE]) 14973970055SRussell King gpiod_direction_output(sfp->gpio[GPIO_TX_DISABLE], 15073970055SRussell King state & SFP_F_TX_DISABLE); 15173970055SRussell King if (state & SFP_F_RATE_SELECT) 15273970055SRussell King gpiod_direction_output(sfp->gpio[GPIO_RATE_SELECT], 15373970055SRussell King state & SFP_F_RATE_SELECT); 15473970055SRussell King } else { 15573970055SRussell King /* Otherwise, let them float to the pull-ups */ 15673970055SRussell King if (sfp->gpio[GPIO_TX_DISABLE]) 15773970055SRussell King gpiod_direction_input(sfp->gpio[GPIO_TX_DISABLE]); 15873970055SRussell King if (state & SFP_F_RATE_SELECT) 15973970055SRussell King gpiod_direction_input(sfp->gpio[GPIO_RATE_SELECT]); 16073970055SRussell King } 16173970055SRussell King } 16273970055SRussell King 16373970055SRussell King static int sfp__i2c_read(struct i2c_adapter *i2c, u8 bus_addr, u8 dev_addr, 16473970055SRussell King void *buf, size_t len) 16573970055SRussell King { 16673970055SRussell King struct i2c_msg msgs[2]; 16773970055SRussell King int ret; 16873970055SRussell King 16973970055SRussell King msgs[0].addr = bus_addr; 17073970055SRussell King msgs[0].flags = 0; 17173970055SRussell King msgs[0].len = 1; 17273970055SRussell King msgs[0].buf = &dev_addr; 17373970055SRussell King msgs[1].addr = bus_addr; 17473970055SRussell King msgs[1].flags = I2C_M_RD; 17573970055SRussell King msgs[1].len = len; 17673970055SRussell King msgs[1].buf = buf; 17773970055SRussell King 17873970055SRussell King ret = i2c_transfer(i2c, msgs, ARRAY_SIZE(msgs)); 17973970055SRussell King if (ret < 0) 18073970055SRussell King return ret; 18173970055SRussell King 18273970055SRussell King return ret == ARRAY_SIZE(msgs) ? len : 0; 18373970055SRussell King } 18473970055SRussell King 18573970055SRussell King static int sfp_i2c_read(struct sfp *sfp, bool a2, u8 addr, void *buf, 18673970055SRussell King size_t len) 18773970055SRussell King { 18873970055SRussell King return sfp__i2c_read(sfp->i2c, a2 ? 0x51 : 0x50, addr, buf, len); 18973970055SRussell King } 19073970055SRussell King 19173970055SRussell King static int sfp_i2c_configure(struct sfp *sfp, struct i2c_adapter *i2c) 19273970055SRussell King { 19373970055SRussell King struct mii_bus *i2c_mii; 19473970055SRussell King int ret; 19573970055SRussell King 19673970055SRussell King if (!i2c_check_functionality(i2c, I2C_FUNC_I2C)) 19773970055SRussell King return -EINVAL; 19873970055SRussell King 19973970055SRussell King sfp->i2c = i2c; 20073970055SRussell King sfp->read = sfp_i2c_read; 20173970055SRussell King 20273970055SRussell King i2c_mii = mdio_i2c_alloc(sfp->dev, i2c); 20373970055SRussell King if (IS_ERR(i2c_mii)) 20473970055SRussell King return PTR_ERR(i2c_mii); 20573970055SRussell King 20673970055SRussell King i2c_mii->name = "SFP I2C Bus"; 20773970055SRussell King i2c_mii->phy_mask = ~0; 20873970055SRussell King 20973970055SRussell King ret = mdiobus_register(i2c_mii); 21073970055SRussell King if (ret < 0) { 21173970055SRussell King mdiobus_free(i2c_mii); 21273970055SRussell King return ret; 21373970055SRussell King } 21473970055SRussell King 21573970055SRussell King sfp->i2c_mii = i2c_mii; 21673970055SRussell King 21773970055SRussell King return 0; 21873970055SRussell King } 21973970055SRussell King 22073970055SRussell King /* Interface */ 22173970055SRussell King static unsigned int sfp_get_state(struct sfp *sfp) 22273970055SRussell King { 22373970055SRussell King return sfp->get_state(sfp); 22473970055SRussell King } 22573970055SRussell King 22673970055SRussell King static void sfp_set_state(struct sfp *sfp, unsigned int state) 22773970055SRussell King { 22873970055SRussell King sfp->set_state(sfp, state); 22973970055SRussell King } 23073970055SRussell King 23173970055SRussell King static int sfp_read(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len) 23273970055SRussell King { 23373970055SRussell King return sfp->read(sfp, a2, addr, buf, len); 23473970055SRussell King } 23573970055SRussell King 23673970055SRussell King static unsigned int sfp_check(void *buf, size_t len) 23773970055SRussell King { 23873970055SRussell King u8 *p, check; 23973970055SRussell King 24073970055SRussell King for (p = buf, check = 0; len; p++, len--) 24173970055SRussell King check += *p; 24273970055SRussell King 24373970055SRussell King return check; 24473970055SRussell King } 24573970055SRussell King 24673970055SRussell King /* Helpers */ 24773970055SRussell King static void sfp_module_tx_disable(struct sfp *sfp) 24873970055SRussell King { 24973970055SRussell King dev_dbg(sfp->dev, "tx disable %u -> %u\n", 25073970055SRussell King sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 1); 25173970055SRussell King sfp->state |= SFP_F_TX_DISABLE; 25273970055SRussell King sfp_set_state(sfp, sfp->state); 25373970055SRussell King } 25473970055SRussell King 25573970055SRussell King static void sfp_module_tx_enable(struct sfp *sfp) 25673970055SRussell King { 25773970055SRussell King dev_dbg(sfp->dev, "tx disable %u -> %u\n", 25873970055SRussell King sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 0); 25973970055SRussell King sfp->state &= ~SFP_F_TX_DISABLE; 26073970055SRussell King sfp_set_state(sfp, sfp->state); 26173970055SRussell King } 26273970055SRussell King 26373970055SRussell King static void sfp_module_tx_fault_reset(struct sfp *sfp) 26473970055SRussell King { 26573970055SRussell King unsigned int state = sfp->state; 26673970055SRussell King 26773970055SRussell King if (state & SFP_F_TX_DISABLE) 26873970055SRussell King return; 26973970055SRussell King 27073970055SRussell King sfp_set_state(sfp, state | SFP_F_TX_DISABLE); 27173970055SRussell King 27273970055SRussell King udelay(T_RESET_US); 27373970055SRussell King 27473970055SRussell King sfp_set_state(sfp, state); 27573970055SRussell King } 27673970055SRussell King 27773970055SRussell King /* SFP state machine */ 27873970055SRussell King static void sfp_sm_set_timer(struct sfp *sfp, unsigned int timeout) 27973970055SRussell King { 28073970055SRussell King if (timeout) 28173970055SRussell King mod_delayed_work(system_power_efficient_wq, &sfp->timeout, 28273970055SRussell King timeout); 28373970055SRussell King else 28473970055SRussell King cancel_delayed_work(&sfp->timeout); 28573970055SRussell King } 28673970055SRussell King 28773970055SRussell King static void sfp_sm_next(struct sfp *sfp, unsigned int state, 28873970055SRussell King unsigned int timeout) 28973970055SRussell King { 29073970055SRussell King sfp->sm_state = state; 29173970055SRussell King sfp_sm_set_timer(sfp, timeout); 29273970055SRussell King } 29373970055SRussell King 294516b29edSFlorian Fainelli static void sfp_sm_ins_next(struct sfp *sfp, unsigned int state, 295516b29edSFlorian Fainelli unsigned int timeout) 29673970055SRussell King { 29773970055SRussell King sfp->sm_mod_state = state; 29873970055SRussell King sfp_sm_set_timer(sfp, timeout); 29973970055SRussell King } 30073970055SRussell King 30173970055SRussell King static void sfp_sm_phy_detach(struct sfp *sfp) 30273970055SRussell King { 30373970055SRussell King phy_stop(sfp->mod_phy); 30473970055SRussell King sfp_remove_phy(sfp->sfp_bus); 30573970055SRussell King phy_device_remove(sfp->mod_phy); 30673970055SRussell King phy_device_free(sfp->mod_phy); 30773970055SRussell King sfp->mod_phy = NULL; 30873970055SRussell King } 30973970055SRussell King 31073970055SRussell King static void sfp_sm_probe_phy(struct sfp *sfp) 31173970055SRussell King { 31273970055SRussell King struct phy_device *phy; 31373970055SRussell King int err; 31473970055SRussell King 31573970055SRussell King msleep(T_PHY_RESET_MS); 31673970055SRussell King 31773970055SRussell King phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR); 31873970055SRussell King if (IS_ERR(phy)) { 31973970055SRussell King dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy)); 32073970055SRussell King return; 32173970055SRussell King } 32273970055SRussell King if (!phy) { 32373970055SRussell King dev_info(sfp->dev, "no PHY detected\n"); 32473970055SRussell King return; 32573970055SRussell King } 32673970055SRussell King 32773970055SRussell King err = sfp_add_phy(sfp->sfp_bus, phy); 32873970055SRussell King if (err) { 32973970055SRussell King phy_device_remove(phy); 33073970055SRussell King phy_device_free(phy); 33173970055SRussell King dev_err(sfp->dev, "sfp_add_phy failed: %d\n", err); 33273970055SRussell King return; 33373970055SRussell King } 33473970055SRussell King 33573970055SRussell King sfp->mod_phy = phy; 33673970055SRussell King phy_start(phy); 33773970055SRussell King } 33873970055SRussell King 33973970055SRussell King static void sfp_sm_link_up(struct sfp *sfp) 34073970055SRussell King { 34173970055SRussell King sfp_link_up(sfp->sfp_bus); 34273970055SRussell King sfp_sm_next(sfp, SFP_S_LINK_UP, 0); 34373970055SRussell King } 34473970055SRussell King 34573970055SRussell King static void sfp_sm_link_down(struct sfp *sfp) 34673970055SRussell King { 34773970055SRussell King sfp_link_down(sfp->sfp_bus); 34873970055SRussell King } 34973970055SRussell King 35073970055SRussell King static void sfp_sm_link_check_los(struct sfp *sfp) 35173970055SRussell King { 35273970055SRussell King unsigned int los = sfp->state & SFP_F_LOS; 35373970055SRussell King 354710dfbb0SRussell King /* If neither SFP_OPTIONS_LOS_INVERTED nor SFP_OPTIONS_LOS_NORMAL 355710dfbb0SRussell King * are set, we assume that no LOS signal is available. 35673970055SRussell King */ 357acf1c02fSRussell King if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED)) 35873970055SRussell King los ^= SFP_F_LOS; 359710dfbb0SRussell King else if (!(sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL))) 360710dfbb0SRussell King los = 0; 36173970055SRussell King 36273970055SRussell King if (los) 36373970055SRussell King sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); 36473970055SRussell King else 36573970055SRussell King sfp_sm_link_up(sfp); 36673970055SRussell King } 36773970055SRussell King 368710dfbb0SRussell King static bool sfp_los_event_active(struct sfp *sfp, unsigned int event) 369710dfbb0SRussell King { 370710dfbb0SRussell King return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && 371710dfbb0SRussell King event == SFP_E_LOS_LOW) || 372710dfbb0SRussell King (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && 373710dfbb0SRussell King event == SFP_E_LOS_HIGH); 374710dfbb0SRussell King } 375710dfbb0SRussell King 376710dfbb0SRussell King static bool sfp_los_event_inactive(struct sfp *sfp, unsigned int event) 377710dfbb0SRussell King { 378710dfbb0SRussell King return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && 379710dfbb0SRussell King event == SFP_E_LOS_HIGH) || 380710dfbb0SRussell King (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && 381710dfbb0SRussell King event == SFP_E_LOS_LOW); 382710dfbb0SRussell King } 383710dfbb0SRussell King 38473970055SRussell King static void sfp_sm_fault(struct sfp *sfp, bool warn) 38573970055SRussell King { 38673970055SRussell King if (sfp->sm_retries && !--sfp->sm_retries) { 387516b29edSFlorian Fainelli dev_err(sfp->dev, 388516b29edSFlorian Fainelli "module persistently indicates fault, disabling\n"); 38973970055SRussell King sfp_sm_next(sfp, SFP_S_TX_DISABLE, 0); 39073970055SRussell King } else { 39173970055SRussell King if (warn) 39273970055SRussell King dev_err(sfp->dev, "module transmit fault indicated\n"); 39373970055SRussell King 39473970055SRussell King sfp_sm_next(sfp, SFP_S_TX_FAULT, T_FAULT_RECOVER); 39573970055SRussell King } 39673970055SRussell King } 39773970055SRussell King 39873970055SRussell King static void sfp_sm_mod_init(struct sfp *sfp) 39973970055SRussell King { 40073970055SRussell King sfp_module_tx_enable(sfp); 40173970055SRussell King 40273970055SRussell King /* Wait t_init before indicating that the link is up, provided the 40373970055SRussell King * current state indicates no TX_FAULT. If TX_FAULT clears before 40473970055SRussell King * this time, that's fine too. 40573970055SRussell King */ 40673970055SRussell King sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES); 40773970055SRussell King sfp->sm_retries = 5; 40873970055SRussell King 40973970055SRussell King /* Setting the serdes link mode is guesswork: there's no 41073970055SRussell King * field in the EEPROM which indicates what mode should 41173970055SRussell King * be used. 41273970055SRussell King * 41373970055SRussell King * If it's a gigabit-only fiber module, it probably does 41473970055SRussell King * not have a PHY, so switch to 802.3z negotiation mode. 41573970055SRussell King * Otherwise, switch to SGMII mode (which is required to 41673970055SRussell King * support non-gigabit speeds) and probe for a PHY. 41773970055SRussell King */ 41873970055SRussell King if (sfp->id.base.e1000_base_t || 41973970055SRussell King sfp->id.base.e100_base_lx || 42073970055SRussell King sfp->id.base.e100_base_fx) 42173970055SRussell King sfp_sm_probe_phy(sfp); 42273970055SRussell King } 42373970055SRussell King 42473970055SRussell King static int sfp_sm_mod_probe(struct sfp *sfp) 42573970055SRussell King { 42673970055SRussell King /* SFP module inserted - read I2C data */ 42773970055SRussell King struct sfp_eeprom_id id; 42873970055SRussell King char vendor[17]; 42973970055SRussell King char part[17]; 43073970055SRussell King char sn[17]; 43173970055SRussell King char date[9]; 43273970055SRussell King char rev[5]; 43373970055SRussell King u8 check; 43473970055SRussell King int err; 43573970055SRussell King 43673970055SRussell King err = sfp_read(sfp, false, 0, &id, sizeof(id)); 43773970055SRussell King if (err < 0) { 43873970055SRussell King dev_err(sfp->dev, "failed to read EEPROM: %d\n", err); 43973970055SRussell King return -EAGAIN; 44073970055SRussell King } 44173970055SRussell King 44273970055SRussell King if (err != sizeof(id)) { 44373970055SRussell King dev_err(sfp->dev, "EEPROM short read: %d\n", err); 44473970055SRussell King return -EAGAIN; 44573970055SRussell King } 44673970055SRussell King 44773970055SRussell King /* Validate the checksum over the base structure */ 44873970055SRussell King check = sfp_check(&id.base, sizeof(id.base) - 1); 44973970055SRussell King if (check != id.base.cc_base) { 45073970055SRussell King dev_err(sfp->dev, 45173970055SRussell King "EEPROM base structure checksum failure: 0x%02x\n", 45273970055SRussell King check); 45373970055SRussell King print_hex_dump(KERN_ERR, "sfp EE: ", DUMP_PREFIX_OFFSET, 45473970055SRussell King 16, 1, &id, sizeof(id.base) - 1, true); 45573970055SRussell King return -EINVAL; 45673970055SRussell King } 45773970055SRussell King 45873970055SRussell King check = sfp_check(&id.ext, sizeof(id.ext) - 1); 45973970055SRussell King if (check != id.ext.cc_ext) { 46073970055SRussell King dev_err(sfp->dev, 46173970055SRussell King "EEPROM extended structure checksum failure: 0x%02x\n", 46273970055SRussell King check); 46373970055SRussell King memset(&id.ext, 0, sizeof(id.ext)); 46473970055SRussell King } 46573970055SRussell King 46673970055SRussell King sfp->id = id; 46773970055SRussell King 46873970055SRussell King memcpy(vendor, sfp->id.base.vendor_name, 16); 46973970055SRussell King vendor[16] = '\0'; 47073970055SRussell King memcpy(part, sfp->id.base.vendor_pn, 16); 47173970055SRussell King part[16] = '\0'; 47273970055SRussell King memcpy(rev, sfp->id.base.vendor_rev, 4); 47373970055SRussell King rev[4] = '\0'; 47473970055SRussell King memcpy(sn, sfp->id.ext.vendor_sn, 16); 47573970055SRussell King sn[16] = '\0'; 47673970055SRussell King memcpy(date, sfp->id.ext.datecode, 8); 47773970055SRussell King date[8] = '\0'; 47873970055SRussell King 479516b29edSFlorian Fainelli dev_info(sfp->dev, "module %s %s rev %s sn %s dc %s\n", 480516b29edSFlorian Fainelli vendor, part, rev, sn, date); 48173970055SRussell King 48273970055SRussell King /* We only support SFP modules, not the legacy GBIC modules. */ 48373970055SRussell King if (sfp->id.base.phys_id != SFP_PHYS_ID_SFP || 48473970055SRussell King sfp->id.base.phys_ext_id != SFP_PHYS_EXT_ID_SFP) { 48573970055SRussell King dev_err(sfp->dev, "module is not SFP - phys id 0x%02x 0x%02x\n", 48673970055SRussell King sfp->id.base.phys_id, sfp->id.base.phys_ext_id); 48773970055SRussell King return -EINVAL; 48873970055SRussell King } 48973970055SRussell King 490ec7681bdSRussell King /* If the module requires address swap mode, warn about it */ 491ec7681bdSRussell King if (sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE) 492ec7681bdSRussell King dev_warn(sfp->dev, 493ec7681bdSRussell King "module address swap to access page 0xA2 is not supported.\n"); 494ec7681bdSRussell King 49573970055SRussell King return sfp_module_insert(sfp->sfp_bus, &sfp->id); 49673970055SRussell King } 49773970055SRussell King 49873970055SRussell King static void sfp_sm_mod_remove(struct sfp *sfp) 49973970055SRussell King { 50073970055SRussell King sfp_module_remove(sfp->sfp_bus); 50173970055SRussell King 50273970055SRussell King if (sfp->mod_phy) 50373970055SRussell King sfp_sm_phy_detach(sfp); 50473970055SRussell King 50573970055SRussell King sfp_module_tx_disable(sfp); 50673970055SRussell King 50773970055SRussell King memset(&sfp->id, 0, sizeof(sfp->id)); 50873970055SRussell King 50973970055SRussell King dev_info(sfp->dev, "module removed\n"); 51073970055SRussell King } 51173970055SRussell King 51273970055SRussell King static void sfp_sm_event(struct sfp *sfp, unsigned int event) 51373970055SRussell King { 51473970055SRussell King mutex_lock(&sfp->sm_mutex); 51573970055SRussell King 51673970055SRussell King dev_dbg(sfp->dev, "SM: enter %u:%u:%u event %u\n", 51773970055SRussell King sfp->sm_mod_state, sfp->sm_dev_state, sfp->sm_state, event); 51873970055SRussell King 51973970055SRussell King /* This state machine tracks the insert/remove state of 52073970055SRussell King * the module, and handles probing the on-board EEPROM. 52173970055SRussell King */ 52273970055SRussell King switch (sfp->sm_mod_state) { 52373970055SRussell King default: 52473970055SRussell King if (event == SFP_E_INSERT) { 52573970055SRussell King sfp_module_tx_disable(sfp); 52673970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_PROBE, T_PROBE_INIT); 52773970055SRussell King } 52873970055SRussell King break; 52973970055SRussell King 53073970055SRussell King case SFP_MOD_PROBE: 53173970055SRussell King if (event == SFP_E_REMOVE) { 53273970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); 53373970055SRussell King } else if (event == SFP_E_TIMEOUT) { 53473970055SRussell King int err = sfp_sm_mod_probe(sfp); 53573970055SRussell King 53673970055SRussell King if (err == 0) 53773970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_PRESENT, 0); 53873970055SRussell King else if (err == -EAGAIN) 53973970055SRussell King sfp_sm_set_timer(sfp, T_PROBE_RETRY); 54073970055SRussell King else 54173970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_ERROR, 0); 54273970055SRussell King } 54373970055SRussell King break; 54473970055SRussell King 54573970055SRussell King case SFP_MOD_PRESENT: 54673970055SRussell King case SFP_MOD_ERROR: 54773970055SRussell King if (event == SFP_E_REMOVE) { 54873970055SRussell King sfp_sm_mod_remove(sfp); 54973970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); 55073970055SRussell King } 55173970055SRussell King break; 55273970055SRussell King } 55373970055SRussell King 55473970055SRussell King /* This state machine tracks the netdev up/down state */ 55573970055SRussell King switch (sfp->sm_dev_state) { 55673970055SRussell King default: 55773970055SRussell King if (event == SFP_E_DEV_UP) 55873970055SRussell King sfp->sm_dev_state = SFP_DEV_UP; 55973970055SRussell King break; 56073970055SRussell King 56173970055SRussell King case SFP_DEV_UP: 56273970055SRussell King if (event == SFP_E_DEV_DOWN) { 56373970055SRussell King /* If the module has a PHY, avoid raising TX disable 56473970055SRussell King * as this resets the PHY. Otherwise, raise it to 56573970055SRussell King * turn the laser off. 56673970055SRussell King */ 56773970055SRussell King if (!sfp->mod_phy) 56873970055SRussell King sfp_module_tx_disable(sfp); 56973970055SRussell King sfp->sm_dev_state = SFP_DEV_DOWN; 57073970055SRussell King } 57173970055SRussell King break; 57273970055SRussell King } 57373970055SRussell King 57473970055SRussell King /* Some events are global */ 57573970055SRussell King if (sfp->sm_state != SFP_S_DOWN && 57673970055SRussell King (sfp->sm_mod_state != SFP_MOD_PRESENT || 57773970055SRussell King sfp->sm_dev_state != SFP_DEV_UP)) { 57873970055SRussell King if (sfp->sm_state == SFP_S_LINK_UP && 57973970055SRussell King sfp->sm_dev_state == SFP_DEV_UP) 58073970055SRussell King sfp_sm_link_down(sfp); 58173970055SRussell King if (sfp->mod_phy) 58273970055SRussell King sfp_sm_phy_detach(sfp); 58373970055SRussell King sfp_sm_next(sfp, SFP_S_DOWN, 0); 58473970055SRussell King mutex_unlock(&sfp->sm_mutex); 58573970055SRussell King return; 58673970055SRussell King } 58773970055SRussell King 58873970055SRussell King /* The main state machine */ 58973970055SRussell King switch (sfp->sm_state) { 59073970055SRussell King case SFP_S_DOWN: 59173970055SRussell King if (sfp->sm_mod_state == SFP_MOD_PRESENT && 59273970055SRussell King sfp->sm_dev_state == SFP_DEV_UP) 59373970055SRussell King sfp_sm_mod_init(sfp); 59473970055SRussell King break; 59573970055SRussell King 59673970055SRussell King case SFP_S_INIT: 59773970055SRussell King if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) 59873970055SRussell King sfp_sm_fault(sfp, true); 59973970055SRussell King else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) 60073970055SRussell King sfp_sm_link_check_los(sfp); 60173970055SRussell King break; 60273970055SRussell King 60373970055SRussell King case SFP_S_WAIT_LOS: 60473970055SRussell King if (event == SFP_E_TX_FAULT) 60573970055SRussell King sfp_sm_fault(sfp, true); 606710dfbb0SRussell King else if (sfp_los_event_inactive(sfp, event)) 60773970055SRussell King sfp_sm_link_up(sfp); 60873970055SRussell King break; 60973970055SRussell King 61073970055SRussell King case SFP_S_LINK_UP: 61173970055SRussell King if (event == SFP_E_TX_FAULT) { 61273970055SRussell King sfp_sm_link_down(sfp); 61373970055SRussell King sfp_sm_fault(sfp, true); 614710dfbb0SRussell King } else if (sfp_los_event_active(sfp, event)) { 61573970055SRussell King sfp_sm_link_down(sfp); 61673970055SRussell King sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); 61773970055SRussell King } 61873970055SRussell King break; 61973970055SRussell King 62073970055SRussell King case SFP_S_TX_FAULT: 62173970055SRussell King if (event == SFP_E_TIMEOUT) { 62273970055SRussell King sfp_module_tx_fault_reset(sfp); 62373970055SRussell King sfp_sm_next(sfp, SFP_S_REINIT, T_INIT_JIFFIES); 62473970055SRussell King } 62573970055SRussell King break; 62673970055SRussell King 62773970055SRussell King case SFP_S_REINIT: 62873970055SRussell King if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) { 62973970055SRussell King sfp_sm_fault(sfp, false); 63073970055SRussell King } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) { 63173970055SRussell King dev_info(sfp->dev, "module transmit fault recovered\n"); 63273970055SRussell King sfp_sm_link_check_los(sfp); 63373970055SRussell King } 63473970055SRussell King break; 63573970055SRussell King 63673970055SRussell King case SFP_S_TX_DISABLE: 63773970055SRussell King break; 63873970055SRussell King } 63973970055SRussell King 64073970055SRussell King dev_dbg(sfp->dev, "SM: exit %u:%u:%u\n", 64173970055SRussell King sfp->sm_mod_state, sfp->sm_dev_state, sfp->sm_state); 64273970055SRussell King 64373970055SRussell King mutex_unlock(&sfp->sm_mutex); 64473970055SRussell King } 64573970055SRussell King 64673970055SRussell King static void sfp_start(struct sfp *sfp) 64773970055SRussell King { 64873970055SRussell King sfp_sm_event(sfp, SFP_E_DEV_UP); 64973970055SRussell King } 65073970055SRussell King 65173970055SRussell King static void sfp_stop(struct sfp *sfp) 65273970055SRussell King { 65373970055SRussell King sfp_sm_event(sfp, SFP_E_DEV_DOWN); 65473970055SRussell King } 65573970055SRussell King 65673970055SRussell King static int sfp_module_info(struct sfp *sfp, struct ethtool_modinfo *modinfo) 65773970055SRussell King { 65873970055SRussell King /* locking... and check module is present */ 65973970055SRussell King 660ec7681bdSRussell King if (sfp->id.ext.sff8472_compliance && 661ec7681bdSRussell King !(sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE)) { 66273970055SRussell King modinfo->type = ETH_MODULE_SFF_8472; 66373970055SRussell King modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; 66473970055SRussell King } else { 66573970055SRussell King modinfo->type = ETH_MODULE_SFF_8079; 66673970055SRussell King modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; 66773970055SRussell King } 66873970055SRussell King return 0; 66973970055SRussell King } 67073970055SRussell King 67173970055SRussell King static int sfp_module_eeprom(struct sfp *sfp, struct ethtool_eeprom *ee, 67273970055SRussell King u8 *data) 67373970055SRussell King { 67473970055SRussell King unsigned int first, last, len; 67573970055SRussell King int ret; 67673970055SRussell King 67773970055SRussell King if (ee->len == 0) 67873970055SRussell King return -EINVAL; 67973970055SRussell King 68073970055SRussell King first = ee->offset; 68173970055SRussell King last = ee->offset + ee->len; 68273970055SRussell King if (first < ETH_MODULE_SFF_8079_LEN) { 68373970055SRussell King len = min_t(unsigned int, last, ETH_MODULE_SFF_8079_LEN); 68473970055SRussell King len -= first; 68573970055SRussell King 68673970055SRussell King ret = sfp->read(sfp, false, first, data, len); 68773970055SRussell King if (ret < 0) 68873970055SRussell King return ret; 68973970055SRussell King 69073970055SRussell King first += len; 69173970055SRussell King data += len; 69273970055SRussell King } 69373970055SRussell King if (first >= ETH_MODULE_SFF_8079_LEN && 69473970055SRussell King first < ETH_MODULE_SFF_8472_LEN) { 69573970055SRussell King len = min_t(unsigned int, last, ETH_MODULE_SFF_8472_LEN); 69673970055SRussell King len -= first; 69773970055SRussell King first -= ETH_MODULE_SFF_8079_LEN; 69873970055SRussell King 69973970055SRussell King ret = sfp->read(sfp, true, first, data, len); 70073970055SRussell King if (ret < 0) 70173970055SRussell King return ret; 70273970055SRussell King } 70373970055SRussell King return 0; 70473970055SRussell King } 70573970055SRussell King 70673970055SRussell King static const struct sfp_socket_ops sfp_module_ops = { 70773970055SRussell King .start = sfp_start, 70873970055SRussell King .stop = sfp_stop, 70973970055SRussell King .module_info = sfp_module_info, 71073970055SRussell King .module_eeprom = sfp_module_eeprom, 71173970055SRussell King }; 71273970055SRussell King 71373970055SRussell King static void sfp_timeout(struct work_struct *work) 71473970055SRussell King { 71573970055SRussell King struct sfp *sfp = container_of(work, struct sfp, timeout.work); 71673970055SRussell King 71773970055SRussell King rtnl_lock(); 71873970055SRussell King sfp_sm_event(sfp, SFP_E_TIMEOUT); 71973970055SRussell King rtnl_unlock(); 72073970055SRussell King } 72173970055SRussell King 72273970055SRussell King static void sfp_check_state(struct sfp *sfp) 72373970055SRussell King { 72473970055SRussell King unsigned int state, i, changed; 72573970055SRussell King 72673970055SRussell King state = sfp_get_state(sfp); 72773970055SRussell King changed = state ^ sfp->state; 72873970055SRussell King changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; 72973970055SRussell King 73073970055SRussell King for (i = 0; i < GPIO_MAX; i++) 73173970055SRussell King if (changed & BIT(i)) 73273970055SRussell King dev_dbg(sfp->dev, "%s %u -> %u\n", gpio_of_names[i], 73373970055SRussell King !!(sfp->state & BIT(i)), !!(state & BIT(i))); 73473970055SRussell King 73573970055SRussell King state |= sfp->state & (SFP_F_TX_DISABLE | SFP_F_RATE_SELECT); 73673970055SRussell King sfp->state = state; 73773970055SRussell King 73873970055SRussell King rtnl_lock(); 73973970055SRussell King if (changed & SFP_F_PRESENT) 74073970055SRussell King sfp_sm_event(sfp, state & SFP_F_PRESENT ? 74173970055SRussell King SFP_E_INSERT : SFP_E_REMOVE); 74273970055SRussell King 74373970055SRussell King if (changed & SFP_F_TX_FAULT) 74473970055SRussell King sfp_sm_event(sfp, state & SFP_F_TX_FAULT ? 74573970055SRussell King SFP_E_TX_FAULT : SFP_E_TX_CLEAR); 74673970055SRussell King 74773970055SRussell King if (changed & SFP_F_LOS) 74873970055SRussell King sfp_sm_event(sfp, state & SFP_F_LOS ? 74973970055SRussell King SFP_E_LOS_HIGH : SFP_E_LOS_LOW); 75073970055SRussell King rtnl_unlock(); 75173970055SRussell King } 75273970055SRussell King 75373970055SRussell King static irqreturn_t sfp_irq(int irq, void *data) 75473970055SRussell King { 75573970055SRussell King struct sfp *sfp = data; 75673970055SRussell King 75773970055SRussell King sfp_check_state(sfp); 75873970055SRussell King 75973970055SRussell King return IRQ_HANDLED; 76073970055SRussell King } 76173970055SRussell King 76273970055SRussell King static void sfp_poll(struct work_struct *work) 76373970055SRussell King { 76473970055SRussell King struct sfp *sfp = container_of(work, struct sfp, poll.work); 76573970055SRussell King 76673970055SRussell King sfp_check_state(sfp); 76773970055SRussell King mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); 76873970055SRussell King } 76973970055SRussell King 77073970055SRussell King static struct sfp *sfp_alloc(struct device *dev) 77173970055SRussell King { 77273970055SRussell King struct sfp *sfp; 77373970055SRussell King 77473970055SRussell King sfp = kzalloc(sizeof(*sfp), GFP_KERNEL); 77573970055SRussell King if (!sfp) 77673970055SRussell King return ERR_PTR(-ENOMEM); 77773970055SRussell King 77873970055SRussell King sfp->dev = dev; 77973970055SRussell King 78073970055SRussell King mutex_init(&sfp->sm_mutex); 78173970055SRussell King INIT_DELAYED_WORK(&sfp->poll, sfp_poll); 78273970055SRussell King INIT_DELAYED_WORK(&sfp->timeout, sfp_timeout); 78373970055SRussell King 78473970055SRussell King return sfp; 78573970055SRussell King } 78673970055SRussell King 78773970055SRussell King static void sfp_cleanup(void *data) 78873970055SRussell King { 78973970055SRussell King struct sfp *sfp = data; 79073970055SRussell King 79173970055SRussell King cancel_delayed_work_sync(&sfp->poll); 79273970055SRussell King cancel_delayed_work_sync(&sfp->timeout); 79373970055SRussell King if (sfp->i2c_mii) { 79473970055SRussell King mdiobus_unregister(sfp->i2c_mii); 79573970055SRussell King mdiobus_free(sfp->i2c_mii); 79673970055SRussell King } 79773970055SRussell King if (sfp->i2c) 79873970055SRussell King i2c_put_adapter(sfp->i2c); 79973970055SRussell King kfree(sfp); 80073970055SRussell King } 80173970055SRussell King 80273970055SRussell King static int sfp_probe(struct platform_device *pdev) 80373970055SRussell King { 80473970055SRussell King struct sfp *sfp; 80573970055SRussell King bool poll = false; 80673970055SRussell King int irq, err, i; 80773970055SRussell King 80873970055SRussell King sfp = sfp_alloc(&pdev->dev); 80973970055SRussell King if (IS_ERR(sfp)) 81073970055SRussell King return PTR_ERR(sfp); 81173970055SRussell King 81273970055SRussell King platform_set_drvdata(pdev, sfp); 81373970055SRussell King 81473970055SRussell King err = devm_add_action(sfp->dev, sfp_cleanup, sfp); 81573970055SRussell King if (err < 0) 81673970055SRussell King return err; 81773970055SRussell King 81873970055SRussell King if (pdev->dev.of_node) { 81973970055SRussell King struct device_node *node = pdev->dev.of_node; 82073970055SRussell King struct device_node *np; 82173970055SRussell King 82273970055SRussell King np = of_parse_phandle(node, "i2c-bus", 0); 82373970055SRussell King if (np) { 82473970055SRussell King struct i2c_adapter *i2c; 82573970055SRussell King 82673970055SRussell King i2c = of_find_i2c_adapter_by_node(np); 82773970055SRussell King of_node_put(np); 82873970055SRussell King if (!i2c) 82973970055SRussell King return -EPROBE_DEFER; 83073970055SRussell King 83173970055SRussell King err = sfp_i2c_configure(sfp, i2c); 83273970055SRussell King if (err < 0) { 83373970055SRussell King i2c_put_adapter(i2c); 83473970055SRussell King return err; 83573970055SRussell King } 83673970055SRussell King } 83773970055SRussell King 83873970055SRussell King for (i = 0; i < GPIO_MAX; i++) { 83973970055SRussell King sfp->gpio[i] = devm_gpiod_get_optional(sfp->dev, 84073970055SRussell King gpio_of_names[i], gpio_flags[i]); 84173970055SRussell King if (IS_ERR(sfp->gpio[i])) 84273970055SRussell King return PTR_ERR(sfp->gpio[i]); 84373970055SRussell King } 84473970055SRussell King 84573970055SRussell King sfp->get_state = sfp_gpio_get_state; 84673970055SRussell King sfp->set_state = sfp_gpio_set_state; 84773970055SRussell King } 84873970055SRussell King 84973970055SRussell King sfp->sfp_bus = sfp_register_socket(sfp->dev, sfp, &sfp_module_ops); 85073970055SRussell King if (!sfp->sfp_bus) 85173970055SRussell King return -ENOMEM; 85273970055SRussell King 85373970055SRussell King /* Get the initial state, and always signal TX disable, 85473970055SRussell King * since the network interface will not be up. 85573970055SRussell King */ 85673970055SRussell King sfp->state = sfp_get_state(sfp) | SFP_F_TX_DISABLE; 85773970055SRussell King 85873970055SRussell King if (sfp->gpio[GPIO_RATE_SELECT] && 85973970055SRussell King gpiod_get_value_cansleep(sfp->gpio[GPIO_RATE_SELECT])) 86073970055SRussell King sfp->state |= SFP_F_RATE_SELECT; 86173970055SRussell King sfp_set_state(sfp, sfp->state); 86273970055SRussell King sfp_module_tx_disable(sfp); 86373970055SRussell King rtnl_lock(); 86473970055SRussell King if (sfp->state & SFP_F_PRESENT) 86573970055SRussell King sfp_sm_event(sfp, SFP_E_INSERT); 86673970055SRussell King rtnl_unlock(); 86773970055SRussell King 86873970055SRussell King for (i = 0; i < GPIO_MAX; i++) { 86973970055SRussell King if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) 87073970055SRussell King continue; 87173970055SRussell King 87273970055SRussell King irq = gpiod_to_irq(sfp->gpio[i]); 87373970055SRussell King if (!irq) { 87473970055SRussell King poll = true; 87573970055SRussell King continue; 87673970055SRussell King } 87773970055SRussell King 87873970055SRussell King err = devm_request_threaded_irq(sfp->dev, irq, NULL, sfp_irq, 87973970055SRussell King IRQF_ONESHOT | 88073970055SRussell King IRQF_TRIGGER_RISING | 88173970055SRussell King IRQF_TRIGGER_FALLING, 88273970055SRussell King dev_name(sfp->dev), sfp); 88373970055SRussell King if (err) 88473970055SRussell King poll = true; 88573970055SRussell King } 88673970055SRussell King 88773970055SRussell King if (poll) 88873970055SRussell King mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); 88973970055SRussell King 89073970055SRussell King return 0; 89173970055SRussell King } 89273970055SRussell King 89373970055SRussell King static int sfp_remove(struct platform_device *pdev) 89473970055SRussell King { 89573970055SRussell King struct sfp *sfp = platform_get_drvdata(pdev); 89673970055SRussell King 89773970055SRussell King sfp_unregister_socket(sfp->sfp_bus); 89873970055SRussell King 89973970055SRussell King return 0; 90073970055SRussell King } 90173970055SRussell King 90273970055SRussell King static const struct of_device_id sfp_of_match[] = { 90373970055SRussell King { .compatible = "sff,sfp", }, 90473970055SRussell King { }, 90573970055SRussell King }; 90673970055SRussell King MODULE_DEVICE_TABLE(of, sfp_of_match); 90773970055SRussell King 90873970055SRussell King static struct platform_driver sfp_driver = { 90973970055SRussell King .probe = sfp_probe, 91073970055SRussell King .remove = sfp_remove, 91173970055SRussell King .driver = { 91273970055SRussell King .name = "sfp", 91373970055SRussell King .of_match_table = sfp_of_match, 91473970055SRussell King }, 91573970055SRussell King }; 91673970055SRussell King 91773970055SRussell King static int sfp_init(void) 91873970055SRussell King { 91973970055SRussell King poll_jiffies = msecs_to_jiffies(100); 92073970055SRussell King 92173970055SRussell King return platform_driver_register(&sfp_driver); 92273970055SRussell King } 92373970055SRussell King module_init(sfp_init); 92473970055SRussell King 92573970055SRussell King static void sfp_exit(void) 92673970055SRussell King { 92773970055SRussell King platform_driver_unregister(&sfp_driver); 92873970055SRussell King } 92973970055SRussell King module_exit(sfp_exit); 93073970055SRussell King 93173970055SRussell King MODULE_ALIAS("platform:sfp"); 93273970055SRussell King MODULE_AUTHOR("Russell King"); 93373970055SRussell King MODULE_LICENSE("GPL v2"); 934