[PATCH v6 08/12] gpio: add ti-ssp gpio driver

Grant Likely grant.likely at secretlab.ca
Sun Nov 21 16:31:38 EST 2010


On Sun, Nov 21, 2010 at 1:02 PM, Ryan Mallon <ryan at bluewatersys.com> wrote:
> On 11/20/2010 04:55 AM, Cyril Chemparathy wrote:
>> TI's SSP controller pins can be directly read and written to behave like a
>> GPIO.  This patch adds a GPIO driver that exposes such functionality.
>>
>> Signed-off-by: Cyril Chemparathy <cyril at ti.com>
>> ---
>
>> +static int __devinit ti_ssp_gpio_probe(struct platform_device *pdev)
>> +{
>> +     const struct ti_ssp_gpio_data *pdata = pdev->dev.platform_data;
>> +     struct device *dev = &pdev->dev;
>> +     struct ti_ssp_gpio_chip *gpio;
>> +     int error;
>> +
>> +     if (!pdata) {
>> +             dev_err(dev, "platform data not found\n");
>> +             return -EINVAL;
>> +     }
>> +
>> +     gpio = kzalloc(sizeof(*gpio), GFP_KERNEL);
>> +     if (!gpio) {
>> +             dev_err(dev, "cannot allocate driver data\n");
>> +             return -ENOMEM;
>> +     }
>> +
>> +     gpio->dev = dev;
>> +     gpio->iosel = SSP_PIN_SEL(0, SSP_IN) | SSP_PIN_SEL(1, SSP_IN) |
>> +                   SSP_PIN_SEL(2, SSP_IN) | SSP_PIN_SEL(3, SSP_IN);
>> +     error = ti_ssp_set_iosel(gpio->dev, gpio->iosel);
>> +     if (error < 0) {
>> +             dev_err(dev, "gpio io setup failed (%d)\n", error);
>> +             goto error;
>> +     }
>> +
>> +     spin_lock_init(&gpio->lock);
>> +     platform_set_drvdata(pdev, gpio);
>
> This looks wrong. gpio is of type ti_ssp_gpio_chip, but the ssp core
> functions, ssp_read, etc, use dev_to_ssp:

This sets the child device's private data pointer, not the parents.
dev_to_ssp still correctly returns the parent device private data.

>
> static inline struct ti_ssp *dev_to_ssp(struct device *dev)
> {
>        return dev_get_drvdata(dev->parent);
> }
>
> If I understand correctly, the ssp core can only be used to for one
> peripheral at a time.

I believe the ssp has 2 channels; thus up to 2 child devices.

> Currently the code will allow you to install
> several peripherals at once, which will lead to odd behaviour at
> runtime. Maybe a better approach would be to have something like this in
> drivers/mfd/ti-ssp.c:

Only the ssp core itself is allowed to register the peripheral
devices, and so using the parent pointer is perfectly valid.  I think
Cyril's approach is fine.

g.



More information about the linux-arm-kernel mailing list