Jarkko Nikula <[email protected]> writes:
> LPSS SPI devices in a successor of Intel Sunrisepoint can have up to 4 chip
is ?
> selects per port. SPI capabilities register bits 12:9 tell which are
> enabled. For simplicity we assume chip selects are enabled one after
> another without disabled chip selects between. For instance CS0 | CS1 | CS2
> but not CS0 | CS1 | CS3.
>
> This patch adds support for detecting the number of enabled chip selects
> and adds output control to those LPSS SPI ports that have more than one
> chip select signal.
>
> Signed-off-by: Jarkko Nikula <[email protected]>
> ---
> drivers/spi/spi-pxa2xx.c | 48
> +++++++++++++++++++++++++++++++++++++++++++-----
> 1 file changed, 43 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/spi/spi-pxa2xx.c b/drivers/spi/spi-pxa2xx.c
> index 672963653d3b..6851649d1b15 100644
> --- a/drivers/spi/spi-pxa2xx.c
> +++ b/drivers/spi/spi-pxa2xx.c
> @@ -13,6 +13,7 @@
> * GNU General Public License for more details.
> */
>
> +#include <linux/bitops.h>
> #include <linux/init.h>
> #include <linux/module.h>
> #include <linux/device.h>
> @@ -64,6 +65,10 @@ MODULE_ALIAS("platform:pxa2xx-spi");
> #define GENERAL_REG_RXTO_HOLDOFF_DISABLE BIT(24)
> #define SPI_CS_CONTROL_SW_MODE BIT(0)
> #define SPI_CS_CONTROL_CS_HIGH BIT(1)
> +#define SPI_CS_CONTROL_CS_SEL_SHIFT 8
> +#define SPI_CS_CONTROL_CS_SEL_MASK (3 <<
> SPI_CS_CONTROL_CS_SEL_SHIFT)
> +#define SPI_CAPS_CS_EN_SHIFT 9
> +#define SPI_CAPS_CS_EN_MASK (0xf << SPI_CAPS_CS_EN_SHIFT)
This is intel specific, not pxa oriented, right ?
If so, I'd like to have it namespaced, with LPSS or whatever you see fit.
> @@ -103,6 +111,7 @@ static const struct lpss_config lpss_platforms[] = {
> .reg_general = -1,
> .reg_ssp = 0x20,
> .reg_cs_ctrl = 0x24,
> + .reg_capabilities = 0xfc,
Immediate value ? I suppose a defines usage was not possible here ?
> @@ -271,15 +280,34 @@ static void lpss_ssp_setup(struct driver_data *drv_data)
> static void lpss_ssp_cs_control(struct driver_data *drv_data, bool enable)
> {
> const struct lpss_config *config;
> - u32 value;
> + u32 value, cs;
>
> config = lpss_get_config(drv_data);
>
> value = __lpss_ssp_read_priv(drv_data, config->reg_cs_ctrl);
> - if (enable)
> + if (enable) {
> + cs = drv_data->cur_msg->spi->chip_select;
> + cs <<= SPI_CS_CONTROL_CS_SEL_SHIFT;
> + if (cs != (value & SPI_CS_CONTROL_CS_SEL_MASK)) {
> + /*
> + * When switching another chip select output active
> + * the output must be selected first and wait 2 ssp_clk
> + * cycles before changing state to active. Otherwise
> + * a short glitch will occur on the previous chip
> + * select since output select is latched but state
> + * control is not.
> + */
> + value &= ~SPI_CS_CONTROL_CS_SEL_MASK;
> + value |= cs;
> + __lpss_ssp_write_priv(drv_data,
> + config->reg_cs_ctrl, value);
> + ndelay(1000000000 /
> + (drv_data->master->max_speed_hz / 2));
That ndelay() looks weird, why delay and not sleep ?
And wouldn't that be targeted at another patch ? If I got it right, this patch
deals with capabilites, not chip select timings, doesn't it ?
Cheers.
--
Robert
--
To unsubscribe from this list: send the line "unsubscribe linux-spi" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html