pinctrl: madera: Add driver for Cirrus Logic Madera codecs
These codecs have a variable number of I/O lines each of which is individually selectable to a wide range of possible functions. The functionality is slightly different from the traditional muxed GPIO since most of the functions can be mapped to any pin (and even the same function to multiple pins). Most pins have a dedicated "alternate" function that is only available on that pin. The alternate functions are usually a group of signals, though it is not always necessary to enable the full group, depending on the alternate function and how it is to be used. The mapping between alternate functions and GPIO pins varies between codecs depending on the number of alternate functions and available pins. Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Lee Jones <lee.jones@linaro.org>
This commit is contained in:
parent
b3b606c98f
commit
218d72a77b
10 changed files with 1309 additions and 0 deletions
|
@ -3488,9 +3488,11 @@ T: git https://github.com/CirrusLogic/linux-drivers.git
|
|||
W: https://github.com/CirrusLogic/linux-drivers/wiki
|
||||
S: Supported
|
||||
F: Documentation/devicetree/bindings/mfd/madera.txt
|
||||
F: Documentation/devicetree/bindings/pinctrl/cirrus,madera-pinctrl.txt
|
||||
F: include/linux/mfd/madera/*
|
||||
F: drivers/mfd/madera*
|
||||
F: drivers/mfd/cs47l*
|
||||
F: drivers/pinctrl/cirrus/*
|
||||
|
||||
CLEANCACHE API
|
||||
M: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
|
||||
|
|
|
@ -359,6 +359,7 @@ source "drivers/pinctrl/vt8500/Kconfig"
|
|||
source "drivers/pinctrl/mediatek/Kconfig"
|
||||
source "drivers/pinctrl/zte/Kconfig"
|
||||
source "drivers/pinctrl/meson/Kconfig"
|
||||
source "drivers/pinctrl/cirrus/Kconfig"
|
||||
|
||||
config PINCTRL_XWAY
|
||||
bool
|
||||
|
|
|
@ -63,3 +63,4 @@ obj-$(CONFIG_PINCTRL_UNIPHIER) += uniphier/
|
|||
obj-$(CONFIG_ARCH_VT8500) += vt8500/
|
||||
obj-y += mediatek/
|
||||
obj-$(CONFIG_PINCTRL_ZX) += zte/
|
||||
obj-y += cirrus/
|
||||
|
|
14
drivers/pinctrl/cirrus/Kconfig
Normal file
14
drivers/pinctrl/cirrus/Kconfig
Normal file
|
@ -0,0 +1,14 @@
|
|||
# This is all selected by the Madera MFD driver Kconfig options
|
||||
config PINCTRL_MADERA
|
||||
tristate
|
||||
select PINMUX
|
||||
select GENERIC_PINCONF
|
||||
|
||||
config PINCTRL_CS47L35
|
||||
bool
|
||||
|
||||
config PINCTRL_CS47L85
|
||||
bool
|
||||
|
||||
config PINCTRL_CS47L90
|
||||
bool
|
13
drivers/pinctrl/cirrus/Makefile
Normal file
13
drivers/pinctrl/cirrus/Makefile
Normal file
|
@ -0,0 +1,13 @@
|
|||
# Cirrus Logic pinctrl drivers
|
||||
pinctrl-madera-objs := pinctrl-madera-core.o
|
||||
ifeq ($(CONFIG_PINCTRL_CS47L35),y)
|
||||
pinctrl-madera-objs += pinctrl-cs47l35.o
|
||||
endif
|
||||
ifeq ($(CONFIG_PINCTRL_CS47L85),y)
|
||||
pinctrl-madera-objs += pinctrl-cs47l85.o
|
||||
endif
|
||||
ifeq ($(CONFIG_PINCTRL_CS47L90),y)
|
||||
pinctrl-madera-objs += pinctrl-cs47l90.o
|
||||
endif
|
||||
|
||||
obj-$(CONFIG_PINCTRL_MADERA) += pinctrl-madera.o
|
45
drivers/pinctrl/cirrus/pinctrl-cs47l35.c
Normal file
45
drivers/pinctrl/cirrus/pinctrl-cs47l35.c
Normal file
|
@ -0,0 +1,45 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Pinctrl for Cirrus Logic CS47L35
|
||||
*
|
||||
* Copyright (C) 2016-2017 Cirrus Logic
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; version 2.
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/mfd/madera/core.h>
|
||||
|
||||
#include "pinctrl-madera.h"
|
||||
|
||||
/*
|
||||
* The alt func groups are the most commonly used functions we place these at
|
||||
* the lower function indexes for convenience, and the less commonly used gpio
|
||||
* functions at higher indexes.
|
||||
*
|
||||
* To stay consistent with the datasheet the function names are the same as
|
||||
* the group names for that function's pins
|
||||
*
|
||||
* Note - all 1 less than in datasheet because these are zero-indexed
|
||||
*/
|
||||
static const unsigned int cs47l35_aif3_pins[] = { 0, 1, 2, 3 };
|
||||
static const unsigned int cs47l35_spk_pins[] = { 4, 5 };
|
||||
static const unsigned int cs47l35_aif1_pins[] = { 7, 8, 9, 10 };
|
||||
static const unsigned int cs47l35_aif2_pins[] = { 11, 12, 13, 14 };
|
||||
static const unsigned int cs47l35_mif1_pins[] = { 6, 15 };
|
||||
|
||||
static const struct madera_pin_groups cs47l35_pin_groups[] = {
|
||||
{ "aif1", cs47l35_aif1_pins, ARRAY_SIZE(cs47l35_aif1_pins) },
|
||||
{ "aif2", cs47l35_aif2_pins, ARRAY_SIZE(cs47l35_aif2_pins) },
|
||||
{ "aif3", cs47l35_aif3_pins, ARRAY_SIZE(cs47l35_aif3_pins) },
|
||||
{ "mif1", cs47l35_mif1_pins, ARRAY_SIZE(cs47l35_mif1_pins) },
|
||||
{ "pdmspk1", cs47l35_spk_pins, ARRAY_SIZE(cs47l35_spk_pins) },
|
||||
};
|
||||
|
||||
const struct madera_pin_chip cs47l35_pin_chip = {
|
||||
.n_pins = CS47L35_NUM_GPIOS,
|
||||
.pin_groups = cs47l35_pin_groups,
|
||||
.n_pin_groups = ARRAY_SIZE(cs47l35_pin_groups),
|
||||
};
|
59
drivers/pinctrl/cirrus/pinctrl-cs47l85.c
Normal file
59
drivers/pinctrl/cirrus/pinctrl-cs47l85.c
Normal file
|
@ -0,0 +1,59 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Pinctrl for Cirrus Logic CS47L85
|
||||
*
|
||||
* Copyright (C) 2016-2017 Cirrus Logic
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; version 2.
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/mfd/madera/core.h>
|
||||
|
||||
#include "pinctrl-madera.h"
|
||||
|
||||
/*
|
||||
* The alt func groups are the most commonly used functions we place these at
|
||||
* the lower function indexes for convenience, and the less commonly used gpio
|
||||
* functions at higher indexes.
|
||||
*
|
||||
* To stay consistent with the datasheet the function names are the same as
|
||||
* the group names for that function's pins
|
||||
*
|
||||
* Note - all 1 less than in datasheet because these are zero-indexed
|
||||
*/
|
||||
static const unsigned int cs47l85_mif1_pins[] = { 8, 9 };
|
||||
static const unsigned int cs47l85_mif2_pins[] = { 10, 11 };
|
||||
static const unsigned int cs47l85_mif3_pins[] = { 12, 13 };
|
||||
static const unsigned int cs47l85_aif1_pins[] = { 14, 15, 16, 17 };
|
||||
static const unsigned int cs47l85_aif2_pins[] = { 18, 19, 20, 21 };
|
||||
static const unsigned int cs47l85_aif3_pins[] = { 22, 23, 24, 25 };
|
||||
static const unsigned int cs47l85_aif4_pins[] = { 26, 27, 28, 29 };
|
||||
static const unsigned int cs47l85_dmic4_pins[] = { 30, 31 };
|
||||
static const unsigned int cs47l85_dmic5_pins[] = { 32, 33 };
|
||||
static const unsigned int cs47l85_dmic6_pins[] = { 34, 35 };
|
||||
static const unsigned int cs47l85_spk1_pins[] = { 36, 38 };
|
||||
static const unsigned int cs47l85_spk2_pins[] = { 37, 39 };
|
||||
|
||||
static const struct madera_pin_groups cs47l85_pin_groups[] = {
|
||||
{ "aif1", cs47l85_aif1_pins, ARRAY_SIZE(cs47l85_aif1_pins) },
|
||||
{ "aif2", cs47l85_aif2_pins, ARRAY_SIZE(cs47l85_aif2_pins) },
|
||||
{ "aif3", cs47l85_aif3_pins, ARRAY_SIZE(cs47l85_aif3_pins) },
|
||||
{ "aif4", cs47l85_aif4_pins, ARRAY_SIZE(cs47l85_aif4_pins) },
|
||||
{ "mif1", cs47l85_mif1_pins, ARRAY_SIZE(cs47l85_mif1_pins) },
|
||||
{ "mif2", cs47l85_mif2_pins, ARRAY_SIZE(cs47l85_mif2_pins) },
|
||||
{ "mif3", cs47l85_mif3_pins, ARRAY_SIZE(cs47l85_mif3_pins) },
|
||||
{ "dmic4", cs47l85_dmic4_pins, ARRAY_SIZE(cs47l85_dmic4_pins) },
|
||||
{ "dmic5", cs47l85_dmic5_pins, ARRAY_SIZE(cs47l85_dmic5_pins) },
|
||||
{ "dmic6", cs47l85_dmic6_pins, ARRAY_SIZE(cs47l85_dmic6_pins) },
|
||||
{ "pdmspk1", cs47l85_spk1_pins, ARRAY_SIZE(cs47l85_spk1_pins) },
|
||||
{ "pdmspk2", cs47l85_spk2_pins, ARRAY_SIZE(cs47l85_spk2_pins) },
|
||||
};
|
||||
|
||||
const struct madera_pin_chip cs47l85_pin_chip = {
|
||||
.n_pins = CS47L85_NUM_GPIOS,
|
||||
.pin_groups = cs47l85_pin_groups,
|
||||
.n_pin_groups = ARRAY_SIZE(cs47l85_pin_groups),
|
||||
};
|
57
drivers/pinctrl/cirrus/pinctrl-cs47l90.c
Normal file
57
drivers/pinctrl/cirrus/pinctrl-cs47l90.c
Normal file
|
@ -0,0 +1,57 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Pinctrl for Cirrus Logic CS47L90
|
||||
*
|
||||
* Copyright (C) 2016-2017 Cirrus Logic
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; version 2.
|
||||
*/
|
||||
|
||||
#include <linux/err.h>
|
||||
#include <linux/mfd/madera/core.h>
|
||||
|
||||
#include "pinctrl-madera.h"
|
||||
|
||||
/*
|
||||
* The alt func groups are the most commonly used functions we place these at
|
||||
* the lower function indexes for convenience, and the less commonly used gpio
|
||||
* functions at higher indexes.
|
||||
*
|
||||
* To stay consistent with the datasheet the function names are the same as
|
||||
* the group names for that function's pins
|
||||
*
|
||||
* Note - all 1 less than in datasheet because these are zero-indexed
|
||||
*/
|
||||
static const unsigned int cs47l90_mif1_pins[] = { 8, 9 };
|
||||
static const unsigned int cs47l90_mif2_pins[] = { 10, 11 };
|
||||
static const unsigned int cs47l90_mif3_pins[] = { 12, 13 };
|
||||
static const unsigned int cs47l90_aif1_pins[] = { 14, 15, 16, 17 };
|
||||
static const unsigned int cs47l90_aif2_pins[] = { 18, 19, 20, 21 };
|
||||
static const unsigned int cs47l90_aif3_pins[] = { 22, 23, 24, 25 };
|
||||
static const unsigned int cs47l90_aif4_pins[] = { 26, 27, 28, 29 };
|
||||
static const unsigned int cs47l90_dmic4_pins[] = { 30, 31 };
|
||||
static const unsigned int cs47l90_dmic5_pins[] = { 32, 33 };
|
||||
static const unsigned int cs47l90_dmic3_pins[] = { 34, 35 };
|
||||
static const unsigned int cs47l90_spk1_pins[] = { 36, 37 };
|
||||
|
||||
static const struct madera_pin_groups cs47l90_pin_groups[] = {
|
||||
{ "aif1", cs47l90_aif1_pins, ARRAY_SIZE(cs47l90_aif1_pins) },
|
||||
{ "aif2", cs47l90_aif2_pins, ARRAY_SIZE(cs47l90_aif2_pins) },
|
||||
{ "aif3", cs47l90_aif3_pins, ARRAY_SIZE(cs47l90_aif3_pins) },
|
||||
{ "aif4", cs47l90_aif4_pins, ARRAY_SIZE(cs47l90_aif4_pins) },
|
||||
{ "mif1", cs47l90_mif1_pins, ARRAY_SIZE(cs47l90_mif1_pins) },
|
||||
{ "mif2", cs47l90_mif2_pins, ARRAY_SIZE(cs47l90_mif2_pins) },
|
||||
{ "mif3", cs47l90_mif3_pins, ARRAY_SIZE(cs47l90_mif3_pins) },
|
||||
{ "dmic3", cs47l90_dmic3_pins, ARRAY_SIZE(cs47l90_dmic3_pins) },
|
||||
{ "dmic4", cs47l90_dmic4_pins, ARRAY_SIZE(cs47l90_dmic4_pins) },
|
||||
{ "dmic5", cs47l90_dmic5_pins, ARRAY_SIZE(cs47l90_dmic5_pins) },
|
||||
{ "pdmspk1", cs47l90_spk1_pins, ARRAY_SIZE(cs47l90_spk1_pins) },
|
||||
};
|
||||
|
||||
const struct madera_pin_chip cs47l90_pin_chip = {
|
||||
.n_pins = CS47L90_NUM_GPIOS,
|
||||
.pin_groups = cs47l90_pin_groups,
|
||||
.n_pin_groups = ARRAY_SIZE(cs47l90_pin_groups),
|
||||
};
|
1076
drivers/pinctrl/cirrus/pinctrl-madera-core.c
Normal file
1076
drivers/pinctrl/cirrus/pinctrl-madera-core.c
Normal file
File diff suppressed because it is too large
Load diff
41
drivers/pinctrl/cirrus/pinctrl-madera.h
Normal file
41
drivers/pinctrl/cirrus/pinctrl-madera.h
Normal file
|
@ -0,0 +1,41 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Pinctrl for Cirrus Logic Madera codecs
|
||||
*
|
||||
* Copyright (C) 2016-2017 Cirrus Logic
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by the
|
||||
* Free Software Foundation; version 2.
|
||||
*/
|
||||
|
||||
#ifndef PINCTRL_MADERA_H
|
||||
#define PINCTRL_MADERA_H
|
||||
|
||||
struct madera_pin_groups {
|
||||
const char *name;
|
||||
const unsigned int *pins;
|
||||
unsigned int n_pins;
|
||||
};
|
||||
|
||||
struct madera_pin_chip {
|
||||
unsigned int n_pins;
|
||||
|
||||
const struct madera_pin_groups *pin_groups;
|
||||
unsigned int n_pin_groups;
|
||||
};
|
||||
|
||||
struct madera_pin_private {
|
||||
struct madera *madera;
|
||||
|
||||
const struct madera_pin_chip *chip; /* chip-specific groups */
|
||||
|
||||
struct device *dev;
|
||||
struct pinctrl_dev *pctl;
|
||||
};
|
||||
|
||||
extern const struct madera_pin_chip cs47l35_pin_chip;
|
||||
extern const struct madera_pin_chip cs47l85_pin_chip;
|
||||
extern const struct madera_pin_chip cs47l90_pin_chip;
|
||||
|
||||
#endif
|
Loading…
Reference in a new issue