RE: [PATCH] drivers:staging:ti-st: remove st_get_plat_device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Randy,
 

> -----Original Message-----
> From: Randy Dunlap [mailto:randy.dunlap@xxxxxxxxxx]
> Sent: Thursday, August 19, 2010 12:32 PM
> To: Savoy, Pavan
> Cc: gregkh@xxxxxxx; alan@xxxxxxxxxxxxxxxxxxx; linux-kernel@xxxxxxxxxxxxxxx;
> devel@xxxxxxxxxxxxxxxxxxxx; Jain, Naveen
> Subject: Re: [PATCH] drivers:staging:ti-st: remove st_get_plat_device
> 
> On 08/19/10 11:08, pavan_savoy@xxxxxx wrote:
> > From: Pavan Savoy <pavan_savoy@xxxxxx>
> >
> > In order to support multiple ST platform devices, a new symbol
> > 'st_get_plat_device' earlier needed to be exported by the arch/XX/brd-XX.c
> > file which intends to add the ST platform device.
> >
> > On removing this dependency, now inside ST driver maintain the array of
> > ST platform devices that would be registered.
> > As of now let id=0, as and when we end up having such platforms
> > where mutliple ST devices can exist, id would come from
> > protocol drivers (BT, FM and GPS) as to on which platform device
> > they want to register to.
> >
> > Signed-off-by: Pavan Savoy <pavan_savoy@xxxxxx>
> 
> Thanks, that builds cleanly.  I'm OK with it if you are comfortable with a
> hard limit on the fixed number of devices that can be supported:

Yep, Thanks for pointing out, sort of cleaned up the code.

> +#define MAX_ST_DEVICES	3	/* Imagine 1 on each UART for now */
> +struct platform_device *st_kim_devices[MAX_ST_DEVICES];
> 
> We usually try not to have such limits nor use arrays like that,
> but if the nature of the device and its platform/environment is like
> that, so be it.
> 

Actually on all platforms that I have seen there's only 1 such device.
The device is basically a connectivity chip (with Bluetooth, FM and GPS working
on a single UART)

The number which I mentioned was out of imagination.
I don't think we are ever going to have multiple of them either...

