Pin control fixes for v4.12:
- Make a few Intel Chromebooks with Cherryview DMI firmware work smoothly. - A fix for some bogus allocations in the generic group management code. - Some GPIO descriptor lookup table stubs. Merged through the pin control tree for administrative reasons. - Revert the "bi-directional" and "output-enable" generic properties: we need more discussions around this. It seems other SoCs are using input/output gate enablement and these terms are not correct. - Fix mux and drive strength atomically in the MXS driver. - Fix the SPDIF function on sunxi A83T. - OF table terminators and other small fixes. -----BEGIN PGP SIGNATURE----- iQIcBAABAgAGBQJZK9EfAAoJEEEQszewGV1zOWsP/j1eaQajpNgxIQTu7loTKekq kOfMO8LhGd+ZAUh9APr+eeWPBzGVir6EMC8Ha0JgCau33d67AVCkBNWeo+ztIvCP 7R5LUSAi4sFxHZ20kEPIWVWqOFN4Ob/5Ju+ivOvRy47pAL3cvDMhoP7cWM/Curkt k5X4WLJonPAzXEuWG1EvRWOd1w6z1g1prUiOyxFF2vnJgEZ/nckVkhf+BR/kwJZl w4UwPXeuceI4bqL7+L7kzii6ou1fxoKj0GxmsAmdpYTJW3ObV6m7qJd9Kfj0NEgI E+9INh/3R+fs0OVZoyAQf1ufoaByjz/qmCGiyuxLW3aWmmAT1LQhNw/8fZixwZWF aSGD7Fgj+Ub2deCmzTbN7sY5ES8lP3CcYQB2EM0q/uVd94vCqFDuCfh3aHg3Tj4c EGjE9yGcW2vD/CEYewbIluC4Eqp4Sou69+SWvGFQrIDcJjy1JshsNab2lCBTDEJy eD1TpIj1q5LGBSxCmVlJqqRql44H9OVizbbhnoy8uDscSiO8KsZPbUlQX3WIsN/0 WvH6UGRpvrFqY1b4Ek9o2NE8nTO0OkpGwuugEV9rBWK3XKVjbtEI32hydAwZXRXH 0J7iVl7EDg2Lq3h87udtdQAVcdzfnOvtE9R0y45YAgPeItRc7JqP/aoxbtgEMSwE 9f9tGWywFOygE9o6n0DW =S65X -----END PGP SIGNATURE----- Merge tag 'pinctrl-v4.12-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl Pull pin control fixes from Linus Walleij: "Here is an overdue pull request for pin control fixes, the most prominent feature is to make Intel Chromebooks (and I suspect any other Cherryview-based Intel thing) happy again, which we really want to see. There is a patch hitting drivers/firmware/* that I was uncertain to who actually manages, but I got Andy Shevchenko's and Dmitry Torokov's review tags on it and I trust them both 100% to do the right thing for Intel platform drivers. Summary: - Make a few Intel Chromebooks with Cherryview DMI firmware work smoothly. - A fix for some bogus allocations in the generic group management code. - Some GPIO descriptor lookup table stubs. Merged through the pin control tree for administrative reasons. - Revert the "bi-directional" and "output-enable" generic properties: we need more discussions around this. It seems other SoCs are using input/output gate enablement and these terms are not correct. - Fix mux and drive strength atomically in the MXS driver. - Fix the SPDIF function on sunxi A83T. - OF table terminators and other small fixes" * tag 'pinctrl-v4.12-2' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-pinctrl: pinctrl: sunxi: Fix SPDIF function name for A83T pinctrl: mxs: atomically switch mux and drive strength config pinctrl: cherryview: Extend the Chromebook DMI quirk to Intel_Strago systems firmware: dmi: Add DMI_PRODUCT_FAMILY identification string pinctrl: core: Fix warning by removing bogus code gpiolib: Add stubs for gpiod lookup table interface Revert "pinctrl: generic: Add bi-directional and output-enable" pinctrl: cherryview: Add terminate entry for dmi_system_id tables
This commit is contained in:
Коммит
3f173bde7e
|
@ -247,7 +247,6 @@ bias-bus-hold - latch weakly
|
|||
bias-pull-up - pull up the pin
|
||||
bias-pull-down - pull down the pin
|
||||
bias-pull-pin-default - use pin-default pull state
|
||||
bi-directional - pin supports simultaneous input/output operations
|
||||
drive-push-pull - drive actively high and low
|
||||
drive-open-drain - drive with open drain
|
||||
drive-open-source - drive with open source
|
||||
|
@ -260,7 +259,6 @@ input-debounce - debounce mode with debound time X
|
|||
power-source - select between different power supplies
|
||||
low-power-enable - enable low power mode
|
||||
low-power-disable - disable low power mode
|
||||
output-enable - enable output on pin regardless of output value
|
||||
output-low - set the pin to output mode with low level
|
||||
output-high - set the pin to output mode with high level
|
||||
slew-rate - set the slew rate
|
||||
|
|
|
@ -47,6 +47,7 @@ DEFINE_DMI_ATTR_WITH_SHOW(product_name, 0444, DMI_PRODUCT_NAME);
|
|||
DEFINE_DMI_ATTR_WITH_SHOW(product_version, 0444, DMI_PRODUCT_VERSION);
|
||||
DEFINE_DMI_ATTR_WITH_SHOW(product_serial, 0400, DMI_PRODUCT_SERIAL);
|
||||
DEFINE_DMI_ATTR_WITH_SHOW(product_uuid, 0400, DMI_PRODUCT_UUID);
|
||||
DEFINE_DMI_ATTR_WITH_SHOW(product_family, 0400, DMI_PRODUCT_FAMILY);
|
||||
DEFINE_DMI_ATTR_WITH_SHOW(board_vendor, 0444, DMI_BOARD_VENDOR);
|
||||
DEFINE_DMI_ATTR_WITH_SHOW(board_name, 0444, DMI_BOARD_NAME);
|
||||
DEFINE_DMI_ATTR_WITH_SHOW(board_version, 0444, DMI_BOARD_VERSION);
|
||||
|
@ -191,6 +192,7 @@ static void __init dmi_id_init_attr_table(void)
|
|||
ADD_DMI_ATTR(product_version, DMI_PRODUCT_VERSION);
|
||||
ADD_DMI_ATTR(product_serial, DMI_PRODUCT_SERIAL);
|
||||
ADD_DMI_ATTR(product_uuid, DMI_PRODUCT_UUID);
|
||||
ADD_DMI_ATTR(product_family, DMI_PRODUCT_FAMILY);
|
||||
ADD_DMI_ATTR(board_vendor, DMI_BOARD_VENDOR);
|
||||
ADD_DMI_ATTR(board_name, DMI_BOARD_NAME);
|
||||
ADD_DMI_ATTR(board_version, DMI_BOARD_VERSION);
|
||||
|
|
|
@ -430,6 +430,7 @@ static void __init dmi_decode(const struct dmi_header *dm, void *dummy)
|
|||
dmi_save_ident(dm, DMI_PRODUCT_VERSION, 6);
|
||||
dmi_save_ident(dm, DMI_PRODUCT_SERIAL, 7);
|
||||
dmi_save_uuid(dm, DMI_PRODUCT_UUID, 8);
|
||||
dmi_save_ident(dm, DMI_PRODUCT_FAMILY, 26);
|
||||
break;
|
||||
case 2: /* Base Board Information */
|
||||
dmi_save_ident(dm, DMI_BOARD_VENDOR, 4);
|
||||
|
|
|
@ -680,30 +680,16 @@ EXPORT_SYMBOL_GPL(pinctrl_generic_remove_group);
|
|||
* pinctrl_generic_free_groups() - removes all pin groups
|
||||
* @pctldev: pin controller device
|
||||
*
|
||||
* Note that the caller must take care of locking.
|
||||
* Note that the caller must take care of locking. The pinctrl groups
|
||||
* are allocated with devm_kzalloc() so no need to free them here.
|
||||
*/
|
||||
static void pinctrl_generic_free_groups(struct pinctrl_dev *pctldev)
|
||||
{
|
||||
struct radix_tree_iter iter;
|
||||
struct group_desc *group;
|
||||
unsigned long *indices;
|
||||
void **slot;
|
||||
int i = 0;
|
||||
|
||||
indices = devm_kzalloc(pctldev->dev, sizeof(*indices) *
|
||||
pctldev->num_groups, GFP_KERNEL);
|
||||
if (!indices)
|
||||
return;
|
||||
|
||||
radix_tree_for_each_slot(slot, &pctldev->pin_group_tree, &iter, 0)
|
||||
indices[i++] = iter.index;
|
||||
|
||||
for (i = 0; i < pctldev->num_groups; i++) {
|
||||
group = radix_tree_lookup(&pctldev->pin_group_tree,
|
||||
indices[i]);
|
||||
radix_tree_delete(&pctldev->pin_group_tree, indices[i]);
|
||||
devm_kfree(pctldev->dev, group);
|
||||
}
|
||||
radix_tree_delete(&pctldev->pin_group_tree, iter.index);
|
||||
|
||||
pctldev->num_groups = 0;
|
||||
}
|
||||
|
|
|
@ -194,6 +194,16 @@ static int mxs_pinctrl_get_func_groups(struct pinctrl_dev *pctldev,
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void mxs_pinctrl_rmwl(u32 value, u32 mask, u8 shift, void __iomem *reg)
|
||||
{
|
||||
u32 tmp;
|
||||
|
||||
tmp = readl(reg);
|
||||
tmp &= ~(mask << shift);
|
||||
tmp |= value << shift;
|
||||
writel(tmp, reg);
|
||||
}
|
||||
|
||||
static int mxs_pinctrl_set_mux(struct pinctrl_dev *pctldev, unsigned selector,
|
||||
unsigned group)
|
||||
{
|
||||
|
@ -211,8 +221,7 @@ static int mxs_pinctrl_set_mux(struct pinctrl_dev *pctldev, unsigned selector,
|
|||
reg += bank * 0x20 + pin / 16 * 0x10;
|
||||
shift = pin % 16 * 2;
|
||||
|
||||
writel(0x3 << shift, reg + CLR);
|
||||
writel(g->muxsel[i] << shift, reg + SET);
|
||||
mxs_pinctrl_rmwl(g->muxsel[i], 0x3, shift, reg);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -279,8 +288,7 @@ static int mxs_pinconf_group_set(struct pinctrl_dev *pctldev,
|
|||
/* mA */
|
||||
if (config & MA_PRESENT) {
|
||||
shift = pin % 8 * 4;
|
||||
writel(0x3 << shift, reg + CLR);
|
||||
writel(ma << shift, reg + SET);
|
||||
mxs_pinctrl_rmwl(ma, 0x3, shift, reg);
|
||||
}
|
||||
|
||||
/* vol */
|
||||
|
|
|
@ -1539,15 +1539,29 @@ static void chv_gpio_irq_handler(struct irq_desc *desc)
|
|||
* is not listed below.
|
||||
*/
|
||||
static const struct dmi_system_id chv_no_valid_mask[] = {
|
||||
/* See https://bugzilla.kernel.org/show_bug.cgi?id=194945 */
|
||||
{
|
||||
/* See https://bugzilla.kernel.org/show_bug.cgi?id=194945 */
|
||||
.ident = "Acer Chromebook (CYAN)",
|
||||
.ident = "Intel_Strago based Chromebooks (All models)",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Edgar"),
|
||||
DMI_MATCH(DMI_BIOS_DATE, "05/21/2016"),
|
||||
DMI_MATCH(DMI_PRODUCT_FAMILY, "Intel_Strago"),
|
||||
},
|
||||
}
|
||||
},
|
||||
{
|
||||
.ident = "Acer Chromebook R11 (Cyan)",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Cyan"),
|
||||
},
|
||||
},
|
||||
{
|
||||
.ident = "Samsung Chromebook 3 (Celes)",
|
||||
.matches = {
|
||||
DMI_MATCH(DMI_SYS_VENDOR, "GOOGLE"),
|
||||
DMI_MATCH(DMI_PRODUCT_NAME, "Celes"),
|
||||
},
|
||||
},
|
||||
{}
|
||||
};
|
||||
|
||||
static int chv_gpio_probe(struct chv_pinctrl *pctrl, int irq)
|
||||
|
|
|
@ -35,7 +35,6 @@ static const struct pin_config_item conf_items[] = {
|
|||
PCONFDUMP(PIN_CONFIG_BIAS_PULL_PIN_DEFAULT,
|
||||
"input bias pull to pin specific state", NULL, false),
|
||||
PCONFDUMP(PIN_CONFIG_BIAS_PULL_UP, "input bias pull up", NULL, false),
|
||||
PCONFDUMP(PIN_CONFIG_BIDIRECTIONAL, "bi-directional pin operations", NULL, false),
|
||||
PCONFDUMP(PIN_CONFIG_DRIVE_OPEN_DRAIN, "output drive open drain", NULL, false),
|
||||
PCONFDUMP(PIN_CONFIG_DRIVE_OPEN_SOURCE, "output drive open source", NULL, false),
|
||||
PCONFDUMP(PIN_CONFIG_DRIVE_PUSH_PULL, "output drive push pull", NULL, false),
|
||||
|
@ -161,7 +160,6 @@ static const struct pinconf_generic_params dt_params[] = {
|
|||
{ "bias-pull-up", PIN_CONFIG_BIAS_PULL_UP, 1 },
|
||||
{ "bias-pull-pin-default", PIN_CONFIG_BIAS_PULL_PIN_DEFAULT, 1 },
|
||||
{ "bias-pull-down", PIN_CONFIG_BIAS_PULL_DOWN, 1 },
|
||||
{ "bi-directional", PIN_CONFIG_BIDIRECTIONAL, 1 },
|
||||
{ "drive-open-drain", PIN_CONFIG_DRIVE_OPEN_DRAIN, 0 },
|
||||
{ "drive-open-source", PIN_CONFIG_DRIVE_OPEN_SOURCE, 0 },
|
||||
{ "drive-push-pull", PIN_CONFIG_DRIVE_PUSH_PULL, 0 },
|
||||
|
@ -174,7 +172,6 @@ static const struct pinconf_generic_params dt_params[] = {
|
|||
{ "input-schmitt-enable", PIN_CONFIG_INPUT_SCHMITT_ENABLE, 1 },
|
||||
{ "low-power-disable", PIN_CONFIG_LOW_POWER_MODE, 0 },
|
||||
{ "low-power-enable", PIN_CONFIG_LOW_POWER_MODE, 1 },
|
||||
{ "output-enable", PIN_CONFIG_OUTPUT, 1, },
|
||||
{ "output-high", PIN_CONFIG_OUTPUT, 1, },
|
||||
{ "output-low", PIN_CONFIG_OUTPUT, 0, },
|
||||
{ "power-source", PIN_CONFIG_POWER_SOURCE, 0 },
|
||||
|
|
|
@ -826,30 +826,17 @@ EXPORT_SYMBOL_GPL(pinmux_generic_remove_function);
|
|||
* pinmux_generic_free_functions() - removes all functions
|
||||
* @pctldev: pin controller device
|
||||
*
|
||||
* Note that the caller must take care of locking.
|
||||
* Note that the caller must take care of locking. The pinctrl
|
||||
* functions are allocated with devm_kzalloc() so no need to free
|
||||
* them here.
|
||||
*/
|
||||
void pinmux_generic_free_functions(struct pinctrl_dev *pctldev)
|
||||
{
|
||||
struct radix_tree_iter iter;
|
||||
struct function_desc *function;
|
||||
unsigned long *indices;
|
||||
void **slot;
|
||||
int i = 0;
|
||||
|
||||
indices = devm_kzalloc(pctldev->dev, sizeof(*indices) *
|
||||
pctldev->num_functions, GFP_KERNEL);
|
||||
if (!indices)
|
||||
return;
|
||||
|
||||
radix_tree_for_each_slot(slot, &pctldev->pin_function_tree, &iter, 0)
|
||||
indices[i++] = iter.index;
|
||||
|
||||
for (i = 0; i < pctldev->num_functions; i++) {
|
||||
function = radix_tree_lookup(&pctldev->pin_function_tree,
|
||||
indices[i]);
|
||||
radix_tree_delete(&pctldev->pin_function_tree, indices[i]);
|
||||
devm_kfree(pctldev->dev, function);
|
||||
}
|
||||
radix_tree_delete(&pctldev->pin_function_tree, iter.index);
|
||||
|
||||
pctldev->num_functions = 0;
|
||||
}
|
||||
|
|
|
@ -394,7 +394,7 @@ static const struct sunxi_desc_pin sun8i_a83t_pins[] = {
|
|||
SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 18),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out"),
|
||||
SUNXI_FUNCTION(0x3, "owa")), /* DOUT */
|
||||
SUNXI_FUNCTION(0x3, "spdif")), /* DOUT */
|
||||
SUNXI_PIN(SUNXI_PINCTRL_PIN(E, 19),
|
||||
SUNXI_FUNCTION(0x0, "gpio_in"),
|
||||
SUNXI_FUNCTION(0x1, "gpio_out")),
|
||||
|
|
|
@ -56,7 +56,14 @@ struct gpiod_lookup_table {
|
|||
.flags = _flags, \
|
||||
}
|
||||
|
||||
#ifdef CONFIG_GPIOLIB
|
||||
void gpiod_add_lookup_table(struct gpiod_lookup_table *table);
|
||||
void gpiod_remove_lookup_table(struct gpiod_lookup_table *table);
|
||||
#else
|
||||
static inline
|
||||
void gpiod_add_lookup_table(struct gpiod_lookup_table *table) {}
|
||||
static inline
|
||||
void gpiod_remove_lookup_table(struct gpiod_lookup_table *table) {}
|
||||
#endif
|
||||
|
||||
#endif /* __LINUX_GPIO_MACHINE_H */
|
||||
|
|
|
@ -467,6 +467,7 @@ enum dmi_field {
|
|||
DMI_PRODUCT_VERSION,
|
||||
DMI_PRODUCT_SERIAL,
|
||||
DMI_PRODUCT_UUID,
|
||||
DMI_PRODUCT_FAMILY,
|
||||
DMI_BOARD_VENDOR,
|
||||
DMI_BOARD_NAME,
|
||||
DMI_BOARD_VERSION,
|
||||
|
|
|
@ -42,8 +42,6 @@
|
|||
* @PIN_CONFIG_BIAS_PULL_UP: the pin will be pulled up (usually with high
|
||||
* impedance to VDD). If the argument is != 0 pull-up is enabled,
|
||||
* if it is 0, pull-up is total, i.e. the pin is connected to VDD.
|
||||
* @PIN_CONFIG_BIDIRECTIONAL: the pin will be configured to allow simultaneous
|
||||
* input and output operations.
|
||||
* @PIN_CONFIG_DRIVE_OPEN_DRAIN: the pin will be driven with open drain (open
|
||||
* collector) which means it is usually wired with other output ports
|
||||
* which are then pulled up with an external resistor. Setting this
|
||||
|
@ -98,7 +96,6 @@ enum pin_config_param {
|
|||
PIN_CONFIG_BIAS_PULL_DOWN,
|
||||
PIN_CONFIG_BIAS_PULL_PIN_DEFAULT,
|
||||
PIN_CONFIG_BIAS_PULL_UP,
|
||||
PIN_CONFIG_BIDIRECTIONAL,
|
||||
PIN_CONFIG_DRIVE_OPEN_DRAIN,
|
||||
PIN_CONFIG_DRIVE_OPEN_SOURCE,
|
||||
PIN_CONFIG_DRIVE_PUSH_PULL,
|
||||
|
|
Загрузка…
Ссылка в новой задаче