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 101259c8618SRussell King struct sff_data { 102259c8618SRussell King unsigned int gpios; 103259c8618SRussell King bool (*module_supported)(const struct sfp_eeprom_id *id); 104259c8618SRussell King }; 105259c8618SRussell King 10673970055SRussell King struct sfp { 10773970055SRussell King struct device *dev; 10873970055SRussell King struct i2c_adapter *i2c; 10973970055SRussell King struct mii_bus *i2c_mii; 11073970055SRussell King struct sfp_bus *sfp_bus; 11173970055SRussell King struct phy_device *mod_phy; 112259c8618SRussell King const struct sff_data *type; 11373970055SRussell King 11473970055SRussell King unsigned int (*get_state)(struct sfp *); 11573970055SRussell King void (*set_state)(struct sfp *, unsigned int); 11673970055SRussell King int (*read)(struct sfp *, bool, u8, void *, size_t); 11773970055SRussell King 11873970055SRussell King struct gpio_desc *gpio[GPIO_MAX]; 11973970055SRussell King 12073970055SRussell King unsigned int state; 12173970055SRussell King struct delayed_work poll; 12273970055SRussell King struct delayed_work timeout; 12373970055SRussell King struct mutex sm_mutex; 12473970055SRussell King unsigned char sm_mod_state; 12573970055SRussell King unsigned char sm_dev_state; 12673970055SRussell King unsigned short sm_state; 12773970055SRussell King unsigned int sm_retries; 12873970055SRussell King 12973970055SRussell King struct sfp_eeprom_id id; 13073970055SRussell King }; 13173970055SRussell King 132259c8618SRussell King static bool sff_module_supported(const struct sfp_eeprom_id *id) 133259c8618SRussell King { 134259c8618SRussell King return id->base.phys_id == SFP_PHYS_ID_SFF && 135259c8618SRussell King id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP; 136259c8618SRussell King } 137259c8618SRussell King 138259c8618SRussell King static const struct sff_data sff_data = { 139259c8618SRussell King .gpios = SFP_F_LOS | SFP_F_TX_FAULT | SFP_F_TX_DISABLE, 140259c8618SRussell King .module_supported = sff_module_supported, 141259c8618SRussell King }; 142259c8618SRussell King 143259c8618SRussell King static bool sfp_module_supported(const struct sfp_eeprom_id *id) 144259c8618SRussell King { 145259c8618SRussell King return id->base.phys_id == SFP_PHYS_ID_SFP && 146259c8618SRussell King id->base.phys_ext_id == SFP_PHYS_EXT_ID_SFP; 147259c8618SRussell King } 148259c8618SRussell King 149259c8618SRussell King static const struct sff_data sfp_data = { 150259c8618SRussell King .gpios = SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT | 151259c8618SRussell King SFP_F_TX_DISABLE | SFP_F_RATE_SELECT, 152259c8618SRussell King .module_supported = sfp_module_supported, 153259c8618SRussell King }; 154259c8618SRussell King 155259c8618SRussell King static const struct of_device_id sfp_of_match[] = { 156259c8618SRussell King { .compatible = "sff,sff", .data = &sff_data, }, 157259c8618SRussell King { .compatible = "sff,sfp", .data = &sfp_data, }, 158259c8618SRussell King { }, 159259c8618SRussell King }; 160259c8618SRussell King MODULE_DEVICE_TABLE(of, sfp_of_match); 161259c8618SRussell King 16273970055SRussell King static unsigned long poll_jiffies; 16373970055SRussell King 16473970055SRussell King static unsigned int sfp_gpio_get_state(struct sfp *sfp) 16573970055SRussell King { 16673970055SRussell King unsigned int i, state, v; 16773970055SRussell King 16873970055SRussell King for (i = state = 0; i < GPIO_MAX; i++) { 16973970055SRussell King if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) 17073970055SRussell King continue; 17173970055SRussell King 17273970055SRussell King v = gpiod_get_value_cansleep(sfp->gpio[i]); 17373970055SRussell King if (v) 17473970055SRussell King state |= BIT(i); 17573970055SRussell King } 17673970055SRussell King 17773970055SRussell King return state; 17873970055SRussell King } 17973970055SRussell King 180259c8618SRussell King static unsigned int sff_gpio_get_state(struct sfp *sfp) 181259c8618SRussell King { 182259c8618SRussell King return sfp_gpio_get_state(sfp) | SFP_F_PRESENT; 183259c8618SRussell King } 184259c8618SRussell King 18573970055SRussell King static void sfp_gpio_set_state(struct sfp *sfp, unsigned int state) 18673970055SRussell King { 18773970055SRussell King if (state & SFP_F_PRESENT) { 18873970055SRussell King /* If the module is present, drive the signals */ 18973970055SRussell King if (sfp->gpio[GPIO_TX_DISABLE]) 19073970055SRussell King gpiod_direction_output(sfp->gpio[GPIO_TX_DISABLE], 19173970055SRussell King state & SFP_F_TX_DISABLE); 19273970055SRussell King if (state & SFP_F_RATE_SELECT) 19373970055SRussell King gpiod_direction_output(sfp->gpio[GPIO_RATE_SELECT], 19473970055SRussell King state & SFP_F_RATE_SELECT); 19573970055SRussell King } else { 19673970055SRussell King /* Otherwise, let them float to the pull-ups */ 19773970055SRussell King if (sfp->gpio[GPIO_TX_DISABLE]) 19873970055SRussell King gpiod_direction_input(sfp->gpio[GPIO_TX_DISABLE]); 19973970055SRussell King if (state & SFP_F_RATE_SELECT) 20073970055SRussell King gpiod_direction_input(sfp->gpio[GPIO_RATE_SELECT]); 20173970055SRussell King } 20273970055SRussell King } 20373970055SRussell King 20473970055SRussell King static int sfp__i2c_read(struct i2c_adapter *i2c, u8 bus_addr, u8 dev_addr, 20573970055SRussell King void *buf, size_t len) 20673970055SRussell King { 20773970055SRussell King struct i2c_msg msgs[2]; 20873970055SRussell King int ret; 20973970055SRussell King 21073970055SRussell King msgs[0].addr = bus_addr; 21173970055SRussell King msgs[0].flags = 0; 21273970055SRussell King msgs[0].len = 1; 21373970055SRussell King msgs[0].buf = &dev_addr; 21473970055SRussell King msgs[1].addr = bus_addr; 21573970055SRussell King msgs[1].flags = I2C_M_RD; 21673970055SRussell King msgs[1].len = len; 21773970055SRussell King msgs[1].buf = buf; 21873970055SRussell King 21973970055SRussell King ret = i2c_transfer(i2c, msgs, ARRAY_SIZE(msgs)); 22073970055SRussell King if (ret < 0) 22173970055SRussell King return ret; 22273970055SRussell King 22373970055SRussell King return ret == ARRAY_SIZE(msgs) ? len : 0; 22473970055SRussell King } 22573970055SRussell King 22673970055SRussell King static int sfp_i2c_read(struct sfp *sfp, bool a2, u8 addr, void *buf, 22773970055SRussell King size_t len) 22873970055SRussell King { 22973970055SRussell King return sfp__i2c_read(sfp->i2c, a2 ? 0x51 : 0x50, addr, buf, len); 23073970055SRussell King } 23173970055SRussell King 23273970055SRussell King static int sfp_i2c_configure(struct sfp *sfp, struct i2c_adapter *i2c) 23373970055SRussell King { 23473970055SRussell King struct mii_bus *i2c_mii; 23573970055SRussell King int ret; 23673970055SRussell King 23773970055SRussell King if (!i2c_check_functionality(i2c, I2C_FUNC_I2C)) 23873970055SRussell King return -EINVAL; 23973970055SRussell King 24073970055SRussell King sfp->i2c = i2c; 24173970055SRussell King sfp->read = sfp_i2c_read; 24273970055SRussell King 24373970055SRussell King i2c_mii = mdio_i2c_alloc(sfp->dev, i2c); 24473970055SRussell King if (IS_ERR(i2c_mii)) 24573970055SRussell King return PTR_ERR(i2c_mii); 24673970055SRussell King 24773970055SRussell King i2c_mii->name = "SFP I2C Bus"; 24873970055SRussell King i2c_mii->phy_mask = ~0; 24973970055SRussell King 25073970055SRussell King ret = mdiobus_register(i2c_mii); 25173970055SRussell King if (ret < 0) { 25273970055SRussell King mdiobus_free(i2c_mii); 25373970055SRussell King return ret; 25473970055SRussell King } 25573970055SRussell King 25673970055SRussell King sfp->i2c_mii = i2c_mii; 25773970055SRussell King 25873970055SRussell King return 0; 25973970055SRussell King } 26073970055SRussell King 26173970055SRussell King /* Interface */ 26273970055SRussell King static unsigned int sfp_get_state(struct sfp *sfp) 26373970055SRussell King { 26473970055SRussell King return sfp->get_state(sfp); 26573970055SRussell King } 26673970055SRussell King 26773970055SRussell King static void sfp_set_state(struct sfp *sfp, unsigned int state) 26873970055SRussell King { 26973970055SRussell King sfp->set_state(sfp, state); 27073970055SRussell King } 27173970055SRussell King 27273970055SRussell King static int sfp_read(struct sfp *sfp, bool a2, u8 addr, void *buf, size_t len) 27373970055SRussell King { 27473970055SRussell King return sfp->read(sfp, a2, addr, buf, len); 27573970055SRussell King } 27673970055SRussell King 27773970055SRussell King static unsigned int sfp_check(void *buf, size_t len) 27873970055SRussell King { 27973970055SRussell King u8 *p, check; 28073970055SRussell King 28173970055SRussell King for (p = buf, check = 0; len; p++, len--) 28273970055SRussell King check += *p; 28373970055SRussell King 28473970055SRussell King return check; 28573970055SRussell King } 28673970055SRussell King 28773970055SRussell King /* Helpers */ 28873970055SRussell King static void sfp_module_tx_disable(struct sfp *sfp) 28973970055SRussell King { 29073970055SRussell King dev_dbg(sfp->dev, "tx disable %u -> %u\n", 29173970055SRussell King sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 1); 29273970055SRussell King sfp->state |= SFP_F_TX_DISABLE; 29373970055SRussell King sfp_set_state(sfp, sfp->state); 29473970055SRussell King } 29573970055SRussell King 29673970055SRussell King static void sfp_module_tx_enable(struct sfp *sfp) 29773970055SRussell King { 29873970055SRussell King dev_dbg(sfp->dev, "tx disable %u -> %u\n", 29973970055SRussell King sfp->state & SFP_F_TX_DISABLE ? 1 : 0, 0); 30073970055SRussell King sfp->state &= ~SFP_F_TX_DISABLE; 30173970055SRussell King sfp_set_state(sfp, sfp->state); 30273970055SRussell King } 30373970055SRussell King 30473970055SRussell King static void sfp_module_tx_fault_reset(struct sfp *sfp) 30573970055SRussell King { 30673970055SRussell King unsigned int state = sfp->state; 30773970055SRussell King 30873970055SRussell King if (state & SFP_F_TX_DISABLE) 30973970055SRussell King return; 31073970055SRussell King 31173970055SRussell King sfp_set_state(sfp, state | SFP_F_TX_DISABLE); 31273970055SRussell King 31373970055SRussell King udelay(T_RESET_US); 31473970055SRussell King 31573970055SRussell King sfp_set_state(sfp, state); 31673970055SRussell King } 31773970055SRussell King 31873970055SRussell King /* SFP state machine */ 31973970055SRussell King static void sfp_sm_set_timer(struct sfp *sfp, unsigned int timeout) 32073970055SRussell King { 32173970055SRussell King if (timeout) 32273970055SRussell King mod_delayed_work(system_power_efficient_wq, &sfp->timeout, 32373970055SRussell King timeout); 32473970055SRussell King else 32573970055SRussell King cancel_delayed_work(&sfp->timeout); 32673970055SRussell King } 32773970055SRussell King 32873970055SRussell King static void sfp_sm_next(struct sfp *sfp, unsigned int state, 32973970055SRussell King unsigned int timeout) 33073970055SRussell King { 33173970055SRussell King sfp->sm_state = state; 33273970055SRussell King sfp_sm_set_timer(sfp, timeout); 33373970055SRussell King } 33473970055SRussell King 335516b29edSFlorian Fainelli static void sfp_sm_ins_next(struct sfp *sfp, unsigned int state, 336516b29edSFlorian Fainelli unsigned int timeout) 33773970055SRussell King { 33873970055SRussell King sfp->sm_mod_state = state; 33973970055SRussell King sfp_sm_set_timer(sfp, timeout); 34073970055SRussell King } 34173970055SRussell King 34273970055SRussell King static void sfp_sm_phy_detach(struct sfp *sfp) 34373970055SRussell King { 34473970055SRussell King phy_stop(sfp->mod_phy); 34573970055SRussell King sfp_remove_phy(sfp->sfp_bus); 34673970055SRussell King phy_device_remove(sfp->mod_phy); 34773970055SRussell King phy_device_free(sfp->mod_phy); 34873970055SRussell King sfp->mod_phy = NULL; 34973970055SRussell King } 35073970055SRussell King 35173970055SRussell King static void sfp_sm_probe_phy(struct sfp *sfp) 35273970055SRussell King { 35373970055SRussell King struct phy_device *phy; 35473970055SRussell King int err; 35573970055SRussell King 35673970055SRussell King msleep(T_PHY_RESET_MS); 35773970055SRussell King 35873970055SRussell King phy = mdiobus_scan(sfp->i2c_mii, SFP_PHY_ADDR); 35920b56ed9SRussell King if (phy == ERR_PTR(-ENODEV)) { 36020b56ed9SRussell King dev_info(sfp->dev, "no PHY detected\n"); 36173970055SRussell King return; 36273970055SRussell King } 36320b56ed9SRussell King if (IS_ERR(phy)) { 36420b56ed9SRussell King dev_err(sfp->dev, "mdiobus scan returned %ld\n", PTR_ERR(phy)); 36573970055SRussell King return; 36673970055SRussell King } 36773970055SRussell King 36873970055SRussell King err = sfp_add_phy(sfp->sfp_bus, phy); 36973970055SRussell King if (err) { 37073970055SRussell King phy_device_remove(phy); 37173970055SRussell King phy_device_free(phy); 37273970055SRussell King dev_err(sfp->dev, "sfp_add_phy failed: %d\n", err); 37373970055SRussell King return; 37473970055SRussell King } 37573970055SRussell King 37673970055SRussell King sfp->mod_phy = phy; 37773970055SRussell King phy_start(phy); 37873970055SRussell King } 37973970055SRussell King 38073970055SRussell King static void sfp_sm_link_up(struct sfp *sfp) 38173970055SRussell King { 38273970055SRussell King sfp_link_up(sfp->sfp_bus); 38373970055SRussell King sfp_sm_next(sfp, SFP_S_LINK_UP, 0); 38473970055SRussell King } 38573970055SRussell King 38673970055SRussell King static void sfp_sm_link_down(struct sfp *sfp) 38773970055SRussell King { 38873970055SRussell King sfp_link_down(sfp->sfp_bus); 38973970055SRussell King } 39073970055SRussell King 39173970055SRussell King static void sfp_sm_link_check_los(struct sfp *sfp) 39273970055SRussell King { 39373970055SRussell King unsigned int los = sfp->state & SFP_F_LOS; 39473970055SRussell King 395710dfbb0SRussell King /* If neither SFP_OPTIONS_LOS_INVERTED nor SFP_OPTIONS_LOS_NORMAL 396710dfbb0SRussell King * are set, we assume that no LOS signal is available. 39773970055SRussell King */ 398acf1c02fSRussell King if (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED)) 39973970055SRussell King los ^= SFP_F_LOS; 400710dfbb0SRussell King else if (!(sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL))) 401710dfbb0SRussell King los = 0; 40273970055SRussell King 40373970055SRussell King if (los) 40473970055SRussell King sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); 40573970055SRussell King else 40673970055SRussell King sfp_sm_link_up(sfp); 40773970055SRussell King } 40873970055SRussell King 409710dfbb0SRussell King static bool sfp_los_event_active(struct sfp *sfp, unsigned int event) 410710dfbb0SRussell King { 411710dfbb0SRussell King return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && 412710dfbb0SRussell King event == SFP_E_LOS_LOW) || 413710dfbb0SRussell King (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && 414710dfbb0SRussell King event == SFP_E_LOS_HIGH); 415710dfbb0SRussell King } 416710dfbb0SRussell King 417710dfbb0SRussell King static bool sfp_los_event_inactive(struct sfp *sfp, unsigned int event) 418710dfbb0SRussell King { 419710dfbb0SRussell King return (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_INVERTED) && 420710dfbb0SRussell King event == SFP_E_LOS_HIGH) || 421710dfbb0SRussell King (sfp->id.ext.options & cpu_to_be16(SFP_OPTIONS_LOS_NORMAL) && 422710dfbb0SRussell King event == SFP_E_LOS_LOW); 423710dfbb0SRussell King } 424710dfbb0SRussell King 42573970055SRussell King static void sfp_sm_fault(struct sfp *sfp, bool warn) 42673970055SRussell King { 42773970055SRussell King if (sfp->sm_retries && !--sfp->sm_retries) { 428516b29edSFlorian Fainelli dev_err(sfp->dev, 429516b29edSFlorian Fainelli "module persistently indicates fault, disabling\n"); 43073970055SRussell King sfp_sm_next(sfp, SFP_S_TX_DISABLE, 0); 43173970055SRussell King } else { 43273970055SRussell King if (warn) 43373970055SRussell King dev_err(sfp->dev, "module transmit fault indicated\n"); 43473970055SRussell King 43573970055SRussell King sfp_sm_next(sfp, SFP_S_TX_FAULT, T_FAULT_RECOVER); 43673970055SRussell King } 43773970055SRussell King } 43873970055SRussell King 43973970055SRussell King static void sfp_sm_mod_init(struct sfp *sfp) 44073970055SRussell King { 44173970055SRussell King sfp_module_tx_enable(sfp); 44273970055SRussell King 44373970055SRussell King /* Wait t_init before indicating that the link is up, provided the 44473970055SRussell King * current state indicates no TX_FAULT. If TX_FAULT clears before 44573970055SRussell King * this time, that's fine too. 44673970055SRussell King */ 44773970055SRussell King sfp_sm_next(sfp, SFP_S_INIT, T_INIT_JIFFIES); 44873970055SRussell King sfp->sm_retries = 5; 44973970055SRussell King 45073970055SRussell King /* Setting the serdes link mode is guesswork: there's no 45173970055SRussell King * field in the EEPROM which indicates what mode should 45273970055SRussell King * be used. 45373970055SRussell King * 45473970055SRussell King * If it's a gigabit-only fiber module, it probably does 45573970055SRussell King * not have a PHY, so switch to 802.3z negotiation mode. 45673970055SRussell King * Otherwise, switch to SGMII mode (which is required to 45773970055SRussell King * support non-gigabit speeds) and probe for a PHY. 45873970055SRussell King */ 45973970055SRussell King if (sfp->id.base.e1000_base_t || 46073970055SRussell King sfp->id.base.e100_base_lx || 46173970055SRussell King sfp->id.base.e100_base_fx) 46273970055SRussell King sfp_sm_probe_phy(sfp); 46373970055SRussell King } 46473970055SRussell King 46573970055SRussell King static int sfp_sm_mod_probe(struct sfp *sfp) 46673970055SRussell King { 46773970055SRussell King /* SFP module inserted - read I2C data */ 46873970055SRussell King struct sfp_eeprom_id id; 46973970055SRussell King u8 check; 47073970055SRussell King int err; 47173970055SRussell King 47273970055SRussell King err = sfp_read(sfp, false, 0, &id, sizeof(id)); 47373970055SRussell King if (err < 0) { 47473970055SRussell King dev_err(sfp->dev, "failed to read EEPROM: %d\n", err); 47573970055SRussell King return -EAGAIN; 47673970055SRussell King } 47773970055SRussell King 47873970055SRussell King if (err != sizeof(id)) { 47973970055SRussell King dev_err(sfp->dev, "EEPROM short read: %d\n", err); 48073970055SRussell King return -EAGAIN; 48173970055SRussell King } 48273970055SRussell King 48373970055SRussell King /* Validate the checksum over the base structure */ 48473970055SRussell King check = sfp_check(&id.base, sizeof(id.base) - 1); 48573970055SRussell King if (check != id.base.cc_base) { 48673970055SRussell King dev_err(sfp->dev, 48773970055SRussell King "EEPROM base structure checksum failure: 0x%02x\n", 48873970055SRussell King check); 48973970055SRussell King print_hex_dump(KERN_ERR, "sfp EE: ", DUMP_PREFIX_OFFSET, 49073970055SRussell King 16, 1, &id, sizeof(id.base) - 1, true); 49173970055SRussell King return -EINVAL; 49273970055SRussell King } 49373970055SRussell King 49473970055SRussell King check = sfp_check(&id.ext, sizeof(id.ext) - 1); 49573970055SRussell King if (check != id.ext.cc_ext) { 49673970055SRussell King dev_err(sfp->dev, 49773970055SRussell King "EEPROM extended structure checksum failure: 0x%02x\n", 49873970055SRussell King check); 49973970055SRussell King memset(&id.ext, 0, sizeof(id.ext)); 50073970055SRussell King } 50173970055SRussell King 50273970055SRussell King sfp->id = id; 50373970055SRussell King 504a2f247efSRussell King dev_info(sfp->dev, "module %.*s %.*s rev %.*s sn %.*s dc %.*s\n", 505a2f247efSRussell King (int)sizeof(id.base.vendor_name), id.base.vendor_name, 506a2f247efSRussell King (int)sizeof(id.base.vendor_pn), id.base.vendor_pn, 507a2f247efSRussell King (int)sizeof(id.base.vendor_rev), id.base.vendor_rev, 508a2f247efSRussell King (int)sizeof(id.ext.vendor_sn), id.ext.vendor_sn, 509a2f247efSRussell King (int)sizeof(id.ext.datecode), id.ext.datecode); 51073970055SRussell King 511259c8618SRussell King /* Check whether we support this module */ 512259c8618SRussell King if (!sfp->type->module_supported(&sfp->id)) { 513259c8618SRussell King dev_err(sfp->dev, 514259c8618SRussell King "module is not supported - phys id 0x%02x 0x%02x\n", 51573970055SRussell King sfp->id.base.phys_id, sfp->id.base.phys_ext_id); 51673970055SRussell King return -EINVAL; 51773970055SRussell King } 51873970055SRussell King 519ec7681bdSRussell King /* If the module requires address swap mode, warn about it */ 520ec7681bdSRussell King if (sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE) 521ec7681bdSRussell King dev_warn(sfp->dev, 522ec7681bdSRussell King "module address swap to access page 0xA2 is not supported.\n"); 523ec7681bdSRussell King 52473970055SRussell King return sfp_module_insert(sfp->sfp_bus, &sfp->id); 52573970055SRussell King } 52673970055SRussell King 52773970055SRussell King static void sfp_sm_mod_remove(struct sfp *sfp) 52873970055SRussell King { 52973970055SRussell King sfp_module_remove(sfp->sfp_bus); 53073970055SRussell King 53173970055SRussell King if (sfp->mod_phy) 53273970055SRussell King sfp_sm_phy_detach(sfp); 53373970055SRussell King 53473970055SRussell King sfp_module_tx_disable(sfp); 53573970055SRussell King 53673970055SRussell King memset(&sfp->id, 0, sizeof(sfp->id)); 53773970055SRussell King 53873970055SRussell King dev_info(sfp->dev, "module removed\n"); 53973970055SRussell King } 54073970055SRussell King 54173970055SRussell King static void sfp_sm_event(struct sfp *sfp, unsigned int event) 54273970055SRussell King { 54373970055SRussell King mutex_lock(&sfp->sm_mutex); 54473970055SRussell King 54573970055SRussell King dev_dbg(sfp->dev, "SM: enter %u:%u:%u event %u\n", 54673970055SRussell King sfp->sm_mod_state, sfp->sm_dev_state, sfp->sm_state, event); 54773970055SRussell King 54873970055SRussell King /* This state machine tracks the insert/remove state of 54973970055SRussell King * the module, and handles probing the on-board EEPROM. 55073970055SRussell King */ 55173970055SRussell King switch (sfp->sm_mod_state) { 55273970055SRussell King default: 55373970055SRussell King if (event == SFP_E_INSERT) { 55473970055SRussell King sfp_module_tx_disable(sfp); 55573970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_PROBE, T_PROBE_INIT); 55673970055SRussell King } 55773970055SRussell King break; 55873970055SRussell King 55973970055SRussell King case SFP_MOD_PROBE: 56073970055SRussell King if (event == SFP_E_REMOVE) { 56173970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); 56273970055SRussell King } else if (event == SFP_E_TIMEOUT) { 56373970055SRussell King int err = sfp_sm_mod_probe(sfp); 56473970055SRussell King 56573970055SRussell King if (err == 0) 56673970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_PRESENT, 0); 56773970055SRussell King else if (err == -EAGAIN) 56873970055SRussell King sfp_sm_set_timer(sfp, T_PROBE_RETRY); 56973970055SRussell King else 57073970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_ERROR, 0); 57173970055SRussell King } 57273970055SRussell King break; 57373970055SRussell King 57473970055SRussell King case SFP_MOD_PRESENT: 57573970055SRussell King case SFP_MOD_ERROR: 57673970055SRussell King if (event == SFP_E_REMOVE) { 57773970055SRussell King sfp_sm_mod_remove(sfp); 57873970055SRussell King sfp_sm_ins_next(sfp, SFP_MOD_EMPTY, 0); 57973970055SRussell King } 58073970055SRussell King break; 58173970055SRussell King } 58273970055SRussell King 58373970055SRussell King /* This state machine tracks the netdev up/down state */ 58473970055SRussell King switch (sfp->sm_dev_state) { 58573970055SRussell King default: 58673970055SRussell King if (event == SFP_E_DEV_UP) 58773970055SRussell King sfp->sm_dev_state = SFP_DEV_UP; 58873970055SRussell King break; 58973970055SRussell King 59073970055SRussell King case SFP_DEV_UP: 59173970055SRussell King if (event == SFP_E_DEV_DOWN) { 59273970055SRussell King /* If the module has a PHY, avoid raising TX disable 59373970055SRussell King * as this resets the PHY. Otherwise, raise it to 59473970055SRussell King * turn the laser off. 59573970055SRussell King */ 59673970055SRussell King if (!sfp->mod_phy) 59773970055SRussell King sfp_module_tx_disable(sfp); 59873970055SRussell King sfp->sm_dev_state = SFP_DEV_DOWN; 59973970055SRussell King } 60073970055SRussell King break; 60173970055SRussell King } 60273970055SRussell King 60373970055SRussell King /* Some events are global */ 60473970055SRussell King if (sfp->sm_state != SFP_S_DOWN && 60573970055SRussell King (sfp->sm_mod_state != SFP_MOD_PRESENT || 60673970055SRussell King sfp->sm_dev_state != SFP_DEV_UP)) { 60773970055SRussell King if (sfp->sm_state == SFP_S_LINK_UP && 60873970055SRussell King sfp->sm_dev_state == SFP_DEV_UP) 60973970055SRussell King sfp_sm_link_down(sfp); 61073970055SRussell King if (sfp->mod_phy) 61173970055SRussell King sfp_sm_phy_detach(sfp); 61273970055SRussell King sfp_sm_next(sfp, SFP_S_DOWN, 0); 61373970055SRussell King mutex_unlock(&sfp->sm_mutex); 61473970055SRussell King return; 61573970055SRussell King } 61673970055SRussell King 61773970055SRussell King /* The main state machine */ 61873970055SRussell King switch (sfp->sm_state) { 61973970055SRussell King case SFP_S_DOWN: 62073970055SRussell King if (sfp->sm_mod_state == SFP_MOD_PRESENT && 62173970055SRussell King sfp->sm_dev_state == SFP_DEV_UP) 62273970055SRussell King sfp_sm_mod_init(sfp); 62373970055SRussell King break; 62473970055SRussell King 62573970055SRussell King case SFP_S_INIT: 62673970055SRussell King if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) 62773970055SRussell King sfp_sm_fault(sfp, true); 62873970055SRussell King else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) 62973970055SRussell King sfp_sm_link_check_los(sfp); 63073970055SRussell King break; 63173970055SRussell King 63273970055SRussell King case SFP_S_WAIT_LOS: 63373970055SRussell King if (event == SFP_E_TX_FAULT) 63473970055SRussell King sfp_sm_fault(sfp, true); 635710dfbb0SRussell King else if (sfp_los_event_inactive(sfp, event)) 63673970055SRussell King sfp_sm_link_up(sfp); 63773970055SRussell King break; 63873970055SRussell King 63973970055SRussell King case SFP_S_LINK_UP: 64073970055SRussell King if (event == SFP_E_TX_FAULT) { 64173970055SRussell King sfp_sm_link_down(sfp); 64273970055SRussell King sfp_sm_fault(sfp, true); 643710dfbb0SRussell King } else if (sfp_los_event_active(sfp, event)) { 64473970055SRussell King sfp_sm_link_down(sfp); 64573970055SRussell King sfp_sm_next(sfp, SFP_S_WAIT_LOS, 0); 64673970055SRussell King } 64773970055SRussell King break; 64873970055SRussell King 64973970055SRussell King case SFP_S_TX_FAULT: 65073970055SRussell King if (event == SFP_E_TIMEOUT) { 65173970055SRussell King sfp_module_tx_fault_reset(sfp); 65273970055SRussell King sfp_sm_next(sfp, SFP_S_REINIT, T_INIT_JIFFIES); 65373970055SRussell King } 65473970055SRussell King break; 65573970055SRussell King 65673970055SRussell King case SFP_S_REINIT: 65773970055SRussell King if (event == SFP_E_TIMEOUT && sfp->state & SFP_F_TX_FAULT) { 65873970055SRussell King sfp_sm_fault(sfp, false); 65973970055SRussell King } else if (event == SFP_E_TIMEOUT || event == SFP_E_TX_CLEAR) { 66073970055SRussell King dev_info(sfp->dev, "module transmit fault recovered\n"); 66173970055SRussell King sfp_sm_link_check_los(sfp); 66273970055SRussell King } 66373970055SRussell King break; 66473970055SRussell King 66573970055SRussell King case SFP_S_TX_DISABLE: 66673970055SRussell King break; 66773970055SRussell King } 66873970055SRussell King 66973970055SRussell King dev_dbg(sfp->dev, "SM: exit %u:%u:%u\n", 67073970055SRussell King sfp->sm_mod_state, sfp->sm_dev_state, sfp->sm_state); 67173970055SRussell King 67273970055SRussell King mutex_unlock(&sfp->sm_mutex); 67373970055SRussell King } 67473970055SRussell King 67573970055SRussell King static void sfp_start(struct sfp *sfp) 67673970055SRussell King { 67773970055SRussell King sfp_sm_event(sfp, SFP_E_DEV_UP); 67873970055SRussell King } 67973970055SRussell King 68073970055SRussell King static void sfp_stop(struct sfp *sfp) 68173970055SRussell King { 68273970055SRussell King sfp_sm_event(sfp, SFP_E_DEV_DOWN); 68373970055SRussell King } 68473970055SRussell King 68573970055SRussell King static int sfp_module_info(struct sfp *sfp, struct ethtool_modinfo *modinfo) 68673970055SRussell King { 68773970055SRussell King /* locking... and check module is present */ 68873970055SRussell King 689ec7681bdSRussell King if (sfp->id.ext.sff8472_compliance && 690ec7681bdSRussell King !(sfp->id.ext.diagmon & SFP_DIAGMON_ADDRMODE)) { 69173970055SRussell King modinfo->type = ETH_MODULE_SFF_8472; 69273970055SRussell King modinfo->eeprom_len = ETH_MODULE_SFF_8472_LEN; 69373970055SRussell King } else { 69473970055SRussell King modinfo->type = ETH_MODULE_SFF_8079; 69573970055SRussell King modinfo->eeprom_len = ETH_MODULE_SFF_8079_LEN; 69673970055SRussell King } 69773970055SRussell King return 0; 69873970055SRussell King } 69973970055SRussell King 70073970055SRussell King static int sfp_module_eeprom(struct sfp *sfp, struct ethtool_eeprom *ee, 70173970055SRussell King u8 *data) 70273970055SRussell King { 70373970055SRussell King unsigned int first, last, len; 70473970055SRussell King int ret; 70573970055SRussell King 70673970055SRussell King if (ee->len == 0) 70773970055SRussell King return -EINVAL; 70873970055SRussell King 70973970055SRussell King first = ee->offset; 71073970055SRussell King last = ee->offset + ee->len; 71173970055SRussell King if (first < ETH_MODULE_SFF_8079_LEN) { 71273970055SRussell King len = min_t(unsigned int, last, ETH_MODULE_SFF_8079_LEN); 71373970055SRussell King len -= first; 71473970055SRussell King 7152794ffc4SRussell King ret = sfp_read(sfp, false, first, data, len); 71673970055SRussell King if (ret < 0) 71773970055SRussell King return ret; 71873970055SRussell King 71973970055SRussell King first += len; 72073970055SRussell King data += len; 72173970055SRussell King } 7222794ffc4SRussell King if (first < ETH_MODULE_SFF_8472_LEN && last > ETH_MODULE_SFF_8079_LEN) { 72373970055SRussell King len = min_t(unsigned int, last, ETH_MODULE_SFF_8472_LEN); 72473970055SRussell King len -= first; 72573970055SRussell King first -= ETH_MODULE_SFF_8079_LEN; 72673970055SRussell King 7272794ffc4SRussell King ret = sfp_read(sfp, true, first, data, len); 72873970055SRussell King if (ret < 0) 72973970055SRussell King return ret; 73073970055SRussell King } 73173970055SRussell King return 0; 73273970055SRussell King } 73373970055SRussell King 73473970055SRussell King static const struct sfp_socket_ops sfp_module_ops = { 73573970055SRussell King .start = sfp_start, 73673970055SRussell King .stop = sfp_stop, 73773970055SRussell King .module_info = sfp_module_info, 73873970055SRussell King .module_eeprom = sfp_module_eeprom, 73973970055SRussell King }; 74073970055SRussell King 74173970055SRussell King static void sfp_timeout(struct work_struct *work) 74273970055SRussell King { 74373970055SRussell King struct sfp *sfp = container_of(work, struct sfp, timeout.work); 74473970055SRussell King 74573970055SRussell King rtnl_lock(); 74673970055SRussell King sfp_sm_event(sfp, SFP_E_TIMEOUT); 74773970055SRussell King rtnl_unlock(); 74873970055SRussell King } 74973970055SRussell King 75073970055SRussell King static void sfp_check_state(struct sfp *sfp) 75173970055SRussell King { 75273970055SRussell King unsigned int state, i, changed; 75373970055SRussell King 75473970055SRussell King state = sfp_get_state(sfp); 75573970055SRussell King changed = state ^ sfp->state; 75673970055SRussell King changed &= SFP_F_PRESENT | SFP_F_LOS | SFP_F_TX_FAULT; 75773970055SRussell King 75873970055SRussell King for (i = 0; i < GPIO_MAX; i++) 75973970055SRussell King if (changed & BIT(i)) 76073970055SRussell King dev_dbg(sfp->dev, "%s %u -> %u\n", gpio_of_names[i], 76173970055SRussell King !!(sfp->state & BIT(i)), !!(state & BIT(i))); 76273970055SRussell King 76373970055SRussell King state |= sfp->state & (SFP_F_TX_DISABLE | SFP_F_RATE_SELECT); 76473970055SRussell King sfp->state = state; 76573970055SRussell King 76673970055SRussell King rtnl_lock(); 76773970055SRussell King if (changed & SFP_F_PRESENT) 76873970055SRussell King sfp_sm_event(sfp, state & SFP_F_PRESENT ? 76973970055SRussell King SFP_E_INSERT : SFP_E_REMOVE); 77073970055SRussell King 77173970055SRussell King if (changed & SFP_F_TX_FAULT) 77273970055SRussell King sfp_sm_event(sfp, state & SFP_F_TX_FAULT ? 77373970055SRussell King SFP_E_TX_FAULT : SFP_E_TX_CLEAR); 77473970055SRussell King 77573970055SRussell King if (changed & SFP_F_LOS) 77673970055SRussell King sfp_sm_event(sfp, state & SFP_F_LOS ? 77773970055SRussell King SFP_E_LOS_HIGH : SFP_E_LOS_LOW); 77873970055SRussell King rtnl_unlock(); 77973970055SRussell King } 78073970055SRussell King 78173970055SRussell King static irqreturn_t sfp_irq(int irq, void *data) 78273970055SRussell King { 78373970055SRussell King struct sfp *sfp = data; 78473970055SRussell King 78573970055SRussell King sfp_check_state(sfp); 78673970055SRussell King 78773970055SRussell King return IRQ_HANDLED; 78873970055SRussell King } 78973970055SRussell King 79073970055SRussell King static void sfp_poll(struct work_struct *work) 79173970055SRussell King { 79273970055SRussell King struct sfp *sfp = container_of(work, struct sfp, poll.work); 79373970055SRussell King 79473970055SRussell King sfp_check_state(sfp); 79573970055SRussell King mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); 79673970055SRussell King } 79773970055SRussell King 79873970055SRussell King static struct sfp *sfp_alloc(struct device *dev) 79973970055SRussell King { 80073970055SRussell King struct sfp *sfp; 80173970055SRussell King 80273970055SRussell King sfp = kzalloc(sizeof(*sfp), GFP_KERNEL); 80373970055SRussell King if (!sfp) 80473970055SRussell King return ERR_PTR(-ENOMEM); 80573970055SRussell King 80673970055SRussell King sfp->dev = dev; 80773970055SRussell King 80873970055SRussell King mutex_init(&sfp->sm_mutex); 80973970055SRussell King INIT_DELAYED_WORK(&sfp->poll, sfp_poll); 81073970055SRussell King INIT_DELAYED_WORK(&sfp->timeout, sfp_timeout); 81173970055SRussell King 81273970055SRussell King return sfp; 81373970055SRussell King } 81473970055SRussell King 81573970055SRussell King static void sfp_cleanup(void *data) 81673970055SRussell King { 81773970055SRussell King struct sfp *sfp = data; 81873970055SRussell King 81973970055SRussell King cancel_delayed_work_sync(&sfp->poll); 82073970055SRussell King cancel_delayed_work_sync(&sfp->timeout); 82173970055SRussell King if (sfp->i2c_mii) { 82273970055SRussell King mdiobus_unregister(sfp->i2c_mii); 82373970055SRussell King mdiobus_free(sfp->i2c_mii); 82473970055SRussell King } 82573970055SRussell King if (sfp->i2c) 82673970055SRussell King i2c_put_adapter(sfp->i2c); 82773970055SRussell King kfree(sfp); 82873970055SRussell King } 82973970055SRussell King 83073970055SRussell King static int sfp_probe(struct platform_device *pdev) 83173970055SRussell King { 832259c8618SRussell King const struct sff_data *sff; 83373970055SRussell King struct sfp *sfp; 83473970055SRussell King bool poll = false; 83573970055SRussell King int irq, err, i; 83673970055SRussell King 83773970055SRussell King sfp = sfp_alloc(&pdev->dev); 83873970055SRussell King if (IS_ERR(sfp)) 83973970055SRussell King return PTR_ERR(sfp); 84073970055SRussell King 84173970055SRussell King platform_set_drvdata(pdev, sfp); 84273970055SRussell King 84373970055SRussell King err = devm_add_action(sfp->dev, sfp_cleanup, sfp); 84473970055SRussell King if (err < 0) 84573970055SRussell King return err; 84673970055SRussell King 847259c8618SRussell King sff = sfp->type = &sfp_data; 848259c8618SRussell King 84973970055SRussell King if (pdev->dev.of_node) { 85073970055SRussell King struct device_node *node = pdev->dev.of_node; 851259c8618SRussell King const struct of_device_id *id; 85273970055SRussell King struct device_node *np; 85373970055SRussell King 854259c8618SRussell King id = of_match_node(sfp_of_match, node); 855259c8618SRussell King if (WARN_ON(!id)) 856259c8618SRussell King return -EINVAL; 857259c8618SRussell King 858259c8618SRussell King sff = sfp->type = id->data; 859259c8618SRussell King 86073970055SRussell King np = of_parse_phandle(node, "i2c-bus", 0); 86173970055SRussell King if (np) { 86273970055SRussell King struct i2c_adapter *i2c; 86373970055SRussell King 86473970055SRussell King i2c = of_find_i2c_adapter_by_node(np); 86573970055SRussell King of_node_put(np); 86673970055SRussell King if (!i2c) 86773970055SRussell King return -EPROBE_DEFER; 86873970055SRussell King 86973970055SRussell King err = sfp_i2c_configure(sfp, i2c); 87073970055SRussell King if (err < 0) { 87173970055SRussell King i2c_put_adapter(i2c); 87273970055SRussell King return err; 87373970055SRussell King } 87473970055SRussell King } 875259c8618SRussell King } 87673970055SRussell King 877259c8618SRussell King for (i = 0; i < GPIO_MAX; i++) 878259c8618SRussell King if (sff->gpios & BIT(i)) { 87973970055SRussell King sfp->gpio[i] = devm_gpiod_get_optional(sfp->dev, 88073970055SRussell King gpio_of_names[i], gpio_flags[i]); 88173970055SRussell King if (IS_ERR(sfp->gpio[i])) 88273970055SRussell King return PTR_ERR(sfp->gpio[i]); 88373970055SRussell King } 88473970055SRussell King 88573970055SRussell King sfp->get_state = sfp_gpio_get_state; 88673970055SRussell King sfp->set_state = sfp_gpio_set_state; 887259c8618SRussell King 888259c8618SRussell King /* Modules that have no detect signal are always present */ 889259c8618SRussell King if (!(sfp->gpio[GPIO_MODDEF0])) 890259c8618SRussell King sfp->get_state = sff_gpio_get_state; 89173970055SRussell King 89273970055SRussell King sfp->sfp_bus = sfp_register_socket(sfp->dev, sfp, &sfp_module_ops); 89373970055SRussell King if (!sfp->sfp_bus) 89473970055SRussell King return -ENOMEM; 89573970055SRussell King 89673970055SRussell King /* Get the initial state, and always signal TX disable, 89773970055SRussell King * since the network interface will not be up. 89873970055SRussell King */ 89973970055SRussell King sfp->state = sfp_get_state(sfp) | SFP_F_TX_DISABLE; 90073970055SRussell King 90173970055SRussell King if (sfp->gpio[GPIO_RATE_SELECT] && 90273970055SRussell King gpiod_get_value_cansleep(sfp->gpio[GPIO_RATE_SELECT])) 90373970055SRussell King sfp->state |= SFP_F_RATE_SELECT; 90473970055SRussell King sfp_set_state(sfp, sfp->state); 90573970055SRussell King sfp_module_tx_disable(sfp); 90673970055SRussell King rtnl_lock(); 90773970055SRussell King if (sfp->state & SFP_F_PRESENT) 90873970055SRussell King sfp_sm_event(sfp, SFP_E_INSERT); 90973970055SRussell King rtnl_unlock(); 91073970055SRussell King 91173970055SRussell King for (i = 0; i < GPIO_MAX; i++) { 91273970055SRussell King if (gpio_flags[i] != GPIOD_IN || !sfp->gpio[i]) 91373970055SRussell King continue; 91473970055SRussell King 91573970055SRussell King irq = gpiod_to_irq(sfp->gpio[i]); 91673970055SRussell King if (!irq) { 91773970055SRussell King poll = true; 91873970055SRussell King continue; 91973970055SRussell King } 92073970055SRussell King 92173970055SRussell King err = devm_request_threaded_irq(sfp->dev, irq, NULL, sfp_irq, 92273970055SRussell King IRQF_ONESHOT | 92373970055SRussell King IRQF_TRIGGER_RISING | 92473970055SRussell King IRQF_TRIGGER_FALLING, 92573970055SRussell King dev_name(sfp->dev), sfp); 92673970055SRussell King if (err) 92773970055SRussell King poll = true; 92873970055SRussell King } 92973970055SRussell King 93073970055SRussell King if (poll) 93173970055SRussell King mod_delayed_work(system_wq, &sfp->poll, poll_jiffies); 93273970055SRussell King 93373970055SRussell King return 0; 93473970055SRussell King } 93573970055SRussell King 93673970055SRussell King static int sfp_remove(struct platform_device *pdev) 93773970055SRussell King { 93873970055SRussell King struct sfp *sfp = platform_get_drvdata(pdev); 93973970055SRussell King 94073970055SRussell King sfp_unregister_socket(sfp->sfp_bus); 94173970055SRussell King 94273970055SRussell King return 0; 94373970055SRussell King } 94473970055SRussell King 94573970055SRussell King static struct platform_driver sfp_driver = { 94673970055SRussell King .probe = sfp_probe, 94773970055SRussell King .remove = sfp_remove, 94873970055SRussell King .driver = { 94973970055SRussell King .name = "sfp", 95073970055SRussell King .of_match_table = sfp_of_match, 95173970055SRussell King }, 95273970055SRussell King }; 95373970055SRussell King 95473970055SRussell King static int sfp_init(void) 95573970055SRussell King { 95673970055SRussell King poll_jiffies = msecs_to_jiffies(100); 95773970055SRussell King 95873970055SRussell King return platform_driver_register(&sfp_driver); 95973970055SRussell King } 96073970055SRussell King module_init(sfp_init); 96173970055SRussell King 96273970055SRussell King static void sfp_exit(void) 96373970055SRussell King { 96473970055SRussell King platform_driver_unregister(&sfp_driver); 96573970055SRussell King } 96673970055SRussell King module_exit(sfp_exit); 96773970055SRussell King 96873970055SRussell King MODULE_ALIAS("platform:sfp"); 96973970055SRussell King MODULE_AUTHOR("Russell King"); 97073970055SRussell King MODULE_LICENSE("GPL v2"); 971