On Tue, Aug 18, 2015 at 09:12:00AM -0700, Mark Brown wrote: > On Tue, Aug 18, 2015 at 01:20:12PM +0800, Peter Chen wrote: > > > ok, I just had suspected below function's correctness, after looking > > it again, it always set 1800 as charging limit, does it be expected? > > > + /* Find the highest supported limit */ > > + best = 0; > > + for (i = 0; i < ARRAY_SIZE(wm831x_usb_limits); i++) { > > + if (limit < wm831x_usb_limits[i] && > +/* In miliamps */ +static unsigned int wm831x_usb_limits[] = { + 0, + 2, + 100, + 500, + 900, + 1500, + 1800, + 550, +}; + +static int wm831x_usb_limit_change(struct notifier_block *nb, + unsigned long limit, void *data) +{ + struct wm831x_power *wm831x_power = container_of(nb, + struct wm831x_power, + usb_notify); + int i, best; + + /* Find the highest supported limit */ + best = 0; + for (i = 0; i < ARRAY_SIZE(wm831x_usb_limits); i++) { + if (limit < wm831x_usb_limits[i] && + wm831x_usb_limits[best] < wm831x_usb_limits[i]) + best = i; + } + + dev_dbg(wm831x_power->wm831x->dev, + "Limiting USB current to %dmA", wm831x_usb_limits[best]); + + wm831x_set_bits(wm831x_power->wm831x, WM831X_POWER_STATE, + WM831X_USB_ILIM_MASK, best); + + return 0; +} + > The above check is intended to ensure that we don't go over the limit > that was passed in in the callback. The goal is to select the highest > option that is less than the limit passed in. Please correct me if I was wrong, If there is SDP (PC), the current limit is 500mA, then when the i = 4, (500 < 900) && (0 < 900) is true, the best is 4. When the i goes to 5, (500 < 1500) && (900 < 1500) is true, the best is 5. At last, the best will be 1800, which is not our expectation. Below code may be correct for the goal you expressed. for (i = 0; i < ARRAY_SIZE(wm831x_usb_limits); i++) { if (limit >= wm831x_usb_limits[i] && wm831x_usb_limits[best] < wm831x_usb_limits[i]) best = i; } -- Best Regards, Peter Chen -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html