> > ---
> >  drivers/staging/ti-st/st.h      |    1 -
> >  drivers/staging/ti-st/st_core.c |    9 ++++-----
> >  drivers/staging/ti-st/st_core.h |    2 +-
> >  drivers/staging/ti-st/st_kim.c  |   22 +++++++++++++++++++---
> >  4 files changed, 24 insertions(+), 10 deletions(-)
> >
> > diff --git a/drivers/staging/ti-st/st.h b/drivers/staging/ti-st/st.h
> > index 9952579..1b3060e 100644
> > --- a/drivers/staging/ti-st/st.h
> > +++ b/drivers/staging/ti-st/st.h
> > @@ -80,5 +80,4 @@ struct st_proto_s {
> >  extern long st_register(struct st_proto_s *);
> >  extern long st_unregister(enum proto_type);
> >
> > -extern struct platform_device *st_get_plat_device(void);
> >  #endif /* ST_H */
> > diff --git a/drivers/staging/ti-st/st_core.c b/drivers/staging/ti-
> st/st_core.c
> > index 063c9b1..b85d8bf 100644
> > --- a/drivers/staging/ti-st/st_core.c
> > +++ b/drivers/staging/ti-st/st_core.c
> > @@ -38,7 +38,6 @@
> >  #include "st_ll.h"
> >  #include "st.h"
> >
> > -#define VERBOSE
> >  /* strings to be used for rfkill entries and by
> >   * ST Core to be used for sysfs debug entry
> >   */
> > @@ -581,7 +580,7 @@ long st_register(struct st_proto_s *new_proto)
> >  	long err = 0;
> >  	unsigned long flags = 0;
> >
> > -	st_kim_ref(&st_gdata);
> > +	st_kim_ref(&st_gdata, 0);
> >  	pr_info("%s(%d) ", __func__, new_proto->type);
> >  	if (st_gdata == NULL || new_proto == NULL || new_proto->recv == NULL
> >  	    || new_proto->reg_complete_cb == NULL) {
> > @@ -713,7 +712,7 @@ long st_unregister(enum proto_type type)
> >
> >  	pr_debug("%s: %d ", __func__, type);
> >
> > -	st_kim_ref(&st_gdata);
> > +	st_kim_ref(&st_gdata, 0);
> >  	if (type < ST_BT || type >= ST_MAX) {
> >  		pr_err(" protocol %d not supported", type);
> >  		return -EPROTONOSUPPORT;
> > @@ -767,7 +766,7 @@ long st_write(struct sk_buff *skb)
> >  #endif
> >  	long len;
> >
> > -	st_kim_ref(&st_gdata);
> > +	st_kim_ref(&st_gdata, 0);
> >  	if (unlikely(skb == NULL || st_gdata == NULL
> >  		|| st_gdata->tty == NULL)) {
> >  		pr_err("data/tty unavailable to perform write");
> > @@ -818,7 +817,7 @@ static int st_tty_open(struct tty_struct *tty)
> >  	struct st_data_s *st_gdata;
> >  	pr_info("%s ", __func__);
> >
> > -	st_kim_ref(&st_gdata);
> > +	st_kim_ref(&st_gdata, 0);
> >  	st_gdata->tty = tty;
> >  	tty->disc_data = st_gdata;
> >
> > diff --git a/drivers/staging/ti-st/st_core.h b/drivers/staging/ti-
> st/st_core.h
> > index e0c32d1..8601320 100644
> > --- a/drivers/staging/ti-st/st_core.h
> > +++ b/drivers/staging/ti-st/st_core.h
> > @@ -117,7 +117,7 @@ int st_core_init(struct st_data_s **);
> >  void st_core_exit(struct st_data_s *);
> >
> >  /* ask for reference from KIM */
> > -void st_kim_ref(struct st_data_s **);
> > +void st_kim_ref(struct st_data_s **, int);
> >
> >  #define GPS_STUB_TEST
> >  #ifdef GPS_STUB_TEST
> > diff --git a/drivers/staging/ti-st/st_kim.c b/drivers/staging/ti-st/st_kim.c
> > index b4a6c7f..9e99463 100644
> > --- a/drivers/staging/ti-st/st_kim.c
> > +++ b/drivers/staging/ti-st/st_kim.c
> > @@ -72,11 +72,26 @@ const unsigned char *protocol_names[] = {
> >  	PROTO_ENTRY(ST_GPS, "GPS"),
> >  };
> >
> > +#define MAX_ST_DEVICES	3	/* Imagine 1 on each UART for now */
> > +struct platform_device *st_kim_devices[MAX_ST_DEVICES];
> >
> >  /**********************************************************************/
> >  /* internal functions */
> >
> >  /**
> > + * st_get_plat_device -
> > + *	function which returns the reference to the platform device
> > + *	requested by id. As of now only 1 such device exists (id=0)
> > + *	the context requesting for reference can get the id to be
> > + *	requested by a. The protocol driver which is registering or
> > + *	b. the tty device which is opened.
> > + */
> > +static struct platform_device *st_get_plat_device(int id)
> > +{
> > +	return st_kim_devices[id];
> > +}
> > +
> > +/**
> >   * validate_firmware_response -
> >   *	function to return whether the firmware response was proper
> >   *	in case of error don't complete so that waiting for proper
> > @@ -353,7 +368,7 @@ void st_kim_chip_toggle(enum proto_type type, enum
> kim_gpio_state state)
> >  	struct kim_data_s	*kim_gdata;
> >  	pr_info(" %s ", __func__);
> >
> > -	kim_pdev = st_get_plat_device();
> > +	kim_pdev = st_get_plat_device(0);
> >  	kim_gdata = dev_get_drvdata(&kim_pdev->dev);
> >
> >  	if (kim_gdata->gpios[type] == -1) {
> > @@ -574,12 +589,12 @@ static int kim_toggle_radio(void *data, bool blocked)
> >   *	This would enable multiple such platform devices to exist
> >   *	on a given platform
> >   */
> > -void st_kim_ref(struct st_data_s **core_data)
> > +void st_kim_ref(struct st_data_s **core_data, int id)
> >  {
> >  	struct platform_device	*pdev;
> >  	struct kim_data_s	*kim_gdata;
> >  	/* get kim_gdata reference from platform device */
> > -	pdev = st_get_plat_device();
> > +	pdev = st_get_plat_device(id);
> >  	kim_gdata = dev_get_drvdata(&pdev->dev);
> >  	*core_data = kim_gdata->core_data;
> >  }
> > @@ -623,6 +638,7 @@ static int kim_probe(struct platform_device *pdev)
> >  	long *gpios = pdev->dev.platform_data;
> >  	struct kim_data_s	*kim_gdata;
> >
> > +	st_kim_devices[pdev->id] = pdev;
> >  	kim_gdata = kzalloc(sizeof(struct kim_data_s), GFP_ATOMIC);
> >  	if (!kim_gdata) {
> >  		pr_err("no mem to allocate");
> 
> 
> --
> ~Randy
> *** Remember to use Documentation/SubmitChecklist when testing your code ***
_______________________________________________
devel mailing list
devel@xxxxxxxxxxxxxxxxxxxxxx
http://driverdev.linuxdriverproject.org/mailman/listinfo/devel


[Index of Archives]     [Linux Driver Backports]     [DMA Engine]     [Linux GPIO]     [Linux SPI]     [Video for Linux]     [Linux USB Devel]     [Linux Coverity]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux