Lines Matching +full:syscon +full:- +full:clk
1 // SPDX-License-Identifier: GPL-2.0-or-later
5 * Copyright (C) 2012-2016 Alexander Shiyan <shc_work@mail.ru>
9 #include <linux/clk.h>
16 #include <linux/mfd/syscon.h>
17 #include <linux/mfd/syscon/clps711x.h>
20 #define DRIVER_NAME "clps711x-spi"
27 struct regmap *syscon; member
28 struct clk *spi_clk;
40 struct spi_device *spi = msg->spi; in spi_clps711x_prepare_message()
43 return regmap_update_bits(hw->syscon, SYSCON_OFFSET, SYSCON3_ADCCKNSEN, in spi_clps711x_prepare_message()
44 (spi->mode & SPI_CPHA) ? in spi_clps711x_prepare_message()
55 clk_set_rate(hw->spi_clk, xfer->speed_hz ? : spi->max_speed_hz); in spi_clps711x_transfer_one()
57 hw->len = xfer->len; in spi_clps711x_transfer_one()
58 hw->bpw = xfer->bits_per_word; in spi_clps711x_transfer_one()
59 hw->tx_buf = (u8 *)xfer->tx_buf; in spi_clps711x_transfer_one()
60 hw->rx_buf = (u8 *)xfer->rx_buf; in spi_clps711x_transfer_one()
63 data = hw->tx_buf ? *hw->tx_buf++ : 0; in spi_clps711x_transfer_one()
64 writel(data | SYNCIO_FRMLEN(hw->bpw) | SYNCIO_TXFRMEN, hw->syncio); in spi_clps711x_transfer_one()
76 data = readb(hw->syncio); in spi_clps711x_isr()
77 if (hw->rx_buf) in spi_clps711x_isr()
78 *hw->rx_buf++ = data; in spi_clps711x_isr()
81 if (--hw->len > 0) { in spi_clps711x_isr()
82 data = hw->tx_buf ? *hw->tx_buf++ : 0; in spi_clps711x_isr()
83 writel(data | SYNCIO_FRMLEN(hw->bpw) | SYNCIO_TXFRMEN, in spi_clps711x_isr()
84 hw->syncio); in spi_clps711x_isr()
93 struct device_node *np = pdev->dev.of_node; in spi_clps711x_probe()
102 host = spi_alloc_host(&pdev->dev, sizeof(*hw)); in spi_clps711x_probe()
104 return -ENOMEM; in spi_clps711x_probe()
106 host->use_gpio_descriptors = true; in spi_clps711x_probe()
107 host->bus_num = -1; in spi_clps711x_probe()
108 host->mode_bits = SPI_CPHA | SPI_CS_HIGH; in spi_clps711x_probe()
109 host->bits_per_word_mask = SPI_BPW_RANGE_MASK(1, 8); in spi_clps711x_probe()
110 host->dev.of_node = pdev->dev.of_node; in spi_clps711x_probe()
111 host->prepare_message = spi_clps711x_prepare_message; in spi_clps711x_probe()
112 host->transfer_one = spi_clps711x_transfer_one; in spi_clps711x_probe()
116 hw->spi_clk = devm_clk_get(&pdev->dev, NULL); in spi_clps711x_probe()
117 if (IS_ERR(hw->spi_clk)) { in spi_clps711x_probe()
118 ret = PTR_ERR(hw->spi_clk); in spi_clps711x_probe()
122 hw->syscon = syscon_regmap_lookup_by_phandle(np, "syscon"); in spi_clps711x_probe()
123 if (IS_ERR(hw->syscon)) { in spi_clps711x_probe()
124 ret = PTR_ERR(hw->syscon); in spi_clps711x_probe()
128 hw->syncio = devm_platform_ioremap_resource(pdev, 0); in spi_clps711x_probe()
129 if (IS_ERR(hw->syncio)) { in spi_clps711x_probe()
130 ret = PTR_ERR(hw->syncio); in spi_clps711x_probe()
135 regmap_update_bits(hw->syscon, SYSCON_OFFSET, SYSCON3_ADCCON, 0); in spi_clps711x_probe()
138 readl(hw->syncio); in spi_clps711x_probe()
140 ret = devm_request_irq(&pdev->dev, irq, spi_clps711x_isr, 0, in spi_clps711x_probe()
141 dev_name(&pdev->dev), host); in spi_clps711x_probe()
145 ret = devm_spi_register_controller(&pdev->dev, host); in spi_clps711x_probe()
156 { .compatible = "cirrus,ep7209-spi", },