Message ID | 20220929132041.484110-1-yangyingliang@huawei.com |
---|---|
State | Superseded |
Headers | show |
Series | [-next] spi: introduce new helpers with using modern naming | expand |
Hi Yang, On Thu, Sep 29, 2022 at 3:04 PM Yang Yingliang <yangyingliang@huawei.com> wrote: > For using modern names host/target to instead of all the legacy names, > I think it takes 3 steps: > - step1: introduce new helpers with modern naming. > - step2: switch to use these new helpers in all drivers. > - step3: remove all legacy helpers and update all legacy names. > > This patch is for step1, it introduces new helpers with host/target > naming for drivers using. > > Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> Thanks for your patch! > --- a/include/linux/spi/spi.h > +++ b/include/linux/spi/spi.h > @@ -356,6 +356,7 @@ extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 ch > * @max_speed_hz: Highest supported transfer speed > * @flags: other constraints relevant to this driver > * @slave: indicates that this is an SPI slave controller > + * @target: indicates that this is an SPI target controller > * @devm_allocated: whether the allocation of this struct is devres-managed > * @max_transfer_size: function that returns the max transfer size for > * a &spi_device; may be %NULL, so the default %SIZE_MAX will be used. > @@ -438,6 +439,7 @@ extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 ch > * @mem_caps: controller capabilities for the handling of memory operations. > * @unprepare_message: undo any work done by prepare_message(). > * @slave_abort: abort the ongoing transfer request on an SPI slave controller > + * @target_abort: abort the ongoing transfer request on an SPI target controller > * @cs_gpiods: Array of GPIO descs to use as chip select lines; one per CS > * number. Any individual value may be NULL for CS lines that > * are not GPIOs (driven by the SPI controller itself). > @@ -535,6 +537,8 @@ struct spi_controller { > > /* Flag indicating this is an SPI slave controller */ > bool slave; > + /* Flag indicating this is an SPI target controller */ > + bool target; To avoid subtle breakage when accessing these fields directly, this should be a union: union { bool slave; bool target; }; > > /* > * on some hardware transfer / message size may be constrained Gr{oetje,eeting}s, Geert -- Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org In personal conversations with technical people, I call myself a hacker. But when I'm talking to journalists I just say "programmer" or something like that. -- Linus Torvalds
Hi, On 2022/9/30 17:32, Geert Uytterhoeven wrote: > Hi Yang, > > On Thu, Sep 29, 2022 at 3:04 PM Yang Yingliang <yangyingliang@huawei.com> wrote: >> For using modern names host/target to instead of all the legacy names, >> I think it takes 3 steps: >> - step1: introduce new helpers with modern naming. >> - step2: switch to use these new helpers in all drivers. >> - step3: remove all legacy helpers and update all legacy names. >> >> This patch is for step1, it introduces new helpers with host/target >> naming for drivers using. >> >> Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> > Thanks for your patch! > >> --- a/include/linux/spi/spi.h >> +++ b/include/linux/spi/spi.h >> @@ -356,6 +356,7 @@ extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 ch >> * @max_speed_hz: Highest supported transfer speed >> * @flags: other constraints relevant to this driver >> * @slave: indicates that this is an SPI slave controller >> + * @target: indicates that this is an SPI target controller >> * @devm_allocated: whether the allocation of this struct is devres-managed >> * @max_transfer_size: function that returns the max transfer size for >> * a &spi_device; may be %NULL, so the default %SIZE_MAX will be used. >> @@ -438,6 +439,7 @@ extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 ch >> * @mem_caps: controller capabilities for the handling of memory operations. >> * @unprepare_message: undo any work done by prepare_message(). >> * @slave_abort: abort the ongoing transfer request on an SPI slave controller >> + * @target_abort: abort the ongoing transfer request on an SPI target controller >> * @cs_gpiods: Array of GPIO descs to use as chip select lines; one per CS >> * number. Any individual value may be NULL for CS lines that >> * are not GPIOs (driven by the SPI controller itself). >> @@ -535,6 +537,8 @@ struct spi_controller { >> >> /* Flag indicating this is an SPI slave controller */ >> bool slave; >> + /* Flag indicating this is an SPI target controller */ >> + bool target; > To avoid subtle breakage when accessing these fields directly, > this should be a union: > > union { > bool slave; > bool target; > }; Yes, we should initialize the 'target' member. I will change it in v2. Thanks, Yang >> /* >> * on some hardware transfer / message size may be constrained > Gr{oetje,eeting}s, > > Geert > > -- > Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org > > In personal conversations with technical people, I call myself a hacker. But > when I'm talking to journalists I just say "programmer" or something like that. > -- Linus Torvalds > > .
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c index ad254b94308e..52d64ac398fc 100644 --- a/drivers/spi/spi.c +++ b/drivers/spi/spi.c @@ -2692,6 +2692,17 @@ int spi_slave_abort(struct spi_device *spi) } EXPORT_SYMBOL_GPL(spi_slave_abort); +int spi_target_abort(struct spi_device *spi) +{ + struct spi_controller *ctlr = spi->controller; + + if (spi_controller_is_target(ctlr) && ctlr->target_abort) + return ctlr->target_abort(ctlr); + + return -ENOTSUPP; +} +EXPORT_SYMBOL_GPL(spi_target_abort); + static ssize_t slave_show(struct device *dev, struct device_attribute *attr, char *buf) { diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h index 6ea889df0813..1824d7cef69b 100644 --- a/include/linux/spi/spi.h +++ b/include/linux/spi/spi.h @@ -356,6 +356,7 @@ extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 ch * @max_speed_hz: Highest supported transfer speed * @flags: other constraints relevant to this driver * @slave: indicates that this is an SPI slave controller + * @target: indicates that this is an SPI target controller * @devm_allocated: whether the allocation of this struct is devres-managed * @max_transfer_size: function that returns the max transfer size for * a &spi_device; may be %NULL, so the default %SIZE_MAX will be used. @@ -438,6 +439,7 @@ extern struct spi_device *spi_new_ancillary_device(struct spi_device *spi, u8 ch * @mem_caps: controller capabilities for the handling of memory operations. * @unprepare_message: undo any work done by prepare_message(). * @slave_abort: abort the ongoing transfer request on an SPI slave controller + * @target_abort: abort the ongoing transfer request on an SPI target controller * @cs_gpiods: Array of GPIO descs to use as chip select lines; one per CS * number. Any individual value may be NULL for CS lines that * are not GPIOs (driven by the SPI controller itself). @@ -535,6 +537,8 @@ struct spi_controller { /* Flag indicating this is an SPI slave controller */ bool slave; + /* Flag indicating this is an SPI target controller */ + bool target; /* * on some hardware transfer / message size may be constrained @@ -646,6 +650,7 @@ struct spi_controller { int (*unprepare_message)(struct spi_controller *ctlr, struct spi_message *message); int (*slave_abort)(struct spi_controller *ctlr); + int (*target_abort)(struct spi_controller *ctlr); /* * These hooks are for drivers that use a generic implementation @@ -723,6 +728,11 @@ static inline bool spi_controller_is_slave(struct spi_controller *ctlr) return IS_ENABLED(CONFIG_SPI_SLAVE) && ctlr->slave; } +static inline bool spi_controller_is_target(struct spi_controller *ctlr) +{ + return IS_ENABLED(CONFIG_SPI_SLAVE) && ctlr->target; +} + /* PM calls that need to be issued by the driver */ extern int spi_controller_suspend(struct spi_controller *ctlr); extern int spi_controller_resume(struct spi_controller *ctlr); @@ -759,6 +769,21 @@ static inline struct spi_controller *spi_alloc_slave(struct device *host, return __spi_alloc_controller(host, size, true); } +static inline struct spi_controller *spi_alloc_host(struct device *dev, + unsigned int size) +{ + return __spi_alloc_controller(dev, size, false); +} + +static inline struct spi_controller *spi_alloc_target(struct device *dev, + unsigned int size) +{ + if (!IS_ENABLED(CONFIG_SPI_SLAVE)) + return NULL; + + return __spi_alloc_controller(dev, size, true); +} + struct spi_controller *__devm_spi_alloc_controller(struct device *dev, unsigned int size, bool slave); @@ -778,6 +803,21 @@ static inline struct spi_controller *devm_spi_alloc_slave(struct device *dev, return __devm_spi_alloc_controller(dev, size, true); } +static inline struct spi_controller *devm_spi_alloc_host(struct device *dev, + unsigned int size) +{ + return __devm_spi_alloc_controller(dev, size, false); +} + +static inline struct spi_controller *devm_spi_alloc_target(struct device *dev, + unsigned int size) +{ + if (!IS_ENABLED(CONFIG_SPI_SLAVE)) + return NULL; + + return __devm_spi_alloc_controller(dev, size, true); +} + extern int spi_register_controller(struct spi_controller *ctlr); extern int devm_spi_register_controller(struct device *dev, struct spi_controller *ctlr); @@ -1137,6 +1177,7 @@ static inline void spi_message_free(struct spi_message *m) extern int spi_setup(struct spi_device *spi); extern int spi_async(struct spi_device *spi, struct spi_message *message); extern int spi_slave_abort(struct spi_device *spi); +extern int spi_target_abort(struct spi_device *spi); static inline size_t spi_max_message_size(struct spi_device *spi)
For using modern names host/target to instead of all the legacy names, I think it takes 3 steps: - step1: introduce new helpers with modern naming. - step2: switch to use these new helpers in all drivers. - step3: remove all legacy helpers and update all legacy names. This patch is for step1, it introduces new helpers with host/target naming for drivers using. Signed-off-by: Yang Yingliang <yangyingliang@huawei.com> --- drivers/spi/spi.c | 11 +++++++++++ include/linux/spi/spi.h | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+)