static int usb3503_i2c_suspend(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct usb3503 *hub = i2c_get_clientdata(client); usb3503_switch_mode(hub, USB3503_MODE_STANDBY); if (hub->clk) clk_disable_unprepare(hub->clk); return 0; }
static int usb3503_i2c_resume(struct device *dev) { struct i2c_client *client = to_i2c_client(dev); struct usb3503 *hub = i2c_get_clientdata(client); if (hub->clk) clk_prepare_enable(hub->clk); usb3503_switch_mode(hub, hub->mode); return 0; }
int usb3503_probe(struct i2c_client *i2c, const struct i2c_device_id *id) { struct usb3503_platform_data *pdata = i2c->dev.platform_data; struct device_node *np = i2c->dev.of_node; struct usb3503 *hub; int err = -ENOMEM; u32 mode = USB3503_MODE_UNKNOWN; hub = kzalloc(sizeof(struct usb3503), GFP_KERNEL); if (!hub) { dev_err(&i2c->dev, "private data alloc fail\n"); return err; } i2c_set_clientdata(i2c, hub); hub->client = i2c; if (pdata) { hub->gpio_intn = pdata->gpio_intn; hub->gpio_connect = pdata->gpio_connect; hub->gpio_reset = pdata->gpio_reset; hub->mode = pdata->initial_mode; hub->clk = pdata->ref_clk; } else if (np) { hub->gpio_intn = of_get_named_gpio(np, "connect-gpios", 0); if (hub->gpio_intn == -EPROBE_DEFER) return -EPROBE_DEFER; hub->gpio_connect = of_get_named_gpio(np, "intn-gpios", 0); if (hub->gpio_connect == -EPROBE_DEFER) return -EPROBE_DEFER; hub->gpio_reset = of_get_named_gpio(np, "reset-gpios", 0); if (hub->gpio_reset == -EPROBE_DEFER) return -EPROBE_DEFER; of_property_read_u32(np, "initial-mode", &mode); hub->mode = mode; } if (gpio_is_valid(hub->gpio_intn)) { if(hub->clk == USB3503_REFCLK_24M) err = gpio_request_one(hub->gpio_intn, GPIOF_OUT_INIT_LOW, "usb3503 intn"); else if(hub->clk == USB3503_REFCLK_26M) err = gpio_request_one(hub->gpio_intn, GPIOF_OUT_INIT_HIGH, "usb3503 intn"); else err = gpio_request_one(hub->gpio_intn, GPIOF_OUT_INIT_HIGH, "usb3503 intn"); if (err) { dev_err(&i2c->dev, "unable to request GPIO %d as connect pin (%d)\n", hub->gpio_intn, err); goto err_out; } } if (gpio_is_valid(hub->gpio_connect)) { err = gpio_request_one(hub->gpio_connect, GPIOF_OUT_INIT_HIGH, "usb3503 connect"); if (err) { dev_err(&i2c->dev, "unable to request GPIO %d as connect pin (%d)\n", hub->gpio_connect, err); goto err_gpio_connect; } } if (gpio_is_valid(hub->gpio_reset)) { err = gpio_request_one(hub->gpio_reset, GPIOF_OUT_INIT_LOW, "usb3503 reset"); if (err) { dev_err(&i2c->dev, "unable to request GPIO %d as reset pin (%d)\n", hub->gpio_reset, err); goto err_gpio_reset; } } usb3503_switch_mode(hub, hub->mode); dev_info(&i2c->dev, "%s: probed on %s mode\n", __func__, (hub->mode == USB3503_MODE_HUB) ? "hub" : "standby"); return 0; err_gpio_reset: if (gpio_is_valid(hub->gpio_connect)) gpio_free(hub->gpio_connect); err_gpio_connect: if (gpio_is_valid(hub->gpio_intn)) gpio_free(hub->gpio_intn); err_out: kfree(hub); return err; }
static int usb3503_probe(struct usb3503 *hub) { struct device *dev = hub->dev; struct usb3503_platform_data *pdata = dev_get_platdata(dev); struct device_node *np = dev->of_node; int err; u32 mode = USB3503_MODE_HUB; const u32 *property; int len; if (pdata) { hub->port_off_mask = pdata->port_off_mask; hub->gpio_intn = pdata->gpio_intn; hub->gpio_connect = pdata->gpio_connect; hub->gpio_reset = pdata->gpio_reset; hub->mode = pdata->initial_mode; } else if (np) { struct clk *clk; u32 rate = 0; hub->port_off_mask = 0; if (!of_property_read_u32(np, "refclk-frequency", &rate)) { switch (rate) { case 38400000: case 26000000: case 19200000: case 12000000: hub->secondary_ref_clk = 0; break; case 24000000: case 27000000: case 25000000: case 50000000: hub->secondary_ref_clk = 1; break; default: dev_err(dev, "unsupported reference clock rate (%d)\n", (int) rate); return -EINVAL; } } clk = devm_clk_get(dev, "refclk"); if (IS_ERR(clk) && PTR_ERR(clk) != -ENOENT) { dev_err(dev, "unable to request refclk (%ld)\n", PTR_ERR(clk)); return PTR_ERR(clk); } if (!IS_ERR(clk)) { hub->clk = clk; if (rate != 0) { err = clk_set_rate(hub->clk, rate); if (err) { dev_err(dev, "unable to set reference clock rate to %d\n", (int) rate); return err; } } err = clk_prepare_enable(hub->clk); if (err) { dev_err(dev, "unable to enable reference clock\n"); return err; } } property = of_get_property(np, "disabled-ports", &len); if (property && (len / sizeof(u32)) > 0) { int i; for (i = 0; i < len / sizeof(u32); i++) { u32 port = be32_to_cpu(property[i]); if ((1 <= port) && (port <= 3)) hub->port_off_mask |= (1 << port); } } hub->gpio_intn = of_get_named_gpio(np, "intn-gpios", 0); if (hub->gpio_intn == -EPROBE_DEFER) return -EPROBE_DEFER; hub->gpio_connect = of_get_named_gpio(np, "connect-gpios", 0); if (hub->gpio_connect == -EPROBE_DEFER) return -EPROBE_DEFER; hub->gpio_reset = of_get_named_gpio(np, "reset-gpios", 0); if (hub->gpio_reset == -EPROBE_DEFER) return -EPROBE_DEFER; of_property_read_u32(np, "initial-mode", &mode); hub->mode = mode; } if (hub->port_off_mask && !hub->regmap) dev_err(dev, "Ports disabled with no control interface\n"); if (gpio_is_valid(hub->gpio_intn)) { int val = hub->secondary_ref_clk ? GPIOF_OUT_INIT_LOW : GPIOF_OUT_INIT_HIGH; err = devm_gpio_request_one(dev, hub->gpio_intn, val, "usb3503 intn"); if (err) { dev_err(dev, "unable to request GPIO %d as interrupt pin (%d)\n", hub->gpio_intn, err); return err; } } if (gpio_is_valid(hub->gpio_connect)) { err = devm_gpio_request_one(dev, hub->gpio_connect, GPIOF_OUT_INIT_LOW, "usb3503 connect"); if (err) { dev_err(dev, "unable to request GPIO %d as connect pin (%d)\n", hub->gpio_connect, err); return err; } } if (gpio_is_valid(hub->gpio_reset)) { err = devm_gpio_request_one(dev, hub->gpio_reset, GPIOF_OUT_INIT_LOW, "usb3503 reset"); if (err) { dev_err(dev, "unable to request GPIO %d as reset pin (%d)\n", hub->gpio_reset, err); return err; } } usb3503_switch_mode(hub, hub->mode); dev_info(dev, "%s: probed in %s mode\n", __func__, (hub->mode == USB3503_MODE_HUB) ? "hub" : "standby"); return 0; }